Skip to content

Commit 6087a1f

Browse files
committed
add missed slater correlation part for PBE0
1 parent c2078f8 commit 6087a1f

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

source/module_xc/xc_functional_wrapper_gcxc.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ void XC_Functional::gcxc(const double &rho, const double &grho, double &sxc,
8080
case XC_HYB_GGA_XC_PBEH: //PBE0
8181
double sx, v1x, v2x, sc, v1c, v2c;
8282
XC_Functional::pbex(rho, grho, 0, sx, v1x, v2x);
83-
sx *= 0.75; v1x *= 0.75; v2x *= 0.75;
83+
sx *= (1.0 - GlobalC::exx_global.info.hybrid_alpha);
84+
v1x *= (1.0 - GlobalC::exx_global.info.hybrid_alpha);
85+
v2x *= (1.0 - GlobalC::exx_global.info.hybrid_alpha);
8486
XC_Functional::pbec(rho, grho, 0, sc, v1c, v2c);
8587
s = sx + sc;
8688
v1 = v1x + v1c;
@@ -179,12 +181,16 @@ void XC_Functional::gcx_spin(double rhoup, double rhodw, double grhoup2, double
179181
if (rhoup > small && sqrt(fabs(grhoup2)) > small)
180182
{
181183
XC_Functional::pbex(2.0 * rhoup, 4.0 * grhoup2, 0, sxup, v1xup, v2xup);
182-
sxup *= 0.75; v1xup *= 0.75; v2xup *= 0.75;
184+
sxup *= (1.0 - GlobalC::exx_global.info.hybrid_alpha);
185+
v1xup *= (1.0 - GlobalC::exx_global.info.hybrid_alpha);
186+
v2xup *= (1.0 - GlobalC::exx_global.info.hybrid_alpha);
183187
}
184188
if (rhodw > small && sqrt(fabs(grhodw2)) > small)
185189
{
186190
XC_Functional::pbex(2.0 * rhodw, 4.0 * grhodw2, 0, sxdw, v1xdw, v2xdw);
187-
sxdw *= 0.75; v1xdw *= 0.75; v2xdw *= 0.75;
191+
sxdw *= (1.0 - GlobalC::exx_global.info.hybrid_alpha);
192+
v1xdw *= (1.0 - GlobalC::exx_global.info.hybrid_alpha);
193+
v2xdw *= (1.0 - GlobalC::exx_global.info.hybrid_alpha);
188194
}
189195
break;
190196
case XC_GGA_X_PBE_SOL: //PBXsol

source/module_xc/xc_functional_wrapper_xc.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
// 3. xc_spin_libxc, which is the wrapper for LDA functional, spin polarized
77

88
#include "xc_functional.h"
9+
#include "../src_pw/global.h"
10+
#include "../module_base/global_function.h"
911
#include <stdexcept>
1012

1113
void XC_Functional::xc(const double &rho, double &exc, double &vxc)
@@ -33,8 +35,13 @@ void XC_Functional::xc(const double &rho, double &exc, double &vxc)
3335
// Exchange functionals containing attenuated slater exchange
3436
case XC_HYB_GGA_XC_PBEH:
3537
// PBE0
36-
XC_Functional::slater(rs, e, v);
37-
e *= 0.75; v*= 0.75;
38+
double ex, vx, ec, vc;
39+
XC_Functional::slater(rs, ex, vx);
40+
ex *= (1 - GlobalC::exx_global.info.hybrid_alpha);
41+
vx *= (1 - GlobalC::exx_global.info.hybrid_alpha);
42+
XC_Functional::pw(rs, 0, ec, vc);
43+
e = ex + ec;
44+
v = vx + vc;
3845
break;
3946

4047
// Correlation functionals containing PW correlation
@@ -85,8 +92,15 @@ void XC_Functional::xc_spin(const double &rho, const double &zeta,
8592
// Exchange functionals containing attenuated slater exchange
8693
case XC_HYB_GGA_XC_PBEH:
8794
// PBE0
88-
XC_Functional::slater_spin(rho, zeta, e, vup, vdw);
89-
e *= 0.75; vup *= 0.75; vdw *=0.75;
95+
double ex, vupx, vdwx, ec, vupc, vdwc;
96+
XC_Functional::slater_spin(rho, zeta, ex, vupx, vdwx);
97+
ex *= (1.0 - GlobalC::exx_global.info.hybrid_alpha);
98+
vupx *= (1.0 - GlobalC::exx_global.info.hybrid_alpha);
99+
vdwx *= (1.0 - GlobalC::exx_global.info.hybrid_alpha);
100+
XC_Functional::pz_spin(rs, zeta, ec, vupc, vdwc);
101+
e = ex + ec;
102+
vup = vupx + vupc;
103+
vdw = vdwx + vdwc;
90104
break;
91105

92106
// Correlation functionals containing PZ correlation

0 commit comments

Comments
 (0)