1
#if defined(FUJITSU_VPP)
5
Subroutine xc_camb88(tol_rho, fac, lfac, nlfac, rho, delrho,
6
& Amat, Cmat, nq, ipol, Ex, qwght,ldew,func)
8
Subroutine xc_camb88_d2(tol_rho, fac, lfac, nlfac, rho, delrho,
9
& Amat, Amat2, Cmat, Cmat2, nq, ipol, Ex,
13
C$Id: xc_camb88.F,v 1.4 2008/12/06 23:08:58 niri Exp $
15
c Coulomb attenuated Becke88 functional
21
double precision tol_rho, fac, Ex
23
logical lfac, nlfac,ldew
24
double precision func(*) ! value of the functional [output]
28
double precision rho(nq,ipol*(ipol+1)/2)
30
c Charge Density Gradient
32
double precision delrho(nq,3,ipol)
36
double precision qwght(nq)
38
c Sampling Matrices for the XC Potential
40
double precision Amat(nq,ipol), Cmat(nq,*)
44
c Second Derivatives of the Exchange Energy Functional
46
double precision Amat2(nq,NCOL_AMAT2), Cmat2(nq,NCOL_CMAT2)
47
double precision A2tmp, C2tmp, C3tmp
51
Parameter (BETA = 0.0042D0)
55
c Becke, Phys. Rev. A 38, 3098 (1988)
56
c Johnson, Gill & Pople, J. Chem. Phys. 98, 5612 (1993)
58
c***************************************************************************
61
double precision arcsinh, darcsinh
62
double precision C, rho13, rho43, gamma, x, g, gdenom, dg,
63
& dgdenom, t, Etmp, Atmp, Ctmp
65
double precision rhom23, d2g, d2gdenom
68
arcsinh(x)=log(x+dsqrt(1d0+x*x))
69
darcsinh(x)=1d0/dsqrt(1d0+x*x)
71
c Uniform electron gas constant
73
C = -(1.5d0)*(0.75d0/acos(-1d0))**(1d0/3d0)
77
c ======> SPIN-RESTRICTED <======
80
if (rho(n,1).lt.tol_rho) goto 10
84
rho13 = (0.5d0*rho(n,1))**(1.d0/3.d0)
86
gamma = delrho(n,1,1)*delrho(n,1,1) +
87
& delrho(n,2,1)*delrho(n,2,1) +
88
& delrho(n,3,1)*delrho(n,3,1)
89
if (dsqrt(gamma).gt.tol_rho)then
90
gamma = 0.25d0 * gamma
91
x = sqrt(gamma) / rho43
96
gdenom = 1d0 + 6d0*BETA*x*arcsinh(x)
97
g = -BETA*x*x / gdenom
98
dgdenom = 6d0*BETA*(arcsinh(x) + x*darcsinh(x))
99
dg = BETA*x*(x*dgdenom - 2d0*gdenom) / gdenom**2
105
Etmp = 2d0*rho43*C*fac
106
Atmp = (4d0/3d0)*rho13*C*fac
110
Etmp = Etmp + 2d0*rho43*g*fac
111
Atmp = Atmp + (4d0/3d0)*rho13*(g-x*dg)*fac
114
if (x.gt.tol_rho) then
115
Ctmp = 0.5d0 * dg / sqrt(gamma) * fac
122
if(lfac) g = g + C ! Add local contribution back to g
123
rhom23 = rho13 / (0.5d0*rho(n,1))
124
d2gdenom = 6d0*BETA*darcsinh(x)*(2d0 - x*x/(x*x+1d0))
125
d2g = -2d0*BETA/gdenom + 4d0*BETA*x*dgdenom/gdenom**2
126
& + BETA*x*x*d2gdenom/gdenom**2
127
& - 2d0*BETA*x*x*(dgdenom)**2/gdenom**3
129
A2tmp = (4d0/9d0)*rhom23*(g-x*dg+4d0*x*x*d2g)*fac
130
C2tmp = - (4d0/3d0)*(rhom23**2/rho(n,1))*d2g*fac
131
if (x.gt.tol_rho) then
132
C3tmp = - 0.25d0*gamma**(-1.5d0)*(dg-x*d2g)*fac
137
call xc_att_xc_d2(rho(n,1),ipol,Etmp,Atmp,Ctmp,A2tmp,
139
Amat2(n,D2_RA_RA) = Amat2(n,D2_RA_RA) + A2tmp
140
Cmat2(n,D2_RA_GAA) = Cmat2(n,D2_RA_GAA) + C2tmp
141
Cmat2(n,D2_GAA_GAA) = Cmat2(n,D2_GAA_GAA) + C3tmp
143
call xc_att_xc(rho(n,1),ipol,Etmp,Atmp,Ctmp)
145
Ex = Ex + qwght(n)*Etmp
146
if(ldew) func(n) = func(n) + Etmp
147
Amat(n,1) = Amat(n,1) + Atmp
148
Cmat(n,D1_GAA) = Cmat(n,D1_GAA) + Ctmp
153
c ======> SPIN-UNRESTRICTED <======
156
if (dabs(rho(n,1)).lt.tol_rho) goto 20
157
if (dabs(rho(n,2)).lt.tol_rho) goto 25
161
rho13 = abs(rho(n,2))**(1.d0/3.d0)*sign(1d0,rho(n,2))
163
gamma = delrho(n,1,1)*delrho(n,1,1) +
164
& delrho(n,2,1)*delrho(n,2,1) +
165
& delrho(n,3,1)*delrho(n,3,1)
166
if (dsqrt(gamma).gt.tol_rho)then
167
x = sqrt(gamma) / rho43
172
gdenom = 1d0 + 6d0*BETA*x*arcsinh(x)
173
g = -BETA*x*x / gdenom
174
dgdenom = 6d0*BETA*(arcsinh(x) + x*darcsinh(x))
175
dg = BETA*x*(x*dgdenom - 2d0*gdenom) / gdenom**2
182
Atmp = (4d0/3d0)*rho13*C*fac
186
Etmp = Etmp + rho43*g*fac
187
Atmp = Atmp + (4d0/3d0)*rho13*(g-x*dg)*fac
190
if (x.gt.tol_rho) then
191
Ctmp = 0.5d0*dg / sqrt(gamma) * fac
195
if (lfac) g = g + C ! Add local contribution back to g
196
rhom23 = rho13 / rho(n,2)
197
d2gdenom = 6d0*BETA*darcsinh(x)*(2d0 - x*x/(x*x+1d0))
198
d2g = -2d0*BETA/gdenom + 4d0*BETA*x*dgdenom/gdenom**2
199
& + BETA*x*x*d2gdenom/gdenom**2
200
& - 2d0*BETA*x*x*(dgdenom)**2/gdenom**3
202
A2tmp = (4d0/9d0)*rhom23*(g-x*dg+4d0*x*x*d2g)*fac
203
C2tmp = (2d0/3d0)*(rhom23**2/rho(n,2))*d2g*fac
204
if (x.gt.tol_rho) then
205
C3tmp = -0.25d0*gamma**(-1.5d0)*(dg-x*d2g)*fac
209
call xc_att_xc_d2(rho(n,2),ipol,Etmp,Atmp,Ctmp,A2tmp,C2tmp,
211
Amat2(n,D2_RA_RA) = Amat2(n,D2_RA_RA) + A2tmp
212
Cmat2(n,D2_RA_GAA) = Cmat2(n,D2_RA_GAA) + C2tmp
213
Cmat2(n,D2_GAA_GAA) = Cmat2(n,D2_GAA_GAA) + C3tmp
215
call xc_att_xc(rho(n,2),ipol,Etmp,Atmp,Ctmp)
217
Ex = Ex + qwght(n)*Etmp
218
if(ldew) func(n) = func(n) + Etmp
219
Amat(n,1) = Amat(n,1) + Atmp
220
Cmat(n,D1_GAA) = Cmat(n,D1_GAA) + Ctmp
226
if (dabs(rho(n,3)).lt.tol_rho) goto 20
228
rho13 = abs(rho(n,3))**(1.d0/3.d0)*sign(1d0,rho(n,3))
230
gamma = delrho(n,1,2)*delrho(n,1,2) +
231
& delrho(n,2,2)*delrho(n,2,2) +
232
& delrho(n,3,2)*delrho(n,3,2)
233
if (dsqrt(gamma).gt.tol_rho)then
234
x = sqrt(gamma) / rho43
239
gdenom = 1d0 + 6d0*BETA*x*arcsinh(x)
240
g = -BETA*x*x / gdenom
241
dgdenom = 6d0*BETA*(arcsinh(x) + x*darcsinh(x))
242
dg = BETA*x*(x*dgdenom - 2d0*gdenom) / gdenom**2
249
Atmp = (4d0/3d0)*rho13*C*fac
253
Etmp = Etmp + rho43*g*fac
254
Atmp = Atmp + (4d0/3d0)*rho13*(g-x*dg)*fac
257
if (x.gt.tol_rho) then
258
Ctmp = 0.5d0*dg / sqrt(gamma) * fac
265
if(lfac) g = g + C ! Add local contribution back to g
266
rhom23 = rho13 / rho(n,3)
267
d2gdenom = 6d0*BETA*darcsinh(x)*(2d0 - x*x/(x*x+1d0))
268
d2g = -2d0*BETA/gdenom + 4d0*BETA*x*dgdenom/gdenom**2
269
& + BETA*x*x*d2gdenom/gdenom**2
270
& - 2d0*BETA*x*x*(dgdenom)**2/gdenom**3
272
A2tmp = (4d0/9d0)*rhom23*(g-x*dg+4d0*x*x*d2g)*fac
273
C2tmp = -(2d0/3d0)*(rhom23**2/rho(n,3))*d2g*fac
274
if (x.gt.tol_rho) then
275
C3tmp = - 0.25d0*gamma**(-1.5d0)*(dg-x*d2g)*fac
280
call xc_att_xc_d2(rho(n,3),ipol,Etmp,Atmp,Ctmp,A2tmp,C2tmp,
282
Amat2(n,D2_RB_RB) = Amat2(n,D2_RB_RB) + A2tmp
283
Cmat2(n,D2_RB_GBB) = Cmat2(n,D2_RB_GBB) + C2tmp
284
Cmat2(n,D2_GBB_GBB) = Cmat2(n,D2_GBB_GBB) + C3tmp
286
call xc_att_xc(rho(n,3),ipol,Etmp,Atmp,Ctmp)
288
Ex = Ex + qwght(n)*Etmp
289
if(ldew) func(n) = func(n) + Etmp
290
Amat(n,2) = Amat(n,2) + Atmp
291
Cmat(n,D1_GBB) = Cmat(n,D1_GBB) + Ctmp
301
c Compile source again for the 2nd derivative case
303
#include "xc_camb88.F"
1
#if defined(FUJITSU_VPP)
5
Subroutine xc_camb88(tol_rho, fac, lfac, nlfac, rho, delrho,
6
& Amat, Cmat, nq, ipol, Ex, qwght,ldew,func)
8
Subroutine xc_camb88_d2(tol_rho, fac, lfac, nlfac, rho, delrho,
9
& Amat, Amat2, Cmat, Cmat2, nq, ipol, Ex,
13
C$Id: xc_camb88.F 20247 2011-04-28 18:58:49Z d3y133 $
15
c Coulomb attenuated Becke88 functional
21
double precision tol_rho, fac, Ex
23
logical lfac, nlfac,ldew
24
double precision func(*) ! value of the functional [output]
28
double precision rho(nq,ipol*(ipol+1)/2)
30
c Charge Density Gradient
32
double precision delrho(nq,3,ipol)
36
double precision qwght(nq)
38
c Sampling Matrices for the XC Potential
40
double precision Amat(nq,ipol), Cmat(nq,*)
44
c Second Derivatives of the Exchange Energy Functional
46
double precision Amat2(nq,NCOL_AMAT2), Cmat2(nq,NCOL_CMAT2)
47
double precision A2tmp, C2tmp, C3tmp
51
Parameter (BETA = 0.0042D0)
55
c Becke, Phys. Rev. A 38, 3098 (1988)
56
c Johnson, Gill & Pople, J. Chem. Phys. 98, 5612 (1993)
58
c***************************************************************************
61
double precision arcsinh, darcsinh
62
double precision C, rho13, rho43, gamma, x, g, gdenom, dg,
63
& dgdenom, t, Etmp, Atmp, Ctmp
65
double precision rhom23, d2g, d2gdenom
68
arcsinh(x)=log(x+dsqrt(1d0+x*x))
69
darcsinh(x)=1d0/dsqrt(1d0+x*x)
71
c Uniform electron gas constant
73
C = -(1.5d0)*(0.75d0/acos(-1d0))**(1d0/3d0)
77
c ======> SPIN-RESTRICTED <======
80
if (rho(n,1).lt.tol_rho) goto 10
84
rho13 = (0.5d0*rho(n,1))**(1.d0/3.d0)
86
gamma = delrho(n,1,1)*delrho(n,1,1) +
87
& delrho(n,2,1)*delrho(n,2,1) +
88
& delrho(n,3,1)*delrho(n,3,1)
89
if (dsqrt(gamma).gt.tol_rho)then
90
gamma = 0.25d0 * gamma
91
x = dsqrt(gamma) / rho43
96
gdenom = 1d0 + 6d0*BETA*x*arcsinh(x)
97
g = -BETA*x*x / gdenom
98
dgdenom = 6d0*BETA*(arcsinh(x) + x*darcsinh(x))
99
dg = BETA*x*(x*dgdenom - 2d0*gdenom) / gdenom**2
105
Etmp = 2d0*rho43*C*fac
106
Atmp = (4d0/3d0)*rho13*C*fac
110
Etmp = Etmp + 2d0*rho43*g*fac
111
Atmp = Atmp + (4d0/3d0)*rho13*(g-x*dg)*fac
114
if (x.gt.tol_rho) then
115
Ctmp = 0.5d0 * dg / sqrt(gamma) * fac
122
if(lfac) g = g + C ! Add local contribution back to g
123
rhom23 = rho13 / (0.5d0*rho(n,1))
124
d2gdenom = 6d0*BETA*darcsinh(x)*(2d0 - x*x/(x*x+1d0))
125
d2g = -2d0*BETA/gdenom + 4d0*BETA*x*dgdenom/gdenom**2
126
& + BETA*x*x*d2gdenom/gdenom**2
127
& - 2d0*BETA*x*x*(dgdenom)**2/gdenom**3
129
A2tmp = (4d0/9d0)*rhom23*(g-x*dg+4d0*x*x*d2g)*fac
130
C2tmp = - (4d0/3d0)*(rhom23**2/rho(n,1))*d2g*fac
131
if (x.gt.tol_rho) then
132
C3tmp = - 0.25d0*gamma**(-1.5d0)*(dg-x*d2g)*fac
137
call xc_att_xc_d2(rho(n,1),ipol,Etmp,Atmp,Ctmp,A2tmp,
139
Amat2(n,D2_RA_RA) = Amat2(n,D2_RA_RA) + A2tmp
140
Cmat2(n,D2_RA_GAA) = Cmat2(n,D2_RA_GAA) + C2tmp
141
Cmat2(n,D2_GAA_GAA) = Cmat2(n,D2_GAA_GAA) + C3tmp
143
call xc_att_xc(rho(n,1),ipol,Etmp,Atmp,Ctmp)
145
Ex = Ex + qwght(n)*Etmp
146
if(ldew) func(n) = func(n) + Etmp
147
Amat(n,1) = Amat(n,1) + Atmp
148
Cmat(n,D1_GAA) = Cmat(n,D1_GAA) + Ctmp
153
c ======> SPIN-UNRESTRICTED <======
156
if (rho(n,1).lt.tol_rho) goto 20
157
if (rho(n,2).lt.tol_rho) goto 25
161
rho13 = rho(n,2)**(1.d0/3.d0)
162
rho43 = rho13*rho(n,2)
163
gamma = delrho(n,1,1)*delrho(n,1,1) +
164
& delrho(n,2,1)*delrho(n,2,1) +
165
& delrho(n,3,1)*delrho(n,3,1)
166
if (dsqrt(gamma).gt.tol_rho)then
167
x = dsqrt(gamma) / rho43
172
gdenom = 1d0 + 6d0*BETA*x*arcsinh(x)
173
g = -BETA*x*x / gdenom
174
dgdenom = 6d0*BETA*(arcsinh(x) + x*darcsinh(x))
175
dg = BETA*x*(x*dgdenom - 2d0*gdenom) / gdenom**2
182
Atmp = (4d0/3d0)*rho13*C*fac
186
Etmp = Etmp + rho43*g*fac
187
Atmp = Atmp + (4d0/3d0)*rho13*(g-x*dg)*fac
190
if (x.gt.tol_rho) then
191
Ctmp = 0.5d0*dg / sqrt(gamma) * fac
195
if (lfac) g = g + C ! Add local contribution back to g
196
rhom23 = rho13 / rho(n,2)
197
d2gdenom = 6d0*BETA*darcsinh(x)*(2d0 - x*x/(x*x+1d0))
198
d2g = -2d0*BETA/gdenom + 4d0*BETA*x*dgdenom/gdenom**2
199
& + BETA*x*x*d2gdenom/gdenom**2
200
& - 2d0*BETA*x*x*(dgdenom)**2/gdenom**3
202
A2tmp = (4d0/9d0)*rhom23*(g-x*dg+4d0*x*x*d2g)*fac
203
C2tmp = (2d0/3d0)*(rhom23**2/rho(n,2))*d2g*fac
204
if (x.gt.tol_rho) then
205
C3tmp = -0.25d0*gamma**(-1.5d0)*(dg-x*d2g)*fac
209
call xc_att_xc_d2(rho(n,2),ipol,Etmp,Atmp,Ctmp,A2tmp,C2tmp,
211
Amat2(n,D2_RA_RA) = Amat2(n,D2_RA_RA) + A2tmp
212
Cmat2(n,D2_RA_GAA) = Cmat2(n,D2_RA_GAA) + C2tmp
213
Cmat2(n,D2_GAA_GAA) = Cmat2(n,D2_GAA_GAA) + C3tmp
215
call xc_att_xc(rho(n,2),ipol,Etmp,Atmp,Ctmp)
217
Ex = Ex + qwght(n)*Etmp
218
if(ldew) func(n) = func(n) + Etmp
219
Amat(n,1) = Amat(n,1) + Atmp
220
Cmat(n,D1_GAA) = Cmat(n,D1_GAA) + Ctmp
226
if (rho(n,3).lt.tol_rho) goto 20
228
rho13 = rho(n,3)**(1.d0/3.d0)
229
rho43 = rho13*rho(n,3)
230
gamma = delrho(n,1,2)*delrho(n,1,2) +
231
& delrho(n,2,2)*delrho(n,2,2) +
232
& delrho(n,3,2)*delrho(n,3,2)
233
if (dsqrt(gamma).gt.tol_rho)then
234
x = dsqrt(gamma) / rho43
239
gdenom = 1d0 + 6d0*BETA*x*arcsinh(x)
240
g = -BETA*x*x / gdenom
241
dgdenom = 6d0*BETA*(arcsinh(x) + x*darcsinh(x))
242
dg = BETA*x*(x*dgdenom - 2d0*gdenom) / gdenom**2
249
Atmp = (4d0/3d0)*rho13*C*fac
253
Etmp = Etmp + rho43*g*fac
254
Atmp = Atmp + (4d0/3d0)*rho13*(g-x*dg)*fac
257
if (x.gt.tol_rho) then
258
Ctmp = 0.5d0*dg / sqrt(gamma) * fac
265
if(lfac) g = g + C ! Add local contribution back to g
266
rhom23 = rho13 / rho(n,3)
267
d2gdenom = 6d0*BETA*darcsinh(x)*(2d0 - x*x/(x*x+1d0))
268
d2g = -2d0*BETA/gdenom + 4d0*BETA*x*dgdenom/gdenom**2
269
& + BETA*x*x*d2gdenom/gdenom**2
270
& - 2d0*BETA*x*x*(dgdenom)**2/gdenom**3
272
A2tmp = (4d0/9d0)*rhom23*(g-x*dg+4d0*x*x*d2g)*fac
273
C2tmp = -(2d0/3d0)*(rhom23**2/rho(n,3))*d2g*fac
274
if (x.gt.tol_rho) then
275
C3tmp = - 0.25d0*gamma**(-1.5d0)*(dg-x*d2g)*fac
280
call xc_att_xc_d2(rho(n,3),ipol,Etmp,Atmp,Ctmp,A2tmp,C2tmp,
282
Amat2(n,D2_RB_RB) = Amat2(n,D2_RB_RB) + A2tmp
283
Cmat2(n,D2_RB_GBB) = Cmat2(n,D2_RB_GBB) + C2tmp
284
Cmat2(n,D2_GBB_GBB) = Cmat2(n,D2_GBB_GBB) + C3tmp
286
call xc_att_xc(rho(n,3),ipol,Etmp,Atmp,Ctmp)
288
Ex = Ex + qwght(n)*Etmp
289
if(ldew) func(n) = func(n) + Etmp
290
Amat(n,2) = Amat(n,2) + Atmp
291
Cmat(n,D1_GBB) = Cmat(n,D1_GBB) + Ctmp
301
c Compile source again for the 2nd derivative case
303
#include "xc_camb88.F"