The Elk Code
fxc_pwca.f90
Go to the documentation of this file.
1 
2 ! Copyright (C) 2011 J. K. Dewhurst, S. Sharma and E. K. U. Gross.
3 ! This file is distributed under the terms of the GNU Lesser General Public
4 ! License. See the file COPYING for license details.
5 
6 subroutine fxc_pwca(n,rhoup,rhodn,fxcuu,fxcud,fxcdd)
7 implicit none
8 ! arguments
9 integer, intent(in) :: n
10 real(8), intent(in) :: rhoup(n)
11 real(8), intent(in) :: rhodn(n)
12 real(8), intent(out) :: fxcuu(n)
13 real(8), intent(out) :: fxcud(n)
14 real(8), intent(out) :: fxcdd(n)
15 ! local variables
16 integer i
17 real(8), parameter :: pi=3.1415926535897932385d0
18 real(8), parameter :: thrd=1.d0/3.d0, thrd4=4.d0/3.d0
19 real(8), parameter :: d2f0=1.709921d0
20 real(8), parameter :: a(3)=[ 0.0310907d0, 0.01554535d0, 0.0168869d0 ]
21 real(8), parameter :: a1(3)=[ 0.21370d0, 0.20548d0, 0.11125d0 ]
22 real(8), parameter :: b1(3)=[ 7.5957d0, 14.1189d0, 10.357d0 ]
23 real(8), parameter :: b2(3)=[ 3.5876d0, 6.1977d0, 3.6231d0 ]
24 real(8), parameter :: b3(3)=[ 1.6382d0, 3.3662d0, 0.88026d0 ]
25 real(8), parameter :: b4(3)=[ 0.49294d0, 0.62517d0, 0.49671d0 ]
26 real(8) p1,p2,p3,rup,rdn,r,ri,ri2,ri3
27 real(8) rs,rs2,rs12,rs32,rsi,rs12i,rs32i
28 real(8) mz,z,z2,z3,z4,fz,dfz,d2fz
29 real(8) drs,d2rs,dzu,d2zu,dzd,d2zd,d2zud
30 real(8) ders,d2ers,dez,d2ez,d2ersz
31 real(8) deu,d2eu,ded,d2ed,d2eud,ex
32 real(8) ec0,dec0,d2ec0,ec1,dec1,d2ec1
33 real(8) ac,dac,d2ac,a2,dt1,d2t1,dt2,d2t2
34 real(8) t1,t2,t3,t4,t5,t6,t7,t8
35 if (n < 1) then
36  write(*,*)
37  write(*,'("Error(fxc_pwca): n < 1 : ",I8)') n
38  write(*,*)
39  stop
40 end if
41 ! prefactors
42 t1=3.d0/(4.d0*pi)
43 p1=t1**thrd
44 p2=t1*(9.d0*pi/4.d0)**thrd
45 p3=1.d0/(2.d0**thrd4-2.d0)
46 do i=1,n
47  rup=rhoup(i); rdn=rhodn(i)
48 ! total density
49  r=rup+rdn
50  if ((rup < 0.d0).or.(rdn < 0.d0).or.(r < 1.d-20)) then
51  fxcuu(i)=0.d0
52  fxcud(i)=0.d0
53  fxcdd(i)=0.d0
54  cycle
55  end if
56  ri=1.d0/r
57  ri2=ri**2
58  ri3=ri2*ri
59  rs=p1*ri**thrd
60  rs2=rs**2
61  rs12=sqrt(rs)
62  rs32=rs12*rs
63  rsi=1.d0/rs
64  rs12i=1.d0/rs12
65  rs32i=1.d0/rs32
66  mz=rup-rdn
67  z=mz/r
68  z2=z**2
69  z3=z2*z
70  z4=z3*z
71 ! drs/drup = drs/drdn = drs/drho
72  drs=-thrd*rs*ri
73 ! d²rs/drup² = d²rs/drn² = d²rs/drho²
74  d2rs=-thrd4*drs*ri
75 ! dz/drup, dz/drdn
76  t1=mz*ri2
77  dzu=ri-t1
78  dzd=-ri-t1
79 ! d²z/drup², d²z/drdn², d²z/drup*drdn
80  t1=2.d0*mz*ri3
81  t2=2.d0*ri2
82  d2zu=t1-t2
83  d2zd=t1+t2
84  d2zud=t1
85 !------------------!
86 ! exchange !
87 !------------------!
88  t1=-p2*rsi/2.d0
89  t2=1.d0+z
90  t3=1.d0-z
91  t4=t2**thrd4
92  t5=t3**thrd4
93  t6=t4+t5
94 ! exchange energy density
95  ex=t1*t6
96 ! dex/drs
97  ders=-ex*rsi
98 ! d²ex/drs²
99  d2ers=-2.d0*ders*rsi
100 ! f(z)
101  fz=p3*(t6-2.d0)
102 ! dex/dz
103  t4=t4/t2
104  t5=t5/t3
105  t6=t4-t5
106  t7=thrd4*t6
107  dez=t1*t7
108 ! df/dz
109  dfz=p3*t7
110 ! d²ex/dz²
111  t4=t4/t2
112  t5=t5/t3
113  t6=t4+t5
114  t7=thrd4*thrd*t6
115  d2ez=t1*t7
116 ! d²f/dz²
117  d2fz=p3*t7
118 ! d²ex/drs*dz
119  d2ersz=-dez*rsi
120 ! dex/drup, dex/drdn
121  t1=ders*drs
122  deu=t1+dez*dzu
123  ded=t1+dez*dzd
124 ! d²ex/drup²
125  t1=d2ers*drs
126  t2=d2ersz*drs
127  t3=ders*d2rs
128  t4=(t1+d2ersz*dzu)*drs+t3
129  t5=t2+d2ez*dzu
130  d2eu=t4+t5*dzu+dez*d2zu
131 ! d²ex/drdn²
132  d2ed=(t1+d2ersz*dzd)*drs+t3+(t2+d2ez*dzd)*dzd+dez*d2zd
133 ! d²ex/drup*drdn
134  d2eud=t4+t5*dzd+dez*d2zud
135 ! calculate f_xc
136  fxcuu(i)=2.d0*deu+r*d2eu
137  fxcud(i)=deu+ded+r*d2eud
138  fxcdd(i)=2.d0*ded+r*d2ed
139 !---------------------!
140 ! correlation !
141 !---------------------!
142 ! ec(rs,0)
143  a2=2.d0*a(1)
144  t1=a2*(b1(1)*rs12+b2(1)*rs+b3(1)*rs32+b4(1)*rs2)
145  dt1=a2*(0.5d0*b1(1)*rs12i+b2(1)+1.5d0*b3(1)*rs12+2.d0*b4(1)*rs)
146  d2t1=a2*(-0.25d0*b1(1)*rs32i+0.75d0*b3(1)*rs12i+2.d0*b4(1))
147  t3=1.d0/t1
148  t4=t3**2
149  t2=1.d0+t3
150  dt2=-dt1*t4
151  d2t2=t4*(2.d0*t3*dt1**2-d2t1)
152  t3=1.d0/t2
153  t4=1.d0+a1(1)*rs
154  t5=log(t2)
155  ec0=-a2*t4*t5
156  dec0=-a2*(a1(1)*t5+t4*t3*dt2)
157  d2ec0=-a2*(2.d0*a1(1)*t3*dt2+t4*t3*(d2t2-t3*dt2**2))
158 ! ec(rs,1)
159  a2=2.d0*a(2)
160  t1=a2*(b1(2)*rs12+b2(2)*rs+b3(2)*rs32+b4(2)*rs2)
161  dt1=a2*(0.5d0*b1(2)*rs12i+b2(2)+1.5d0*b3(2)*rs12+2.d0*b4(2)*rs)
162  d2t1=a2*(-0.25d0*b1(2)*rs32i+0.75d0*b3(2)*rs12i+2.d0*b4(2))
163  t3=1.d0/t1
164  t4=t3**2
165  t2=1.d0+t3
166  dt2=-dt1*t4
167  d2t2=t4*(2.d0*t3*dt1**2-d2t1)
168  t3=1.d0/t2
169  t4=1.d0+a1(2)*rs
170  t5=log(t2)
171  ec1=-a2*t4*t5
172  dec1=-a2*(a1(2)*t5+t4*t3*dt2)
173  d2ec1=-a2*(2.d0*a1(2)*t3*dt2+t4*t3*(d2t2-t3*dt2**2))
174 ! ac(rs)
175  a2=2.d0*a(3)
176  t1=a2*(b1(3)*rs12+b2(3)*rs+b3(3)*rs32+b4(3)*rs2)
177  dt1=a2*(0.5d0*b1(3)*rs12i+b2(3)+1.5d0*b3(3)*rs12+2.d0*b4(3)*rs)
178  d2t1=a2*(-0.25d0*b1(3)*rs32i+0.75d0*b3(3)*rs12i+2.d0*b4(3))
179  t3=1.d0/t1
180  t4=t3**2
181  t2=1.d0+t3
182  dt2=-dt1*t4
183  d2t2=t4*(2.d0*t3*dt1**2-d2t1)
184  t3=1.d0/t2
185  t4=1.d0+a1(3)*rs
186  t5=log(t2)
187  ac=a2*t4*t5
188  dac=a2*(a1(3)*t5+t4*t3*dt2)
189  d2ac=a2*(2.d0*a1(3)*t3*dt2+t4*t3*(d2t2-t3*dt2**2))
190 ! correlation energy density derivatives
191  t1=1.d0-z4
192  t2=(fz/d2f0)*t1
193  t3=ec1-ec0
194  t4=fz*z4
195 ! dec/drs
196  t5=dec1-dec0
197  ders=dec0+dac*t2+t5*t4
198 ! d²ec/drs²
199  t6=d2ec1-d2ec0
200  d2ers=d2ec0+d2ac*t2+t6*t4
201 ! dec/dz
202  t4=ac/d2f0
203  t6=4.d0*fz*z3
204  t7=dfz*t1-t6
205  t8=dfz*z4+t6
206  dez=t4*t7+t3*t8
207 ! d²ec/drs*dz
208  d2ersz=(dac/d2f0)*t7+t5*t8
209 ! d²ec/dz²
210  t7=8.d0*dfz*z3
211  t8=12.d0*fz*z2
212  d2ez=t4*(d2fz*t1-t7-t8)+t3*(d2fz*z4+t7+t8)
213 ! dec/drup, dec/drdn
214  t1=ders*drs
215  deu=t1+dez*dzu
216  ded=t1+dez*dzd
217 ! d²ec/drup²
218  t1=d2ers*drs
219  t2=d2ersz*drs
220  t3=ders*d2rs
221  t4=(t1+d2ersz*dzu)*drs+t3
222  t5=t2+d2ez*dzu
223  d2eu=t4+t5*dzu+dez*d2zu
224 ! d²ec/drdn²
225  d2ed=(t1+d2ersz*dzd)*drs+t3+(t2+d2ez*dzd)*dzd+dez*d2zd
226 ! d²ec/drup*drdn
227  d2eud=t4+t5*dzd+dez*d2zud
228 ! calculate f_xc
229  fxcuu(i)=fxcuu(i)+2.d0*deu+r*d2eu
230  fxcud(i)=fxcud(i)+deu+ded+r*d2eud
231  fxcdd(i)=fxcdd(i)+2.d0*ded+r*d2ed
232 end do
233 end subroutine
234 
subroutine fxc_pwca(n, rhoup, rhodn, fxcuu, fxcud, fxcdd)
Definition: fxc_pwca.f90:7