00001 module m_band
00002 implicit none
00003 contains
00004
00005 subroutine calculate_banddisp(NWF,NSK_BAND_DISP,Ndiv,N_sym_points,threshold_transfer,b1,b2,b3,SK_BAND_DISP,EKS)
00006 implicit none
00007 integer,intent(in)::NWF,NSK_BAND_DISP,Ndiv,N_sym_points
00008 real(8),intent(in)::threshold_transfer
00009 real(8),intent(in)::b1(3),b2(3),b3(3)
00010 real(8),intent(in)::SK_BAND_DISP(3,NSK_BAND_DISP)
00011 real(8),intent(in)::EKS(NWF,NSK_BAND_DISP)
00012
00013 real(8),allocatable::kdata(:)
00014
00015
00016
00017 allocate(kdata(NSK_BAND_DISP)); kdata=0.0d0
00018 call make_kdata(Ndiv,N_sym_points,NSK_BAND_DISP,SK_BAND_DISP(1,1),b1(1),b2(1),b3(1),kdata(1))
00019
00020
00021
00022 call wrt_iband(threshold_transfer,NWF,NSK_BAND_DISP,kdata(1),EKS(1,1))
00023
00024 return
00025 end subroutine
00026
00027 subroutine make_kdata(Ndiv,N_sym_points,NSK_BAND_DISP,SK_BAND_DISP,b1,b2,b3,kdata)
00028 implicit none
00029 integer,intent(in)::Ndiv,N_sym_points,NSK_BAND_DISP
00030 real(8),intent(in)::SK_BAND_DISP(3,NSK_BAND_DISP)
00031 real(8),intent(in)::b1(3),b2(3),b3(3)
00032 real(8),intent(out)::kdata(NSK_BAND_DISP)
00033 integer::ik,ix,ks,ke
00034 real(8)::DIST_B(3),DIST_KSPACE
00035 real(8),allocatable::DIST_K(:)
00036 real(8),allocatable::dist(:)
00037 allocate(DIST_K(NSK_BAND_DISP));DIST_K(:)=0.0d0
00038 allocate(dist(0:N_sym_points-1));dist(:)=0.0d0
00039
00040 dist(0)=0.0d0
00041 do ix=1,N_sym_points-1
00042 ks=(ix-1)*Ndiv+1
00043 ke=(ix)*Ndiv+1
00044 do ik=ks,ke
00045 DIST_B(:)=(SK_BAND_DISP(1,ik)-SK_BAND_DISP(1,ks))*b1(:)&
00046 +(SK_BAND_DISP(2,ik)-SK_BAND_DISP(2,ks))*b2(:)&
00047 +(SK_BAND_DISP(3,ik)-SK_BAND_DISP(3,ks))*b3(:)
00048 DIST_KSPACE=DSQRT(DIST_B(1)**2+DIST_B(2)**2+DIST_B(3)**2)
00049 DIST_K(ik)=DIST_KSPACE+dist(ix-1)
00050 enddo
00051 dist(ix)=dist(ix-1)+DIST_KSPACE
00052 enddo
00053
00054 kdata=0.0d0
00055 kdata(:)=DIST_K(:)/DIST_K(NSK_BAND_DISP)
00056
00057 deallocate(DIST_K,dist)
00058 return
00059 end subroutine
00060
00061 subroutine wrt_iband(threshold_transfer,NWF,NSK_BAND_DISP,kdata,EKS)
00062 implicit none
00063 integer,intent(in)::NWF,NSK_BAND_DISP
00064 real(8),intent(in)::kdata(NSK_BAND_DISP)
00065 real(8),intent(in)::EKS(NWF,NSK_BAND_DISP)
00066 real(8),intent(in)::threshold_transfer
00067 integer::ib,ik
00068 LOGICAL::REVERSE
00069 real(8),parameter::au=27.21151d0
00070
00071
00072
00073 OPEN(114,FILE='./dat.iband')
00074 write(114,'(a)')'#Wannier interpolaed band'
00075 write(114,'(a,x,f10.5)')'#Energy cutoff for transfer (eV)=',threshold_transfer*au
00076 write(114,'(a)')'#1:k, 2:Energy [eV]'
00077 REVERSE=.TRUE.
00078 do ib=1,NWF
00079 if(REVERSE)then
00080 do ik=1,NSK_BAND_DISP
00081 write(114,'(2f20.10)') kdata(ik),EKS(ib,ik)*au
00082 enddo
00083 REVERSE=.FALSE.
00084 else
00085 do ik=NSK_BAND_DISP,1,-1
00086 write(114,'(2f20.10)') kdata(ik),EKS(ib,ik)*au
00087 enddo
00088 REVERSE=.TRUE.
00089 endif
00090 enddo
00091 close(114)
00092
00093 return
00094 end subroutine
00095
00096 end module m_band