00001 subroutine calc_band_disp(Ndiv,N_sym_points,NTK,NSK_BAND_DISP,Na1,Na2,Na3,n_occ,SK_BAND_DISP,H_MAT_R,nkb1,nkb2,nkb3,a1,a2,a3,b1,b2,b3,&
00002 kdata,E_BAND_DISP)
00003 implicit none
00004
00005 integer::Ndiv,N_sym_points,NTK,NSK_BAND_DISP,Na1,Na2,Na3,n_occ
00006 integer::nkb1,nkb2,nkb3
00007 real(8)::SK_BAND_DISP(3,NSK_BAND_DISP)
00008 real(8)::a1(3),a2(3),a3(3),b1(3),b2(3),b3(3)
00009 complex(8)::H_MAT_R(n_occ,n_occ,-Na1:Na1,-Na2:Na2,-Na3:Na3)
00010
00011 real(8),allocatable::E_TMP(:)
00012 real(8),allocatable::WEIGHT_R(:,:,:)
00013 complex(8),allocatable::H_TMP_IN(:,:)
00014 complex(8),allocatable::H_TMP_OUT(:,:)
00015 real(8),allocatable::DIST_K(:)
00016 real(8),allocatable::dist(:)
00017
00018 integer::ik,ib,jb,ix,ia1,ia2,ia3,ks,ke,ia1min,ia2min,ia3min
00019 real(8)::DIST_B(3),DIST_KSPACE
00020 real(8)::PHASE
00021 real(8)::SUM_REAL
00022 complex(8)::PHASE_FACTOR
00023 complex(8)::SUM_CMPX
00024
00025 real(8),parameter::au=27.21151d0
00026 real(8),parameter::tpi=2.0d0*dacos(-1.0d0)
00027 complex(8),parameter::ci=(0.0D0,1.0D0)
00028
00029 real(8),intent(out)::kdata(NSK_BAND_DISP)
00030 real(8),intent(out)::E_BAND_DISP(n_occ,NSK_BAND_DISP)
00031
00032
00033
00034 write(6,*)
00035 write(6,*)'==================================='
00036 write(6,*)'CALCULATED kpts FOR BAND DISPERSION'
00037 write(6,*)'==================================='
00038 write(6,*)
00039 write(6,'(a20,i8)')'NSK_BAND_DISP=',NSK_BAND_DISP
00040 do ik=1,NSK_BAND_DISP
00041 write(6,*) SK_BAND_DISP(:,ik)
00042 enddo
00043
00044
00045
00046 allocate(WEIGHT_R(-Na1:Na1,-Na2:Na2,-Na3:Na3))
00047 WEIGHT_R=1.0d0; SUM_REAL=0.0d0
00048 do ia1=-Na1,Na1
00049 do ia2=-Na2,Na2
00050 do ia3=-Na3,Na3
00051 if(abs(ia1)==Na1.and.mod(nkb1,2)==0.and.Na1/=0) WEIGHT_R(ia1,ia2,ia3)=WEIGHT_R(ia1,ia2,ia3)*0.5d0
00052 if(abs(ia2)==Na2.and.mod(nkb2,2)==0.and.Na2/=0) WEIGHT_R(ia1,ia2,ia3)=WEIGHT_R(ia1,ia2,ia3)*0.5d0
00053 if(abs(ia3)==Na3.and.mod(nkb3,2)==0.and.Na3/=0) WEIGHT_R(ia1,ia2,ia3)=WEIGHT_R(ia1,ia2,ia3)*0.5d0
00054 SUM_REAL=SUM_REAL+WEIGHT_R(ia1,ia2,ia3)
00055 enddo
00056 enddo
00057 enddo
00058 write(6,'(a20,f15.8,i8)')'SUM_WEIGHT,NTK',SUM_REAL,NTK
00059 if(abs(SUM_REAL-dble(NTK))>1.0d-6)then
00060 stop 'SUM_WEIGHT/=NTK'
00061 endif
00062
00063
00064
00065 allocate(E_TMP(n_occ));E_TMP(:)=0.0d0
00066 allocate(H_TMP_IN(n_occ,n_occ));H_TMP_IN(:,:)=0.0d0
00067 allocate(H_TMP_OUT(n_occ,n_occ));H_TMP_OUT(:,:)=0.0d0
00068
00069 E_BAND_DISP=0.0d0
00070
00071 do ik=1,NSK_BAND_DISP
00072 H_TMP_IN(:,:)=0.0D0
00073 do ib=1,n_occ
00074 do jb=1,n_occ
00075 SUM_CMPX=0.0D0
00076 do ia1=-Na1,Na1
00077 do ia2=-Na2,Na2
00078 do ia3=-Na3,Na3
00079
00080
00081
00082 call search_Rmin(ia1,ia2,ia3,nkb1,nkb2,nkb3,a1(1),a2(1),a3(1),ia1min,ia2min,ia3min)
00083 PHASE=tpi*(SK_BAND_DISP(1,ik)*DBLE(ia1min)+SK_BAND_DISP(2,ik)*DBLE(ia2min)+SK_BAND_DISP(3,ik)*DBLE(ia3min))
00084 PHASE_FACTOR=EXP(ci*PHASE)*WEIGHT_R(ia1,ia2,ia3)
00085 SUM_CMPX=SUM_CMPX+H_MAT_R(ib,jb,ia1,ia2,ia3)*PHASE_FACTOR
00086 enddo
00087 enddo
00088 enddo
00089 H_TMP_IN(ib,jb)=SUM_CMPX
00090 enddo
00091 enddo
00092
00093
00094
00095 E_TMP(:)=0.0D0
00096 call diagV(n_occ,H_TMP_IN(1,1),E_TMP(1))
00097 H_TMP_OUT(:,:)=H_TMP_IN(:,:)
00098 E_BAND_DISP(:,ik)=E_TMP(:)
00099 enddo
00100
00101
00102
00103 allocate(DIST_K(NSK_BAND_DISP));DIST_K(:)=0.0d0
00104 allocate(dist(0:N_sym_points-1));dist(:)=0.0d0
00105
00106 dist(0)=0.0d0
00107 do ix=1,N_sym_points-1
00108 ks=(ix-1)*Ndiv+1
00109 ke=(ix)*Ndiv+1
00110 do ik=ks,ke
00111 DIST_B(:)=(SK_BAND_DISP(1,ik)-SK_BAND_DISP(1,ks))*b1(:)&
00112 +(SK_BAND_DISP(2,ik)-SK_BAND_DISP(2,ks))*b2(:)&
00113 +(SK_BAND_DISP(3,ik)-SK_BAND_DISP(3,ks))*b3(:)
00114 DIST_KSPACE=DSQRT(DIST_B(1)**2+DIST_B(2)**2+DIST_B(3)**2)
00115 DIST_K(ik)=DIST_KSPACE+dist(ix-1)
00116 enddo
00117 dist(ix)=dist(ix-1)+DIST_KSPACE
00118 enddo
00119
00120 kdata=0.0d0
00121 kdata(:)=DIST_K(:)/DIST_K(NSK_BAND_DISP)
00122
00123 deallocate(E_TMP,WEIGHT_R,H_TMP_IN,H_TMP_OUT,DIST_K,dist)
00124
00125 return
00126 end