calc_band_disp.f90

Go to the documentation of this file.
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(:)!E_TMP(n_occ)  
00012   real(8),allocatable::WEIGHT_R(:,:,:)!WEIGHT_R(-Na1:Na1,-Na2:Na2,-Na3:Na3)
00013   complex(8),allocatable::H_TMP_IN(:,:)!H_TMP_IN(n_occ,n_occ)
00014   complex(8),allocatable::H_TMP_OUT(:,:)!H_TMP_OUT(n_occ,n_occ)
00015   real(8),allocatable::DIST_K(:)!DIST_K(NTK)
00016   real(8),allocatable::dist(:)!dist(0:Nblk-1)
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   !1. SAMPLE k-POINTS FOR INTERPOLATED BAND DISPERSION 
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!ik  
00043   !
00044   !2. WEIGHT_R BY YUSUKE NOMURA 
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!-1         
00049    do ia2=-Na2,Na2!-1         
00050     do ia3=-Na3,Na3!-1         
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   !3. H_MAT(k') IN WANNIER BASIS AND DIAGONALIZE 
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   !allocate(E_BAND_DISP(n_occ,NSK_BAND_DISP))
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!-1         
00077       do ia2=-Na2,Na2!-1         
00078        do ia3=-Na3,Na3!-1         
00079         !
00080         !NEAREST R SEARCH BY YOSHIHIDE YOSHIMOTO 
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!ia3            
00087       enddo!ia2                       
00088      enddo!ia1
00089      H_TMP_IN(ib,jb)=SUM_CMPX           
00090     enddo!jb
00091    enddo!ib
00092    !
00093    !4. diag H_TMP_IN
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!ik           
00100   !
00101   !5. GENERATE KDATA (DISPERSION LINE) 
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!ik 
00117    dist(ix)=dist(ix-1)+DIST_KSPACE
00118   enddo!ix 
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

Generated on 17 Nov 2020 for respack by  doxygen 1.6.1