m_band.f90

Go to the documentation of this file.
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(:)!kdata(NSK_BAND_DISP) 
00014     !
00015     !make kdata 
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     !wrt dat.iband 
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(:)!DIST_K(NTK)
00036     real(8),allocatable::dist(:)!dist(0:Nblk-1)
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!ik 
00051      dist(ix)=dist(ix-1)+DIST_KSPACE
00052     enddo!ix 
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     !OPEN(114,W,FILE='./dat.iband') 
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!ik        
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!ik        
00088       REVERSE=.TRUE.        
00089      endif!REVERSE                   
00090     enddo!ib 
00091     close(114) 
00092     !
00093     return 
00094   end subroutine   
00095   !
00096 end module m_band 

Generated on 17 Nov 2020 for respack by  doxygen 1.6.1