Line data Source code
1 : MODULE m_excl91
2 : !.....-----------------------------------------------------------------
3 : !.....(local) pw91 exchange-correlation energy density in hartree.
4 : !.....------------------------------------------------------------------
5 : CONTAINS
6 0 : SUBROUTINE excl91( &
7 0 : jspins,mirm,irmx,rh,agr,agru,agrd, &
8 0 : g2r,g2ru,g2rd,gggr,gggru,gggrd,gzgr, &
9 0 : exc, &
10 : isprsv,sprsv)
11 : USE m_corl91
12 : USE m_corg91
13 : USE m_xch91
14 : USE m_constants
15 :
16 : IMPLICIT NONE
17 :
18 : ! .. Arguments ..
19 : INTEGER, INTENT (IN) :: jspins,irmx,mirm,isprsv
20 : REAL, INTENT (IN) :: sprsv
21 :
22 : REAL, INTENT (IN) :: rh(mirm,jspins)
23 : REAL, INTENT (IN) :: agr(mirm),agru(mirm),agrd(mirm)
24 : REAL, INTENT (IN) :: g2r(mirm),g2ru(mirm),g2rd(mirm)
25 : REAL, INTENT (IN) :: gggr(mirm),gggru(mirm)
26 : REAL, INTENT (IN) :: gggrd(mirm),gzgr(mirm)
27 : REAL, INTENT (OUT) :: exc(mirm)
28 :
29 : ! .. local variables
30 : REAL :: ro,zta,alf,alfc,c13,c23,c43,c53, &
31 : cedg,cedl,dbrod,dbrou,dsprs,ec,ecrs,eczta,fk,gz, &
32 : ro13,ro2,rod,rod3,rod43,rod53,rou,rou3,rou43,rou53, &
33 : rs,sd,sk,su,tc,td,tksg,tu,uc,ud,uu,vc, &
34 : vcgd,vcgu,vcld,vclu,vxgd,vxgu,vxld, &
35 : vxlu,wc,xced,xedg,xedgd,xedgu,xedl,xedld,xedlu
36 :
37 : INTEGER :: i
38 : REAL, PARAMETER :: sml = 1.e-14
39 :
40 0 : DO i = 1,irmx
41 :
42 0 : IF (jspins == 1) THEN
43 0 : rou=rh(i,1)/2
44 0 : rod=rou
45 : ELSE
46 0 : rou=rh(i,1)
47 0 : rod=rh(i,jspins)
48 : ENDIF
49 0 : ro=rou+rod
50 0 : zta=(rou-rod)/ro
51 :
52 0 : IF (zta > 1.e0-sml) zta = 1.e0 - sml
53 0 : IF (zta < -1.e0-sml) zta = -1.e0 + sml
54 :
55 : !.....
56 : ! xedl,xedg: exchange energy density (local,grad.exp.) in ry.
57 : ! cedl,cedg: exchange energy density (local,grad.expnd.) in ry.
58 : ! all later in hartree.
59 : !.....
60 0 : xedl = 0.0e0
61 0 : cedl = 0.0e0
62 0 : xedg = 0.0e0
63 0 : cedg = 0.0e0
64 :
65 : !.....
66 0 : if(ro < sml) then
67 0 : ro = sml
68 : zta = 0.e0
69 : go to 200
70 : endif
71 : !.....
72 0 : c13 = 1.e0/3.e0
73 0 : c23 = 2.e0/3.e0
74 0 : c43 = 4.e0/3.e0
75 0 : c53 = 5.e0/3.e0
76 : !..... alf=-3*(3/4*pai)**(1/3).
77 0 : alf = -1.861051473e0
78 : !.....
79 0 : ro2 = ro*ro
80 0 : ro13 = ro**c13
81 : !.....
82 0 : rou3 = rou**3
83 0 : rou43 = rou**c43
84 : !.....
85 0 : rod3 = rod**3
86 0 : rod43 = rod**c43
87 : !.....
88 : ! gr2=drr*drr
89 : ! gr2u=drru**2
90 : ! drrd=drr-drru
91 : ! gr2d=drrd**2
92 : ! ddrrd=ddrr-ddrru
93 : !.....
94 : !..... gz,gz2,gz3: for wang-perdew ssf.
95 0 : gz = ((1.e0+zta)**c23+ (1.e0-zta)**c23)/2.e0
96 : !.....
97 : !.....
98 0 : rs = 0.620350491e0/ro13
99 : !.....
100 : !..... xedl: exchange-energy-density in ry.
101 0 : xedl = alf* (rou43+rod43)
102 : !.....
103 : !.... .gradient correction.
104 : !.....
105 : ! if(abs(agr(i)).lt.sml) go to 200
106 : !.....
107 :
108 : !.....
109 : ! dsprs = 1.e0
110 : ! if(idsprs.eq.1) dsprs = 1.e-19
111 0 : dsprs = 1.e-19
112 0 : if(isprsv == 1) dsprs = dsprs*sprsv
113 :
114 : !.....
115 : ! agr,agru,agrd: abs(grad(rho)), for all, up, and down.
116 : !c gr2,gr2u,gr2d: grad(rho_all)**2, grad(rho_up)**2, grad(rho_d)**2.
117 : ! g2r,g2ru,g2rd: laplacian rho_all, _up and _down.
118 : ! gggru,-d: grad(rho)*grad(abs(grad(rho))) for all,up and down.
119 : ! grgru,-d: grad(rho_all)*grad(rhor_up) and for down.
120 :
121 : ! g2r=ddrr+2*drr/rv
122 : !.....
123 : rou53 = rou**c53
124 : !.....
125 : !..... edrru: d(abs(d(rou)/dr))/dr, edrrd for down.
126 : ! edrru=ddrru
127 : ! if(drru.lt.0.) edrru=-ddrru
128 : !.....
129 : ! agr,agbru,-d: abs(grad(rho)),for rou, rod.
130 : ! gggru,-d: grad(rho)*grad(abs(grad(rho))) for up and down.
131 : !..... su:at ro=2*rou. 1/(2(3*pai**2)**(1/3))*|grad(rou)|/rou**(4/3).
132 0 : su = 0.128278244e0*agru(i)/rou43
133 : ! if(su.gt.huges) go to 200
134 : ! g2ru=ddrru+2*drru/rv
135 0 : tu = .016455307e0*g2ru(i)/rou53
136 0 : uu = 0.002110857e0*gggru(i)/rou3
137 :
138 0 : dbrou = rou*2
139 :
140 0 : call xch91(dbrou,su,uu,tu,xedlu,xedgu,vxlu,vxgu)
141 :
142 0 : xedl = xedlu/2
143 0 : xedgu = dsprs*xedgu
144 :
145 : !.....
146 : rod53 = rod**c53
147 : ! edrrd=ddrrd
148 : ! if(drrd.lt.0.) edrrd=-ddrrd
149 :
150 0 : sd = 0.128278244e0*agrd(i)/rod43
151 : ! if(sd.gt.huges) go to 200
152 :
153 : ! g2rd=ddrrd+2*drrd/rv
154 :
155 0 : td = .016455307e0*g2rd(i)/rod53
156 0 : ud = 0.002110857e0*gggrd(i)/rod3
157 :
158 0 : dbrod = rod*2
159 :
160 0 : call xch91(dbrod,sd,ud,td,xedld,xedgd,vxld,vxgd)
161 :
162 0 : xedl = xedl + xedld/2
163 0 : xedgd = dsprs*xedgd
164 :
165 0 : xedg = (xedgu+xedgd)/2
166 :
167 : !.... cro: c(n) of (6),phys.rev..b33,8822('86). in ry.
168 : !.... dcdr: d(cro)/d(ro).
169 : !..... 0.001625816=1.745*f(=0.11)*cro(rs=0).
170 :
171 0 : call corl91(rs,zta,ec,vclu,vcld,ecrs,eczta,alfc)
172 :
173 0 : cedl = ec*2.e0*ro
174 :
175 0 : fk = 1.91915829e0/rs
176 0 : sk = sqrt(4.e0*fk/pi_const)
177 0 : tksg = 2.e0*sk*gz
178 0 : tc = agr(i)/ (ro*tksg)
179 0 : uc = gggr(i)/ (ro2*tksg**3)
180 0 : vc = g2r(i)/ (ro*tksg**2)
181 0 : wc = gzgr(i)/ (ro*tksg**2)
182 :
183 : call corg91(fk,sk,gz,ec,ecrs,eczta,rs,zta,tc,uc,vc,wc,cedg, &
184 0 : vcgu,vcgd)
185 :
186 0 : cedg = dsprs*cedg*ro*2.e0
187 :
188 : 200 continue
189 :
190 0 : xced = (xedl+cedl+xedg+cedg)
191 0 : if(ro >= sml) xced = xced/ro
192 :
193 : ! change to hartree.
194 0 : exc(i) = xced
195 :
196 : END DO
197 :
198 0 : END SUBROUTINE excl91
199 : END MODULE m_excl91
|