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
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
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
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
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
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
00202
00203
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(:)
00214 complex(8),allocatable::u_3D(:,:,:,:)
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
00233
00234
00235 wfunc(ind+Nl123)=imag(C0_K(ig,iw))
00236
00237 enddo
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
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
00249 enddo
00250 enddo
00251 enddo
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
00261 enddo
00262 enddo
00263 MAT_VHXC(iw,jw)=SUM_CMPX/dble(nrx2)/dble(nry2)/dble(nrz2)
00264 enddo
00265 enddo
00266
00267
00268
00269
00270
00271
00272
00273
00274 deallocate(u_1D,u_3D)
00275 RETURN
00276 END
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
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
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398