2
c Coulomb attenuated PBE exchange functional
5
c [a] J.P. Perdew, K. Burke, and M. Ernzerhof, PRL 77, 3865 (1996).
6
c [b] J.P. Perdew and Y. Wang, Phys. Rev. B 33, 8800 (1986).;
8
c Hammer, Hansen and Norskov, PRB 59, 7413 (1999) [RPBE]
9
c Zhang and Yang, PRL 80, 890 (1998) [RevPBE]
12
Subroutine xc_camxpbe96(whichf,
13
W tol_rho, fac, lfac, nlfac, rho, delrho,
14
& Amat, Cmat, nq, ipol, Ex, qwght,ldew,func)
16
Subroutine xc_camxpbe96_d2(whichf,
17
W tol_rho, fac, lfac, nlfac, rho, delrho,
18
& Amat, Amat2, Cmat, Cmat2, nq, ipol, Ex,
22
c$Id: xc_camxpbe96.F,v 1.3 2008/12/09 01:42:28 niri Exp $
29
double precision fac, Ex
31
logical lfac, nlfac,ldew
32
double precision func(*) ! value of the functional [output]
34
c Charge Density & Its Cube Root
36
double precision rho(nq,ipol*(ipol+1)/2)
38
c Charge Density Gradient
40
double precision delrho(nq,3,ipol)
44
double precision qwght(nq)
46
c Sampling Matrices for the XC Potential & Energy
48
double precision Amat(nq,ipol), Cmat(nq,*)
49
double precision Atmp, Ctmp, Etmp
52
double precision Amat2(nq,NCOL_AMAT2), Cmat2(nq,NCOL_CMAT2)
53
double precision A2tmp, C2tmp, C3tmp
56
double precision tol_rho, pi, um, uk, umk,ukrev,umkrev
57
double precision C, Cs
58
double precision F43, F13
62
parameter(um=0.2195149727645171d0, uk=0.8040d0, umk=um/uk)
63
parameter(ukrev=1.245d0, umkrev=um/ukrev)
64
parameter (F43=4.d0/3.d0, F13=1.d0/3.d0)
66
parameter (F73=7.d0/3.d0)
70
double precision rrho, rho43, rho13, gamma, gam12, s, d1s(2),
73
double precision rhom23, d2s(3), gpp, d2g(3)
75
double precision gpbe0,gpbe1,gpbe2
76
double precision grpbe0,grpbe1,grpbe2
77
double precision grevpbe0,grevpbe1,grevpbe2
78
gpbe0(s)= uk*(1d0 - 1d0/(1d0+umk*s*s))
79
gpbe1(s)= 2d0*um*s/(1d0+umk*s*s)**2
80
gpbe2(s)= 2d0*um*(1d0-4d0*umk*s*s/(1d0+umk*s*s))/(1d0+umk*s*s)**2
81
grevpbe0(s)= ukrev*(1d0 - 1d0/(1d0+umkrev*s*s))
82
grevpbe1(s)= 2d0*um*s/(1d0+umkrev*s*s)**2
83
grevpbe2(s)= 2d0*um*(1d0-4d0*umkrev*s*s/(1d0+umkrev*s*s))/
85
grpbe0(s)= uk*(1d0 - exp(-umk*s*s))
86
grpbe1(s)= 2d0*um*s*exp(-umk*s*s)
87
grpbe2(s)= 2d0*um*exp(-umk*s*s)*(1d0-2d0*umk*s*s)
90
C = -3d0/(4d0*pi)*(3d0*pi*pi)**F13
91
Cs = 0.5d0/(3d0*pi*pi)**F13
92
Cs = Cs * C ! account for including C in rho43
96
c ======> SPIN-RESTRICTED <======
102
if (rho(n,1).lt.tol_rho) goto 10
103
rho43 = C*rho(n,1)**F43
105
rho13 = F43*rho43*rrho
107
rhom23 = F13*rho13*rrho
116
A2tmp = 2d0*rhom23*fac
120
gamma = delrho(n,1,1)*delrho(n,1,1) +
121
& delrho(n,2,1)*delrho(n,2,1) +
122
& delrho(n,3,1)*delrho(n,3,1)
124
if (.not.(nlfac.and.gam12.gt.tol_rho**2)) goto 10
128
d1s(2) = 0.5d0*s/gamma
130
c Evaluate the GC part of F(s), i.e. g(s) = F(s) - 1
132
if(whichf.eq.'revp') then
135
elseif(whichf.eq.'rpbe') then
145
Etmp = Etmp + rho43*g*fac
146
Atmp = Atmp + (rho13*g+rho43*d1g(1))*fac
147
Ctmp = 2d0*rho43*d1g(2)*fac
149
d2s(1) = -F73*d1s(1)*rrho
150
d2s(2) = -F43*d1s(2)*rrho
151
d2s(3) = -0.5d0*d1s(2)/gamma
152
if(whichf.eq.'revp') then
154
elseif(whichf.eq.'rpbe') then
159
d2g(1) = gp*d2s(1) + gpp*d1s(1)*d1s(1)
160
d2g(2) = gp*d2s(2) + gpp*d1s(1)*d1s(2)
161
d2g(3) = gp*d2s(3) + gpp*d1s(2)*d1s(2)
163
& +(rhom23*g + 2.d0*rho13*d1g(1) + rho43*d2g(1))*fac*2d0
164
C2tmp = (rho13*d1g(2) + rho43*d2g(2))*fac*4d0
165
C3tmp = rho43*d2g(3)*fac*8d0
167
call xc_att_xc_d2(rho(n,1),ipol,Etmp,Atmp,Ctmp,A2tmp,
169
Amat2(n,D2_RA_RA) = Amat2(n,D2_RA_RA) + A2tmp
170
Cmat2(n,D2_RA_GAA) = Cmat2(n,D2_RA_GAA) + C2tmp
171
Cmat2(n,D2_GAA_GAA) = Cmat2(n,D2_GAA_GAA) + C3tmp
173
call xc_att_xc(rho(n,1),ipol,Etmp,Atmp,Ctmp)
175
Ex = Ex + qwght(n)*Etmp
176
if (ldew) func(n) = func(n) + Etmp
177
Amat(n,1) = Amat(n,1) + Atmp
178
Cmat(n,D1_GAA) = Cmat(n,D1_GAA) + Ctmp
183
c ======> SPIN-UNRESTRICTED <======
189
if (rho(n,1).lt.tol_rho) goto 20
193
if (rho(n,2).lt.tol_rho) goto 25
194
rho43 = C*(2d0*rho(n,2))**F43
195
rrho = 0.5d0/rho(n,2)
196
rho13 = F43*rho43*rrho
198
rhom23 = F13*rho13*rrho
204
Etmp = rho43*fac*0.5d0
207
A2tmp = 2d0*rhom23*fac
211
gamma = delrho(n,1,1)*delrho(n,1,1) +
212
& delrho(n,2,1)*delrho(n,2,1) +
213
& delrho(n,3,1)*delrho(n,3,1)
214
gam12 = 2d0*dsqrt(gamma)
215
if (.not.(nlfac.and.gam12.gt.tol_rho**2)) goto 25
219
d1s(2) = 0.5d0*s/gamma
221
c Evaluate the GC part of F(s), i.e. g(s) = F(s) - 1
223
if(whichf.eq.'revp') then
226
elseif(whichf.eq.'rpbe') then
236
Etmp = Etmp + rho43*g*fac*0.5d0
237
Atmp = Atmp + (rho13*g+rho43*d1g(1))*fac
238
Ctmp = 0.5d0*rho43*d1g(2)*fac
240
d2s(1) = -F73*d1s(1)*rrho
241
d2s(2) = -F43*d1s(2)*rrho
242
d2s(3) = -0.5d0*d1s(2)/gamma
243
if(whichf.eq.'revp') then
245
elseif(whichf.eq.'rpbe') then
250
d2g(1) = gp*d2s(1) + gpp*d1s(1)*d1s(1)
251
d2g(2) = gp*d2s(2) + gpp*d1s(1)*d1s(2)
252
d2g(3) = gp*d2s(3) + gpp*d1s(2)*d1s(2)
253
A2tmp = A2tmp + (rhom23*g + 2.d0*rho13*d1g(1)
254
& + rho43*d2g(1))*fac*2d0
255
C2tmp = (rho13*d1g(2) + rho43*d2g(2))*fac
256
C3tmp = rho43*d2g(3)*fac*0.5d0
258
call xc_att_xc_d2(rho(n,2),ipol,Etmp,Atmp,Ctmp,A2tmp,
260
Amat2(n,D2_RA_RA) = Amat2(n,D2_RA_RA) + A2tmp
261
Cmat2(n,D2_RA_GAA) = Cmat2(n,D2_RA_GAA) + C2tmp
262
Cmat2(n,D2_GAA_GAA) = Cmat2(n,D2_GAA_GAA) + C3tmp
264
call xc_att_xc(rho(n,2),ipol,Etmp,Atmp,Ctmp)
266
Ex = Ex + qwght(n)*Etmp
267
if (ldew) func(n) = func(n) + Etmp
268
Amat(n,1) = Amat(n,1) + Atmp
269
Cmat(n,D1_GAA) = Cmat(n,D1_GAA) + Ctmp
274
if (rho(n,3).lt.tol_rho) goto 20
275
rho43 = C*(2d0*rho(n,3))**F43
276
rrho = 0.5d0/rho(n,3)
277
rho13 = F43*rho43*rrho
279
rhom23 = F13*rho13*rrho
285
Etmp = rho43*fac*0.5d0
288
A2tmp= 2.d0*rhom23*fac
292
gamma = delrho(n,1,2)*delrho(n,1,2) +
293
& delrho(n,2,2)*delrho(n,2,2) +
294
& delrho(n,3,2)*delrho(n,3,2)
295
gam12 = 2d0*dsqrt(gamma)
296
if (.not.(nlfac.and.gam12.gt.tol_rho**2)) goto 20
300
d1s(2) = 0.5d0*s/gamma
302
c Evaluate the GC part of F(s), i.e. g(s) = F(s) - 1
304
if(whichf.eq.'revp') then
307
elseif(whichf.eq.'rpbe') then
317
Etmp = Etmp + rho43*g*fac*0.5d0
318
Atmp = Atmp + (rho13*g+rho43*d1g(1))*fac
319
Ctmp = 0.5d0*rho43*d1g(2)*fac
321
d2s(1) = -F73*d1s(1)*rrho
322
d2s(2) = -F43*d1s(2)*rrho
323
d2s(3) = -0.5d0*d1s(2)/gamma
324
if(whichf.eq.'revp') then
326
elseif(whichf.eq.'rpbe') then
331
d2g(1) = gp*d2s(1) + gpp*d1s(1)*d1s(1)
332
d2g(2) = gp*d2s(2) + gpp*d1s(1)*d1s(2)
333
d2g(3) = gp*d2s(3) + gpp*d1s(2)*d1s(2)
335
A2tmp = A2tmp + (rhom23*g + 2.d0*rho13*d1g(1)
336
& + rho43*d2g(1))*fac*2d0
337
C2tmp = (rho13*d1g(2) + rho43*d2g(2))*fac
338
C3tmp = rho43*d2g(3)*fac*0.5d0
340
call xc_att_xc_d2(rho(n,3),ipol,Etmp,Atmp,Ctmp,A2tmp,
342
Amat2(n,D2_RB_RB) = Amat2(n,D2_RB_RB) + A2tmp
343
Cmat2(n,D2_RB_GBB) = Cmat2(n,D2_RB_GBB) + C2tmp
344
Cmat2(n,D2_GBB_GBB) = Cmat2(n,D2_GBB_GBB) + C3tmp
346
call xc_att_xc(rho(n,3),ipol,Etmp,Atmp,Ctmp)
348
Ex = Ex + qwght(n)*Etmp
349
if (ldew) func(n) = func(n) + Etmp
350
Amat(n,2) = Amat(n,2) + Atmp
351
Cmat(n,D1_GBB) = Cmat(n,D1_GBB) + Ctmp
361
c Compile source again for the 2nd derivative case
363
#include "xc_camxpbe96.F"
2
c Coulomb attenuated PBE exchange functional
5
c [a] J.P. Perdew, K. Burke, and M. Ernzerhof, PRL 77, 3865 (1996).
6
c [b] J.P. Perdew and Y. Wang, Phys. Rev. B 33, 8800 (1986).;
8
c Hammer, Hansen and Norskov, PRB 59, 7413 (1999) [RPBE]
9
c Zhang and Yang, PRL 80, 890 (1998) [RevPBE]
12
Subroutine xc_camxpbe96(whichf,
13
W tol_rho, fac, lfac, nlfac, rho, delrho,
14
& Amat, Cmat, nq, ipol, Ex, qwght,ldew,func)
16
Subroutine xc_camxpbe96_d2(whichf,
17
W tol_rho, fac, lfac, nlfac, rho, delrho,
18
& Amat, Amat2, Cmat, Cmat2, nq, ipol, Ex,
22
c$Id: xc_camxpbe96.F 20247 2011-04-28 18:58:49Z d3y133 $
29
double precision fac, Ex
31
logical lfac, nlfac,ldew
32
double precision func(*) ! value of the functional [output]
34
c Charge Density & Its Cube Root
36
double precision rho(nq,ipol*(ipol+1)/2)
38
c Charge Density Gradient
40
double precision delrho(nq,3,ipol)
44
double precision qwght(nq)
46
c Sampling Matrices for the XC Potential & Energy
48
double precision Amat(nq,ipol), Cmat(nq,*)
49
double precision Atmp, Ctmp, Etmp
52
double precision Amat2(nq,NCOL_AMAT2), Cmat2(nq,NCOL_CMAT2)
53
double precision A2tmp, C2tmp, C3tmp
56
double precision tol_rho, pi, um, uk, umk,ukrev,umkrev
57
double precision C, Cs
58
double precision F43, F13
62
parameter(um=0.2195149727645171d0, uk=0.8040d0, umk=um/uk)
63
parameter(ukrev=1.245d0, umkrev=um/ukrev)
64
parameter (F43=4.d0/3.d0, F13=1.d0/3.d0)
66
parameter (F73=7.d0/3.d0)
70
double precision rrho, rho43, rho13, gamma, gam12, s, d1s(2),
73
double precision rhom23, d2s(3), gpp, d2g(3)
75
double precision gpbe0,gpbe1,gpbe2
76
double precision grpbe0,grpbe1,grpbe2
77
double precision grevpbe0,grevpbe1,grevpbe2
78
gpbe0(s)= uk*(1d0 - 1d0/(1d0+umk*s*s))
79
gpbe1(s)= 2d0*um*s/(1d0+umk*s*s)**2
80
gpbe2(s)= 2d0*um*(1d0-4d0*umk*s*s/(1d0+umk*s*s))/(1d0+umk*s*s)**2
81
grevpbe0(s)= ukrev*(1d0 - 1d0/(1d0+umkrev*s*s))
82
grevpbe1(s)= 2d0*um*s/(1d0+umkrev*s*s)**2
83
grevpbe2(s)= 2d0*um*(1d0-4d0*umkrev*s*s/(1d0+umkrev*s*s))/
85
grpbe0(s)= uk*(1d0 - exp(-umk*s*s))
86
grpbe1(s)= 2d0*um*s*exp(-umk*s*s)
87
grpbe2(s)= 2d0*um*exp(-umk*s*s)*(1d0-2d0*umk*s*s)
90
C = -3d0/(4d0*pi)*(3d0*pi*pi)**F13
91
Cs = 0.5d0/(3d0*pi*pi)**F13
92
Cs = Cs * C ! account for including C in rho43
96
c ======> SPIN-RESTRICTED <======
102
if (rho(n,1).lt.tol_rho) goto 10
103
rho43 = C*rho(n,1)**F43
105
rho13 = F43*rho43*rrho
107
rhom23 = F13*rho13*rrho
116
A2tmp = 2d0*rhom23*fac
120
gamma = delrho(n,1,1)*delrho(n,1,1) +
121
& delrho(n,2,1)*delrho(n,2,1) +
122
& delrho(n,3,1)*delrho(n,3,1)
124
if (.not.(nlfac.and.gam12.gt.tol_rho**2)) goto 10
128
d1s(2) = 0.5d0*s/gamma
130
c Evaluate the GC part of F(s), i.e. g(s) = F(s) - 1
132
if(whichf.eq.'revp') then
135
elseif(whichf.eq.'rpbe') then
145
Etmp = Etmp + rho43*g*fac
146
Atmp = Atmp + (rho13*g+rho43*d1g(1))*fac
147
Ctmp = 2d0*rho43*d1g(2)*fac
149
d2s(1) = -F73*d1s(1)*rrho
150
d2s(2) = -F43*d1s(2)*rrho
151
d2s(3) = -0.5d0*d1s(2)/gamma
152
if(whichf.eq.'revp') then
154
elseif(whichf.eq.'rpbe') then
159
d2g(1) = gp*d2s(1) + gpp*d1s(1)*d1s(1)
160
d2g(2) = gp*d2s(2) + gpp*d1s(1)*d1s(2)
161
d2g(3) = gp*d2s(3) + gpp*d1s(2)*d1s(2)
163
& +(rhom23*g + 2.d0*rho13*d1g(1) + rho43*d2g(1))*fac*2d0
164
C2tmp = (rho13*d1g(2) + rho43*d2g(2))*fac*4d0
165
C3tmp = rho43*d2g(3)*fac*8d0
167
call xc_att_xc_d2(rho(n,1),ipol,Etmp,Atmp,Ctmp,A2tmp,
169
Amat2(n,D2_RA_RA) = Amat2(n,D2_RA_RA) + A2tmp
170
Cmat2(n,D2_RA_GAA) = Cmat2(n,D2_RA_GAA) + C2tmp
171
Cmat2(n,D2_GAA_GAA) = Cmat2(n,D2_GAA_GAA) + C3tmp
173
call xc_att_xc(rho(n,1),ipol,Etmp,Atmp,Ctmp)
175
Ex = Ex + qwght(n)*Etmp
176
if (ldew) func(n) = func(n) + Etmp
177
Amat(n,1) = Amat(n,1) + Atmp
178
Cmat(n,D1_GAA) = Cmat(n,D1_GAA) + Ctmp
183
c ======> SPIN-UNRESTRICTED <======
189
if (rho(n,1).lt.tol_rho) goto 20
193
if (rho(n,2).lt.tol_rho) goto 25
194
rho43 = C*(2d0*rho(n,2))**F43
195
rrho = 0.5d0/rho(n,2)
196
rho13 = F43*rho43*rrho
198
rhom23 = F13*rho13*rrho
204
Etmp = rho43*fac*0.5d0
207
A2tmp = 2d0*rhom23*fac
211
gamma = delrho(n,1,1)*delrho(n,1,1) +
212
& delrho(n,2,1)*delrho(n,2,1) +
213
& delrho(n,3,1)*delrho(n,3,1)
214
gam12 = 2d0*dsqrt(gamma)
215
if (.not.(nlfac.and.gam12.gt.tol_rho**2)) goto 25
219
d1s(2) = 0.5d0*s/gamma
221
c Evaluate the GC part of F(s), i.e. g(s) = F(s) - 1
223
if(whichf.eq.'revp') then
226
elseif(whichf.eq.'rpbe') then
236
Etmp = Etmp + rho43*g*fac*0.5d0
237
Atmp = Atmp + (rho13*g+rho43*d1g(1))*fac
238
Ctmp = 0.5d0*rho43*d1g(2)*fac
240
d2s(1) = -F73*d1s(1)*rrho
241
d2s(2) = -F43*d1s(2)*rrho
242
d2s(3) = -0.5d0*d1s(2)/gamma
243
if(whichf.eq.'revp') then
245
elseif(whichf.eq.'rpbe') then
250
d2g(1) = gp*d2s(1) + gpp*d1s(1)*d1s(1)
251
d2g(2) = gp*d2s(2) + gpp*d1s(1)*d1s(2)
252
d2g(3) = gp*d2s(3) + gpp*d1s(2)*d1s(2)
253
A2tmp = A2tmp + (rhom23*g + 2.d0*rho13*d1g(1)
254
& + rho43*d2g(1))*fac*2d0
255
C2tmp = (rho13*d1g(2) + rho43*d2g(2))*fac
256
C3tmp = rho43*d2g(3)*fac*0.5d0
258
call xc_att_xc_d2(rho(n,2),ipol,Etmp,Atmp,Ctmp,A2tmp,
260
Amat2(n,D2_RA_RA) = Amat2(n,D2_RA_RA) + A2tmp
261
Cmat2(n,D2_RA_GAA) = Cmat2(n,D2_RA_GAA) + C2tmp
262
Cmat2(n,D2_GAA_GAA) = Cmat2(n,D2_GAA_GAA) + C3tmp
264
call xc_att_xc(rho(n,2),ipol,Etmp,Atmp,Ctmp)
266
Ex = Ex + qwght(n)*Etmp
267
if (ldew) func(n) = func(n) + Etmp
268
Amat(n,1) = Amat(n,1) + Atmp
269
Cmat(n,D1_GAA) = Cmat(n,D1_GAA) + Ctmp
274
if (rho(n,3).lt.tol_rho) goto 20
275
rho43 = C*(2d0*rho(n,3))**F43
276
rrho = 0.5d0/rho(n,3)
277
rho13 = F43*rho43*rrho
279
rhom23 = F13*rho13*rrho
285
Etmp = rho43*fac*0.5d0
288
A2tmp= 2.d0*rhom23*fac
292
gamma = delrho(n,1,2)*delrho(n,1,2) +
293
& delrho(n,2,2)*delrho(n,2,2) +
294
& delrho(n,3,2)*delrho(n,3,2)
295
gam12 = 2d0*dsqrt(gamma)
296
if (.not.(nlfac.and.gam12.gt.tol_rho**2)) goto 20
300
d1s(2) = 0.5d0*s/gamma
302
c Evaluate the GC part of F(s), i.e. g(s) = F(s) - 1
304
if(whichf.eq.'revp') then
307
elseif(whichf.eq.'rpbe') then
317
Etmp = Etmp + rho43*g*fac*0.5d0
318
Atmp = Atmp + (rho13*g+rho43*d1g(1))*fac
319
Ctmp = 0.5d0*rho43*d1g(2)*fac
321
d2s(1) = -F73*d1s(1)*rrho
322
d2s(2) = -F43*d1s(2)*rrho
323
d2s(3) = -0.5d0*d1s(2)/gamma
324
if(whichf.eq.'revp') then
326
elseif(whichf.eq.'rpbe') then
331
d2g(1) = gp*d2s(1) + gpp*d1s(1)*d1s(1)
332
d2g(2) = gp*d2s(2) + gpp*d1s(1)*d1s(2)
333
d2g(3) = gp*d2s(3) + gpp*d1s(2)*d1s(2)
335
A2tmp = A2tmp + (rhom23*g + 2.d0*rho13*d1g(1)
336
& + rho43*d2g(1))*fac*2d0
337
C2tmp = (rho13*d1g(2) + rho43*d2g(2))*fac
338
C3tmp = rho43*d2g(3)*fac*0.5d0
340
call xc_att_xc_d2(rho(n,3),ipol,Etmp,Atmp,Ctmp,A2tmp,
342
Amat2(n,D2_RB_RB) = Amat2(n,D2_RB_RB) + A2tmp
343
Cmat2(n,D2_RB_GBB) = Cmat2(n,D2_RB_GBB) + C2tmp
344
Cmat2(n,D2_GBB_GBB) = Cmat2(n,D2_GBB_GBB) + C3tmp
346
call xc_att_xc(rho(n,3),ipol,Etmp,Atmp,Ctmp)
348
Ex = Ex + qwght(n)*Etmp
349
if (ldew) func(n) = func(n) + Etmp
350
Amat(n,2) = Amat(n,2) + Atmp
351
Cmat(n,D1_GBB) = Cmat(n,D1_GBB) + Ctmp
361
c Compile source again for the 2nd derivative case
363
#include "xc_camxpbe96.F"