The Elk Code
xc_pwca.f90
Go to the documentation of this file.
1 
2 ! Copyright (C) 2002-2011 J. K. Dewhurst, S. Sharma and C. Ambrosch-Draxl.
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 !BOP
7 ! !ROUTINE: xc_pwca
8 ! !INTERFACE:
9 subroutine xc_pwca(n,rhoup,rhodn,ex,ec,vxup,vxdn,vcup,vcdn)
10 ! !INPUT/OUTPUT PARAMETERS:
11 ! n : number of density points (in,integer)
12 ! rhoup : spin-up charge density (in,real(n))
13 ! rhodn : spin-down charge density (in,real(n))
14 ! ex : exchange energy density (out,real(n))
15 ! ec : correlation energy density (out,real(n))
16 ! vxup : spin-up exchange potential (out,real(n))
17 ! vxdn : spin-down exchange potential (out,real(n))
18 ! vcup : spin-up correlation potential (out,real(n))
19 ! vcdn : spin-down correlation potential (out,real(n))
20 ! !DESCRIPTION:
21 ! Spin-polarised exchange-correlation potential and energy of the Perdew-Wang
22 ! parameterisation of the Ceperley-Alder electron gas: {\it Phys. Rev. B}
23 ! {\bf 45}, 13244 (1992) and {\it Phys. Rev. Lett.} {\bf 45}, 566 (1980).
24 !
25 ! !REVISION HISTORY:
26 ! Created January 2004 (JKD)
27 ! Rewrote, October 2011 (JKD)
28 !EOP
29 !BOC
30 implicit none
31 ! arguments
32 integer, intent(in) :: n
33 real(8), intent(in) :: rhoup(n),rhodn(n)
34 real(8), intent(out) :: ex(n),ec(n)
35 real(8), intent(out) :: vxup(n),vxdn(n)
36 real(8), intent(out) :: vcup(n),vcdn(n)
37 ! local variables
38 integer i
39 real(8), parameter :: pi=3.1415926535897932385d0
40 real(8), parameter :: thrd=1.d0/3.d0, thrd4=4.d0/3.d0
41 real(8), parameter :: d2f0=1.709921d0
42 real(8), parameter :: a(3)=[ 0.0310907d0, 0.01554535d0, 0.0168869d0 ]
43 real(8), parameter :: a1(3)=[ 0.21370d0, 0.20548d0, 0.11125d0 ]
44 real(8), parameter :: b1(3)=[ 7.5957d0, 14.1189d0, 10.357d0 ]
45 real(8), parameter :: b2(3)=[ 3.5876d0, 6.1977d0, 3.6231d0 ]
46 real(8), parameter :: b3(3)=[ 1.6382d0, 3.3662d0, 0.88026d0 ]
47 real(8), parameter :: b4(3)=[ 0.49294d0, 0.62517d0, 0.49671d0 ]
48 real(8) p1,p2,p3,rup,rdn,r,ri,ri2
49 real(8) rs,rs2,rs12,rs32,rsi,rs12i
50 real(8) mz,z,z3,z4,drs,dzu,dzd
51 real(8) fz,dfz,ders,dez,deu,ded
52 real(8) a2,ec0,dec0,ec1,dec1,ac,dac
53 real(8) t1,t2,t3,t4,t5,t6,t7,dt1,dt2
54 if (n < 1) then
55  write(*,*)
56  write(*,'("Error(xc_pwca): n < 1 : ",I8)') n
57  write(*,*)
58  stop
59 end if
60 ! prefactors
61 t1=3.d0/(4.d0*pi)
62 p1=t1**thrd
63 p2=t1*(9.d0*pi/4.d0)**thrd
64 p3=1.d0/(2.d0**thrd4-2.d0)
65 do i=1,n
66  rup=rhoup(i); rdn=rhodn(i)
67 ! total density
68  r=rup+rdn
69  if ((rup < 0.d0).or.(rdn < 0.d0).or.(r < 1.d-20)) then
70  ex(i)=0.d0
71  ec(i)=0.d0
72  vxup(i)=0.d0
73  vxdn(i)=0.d0
74  vcup(i)=0.d0
75  vcdn(i)=0.d0
76  cycle
77  end if
78  ri=1.d0/r
79  ri2=ri**2
80  rs=p1*ri**thrd
81  rs2=rs**2
82  rs12=sqrt(rs)
83  rs32=rs12*rs
84  rsi=1.d0/rs
85  rs12i=1.d0/rs12
86  mz=rup-rdn
87  z=mz/r
88  z3=z**3
89  z4=z3*z
90 ! drs/drup = drs/drdn = drs/drho
91  drs=-thrd*rs*ri
92 ! dz/drup, dz/drdn
93  t1=mz*ri2
94  dzu=ri-t1
95  dzd=-ri-t1
96 !------------------!
97 ! exchange !
98 !------------------!
99  t1=-p2*rsi/2.d0
100  t2=1.d0+z
101  t3=1.d0-z
102  t4=t2**thrd4
103  t5=t3**thrd4
104  t6=t4+t5
105 ! exchange energy density
106  ex(i)=t1*t6
107 ! dex/drs
108  ders=-ex(i)*rsi
109 ! f(z)
110  fz=p3*(t6-2.d0)
111 ! dex/dz
112  t4=t4/t2
113  t5=t5/t3
114  t6=t4-t5
115  t7=thrd4*t6
116  dez=t1*t7
117 ! df/dz
118  dfz=p3*t7
119 ! dex/drup, dex/drdn
120  t1=ders*drs
121  deu=t1+dez*dzu
122  ded=t1+dez*dzd
123 ! exchange potential
124  vxup(i)=ex(i)+r*deu
125  vxdn(i)=ex(i)+r*ded
126 !---------------------!
127 ! correlation !
128 !---------------------!
129 ! ec(rs,0)
130  a2=2.d0*a(1)
131  t1=a2*(b1(1)*rs12+b2(1)*rs+b3(1)*rs32+b4(1)*rs2)
132  dt1=a2*(0.5d0*b1(1)*rs12i+b2(1)+1.5d0*b3(1)*rs12+2.d0*b4(1)*rs)
133  t3=1.d0/t1
134  t2=1.d0+t3
135  dt2=-dt1*t3**2
136  t3=1.d0/t2
137  t4=1.d0+a1(1)*rs
138  t5=log(t2)
139  ec0=-a2*t4*t5
140  dec0=-a2*(a1(1)*t5+t4*t3*dt2)
141 ! ec(rs,1)
142  a2=2.d0*a(2)
143  t1=a2*(b1(2)*rs12+b2(2)*rs+b3(2)*rs32+b4(2)*rs2)
144  dt1=a2*(0.5d0*b1(2)*rs12i+b2(2)+1.5d0*b3(2)*rs12+2.d0*b4(2)*rs)
145  t3=1.d0/t1
146  t2=1.d0+t3
147  dt2=-dt1*t3**2
148  t3=1.d0/t2
149  t4=1.d0+a1(2)*rs
150  t5=log(t2)
151  ec1=-a2*t4*t5
152  dec1=-a2*(a1(2)*t5+t4*t3*dt2)
153 ! ac(rs)
154  a2=2.d0*a(3)
155  t1=a2*(b1(3)*rs12+b2(3)*rs+b3(3)*rs32+b4(3)*rs2)
156  dt1=a2*(0.5d0*b1(3)*rs12i+b2(3)+1.5d0*b3(3)*rs12+2.d0*b4(3)*rs)
157  t3=1.d0/t1
158  t2=1.d0+t3
159  dt2=-dt1*t3**2
160  t3=1.d0/t2
161  t4=1.d0+a1(3)*rs
162  t5=log(t2)
163  ac=a2*t4*t5
164  dac=a2*(a1(3)*t5+t4*t3*dt2)
165 ! correlation energy density
166  t1=1.d0-z4
167  t2=(fz/d2f0)*t1
168  t3=ec1-ec0
169  t4=fz*z4
170  ec(i)=ec0+ac*t2+t3*t4
171 ! dec/drs
172  t5=dec1-dec0
173  ders=dec0+dac*t2+t5*t4
174 ! dec/dz
175  t6=4.d0*fz*z3
176  dez=(ac/d2f0)*(dfz*t1-t6)+t3*(dfz*z4+t6)
177 ! dec/drup, dec/drdn
178  t1=ders*drs
179  deu=t1+dez*dzu
180  ded=t1+dez*dzd
181 ! correlation potential
182  vcup(i)=ec(i)+r*deu
183  vcdn(i)=ec(i)+r*ded
184 end do
185 end subroutine
186 !EOC
187 
subroutine xc_pwca(n, rhoup, rhodn, ex, ec, vxup, vxdn, vcup, vcdn)
Definition: xc_pwca.f90:10