2
c -----------------------------------------------------------------------
3
c Uniform electron gas exchange functional for the erfc(r)/r interaction
4
c as implemented in the following paper:
5
c "A well-tempered density functional theory of electrons in molecules"
6
c Ester Livshits & Roi Baer, Phys. Chem. Chem. Phys., 9, 2932 (2007)
7
c The other relevant publication is:
8
c R. Baer, D. Neuhauser, Phys. Rev. Lett., 94, 043002 (2005)
9
c -----------------------------------------------------------------------
12
subroutine xc_rodaes_erf(tol_rho, fac, lfac, nlfac, rho, Amat, nq,
13
& ipol, Ex, qwght, ldew, func)
15
c For locations of 2nd derivatives of functionals in array
17
subroutine xc_rodaes_erf_d2(tol_rho, fac, lfac, nlfac, rho, Amat,
18
& Amat2, nq, ipol, Ex, qwght, ldew, func)
31
double precision fac, Ex, total
32
logical ldew, lfac, nlfac
33
double precision func(*) ! value of the functional [output]
34
double precision tol_rho
35
double precision rho(nq,(ipol*(ipol+1))/2) ! charge density
36
double precision qwght(nq) ! quadrature weights
37
double precision Amat(nq,ipol) ! partial first derivatives
38
double precision F(nq),RA(nq),RB(nq)
39
double precision rhoA, rhoB, rhoTotal, rhoA1, rhoB1
40
double precision gamma
41
double precision fA, fB, fpA, fpB, fppA, fppB
43
double precision EpsXprime
44
double precision EpsTwoXprime
47
double precision Amat2(nq,*) ! partial second derivatives
50
c -----------------------------------------------------------------------
52
c -----------------------------------------------------------------------
56
c write(luout,*) "In xc_rodaes_erf"
57
c write(luout,*) "cam_omega:",cam_omega
58
c write(luout,*) "gamma:",gamma
61
if (ipol.eq.1) then ! spin-restricted
64
else ! spin-unrestricted
70
c -----------------------------------------------------------------------
71
c Calculate the first and second derivatives
72
c -----------------------------------------------------------------------
78
rhoTotal = rhoA + rhoB ! total density at point
79
if (rhoTotal.gt.tol_rho) then
81
if (ipol.eq.1) then ! spin-restricted
84
else ! spin-unrestricted
89
fA = EpsX(rhoA1,gamma)
90
fB = EpsX(rhoB1,gamma)
91
fpA = EpsXprime(rhoA1,gamma)
92
fpB = EpsXprime(rhoB1,gamma)
94
f(n) = fA * rhoA + fB * rhoB
95
Amat(n,1) = Amat(n,1) + (fpA*rhoA1+fA)*fac
97
Amat(n,2) = Amat(n,2) + (fpB*rhoB1+fB)*fac
101
fppA = EpsTwoXprime(rhoA1,gamma)
102
fppB = EpsTwoXprime(rhoB1,gamma)
104
Amat2(n,D2_RA_RA) = Amat2(n,D2_RA_RA) +
105
& ((fppA*rhoA+fpA)*4)*fac
107
c Guard against case of no beta electrons, e.g. H atom
109
if (rho(n,3).gt.tol_rho) then
110
Amat2(n,D2_RB_RB) = Amat2(n,D2_RB_RB) +
111
& ((fppB*rhoB+fpB)*4)*fac
115
if (ldew) func(n) = func(n) + f(n)*fac
116
total = total + f(n)*qwght(n)
128
#include "xc_rodaes_erf.F"
130
c ---------------------------------------------------------------------------------------
132
c ---------------------------------------------------------------------------------------
134
c ---------------------------------------------------------------------------------------
135
c Return the value of pi
136
c ---------------------------------------------------------------------------------------
138
double precision function ValueOfPi()
141
#include "xc_params.fh"
148
c ---------------------------------------------------------------------------------------
149
c Evaluates the actual function
150
c ---------------------------------------------------------------------------------------
152
double precision function HqBNL(q)
155
#include "xc_params.fh"
157
double precision q,TwoSqrtPi,OneOverQ,q2,DERF
160
TwoSqrtPi = 2.0d0*dsqrt(pi)
163
if (q .lt. 1D-15) then
168
if (q .lt. 0.1d0) then
169
HqBNL=1.0d0-q*2.0d0/3.0d0*(TwoSqrtPi-q+q*(q2-2.0d0))
173
HqBNL=1.0d0-q*2.0d0/3.0d0*(TwoSqrtPi*DERF(OneOverQ)-q+
174
$ q*(q2-2.0d0)*(1.0d0-exp(-OneOverQ*OneOverQ)))
179
c ---------------------------------------------------------------------------------------
180
c Calculate the local Fermi vector for the provided density
181
c ---------------------------------------------------------------------------------------
183
double precision function FermiK(den)
186
#include "xc_params.fh"
188
double precision F13, den
191
FermiK = (3.d0*pi*pi*den)**F13
196
c ---------------------------------------------------------------------------------------
197
c Calculate the function EpsX at the given density value and gamma
198
c ---------------------------------------------------------------------------------------
200
double precision function EpsX(Rho,gamma)
203
#include "xc_params.fh"
205
double precision kF,RHO,gamma,Cs
206
double precision HqBNL
207
double precision FermiK
215
Cs = -3.0D0/(4.0d0*pi)
216
EpsX = Cs * kF * HqBNL(gamma/kF)
221
c ---------------------------------------------------------------------------------------
222
c Calculate the first derivative of the function
223
c ---------------------------------------------------------------------------------------
225
double precision function HqBNLPrime(q)
228
#include "xc_params.fh"
230
double precision q,OneOverQ,q2,q3,DERF
236
if (q .lt. 0.1d0) then
237
HqBNLPrime = -4.0d0/3.0d0*(dsqrt(Pi)+2.0d0*q3-3.0d0*q)
241
HqBNLPrime = 4.0d0/3.0d0*(q*(exp(-OneOverQ*OneOverQ)*(2.0d0*q2
242
$ -1.0d0)+(3.0d0-2.0d0*q2))-dsqrt(Pi)*DERF(OneOverQ))
247
c ---------------------------------------------------------------------------------------
248
c Calculate the first derivative of the local Fermi vector (it depends on the density)
249
c ---------------------------------------------------------------------------------------
251
double precision function FermiKPrime(den)
254
#include "xc_params.fh"
256
double precision F23, den
259
FermiKPrime = (Pi/(3.0d0*den))**F23
264
c ---------------------------------------------------------------------------------------
265
c Calculate the first derivative of q (q=gamma/kf) (it implicitly depends on the density)
266
c ---------------------------------------------------------------------------------------
268
double precision function QPrime(gamma,kF)
272
double precision kF, FermiK2, gamma
275
QPrime = -gamma/FermiK2
280
c ---------------------------------------------------------------------------------------
281
c Calculate the first derivative of EpsX
282
c ---------------------------------------------------------------------------------------
284
double precision function EpsXprime(Rho,gamma)
287
#include "xc_params.fh"
289
double precision Rho,gamma
290
double precision Cs,kF,CsPrime
292
double precision HqBNL
293
double precision HqBNLPrime
294
double precision QPrime
295
double precision FermiK
296
double precision FermiKPrime
299
CsPrime = -3.0D0/(4.0d0*Pi)
307
EpsXprime = FermiKPrime(Rho)*(CsPrime*HqBNL(gamma/kF)+
308
$ QPrime(gamma,kF)*HqBNLPrime(gamma/kF)*Cs)
313
c ---------------------------------------------------------------------------------------
314
c Calculate the second derivative of the main function that consititutes the functional
315
c ---------------------------------------------------------------------------------------
317
double precision function HqBNLTwoPrime(q)
320
#include "xc_params.fh"
322
double precision q,OneOverQ,q2
327
if (q .lt. 0.1d0) then
328
HqBNLTwoPrime = 4.0d0-8.0d0*q2
332
HqBNLTwoPrime = exp(-OneOverQ*OneOverQ)*(4.0d0+8.0d0*q2)
338
c ---------------------------------------------------------------------------------------
339
c Calculate the second derivative of the local Fermi vector
340
c ---------------------------------------------------------------------------------------
342
double precision function FermiKTwoPrime(den)
345
#include "xc_params.fh"
347
double precision F13, den
350
FermiKTwoPrime = -(8.0d0*Pi**2.0d0/(243.0d0*den**5.0d0))**F13
355
c ---------------------------------------------------------------------------------------
356
c Calculate the second derivative of q
357
c ---------------------------------------------------------------------------------------
359
double precision function QTwoPrime(gamma,kF)
363
double precision gamma, kF, FermiK3
366
QTwoPrime = (2.0d0*gamma)/FermiK3
371
c ---------------------------------------------------------------------------------------
372
c Calculate the second derivative of EpsX
373
c ---------------------------------------------------------------------------------------
375
double precision function EpsTwoXprime(Rho,gamma)
378
#include "xc_params.fh"
380
double precision Rho,gamma
381
double precision kF,kFPrim,kFprim2,kF2prim
382
double precision q,qprim,qprim2,q2prim
383
double precision g,gprim,g2prim
384
double precision Cs,CsPrim
386
double precision FermiK
387
double precision FermiKPrime
388
double precision FermiKTwoPrime
389
double precision QPrime
390
double precision QTwoPrime
391
double precision HqBNL
392
double precision HqBNLPrime
393
double precision HqBNLTwoPrime
401
kFPrim = FermiKPrime(Rho)
402
kFPrim2=kFPrim**2.0d0
403
kF2prim = FermiKTwoPrime(Rho)
404
CsPrim = -3.0d0/(4.0d0*Pi)
407
qprim = QPrime(gamma,kF)
409
q2prim = QTwoPrime(gamma,kF)
411
gprim = HqBNLPrime(q)
412
g2prim = HqBNLTwoPrime(q)
415
$ kFPrim2*(2.0d0*CsPrim*gprim*qprim
416
$ +Cs*(QPrim2*g2prim+gprim*Q2Prim))
417
$ +kF2Prim*(g*CsPrim+Cs*gprim*qprim)
423
c $Id: xc_rodaes_erf.F 21176 2011-10-10 06:35:49Z d3y133 $