sub_gw.f90

Go to the documentation of this file.
00001 subroutine search_kq(NTK,SK0,q1,q2,q3,ik,ikq,shift_G)
00002   implicit none 
00003   integer::NTK
00004   real(8)::SK0(3,NTK)  
00005   real(8)::q1,q2,q3
00006   integer::ik
00007   integer::jk
00008   real(8)::SKQ(3)
00009   integer::ikq,shift_G(3)
00010   real(8),parameter::dlt_BZ=1.0d-6!20170322  
00011   !
00012   SKQ(1)=SK0(1,ik)+q1
00013   SKQ(2)=SK0(2,ik)+q2 
00014   SKQ(3)=SK0(3,ik)+q3 
00015   !
00016   if(SKQ(1)>1.50d0+dlt_BZ)then 
00017    SKQ(1)=SKQ(1)-2.0D0 
00018    shift_G(1)=+2 
00019   endif 
00020   if(SKQ(1)>0.5D0+dlt_BZ)then 
00021    SKQ(1)=SKQ(1)-1.0D0 
00022    shift_G(1)=+1
00023   endif 
00024   if(SKQ(1)<=-1.5D0+dlt_BZ)then 
00025    SKQ(1)=SKQ(1)+2.0D0 
00026    shift_G(1)=-2 
00027   endif 
00028   if(SKQ(1)<=-0.5D0+dlt_BZ)then 
00029    SKQ(1)=SKQ(1)+1.0D0 
00030    shift_G(1)=-1
00031   endif 
00032   !
00033   if(SKQ(2)>1.5D0+dlt_BZ)then 
00034    SKQ(2)=SKQ(2)-2.0D0 
00035    shift_G(2)=+2 
00036   endif 
00037   if(SKQ(2)>0.5D0+dlt_BZ)then 
00038    SKQ(2)=SKQ(2)-1.0D0 
00039    shift_G(2)=+1
00040   endif 
00041   if(SKQ(2)<=-1.5D0+dlt_BZ)then 
00042    SKQ(2)=SKQ(2)+2.0D0 
00043    shift_G(2)=-2 
00044   endif 
00045   if(SKQ(2)<=-0.5D0+dlt_BZ)then 
00046    SKQ(2)=SKQ(2)+1.0D0 
00047    shift_G(2)=-1
00048   endif 
00049   !
00050   if(SKQ(3)>1.5D0+dlt_BZ)then 
00051    SKQ(3)=SKQ(3)-2.0D0 
00052    shift_G(3)=+2 
00053   endif 
00054   if(SKQ(3)>0.5D0+dlt_BZ)then 
00055    SKQ(3)=SKQ(3)-1.0D0 
00056    shift_G(3)=+1
00057   endif 
00058   if(SKQ(3)<=-1.5D0+dlt_BZ)then 
00059    SKQ(3)=SKQ(3)+2.0D0 
00060    shift_G(3)=-2 
00061   endif 
00062   if(SKQ(3)<=-0.5D0+dlt_BZ)then 
00063    SKQ(3)=SKQ(3)+1.0D0 
00064    shift_G(3)=-1
00065   endif 
00066   !
00067   do jk=1,NTK
00068    if(ABS(SK0(1,jk)-SKQ(1))<1.D-6.and.ABS(SK0(2,jk)-SKQ(2))<1.D-6.and.ABS(SK0(3,jk)-SKQ(3))<1.D-6)then 
00069     ikq=jk 
00070    endif 
00071   enddo 
00072   RETURN  
00073 END 
00074 !
00075 subroutine calc_InterStateMatrix(NTK,NTG,NG0,KG0,C0_K,C0_KQ,ik,ikq,nwx2,nwy2,nwz2,nfft1,nfft2,Nl123,&
00076   wfunc,fftwk,fs,LG0,NG_for_eps,shift_G,m_tmp)
00077   use fft_3d 
00078   implicit none 
00079   type(fft3_struct)::fs 
00080   integer::NTK,NTG 
00081   integer::NG0(NTK),KG0(3,NTG,NTK) 
00082   complex(8)::C0_K(NTG),C0_KQ(NTG) 
00083   integer::ik,ikq 
00084   integer::nwx2,nwy2,nwz2,nfft1,nfft2,Nl123 
00085   real(8)::wfunc(Nl123*2),fftwk(Nl123*2) 
00086   integer::NG_for_eps 
00087   integer::LG0(3,NTG) 
00088   integer::shift_G(3)
00089   integer::ig,igb1,igb2,igb3,ind,igL,igL1,igL2,igL3  
00090   integer::ir,ir1,ir2,ir3
00091   real(8)::dG1,dG2,dG3,phase 
00092   complex(8),allocatable::cell_periodic_k(:)
00093   complex(8),allocatable::cell_periodic_kq(:)
00094   complex(8)::f,pf
00095   complex(8)::phx(nwx2),phy(nwy2),phz(nwz2)
00096   complex(8)::m_tmp(NG_for_eps) 
00097   !
00098   real(8),parameter::pi=dacos(-1.0d0)
00099   real(8),parameter::tpi=2.0d0*pi 
00100   complex(8),parameter::ci=(0.0D0,1.0D0) 
00101   !
00102   allocate(cell_periodic_k(Nl123))
00103   allocate(cell_periodic_kq(Nl123))
00104   wfunc(:)=0.0D0
00105   fftwk(:)=0.0D0
00106   do ig=1,NG0(ik) 
00107    igb1=KG0(1,ig,ik) 
00108    igb2=KG0(2,ig,ik) 
00109    igb3=KG0(3,ig,ik) 
00110    igb1=MOD(nwx2+igb1,nwx2)+1
00111    igb2=MOD(nwy2+igb2,nwy2)+1
00112    igb3=MOD(nwz2+igb3,nwz2)+1
00113    ind=igb1+(igb2-1)*nfft1+(igb3-1)*nfft1*nfft2 
00114    wfunc(ind)=dble(C0_K(ig))
00115    wfunc(ind+Nl123)=dimag(C0_K(ig))
00116   enddo!ig 
00117   call fft3_bw(fs,wfunc,fftwk) 
00118   do ir=1,Nl123 
00119    cell_periodic_k(ir)=cmplx(wfunc(ir),wfunc(ir+Nl123)) 
00120   enddo 
00121   !--
00122   wfunc(:)=0.0D0
00123   fftwk(:)=0.0D0
00124   do ig=1,NG0(ikq)
00125    igb1=KG0(1,ig,ikq)
00126    igb2=KG0(2,ig,ikq) 
00127    igb3=KG0(3,ig,ikq) 
00128    igb1=MOD(nwx2+igb1,nwx2)+1
00129    igb2=MOD(nwy2+igb2,nwy2)+1      
00130    igb3=MOD(nwz2+igb3,nwz2)+1 
00131    ind=igb1+(igb2-1)*nfft1+(igb3-1)*nfft1*nfft2 
00132    wfunc(ind)=dble(C0_KQ(ig))
00133    wfunc(ind+Nl123)=dimag(C0_KQ(ig)) 
00134   enddo!ig 
00135   call fft3_bw(fs,wfunc,fftwk)    
00136   do ir=1,Nl123
00137    cell_periodic_kq(ir)=cmplx(wfunc(ir),wfunc(ir+Nl123)) 
00138   enddo 
00139   !--
00140   dG1=dble(shift_G(1))
00141   dG2=dble(shift_G(2))
00142   dG3=dble(shift_G(3))
00143   !YOSHIHIDE YOSHIMOTO 20080620 
00144   do ir1=1,nwx2
00145    phase = tpi*(dble(ir1-1)*dG1/dble(nwx2))
00146    phx(ir1) = exp(-ci*phase)
00147   end do
00148   do ir2=1,nwy2
00149    phase = tpi*(dble(ir2-1)*dG2/dble(nwy2))
00150    phy(ir2) = exp(-ci*phase)
00151   end do
00152   do ir3=1,nwz2
00153    phase = tpi*(dble(ir3-1)*dG3/dble(nwz2))
00154    phz(ir3) = exp(-ci*phase)
00155   end do
00156   !
00157   do ir3=1,nwz2
00158    do ir2=1,nwy2
00159     do ir1=1,nwx2
00160      ir=ir1+(ir2-1)*nfft1+(ir3-1)*nfft1*nfft2 
00161      !YOSHIHIDE YOSHIMOTO 20080620 
00162      pf=phx(ir1)*phy(ir2)*phz(ir3)
00163      cell_periodic_kq(ir)=cell_periodic_kq(ir)*pf 
00164     enddo 
00165    enddo 
00166   enddo 
00167   !
00168   wfunc(:)=0.0D0
00169   fftwk(:)=0.0D0
00170   do ir=1,Nl123 
00171    f=CONJG(cell_periodic_kq(ir))*cell_periodic_k(ir)
00172    wfunc(ir)=dble(f)
00173    wfunc(ir+Nl123)=dimag(f) 
00174   enddo 
00175   call fft3_fw(fs,wfunc,fftwk) 
00176   do igL=1,NG_for_eps
00177    igL1=-LG0(1,igL)
00178    igL2=-LG0(2,igL)
00179    igL3=-LG0(3,igL) 
00180    igL1=MOD(nwx2+igL1,nwx2)+1
00181    igL2=MOD(nwy2+igL2,nwy2)+1
00182    igL3=MOD(nwz2+igL3,nwz2)+1
00183    ind=igL1+(igL2-1)*nfft1+(igL3-1)*nfft1*nfft2
00184    m_tmp(igL)=cmplx(wfunc(ind),wfunc(ind+Nl123))
00185   enddo 
00186   !--
00187   deallocate(cell_periodic_k)
00188   deallocate(cell_periodic_kq)
00189   RETURN  
00190 END 
00191 !
00192 subroutine calc_MAT_VXC(NTK,NWF,NTG,NG0,KG0,vhxc,C0_K,ik,nrx2,nry2,nrz2,nfft1,nfft2,Nl123,&
00193   wfunc,fftwk,fs,MAT_VHXC)
00194   use fft_3d 
00195   implicit none 
00196   type(fft3_struct)::fs 
00197   integer::ik,NTK,NWF,NTG 
00198   integer::NG0(NTK)
00199   integer::KG0(3,NTG,NTK) 
00200   !
00201   !20180922 
00202   !
00203   !complex(8)::C0_K(NTG,NWF)
00204   complex(4)::C0_K(NTG,NWF)
00205   !
00206   integer::nrx2,nry2,nrz2,nfft1,nfft2,Nl123
00207   real(8)::wfunc(Nl123*2)
00208   real(8)::fftwk(Nl123*2) 
00209   real(8)::vhxc(nrx2,nry2,nrz2) 
00210   integer::ig,igb1,igb2,igb3,ind
00211   integer::ir,ir1,ir2,ir3,iw,jw
00212   complex(8)::SUM_CMPX
00213   complex(8),allocatable::u_1D(:)!u_1D(Nl123)  
00214   complex(8),allocatable::u_3D(:,:,:,:)!u_3D(nrx2,nry2,nrz2,NWF)  
00215   complex(8),intent(out)::MAT_VHXC(NWF,NWF) 
00216   !
00217   allocate(u_1D(Nl123));u_1D=0.0d0 
00218   allocate(u_3D(nrx2,nry2,nrz2,NWF));u_3D=0.0d0 
00219   do iw=1,NWF 
00220    wfunc=0.0d0
00221    fftwk=0.0d0
00222    do ig=1,NG0(ik) 
00223     igb1=KG0(1,ig,ik) 
00224     igb2=KG0(2,ig,ik) 
00225     igb3=KG0(3,ig,ik) 
00226     igb1=MOD(nrx2+igb1,nrx2)+1
00227     igb2=MOD(nry2+igb2,nry2)+1
00228     igb3=MOD(nrz2+igb3,nrz2)+1
00229     ind=igb1+(igb2-1)*nfft1+(igb3-1)*nfft1*nfft2 
00230     wfunc(ind)=dble(C0_K(ig,iw))
00231     !
00232     !20180922
00233     !
00234     !wfunc(ind+Nl123)=dimag(C0_K(ig,iw))
00235     wfunc(ind+Nl123)=imag(C0_K(ig,iw))
00236     ! 
00237    enddo!ig 
00238    call fft3_bw(fs,wfunc(1),fftwk(1)) 
00239    u_1D(:)=0.0d0 
00240    do ir=1,Nl123 
00241     u_1D(ir)=cmplx(wfunc(ir),wfunc(ir+Nl123)) 
00242    enddo!ir 
00243    do ir3=1,nrz2
00244     do ir2=1,nry2
00245      do ir1=1,nrx2
00246       ir=ir1+(ir2-1)*nfft1+(ir3-1)*nfft1*nfft2 
00247       u_3D(ir1,ir2,ir3,iw)=u_1D(ir) 
00248      enddo!ir1 
00249     enddo!ir2 
00250    enddo!ir3 
00251   enddo!iw  
00252   MAT_VHXC(:,:)=0.0d0 
00253   do iw=1,NWF
00254    do jw=1,NWF
00255     SUM_CMPX=0.0D0 
00256     do ir3=1,nrz2
00257      do ir2=1,nry2
00258       do ir1=1,nrx2
00259        SUM_CMPX=SUM_CMPX+CONJG(u_3D(ir1,ir2,ir3,iw))*vhxc(ir1,ir2,ir3)*u_3D(ir1,ir2,ir3,jw)
00260       enddo!ir1 
00261      enddo!ir2 
00262     enddo!ir3 
00263     MAT_VHXC(iw,jw)=SUM_CMPX/dble(nrx2)/dble(nry2)/dble(nrz2)
00264    enddo!jw 
00265   enddo!iw  
00266   !
00267   !write(6,*)'CHECK MAT_VHXC'
00268   !
00269   !do iw=1,NWF 
00270   ! write(6,*)(MAT_VHXC(iw,jw),jw=1,NWF)
00271   !enddo 
00272   !write(6,*)
00273   !
00274   deallocate(u_1D,u_3D)
00275   RETURN  
00276 END 
00277 !
00278 !subroutine make_C0_for_given_band(NTG,itrs,NG,KGtmp,RWtmp,rginvtmp,pgtmp,L1,L2,L3,packtmp,OCCtmp,C0_K) 
00279 !implicit none 
00280 !integer::NTG,L1,L2,L3 
00281 !integer::itrs 
00282 !integer::NG
00283 !integer::KGtmp(3,NTG) 
00284 !integer::RWtmp(3) 
00285 !real(8)::rginvtmp(3,3) 
00286 !integer::pgtmp(3) 
00287 !integer::packtmp(-L1:L1,-L2:L2,-L3:L3) 
00288 !complex(8)::OCCtmp(NTG) 
00289 !integer::ig,jg,i1,i2,i3,j1,j2,j3,k1,k2,k3 
00290 !real(8),parameter::pi=dacos(-1.0d0)
00291 !real(8),parameter::tpi=2.0d0*pi 
00292 !complex(8),parameter::ci=(0.0D0,1.0D0) 
00293 !real(8)::phase 
00294 !complex(8)::pf 
00295 !complex(8)::C0_K(NTG) 
00296 !!
00297 !C0_K(:)=0.0d0 
00298 !select case(itrs) 
00299 !case(1)!=== not time-reversal ===      
00300 ! do ig=1,NG 
00301 !  i1=KGtmp(1,ig); j1=KGtmp(2,ig); k1=KGtmp(3,ig) 
00302 !  i2=i1+RWtmp(1); j2=j1+RWtmp(2); k2=k1+RWtmp(3) 
00303 !  i3=int(rginvtmp(1,1))*i2+int(rginvtmp(1,2))*j2+int(rginvtmp(1,3))*k2 
00304 !  j3=int(rginvtmp(2,1))*i2+int(rginvtmp(2,2))*j2+int(rginvtmp(2,3))*k2 
00305 !  k3=int(rginvtmp(3,1))*i2+int(rginvtmp(3,2))*j2+int(rginvtmp(3,3))*k2 
00306 !  jg=packtmp(i3,j3,k3) 
00307 !  phase=tpi*(dble(i1)*dble(pgtmp(1))+dble(j1)*dble(pgtmp(2))+dble(k1)*dble(pgtmp(3))) 
00308 !  pf=exp(-ci*phase) 
00309 !  C0_K(ig)=OCCtmp(jg)*pf 
00310 ! enddo!ig 
00311 !case(-1)!=== time-reversal ===      
00312 ! do ig=1,NG 
00313 !  i1=-KGtmp(1,ig); j1=-KGtmp(2,ig); k1=-KGtmp(3,ig) 
00314 !  i2=i1+RWtmp(1); j2=j1+RWtmp(2); k2=k1+RWtmp(3) 
00315 !  i3=int(rginvtmp(1,1))*i2+int(rginvtmp(1,2))*j2+int(rginvtmp(1,3))*k2 
00316 !  j3=int(rginvtmp(2,1))*i2+int(rginvtmp(2,2))*j2+int(rginvtmp(2,3))*k2 
00317 !  k3=int(rginvtmp(3,1))*i2+int(rginvtmp(3,2))*j2+int(rginvtmp(3,3))*k2 
00318 !  jg=packtmp(i3,j3,k3) 
00319 !  phase=tpi*(dble(i1)*dble(pgtmp(1))+dble(j1)*dble(pgtmp(2))+dble(k1)*dble(pgtmp(3))) 
00320 !  pf=exp(-ci*phase) 
00321 !  C0_K(ig)=OCCtmp(jg)*pf 
00322 ! enddo !ig 
00323 ! C0_K(:)=conjg(C0_K(:))  
00324 !end select 
00325 !return 
00326 !end 
00327 !
00328 !subroutine make_eps(NTG,NTGQ,ne,itrs,NG,LGtmp,RWtmp,rginvtmp,pgtmp,nnp,L1,L2,L3,packtmp,epsirr,epsmk) 
00329 !implicit none 
00330 !integer::NTG,NTGQ,itrs,NG,ne,L1,L2,L3,nnp 
00331 !integer::LGtmp(3,NTG) 
00332 !integer::RWtmp(3) 
00333 !real(8)::rginvtmp(3,3) 
00334 !integer::pgtmp(3) 
00335 !integer::packtmp(-L1:L1,-L2:L2,-L3:L3) 
00336 !complex(4)::epsirr(NTGQ,NTGQ,ne) 
00337 !integer::ig,jg,i1,i2,i3,j1,j2,j3,k1,k2,k3,iig,jjg 
00338 !real(8)::phase 
00339 !complex(8)::pf1,pf2 
00340 !complex(4)::epsmk(NTGQ,NTGQ,ne) 
00341 !!
00342 !real(8),parameter::pi=dacos(-1.0d0)
00343 !real(8),parameter::tpi=2.0d0*pi 
00344 !complex(8),parameter::ci=(0.0D0,1.0D0) 
00345 !!
00346 !epsmk(:,:,:)=0.0d0 
00347 !select case(itrs) 
00348 !case(1)!=== not time-reversal ===    
00349 !do ig=1,NG 
00350 ! i1=LGtmp(1,ig); j1=LGtmp(2,ig); k1=LGtmp(3,ig) 
00351 ! i2=i1+RWtmp(1); j2=j1+RWtmp(2); k2=k1+RWtmp(3) 
00352 ! i3=int(rginvtmp(1,1))*i2+int(rginvtmp(1,2))*j2+int(rginvtmp(1,3))*k2 
00353 ! j3=int(rginvtmp(2,1))*i2+int(rginvtmp(2,2))*j2+int(rginvtmp(2,3))*k2 
00354 ! k3=int(rginvtmp(3,1))*i2+int(rginvtmp(3,2))*j2+int(rginvtmp(3,3))*k2 
00355 ! iig=packtmp(i3,j3,k3) 
00356 ! phase=tpi*(dble(i1)*dble(pgtmp(1))+dble(j1)*dble(pgtmp(2))+dble(k1)*dble(pgtmp(3))) 
00357 ! pf1=exp(-ci*phase/dble(nnp)) 
00358 ! do jg=1,NG 
00359 !  i1=LGtmp(1,jg); j1=LGtmp(2,jg); k1=LGtmp(3,jg) 
00360 !  i2=i1+RWtmp(1); j2=j1+RWtmp(2); k2=k1+RWtmp(3) 
00361 !  i3=int(rginvtmp(1,1))*i2+int(rginvtmp(1,2))*j2+int(rginvtmp(1,3))*k2 
00362 !  j3=int(rginvtmp(2,1))*i2+int(rginvtmp(2,2))*j2+int(rginvtmp(2,3))*k2 
00363 !  k3=int(rginvtmp(3,1))*i2+int(rginvtmp(3,2))*j2+int(rginvtmp(3,3))*k2 
00364 !  jjg=packtmp(i3,j3,k3) 
00365 !  phase=tpi*(dble(i1)*dble(pgtmp(1))+dble(j1)*dble(pgtmp(2))+dble(k1)*dble(pgtmp(3))) 
00366 !  pf2=exp(ci*phase/dble(nnp)) 
00367 !  !write(6,'(a,x,2i5)') 'iig jjg',iig,jjg  
00368 !  epsmk(ig,jg,:)=epsirr(iig,jjg,:)*pf1*pf2 
00369 ! enddo!jg 
00370 !enddo!ig 
00371 !case(-1)!=== time-reversal ===      
00372 !do ig=1,NG 
00373 ! i1=-LGtmp(1,ig); j1=-LGtmp(2,ig); k1=-LGtmp(3,ig) 
00374 ! i2=i1+RWtmp(1); j2=j1+RWtmp(2); k2=k1+RWtmp(3) 
00375 ! i3=int(rginvtmp(1,1))*i2+int(rginvtmp(1,2))*j2+int(rginvtmp(1,3))*k2 
00376 ! j3=int(rginvtmp(2,1))*i2+int(rginvtmp(2,2))*j2+int(rginvtmp(2,3))*k2 
00377 ! k3=int(rginvtmp(3,1))*i2+int(rginvtmp(3,2))*j2+int(rginvtmp(3,3))*k2 
00378 ! iig=packtmp(i3,j3,k3) 
00379 ! phase=tpi*(dble(i1)*dble(pgtmp(1))+dble(j1)*dble(pgtmp(2))+dble(k1)*dble(pgtmp(3))) 
00380 ! pf1=exp(-ci*phase/dble(nnp)) 
00381 ! do jg=1,NG 
00382 !  i1=-LGtmp(1,jg); j1=-LGtmp(2,jg); k1=-LGtmp(3,jg) 
00383 !  i2=i1+RWtmp(1); j2=j1+RWtmp(2); k2=k1+RWtmp(3) 
00384 !  i3=int(rginvtmp(1,1))*i2+int(rginvtmp(1,2))*j2+int(rginvtmp(1,3))*k2 
00385 !  j3=int(rginvtmp(2,1))*i2+int(rginvtmp(2,2))*j2+int(rginvtmp(2,3))*k2 
00386 !  k3=int(rginvtmp(3,1))*i2+int(rginvtmp(3,2))*j2+int(rginvtmp(3,3))*k2 
00387 !  jjg=packtmp(i3,j3,k3) 
00388 !  phase=tpi*(dble(i1)*dble(pgtmp(1))+dble(j1)*dble(pgtmp(2))+dble(k1)*dble(pgtmp(3))) 
00389 !  pf2=exp(ci*phase/dble(nnp)) 
00390 !  epsmk(ig,jg,:)=epsirr(jjg,iig,:)*pf1*pf2 
00391 ! enddo!jg 
00392 !enddo!ig 
00393 !end select 
00394 !!
00395 !!write(6,*)'finish make_eps'
00396 !!
00397 !return 
00398 !end 

Generated on 17 Nov 2020 for respack by  doxygen 1.6.1