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,jk
00007 real(8)::SKQ(3)
00008 integer::ikq,shift_G(3)
00009 real(8),parameter::dlt_BZ=1.0d-6
00010
00011 SKQ(1)=SK0(1,ik)+q1
00012 SKQ(2)=SK0(2,ik)+q2
00013 SKQ(3)=SK0(3,ik)+q3
00014
00015 if(SKQ(1)>1.50d0+dlt_BZ)then
00016 SKQ(1)=SKQ(1)-2.0D0
00017 shift_G(1)=+2
00018 endif
00019 if(SKQ(1)>0.5D0+dlt_BZ)then
00020 SKQ(1)=SKQ(1)-1.0D0
00021 shift_G(1)=+1
00022 endif
00023 if(SKQ(1)<=-1.5D0+dlt_BZ)then
00024 SKQ(1)=SKQ(1)+2.0D0
00025 shift_G(1)=-2
00026 endif
00027 if(SKQ(1)<=-0.5D0+dlt_BZ)then
00028 SKQ(1)=SKQ(1)+1.0D0
00029 shift_G(1)=-1
00030 endif
00031
00032 if(SKQ(2)>1.5D0+dlt_BZ)then
00033 SKQ(2)=SKQ(2)-2.0D0
00034 shift_G(2)=+2
00035 endif
00036 if(SKQ(2)>0.5D0+dlt_BZ)then
00037 SKQ(2)=SKQ(2)-1.0D0
00038 shift_G(2)=+1
00039 endif
00040 if(SKQ(2)<=-1.5D0+dlt_BZ)then
00041 SKQ(2)=SKQ(2)+2.0D0
00042 shift_G(2)=-2
00043 endif
00044 if(SKQ(2)<=-0.5D0+dlt_BZ)then
00045 SKQ(2)=SKQ(2)+1.0D0
00046 shift_G(2)=-1
00047 endif
00048
00049 if(SKQ(3)>1.5D0+dlt_BZ)then
00050 SKQ(3)=SKQ(3)-2.0D0
00051 shift_G(3)=+2
00052 endif
00053 if(SKQ(3)>0.5D0+dlt_BZ)then
00054 SKQ(3)=SKQ(3)-1.0D0
00055 shift_G(3)=+1
00056 endif
00057 if(SKQ(3)<=-1.5D0+dlt_BZ)then
00058 SKQ(3)=SKQ(3)+2.0D0
00059 shift_G(3)=-2
00060 endif
00061 if(SKQ(3)<=-0.5D0+dlt_BZ)then
00062 SKQ(3)=SKQ(3)+1.0D0
00063 shift_G(3)=-1
00064 endif
00065
00066 do jk=1,NTK
00067 if(ABS(SK0(1,jk)-SKQ(1))<1.D-6.and.
00068 + ABS(SK0(2,jk)-SKQ(2))<1.D-6.and.
00069 + ABS(SK0(3,jk)-SKQ(3))<1.D-6)then
00070 ikq=jk
00071 endif
00072
00073 enddo
00074 RETURN
00075 END
00076
00077 subroutine search_list(SQI,SQ)
00078 implicit none
00079 real(8)::SQI(3),SQ(3)
00080 real(8),parameter::dlt_BZ=1.0d-6
00081 SQ=SQI
00082 if(SQ(1)> 1.50d0+dlt_BZ) SQ(1)=SQ(1)-2.0d0
00083 if(SQ(1)> 0.50d0+dlt_BZ) SQ(1)=SQ(1)-1.0d0
00084 if(SQ(1)<=-1.50d0+dlt_BZ) SQ(1)=SQ(1)+2.0d0
00085 if(SQ(1)<=-0.50d0+dlt_BZ) SQ(1)=SQ(1)+1.0d0
00086 if(SQ(2)> 1.50d0+dlt_BZ) SQ(2)=SQ(2)-2.0d0
00087 if(SQ(2)> 0.50d0+dlt_BZ) SQ(2)=SQ(2)-1.0d0
00088 if(SQ(2)<=-1.50d0+dlt_BZ) SQ(2)=SQ(2)+2.0d0
00089 if(SQ(2)<=-0.50d0+dlt_BZ) SQ(2)=SQ(2)+1.0d0
00090 if(SQ(3)> 1.50d0+dlt_BZ) SQ(3)=SQ(3)-2.0d0
00091 if(SQ(3)> 0.50d0+dlt_BZ) SQ(3)=SQ(3)-1.0d0
00092 if(SQ(3)<=-0.50d0+dlt_BZ) SQ(3)=SQ(3)+1.0d0
00093 if(SQ(3)<=-1.50d0+dlt_BZ) SQ(3)=SQ(3)+2.0d0
00094 RETURN
00095 END
00096
00097 subroutine calc_InterStateMatrix(NTK,NTG,NG0,KG0,C0_K,C0_KQ,
00098 + ik,ikq,nwx2,nwy2,nwz2,
00099 + nfft1,nfft2,Nl123,
00100 + wfunc,fftwk,fs,LG0,NG_for_eps,
00101 + shift_G,m_tmp)
00102
00103 use fft_3d
00104 implicit none
00105 type(fft3_struct)::fs
00106 integer::NTK,NTG
00107 integer::NG0(NTK),KG0(3,NTG,NTK)
00108 complex(8)::C0_K(NTG),C0_KQ(NTG)
00109 integer::ik,ikq
00110 integer::nwx2,nwy2,nwz2,nfft1,nfft2,Nl123
00111 real(8)::wfunc(Nl123*2),fftwk(Nl123*2)
00112 integer::NG_for_eps
00113 integer::LG0(3,NTG)
00114 integer::shift_G(3)
00115 integer::ig,igb1,igb2,igb3,ind,igL,igL1,igL2,igL3
00116 integer::ir,ir1,ir2,ir3
00117 complex(8)::cell_periodic_k(Nl123)
00118 complex(8)::cell_periodic_kq(Nl123)
00119 complex(8)::f
00120 real(8)::dG1,dG2,dG3
00121 real(8)::phase
00122 complex(8)::pf
00123 complex(8)::m_tmp(NG_for_eps)
00124 real(8),parameter::pi=dacos(-1.0d0)
00125 real(8),parameter::tpi=2.0d0*pi
00126 complex(8),parameter::ci=(0.0D0,1.0D0)
00127
00128 wfunc(:)=0.0D0
00129 fftwk(:)=0.0D0
00130 do ig=1,NG0(ik)
00131 igb1=KG0(1,ig,ik)
00132 igb2=KG0(2,ig,ik)
00133 igb3=KG0(3,ig,ik)
00134 igb1=MOD(nwx2+igb1,nwx2)+1
00135 igb2=MOD(nwy2+igb2,nwy2)+1
00136 igb3=MOD(nwz2+igb3,nwz2)+1
00137 ind=igb1+(igb2-1)*nfft1+(igb3-1)*nfft1*nfft2
00138 wfunc(ind)=dble(C0_K(ig))
00139 wfunc(ind+Nl123)=dimag(C0_K(ig))
00140 enddo
00141 call fft3_bw(fs,wfunc(1),fftwk(1))
00142 do ir=1,Nl123
00143 cell_periodic_k(ir)=cmplx(wfunc(ir),wfunc(ir+Nl123))
00144 enddo
00145
00146
00147 wfunc(:)=0.0D0
00148 fftwk(:)=0.0D0
00149 do ig=1,NG0(ikq)
00150 igb1=KG0(1,ig,ikq)
00151 igb2=KG0(2,ig,ikq)
00152 igb3=KG0(3,ig,ikq)
00153 igb1=MOD(nwx2+igb1,nwx2)+1
00154 igb2=MOD(nwy2+igb2,nwy2)+1
00155 igb3=MOD(nwz2+igb3,nwz2)+1
00156 ind=igb1+(igb2-1)*nfft1+(igb3-1)*nfft1*nfft2
00157 wfunc(ind)=dble(C0_KQ(ig))
00158 wfunc(ind+Nl123)=dimag(C0_KQ(ig))
00159 enddo
00160 call fft3_bw(fs,wfunc,fftwk)
00161 do ir=1,Nl123
00162 cell_periodic_kq(ir)=cmplx(wfunc(ir),wfunc(ir+Nl123))
00163 enddo
00164
00165
00166 dG1=dble(shift_G(1))
00167 dG2=dble(shift_G(2))
00168 dG3=dble(shift_G(3))
00169
00170
00171 do ir3=1,nwz2
00172 do ir2=1,nwy2
00173 do ir1=1,nwx2
00174 ir=ir1+(ir2-1)*nfft1+(ir3-1)*nfft1*nfft2
00175 phase=tpi*(dble(ir1-1)*dG1/dble(nwx2)
00176 + +dble(ir2-1)*dG2/dble(nwy2)
00177 + +dble(ir3-1)*dG3/dble(nwz2))
00178 pf=exp(-ci*phase)
00179 cell_periodic_kq(ir)
00180 + =cell_periodic_kq(ir)*pf
00181 enddo
00182 enddo
00183 enddo
00184
00185 wfunc(:)=0.0D0
00186 fftwk(:)=0.0D0
00187 do ir=1,Nl123
00188 f=CONJG(cell_periodic_kq(ir))*cell_periodic_k(ir)
00189 wfunc(ir)=dble(f)
00190 wfunc(ir+Nl123)=dimag(f)
00191 enddo
00192 call fft3_fw(fs,wfunc,fftwk)
00193 do igL=1,NG_for_eps
00194 igL1=-LG0(1,igL)
00195 igL2=-LG0(2,igL)
00196 igL3=-LG0(3,igL)
00197 igL1=MOD(nwx2+igL1,nwx2)+1
00198 igL2=MOD(nwy2+igL2,nwy2)+1
00199 igL3=MOD(nwz2+igL3,nwz2)+1
00200 ind=igL1+(igL2-1)*nfft1+(igL3-1)*nfft1*nfft2
00201 m_tmp(igL)=cmplx(wfunc(ind),wfunc(ind+Nl123))
00202 enddo
00203
00204 RETURN
00205 END
00206
00207 subroutine calc_VMab(NTK,NTG,NG0,KG0,C0_K,C0_KQ,ik,b1,b2,b3,vm)
00208 implicit none
00209 integer::NTK,NTG,ik
00210 integer::NG0(NTK),KG0(3,NTG,NTK)
00211 real(8)::b1(3),b2(3),b3(3)
00212 complex(8)::C0_K(NTG),C0_KQ(NTG)
00213 integer::ig,igb1,igb2,igb3
00214 real(8)::G_VEC(3)
00215 complex(8)::SUM_VEC(3)
00216 complex(8)::vm(3)
00217 complex(8),parameter::ci=(0.0D0,1.0D0)
00218
00219 SUM_VEC(:)=0.0D0
00220 do ig=1,NG0(ik)
00221 igb1=KG0(1,ig,ik)
00222 igb2=KG0(2,ig,ik)
00223 igb3=KG0(3,ig,ik)
00224 G_VEC(:)=dble(igb1)*b1(:)+dble(igb2)*b2(:)+dble(igb3)*b3(:)
00225 SUM_VEC(:)=SUM_VEC(:)+G_VEC(:)*CONJG(C0_KQ(ig))*C0_K(ig)
00226 enddo
00227
00228
00229
00230 vm(:)=SUM_VEC(:)*ci
00231 RETURN
00232 END
00233
00234 subroutine calc_VMaa(NTK,NTG,NG0,KG0,C0_K,C0_KQ,ik,b1,b2,b3,SKT,
00235 + vm)
00236 implicit none
00237 integer::NTK,NTG,ik
00238 integer::NG0(NTK),KG0(3,NTG,NTK)
00239 real(8)::b1(3),b2(3),b3(3),SKT(3)
00240 complex(8)::C0_K(NTG),C0_KQ(NTG)
00241 integer::ig,igb1,igb2,igb3
00242 real(8)::G_VEC(3)
00243 complex(8)::SUM_VEC(3)
00244 complex(8) :: vm(3)
00245 complex(8),parameter::ci=(0.0D0,1.0D0)
00246
00247 SUM_VEC(:)=0.0D0
00248 do ig=1,NG0(ik)
00249 igb1=KG0(1,ig,ik)
00250 igb2=KG0(2,ig,ik)
00251 igb3=KG0(3,ig,ik)
00252 G_VEC(:)=(SKT(1)+dble(igb1))*b1(:)
00253 + +(SKT(2)+dble(igb2))*b2(:)
00254 + +(SKT(3)+dble(igb3))*b3(:)
00255 SUM_VEC(:)=SUM_VEC(:)+G_VEC(:)*CONJG(C0_KQ(ig))*C0_K(ig)
00256 enddo
00257
00258
00259
00260 vm(:)=SUM_VEC(:)*ci
00261 RETURN
00262 END
00263
00264 subroutine make_C0(NTG,itrs,NG,KGtmp,RWtmp,rginvtmp,pgtmp,
00265 + nnp,L1,L2,L3,packtmp,OCCtmp,C0_K)
00266 implicit none
00267 integer::NTG,L1,L2,L3,nnp
00268 integer::itrs
00269 integer::NG
00270 integer::KGtmp(3,NTG)
00271 integer::RWtmp(3)
00272 real(8)::rginvtmp(3,3)
00273 integer::pgtmp(3)
00274 integer::packtmp(-L1:L1,-L2:L2,-L3:L3)
00275 complex(8)::OCCtmp(NTG)
00276 integer::ig,jg,i1,i2,i3,j1,j2,j3,k1,k2,k3
00277 real(8)::phase
00278 complex(8)::pf
00279 complex(8)::C0_K(NTG)
00280 real(8),parameter::pi=dacos(-1.0d0)
00281 real(8),parameter::tpi=2.0d0*pi
00282 complex(8),parameter::ci=(0.0D0,1.0D0)
00283
00284 C0_K(:)=0.0d0
00285 if(itrs==1) then
00286 do ig=1,NG
00287 i1=KGtmp(1,ig); j1=KGtmp(2,ig); k1=KGtmp(3,ig)
00288 i2=i1+RWtmp(1); j2=j1+RWtmp(2); k2=k1+RWtmp(3)
00289 i3=int(rginvtmp(1,1))*i2+int(rginvtmp(1,2))*j2
00290 + +int(rginvtmp(1,3))*k2
00291 j3=int(rginvtmp(2,1))*i2+int(rginvtmp(2,2))*j2
00292 + +int(rginvtmp(2,3))*k2
00293 k3=int(rginvtmp(3,1))*i2+int(rginvtmp(3,2))*j2
00294 + +int(rginvtmp(3,3))*k2
00295 jg=packtmp(i3,j3,k3)
00296 phase=tpi*(dble(i1)*dble(pgtmp(1))
00297 + +dble(j1)*dble(pgtmp(2))
00298 + +dble(k1)*dble(pgtmp(3)))
00299 pf=exp(-ci*phase/dble(nnp))
00300 C0_K(ig)=OCCtmp(jg)*pf
00301 enddo
00302 elseif(itrs==-1) then
00303 do ig=1,NG
00304 i1=-KGtmp(1,ig); j1=-KGtmp(2,ig); k1=-KGtmp(3,ig)
00305 i2=i1+RWtmp(1); j2=j1+RWtmp(2); k2=k1+RWtmp(3)
00306 i3=int(rginvtmp(1,1))*i2+int(rginvtmp(1,2))*j2
00307 + +int(rginvtmp(1,3))*k2
00308 j3=int(rginvtmp(2,1))*i2+int(rginvtmp(2,2))*j2
00309 + +int(rginvtmp(2,3))*k2
00310 k3=int(rginvtmp(3,1))*i2+int(rginvtmp(3,2))*j2
00311 + +int(rginvtmp(3,3))*k2
00312 jg=packtmp(i3,j3,k3)
00313 phase=tpi*(dble(i1)*dble(pgtmp(1))
00314 + +dble(j1)*dble(pgtmp(2))
00315 + +dble(k1)*dble(pgtmp(3)))
00316 pf=exp(-ci*phase/dble(nnp))
00317 C0_K(ig)=OCCtmp(jg)*pf
00318 enddo
00319 C0_K(:)=conjg(C0_K(:))
00320 endif
00321 return
00322 end
00323
00324 SUBROUTINE make_index_kpt(NTK,nkb1,nkb2,nkb3,SK0,index_kpt)
00325 implicit none
00326 integer::NTK,nkb1,nkb2,nkb3
00327 real(8)::SK0(3,NTK)
00328 integer::ik,ix,iy,iz
00329 real(8)::x,y,z
00330 integer::index_kpt(nkb1,nkb2,nkb3)
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365 do ik=1,NTK
00366 x=SK0(1,ik)*dble(nkb1)
00367 y=SK0(2,ik)*dble(nkb2)
00368 z=SK0(3,ik)*dble(nkb3)
00369 x=x+(dble(nkb1)-dble(mod(nkb1,2)))/2.0d0
00370 y=y+(dble(nkb2)-dble(mod(nkb2,2)))/2.0d0
00371 z=z+(dble(nkb3)-dble(mod(nkb3,2)))/2.0d0
00372 ix=idnint(x)+mod(nkb1,2)
00373 iy=idnint(y)+mod(nkb2,2)
00374 iz=idnint(z)+mod(nkb3,2)
00375 index_kpt(ix,iy,iz)=ik
00376 enddo
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389 RETURN
00390 END
00391
00392 subroutine calc_eps_rpa(NTG,NG_for_eps,LG0,
00393 + q1,q2,q3,b1,b2,b3,
00394 + chi0,tpi,eps_rpa,
00395 + file_num_chi,file_num_eps)
00396 implicit none
00397 integer::NTG,NG_for_eps
00398 integer::LG0(3,NTG)
00399 real(8)::q1,q2,q3,b1(3),b2(3),b3(3),tpi
00400 integer::file_num_chi,file_num_eps
00401 complex(8)::chi0(NG_for_eps,NG_for_eps)
00402 integer::ig,jg,igL1,igL2,igL3,jgL1,jgL2,jgL3
00403 real(8)::qgL(3),qgL1,qgL2,qgLi,qgLj
00404 complex(8)::f
00405 complex(8)::eps_rpa(NG_for_eps,NG_for_eps)
00406
00407 if(file_num_chi==0) write(6,*)'not write chi'
00408
00409 chi0(:,:)=2.0d0*chi0(:,:)
00410
00411 write(6,*)'calc eps_rpa'
00412 write(6,*)' '
00413 eps_rpa(:,:)=0.0D0
00414 do ig=1,NG_for_eps
00415 igL1=LG0(1,ig)
00416 igL2=LG0(2,ig)
00417 igL3=LG0(3,ig)
00418 qgL(:)=(q1+dble(igL1))*b1(:)
00419 + +(q2+dble(igL2))*b2(:)
00420 + +(q3+dble(igL3))*b3(:)
00421 qgL2=qgL(1)**2+qgL(2)**2+qgL(3)**2
00422 qgLi=dsqrt(qgL2)
00423 do jg=1,NG_for_eps
00424 jgL1=LG0(1,jg)
00425 jgL2=LG0(2,jg)
00426 jgL3=LG0(3,jg)
00427 qgL(:)=(q1+dble(jgL1))*b1(:)
00428 + +(q2+dble(jgL2))*b2(:)
00429 + +(q3+dble(jgL3))*b3(:)
00430 qgL2=qgL(1)**2+qgL(2)**2+qgL(3)**2
00431 qgLj=dsqrt(qgL2)
00432
00433 if(ig==jg)then
00434
00435 eps_rpa(ig,jg)=1.0D0-chi0(ig,jg)*2.0D0*tpi/qgLi/qgLj
00436 endif
00437
00438 if(ig/=jg)then
00439 eps_rpa(ig,jg)=-chi0(ig,jg)*2.0D0*tpi/qgLi/qgLj
00440 endif
00441 enddo
00442 enddo
00443
00444 call invZGE(NG_for_eps,eps_rpa(1,1))
00445
00446 write(6,*)'calc eps_rpa_inv'
00447 write(6,*)' '
00448 do ig=1,NG_for_eps
00449 igL1=LG0(1,ig)
00450 igL2=LG0(2,ig)
00451 igL3=LG0(3,ig)
00452 qgL(:)=(q1+dble(igL1))*b1(:)
00453 + +(q2+dble(igL2))*b2(:)
00454 + +(q3+dble(igL3))*b3(:)
00455 qgL2=qgL(1)**2+qgL(2)**2+qgL(3)**2
00456 qgL1=dsqrt(qgL2)
00457 f=eps_rpa(ig,ig)
00458
00459 write(file_num_eps,'(3F20.10)') qgL1,dble(f),dimag(f)
00460 enddo
00461
00462 return
00463 end
00464
00465 subroutine calc_eps_rpa_q_0(NTG,NG_for_eps,LG0,
00466 + q1,q2,q3,b1,b2,b3,
00467 + chi0,tpi,No_G_0,eps_rpa,
00468 + wd,delt,wcmplx,
00469 + file_num_chi,file_num_eps)
00470 implicit none
00471 integer::NTG,NG_for_eps,No_G_0,file_num_chi,file_num_eps
00472 integer::LG0(3,NTG)
00473 real(8)::q1,q2,q3,b1(3),b2(3),b3(3),tpi,wd,delt,w
00474 complex(8)::chi0(NG_for_eps,NG_for_eps)
00475 complex(8)::wcmplx,f
00476 integer::ig,jg,igL1,igL2,igL3,jgL1,jgL2,jgL3
00477 real(8)::qgL(3),qgL1,qgL2,qgLi,qgLj
00478 complex(8)::eps_rpa(NG_for_eps,NG_for_eps)
00479
00480 if(file_num_chi==0) write(6,*)'not write chi'
00481
00482 chi0(:,:)=2.0d0*chi0(:,:)
00483
00484
00485
00486 w=abs(dble(wcmplx))
00487 if(w<1.0d-5)then
00488 w=1.0d-5
00489 write(6,*)' '
00490 write(6,'(a)')'### Since omega=0, change to omega=1.0d-5 ###'
00491 write(6,*)' '
00492 endif
00493
00494
00495
00496 write(6,*)'calc eps_rpa_q=0'
00497 write(6,*)' '
00498 eps_rpa(:,:)=0.0D0
00499 do ig=1,NG_for_eps
00500 igL1=LG0(1,ig)
00501 igL2=LG0(2,ig)
00502 igL3=LG0(3,ig)
00503 qgL(:)=(q1+dble(igL1))*b1(:)
00504 + +(q2+dble(igL2))*b2(:)
00505 + +(q3+dble(igL3))*b3(:)
00506 qgL2=qgL(1)**2+qgL(2)**2+qgL(3)**2
00507 qgLi=dsqrt(qgL2)
00508 do jg=1,NG_for_eps
00509 jgL1=LG0(1,jg)
00510 jgL2=LG0(2,jg)
00511 jgL3=LG0(3,jg)
00512 qgL(:)=(q1+dble(jgL1))*b1(:)
00513 + +(q2+dble(jgL2))*b2(:)
00514 + +(q3+dble(jgL3))*b3(:)
00515 qgL2=qgL(1)**2+qgL(2)**2+qgL(3)**2
00516 qgLj=dsqrt(qgL2)
00517
00518 if(ig==jg.and.ig==No_G_0)then
00519
00520 eps_rpa(ig,jg)
00521 + =1.0D0-chi0(ig,jg)*2.0D0*tpi
00522 + +cmplx(-wd**2/(w**2+delt**2),delt*wd**2/(w**3+w*delt**2))
00523 endif
00524
00525 if(ig==jg.and.ig/=No_G_0)then
00526
00527 eps_rpa(ig,jg)=1.0D0-chi0(ig,jg)*2.0D0*tpi/qgLi/qgLj
00528 endif
00529
00530 if(ig/=jg.and.ig==No_G_0)then
00531 eps_rpa(ig,jg)=-chi0(ig,jg)*2.0D0*tpi/qgLj
00532 endif
00533
00534 if(ig/=jg.and.jg==No_G_0)then
00535 eps_rpa(ig,jg)=-chi0(ig,jg)*2.0D0*tpi/qgLi
00536 endif
00537
00538 if(ig/=jg.and.ig/=No_G_0.and.jg/=No_G_0) then
00539 eps_rpa(ig,jg)=-chi0(ig,jg)*2.0D0*tpi/qgLi/qgLj
00540 endif
00541 enddo
00542 enddo
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562 call invZGE(NG_for_eps,eps_rpa(1,1))
00563
00564 write(6,*)'calc eps_rpa_inv_q=0'
00565 write(6,*)' '
00566 do ig=1,NG_for_eps
00567 igL1=LG0(1,ig)
00568 igL2=LG0(2,ig)
00569 igL3=LG0(3,ig)
00570 qgL(:)=(q1+dble(igL1))*b1(:)
00571 + +(q2+dble(igL2))*b2(:)
00572 + +(q3+dble(igL3))*b3(:)
00573 qgL2=qgL(1)**2+qgL(2)**2+qgL(3)**2
00574 qgL1=dsqrt(qgL2)
00575 f=eps_rpa(ig,ig)
00576
00577 write(file_num_eps,'(3F20.10)') qgL1,dble(f),dimag(f)
00578 enddo
00579 return
00580 end
00581
00582 subroutine judge_FermiInside(NTK,NTB,E_EIG,FermiEnergy,
00583 + WindowInside,Tindx,E_AVE,band_max,band_min)
00584 implicit none
00585 integer::NTK,NTB
00586 real(8)::E_EIG(NTB,NTK)
00587 real(8)::FermiEnergy
00588 integer::ik,ib,fs
00589 real(8)::e,top,btm
00590 integer::WindowInside(NTB)
00591 integer::Tindx(NTB)
00592 real(8)::E_AVE(NTB)
00593 real(8)::band_max(NTB)
00594 real(8)::band_min(NTB)
00595
00596 WindowInside(:)=0
00597 Tindx(:)=0
00598 do ib=1,NTB
00599 do ik=1,NTK
00600 e=E_EIG(ib,ik)
00601 if(ik==1)then
00602 top=e
00603 btm=e
00604 endif
00605 if(e<btm) btm=e
00606 if(e>top) top=e
00607 enddo
00608
00609 if(btm>FermiEnergy) fs=2
00610
00611 if(btm<=FermiEnergy.and.top>=FermiEnergy) then
00612 fs=1
00613 Tindx(ib)=ib
00614 endif
00615
00616 if(top<FermiEnergy) fs=0
00617
00618 WindowInside(ib)=fs
00619 E_AVE(ib)=(top+btm)/2.0d0
00620 band_max(ib)=top
00621 band_min(ib)=btm
00622 enddo
00623
00624 RETURN
00625 END
00626
00627 subroutine judge_WindowInside(NTK,NTB,E_EIG,EL,EU,WindowInside,
00628 + Tindx,E_AVE,band_max,band_min)
00629 implicit none
00630 integer::NTK,NTB
00631 real(8)::E_EIG(NTB,NTK)
00632 real(8)::EL,EU
00633 integer::ik,ib,fs
00634 real(8)::e,top,btm
00635 integer::WindowInside(NTB)
00636 integer::Tindx(NTB)
00637 real(8)::E_AVE(NTB)
00638 real(8)::band_max(NTB)
00639 real(8)::band_min(NTB)
00640
00641 WindowInside(:)=0
00642 Tindx(:)=0
00643 do ib=1,NTB
00644 do ik=1,NTK
00645 e=E_EIG(ib,ik)
00646 if(ik==1)then
00647 top=e
00648 btm=e
00649 endif
00650 if(e<btm) btm=e
00651 if(e>top) top=e
00652 enddo
00653
00654 if(top<EL) fs=0
00655
00656 if(EL<=top.and.top<EU.and.btm<EL) fs=0
00657
00658 if(EL<=top.and.top<EU.and.EL<=btm.and.btm<EU)then
00659 fs=1
00660 Tindx(ib)=ib
00661 endif
00662
00663 if(btm<EL.and.top>EU)then
00664 fs=1
00665 Tindx(ib)=ib
00666 endif
00667
00668 if(EL<btm.and.btm<EU.and.top>EU) fs=2
00669
00670 if(btm>EU) fs=2
00671
00672 WindowInside(ib)=fs
00673 E_AVE(ib)=(top+btm)/2.0d0
00674 band_max(ib)=top
00675 band_min(ib)=btm
00676 enddo
00677 RETURN
00678 END
00679
00680 subroutine kcheck(ktmp,RWtmp)
00681 implicit none
00682 real(8),intent(inout)::ktmp(3)
00683 integer,intent(out)::RWtmp(3)
00684 real(8),parameter::dlt_BZ=1.0d-6
00685
00686
00687
00688 if(ktmp(1)>1.50d0+dlt_BZ)then
00689 ktmp(1)=ktmp(1)-2.0d0;RWtmp(1)=-2
00690 endif
00691 if(ktmp(1)>0.50d0+dlt_BZ)then
00692 ktmp(1)=ktmp(1)-1.0d0;RWtmp(1)=-1
00693 endif
00694 if(ktmp(1)<=-1.50d0+dlt_BZ)then
00695 ktmp(1)=ktmp(1)+2.0d0;RWtmp(1)=2
00696 endif
00697 if(ktmp(1)<=-0.50d0+dlt_BZ)then
00698 ktmp(1)=ktmp(1)+1.0d0;RWtmp(1)=1
00699 endif
00700
00701 if(ktmp(2)>1.50d0+dlt_BZ)then
00702 ktmp(2)=ktmp(2)-2.0d0;RWtmp(2)=-2
00703 endif
00704 if(ktmp(2)>0.50d0+dlt_BZ)then
00705 ktmp(2)=ktmp(2)-1.0d0;RWtmp(2)=-1
00706 endif
00707 if(ktmp(2)<=-1.50d0+dlt_BZ)then
00708 ktmp(2)=ktmp(2)+2.0d0;RWtmp(2)=2
00709 endif
00710 if(ktmp(2)<=-0.50d0+dlt_BZ)then
00711 ktmp(2)=ktmp(2)+1.0d0;RWtmp(2)=1
00712 endif
00713
00714 if(ktmp(3)>1.50d0+dlt_BZ)then
00715 ktmp(3)=ktmp(3)-2.0d0;RWtmp(3)=-2
00716 endif
00717 if(ktmp(3)>0.50d0+dlt_BZ)then
00718 ktmp(3)=ktmp(3)-1.0d0;RWtmp(3)=-1
00719 endif
00720 if(ktmp(3)<=-1.50d0+dlt_BZ)then
00721 ktmp(3)=ktmp(3)+2.0d0;RWtmp(3)=2
00722 endif
00723 if(ktmp(3)<=-0.50d0+dlt_BZ)then
00724 ktmp(3)=ktmp(3)+1.0d0;RWtmp(3)=1
00725 endif
00726
00727
00728
00729 return
00730 end
00731
00732
00733 subroutine kcheck_trs(ktmp,RWtmp)!20170316
00734 implicit none
00735 real(8),intent(inout)::ktmp(3)
00736 integer,intent(out)::RWtmp(3)
00737 real(8),parameter::dlt_BZ=-1.0d-6
00738
00739
00740
00741 if(ktmp(1)>=1.50d0+dlt_BZ)then
00742 ktmp(1)=ktmp(1)-2.0d0;RWtmp(1)=-2
00743 endif
00744 if(ktmp(1)>=0.50d0+dlt_BZ)then
00745 ktmp(1)=ktmp(1)-1.0d0;RWtmp(1)=-1
00746 endif
00747 if(ktmp(1)<-1.50d0+dlt_BZ)then
00748 ktmp(1)=ktmp(1)+2.0d0;RWtmp(1)=2
00749 endif
00750 if(ktmp(1)<-0.50d0+dlt_BZ)then
00751 ktmp(1)=ktmp(1)+1.0d0;RWtmp(1)=1
00752 endif
00753
00754 if(ktmp(2)>=1.50d0+dlt_BZ)then
00755 ktmp(2)=ktmp(2)-2.0d0;RWtmp(2)=-2
00756 endif
00757 if(ktmp(2)>=0.50d0+dlt_BZ)then
00758 ktmp(2)=ktmp(2)-1.0d0;RWtmp(2)=-1
00759 endif
00760 if(ktmp(2)<-1.50d0+dlt_BZ)then
00761 ktmp(2)=ktmp(2)+2.0d0;RWtmp(2)=2
00762 endif
00763 if(ktmp(2)<-0.50d0+dlt_BZ)then
00764 ktmp(2)=ktmp(2)+1.0d0;RWtmp(2)=1
00765 endif
00766
00767 if(ktmp(3)>=1.50d0+dlt_BZ)then
00768 ktmp(3)=ktmp(3)-2.0d0;RWtmp(3)=-2
00769 endif
00770 if(ktmp(3)>=0.50d0+dlt_BZ)then
00771 ktmp(3)=ktmp(3)-1.0d0;RWtmp(3)=-1
00772 endif
00773 if(ktmp(3)<-1.50d0+dlt_BZ)then
00774 ktmp(3)=ktmp(3)+2.0d0;RWtmp(3)=2
00775 endif
00776 if(ktmp(3)<-0.50d0+dlt_BZ)then
00777 ktmp(3)=ktmp(3)+1.0d0;RWtmp(3)=1
00778 endif
00779
00780
00781
00782 return
00783 end
00784
00785 subroutine make_KG0(NTG,b1,b2,b3,Gcut,q1,q2,q3,KG0,NG)
00786 implicit none
00787 integer,intent(in)::NTG
00788 real(8),intent(in)::b1(3),b2(3),b3(3)
00789 real(8),intent(in)::q1,q2,q3,Gcut
00790 integer::igL,igL1,igL2,igL3
00791 real(8)::qgL(3),qgL2
00792 integer,intent(out)::KG0(3,NTG)
00793 integer,intent(out)::NG
00794 integer,parameter::NGL1=150
00795 integer,parameter::NGL2=150
00796 integer,parameter::NGL3=150
00797 igL=0
00798 do igL1=-NGL1,NGL1
00799 do igL2=-NGL2,NGL2
00800 do igL3=-NGL3,NGL3
00801 qgL(:)=(q1+dble(igL1))*b1(:)
00802 + +(q2+dble(igL2))*b2(:)
00803 + +(q3+dble(igL3))*b3(:)
00804 qgL2=qgL(1)**2+qgL(2)**2+qgL(3)**2
00805 if(qgL2<=Gcut)then
00806 igL=igL+1
00807 KG0(1,igL)=igL1
00808 KG0(2,igL)=igL2
00809 KG0(3,igL)=igL3
00810 endif
00811 enddo
00812 enddo
00813 enddo
00814 NG=igL
00815
00816
00817
00818
00819
00820
00821
00822
00823 RETURN
00824 END
00825
00826 SUBROUTINE OUTER_PRODUCT(vec_x,vec_y,vec_z)
00827 implicit none
00828 real(8)::vec_x(3),vec_y(3),vec_z(3)
00829 vec_z(1)=vec_x(2)*vec_y(3)-vec_x(3)*vec_y(2)
00830 vec_z(2)=vec_x(3)*vec_y(1)-vec_x(1)*vec_y(3)
00831 vec_z(3)=vec_x(1)*vec_y(2)-vec_x(2)*vec_y(1)
00832 RETURN
00833 END