Branch data Line data Source code
1 : : !!****m* ABINIT/m_xchcth
2 : : !! NAME
3 : : !! m_xchcth
4 : : !!
5 : : !! FUNCTION
6 : : !! Treat XC GGA functional of HCTH type.
7 : : !! See Hamprecht, Cohen, Tozer and Handy, J. Chem. Phys. 109, 6264 (1998) [[cite:Hamprecht1998]] for HCTH-93
8 : : !! Boese, Doltsinis, Handy and Sprik, J. Chem. Phys. 112, 1670 (2000) [[cite:Boese2000]] for HCTH-120 and HCTH-147.
9 : : !! Boese and Handy , J. Chem. Phys. 114, 5497 (2001) [[cite:Boese2001]] for HCTH-407.
10 : : !!
11 : : !! COPYRIGHT
12 : : !! Copyright (C) 2002-2026 ABINIT group (XG,LG)
13 : : !! This file is distributed under the terms of the
14 : : !! GNU General Public License, see ~abinit/COPYING
15 : : !! or http://www.gnu.org/copyleft/gpl.txt .
16 : : !!
17 : : !! SOURCE
18 : :
19 : : #if defined HAVE_CONFIG_H
20 : : #include "config.h"
21 : : #endif
22 : :
23 : : #include "abi_common.h"
24 : :
25 : : module m_xchcth
26 : :
27 : : use defs_basis
28 : : use m_errors
29 : : use m_abicore
30 : :
31 : : use m_numeric_tools, only : invcb
32 : :
33 : : implicit none
34 : :
35 : : private
36 : : !!***
37 : :
38 : : public :: xchcth
39 : : !!***
40 : :
41 : : contains
42 : : !!***
43 : :
44 : : !!****f* ABINIT/xchcth
45 : : !! NAME
46 : : !! xchcth
47 : : !!
48 : : !! FUNCTION
49 : : !! Treat XC GGA functional of HCTH type.
50 : : !! See Hamprecht, Cohen, Tozer and Handy, J. Chem. Phys. 109, 6264 (1998) [[cite:Hamprecht1998]] for HCTH-93.
51 : : !! Boese, Doltsinis, Handy and Sprik, J. Chem. Phys. 112, 1670 (2000) [[cite:Boese2000]] for HCTH-120 and HCTH-147.
52 : : !! Boese and Handy , J. Chem. Phys. 114, 5497 (2001) [[cite:Boese2001]] for HCTH-407.
53 : : !!
54 : : !! For a series of values of the density and the square of the
55 : : !! gradient of the density, return the associated Exc energy,
56 : : !! potential, and, in case of response-function, functions needed
57 : : !! to build the XC kernel.
58 : : !!
59 : : !! INPUTS
60 : : !! ixc=number of the XC functional : 16 for HCTH-93, 17 for HCTH-120, 26 for HCTH-147 and 27 for HCTH-407.
61 : : !! npts= number of points to be computed
62 : : !! nspden=1 for unpolarized, 2 for spin-polarized
63 : : !! grho2_updn(npts,2*nspden-1)=square of the gradient of the spin-up,
64 : : !! and, if nspden==2, spin-down, and total density (Hartree/Bohr**2)
65 : : !! order=maximal derivative of Exc to be computed
66 : : !! (1 => energy and potential, or 2 => also XC kernel )
67 : : !! Warning : order=2 not yet available
68 : : !! rho_updn(npts,nspden)=spin-up and spin-down density (Hartree/bohr**3)
69 : : !!
70 : : !! OUTPUT
71 : : !!
72 : : !! dvxcdgr(npts,3)=partial derivative of the exchange-correlation
73 : : !! energy (exci*$\rho$) with respect to the spin-up (dvxcdgr(:,1)),
74 : : !! spin-down (dvxcdgr(:,2)) square of gradients of the density
75 : : !!
76 : : !! exci(npts)=exchange-correlation energy density (hartree)
77 : : !! vxci(npts,nspden)=partial derivative of the exchange-correlation energy (exci*$\rho$)
78 : : !! with respect to the spin-down (vxci(:,1)) and spin-up (vxci(:,2) densities
79 : : !! Normalization: Exc=$\int (exc(r)*\rho (r) d^3 r)$ for $\rho$(r)=electron density.
80 : : !!
81 : : !! TODO
82 : : !! Response function not coded yet, but part of it are already present
83 : : !!
84 : : !! SOURCE
85 : :
86 : 1265 : subroutine xchcth(dvxcdgr,exci,grho2_updn,ixc,npts,nspden,order,rho_updn,vxci)
87 : :
88 : : !Arguments ------------------------------------
89 : : !scalars
90 : : integer,intent(in) :: ixc,npts,nspden,order
91 : : !arrays
92 : : real(dp),intent(in) :: grho2_updn(npts,2*nspden-1),rho_updn(npts,nspden)
93 : : real(dp),intent(out) :: dvxcdgr(npts,2),exci(npts),vxci(npts,nspden)
94 : :
95 : : !Local variables-------------------------------
96 : : !scalars
97 : : integer,save :: initialized=0
98 : : integer :: ipts,ispden
99 : : real(dp),parameter :: alpha_zeta2=one-1e-6_dp,alpha_zeta=one-1e-6_dp
100 : : real(dp),parameter :: fsec_inv=one/1.709921_dp,gammacab=0.006_dp
101 : : real(dp),parameter :: gammacsig=0.2_dp,gammax=0.004_dp
102 : : real(dp),parameter :: rsfac=0.6203504908994000_dp
103 : : real(dp),save :: factf_zeta,factfp_zeta,sixpi2_1_3,sixpi2m1_3,sq_rsfac
104 : : real(dp),save :: sq_rsfac_inv,threefourth_divpi,twom1_3
105 : : real(dp) :: ccab0,ccab1,ccab2,ccab3,ccab4,ccsig0,ccsig1,ccsig2,ccsig3,ccsig4
106 : : real(dp) :: coeffss,cxsig0,cxsig1,cxsig2,cxsig3,cxsig4,d2ecrs0_drs2
107 : : real(dp) :: d2ecrs1_drs2,d2ecrs_drs2,d2ecrs_drsdzeta,d2ecrs_dzeta2
108 : : real(dp) :: d2fzeta4_dzeta2,d2gcrs_drs2,d2macrs_drs2,decrs0_drs,decrs1_drho
109 : : real(dp) :: decrs1_drs,decrs_drs,decrs_dzeta,dfzeta4_dzeta,dgcabdss
110 : : real(dp) :: dgcrs_drs,dgcsigdss,dgxsigdss,divcab,divcsig,divx,dmacrs_drs
111 : : real(dp) :: drhoecab_drhodn,drhoecab_drhoup,drhoecrs1_drhodn,drhoecrs1_drhoup
112 : : real(dp) :: drsdrho,dssdg,dssdndg,dssdndrho,dssdrho,dssupdg,dssupdrho,ducabdss
113 : : real(dp) :: ducsigdss,duxsigdss,ec0_a1,ec0_aa,ec0_b1,ec0_b2,ec0_b3,ec0_b4
114 : : real(dp) :: ec0_den,ec0_log,ec0_q0,ec0_q1,ec0_q1p,ec0_q1pp,ec1_a1,ec1_aa
115 : : real(dp) :: ec1_b1,ec1_b2,ec1_b3,ec1_b4,ec1_den,ec1_log,ec1_q0,ec1_q1,ec1_q1p
116 : : real(dp) :: ec1_q1pp,ecrs,ecrs0,ecrs1,ex_lsd,exc,f_zeta,factfpp_zeta
117 : : real(dp) :: fp_zeta,fpp_zeta,gcab,gcrs,gcsig,gxsig,mac_a1,mac_aa,mac_b1
118 : : real(dp) :: mac_b2,mac_b3,mac_b4,mac_den,mac_log,mac_q0,mac_q1,mac_q1p
119 : : real(dp) :: mac_q1pp,macrs,rho,rho_inv
120 : : real(dp) :: rhoecab,rhoecrs1_dn,rhoecrs1_up,rhomo6,rhomot,rhoo6
121 : : real(dp) :: rhotmo6,rhotmot,rhoto6,rhotot,rhotot_inv,rs,rsm1_2,sqr_rs,ss,ss_dn
122 : : real(dp) :: ss_up,ssavg,ucab,ucsig,uxsig,vxcadd,zeta,zeta4,zetm_1_3
123 : : real(dp) :: zetp_1_3
124 : : character(len=500) :: message
125 : : !arrays
126 : 1265 : real(dp),allocatable :: rho_updnm1_3(:,:),rhoarr(:),rhom1_3(:),zetm(:)
127 : 1265 : real(dp),allocatable :: zetmm1_3(:),zetp(:),zetpm1_3(:)
128 : : !no_abirules
129 : : !real(dp) :: delta,factor,grr,rho_dn,rho_dnm,rho_dnp,rho_up,rho_upm,rho_upp,zeta_mean
130 : :
131 : : ! *************************************************************************
132 : :
133 : : !DEBUG
134 : : !write(std_out,*)' xchcth : enter'
135 : : !write(std_out,*)' nspden=',nspden
136 : : !ENDDEBUG
137 : :
138 [ - + ]: 1265 : if (order/=1) then
139 : 0 : write(message, '(a,i0)' )' Order must be 1 ; argument was ',order
140 : 0 : ABI_BUG(message)
141 : : end if
142 : :
143 [ + + ]: 1265 : if(initialized==0)then
144 : 4 : twom1_3=two**(-third)
145 : 4 : sixpi2_1_3=(six*pi**2)**third
146 : 4 : sixpi2m1_3=one/sixpi2_1_3
147 : 4 : threefourth_divpi=three_quarters*piinv
148 : 4 : factf_zeta= one / ( two**(four/three)-two )
149 : 4 : factfp_zeta= four_thirds * factf_zeta * alpha_zeta2
150 : 4 : sq_rsfac=sqrt(rsfac)
151 : 4 : sq_rsfac_inv=one/sq_rsfac
152 : 4 : initialized=1
153 : : end if
154 : :
155 [ + + + - : 1265 : if(ixc==16)then
+ ]
156 : : ! HCTH-93 parameters from table II of JCP 109, 6264 (1998). Note that there is
157 : : ! an error in tables III of JCP 112, 1670 (2000) and JCP 114, 5497 (2001) for the coefficient ccab1
158 : : cxsig0=1.09320_dp ; cxsig1=-0.744056_dp ; cxsig2=5.59920_dp ; cxsig3=-6.78549_dp ; cxsig4=4.49357_dp
159 : : ccsig0=0.222601_dp; ccsig1=-0.0338622_dp; ccsig2=-0.0125170_dp; ccsig3=-0.802496_dp; ccsig4=1.55396_dp
160 : : ccab0=0.729974_dp ; ccab1=3.35287_dp ; ccab2=-11.543_dp ; ccab3=8.08564_dp ; ccab4=-4.47857_dp
161 : : else if(ixc==17)then
162 : : ! HCTH-120 parameters from table III of JCP 112, 1670 (2000)
163 : : ! Note the correction of the sign of cxsig1 and ccsig1, as there is a misprint in the HCTH paper !
164 : : ! see the exchange of mail with MMarques 23 Dec 2008, and 6 Jan 2009.
165 : : ! Now, the functional agrees with the libXC results
166 : : cxsig0=1.09163_dp; cxsig1=-0.7472_dp; cxsig2=5.0783_dp; cxsig3=-4.1075_dp; cxsig4=1.1717_dp
167 : : ccsig0=0.48951_dp; ccsig1=-0.2607_dp; ccsig2=0.4329_dp; ccsig3=-1.9925_dp; ccsig4=2.4853_dp
168 : : ccab0=0.51473_dp ; ccab1=6.9298_dp ; ccab2=-24.707_dp; ccab3=23.110_dp ; ccab4=-11.323_dp
169 : : ! Exactly same values than in lib_xc
170 : : cxsig0=1.09163_dp; cxsig1=-0.747215_dp; cxsig2=5.07833_dp; cxsig3=-4.10746_dp; cxsig4=1.17173_dp
171 : : ccsig0=0.489508_dp; ccsig1=-0.260699_dp; ccsig2=0.432917_dp; ccsig3=-1.99247_dp; ccsig4=2.48531_dp
172 : : ccab0=0.51473_dp ; ccab1=6.92982_dp ; ccab2=-24.7073_dp; ccab3=23.1098_dp ; ccab4=-11.3234_dp
173 : : else if(ixc==26)then
174 : : ! HCTH-147 parameters from table III of JCP 112, 1670 (2000)
175 : : cxsig0=1.09025_dp; cxsig1=-0.7992_dp; cxsig2=5.5721_dp ; cxsig3=-5.8676_dp; cxsig4=3.0454_dp
176 : : ccsig0=0.56258_dp; ccsig1=-0.0171_dp; ccsig2=-1.3064_dp; ccsig3= 1.0575_dp; ccsig4=0.8854_dp
177 : : ccab0=0.54235_dp ; ccab1=7.0146_dp ; ccab2=-28.382_dp ; ccab3=35.033_dp ; ccab4=-20.428_dp
178 : : ! Exactly same values than in lib_xc
179 : : cxsig0=1.09025_dp; cxsig1=-0.799194_dp; cxsig2=5.57212_dp ; cxsig3=-5.86760_dp; cxsig4=3.04544_dp
180 : : ccsig0=0.562576_dp; ccsig1= 0.0171436_dp; ccsig2=-1.30636_dp; ccsig3= 1.05747_dp; ccsig4=0.885429_dp
181 : : ccab0=0.542352_dp ; ccab1=7.01464_dp ; ccab2=-28.3822_dp ; ccab3=35.0329_dp ; ccab4=-20.4284_dp
182 : : else if(ixc==27)then
183 : : ! HCTH-407 parameters from table IV of JCP 114, 5497 (2001)
184 : : cxsig0=1.08184_dp; cxsig1=-0.5183_dp; cxsig2=3.4256_dp; cxsig3=-2.6290_dp; cxsig4=2.2886_dp
185 : : ccsig0=1.18777_dp; ccsig1=-2.4029_dp; ccsig2=5.6174_dp; ccsig3=-9.1792_dp; ccsig4=6.2480_dp
186 : : ccab0=0.58908_dp ; ccab1=4.4237_dp ; ccab2=-19.222_dp; ccab3=42.572_dp ; ccab4=-42.005_dp
187 : : ! Exactly same values than in lib_xc
188 : : cxsig0=1.08184_dp; cxsig1=-0.518339_dp; cxsig2=3.42562_dp; cxsig3=-2.62901_dp; cxsig4=2.28855_dp
189 : : ccsig0=1.18777_dp; ccsig1=-2.40292_dp; ccsig2=5.61741_dp; ccsig3=-9.17923_dp; ccsig4=6.24798_dp
190 : : ccab0=0.589076_dp ; ccab1=4.42374_dp ; ccab2=-19.2218_dp; ccab3=42.5721_dp ; ccab4=-42.0052_dp
191 : : else
192 : 0 : write(message, '(a,i0)' )' xchcth : ixc must be 16, 17, 26, or 27 ; argument was ',ixc
193 : 0 : ABI_BUG(message)
194 : : end if
195 : :
196 : : !Parameters for the Perdew-Wang 92 LSD as well as LSD-RPA,
197 : : !see Table I of Phys.Rev.B 45,13244 (1992) [[cite:Perdew1992a]]
198 : 1265 : ec0_aa=0.031091_dp ; ec1_aa=0.015545_dp ; mac_aa=0.016887_dp
199 : 1265 : ec0_a1=0.21370_dp ; ec1_a1=0.20548_dp ; mac_a1=0.11125_dp
200 : 1265 : ec0_b1=7.5957_dp ; ec1_b1=14.1189_dp ; mac_b1=10.357_dp
201 : 1265 : ec0_b2=3.5876_dp ; ec1_b2=6.1977_dp ; mac_b2=3.6231_dp
202 : 1265 : ec0_b3=1.6382_dp ; ec1_b3=3.3662_dp ; mac_b3=0.88026_dp
203 : 1265 : ec0_b4=0.49294_dp ; ec1_b4=0.62517_dp ; mac_b4=0.49671_dp
204 : :
205 : : !DEBUG
206 : : !Finite-difference debugging, do not take away
207 : : !Note : here work with collinear gradients. Might be generalized ...
208 : : !debug=2 ! Choose 1 (rho grads) or 2 (grho grads)
209 : : !factor=one
210 : : !zeta_mean=0.98_dp
211 : : !zeta_mean=zero
212 : : !delta=0.000025*factor
213 : : !delta=0.0000125*factor
214 : : !if(debug/=0)then
215 : : !do ipts=1,npts,5
216 : : !rho=ipts*0.zero*factor
217 : : !rho_up=rho*(one+zeta_mean)*half
218 : : !rho_dn=rho*(one-zeta_mean)*half
219 : : !rho_upp=rho_up+delta
220 : : !rho_upm=rho_up-delta
221 : : !rho_dnp=rho_dn+delta
222 : : !rho_dnm=rho_dn-delta
223 : : !! Here, vary rho
224 : : !if(debug==1)then
225 : : !rho_updn(ipts ,1)=rho_up ; rho_updn(ipts ,2)=rho_dn
226 : : !rho_updn(ipts+1,1)=rho_upp; rho_updn(ipts+1,2)=rho_dn
227 : : !rho_updn(ipts+2,1)=rho_upm; rho_updn(ipts+2,2)=rho_dn
228 : : !rho_updn(ipts+3,1)=rho_up ; rho_updn(ipts+3,2)=rho_dnp
229 : : !rho_updn(ipts+4,1)=rho_up ; rho_updn(ipts+4,2)=rho_dnm
230 : : !grho2_updn(ipts:ipts+4,1)=(0.2_dp*factor)**2 ! grad2 of spin up density
231 : : !grho2_updn(ipts:ipts+4,2)=(0.2_dp*factor)**2 ! grad2 of spin down density
232 : : !grho2_updn(ipts:ipts+4,3)=(0.3_dp*factor)**2 ! grad2 of total density
233 : : !else
234 : : !! Here, vary grho (interchange rho and grho)
235 : : !grho2_updn(ipts ,1)=rho_up**2 ; grho2_updn(ipts ,2)=rho_dn**2
236 : : !grho2_updn(ipts+1,1)=rho_upp**2; grho2_updn(ipts+1,2)=rho_dn**2
237 : : !grho2_updn(ipts+2,1)=rho_upm**2; grho2_updn(ipts+2,2)=rho_dn**2
238 : : !grho2_updn(ipts+3,1)=rho_up**2 ; grho2_updn(ipts+3,2)=rho_dnp**2
239 : : !grho2_updn(ipts+4,1)=rho_up**2 ; grho2_updn(ipts+4,2)=rho_dnm**2
240 : : !grho2_updn(ipts ,3)=(ipts*0.zero*factor)**2
241 : : !grho2_updn(ipts+1,3)=(ipts*0.zero*factor+delta)**2
242 : : !grho2_updn(ipts+2,3)=(ipts*0.zero*factor-delta)**2
243 : : !grho2_updn(ipts+3,3)=(ipts*0.zero*factor+delta)**2 ! identical to ipts+1
244 : : !grho2_updn(ipts+4,3)=(ipts*0.zero*factor-delta)**2 ! identical to ipts+2
245 : : !rho_updn(ipts:ipts+4,1)=0.2_dp*factor*(one+zeta_mean)*half ! spin up density
246 : : !rho_updn(ipts:ipts+4,2)=0.2_dp*factor*(one-zeta_mean)*half ! spin down density
247 : : !end if
248 : : !end do
249 : : !end if
250 : : !Usual option :
251 : : !nspden=2 ; order=2
252 : : !GGA
253 : : !nspden=2 ; order=1
254 : : !Might take also, although finite difference later is meaningless
255 : : !nspden=1 ; order=-2
256 : : !ENDDEBUG
257 : :
258 : 1265 : if(order**2 >1)then
259 : 1265 : factfpp_zeta= third * factfp_zeta * alpha_zeta2
260 : : end if
261 : :
262 [ - + + - : 3795 : ABI_MALLOC(rhoarr,(npts))
+ - + - -
+ - + ]
263 [ - + + - : 2530 : ABI_MALLOC(rhom1_3,(npts))
- + - + ]
264 [ - + + - : 3795 : ABI_MALLOC(rho_updnm1_3,(npts,2))
+ - + - -
+ - + ]
265 [ + + ]: 2808 : do ispden=1,nspden
266 : 2808 : call invcb(rho_updn(:,ispden),rho_updnm1_3(:,ispden),npts)
267 : : end do
268 [ + + ]: 1265 : if(nspden==1)then
269 [ + + ]: 3770715 : rhoarr(:)=two*rho_updn(:,1)
270 [ + + ]: 3770715 : rhom1_3(:)=twom1_3*rho_updnm1_3(:,1)
271 [ + + ]: 3770715 : rho_updnm1_3(:,2)=rho_updnm1_3(:,1)
272 : : else
273 [ + + ]: 1032470 : rhoarr(:)=rho_updn(:,1)+rho_updn(:,2)
274 : 278 : call invcb(rhoarr,rhom1_3,npts)
275 [ - + + - : 556 : ABI_MALLOC(zetm,(npts))
- + - + ]
276 [ - + + - : 556 : ABI_MALLOC(zetmm1_3,(npts))
- + - + ]
277 [ - + + - : 556 : ABI_MALLOC(zetp,(npts))
- + - + ]
278 [ - + + - : 556 : ABI_MALLOC(zetpm1_3,(npts))
- + - + ]
279 [ + + ]: 1032470 : do ipts=1,npts
280 : 1032192 : rhotmot=rhom1_3(ipts)
281 : 1032192 : rhotot_inv=rhotmot*rhotmot*rhotmot
282 : 1032192 : zeta=(rho_updn(ipts,1)-rho_updn(ipts,2))*rhotot_inv
283 : 1032192 : zetp(ipts)=one+zeta*alpha_zeta
284 : 1032470 : zetm(ipts)=one-zeta*alpha_zeta
285 : : end do
286 : 278 : call invcb(zetp,zetpm1_3,npts)
287 : 278 : call invcb(zetm,zetmm1_3,npts)
288 : : end if
289 : :
290 [ + + ]: 1265 : if (nspden==1) then
291 : :
292 [ - + ]: 987 : if(order==-2) then
293 : :
294 [ # # ]: 0 : do ipts=1,npts
295 : :
296 : : ! -----------------------------------------------------------------------
297 : : ! First take care of the spin-split part of the functional
298 : 0 : exc=zero
299 : 0 : ispden=1
300 : 0 : rho =rho_updn(ipts,ispden)
301 : 0 : rhomot=rho_updnm1_3(ipts,ispden)
302 : 0 : rho_inv=rhomot*rhomot*rhomot
303 : :
304 : : ! Exchange part
305 : 0 : ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
306 : : ! Note that this definition differs from the PBE one
307 : 0 : coeffss=rho_inv*rho_inv*rhomot*rhomot
308 : 0 : ss=grho2_updn(ipts,ispden)*coeffss
309 : 0 : dssdrho=-eight*third*ss*rho_inv
310 : 0 : dssdg=two*coeffss
311 : :
312 : 0 : divx=one/(one+gammax*ss)
313 : 0 : uxsig=gammax*ss*divx
314 : 0 : duxsigdss=gammax*divx*(one-ss*gammax*divx)
315 : :
316 : 0 : gxsig=cxsig0+uxsig*(cxsig1+uxsig*(cxsig2+uxsig*(cxsig3+uxsig*cxsig4)))
317 : : dgxsigdss=(cxsig1+uxsig*(two*cxsig2+uxsig*(three*cxsig3+uxsig*four*cxsig4)))&
318 : 0 : & *duxsigdss
319 : :
320 : 0 : exc=exc+ex_lsd*rho*gxsig
321 : 0 : vxci(ipts,ispden)=ex_lsd*(four_thirds*gxsig+rho*dgxsigdss*dssdrho)
322 : 0 : dvxcdgr(ipts,ispden)=ex_lsd*rho*dgxsigdss*dssdg
323 : :
324 : : ! Spin parallel correlation part
325 : : ! Note that this definition is for fully spin-polarized quantities
326 : 0 : rs=rsfac*rhomot
327 : 0 : rhomo6=sqrt(rhomot)
328 : 0 : sqr_rs=sq_rsfac*rhomo6
329 : 0 : rhoo6=rho*rhomot*rhomot*rhomo6
330 : 0 : rsm1_2=sq_rsfac_inv*rhoo6
331 : 0 : drsdrho=-third*rs*rho_inv
332 : :
333 : 0 : ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
334 : 0 : ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
335 : 0 : ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
336 : 0 : ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
337 : : ! ec1_log=log( one + one / ec1_q1 )
338 : 0 : ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
339 : 0 : ecrs1=ec1_q0*ec1_log
340 : 0 : decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
341 : 0 : decrs1_drho=ecrs1+decrs1_drs*drsdrho*rho
342 : :
343 : : ! Store the LSDA corr energy and density derivative
344 : 0 : rhoecrs1_up=rho*ecrs1
345 : 0 : drhoecrs1_drhoup=decrs1_drho
346 : 0 : ss_up=ss
347 : 0 : dssupdrho=dssdrho
348 : 0 : dssupdg=dssdg
349 : :
350 : 0 : divcsig=one/(one+gammacsig*ss)
351 : 0 : ucsig=gammacsig*ss*divcsig
352 : 0 : ducsigdss=gammacsig*divcsig*(one-ss*gammacsig*divcsig)
353 : :
354 : 0 : gcsig=ccsig0+ucsig*(ccsig1+ucsig*(ccsig2+ucsig*(ccsig3+ucsig*ccsig4)))
355 : : dgcsigdss=(ccsig1+ucsig*(two*ccsig2+ucsig*(three*ccsig3+ucsig*four*ccsig4)))&
356 : 0 : & *ducsigdss
357 : :
358 : : ! DEBUG
359 : : ! gcsig=zero
360 : : ! dgcsigdss=zero
361 : : ! ENDDEBUG
362 : 0 : exc=exc+ecrs1*rho*gcsig
363 : : vxci(ipts,ispden)=vxci(ipts,ispden)+decrs1_drho*gcsig+&
364 : 0 : & ecrs1*rho*dgcsigdss*dssdrho
365 : 0 : dvxcdgr(ipts,ispden)=dvxcdgr(ipts,ispden)+ecrs1*rho*dgcsigdss*dssdg
366 : :
367 : 0 : rhoecrs1_dn=rhoecrs1_up
368 : 0 : drhoecrs1_drhodn=drhoecrs1_drhoup
369 : 0 : ss_dn=ss_up
370 : 0 : dssdndrho=dssupdrho
371 : 0 : dssdndg=dssupdg
372 : 0 : exc=exc*2
373 : :
374 : : ! -----------------------------------------------------------------------------
375 : : ! Then takes care of the LSD correlation part of the functional
376 : :
377 : 0 : rhotot=rhoarr(ipts)
378 : 0 : rhotmot=rhom1_3(ipts)
379 : 0 : rhotot_inv=rhotmot*rhotmot*rhotmot
380 : 0 : rhotmo6=sqrt(rhotmot)
381 : 0 : rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
382 : :
383 : : ! From now, the coding of the PW92 functional start. It is identical in xcpbe.f
384 : 0 : rs=rsfac*rhotmot
385 : 0 : sqr_rs=sq_rsfac*rhotmo6
386 : 0 : rsm1_2=sq_rsfac_inv*rhoto6
387 : :
388 : : ! Formulas A6-A8 of PW92LSD
389 : 0 : ec0_q0=-2.0d0*ec0_aa*(one+ec0_a1*rs)
390 : 0 : ec0_q1=2.0d0*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
391 : 0 : ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2.d0*ec0_b2+3.d0*ec0_b3*sqr_rs+4.d0*ec0_b4*rs)
392 : 0 : ec0_den=one/(ec0_q1*ec0_q1+ec0_q1)
393 : : ! ec0_log=log( one + one / ec0_q1 )
394 : 0 : ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
395 : 0 : ecrs0=ec0_q0*ec0_log
396 : 0 : decrs0_drs= -2.0d0*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
397 : :
398 : 0 : ec0_q1pp=half*ec0_aa*(-ec0_b1*rsm1_2**3+3.d0*ec0_b3*rsm1_2+8.d0*ec0_b4)
399 : : d2ecrs0_drs2= 4.0d0*ec0_aa*ec0_a1*ec0_q1p*ec0_den &
400 : : & -ec0_q0*ec0_q1pp*ec0_den &
401 : 0 : & +ec0_q0*ec0_q1p**2*ec0_den**2*(2.d0*ec0_q1+one)
402 : :
403 : :
404 : :
405 : 0 : mac_q0=-2.0d0*mac_aa*(one+mac_a1*rs)
406 : 0 : mac_q1=2.0d0*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
407 : 0 : mac_q1p=mac_aa*(mac_b1*rsm1_2+2.d0*mac_b2+3.d0*mac_b3*sqr_rs+4.d0*mac_b4*rs)
408 : 0 : mac_den=one/(mac_q1*mac_q1+mac_q1)
409 : 0 : mac_log=-log( mac_q1*mac_q1*mac_den )
410 : 0 : macrs=mac_q0*mac_log
411 : 0 : dmacrs_drs= -2.0d0*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
412 : :
413 : :
414 : 0 : ecrs=ecrs0
415 : 0 : decrs_drs=decrs0_drs
416 : 0 : decrs_dzeta=zero
417 : :
418 : 0 : d2ecrs_drs2=d2ecrs0_drs2
419 : :
420 : 0 : d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
421 : :
422 : 0 : zeta=zero
423 : :
424 : : ! At this point, the coding of the PW92 functional finishes.
425 : :
426 : : ! The correlation between different spin from HCTH is now computed
427 : : ! First, the part without gradient correction factor
428 : 0 : rhoecab=ecrs*rhotot-rhoecrs1_dn-rhoecrs1_up
429 : 0 : vxcadd=ecrs-rs*third*decrs_drs-zeta*decrs_dzeta
430 : 0 : drhoecab_drhoup=vxcadd+decrs_dzeta-drhoecrs1_drhoup
431 : 0 : drhoecab_drhodn=vxcadd-decrs_dzeta-drhoecrs1_drhodn
432 : :
433 : : ! Now, the gradient correction factor
434 : 0 : ssavg=half*(ss_up+ss_dn)
435 : 0 : divcab=one/(one+gammacab*ssavg)
436 : 0 : ucab=gammacab*ssavg*divcab
437 : 0 : ducabdss=gammacab*divcab*(one-ssavg*gammacab*divcab)
438 : :
439 : 0 : gcab=ccab0+ucab*(ccab1+ucab*(ccab2+ucab*(ccab3+ucab*ccab4)))
440 : : dgcabdss=(ccab1+ucab*(two*ccab2+ucab*(three*ccab3+ucab*four*ccab4)))&
441 : 0 : & *ducabdss
442 : :
443 : 0 : exc=exc+rhoecab*gcab
444 : :
445 : 0 : vxci(ipts,1)=vxci(ipts,1)+drhoecab_drhoup*gcab+rhoecab*dgcabdss*half*dssupdrho
446 : 0 : dvxcdgr(ipts,1)=dvxcdgr(ipts,1)+rhoecab*dgcabdss*half*dssupdg
447 : : ! If non spin-polarized, treat spin down contribution now, similar to spin up
448 : : ! vxci(ipts,2)=vxci(ipts,1)
449 : 0 : dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
450 : :
451 : : ! Final division by the total density, to give the energy density
452 : 0 : exci(ipts)=exc*rhotot_inv
453 : :
454 : : end do ! ipts=1,npts
455 : :
456 [ - + ]: 987 : else if(order**2>1) then
457 : :
458 [ # # ]: 0 : do ipts=1,npts
459 : :
460 : : ! -----------------------------------------------------------------------
461 : : ! First take care of the spin-split part of the functional
462 : 0 : exc=zero
463 : 0 : ispden=1
464 : 0 : rho =rho_updn(ipts,ispden)
465 : 0 : rhomot=rho_updnm1_3(ipts,ispden)
466 : 0 : rho_inv=rhomot*rhomot*rhomot
467 : :
468 : : ! Exchange part
469 : 0 : ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
470 : : ! Note that this definition differs from the PBE one
471 : 0 : coeffss=rho_inv*rho_inv*rhomot*rhomot
472 : 0 : ss=grho2_updn(ipts,ispden)*coeffss
473 : 0 : dssdrho=-eight*third*ss*rho_inv
474 : 0 : dssdg=two*coeffss
475 : :
476 : 0 : divx=one/(one+gammax*ss)
477 : 0 : uxsig=gammax*ss*divx
478 : 0 : duxsigdss=gammax*divx*(one-ss*gammax*divx)
479 : :
480 : 0 : gxsig=cxsig0+uxsig*(cxsig1+uxsig*(cxsig2+uxsig*(cxsig3+uxsig*cxsig4)))
481 : : dgxsigdss=(cxsig1+uxsig*(two*cxsig2+uxsig*(three*cxsig3+uxsig*four*cxsig4)))&
482 : 0 : & *duxsigdss
483 : :
484 : 0 : exc=exc+ex_lsd*rho*gxsig
485 : 0 : vxci(ipts,ispden)=ex_lsd*(four_thirds*gxsig+rho*dgxsigdss*dssdrho)
486 : 0 : dvxcdgr(ipts,ispden)=ex_lsd*rho*dgxsigdss*dssdg
487 : :
488 : : ! Spin parallel correlation part
489 : : ! Note that this definition is for fully spin-polarized quantities
490 : 0 : rs=rsfac*rhomot
491 : 0 : rhomo6=sqrt(rhomot)
492 : 0 : sqr_rs=sq_rsfac*rhomo6
493 : 0 : rhoo6=rho*rhomot*rhomot*rhomo6
494 : 0 : rsm1_2=sq_rsfac_inv*rhoo6
495 : 0 : drsdrho=-third*rs*rho_inv
496 : :
497 : 0 : ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
498 : 0 : ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
499 : 0 : ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
500 : 0 : ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
501 : : ! ec1_log=log( one + one / ec1_q1 )
502 : 0 : ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
503 : 0 : ecrs1=ec1_q0*ec1_log
504 : 0 : decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
505 : 0 : decrs1_drho=ecrs1+decrs1_drs*drsdrho*rho
506 : :
507 : : ! Store the LSDA corr energy and density derivative
508 : 0 : rhoecrs1_up=rho*ecrs1
509 : 0 : drhoecrs1_drhoup=decrs1_drho
510 : 0 : ss_up=ss
511 : 0 : dssupdrho=dssdrho
512 : 0 : dssupdg=dssdg
513 : :
514 : 0 : divcsig=one/(one+gammacsig*ss)
515 : 0 : ucsig=gammacsig*ss*divcsig
516 : 0 : ducsigdss=gammacsig*divcsig*(one-ss*gammacsig*divcsig)
517 : :
518 : 0 : gcsig=ccsig0+ucsig*(ccsig1+ucsig*(ccsig2+ucsig*(ccsig3+ucsig*ccsig4)))
519 : : dgcsigdss=(ccsig1+ucsig*(two*ccsig2+ucsig*(three*ccsig3+ucsig*four*ccsig4)))&
520 : 0 : & *ducsigdss
521 : :
522 : : ! DEBUG
523 : : ! gcsig=zero
524 : : ! dgcsigdss=zero
525 : : ! ENDDEBUG
526 : 0 : exc=exc+ecrs1*rho*gcsig
527 : : vxci(ipts,ispden)=vxci(ipts,ispden)+decrs1_drho*gcsig+&
528 : 0 : & ecrs1*rho*dgcsigdss*dssdrho
529 : 0 : dvxcdgr(ipts,ispden)=dvxcdgr(ipts,ispden)+ecrs1*rho*dgcsigdss*dssdg
530 : :
531 : 0 : rhoecrs1_dn=rhoecrs1_up
532 : 0 : drhoecrs1_drhodn=drhoecrs1_drhoup
533 : 0 : ss_dn=ss_up
534 : 0 : dssdndrho=dssupdrho
535 : 0 : dssdndg=dssupdg
536 : 0 : exc=exc*2
537 : :
538 : : ! -----------------------------------------------------------------------------
539 : : ! Then takes care of the LSD correlation part of the functional
540 : :
541 : 0 : rhotot=rhoarr(ipts)
542 : 0 : rhotmot=rhom1_3(ipts)
543 : 0 : rhotot_inv=rhotmot*rhotmot*rhotmot
544 : 0 : rhotmo6=sqrt(rhotmot)
545 : 0 : rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
546 : :
547 : : ! From now, the coding of the PW92 functional start. It is identical in xcpbe.f
548 : 0 : rs=rsfac*rhotmot
549 : 0 : sqr_rs=sq_rsfac*rhotmo6
550 : 0 : rsm1_2=sq_rsfac_inv*rhoto6
551 : :
552 : : ! Formulas A6-A8 of PW92LSD
553 : 0 : ec0_q0=-2.0d0*ec0_aa*(one+ec0_a1*rs)
554 : 0 : ec0_q1=2.0d0*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
555 : 0 : ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2.d0*ec0_b2+3.d0*ec0_b3*sqr_rs+4.d0*ec0_b4*rs)
556 : 0 : ec0_den=one/(ec0_q1*ec0_q1+ec0_q1)
557 : : ! ec0_log=log( one + one / ec0_q1 )
558 : 0 : ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
559 : 0 : ecrs0=ec0_q0*ec0_log
560 : 0 : decrs0_drs= -2.0d0*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
561 : 0 : ec0_q1pp=half*ec0_aa*(-ec0_b1*rsm1_2**3+3.d0*ec0_b3*rsm1_2+8.d0*ec0_b4)
562 : : d2ecrs0_drs2= 4.0d0*ec0_aa*ec0_a1*ec0_q1p*ec0_den &
563 : : & -ec0_q0*ec0_q1pp*ec0_den &
564 : 0 : & +ec0_q0*ec0_q1p**2*ec0_den**2*(2.d0*ec0_q1+one)
565 : :
566 : :
567 : 0 : ecrs=ecrs0
568 : 0 : decrs_drs=decrs0_drs
569 : 0 : decrs_dzeta=zero
570 : 0 : d2ecrs_drs2=d2ecrs0_drs2
571 : 0 : zeta=zero
572 : :
573 : : ! At this point, the coding of the PW92 functional finishes.
574 : :
575 : : ! The correlation between different spin from HCTH is now computed
576 : : ! First, the part without gradient correction factor
577 : 0 : rhoecab=ecrs*rhotot-rhoecrs1_dn-rhoecrs1_up
578 : 0 : vxcadd=ecrs-rs*third*decrs_drs-zeta*decrs_dzeta
579 : 0 : drhoecab_drhoup=vxcadd+decrs_dzeta-drhoecrs1_drhoup
580 : 0 : drhoecab_drhodn=vxcadd-decrs_dzeta-drhoecrs1_drhodn
581 : :
582 : : ! Now, the gradient correction factor
583 : 0 : ssavg=half*(ss_up+ss_dn)
584 : 0 : divcab=one/(one+gammacab*ssavg)
585 : 0 : ucab=gammacab*ssavg*divcab
586 : 0 : ducabdss=gammacab*divcab*(one-ssavg*gammacab*divcab)
587 : :
588 : 0 : gcab=ccab0+ucab*(ccab1+ucab*(ccab2+ucab*(ccab3+ucab*ccab4)))
589 : : dgcabdss=(ccab1+ucab*(two*ccab2+ucab*(three*ccab3+ucab*four*ccab4)))&
590 : 0 : & *ducabdss
591 : :
592 : 0 : exc=exc+rhoecab*gcab
593 : :
594 : 0 : vxci(ipts,1)=vxci(ipts,1)+drhoecab_drhoup*gcab+rhoecab*dgcabdss*half*dssupdrho
595 : 0 : dvxcdgr(ipts,1)=dvxcdgr(ipts,1)+rhoecab*dgcabdss*half*dssupdg
596 : : ! If non spin-polarized, treat spin down contribution now, similar to spin up
597 : : ! vxci(ipts,2)=vxci(ipts,1)
598 : 0 : dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
599 : :
600 : : ! Final division by the total density, to give the energy density
601 : 0 : exci(ipts)=exc*rhotot_inv
602 : :
603 : : end do ! ipts=1,npts
604 : : else
605 : :
606 [ + + ]: 3770715 : do ipts=1,npts
607 : :
608 : : ! -----------------------------------------------------------------------
609 : : ! First take care of the spin-split part of the functional
610 : 3769728 : exc=zero
611 : 3769728 : ispden=1
612 : 3769728 : rho =rho_updn(ipts,ispden)
613 : 3769728 : rhomot=rho_updnm1_3(ipts,ispden)
614 : 3769728 : rho_inv=rhomot*rhomot*rhomot
615 : :
616 : : ! Exchange part
617 : 3769728 : ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
618 : : ! Note that this definition differs from the PBE one
619 : 3769728 : coeffss=rho_inv*rho_inv*rhomot*rhomot
620 : 3769728 : ss=grho2_updn(ipts,ispden)*coeffss
621 : 3769728 : dssdrho=-eight*third*ss*rho_inv
622 : 3769728 : dssdg=two*coeffss
623 : :
624 : 3769728 : divx=one/(one+gammax*ss)
625 : 3769728 : uxsig=gammax*ss*divx
626 : 3769728 : duxsigdss=gammax*divx*(one-ss*gammax*divx)
627 : :
628 : 3769728 : gxsig=cxsig0+uxsig*(cxsig1+uxsig*(cxsig2+uxsig*(cxsig3+uxsig*cxsig4)))
629 : : dgxsigdss=(cxsig1+uxsig*(two*cxsig2+uxsig*(three*cxsig3+uxsig*four*cxsig4)))&
630 : 3769728 : & *duxsigdss
631 : :
632 : 3769728 : exc=exc+ex_lsd*rho*gxsig
633 : 3769728 : vxci(ipts,ispden)=ex_lsd*(four_thirds*gxsig+rho*dgxsigdss*dssdrho)
634 : 3769728 : dvxcdgr(ipts,ispden)=ex_lsd*rho*dgxsigdss*dssdg
635 : :
636 : : ! Spin parallel correlation part
637 : : ! Note that this definition is for fully spin-polarized quantities
638 : 3769728 : rs=rsfac*rhomot
639 : 3769728 : rhomo6=sqrt(rhomot)
640 : 3769728 : sqr_rs=sq_rsfac*rhomo6
641 : 3769728 : rhoo6=rho*rhomot*rhomot*rhomo6
642 : 3769728 : rsm1_2=sq_rsfac_inv*rhoo6
643 : 3769728 : drsdrho=-third*rs*rho_inv
644 : :
645 : 3769728 : ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
646 : 3769728 : ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
647 : 3769728 : ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
648 : 3769728 : ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
649 : : ! ec1_log=log( one + one / ec1_q1 )
650 : 3769728 : ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
651 : 3769728 : ecrs1=ec1_q0*ec1_log
652 : 3769728 : decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
653 : 3769728 : decrs1_drho=ecrs1+decrs1_drs*drsdrho*rho
654 : :
655 : : ! Store the LSDA corr energy and density derivative
656 : 3769728 : rhoecrs1_up=rho*ecrs1
657 : 3769728 : drhoecrs1_drhoup=decrs1_drho
658 : 3769728 : ss_up=ss
659 : 3769728 : dssupdrho=dssdrho
660 : 3769728 : dssupdg=dssdg
661 : :
662 : 3769728 : divcsig=one/(one+gammacsig*ss)
663 : 3769728 : ucsig=gammacsig*ss*divcsig
664 : 3769728 : ducsigdss=gammacsig*divcsig*(one-ss*gammacsig*divcsig)
665 : :
666 : 3769728 : gcsig=ccsig0+ucsig*(ccsig1+ucsig*(ccsig2+ucsig*(ccsig3+ucsig*ccsig4)))
667 : : dgcsigdss=(ccsig1+ucsig*(two*ccsig2+ucsig*(three*ccsig3+ucsig*four*ccsig4)))&
668 : 3769728 : & *ducsigdss
669 : :
670 : : ! DEBUG
671 : : ! gcsig=zero
672 : : ! dgcsigdss=zero
673 : : ! ENDDEBUG
674 : 3769728 : exc=exc+ecrs1*rho*gcsig
675 : : vxci(ipts,ispden)=vxci(ipts,ispden)+decrs1_drho*gcsig+&
676 : 3769728 : & ecrs1*rho*dgcsigdss*dssdrho
677 : 3769728 : dvxcdgr(ipts,ispden)=dvxcdgr(ipts,ispden)+ecrs1*rho*dgcsigdss*dssdg
678 : :
679 : 3769728 : rhoecrs1_dn=rhoecrs1_up
680 : 3769728 : drhoecrs1_drhodn=drhoecrs1_drhoup
681 : 3769728 : ss_dn=ss_up
682 : 3769728 : dssdndrho=dssupdrho
683 : 3769728 : dssdndg=dssupdg
684 : 3769728 : exc=exc*2
685 : :
686 : : ! -----------------------------------------------------------------------------
687 : : ! Then takes care of the LSD correlation part of the functional
688 : :
689 : 3769728 : rhotot=rhoarr(ipts)
690 : 3769728 : rhotmot=rhom1_3(ipts)
691 : 3769728 : rhotot_inv=rhotmot*rhotmot*rhotmot
692 : 3769728 : rhotmo6=sqrt(rhotmot)
693 : 3769728 : rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
694 : :
695 : : ! From now, the coding of the PW92 functional start. It is identical in xcpbe.f
696 : 3769728 : rs=rsfac*rhotmot
697 : 3769728 : sqr_rs=sq_rsfac*rhotmo6
698 : 3769728 : rsm1_2=sq_rsfac_inv*rhoto6
699 : :
700 : : ! Formulas A6-A8 of PW92LSD
701 : 3769728 : ec0_q0=-2.0d0*ec0_aa*(one+ec0_a1*rs)
702 : 3769728 : ec0_q1=2.0d0*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
703 : 3769728 : ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2.d0*ec0_b2+3.d0*ec0_b3*sqr_rs+4.d0*ec0_b4*rs)
704 : 3769728 : ec0_den=one/(ec0_q1*ec0_q1+ec0_q1)
705 : : ! ec0_log=log( one + one / ec0_q1 )
706 : 3769728 : ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
707 : 3769728 : ecrs0=ec0_q0*ec0_log
708 : 3769728 : decrs0_drs= -2.0d0*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
709 : :
710 : 3769728 : ecrs=ecrs0
711 : 3769728 : decrs_drs=decrs0_drs
712 : 3769728 : decrs_dzeta=zero
713 : 3769728 : zeta=zero
714 : :
715 : : ! At this point, the coding of the PW92 functional finishes.
716 : :
717 : : ! The correlation between different spin from HCTH is now computed
718 : : ! First, the part without gradient correction factor
719 : 3769728 : rhoecab=ecrs*rhotot-rhoecrs1_dn-rhoecrs1_up
720 : 3769728 : vxcadd=ecrs-rs*third*decrs_drs-zeta*decrs_dzeta
721 : 3769728 : drhoecab_drhoup=vxcadd+decrs_dzeta-drhoecrs1_drhoup
722 : 3769728 : drhoecab_drhodn=vxcadd-decrs_dzeta-drhoecrs1_drhodn
723 : :
724 : : ! Now, the gradient correction factor
725 : 3769728 : ssavg=half*(ss_up+ss_dn)
726 : 3769728 : divcab=one/(one+gammacab*ssavg)
727 : 3769728 : ucab=gammacab*ssavg*divcab
728 : 3769728 : ducabdss=gammacab*divcab*(one-ssavg*gammacab*divcab)
729 : :
730 : 3769728 : gcab=ccab0+ucab*(ccab1+ucab*(ccab2+ucab*(ccab3+ucab*ccab4)))
731 : : dgcabdss=(ccab1+ucab*(two*ccab2+ucab*(three*ccab3+ucab*four*ccab4)))&
732 : 3769728 : & *ducabdss
733 : :
734 : 3769728 : exc=exc+rhoecab*gcab
735 : :
736 : 3769728 : vxci(ipts,1)=vxci(ipts,1)+drhoecab_drhoup*gcab+rhoecab*dgcabdss*half*dssupdrho
737 : 3769728 : dvxcdgr(ipts,1)=dvxcdgr(ipts,1)+rhoecab*dgcabdss*half*dssupdg
738 : : ! If non spin-polarized, treat spin down contribution now, similar to spin up
739 : : ! vxci(ipts,2)=vxci(ipts,1)
740 : 3769728 : dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
741 : :
742 : : ! Final division by the total density, to give the energy density
743 : 3770715 : exci(ipts)=exc*rhotot_inv
744 : :
745 : : end do ! ipts=1,npts
746 : : end if
747 : :
748 [ + - ]: 278 : else if(nspden==2) then
749 : :
750 [ - + ]: 278 : if(order**2>1) then
751 : :
752 [ # # ]: 0 : do ipts=1,npts
753 : :
754 : : ! -----------------------------------------------------------------------
755 : : ! First take care of the spin-split part of the functional
756 : : exc=zero
757 [ # # ]: 0 : do ispden=1,nspden
758 : 0 : rho =rho_updn(ipts,ispden)
759 : 0 : rhomot=rho_updnm1_3(ipts,ispden)
760 : 0 : rho_inv=rhomot*rhomot*rhomot
761 : :
762 : : ! Exchange part
763 : 0 : ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
764 : : ! Note that this definition differs from the PBE one
765 : 0 : coeffss=rho_inv*rho_inv*rhomot*rhomot
766 : 0 : ss=grho2_updn(ipts,ispden)*coeffss
767 : 0 : dssdrho=-eight*third*ss*rho_inv
768 : 0 : dssdg=two*coeffss
769 : :
770 : 0 : divx=one/(one+gammax*ss)
771 : 0 : uxsig=gammax*ss*divx
772 : 0 : duxsigdss=gammax*divx*(one-ss*gammax*divx)
773 : :
774 : 0 : gxsig=cxsig0+uxsig*(cxsig1+uxsig*(cxsig2+uxsig*(cxsig3+uxsig*cxsig4)))
775 : : dgxsigdss=(cxsig1+uxsig*(two*cxsig2+uxsig*(three*cxsig3+uxsig*four*cxsig4)))&
776 : 0 : & *duxsigdss
777 : :
778 : 0 : exc=exc+ex_lsd*rho*gxsig
779 : 0 : vxci(ipts,ispden)=ex_lsd*(four_thirds*gxsig+rho*dgxsigdss*dssdrho)
780 : 0 : dvxcdgr(ipts,ispden)=ex_lsd*rho*dgxsigdss*dssdg
781 : :
782 : : ! Spin parallel correlation part
783 : : ! Note that this definition is for fully spin-polarized quantities
784 : 0 : rs=rsfac*rhomot
785 : 0 : rhomo6=sqrt(rhomot)
786 : 0 : sqr_rs=sq_rsfac*rhomo6
787 : 0 : rhoo6=rho*rhomot*rhomot*rhomo6
788 : 0 : rsm1_2=sq_rsfac_inv*rhoo6
789 : 0 : drsdrho=-third*rs*rho_inv
790 : :
791 : 0 : ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
792 : 0 : ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
793 : 0 : ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
794 : 0 : ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
795 : : ! ec1_log=log( one + one / ec1_q1 )
796 : 0 : ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
797 : 0 : ecrs1=ec1_q0*ec1_log
798 : 0 : decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
799 : 0 : decrs1_drho=ecrs1+decrs1_drs*drsdrho*rho
800 : :
801 : : ! Store the LSDA corr energy and density derivative
802 [ # # ]: 0 : if(ispden==1)then
803 : 0 : rhoecrs1_up=rho*ecrs1
804 : 0 : drhoecrs1_drhoup=decrs1_drho
805 : 0 : ss_up=ss
806 : 0 : dssupdrho=dssdrho
807 : 0 : dssupdg=dssdg
808 : : else
809 : 0 : rhoecrs1_dn=rho*ecrs1
810 : 0 : drhoecrs1_drhodn=decrs1_drho
811 : 0 : ss_dn=ss
812 : 0 : dssdndrho=dssdrho
813 : 0 : dssdndg=dssdg
814 : : end if
815 : :
816 : 0 : divcsig=one/(one+gammacsig*ss)
817 : 0 : ucsig=gammacsig*ss*divcsig
818 : 0 : ducsigdss=gammacsig*divcsig*(one-ss*gammacsig*divcsig)
819 : :
820 : 0 : gcsig=ccsig0+ucsig*(ccsig1+ucsig*(ccsig2+ucsig*(ccsig3+ucsig*ccsig4)))
821 : : dgcsigdss=(ccsig1+ucsig*(two*ccsig2+ucsig*(three*ccsig3+ucsig*four*ccsig4)))&
822 : 0 : & *ducsigdss
823 : :
824 : : ! DEBUG
825 : : ! gcsig=zero
826 : : ! dgcsigdss=zero
827 : : ! ENDDEBUG
828 : 0 : exc=exc+ecrs1*rho*gcsig
829 : : vxci(ipts,ispden)=vxci(ipts,ispden)+decrs1_drho*gcsig+&
830 : 0 : & ecrs1*rho*dgcsigdss*dssdrho
831 : 0 : dvxcdgr(ipts,ispden)=dvxcdgr(ipts,ispden)+ecrs1*rho*dgcsigdss*dssdg
832 : :
833 : : end do
834 : :
835 : : ! -----------------------------------------------------------------------------
836 : : ! Then takes care of the LSD correlation part of the functional
837 : :
838 : 0 : rhotot=rhoarr(ipts)
839 : 0 : rhotmot=rhom1_3(ipts)
840 : 0 : rhotot_inv=rhotmot*rhotmot*rhotmot
841 : 0 : rhotmo6=sqrt(rhotmot)
842 : 0 : rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
843 : :
844 : : ! From now, the coding of the PW92 functional start. It is identical in xcpbe.f
845 : 0 : rs=rsfac*rhotmot
846 : 0 : sqr_rs=sq_rsfac*rhotmo6
847 : 0 : rsm1_2=sq_rsfac_inv*rhoto6
848 : :
849 : : ! Formulas A6-A8 of PW92LSD
850 : 0 : ec0_q0=-2.0d0*ec0_aa*(one+ec0_a1*rs)
851 : 0 : ec0_q1=2.0d0*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
852 : 0 : ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2.d0*ec0_b2+3.d0*ec0_b3*sqr_rs+4.d0*ec0_b4*rs)
853 : 0 : ec0_den=one/(ec0_q1*ec0_q1+ec0_q1)
854 : : ! ec0_log=log( one + one / ec0_q1 )
855 : 0 : ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
856 : 0 : ecrs0=ec0_q0*ec0_log
857 : 0 : decrs0_drs= -2.0d0*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
858 : 0 : ec0_q1pp=half*ec0_aa*(-ec0_b1*rsm1_2**3+3.d0*ec0_b3*rsm1_2+8.d0*ec0_b4)
859 : : d2ecrs0_drs2= 4.0d0*ec0_aa*ec0_a1*ec0_q1p*ec0_den &
860 : : & -ec0_q0*ec0_q1pp*ec0_den &
861 : 0 : & +ec0_q0*ec0_q1p**2*ec0_den**2*(2.d0*ec0_q1+one)
862 : :
863 : 0 : mac_q0=-2.0d0*mac_aa*(one+mac_a1*rs)
864 : 0 : mac_q1=2.0d0*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
865 : 0 : mac_q1p=mac_aa*(mac_b1*rsm1_2+2.d0*mac_b2+3.d0*mac_b3*sqr_rs+4.d0*mac_b4*rs)
866 : 0 : mac_den=one/(mac_q1*mac_q1+mac_q1)
867 : 0 : mac_log=-log( mac_q1*mac_q1*mac_den )
868 : 0 : macrs=mac_q0*mac_log
869 : 0 : dmacrs_drs= -2.0d0*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
870 : :
871 : 0 : zeta=(rho_updn(ipts,1)-rho_updn(ipts,2))*rhotot_inv
872 : 0 : ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
873 : 0 : ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
874 : 0 : ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
875 : 0 : ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
876 : : ! ec1_log=log( one + one / ec1_q1 )
877 : 0 : ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
878 : 0 : ecrs1=ec1_q0*ec1_log
879 : 0 : decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
880 : :
881 : : ! alpha_zeta is introduced in order to remove singularities for fully
882 : : ! polarized systems.
883 : 0 : zetp_1_3=(one+zeta*alpha_zeta)*zetpm1_3(ipts)**2
884 : 0 : zetm_1_3=(one-zeta*alpha_zeta)*zetmm1_3(ipts)**2
885 : :
886 : : f_zeta=( (one+zeta*alpha_zeta2)*zetp_1_3 + &
887 : 0 : & (one-zeta*alpha_zeta2)*zetm_1_3 - 2.0d0 ) * factf_zeta
888 : 0 : fp_zeta=( zetp_1_3 - zetm_1_3 ) * factfp_zeta
889 : 0 : zeta4=zeta**4
890 : 0 : gcrs=ecrs1-ecrs0+macrs*fsec_inv
891 : : ! ecrs=ecrs0+f_zeta*(-macrs*(one-zeta4)*fsec_inv+(ecrs1-ecrs0)*zeta4)
892 : 0 : ecrs=ecrs0+f_zeta*(zeta4*gcrs-macrs*fsec_inv)
893 : :
894 : 0 : dgcrs_drs=decrs1_drs-decrs0_drs+dmacrs_drs*fsec_inv
895 : : ! decrs_drs=decrs0_drs+f_zeta*&
896 : : ! & (-dmacrs_drs*(one-zeta4)*fsec_inv+(decrs1_drs-decrs0_drs)*zeta4)
897 : 0 : decrs_drs=decrs0_drs+f_zeta*(zeta4*dgcrs_drs-dmacrs_drs*fsec_inv)
898 : 0 : dfzeta4_dzeta=4.0d0*zeta**3*f_zeta+fp_zeta*zeta4
899 : 0 : decrs_dzeta=dfzeta4_dzeta*gcrs-fp_zeta*macrs*fsec_inv
900 : :
901 : 0 : ec1_q1pp=half*ec1_aa*(-ec1_b1*rsm1_2**3+3.d0*ec1_b3*rsm1_2+8.d0*ec1_b4)
902 : : d2ecrs1_drs2= 4.0d0*ec1_aa*ec1_a1*ec1_q1p*ec1_den &
903 : : & -ec1_q0*ec1_q1pp*ec1_den &
904 : 0 : & +ec1_q0*ec1_q1p**2*ec1_den**2*(2.d0*ec1_q1+one)
905 : :
906 : 0 : mac_q1pp=half*mac_aa*(-mac_b1*rsm1_2**3+3.d0*mac_b3*rsm1_2+8.d0*mac_b4)
907 : : d2macrs_drs2= 4.0d0*mac_aa*mac_a1*mac_q1p*mac_den &
908 : : & -mac_q0*mac_q1pp*mac_den &
909 : 0 : & +mac_q0*mac_q1p**2*mac_den**2*(2.d0*mac_q1+one)
910 : :
911 : 0 : d2gcrs_drs2=d2ecrs1_drs2-d2ecrs0_drs2+d2macrs_drs2*fsec_inv
912 : 0 : fpp_zeta=(zetpm1_3(ipts)**2+zetmm1_3(ipts)**2) * factfpp_zeta
913 : : d2fzeta4_dzeta2=12.0d0*zeta**2*f_zeta &
914 : : & + 8.0d0*zeta**3*fp_zeta &
915 : 0 : & + zeta4 *fpp_zeta
916 : :
917 : : d2ecrs_drs2=d2ecrs0_drs2+&
918 : 0 : & f_zeta*(zeta4*d2gcrs_drs2-d2macrs_drs2*fsec_inv)
919 : 0 : d2ecrs_drsdzeta=dfzeta4_dzeta*dgcrs_drs-fp_zeta*dmacrs_drs*fsec_inv
920 : 0 : d2ecrs_dzeta2=d2fzeta4_dzeta2*gcrs-fpp_zeta*macrs*fsec_inv
921 : :
922 : :
923 : : ! At this point, the coding of the PW92 functional finishes.
924 : :
925 : : ! The correlation between different spin from HCTH is now computed
926 : : ! First, the part without gradient correction factor
927 : 0 : rhoecab=ecrs*rhotot-rhoecrs1_dn-rhoecrs1_up
928 : 0 : vxcadd=ecrs-rs*third*decrs_drs-zeta*decrs_dzeta
929 : 0 : drhoecab_drhoup=vxcadd+decrs_dzeta-drhoecrs1_drhoup
930 : 0 : drhoecab_drhodn=vxcadd-decrs_dzeta-drhoecrs1_drhodn
931 : :
932 : : ! Now, the gradient correction factor
933 : 0 : ssavg=half*(ss_up+ss_dn)
934 : 0 : divcab=one/(one+gammacab*ssavg)
935 : 0 : ucab=gammacab*ssavg*divcab
936 : 0 : ducabdss=gammacab*divcab*(one-ssavg*gammacab*divcab)
937 : :
938 : 0 : gcab=ccab0+ucab*(ccab1+ucab*(ccab2+ucab*(ccab3+ucab*ccab4)))
939 : : dgcabdss=(ccab1+ucab*(two*ccab2+ucab*(three*ccab3+ucab*four*ccab4)))&
940 : 0 : & *ducabdss
941 : :
942 : 0 : exc=exc+rhoecab*gcab
943 : :
944 : 0 : vxci(ipts,1)=vxci(ipts,1)+drhoecab_drhoup*gcab+rhoecab*dgcabdss*half*dssupdrho
945 : 0 : dvxcdgr(ipts,1)=dvxcdgr(ipts,1)+rhoecab*dgcabdss*half*dssupdg
946 : 0 : vxci(ipts,2)=vxci(ipts,2)+drhoecab_drhodn*gcab+rhoecab*dgcabdss*half*dssdndrho
947 : 0 : dvxcdgr(ipts,2)=dvxcdgr(ipts,2)+rhoecab*dgcabdss*half*dssdndg
948 : :
949 : : ! Final division by the total density, to give the energy density
950 : 0 : exci(ipts)=exc*rhotot_inv
951 : :
952 : : end do ! ipts=1,npts
953 : :
954 : : else
955 : :
956 [ + + ]: 1032470 : do ipts=1,npts
957 : :
958 : : ! -----------------------------------------------------------------------
959 : : ! First take care of the spin-split part of the functional
960 : : exc=zero
961 [ + + ]: 3096576 : do ispden=1,nspden
962 : 2064384 : rho =rho_updn(ipts,ispden)
963 : 2064384 : rhomot=rho_updnm1_3(ipts,ispden)
964 : 2064384 : rho_inv=rhomot*rhomot*rhomot
965 : :
966 : : ! Exchange part
967 : 2064384 : ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
968 : : ! Note that this definition differs from the PBE one
969 : 2064384 : coeffss=rho_inv*rho_inv*rhomot*rhomot
970 : 2064384 : ss=grho2_updn(ipts,ispden)*coeffss
971 : 2064384 : dssdrho=-eight*third*ss*rho_inv
972 : 2064384 : dssdg=two*coeffss
973 : :
974 : 2064384 : divx=one/(one+gammax*ss)
975 : 2064384 : uxsig=gammax*ss*divx
976 : 2064384 : duxsigdss=gammax*divx*(one-ss*gammax*divx)
977 : :
978 : 2064384 : gxsig=cxsig0+uxsig*(cxsig1+uxsig*(cxsig2+uxsig*(cxsig3+uxsig*cxsig4)))
979 : : dgxsigdss=(cxsig1+uxsig*(two*cxsig2+uxsig*(three*cxsig3+uxsig*four*cxsig4)))&
980 : 2064384 : & *duxsigdss
981 : :
982 : 2064384 : exc=exc+ex_lsd*rho*gxsig
983 : 2064384 : vxci(ipts,ispden)=ex_lsd*(four_thirds*gxsig+rho*dgxsigdss*dssdrho)
984 : 2064384 : dvxcdgr(ipts,ispden)=ex_lsd*rho*dgxsigdss*dssdg
985 : :
986 : : ! Spin parallel correlation part
987 : : ! Note that this definition is for fully spin-polarized quantities
988 : 2064384 : rs=rsfac*rhomot
989 : 2064384 : rhomo6=sqrt(rhomot)
990 : 2064384 : sqr_rs=sq_rsfac*rhomo6
991 : 2064384 : rhoo6=rho*rhomot*rhomot*rhomo6
992 : 2064384 : rsm1_2=sq_rsfac_inv*rhoo6
993 : 2064384 : drsdrho=-third*rs*rho_inv
994 : :
995 : 2064384 : ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
996 : 2064384 : ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
997 : 2064384 : ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
998 : 2064384 : ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
999 : : ! ec1_log=log( one + one / ec1_q1 )
1000 : 2064384 : ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
1001 : 2064384 : ecrs1=ec1_q0*ec1_log
1002 : 2064384 : decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
1003 : 2064384 : decrs1_drho=ecrs1+decrs1_drs*drsdrho*rho
1004 : :
1005 : : ! Store the LSDA corr energy and density derivative
1006 [ + + ]: 2064384 : if(ispden==1)then
1007 : 1032192 : rhoecrs1_up=rho*ecrs1
1008 : 1032192 : drhoecrs1_drhoup=decrs1_drho
1009 : 1032192 : ss_up=ss
1010 : 1032192 : dssupdrho=dssdrho
1011 : 1032192 : dssupdg=dssdg
1012 : : else
1013 : 1032192 : rhoecrs1_dn=rho*ecrs1
1014 : 1032192 : drhoecrs1_drhodn=decrs1_drho
1015 : 1032192 : ss_dn=ss
1016 : 1032192 : dssdndrho=dssdrho
1017 : 1032192 : dssdndg=dssdg
1018 : : end if
1019 : :
1020 : 2064384 : divcsig=one/(one+gammacsig*ss)
1021 : 2064384 : ucsig=gammacsig*ss*divcsig
1022 : 2064384 : ducsigdss=gammacsig*divcsig*(one-ss*gammacsig*divcsig)
1023 : :
1024 : 2064384 : gcsig=ccsig0+ucsig*(ccsig1+ucsig*(ccsig2+ucsig*(ccsig3+ucsig*ccsig4)))
1025 : : dgcsigdss=(ccsig1+ucsig*(two*ccsig2+ucsig*(three*ccsig3+ucsig*four*ccsig4)))&
1026 : 2064384 : & *ducsigdss
1027 : :
1028 : : ! DEBUG
1029 : : ! gcsig=zero
1030 : : ! dgcsigdss=zero
1031 : : ! ENDDEBUG
1032 : 2064384 : exc=exc+ecrs1*rho*gcsig
1033 : : vxci(ipts,ispden)=vxci(ipts,ispden)+decrs1_drho*gcsig+&
1034 : 2064384 : & ecrs1*rho*dgcsigdss*dssdrho
1035 : 3096576 : dvxcdgr(ipts,ispden)=dvxcdgr(ipts,ispden)+ecrs1*rho*dgcsigdss*dssdg
1036 : :
1037 : : end do
1038 : :
1039 : : ! -----------------------------------------------------------------------------
1040 : : ! Then takes care of the LSD correlation part of the functional
1041 : :
1042 : 1032192 : rhotot=rhoarr(ipts)
1043 : 1032192 : rhotmot=rhom1_3(ipts)
1044 : 1032192 : rhotot_inv=rhotmot*rhotmot*rhotmot
1045 : 1032192 : rhotmo6=sqrt(rhotmot)
1046 : 1032192 : rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
1047 : :
1048 : : ! From now, the coding of the PW92 functional start. It is identical in xcpbe.f
1049 : 1032192 : rs=rsfac*rhotmot
1050 : 1032192 : sqr_rs=sq_rsfac*rhotmo6
1051 : 1032192 : rsm1_2=sq_rsfac_inv*rhoto6
1052 : :
1053 : : ! Formulas A6-A8 of PW92LSD
1054 : 1032192 : ec0_q0=-2.0d0*ec0_aa*(one+ec0_a1*rs)
1055 : 1032192 : ec0_q1=2.0d0*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
1056 : 1032192 : ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2.d0*ec0_b2+3.d0*ec0_b3*sqr_rs+4.d0*ec0_b4*rs)
1057 : 1032192 : ec0_den=one/(ec0_q1*ec0_q1+ec0_q1)
1058 : : ! ec0_log=log( one + one / ec0_q1 )
1059 : 1032192 : ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
1060 : 1032192 : ecrs0=ec0_q0*ec0_log
1061 : 1032192 : decrs0_drs= -2.0d0*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
1062 : :
1063 : 1032192 : mac_q0=-2.0d0*mac_aa*(one+mac_a1*rs)
1064 : 1032192 : mac_q1=2.0d0*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
1065 : 1032192 : mac_q1p=mac_aa*(mac_b1*rsm1_2+2.d0*mac_b2+3.d0*mac_b3*sqr_rs+4.d0*mac_b4*rs)
1066 : 1032192 : mac_den=one/(mac_q1*mac_q1+mac_q1)
1067 : 1032192 : mac_log=-log( mac_q1*mac_q1*mac_den )
1068 : 1032192 : macrs=mac_q0*mac_log
1069 : 1032192 : dmacrs_drs= -2.0d0*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
1070 : :
1071 : 1032192 : zeta=(rho_updn(ipts,1)-rho_updn(ipts,2))*rhotot_inv
1072 : 1032192 : ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
1073 : 1032192 : ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
1074 : 1032192 : ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
1075 : 1032192 : ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
1076 : : ! ec1_log=log( one + one / ec1_q1 )
1077 : 1032192 : ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
1078 : 1032192 : ecrs1=ec1_q0*ec1_log
1079 : 1032192 : decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
1080 : :
1081 : : ! alpha_zeta is introduced in order to remove singularities for fully
1082 : : ! polarized systems.
1083 : 1032192 : zetp_1_3=(one+zeta*alpha_zeta)*zetpm1_3(ipts)**2
1084 : 1032192 : zetm_1_3=(one-zeta*alpha_zeta)*zetmm1_3(ipts)**2
1085 : :
1086 : : f_zeta=( (one+zeta*alpha_zeta2)*zetp_1_3 + &
1087 : 1032192 : & (one-zeta*alpha_zeta2)*zetm_1_3 - 2.0d0 ) * factf_zeta
1088 : 1032192 : fp_zeta=( zetp_1_3 - zetm_1_3 ) * factfp_zeta
1089 : 1032192 : zeta4=zeta**4
1090 : 1032192 : gcrs=ecrs1-ecrs0+macrs*fsec_inv
1091 : : ! ecrs=ecrs0+f_zeta*(-macrs*(one-zeta4)*fsec_inv+(ecrs1-ecrs0)*zeta4)
1092 : 1032192 : ecrs=ecrs0+f_zeta*(zeta4*gcrs-macrs*fsec_inv)
1093 : :
1094 : 1032192 : dgcrs_drs=decrs1_drs-decrs0_drs+dmacrs_drs*fsec_inv
1095 : : ! decrs_drs=decrs0_drs+f_zeta*&
1096 : : ! & (-dmacrs_drs*(one-zeta4)*fsec_inv+(decrs1_drs-decrs0_drs)*zeta4)
1097 : 1032192 : decrs_drs=decrs0_drs+f_zeta*(zeta4*dgcrs_drs-dmacrs_drs*fsec_inv)
1098 : 1032192 : dfzeta4_dzeta=4.0d0*zeta**3*f_zeta+fp_zeta*zeta4
1099 : 1032192 : decrs_dzeta=dfzeta4_dzeta*gcrs-fp_zeta*macrs*fsec_inv
1100 : :
1101 : : ! At this point, the coding of the PW92 functional finishes.
1102 : :
1103 : : ! The correlation between different spin from HCTH is now computed
1104 : : ! First, the part without gradient correction factor
1105 : 1032192 : rhoecab=ecrs*rhotot-rhoecrs1_dn-rhoecrs1_up
1106 : 1032192 : vxcadd=ecrs-rs*third*decrs_drs-zeta*decrs_dzeta
1107 : 1032192 : drhoecab_drhoup=vxcadd+decrs_dzeta-drhoecrs1_drhoup
1108 : 1032192 : drhoecab_drhodn=vxcadd-decrs_dzeta-drhoecrs1_drhodn
1109 : :
1110 : : ! Now, the gradient correction factor
1111 : 1032192 : ssavg=half*(ss_up+ss_dn)
1112 : 1032192 : divcab=one/(one+gammacab*ssavg)
1113 : 1032192 : ucab=gammacab*ssavg*divcab
1114 : 1032192 : ducabdss=gammacab*divcab*(one-ssavg*gammacab*divcab)
1115 : :
1116 : 1032192 : gcab=ccab0+ucab*(ccab1+ucab*(ccab2+ucab*(ccab3+ucab*ccab4)))
1117 : : dgcabdss=(ccab1+ucab*(two*ccab2+ucab*(three*ccab3+ucab*four*ccab4)))&
1118 : 1032192 : & *ducabdss
1119 : :
1120 : 1032192 : exc=exc+rhoecab*gcab
1121 : :
1122 : 1032192 : vxci(ipts,1)=vxci(ipts,1)+drhoecab_drhoup*gcab+rhoecab*dgcabdss*half*dssupdrho
1123 : 1032192 : dvxcdgr(ipts,1)=dvxcdgr(ipts,1)+rhoecab*dgcabdss*half*dssupdg
1124 : 1032192 : vxci(ipts,2)=vxci(ipts,2)+drhoecab_drhodn*gcab+rhoecab*dgcabdss*half*dssdndrho
1125 : 1032192 : dvxcdgr(ipts,2)=dvxcdgr(ipts,2)+rhoecab*dgcabdss*half*dssdndg
1126 : :
1127 : : ! Final division by the total density, to give the energy density
1128 : 1032470 : exci(ipts)=exc*rhotot_inv
1129 : :
1130 : : end do ! ipts=1,npts
1131 : :
1132 : : end if
1133 : :
1134 : : else
1135 : : ! Disallowed value for nspden
1136 : : write(message, '(3a,i0)' )&
1137 : 0 : & ' Argument nspden must be 1 or 2; ',ch10,&
1138 : 0 : & ' Value provided as argument was ',nspden
1139 : 0 : ABI_BUG(message)
1140 : : end if
1141 : :
1142 : : !DEBUG
1143 : : !Finite-difference debugging, do not take away
1144 : : !Beware that dvxcdgr(:,3) no longer exists
1145 : : !if(debug/=0)then
1146 : : !do ipts=1,npts,5
1147 : :
1148 : : !rho=rho_updn(ipts,1)+rho_updn(ipts,2)
1149 : : !write(std_out,'(a,i5,a,es16.8)' ) ' Point number',ipts,' with rho=',rho
1150 : :
1151 : : !! For rho
1152 : : !if(debug==1)then
1153 : : !write(std_out,'(3es16.8)' )exci(ipts)*rho,vxci(ipts,1),vxci(ipts,2)
1154 : : !else
1155 : : !! For grho2
1156 : : !write(std_out,'(4es16.8)' )exci(ipts)*rho,dvxcdgr(ipts,1),&
1157 : : !& dvxcdgr(ipts,2),dvxcdgr(ipts,3)
1158 : : !end if
1159 : :
1160 : : !if(debug==1)then
1161 : : !! For rho
1162 : : !write(std_out,'(3es16.8)' )exci(ipts)*rho,&
1163 : : !& ( exci(ipts+1)*(rho+delta) - exci(ipts+2)*(rho-delta) )/2.d0/delta,&
1164 : : !& ( exci(ipts+3)*(rho+delta) - exci(ipts+4)*(rho-delta) )/2.d0/delta
1165 : : !write(std_out,'(3es16.8)' )&
1166 : : !& ( vxci(ipts+1,1) - vxci(ipts+2,1) )/2.d0/delta,&
1167 : : !& ( vxci(ipts+3,1) - vxci(ipts+4,1) )/2.d0/delta,&
1168 : : !& ( vxci(ipts+3,2) - vxci(ipts+4,2) )/2.d0/delta
1169 : : !write(std_out,'(4es16.8)' )&
1170 : : !& ( dvxcdgr(ipts+1,1) - dvxcdgr(ipts+2,1) )/2.d0/delta,&
1171 : : !& ( dvxcdgr(ipts+3,2) - dvxcdgr(ipts+4,2) )/2.d0/delta,&
1172 : : !& ( dvxcdgr(ipts+1,3) - dvxcdgr(ipts+2,3) )/2.d0/delta,&
1173 : : !& ( dvxcdgr(ipts+3,3) - dvxcdgr(ipts+4,3) )/2.d0/delta
1174 : : !else
1175 : : !! For grho2 (should distinguish exchange and correlation ...)
1176 : : !grr=sqrt(grho2_updn(ipts,1)) ! Analysis of exchange
1177 : : !grr=sqrt(grho2_updn(ipts,3)) ! Analysis of correlation
1178 : : !write(std_out,'(3es16.8)' )exci(ipts)*rho,&
1179 : : !& ( exci(ipts+1)*rho - exci(ipts+2)*rho )/2.d0/delta/grr,&
1180 : : !& ( exci(ipts+3)*rho - exci(ipts+4)*rho )/2.d0/delta/grr
1181 : : !write(std_out,'(3es16.8)' )&
1182 : : !& ( vxci(ipts+1,1) - vxci(ipts+2,1) )/2.d0/delta/grr,&
1183 : : !& ( vxci(ipts+3,1) - vxci(ipts+4,1) )/2.d0/delta/grr,&
1184 : : !& ( vxci(ipts+3,2) - vxci(ipts+4,2) )/2.d0/delta/grr
1185 : : !write(std_out,'(4es16.8)' )&
1186 : : !& ( dvxcdgr(ipts+1,1) - dvxcdgr(ipts+2,1) )/2.d0/delta/grr,&
1187 : : !& ( dvxcdgr(ipts+3,2) - dvxcdgr(ipts+4,2) )/2.d0/delta/grr,&
1188 : : !& ( dvxcdgr(ipts+1,3) - dvxcdgr(ipts+2,3) )/2.d0/delta/grr,&
1189 : : !& ( dvxcdgr(ipts+3,3) - dvxcdgr(ipts+4,3) )/2.d0/delta/grr
1190 : : !end if
1191 : : !end do
1192 : : !stop
1193 : : !end if
1194 : : !ENDDEBUG
1195 : :
1196 [ - + ]: 1265 : ABI_FREE(rhoarr)
1197 [ - + ]: 1265 : ABI_FREE(rhom1_3)
1198 [ - + ]: 1265 : ABI_FREE(rho_updnm1_3)
1199 [ + + ]: 1265 : if(nspden==2) then
1200 [ - + ]: 278 : ABI_FREE(zetm)
1201 [ - + ]: 278 : ABI_FREE(zetmm1_3)
1202 [ - + ]: 278 : ABI_FREE(zetp)
1203 [ - + ]: 278 : ABI_FREE(zetpm1_3)
1204 : : end if
1205 : :
1206 : : !DEBUG
1207 : : !write(std_out,*)' xchcth : exit'
1208 : : !write(std_out,*)' nspden=',nspden
1209 : : !if(order==2)stop
1210 : : !ENDDEBUG
1211 : :
1212 [ - + - + : 1265 : end subroutine xchcth
- + - + ]
1213 : : !!***
1214 : :
1215 : : end module m_xchcth
1216 : : !!***
|