Skip to content

Commit 6d453d8

Browse files
authored
Merge pull request #1103 from ouqi0711/develop
Add missed Perdew-Wang correlation part for PBE0 functional
2 parents 577f980 + 050d9a0 commit 6d453d8

File tree

5 files changed

+36
-7
lines changed

5 files changed

+36
-7
lines changed

source/input_conv.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,7 @@ void Input_Conv::Convert(void)
362362
if (GlobalC::exx_global.info.hybrid_type != Exx_Global::Hybrid_Type::No)
363363
{
364364
GlobalC::exx_global.info.hybrid_alpha = INPUT.exx_hybrid_alpha;
365+
XC_Functional::get_hybrid_alpha(INPUT.exx_hybrid_alpha);
365366
GlobalC::exx_global.info.hse_omega = INPUT.exx_hse_omega;
366367
GlobalC::exx_global.info.separate_loop = INPUT.exx_separate_loop;
367368
GlobalC::exx_global.info.hybrid_step = INPUT.exx_hybrid_step;

source/module_xc/xc_functional.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ XC_Functional::~XC_Functional(){}
99
std::vector<int> XC_Functional::func_id(1);
1010
int XC_Functional::func_type = 0;
1111
bool XC_Functional::use_libxc = true;
12+
double XC_Functional::hybrid_alpha = 0.25;
13+
14+
void XC_Functional::get_hybrid_alpha(const double alpha_in)
15+
{
16+
hybrid_alpha = alpha_in;
17+
}
1218

1319
int XC_Functional::get_func_type()
1420
{

source/module_xc/xc_functional.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ class XC_Functional
8383

8484
static int get_func_type();
8585
static void set_xc_type(const std::string xc_func_in);
86+
static void get_hybrid_alpha(const double alpha_in);
8687
#ifdef USE_LIBXC
8788
static void set_xc_type_libxc(const std::string xc_func_in);
8889
static std::vector<xc_func_type> init_func(const int xc_polarized);
@@ -94,6 +95,9 @@ class XC_Functional
9495
static int func_type; //0:none, 1:lda, 2:gga, 3:mgga, 4:hybrid
9596
static bool use_libxc;
9697

98+
//exx_hybrid_alpha for mixing exx in hybrid functional:
99+
static double hybrid_alpha;
100+
97101
//-------------------
98102
// xc_functional_wrapper_xc.cpp
99103
//-------------------

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 - XC_Functional::hybrid_alpha);
84+
v1x *= (1.0 - XC_Functional::hybrid_alpha);
85+
v2x *= (1.0 - XC_Functional::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 - XC_Functional::hybrid_alpha);
185+
v1xup *= (1.0 - XC_Functional::hybrid_alpha);
186+
v2xup *= (1.0 - XC_Functional::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 - XC_Functional::hybrid_alpha);
192+
v1xdw *= (1.0 - XC_Functional::hybrid_alpha);
193+
v2xdw *= (1.0 - XC_Functional::hybrid_alpha);
188194
}
189195
break;
190196
case XC_GGA_X_PBE_SOL: //PBXsol

source/module_xc/xc_functional_wrapper_xc.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,13 @@ void XC_Functional::xc(const double &rho, double &exc, double &vxc)
3333
// Exchange functionals containing attenuated slater exchange
3434
case XC_HYB_GGA_XC_PBEH:
3535
// PBE0
36-
XC_Functional::slater(rs, e, v);
37-
e *= 0.75; v*= 0.75;
36+
double ex, vx, ec, vc;
37+
XC_Functional::slater(rs, ex, vx);
38+
ex *= (1 - XC_Functional::hybrid_alpha);
39+
vx *= (1 - XC_Functional::hybrid_alpha);
40+
XC_Functional::pw(rs, 0, ec, vc);
41+
e = ex + ec;
42+
v = vx + vc;
3843
break;
3944

4045
// Correlation functionals containing PW correlation
@@ -85,8 +90,15 @@ void XC_Functional::xc_spin(const double &rho, const double &zeta,
8590
// Exchange functionals containing attenuated slater exchange
8691
case XC_HYB_GGA_XC_PBEH:
8792
// PBE0
88-
XC_Functional::slater_spin(rho, zeta, e, vup, vdw);
89-
e *= 0.75; vup *= 0.75; vdw *=0.75;
93+
double ex, vupx, vdwx, ec, vupc, vdwc;
94+
XC_Functional::slater_spin(rho, zeta, ex, vupx, vdwx);
95+
ex *= (1.0 - XC_Functional::hybrid_alpha);
96+
vupx *= (1.0 - XC_Functional::hybrid_alpha);
97+
vdwx *= (1.0 - XC_Functional::hybrid_alpha);
98+
XC_Functional::pw_spin(rs, zeta, ec, vupc, vdwc);
99+
e = ex + ec;
100+
vup = vupx + vupc;
101+
vdw = vdwx + vdwc;
90102
break;
91103

92104
// Correlation functionals containing PZ correlation

0 commit comments

Comments
 (0)