source: pcp/src/excor.c@ f70c2a

Last change on this file since f70c2a was e08f45, checked in by Frederik Heber <heber@…>, 17 years ago

Merge branch 'ConcaveHull' of ../espack2 into ConcaveHull

Conflicts:

molecuilder/src/boundary.cpp
molecuilder/src/boundary.hpp
molecuilder/src/builder.cpp
molecuilder/src/linkedcell.cpp
molecuilder/src/linkedcell.hpp
molecuilder/src/vector.cpp
molecuilder/src/vector.hpp
util/src/NanoCreator.c

Basically, this resulted from a lot of conversions two from spaces to one tab, which is my standard indentation. The mess was caused by eclipse auto-indenting. And in espack2:ConcaveHull was the new stuff, so all from ConcaveHull was replaced in case of doubt.
Additionally, vector had ofstream << operator instead ostream << ...

  • Property mode set to 100755
File size: 45.2 KB
Line 
1/** \file excor.c
2 * Exchange correlation energy.
3 *
4 * The Exchange correlation energy is calculated via a local spin-density-approximation in
5 * a parametrized manner. It is the sum of the exchange and the correlation, per electron
6 * (thus, (discretely) integrated over the density).
7 * Due to the parametrization there is a huge number of functions evaluating small
8 * expressions or auxiliary variables with its first and second derivatives
9 * Calcf(), CalcDf(), CalcD2f() and CalcZeta(), CalcDZeta(), CalcD2Zeta(),
10 * which then help to evaluate the energy CalcECr(), CalcEXrUP(), in the summing
11 * CalcSECr(), CalcSEXr(), potential CalcVCr(), CalcVXrUP(), in its summation
12 * CalcSVCr(), CalcSVXr()
13 * and derivatives CalcVVCr(), CalcVVXrUP(), in its summation CalcSVVCr(), CalcSVVXr().
14 * All these are needed by the super functions evaluating exchange correlatiob
15 * potential CalculateXCPotentialNoRT(), exchange correlation energy without RiemannTensor
16 * CalculateXCEnergyNoRT() and with RiemannTensor CalculateXCEnergyUseRT(),
17 * and the second derivative CalculateXCddEddt0NoRT() (needed for conjugate gradient).
18 * During initilization the ExCor structure's entries is set to
19 * these fixed parameters InitExchangeCorrelationEnergy().
20 *
21 *
22 Project: ParallelCarParrinello
23 \author Jan Hamaekers
24 \date 2000
25
26 File: excor.c
27 $Id: excor.c,v 1.47 2007-03-29 13:37:25 foo Exp $
28*/
29
30#ifdef HAVE_CONFIG_H
31#include <config.h>
32#endif
33
34#include <stdlib.h>
35#include <stdio.h>
36#include <stddef.h>
37#include <math.h>
38
39#include "data.h"
40#include "mymath.h"
41#include "run.h"
42#include "myfft.h"
43#include "errors.h"
44#include "excor.h"
45#include "helpers.h"
46
47/** Calculate Wigner-Seitz-Radius \f$r_s\f$
48 * \param *EC ExCor exchange correlation structure
49 * \param p electron density
50 * \return \f$(\frac{3}{4\pi \cdot p})^{1/3} \qquad (2.30)\f$
51 */
52#ifdef HAVE_INLINE
53inline double Calcrs(struct ExCor *EC, double p) {
54#else
55double Calcrs(struct ExCor *EC, double p) {
56#endif
57 if (fabs(p) < EC->epsilon0) return(0);
58 //return (pow(3./(4.*PI*p),1./3.));
59 return (cbrt(3./(4.*PI*p)));
60}
61
62/** Calculates exchange potential \f$V_{x}\f$.
63 * \f[
64 * V_{x} = {\cal E}_{x} + \Bigr ( \frac{d{\cal E}_{x}}{dn} \Bigl )_{n=n(r_s)} n(r_s) \qquad (2.32)
65 * \f]
66 * \param *EC ExCor exchange correlation structure
67 * \param rs Wigner-Seitz-Radius \f$r_s \f$, see Calcrs()
68 * \return \f$-\frac{1}{2} (\frac{6}{\pi})^{2/3} \cdot \frac{1}{rs}\f$
69 * \note The formula from CalcEXrUP() was used for the derivation.
70 */
71#ifdef HAVE_INLINE
72inline static double CalcVXrUP(struct ExCor *EC, double rs) {
73#else
74static double CalcVXrUP(struct ExCor *EC, double rs) {
75#endif
76 if (fabs(rs) < EC->epsilon0) return(0);
77 return(-0.5*EC->fac6PI23/rs); // formula checked (16.5.06)
78}
79
80/** Calculates first derivative of exchange potential \f$\frac{\delta V_{x}}{\delta n}\f$.
81 * \param *EC ExCor exchange correlation structure
82 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
83 * \return \f$-\frac{2}{9\pi} (6\pi^2)^2/3 \cdot (rs)^2\f$
84 * \sa CalcVXrUP()
85 */
86#ifdef HAVE_INLINE
87inline static double CalcVVXrUP(struct ExCor *EC, double rs) {
88#else
89static double CalcVVXrUP(struct ExCor *EC, double rs) {
90#endif
91 return (-2./(9*PI)*EC->fac6PIPI23*rs*rs); // formula checked (16.5.06)
92}
93
94/** Calculates second derivative of exchange potential \f$\frac{\delta^2 V_{x}}{\delta n^2}\f$.
95 * \param *EC ExCor exchange correlation structure
96 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
97 * \return \f$\frac{16}{81} (6\pi^2)^{2/3} \cdot (rs)^5\f$
98 * \sa CalcVXrUP(), CalcVVXrUP()
99 */
100#ifdef HAVE_INLINE
101inline static double CalcVVVXrUP(struct ExCor *EC, double rs) {
102#else
103static double CalcVVVXrUP(struct ExCor *EC, double rs) {
104#endif
105 return (16./81.*EC->fac6PIPI23*rs*rs*rs*rs*rs); // formula checked (16.5.06)
106}
107
108/** Calculates exchange energy over density for homogeneous charge within given Wigner-Seitz-Radius, \f${\cal E}_x\f$.
109 * The formula specified on the return statement is derived if into
110 * \f[ \forall 0 \geq \zeta \geq 1: \quad
111 * E_x = {\cal E}_x n = -\frac{3}{8} \Bigr (\frac{3(n_{up}+n_{down})}{\pi} \Bigl)^{1/3}
112 * \bigr[ (1+\zeta)^{4/3}+ (1-\zeta)^{4/3} \bigl ] \cdot (n_{up}+n_{down}) \qquad (2.52)
113 * \f]
114 * the definition of spin polarisation \f$\frac{n_{up} - n_{down}}{n_{up} + n_{down}}\f$
115 * is inserted and the expression evaluated.
116 * \param *EC ExCor exchange correlation structure
117 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
118 * \param zeta spin polarisation \f$\zeta\f$, see CalcZeta()
119 * \return \f$-\frac{3}{8} (\frac{3}{2\pi})^{2/3} \Bigl [ (1+\zeta)^{\frac{4}{3}} + (1-\zeta)^{\frac{4}{3}}\Bigr] \cdot \frac{1}{rs}\f$
120 */
121#ifdef HAVE_INLINE
122inline double CalcEXr(struct ExCor *EC, double rs, double zeta) {
123#else
124double CalcEXr(struct ExCor *EC, double rs, double zeta) {
125#endif
126 if (fabs(rs) < EC->epsilon0) return(0);
127 //return (-3./8.*pow(3./(2.*PI),2./3.)/rs *(pow(1.+zeta,4./3.)+pow(1.-zeta,4./3.))); // formula checked
128 return (-3./8.*cbrt((3./(2.*PI))*(3./(2.*PI)))/rs *((1.+zeta)*cbrt(1.+zeta)+(1.-zeta)*cbrt(1.-zeta)));
129}
130
131/** Calculates exchange energy over density for homogeneous charge within given Wigner-Seitz-Radius, \f${\cal E}_x\f$.
132 * The formula specified on the return statement is derived if into
133 * \f[ \forall 0 \geq \zeta \geq 1: \quad
134 * E_x = {\cal E}_x n = -\frac{3}{8} \Bigr (\frac{3(n_{up}+n_{down})}{\pi} \Bigl)^{1/3}
135 * \bigr[ (1+\zeta)^{4/3}+ (1-\zeta)^{4/3} \bigl ] \cdot (n_{up}+n_{down}) \qquad (2.52)
136 * \f]
137 * the definition of spin polarisation \f$\frac{n_{up} - n_{down}}{n_{up} + n_{down}}\f$
138 * is inserted and the expression evaluated.
139 * \param *EC ExCor exchange correlation structure
140 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
141 * \return \f$-\frac{3}{8} (\frac{6}{\pi})^{2/3} \cdot \frac{1}{rs}\f$
142 */
143#ifdef HAVE_INLINE
144inline static double CalcEXrUP(struct ExCor *EC, double rs) {
145#else
146static double CalcEXrUP(struct ExCor *EC, double rs) {
147#endif
148 if (fabs(rs) < EC->epsilon0) return(0);
149 return (-3./8.*EC->fac6PI23/rs); // formula checked
150}
151
152/** Calculates correlation energy \f${\cal E}_c\f$ per electron for un-/polarised case.
153 * Formula derived from Monte-Carlo-simulations by Ceperley and Adler [CA80],
154 * parametrized by Perdew and Zunger [PZ81] for the polarised (\f$\zeta = 1\f$) or
155 * unpolarised (\f$\zeta = 0\f$) case.
156 * \param *EC ExCor exchange correlation structure
157 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
158 * \param up UnPolarised: whether it's the polarised or unpolarised case
159 * \return In the unpolarised case: <br>
160 * \f$r_s\f$>=1: \f$\gamma_{up} (1+\beta_{1,up}\sqrt{r_s}+\beta_{2,up}r_s)^{-1} = -0.1423\cdot(1+1.0529\sqrt{r_s}+0.3334r_s)^{-1} \qquad (2.31a)\f$<br>
161 * \f$r_s\f$<1: \f$-0.0480+0.0311\ln(r_s)-0.0116r_s+0.0020r_s\ln(r_s) \qquad (2.31b)\f$<br>
162 * In the polarised case: <br>
163 * \f$r_s\f$>=1: \f$-0.0843\cdot(1+1.3981\sqrt{r_s}+0.2611r_s)^{-1}\f$<br>
164 * \f$r_s\f$<1: \f$-0.0269+0.01555\ln(r_s)-0.0048r_s+0.0007r_s\ln(r_s)\f$<br>
165 */
166#ifdef HAVE_INLINE
167inline double CalcECr(struct ExCor *EC, double rs, enum UnPolarised up) {
168#else
169double CalcECr(struct ExCor *EC, double rs, enum UnPolarised up) {
170#endif
171 double lrs;
172 double res=0;
173 if (rs >= 1) {
174 res= (EC->gamma[up]/(1.+EC->beta_1[up]*sqrt(rs)+EC->beta_2[up]*rs));
175 return (res);
176 }
177 if (rs <= EC->epsilon0) {
178 res = 0;
179 return(res);
180 }
181 lrs = log(rs);
182 res = (EC->A[up]*lrs+EC->B[up]+EC->C[up]*rs*lrs+EC->D[up]*rs);
183 return (res);
184}
185
186/** Calculates correlation potential \f$V_{c}\f$.
187 * \f[
188 * V_{c} = {\cal E}_{c} + \Bigr ( \frac{d{\cal E}_{c}}{dn} \Bigl )_{n=n(r)} n(r) \qquad (2.32)
189 * \f]
190 * \param *EC ExCor exchange correlation structure
191 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
192 * \param up UnPolarised
193 * \return in the un-/polarised case: <br>
194 * \f$r_s\f$>=1: \f$\frac{{\cal E}_c}{1+\beta_1[up]\sqrt{r_s}+\beta_2[up]r_s} \cdot (1+\frac{7}{6}\beta_1[up]\sqrt{r_s} + \frac{4}{3}\beta_2[up]r_s)\f$<br>
195 * \f$r_s\f$=0: 0 <br>
196 * else: \f$A[up]\cdot\log(rs) + (B[up] - \frac{1}{3} A[up]) + \frac{2}{3} C[up]\cdot rs \log(rs)+ \frac{1}{3} (2 D[up]-C[up]) \cdot rs\f$
197 */
198#ifdef HAVE_INLINE
199inline static double CalcVCr(struct ExCor *EC, double rs, enum UnPolarised up) {
200#else
201static double CalcVCr(struct ExCor *EC, double rs, enum UnPolarised up) {
202#endif
203 double srs,lrs;
204 if (rs >= 1) {
205 srs = sqrt(rs);
206 return ((EC->gamma[up]/(1.+EC->beta_1[up]*srs+EC->beta_2[up]*rs))*(1.+(7./6.)*EC->beta_1[up]*srs+(4./3.)*EC->beta_2[up]*rs)/(1.+EC->beta_1[up]*srs+EC->beta_2[up]*rs)); // formula checked (15.5.06)
207 }
208 if (rs <= EC->epsilon0) return (0);
209 lrs = log(rs);
210 return (EC->A[up]*lrs+(EC->B[up]-(1./3.)*EC->A[up])+(2./3.)*EC->C[up]*rs*lrs+(1./3.)*(2.*EC->D[up]-EC->C[up])*rs); // formula checked (15.5.06)
211}
212
213/** Calculates first derivative of correlation potential \f$\frac{\delta V_{c}}{\delta n}\f$.
214 * \f[
215 * \frac{\delta V_{c}}{\delta n} = \frac{\delta^2 {\cal E}_{c}}{\delta n^2}
216 * \f]
217 * \param *EC ExCor exchange correlation structure
218 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
219 * \param up UnPolarised
220 * \return In the un-/polarised case: <br>
221 * \f$r_s\f$>=1: \f$\frac{{\cal E}_c[up] \pi}{27\cdot(1+\beta_1[up]\sqrt{r_s}+\beta_2[up]r_s)} \Bigr ( 5\beta_1[up]r_s^{7/2} + 8\beta_2[up]r_s^4
222 * + \frac{1}{1+\beta_1[up]\sqrt{r_s}+\beta_2[up]r_s} (8\beta_1[up]\beta_2[up]r_s^{9/2} + 2\beta_1^2[up]r_s^4 + 8\beta_2^2[up]r_s^5) \Bigl)\f$<br>
223 * \f$r_s\f$< 1: \f$-\frac{4\pi r_s^3}{9} \bigr (A[up] + \frac{r_s}{3} \cdot(C[up]+2C[up]\log(r_s)+2D[up]) \bigl)\f$<br>
224 * \sa CalcVCr()
225 */
226#ifdef HAVE_INLINE
227inline static double CalcVVCr(struct ExCor *EC, double rs, enum UnPolarised up) {
228#else
229static double CalcVVCr(struct ExCor *EC, double rs, enum UnPolarised up) {
230#endif
231 double eps,deps;
232 if (rs <= EC->epsilon0) return (0);
233 if (rs >= 1) {
234 deps = 1.+EC->beta_1[up]*sqrt(rs)+EC->beta_2[up]*rs;
235 eps = EC->gamma[up]/deps;
236 //return (eps*PI/(27.*deps)*(8.*EC->beta_2[up]*rs*rs*rs*rs+5.*EC->beta_1[up]*pow(rs,7./2.)+(1./deps)*(8.*EC->beta_1[up]*EC->beta_2[up]*pow(rs,9./2.)+2.*EC->beta_1[up]*EC->beta_1[up]*rs*rs*rs*rs+8.*EC->beta_2[up]*EC->beta_2[up]*rs*rs*rs*rs*rs)));
237 //return (eps*PI/(27.*deps*deps)*(8.*EC->beta_2[up]*rs*rs*rs*rs+5.*EC->beta_1[up]*pow(rs,7./2.)+21.*EC->beta_1[up]*EC->beta_2[up]*pow(rs,9./2.)+7.*EC->beta_1[up]*EC->beta_1[up]*rs*rs*rs*rs+16.*EC->beta_2[up]*EC->beta_2[up]*rs*rs*rs*rs*rs)); //formula checked (15.05.06)
238 return (eps*PI/(27.*deps*deps)*(8.*EC->beta_2[up]*rs*rs*rs*rs+5.*EC->beta_1[up]*(sqrt(rs)*rs*rs*rs)+21.*EC->beta_1[up]*EC->beta_2[up]*(sqrt(rs)*rs*rs*rs*rs)+7.*EC->beta_1[up]*EC->beta_1[up]*rs*rs*rs*rs+16.*EC->beta_2[up]*EC->beta_2[up]*rs*rs*rs*rs*rs)); //formula checked (15.05.06)
239 }
240 return (-4.*PI*rs*rs*rs/9.*(EC->A[up]+rs/3.*(EC->C[up]+2.*EC->C[up]*log(rs)+2.*EC->D[up]))); //formula checked (23.05.06)
241}
242
243/** Calculates second derivative of correlation potential \f$\frac{\delta^2 V_{c}}{\delta n^2}\f$.
244 * \f[
245 * \frac{\delta^2 V_{c}}{\delta n^2} = \frac{\delta^3 {\cal E}_{c}}{\delta n^3}
246 * \f]
247 * \param *EC ExCor exchange correlation structure
248 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
249 * \param up UnPolarised
250 * \return In the un-/polarised case: <br>
251 * \f$r_s\f$>=1: \f$-\frac{2\pi^2 {\cal E}_c[up]}{243\cdot(1+\beta_1[up]\sqrt{r_s}+\beta_2[up]r_s)^4}
252 * \Bigr ( 35\beta_1[up]r_s^{13/2} + r_s^7(64\beta_2[up]+76\beta_1^2[up])
253 * + r_s^{15/2} (35\beta^3_1[up]+243\beta_1[up]\beta_2[up])
254 * + r_s^8 (176\beta^2_2[up]+140\beta^2_1[up]\beta_2[up])
255 * + r_s^{17/2} (175\beta_1[up]\beta^2_2[up])
256 * + r_s^9 (64\beta^3_2[up])
257 * \Bigl)\f$<br>
258 * \f$r_s\f$< 1: \f$\frac{16\pi^2 r_s^6}{243} \bigr (9A[up] + r_s\cdot(6C[up]+8C[up]\log(r_s)+8D[up]) \bigl)\f$<br>
259 * \sa CalcVCr()
260 */
261#ifdef HAVE_INLINE
262inline static double CalcVVVCr(struct ExCor *EC, double rs, enum UnPolarised up) {
263#else
264static double CalcVVVCr(struct ExCor *EC, double rs, enum UnPolarised up) {
265#endif
266 double eps,deps;
267 double beta11,beta12,beta13,beta21,beta22,beta23;
268 if (rs <= EC->epsilon0) return (0);
269 if (rs >= 1) {
270 deps = 1.+EC->beta_1[up]*sqrt(rs)+EC->beta_2[up]*rs;
271 eps=EC->gamma[up]/deps;
272 beta11 = EC->beta_1[up];
273 beta12 = beta11*EC->beta_1[up];
274 beta13 = beta12*EC->beta_1[up];
275 beta21 = EC->beta_2[up];
276 beta22 = beta21*EC->beta_2[up];
277 beta23 = beta22*EC->beta_2[up];
278// return (-2.*eps*PI*PI/(243.*deps*deps*deps)*(
279// pow(rs,13./2.) * (35.*beta11)
280// + pow(rs,7.) * (64.*beta21 + 76.*beta12)
281// + pow(rs,15./2.) * (35.*beta13 + 234.*beta11*beta21)
282// + pow(rs,8.) * (176.*beta22 + 140.*beta12*beta21)
283// + pow(rs,17./2.) * (175.*beta11*beta22)
284// + pow(rs,9.) * (64.*beta23) ));
285 return (-2.*eps*PI*PI/(243.*deps*deps*deps)*(
286 rs*rs*rs*rs*rs*rs*(
287 sqrt(rs) *((35.*beta11) // fractial ones
288 + rs *((35.*beta13 + 234.*beta11*beta21)
289 + rs * (175.*beta11*beta22))
290 )
291 + rs * ((64.*beta21 + 76.*beta12) // integer ones
292 + rs * ((176.*beta22 + 140.*beta12*beta21)
293 + rs * ((64.*beta23) ))))));
294 }
295 //return (16.*PI*PI*pow(rs,6)/243. * (9.*EC->A[up] + rs*(8.*EC->C[up]*log(rs) + 6.*EC->C[up] + 8.*EC->D[up])));
296 return (16.*PI*PI*rs*rs*rs*rs*rs*rs/243. * (9.*EC->A[up] + rs*(8.*EC->C[up]*log(rs) + 6.*EC->C[up] + 8.*EC->D[up])));
297}
298
299/** Calculates spin polarisation \f$\zeta\f$
300 * \param *EC ExCor exchange correlation structure
301 * \param pUp SpinUp electron density
302 * \param pDown SpinDown electron density
303 * \return \f$\frac{pUp - pDown}{pUp + pDown}\f$
304 * \note zeta is never less than ExCor::epsilon0
305 */
306#ifdef HAVE_INLINE
307inline double CalcZeta(struct ExCor *EC, double pUp, double pDown) {
308#else
309double CalcZeta(struct ExCor *EC, double pUp, double pDown) {
310#endif
311 if (fabs(pUp+pDown) < EC->epsilon0) return(0);
312 return ((pUp - pDown)/(pUp + pDown));
313}
314
315/** Calculates derivative \f$\frac{\delta \zeta}{\delta p}\f$
316 * \param *EC ExCor exchange correlation structure
317 * \param ST SpinType
318 * \param pUp SpinUp density
319 * \param pDown SpinDown density
320 * \return p is pUp or pDown: \f$\pm 2 \frac{p}{ (pUp+pDown)^2 }\f$
321 * \sa CalcZeta()
322 */
323#ifdef HAVE_INLINE
324inline static double CalcDzeta(struct ExCor *EC, enum SpinType ST, double pUp, double pDown) {
325#else
326static double CalcDzeta(struct ExCor *EC, enum SpinType ST, double pUp, double pDown) {
327#endif
328 double res = 0;
329 if (fabs(pUp+pDown) < EC->epsilon0) return(0);
330 //EC = EC;
331 switch(ST) {
332 case SpinUp:
333 res = 2.*pDown/(pUp+pDown)/(pUp+pDown); // formula checked
334 break;
335 case SpinDown:
336 res = -2.*pUp/(pUp+pDown)/(pUp+pDown); // formula checked
337 break;
338 case SpinDouble:
339 res = 0;
340 break;
341 }
342 return (res);
343}
344
345/** Calculates second derivative \f$\frac{\delta^2 \zeta}{\delta p^2}\f$
346 * \param *EC ExCor exchange correlation structure
347 * \param ST SpinType
348 * \param pUp SpinUp density
349 * \param pDown SpinDown density
350 * \return p is pUp or pDown: \f$\pm 4 \frac{p}{ (pUp+pDown)^3 }\f$
351 * \sa CalcZeta(), CalcDZeta()
352 */
353#ifdef HAVE_INLINE
354inline static double CalcD2zeta(struct ExCor *EC, enum SpinType ST, double pUp, double pDown) {
355#else
356static double CalcD2zeta(struct ExCor *EC, enum SpinType ST, double pUp, double pDown) {
357#endif
358 double res = 0;
359 if (fabs(pUp+pDown) < EC->epsilon0) return(0);
360 //EC = EC;
361 switch(ST) {
362 case SpinUp:
363 res = -4.*pDown/(pUp+pDown)/(pUp+pDown)/(pUp+pDown);
364 break;
365 case SpinDown:
366 res = 4.*pUp/(pUp+pDown)/(pUp+pDown)/(pUp+pDown);
367 break;
368 case SpinDouble:
369 res = 0;
370 break;
371 }
372 return (res);
373}
374
375/** Calculates third derivative \f$\frac{\delta^3 \zeta}{\delta p^3}\f$
376 * \param *EC ExCor exchange correlation structure
377 * \param ST SpinType
378 * \param pUp SpinUp density
379 * \param pDown SpinDown density
380 * \return p is pUp or pDown: \f$\pm -12 \frac{p}{ (pUp+pDown)^4 }\f$
381 * \sa CalcZeta(), CalcDZeta(), CalcD2Zeta()
382 */
383#ifdef HAVE_INLINE
384inline static double CalcD3zeta(struct ExCor *EC, enum SpinType ST, double pUp, double pDown) {
385#else
386static double CalcD3zeta(struct ExCor *EC, enum SpinType ST, double pUp, double pDown) {
387#endif
388 double res = 0;
389 if (fabs(pUp+pDown) < EC->epsilon0) return(0);
390 //EC = EC;
391 switch(ST) {
392 case SpinUp:
393 res = +12.*pDown/(pUp+pDown)/(pUp+pDown)/(pUp+pDown)/(pUp+pDown);
394 break;
395 case SpinDown:
396 res = -12.*pUp/(pUp+pDown)/(pUp+pDown)/(pUp+pDown)/(pUp+pDown);
397 break;
398 case SpinDouble:
399 res = 0;
400 break;
401 }
402 return (res);
403}
404
405/** Calculates auxiliary factor \f$f(\zeta)\f$.
406 * This auxiliary factor is needed in the parametrized evaluation of the
407 * full spin-polarised correlation energy \f${\cal E}_c\f$ (see section 2.3.6)
408 * \param *EC ExCor exchange correlation structure
409 * \param zeta spin polarisation \f$\zeta\f$, see CalcZeta()
410 * \return \f$\frac{(1+\zeta)^{4/3} + (1-\zeta)^{4/3} - 2} {2^{4/3}-2}\f$
411 */
412#ifdef HAVE_INLINE
413inline static double Calcf(struct ExCor *EC, double zeta) {
414#else
415static double Calcf(struct ExCor *EC, double zeta) {
416#endif
417 double res =0;
418 EC = EC;
419 if (fabs(zeta) < EC->epsilon0) return(0.); // unpolarised case
420 //res = ((pow(1.+zeta,4./3.)+pow(1.-zeta,4./3.)-2.)/(EC->fac243-2.));
421 res = ((cbrt(1.+zeta)*(1.+zeta)+cbrt(1.-zeta)*(1.-zeta)-2.)/(EC->fac243-2.));
422 return (res);
423}
424
425/** Calculates the derivative \f$\frac{\delta f}{\delta \zeta}\f$.
426 * \param *EC ExCor exchange correlation structure
427 * \param zeta spin polarisation \f$\zeta\f$, see CalcZeta()
428 * \return \f$\frac{4}{3} \frac{(\zeta+1)^{1/3} - (1-\zeta)^{1/3}} {2^{4/3}-2}\f$
429 * \sa Calcf()
430 */
431#ifdef HAVE_INLINE
432inline static double CalcDf(struct ExCor *EC, double zeta) {
433#else
434static double CalcDf(struct ExCor *EC, double zeta) {
435#endif
436 if (fabs(zeta) < EC->epsilon0) return(0.); // unpolarised case
437 //return((4./3.)*(pow(zeta+1.,1./3.)-pow(1.-zeta,1./3.))/(EC->fac243-2.)); // formula checked (16.5.06)
438 return((4./3.)*(cbrt(zeta+1.)-cbrt(1.-zeta))/(EC->fac243-2.)); // formula checked (16.5.06)
439}
440
441/** Calculates second derivative \f$\frac{\delta^2 f}{\delta \zeta^2}\f$.
442 * \param *EC ExCor exchange correlation structure
443 * \param zeta spin polarisation \f$\zeta\f$, see CalcZeta()
444 * \return \f$\frac{4}{9} \frac{(\zeta+1)^{-2/3}-(1-\zeta)^{-2/3} }{2^{4/3}-2}\f$
445 * \sa Calcf(), CalcDf()
446 */
447#ifdef HAVE_INLINE
448inline static double CalcD2f(struct ExCor *EC, double zeta) {
449#else
450static double CalcD2f(struct ExCor *EC, double zeta) {
451#endif
452 if (fabs(zeta) < EC->epsilon0) return(0.); // unpolarised case
453 if (1.-fabs(zeta) < EC->epsilon0) return (0.); // second derivative not defined for these cases (which are needed!)
454 //if (1-fabs(zeta) < EC->epsilon0) { fprintf(stderr,"CalcD2f: zeta = %lg\n",zeta); return(0); }
455 //return((4./9.)*(pow(zeta+1.,-2./3.)+pow(1.-zeta,-2./3.))/(EC->fac243-2.)); // formula checked (16.5.06)
456 return((4./9.)*(1./cbrt((zeta+1.)*(zeta+1.))+1./cbrt((1.-zeta)*(1.-zeta)))/(EC->fac243-2.)); // formula checked (16.5.06)
457}
458
459/** Calculates third derivative \f$\frac{\delta^3 f}{\delta \zeta^3}\f$.
460 * \param *EC ExCor exchange correlation structure
461 * \param zeta spin polarisation \f$\zeta\f$, see CalcZeta()
462 * \return \f$\frac{8}{27} \frac{-(\zeta+1)^{-5/3}+(1-\zeta)^{-5/3} }{2^{4/3}-2}\f$
463 * \sa Calcf(), CalcDf()
464 */
465#ifdef HAVE_INLINE
466inline static double CalcD3f(struct ExCor *EC, double zeta) {
467#else
468static double CalcD3f(struct ExCor *EC, double zeta) {
469#endif
470 if (fabs(zeta) < EC->epsilon0) return(0.); // unpolarised case
471 //if (1-fabs(zeta) < EC->epsilon0) return (0.); // second derivative not defined for these cases (which are needed!)
472 if (1-fabs(zeta) < EC->epsilon0) { fprintf(stderr,"CalcD2f: zeta = %lg\n",zeta); return(0.); }
473 //return((-8./27.)*(pow(zeta+1.,-5./3.)-pow(1.-zeta,-5./3.))/(EC->fac243-2.)); // formula checked (16.5.06)
474 return((-8./27.)*(1/((zeta+1)*cbrt((zeta+1.)*(zeta+1.)))-1/((zeta+1)*cbrt((1.-zeta)*(1.-zeta))))/(EC->fac243-2.)); // formula checked (16.5.06)
475}
476
477/** Calculates correlation energy with free spin-polarisation \f$E_c (n,\zeta)\f$.
478 * \param *EC exchange correlation structure
479 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
480 * \param zeta spin polarisation \f$\zeta\f$, see CalcZeta()
481 * \param p electron density \f$n\f$
482 * \return \f$0 \leq \zeta \leq 1:\quad E_c (n,\zeta) = {\cal E}_c (n,\zeta)\cdot n = \bigr ({\cal E}_c(n,0) + [{\cal E}_c(n,1) - {\cal E}_c(n,0)] f(\zeta)\bigl ) \cdot n \qquad (2.3.6)\f$
483 * \sa CalcECr()
484 */
485#ifdef HAVE_INLINE
486inline double CalcSECr(struct ExCor *EC, double rs, double zeta, double p) {
487#else
488double CalcSECr(struct ExCor *EC, double rs, double zeta, double p) {
489#endif
490 double res =0;
491 double unpol, pol;
492 unpol = CalcECr(EC,rs,unpolarised);
493 pol = CalcECr(EC,rs,polarised);
494 res = (unpol+Calcf(EC,zeta)*(pol-unpol))*p;
495 return (res);
496}
497
498/** Calculates SpinType-dependently correlation potential with free spin-polarisation \f$V_c (n,\zeta)\f$.
499 * \f[
500 * V_c = {\cal E}_c + \frac{\delta{\ E}_c}{\delta n}n = V_c(n,0) + [V_c(n,1)-V_c(n,0)]f(\zeta)
501 * + [{\cal E}_c(n,1)-{\cal E}_c(N,0)]\frac{\delta f(\zeta)}{\delta \zeta}\frac{\delta\zeta}{\delta n}
502 * \f]
503 * \param *EC ExCor exchange correlation structure
504 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
505 * \param zeta spin polarisation \f$\zeta\f$, see CalcZeta()
506 * \param ST SpinType
507 * \return \f$V_c(n,0) + [V_c(n,1)-V_c(n,0)]f(\zeta) + [{\cal E}_c(n,1)-{\cal E}_c(N,0)](\pm1-\zeta)\frac{\delta f(\zeta)}{\delta \zeta}\f$
508 */
509#ifdef HAVE_INLINE
510inline static double CalcSVCr(struct ExCor *EC, double rs, double zeta, enum SpinType ST) {
511#else
512static double CalcSVCr(struct ExCor *EC, double rs, double zeta, enum SpinType ST) {
513#endif
514 double res = 0;
515 double VCR_unpol = CalcVCr(EC,rs,unpolarised);
516 switch (ST) {
517 case SpinUp:
518 res = VCR_unpol + Calcf(EC,zeta)*(CalcVCr(EC,rs,polarised)-VCR_unpol) + (CalcECr(EC,rs,polarised)-CalcECr(EC,rs,unpolarised))*(1.-zeta)*CalcDf(EC,zeta); // formula checked (15.5.06)
519 break;
520 case SpinDown:
521 res = VCR_unpol + Calcf(EC,zeta)*(CalcVCr(EC,rs,polarised)-VCR_unpol) + (CalcECr(EC,rs,polarised)-CalcECr(EC,rs,unpolarised))*(-1.-zeta)*CalcDf(EC,zeta); // formula checked (15.5.06)
522 break;
523 case SpinDouble:
524 res = VCR_unpol; /*EC->fac1213**/
525 break;
526 }
527 return (res);
528}
529
530/** Calculates complete exchange energy \f$E_x (n)\f$.
531 * \param *EC exchange correlation structure
532 * \param rsUp Wigner-Seitz-Radius \f$r_s\f$ for pUp
533 * \param rsDown Wigner-Seitz-Radius \f$r_s\f$ for pDown
534 * \param pUp SpinUp electron density
535 * \param pDown SpinDown electron density
536 * \return \f$E_x = {\cal E}_x \cdot n\f$
537 * \sa CalcEXrUP(), CalculateXCEnergyNoRT()
538 */
539#ifdef HAVE_INLINE
540inline double CalcSEXr(struct ExCor *EC, double rsUp, double rsDown, double pUp, double pDown) {
541#else
542double CalcSEXr(struct ExCor *EC, double rsUp, double rsDown, double pUp, double pDown) {
543#endif
544 return(CalcEXrUP(EC,rsUp)*pUp+CalcEXrUP(EC,rsDown)*pDown);
545}
546
547/** Calculates SpinType-dependently exchange potential \f$V_x (n)\f$.
548 * Essentially, just CalcVXrUP() is called, even in SpinDouble case
549 * \param *EC ExCor exchange correlation structure
550 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
551 * \param ST SpinType
552 * \return CalcVXrUP()
553 */
554#ifdef HAVE_INLINE
555inline static double CalcSVXr(struct ExCor *EC, double rs, enum SpinType ST) {
556#else
557static double CalcSVXr(struct ExCor *EC, double rs, enum SpinType ST) {
558#endif
559 double res = 0;
560 switch (ST) {
561 case SpinUp:
562 case SpinDown:
563 res = CalcVXrUP(EC,rs);
564 break;
565 case SpinDouble:
566 res = EC->fac1213*CalcVXrUP(EC,rs);
567 break;
568 }
569 return (res);
570}
571
572/** Calculates SpinType-dependently derivative of exchange potential \f$\frac{\delta V_x}{\delta n}\f$.
573 * Essentially, just CalcVVXrUP() is called, even in SpinDouble case
574 * \param *EC ExCor exchange correlation structure
575 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
576 * \param ST SpinType
577 * \return CalcVVXrUP()
578 */
579#ifdef HAVE_INLINE
580inline double CalcSVVXr(struct ExCor *EC, double rs, enum SpinType ST) {
581#else
582double CalcSVVXr(struct ExCor *EC, double rs, enum SpinType ST) {
583#endif
584 double res = 0;
585 switch (ST) {
586 case SpinUp:
587 case SpinDown:
588 res = CalcVVXrUP(EC,rs);
589 break;
590 case SpinDouble:
591 res = EC->fac1213*CalcVVXrUP(EC,rs);
592 break;
593 }
594 return (res);
595}
596
597/** Calculates SpinType-dependently second derivative of exchange potential \f$\frac{\delta^2 V_x}{\delta n^2}\f$.
598 * Essentially, just CalcVVVXrUP() is called, even in SpinDouble case
599 * \param *EC ExCor exchange correlation structure
600 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
601 * \param ST SpinType
602 * \return CalcVVVXrUP()
603 */
604#ifdef HAVE_INLINE
605inline double CalcSVVVXr(struct ExCor *EC, double rs, enum SpinType ST) {
606#else
607double CalcSVVVXr(struct ExCor *EC, double rs, enum SpinType ST) {
608#endif
609 double res = 0;
610 switch (ST) {
611 case SpinUp:
612 case SpinDown:
613 res = CalcVVVXrUP(EC,rs);
614 break;
615 case SpinDouble:
616 res = EC->fac1213*CalcVVVXrUP(EC,rs);
617 break;
618 }
619 return (res);
620}
621
622/** Calculates SpinType-dependently first derivative of correlation potential with free spin-polarisation \f$\frac{\delta V_c}{\delta n} (n,\zeta)\f$.
623 * \param *EC ExCor exchange correlation structure
624 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
625 * \param zeta spin polarisation \f$\zeta\f$, see CalcZeta()
626 * \param ST SpinType
627 * \param pUp SpinUp density
628 * \param pDown SpinDown density
629 * \return \f$\frac{\delta V_c}{\delta n} (n,0) + f(\zeta) \bigr ( \frac{\delta V_c}{\delta n} (n,1) - \frac{\delta V_c}{\delta n} (n,0)\bigl )
630 * + 2 \cdot \frac{\delta f}{\delta \zeta} \frac{\delta \zeta}{\delta n} \bigr ( V_c (n,1) - V_c (n,0)\bigl ) + \ldots\f$<br>
631 * \f$\ldots + ({\cal E}_c (n,1) - {\cal E}_c (n,0) ) n (\frac{\delta^2 \zeta}{\delta n^2}\frac{\delta f}{\delta \zeta} + \bigr(\frac{\delta \zeta}{\delta n}\bigl)^2
632 * \frac{\delta f}{\delta \zeta})\f$
633 * \sa CalcSVCr()
634 */
635#ifdef HAVE_INLINE
636inline double CalcSVVCr(struct ExCor *EC, double rs, double zeta, enum SpinType ST, double pUp, double pDown) {
637#else
638double CalcSVVCr(struct ExCor *EC, double rs, double zeta, enum SpinType ST, double pUp, double pDown) {
639#endif
640 double res = 0;
641 double VVCR_pol, VVCR_unpol, VCR_pol, VCR_unpol, ECr_pol, ECr_unpol, f, Df, D2f, DZeta, D2Zeta;
642 switch (ST) {
643 case SpinUp:
644 case SpinDown:
645 // store some function calls for faster and easierly understandable operation
646 VVCR_unpol = CalcVVCr(EC,rs,unpolarised);
647 VVCR_pol = CalcVVCr(EC,rs,polarised);
648 ECr_pol = CalcECr(EC,rs,polarised);
649 ECr_unpol = CalcECr(EC,rs,unpolarised);
650 f = Calcf(EC,zeta);
651 Df = CalcDf(EC,zeta);
652 D2Zeta = CalcD2zeta(EC,ST,pUp,pDown);
653 if (CalcDzeta(EC,ST,pUp,pDown) != 0.0) {
654 VCR_unpol = CalcVCr(EC,rs,unpolarised);
655 VCR_pol = CalcVCr(EC,rs,polarised);
656 D2f = CalcD2f(EC,zeta);
657 DZeta = CalcDzeta(EC,ST,pUp,pDown);
658 res = VVCR_unpol + f*(VVCR_pol-VVCR_unpol) + 2.*DZeta*Df*(VCR_pol-VCR_unpol) + (ECr_pol-ECr_unpol)*(pUp+pDown)*(D2Zeta*Df + DZeta*DZeta*D2f); //formula checked (15.5.06)
659 } else {
660 res = VVCR_unpol + f*(VVCR_pol-VVCR_unpol) + (ECr_pol-ECr_unpol)*(pUp+pDown)*(D2Zeta*Df); //formula checked (15.5.06)
661 }
662 break;
663 case SpinDouble:
664 res = CalcVVCr(EC,rs,unpolarised);
665 break;
666 }
667 return (res);
668}
669
670/** Calculates SpinType-dependently second derivative of correlation potential with free spin-polarisation \f$\frac{\delta V_c}{\delta n} (n,\zeta)\f$.
671 * \param *EC ExCor exchange correlation structure
672 * \param rs Wigner-Seitz-Radius \f$r_s\f$, see Calcrs()
673 * \param zeta spin polarisation \f$\zeta\f$, see CalcZeta()
674 * \param ST SpinType
675 * \param pUp SpinUp density
676 * \param pDown SpinDown density
677 * \return \f$\frac{\delta^2 V_c}{\delta n^2} (n,0) + f(\zeta) \bigr ( \frac{\delta^2 V_c}{\delta n^2} (n,1) - \frac{\delta^2 V_c}{\delta n^2} (n,0)\bigl )
678 * + 3 \cdot \frac{\delta f}{\delta \zeta} \frac{\delta \zeta}{\delta n} \bigr ( \frac{\delta V_c}{\delta n} (n,1) - \frac{\delta V_c}{\delta n} (n,0) \bigl ) + \ldots\f$<br>
679 * \f$\ldots + 3 \cdot (\frac{\delta^2 f}{\delta \zeta^2} (\frac{\delta \zeta}{\delta n})^2 + \frac{\delta f}{\delta \zeta} \frac{\delta^2 \zeta}{\delta n^2} ) \bigr ( V_c (n,1) - V_c (n,0)\bigl ) +
680 * + ({\cal E}_c (n,1) - {\cal E}_c (n,0) ) n \bigr (\frac{\delta^3 \zeta}{\delta n^3}(\frac{\delta f}{\delta \zeta})^3 + 3\cdot \frac{\delta^2 f}{\delta \zeta^2}\frac{\delta \zeta}{\delta n}\frac{\delta^2 \zeta}{\delta n^2} + \frac{\delta f}{\delta \zeta}\frac{\delta^3 \zeta}{\delta n^3}\bigl)^2\f$
681 * \sa CalcSVCr(), CalcSVVCr()
682 */
683#ifdef HAVE_INLINE
684inline double CalcSVVVCr(struct ExCor *EC, double rs, double zeta, enum SpinType ST, double pUp, double pDown) {
685#else
686double CalcSVVVCr(struct ExCor *EC, double rs, double zeta, enum SpinType ST, double pUp, double pDown) {
687#endif
688 double res = 0;
689 double VVVCR_pol, VVVCR_unpol, VVCR_pol, VVCR_unpol, VCR_pol, VCR_unpol, ECr_pol, ECr_unpol, f, Df, D2f, D3f, DZeta, D2Zeta, D3Zeta;
690 switch (ST) {
691 case SpinUp:
692 case SpinDown:
693 // store some function calls for faster and easierly understandable operation
694 VVVCR_unpol = CalcVVVCr(EC,rs,unpolarised);
695 VVVCR_pol = CalcVVVCr(EC,rs,polarised);
696 VCR_unpol = CalcVCr(EC,rs,unpolarised);
697 VCR_pol = CalcVCr(EC,rs,polarised);
698 ECr_pol = CalcECr(EC,rs,polarised);
699 ECr_unpol = CalcECr(EC,rs,unpolarised);
700 f = Calcf(EC,zeta);
701 Df = CalcDf(EC,zeta);
702 D2Zeta = CalcD2zeta(EC,ST,pUp,pDown);
703 D3Zeta = CalcD3zeta(EC,ST,pUp,pDown);
704 if (CalcDzeta(EC,ST,pUp,pDown) != 0.0) {
705 VVCR_unpol = CalcVVCr(EC,rs,unpolarised);
706 VVCR_pol = CalcVVCr(EC,rs,polarised);
707 D2f = CalcD2f(EC,zeta);
708 D3f = CalcD3f(EC,zeta);
709 DZeta = CalcDzeta(EC,ST,pUp,pDown);
710 res = VVVCR_unpol + f*(VVVCR_pol-VVVCR_unpol) + 3.*DZeta*Df*(VVCR_pol-VVCR_unpol) + 3.*(DZeta*DZeta*D2f + Df*D2Zeta)*(VCR_pol-VCR_unpol) + (ECr_pol-ECr_unpol)*(pUp+pDown)*(D3Zeta*Df + 3*D2f*DZeta*D2Zeta + DZeta*DZeta*DZeta*D3f); //formula checked (16.5.06)
711 } else {
712 res = VVVCR_unpol + f*(VVVCR_pol-VVVCR_unpol) + 3.*Df*D2Zeta*(VCR_pol-VCR_unpol) + (ECr_pol-ECr_unpol)*(pUp+pDown)*(D3Zeta*Df); //formula checked (16.5.06)
713 }
714 break;
715 case SpinDouble:
716 res = CalcVVVCr(EC,rs,unpolarised);
717 break;
718 }
719 return (res);
720}
721
722/** SpinType-dependent calculation of exchange and correlation energy with free spin-polarisation without riemann tensor.
723 * Discretely does the integration of \f${\cal E}_{xc} (n,\zeta) \cdot n\f$ on
724 * the radial mesh of the respective real densities.<br>
725 * Takes either whole density or separated for each SpinType and calls
726 * Calcrs(), then summing each CalcSEXr() for each Density::LocalSizeR
727 * and times factor RunStruct::XCEnergyFactor / LatticeLevel::MaxN
728 * \param *P Problem at hand
729 */
730void CalculateXCEnergyNoRT(struct Problem *P)
731{
732 struct Lattice *Lat = &P->Lat;
733 struct Energy *E = Lat->E;
734 struct PseudoPot *PP = &P->PP;
735 struct RunStruct *R = &P->R;
736 struct LatticeLevel *Lev0 = R->Lev0;
737 struct Psis *Psi = &Lat->Psi;
738 struct Density *Dens = Lev0->Dens;
739 struct ExCor *EC = &P->ExCo;
740 double SumEc = 0;
741 //double SumEx_GC = 0.; // Gradient correction part according to Becke '92
742 double rs, p = 0.0, pUp = 0.0, pDown = 0.0, zeta, rsUp, rsDown, SumEx=0.0;
743 double Factor = R->XCEnergyFactor/Lev0->MaxN;
744 //double Dp, DpUp, DpDown;
745 int i;
746
747 for (i = 0; i < Dens->LocalSizeR; i++) { // for each node in radial mesh
748 // put (corecorrected) densities in p, pUp, pDown
749 p = Dens->DensityArray[TotalDensity][i];
750 //Dp = DensityGradient(Dens->DensityArray[TotalDensity], i, Lev0, Lat);
751 if (R->CurrentMin > UnOccupied)
752 if (PP->corecorr == CoreCorrected)
753 p += Dens->DensityArray[CoreWaveDensity][i];
754 switch (Psi->PsiST) {
755 default:
756 case SpinDouble:
757 pUp = 0.5*p;
758 pDown = 0.5*p;
759 //DpUp = 0.5*Dp;
760 //DpDown = 0.5*Dp;
761 break;
762 case SpinUp:
763 case SpinDown:
764 pUp = Dens->DensityArray[TotalUpDensity][i];
765 pDown = Dens->DensityArray[TotalDownDensity][i];
766 //DpUp = DensityGradient(Dens->DensityArray[TotalUpDensity], i, Lev0, Lat);
767 //DpDown = DensityGradient(Dens->DensityArray[TotalDownDensity], i, Lev0, Lat);
768 if (PP->corecorr == CoreCorrected) {
769 pUp += 0.5*Dens->DensityArray[CoreWaveDensity][i];
770 pDown += 0.5*Dens->DensityArray[CoreWaveDensity][i];
771 }
772 break;
773 }
774 // set all to zero if one of them is negative
775 if ((p < 0) || (pUp < 0) || (pDown < 0)) {
776 /*fprintf(stderr,"index %i pc %g p %g\n",i,Dens->DensityArray[CoreWaveDensity][i],p);*/
777 p = 0.0;
778 pUp = 0.0;
779 pDown = 0.0;
780 }
781 // Calculation with the densities and summation
782 rs = Calcrs(EC,p);
783 rsUp = Calcrs(EC,pUp);
784 rsDown = Calcrs(EC,pDown);
785 SumEx += CalcSEXr(EC, rsUp, rsDown, pUp, pDown);
786 zeta = CalcZeta(EC,pUp,pDown);
787 SumEc += CalcSECr(EC, rs, zeta, p);
788 //SumEx_GC += CalcSE_GC(EC, pUp, DpUp);
789 //SumEx_GC += CalcSE_GC(EC, pDown, DpDown);
790 }
791 E->AllLocalDensityEnergy[CorrelationEnergy] = Factor*SumEc;
792 E->AllLocalDensityEnergy[ExchangeEnergy] = Factor*(SumEx); // - SumEx_GC);
793}
794
795/** Returns \f$y = \sinh^{-1}(x)\f$.
796 * Recall that \f$ x = sinh (y) = \frac{\exp(y)-\exp(-y)}{2}\f$. Then, solve the in \f$\exp(y)\f$ quadratic
797 * equation: \f$\exp(2y) - 1 - 2x\exp(y) = 0\f$ by pq-formula.
798 * \param arg argument \f$x\f$
799 * \return \f$\sinh^{-1}(x) = \ln(x+\sqrt{x^2+1})\f$
800 */
801inline static double sinh_inverse(double arg)
802{
803 return log(arg+sqrt(arg*arg+1));
804}
805
806/** Gradient correction according to Becke '92.
807 * \param EC ExCor structure
808 * \param p \f$\rho\f$ local density
809 * \param Dp \f$|\nabla \rho|\f$ local magnitude of density gradient
810 * \return \f$b \rho^{4/3} \frac{x^2}{(1+6bx \sinh^-1 x}\f$ with \f$x = \frac{|\nabla \rho|}{\rho^{4/3}}\f$
811 */
812double CalcSE_GC(struct ExCor *EC, double p, double Dp)
813{
814 double res = 0.;
815 double b = 0.0042; // in atomic units, empirical constant fitted to noble gas atoms
816 double x = Dp/pow(p, 4./3.);
817 res = b * pow(p, 4./3.) * x/(1+6.*b*x*sinh_inverse(x));
818
819 return res;
820}
821
822/** Evaluates magnitude of gradient by simple 3-star.
823 * \param *density density array
824 * \param i current node
825 * \param *Lev LatticeLevel structure for number of nodes per axis
826 * \param *Lat Lattice structure for axis lengths
827 * \return \f$|\nabla\rho|\f$
828 */
829double DensityGradient(fftw_real *density, int i, struct LatticeLevel *Lev, struct Lattice *Lat)
830{
831 double res=0., right_diff, left_diff;
832 int neighbour[NDIM], nodes[NDIM];
833 nodes[0] = Lev->Plan0.plan->local_nx;
834 nodes[1] = Lev->Plan0.plan->N[1];
835 nodes[2] = Lev->Plan0.plan->N[2];
836 neighbour[0] = Lev->Plan0.plan->N[1] * Lev->Plan0.plan->N[2];
837 neighbour[1] = Lev->Plan0.plan->N[2];
838 neighbour[2] = 1.;
839 int k, l, nr, i_check = i;
840 double h;
841
842 //iS = n[2] + N[2]*(n[1] + N[1]*n0); // howto access the array ...
843
844 for (k=NDIM-1;k>=0;k--) { // for each axis
845 h = 0.;
846 for (l=0;l<NDIM;l++)
847 h += Lat->RealBasis[k*NDIM+l]/Lev->Plan0.plan->N[k]; // finite distance
848 h = sqrt(h);
849 // check which limit exists: right, left, both?
850 right_diff = 0.;
851 left_diff = 0.;
852 nr = 0; // neighbour counter
853 if (i_check % nodes[k] != nodes[k]-1) {// right neighbour?
854 right_diff = density[i] - density[i+neighbour[k]];
855 nr++;
856 }
857 if (i_check % nodes[k] != 0) { // left neighbour?
858 left_diff = density[i] - density[i-neighbour[k]];
859 nr++;
860 }
861 res += (left_diff + right_diff)/(h*nr) * (left_diff + right_diff)/(h*nr);
862 i_check /= nodes[k]; // remove axis from i_check
863 }
864
865 return sqrt(res);
866}
867
868/** SpinType-dependent calculation of exchange and correlation with free spin-polarisation energy with riemann tensor.
869 * Discretely does the integration of \f${\cal E}_{xc} (n,\zeta) \cdot n\f$ on
870 * the radial mesh of the respective real densities.<br>
871 *
872 * Like CalculateXCEnergyNoRT(), only CalcSEXr() and CalcSECr() are
873 * divided by RTFactor Lattice->RT.DensityR
874 * \param *P Problem at hand
875 */
876void CalculateXCEnergyUseRT(struct Problem *P)
877{
878 struct Lattice *Lat = &P->Lat;
879 struct Energy *E = Lat->E;
880 struct PseudoPot *PP = &P->PP;
881 struct RunStruct *R = &P->R;
882 struct LatticeLevel *Lev0 = R->Lev0;
883 struct Psis *Psi = &Lat->Psi;
884 struct Density *Dens = Lev0->Dens;
885 struct ExCor *EC = &P->ExCo;
886 double SumEc = 0;
887 double rs, p = 0.0, pUp = 0.0, pDown = 0.0, zeta, rsUp, rsDown, SumEx = 0.0;
888 double Factor = R->XCEnergyFactor/Lev0->MaxN;
889 int i;
890 fftw_real *RTFactor = Lat->RT.DensityR[RTADetPreRT];
891
892 for (i = 0; i < Dens->LocalSizeR; i++) { // for each point of radial mesh take density p[i]
893 p = Dens->DensityArray[TotalDensity][i];
894 if (PP->corecorr == CoreCorrected)
895 p += Dens->DensityArray[CoreWaveDensity][i];
896 switch (Psi->PsiST) {
897 case SpinDouble:
898 pUp = 0.5*p;
899 pDown = 0.5*p;
900 break;
901 case SpinUp:
902 case SpinDown:
903 pUp = Dens->DensityArray[TotalUpDensity][i];
904 pDown = Dens->DensityArray[TotalDownDensity][i];
905 if (PP->corecorr == CoreCorrected) {
906 pUp += 0.5*Dens->DensityArray[CoreWaveDensity][i];
907 pDown += 0.5*Dens->DensityArray[CoreWaveDensity][i];
908 }
909 break;
910 default:
911 ;
912 }
913 if ((p < 0) || (pUp < 0) || (pDown < 0)) {
914 /*fprintf(stderr,"index %i pc %g p %g\n",i,Dens->DensityArray[CoreWaveDensity][i],p);*/
915 p = 0.0;
916 pUp = 0.0;
917 pDown = 0.0;
918 }
919 // .. calculate Ec and Ex and sum them up ...
920 rs = Calcrs(EC,p);
921 rsUp = Calcrs(EC,pUp);
922 rsDown = Calcrs(EC,pDown);
923 SumEx += CalcSEXr(EC, rsUp, rsDown, pUp, pDown)/fabs(RTFactor[i]);
924 zeta = CalcZeta(EC,pUp,pDown);
925 SumEc += CalcSECr(EC, rs, zeta, p)/fabs(RTFactor[i]);
926 }
927 // ... and factorise with discrete integration width
928 E->AllLocalDensityEnergy[CorrelationEnergy] = Factor*SumEc;
929 E->AllLocalDensityEnergy[ExchangeEnergy] = Factor*SumEx;
930}
931
932/** Calculates SpinType-dependently exchange correlation potential with free spin-polarisation without Riemann tensor.
933 * Goes through all possible nodes, calculates the potential and stores it in \a *HGR
934 * \param *P Problem at hand
935 * \param *HGR pointer storage array for (added!) result: \f$V_c (n,\zeta)(R) + V_x (n,\zeta)(R)\f$
936 * \sa CalcSVXr(), CalcSVCr()
937 */
938void CalculateXCPotentialNoRT(struct Problem *P, fftw_real *HGR)
939{
940 struct Lattice *Lat = &P->Lat;
941 struct PseudoPot *PP = &P->PP;
942 struct RunStruct *R = &P->R;
943 struct LatticeLevel *Lev0 = R->Lev0;
944 struct LatticeLevel *LevS = R->LevS;
945 struct Psis *Psi = &Lat->Psi;
946 struct Density *Dens = Lev0->Dens;
947 struct ExCor *EC = &P->ExCo;
948 double rsX, rsC, zeta, p = 0.0, pUp = 0.0, pDown = 0.0;
949 int nx,ny,nz,i;
950 const int Nx = LevS->Plan0.plan->local_nx;
951 const int Ny = LevS->Plan0.plan->N[1];
952 const int Nz = LevS->Plan0.plan->N[2];
953 const int NUpx = LevS->NUp[0]; // factors due to density being calculated on a finer grid
954 const int NUpy = LevS->NUp[1];
955 const int NUpz = LevS->NUp[2];
956 double tmp;
957 for (nx=0;nx<Nx;nx++)
958 for (ny=0;ny<Ny;ny++)
959 for (nz=0;nz<Nz;nz++) {
960 i = nz*NUpz+Nz*NUpz*(ny*NUpy+Ny*NUpy*nx*NUpx);
961 p = Dens->DensityArray[TotalDensity][i];
962 //if (isnan(p)) { fprintf(stderr,"WARNGING: CalculateXCPotentialNoRT(): p_%i = NaN!\n", i); Error(SomeError, "NaN-Fehler!"); }
963 if (PP->corecorr == CoreCorrected)
964 p += Dens->DensityArray[CoreWaveDensity][i];
965 switch (Psi->PsiST) {
966 case SpinDouble:
967 pUp = 0.5*p;
968 pDown = 0.5*p;
969 break;
970 case SpinUp:
971 case SpinDown:
972 pUp = Dens->DensityArray[TotalUpDensity][i];
973 pDown = Dens->DensityArray[TotalDownDensity][i];
974 if (PP->corecorr == CoreCorrected) { // additional factor due to PseudoPot'entials
975 pUp += 0.5*Dens->DensityArray[CoreWaveDensity][i];
976 pDown += 0.5*Dens->DensityArray[CoreWaveDensity][i];
977 }
978 break;
979 default:
980 ;
981 }
982 //if (isnan(pUp)) { fprintf(stderr,"WARNGING: CalculateXCPotentialNoRT(): pUp_%i = NaN!\n", i); Error(SomeError, "NaN-Fehler!"); }
983 //if (isnan(pDown)) { fprintf(stderr,"WARNGING: CalculateXCPotentialNoRT(): pDown_%i = NaN!\n", i); Error(SomeError, "NaN-Fehler!"); }
984 if ((p < 0) || (pUp < 0) || (pDown < 0)) {
985 p = 0;
986 pUp = 0;
987 pDown = 0;
988 }
989 switch (Psi->PsiST) {
990 case SpinUp:
991 rsX = Calcrs(EC, pUp);
992 break;
993 case SpinDown:
994 rsX = Calcrs(EC, pDown);
995 break;
996 case SpinDouble:
997 //rsX = Calcrs(EC,p/2.); // why half of it???
998 rsX = Calcrs(EC, p);
999 break;
1000 default:
1001 rsX = 0.0;
1002 }
1003 rsC = Calcrs(EC,p);
1004 zeta = CalcZeta(EC,pUp,pDown);
1005 //if (isnan(rsC)) { fprintf(stderr,"WARNGING: CalculateXCPotentialNoRT(): rsC%i = NaN!\n", i); Error(SomeError, "NaN-Fehler!"); }
1006 //if (isnan(zeta)) { fprintf(stderr,"WARNGING: CalculateXCPotentialNoRT(): zeta%i = NaN!\n", i); Error(SomeError, "NaN-Fehler!"); }
1007 switch (R->CurrentMin) {
1008 case UnOccupied: // here epsilon appears instead of the potential in the integrand due to different variation
1009 tmp = CalcSEXr(EC,Calcrs(EC, pUp),Calcrs(EC, pDown),pUp,pDown); // \todo ../p was here before test!
1010 //if (isnan(tmp)) { fprintf(stderr,"WARNGING: CalculateXCPotentialNoRT(): tmp_%i = NaN!\n", i); Error(SomeError, "NaN-Fehler!"); }
1011 tmp += CalcSECr(EC, rsX,zeta, 1);
1012 //if (isnan(tmp)) { fprintf(stderr,"WARNGING: CalculateXCPotentialNoRT(): tmp_%i += NaN!\n", i); Error(SomeError, "NaN-Fehler!"); }
1013 break;
1014 default:
1015 tmp = CalcSVXr(EC,rsX,Psi->PsiST);
1016 //if (isnan(tmp)) { fprintf(stderr,"WARNGING: CalculateXCPotentialNoRT(): tmp_%i def= NaN!\n", i); Error(SomeError, "NaN-Fehler!"); }
1017 tmp += CalcSVCr(EC, rsC,zeta,Psi->PsiST);
1018 //if (isnan(tmp)) { fprintf(stderr,"WARNGING: CalculateXCPotentialNoRT(): tmp_%i def+= NaN!\n", i); Error(SomeError, "NaN-Fehler!"); }
1019 break;
1020 }
1021 //if (isnan(tmp)) { fprintf(stderr,"WARNGING: CalculateXCPotentialNoRT(): tmp_%i := NaN!\n", i); Error(SomeError, "NaN-Fehler!"); }
1022 HGR[i] += tmp;
1023 //if (isnan(HGR[i])) { fprintf(stderr,"WARNGING: CalculateXCPotentialNoRT(): HGR[%i] = NaN!\n", i); Error(SomeError, "NaN-Fehler!"); }
1024 }
1025}
1026
1027/** Calculates SpinType-dependently derivative of exchange correlation potential with free spin-polarisation without Riemann tensor.
1028 * \f[
1029 * A^{XC} = \sum_R \frac{\delta V^{XC}}{\delta n} \rho^2 \qquad (\textnormal{section 5.1, line search})
1030 * \f]
1031 * With the density from Dens::DensityArray calculates discretely the integral over the summed
1032 * derivative, SpinType is taken from Psi::PsiST. Due to the principle of the theory the wave
1033 * functions themselves are not needed explicitely, see also CalculateXCEnergyNoRT()
1034 * \param *P Problem at hand
1035 * \param *PsiCD \f$\rho (r)\f$
1036 * \return \f$A^{XC}\f$
1037 * \sa CalcSVVXr(), CalcSVVCr() - derivatives of exchange and correlation potential
1038 */
1039double CalculateXCddEddt0NoRT(struct Problem *P, fftw_real *PsiCD)
1040{
1041 struct Lattice *Lat = &P->Lat;
1042 struct PseudoPot *PP = &P->PP;
1043 struct RunStruct *R = &P->R;
1044 struct LatticeLevel *Lev0 = R->Lev0;
1045 struct Psis *Psi = &Lat->Psi;
1046 struct Density *Dens = Lev0->Dens;
1047 struct ExCor *EC = &P->ExCo;
1048 double SumExc = 0.;
1049 double rsX=0.0, rsC, p = 0.0, pUp = 0.0, pDown = 0.0, zeta;
1050 double Factor = R->XCEnergyFactor/Lev0->MaxN;
1051 int i;
1052
1053 for (i = 0; i < Dens->LocalSizeR; i++) {
1054 p = Dens->DensityArray[TotalDensity][i];
1055 if (PP->corecorr == CoreCorrected)
1056 p += Dens->DensityArray[CoreWaveDensity][i];
1057 switch (Psi->PsiST) {
1058 case SpinDouble:
1059 pUp = 0.5*p;
1060 pDown = 0.5*p;
1061 break;
1062 case SpinUp:
1063 case SpinDown:
1064 pUp = Dens->DensityArray[TotalUpDensity][i];
1065 pDown = Dens->DensityArray[TotalDownDensity][i];
1066 if (PP->corecorr == CoreCorrected) {
1067 pUp += 0.5*Dens->DensityArray[CoreWaveDensity][i];
1068 pDown += 0.5*Dens->DensityArray[CoreWaveDensity][i];
1069 }
1070 break;
1071 default:
1072 ;
1073 }
1074 if ((p < 0) || (pUp < 0) || (pDown < 0)) {
1075 /*fprintf(stderr,"index %i pc %g p %g\n",i,Dens->DensityArray[CoreWaveDensity][i],p);*/
1076 p = 0.0;
1077 pUp = 0.0;
1078 pDown = 0.0;
1079 }
1080 switch (Psi->PsiST) {
1081 case SpinUp:
1082 rsX = Calcrs(EC,pUp);
1083 break;
1084 case SpinDown:
1085 rsX = Calcrs(EC,pDown);
1086 break;
1087 case SpinDouble:
1088 //rsX = Calcrs(EC,p/2.); // why half of it???
1089 rsX = Calcrs(EC,p);
1090 break;
1091 }
1092 rsC = Calcrs(EC,p);
1093 zeta = CalcZeta(EC,pUp,pDown);
1094 SumExc += (CalcSVVXr(EC,rsX,Psi->PsiST) + CalcSVVCr(EC, rsC,zeta,Psi->PsiST,pUp,pDown))*PsiCD[i]*PsiCD[i];
1095 }
1096 return (SumExc*Factor);
1097}
1098
1099/** Initialises ExCor structure with parametrization values.
1100 * All of the entries in the structure are set to parametrization values, see [CA80].
1101 * \param *P Problem at hand
1102 * \param *EC Exchange correlation ExCor structure
1103 */
1104void InitExchangeCorrelationEnergy(struct Problem *P, struct ExCor *EC)
1105{
1106 EC->gamma[unpolarised] = -0.1423;
1107 EC->beta_1[unpolarised] = 1.0529;
1108 EC->beta_2[unpolarised] = 0.3334;
1109 EC->C[unpolarised] = 0.0020;
1110 EC->D[unpolarised] = -0.0116;
1111 EC->A[unpolarised] = 0.0311;
1112 EC->B[unpolarised] = -0.048;
1113 EC->gamma[polarised] = -0.0843;
1114 EC->beta_1[polarised] = 1.3981;
1115 EC->beta_2[polarised] = 0.2611;
1116 EC->C[polarised] = 0.0007;
1117 EC->D[polarised] = -0.0048;
1118 EC->A[polarised] = 0.01555;
1119 EC->B[polarised] = -0.0269;
1120 EC->fac34pi = -3./(4.*PI);
1121 EC->facexrs = EC->fac34pi*pow(9.*PI/4.,1./3.);
1122 EC->epsilon0 = MYEPSILON;
1123 EC->fac6PI23 = pow(6./PI,2./3.);
1124 EC->facPI213 = pow(PI/2.,1./3.);
1125 EC->fac3PI23 = pow(3.*PI,2./3.);
1126 EC->fac6PIPI23 = pow(6.*PI*PI,2./3.);
1127 EC->fac243 = pow(2.,4./3.);
1128 EC->fac1213 = pow(1./2.,1./3.);
1129}
Note: See TracBrowser for help on using the repository browser.