22#include " module_hamilt_pw/hamilt_pwdft/global.h"
33#include " module_parameter/parameter.h"
44#include " module_base/global_function.h"
5+ #ifdef USE_PAW
6+ #include " module_cell/module_paw/paw_cell.h"
7+ #endif
58
69#ifdef USE_LIBXC
710#include " xc_functional_libxc.h"
@@ -13,7 +16,6 @@ XC_Functional::~XC_Functional(){}
1316
1417std::vector<int > XC_Functional::func_id (1 );
1518int XC_Functional::func_type = 0 ;
16- bool XC_Functional::ked_flag = false ;
1719bool XC_Functional::use_libxc = true ;
1820double XC_Functional::hybrid_alpha = 0.25 ;
1921std::map<int , double > XC_Functional::scaling_factor_xc = { {1 , 1.0 } }; // added by jghan, 2024-10-10
@@ -23,6 +25,15 @@ void XC_Functional::set_hybrid_alpha(const double alpha_in)
2325 hybrid_alpha = alpha_in;
2426}
2527
28+ double XC_Functional::get_hybrid_alpha ()
29+ {
30+ return hybrid_alpha;
31+ }
32+
33+ int XC_Functional::get_func_type ()
34+ {
35+ return func_type;
36+ }
2637void XC_Functional::set_xc_first_loop (const UnitCell& ucell)
2738{
2839 /* * In the special "two-level" calculation case,
@@ -58,98 +69,123 @@ void XC_Functional::set_xc_type(const std::string xc_func_in)
5869 scaling_factor_xc.clear (); // added by jghan, 2024-07-07
5970 std::string xc_func = xc_func_in;
6071 std::transform (xc_func.begin (), xc_func.end (), xc_func.begin (), (::toupper));
61- if ( xc_func == " LDA" || xc_func == " PZ" || xc_func == " SLAPZNOGXNOGC" ) // SLA+PZ
62- {
72+ if ( xc_func == " LDA" || xc_func == " PZ" || xc_func == " SLAPZNOGXNOGC" ) // SLA+PZ
73+ {
6374 func_id.push_back (XC_LDA_X);
6475 func_id.push_back (XC_LDA_C_PZ);
6576 func_type = 1 ;
6677 use_libxc = false ;
67- }
78+ #ifdef USE_PAW
79+ if (PARAM.inp .use_paw )
80+ {
81+ if (PARAM.inp .nspin != 1 )
82+ {
83+ ModuleBase::WARNING_QUIT (" set_xc_type" ," paw does not support pz with spin polarization" );
84+ }
85+ else
86+ {
87+ GlobalC::paw_cell.set_libpaw_xc (1 ,2 );
88+ }
89+ }
90+ #endif
91+ }
6892 else if (xc_func == " PWLDA" )
6993 {
7094 func_id.push_back (XC_LDA_X);
7195 func_id.push_back (XC_LDA_C_PW);
7296 func_type = 1 ;
7397 use_libxc = false ;
98+ #ifdef USE_PAW
99+ if (PARAM.inp .use_paw ) { GlobalC::paw_cell.set_libpaw_xc (1 ,7 );
100+ }
101+ #endif
74102 }
75- else if ( xc_func == " PBE" || xc_func == " SLAPWPBXPBC" ) // PBX+PBC
76- {
103+ else if ( xc_func == " PBE" || xc_func == " SLAPWPBXPBC" ) // PBX+PBC
104+ {
77105 func_id.push_back (XC_GGA_X_PBE);
78106 func_id.push_back (XC_GGA_C_PBE);
79107 func_type = 2 ;
80108 use_libxc = false ;
81- }
82- else if ( xc_func == " PBESOL" ) // PBX_S+PBC_S
83- {
109+ #ifdef USE_PAW
110+ if (PARAM.inp .use_paw ) { GlobalC::paw_cell.set_libpaw_xc (2 ,11 );
111+ }
112+ #endif
113+ }
114+ else if ( xc_func == " PBESOL" ) // PBX_S+PBC_S
115+ {
84116 func_id.push_back (XC_GGA_X_PBE_SOL);
85117 func_id.push_back (XC_GGA_C_PBE_SOL);
86118 func_type = 2 ;
87119 use_libxc = false ;
88- }
89- else if ( xc_func == " REVPBE" ) // PBX_r+PBC
90- {
91- func_id.push_back (XC_GGA_X_PBE_R);
120+ }
121+ else if ( xc_func == " REVPBE" ) // PBX_r+PBC
122+ {
123+ func_id.push_back (XC_GGA_X_PBE_R);
92124 func_id.push_back (XC_GGA_C_PBE);
93125 func_type = 2 ;
94126 use_libxc = false ;
95- }
96- else if ( xc_func == " WC" ) // WC+PBC
97- {
127+ #ifdef USE_PAW
128+ if (PARAM.inp .use_paw ) { GlobalC::paw_cell.set_libpaw_xc (2 ,14 );
129+ }
130+ #endif
131+ }
132+ else if ( xc_func == " WC" ) // WC+PBC
133+ {
98134 func_id.push_back (XC_GGA_X_WC);
99135 func_id.push_back (XC_GGA_C_PBE);
100136 func_type = 2 ;
101137 use_libxc = false ;
102- }
103- else if ( xc_func == " BLYP" ) // B88+LYP
104- {
138+ }
139+ else if ( xc_func == " BLYP" ) // B88+LYP
140+ {
105141 func_id.push_back (XC_GGA_X_B88);
106142 func_id.push_back (XC_GGA_C_LYP);
107143 func_type = 2 ;
108144 use_libxc = false ;
109- }
110- else if ( xc_func == " BP" ) // B88+P86
111- {
145+ }
146+ else if ( xc_func == " BP" ) // B88+P86
147+ {
112148 func_id.push_back (XC_GGA_X_B88);
113149 func_id.push_back (XC_GGA_C_P86);
114150 func_type = 2 ;
115151 use_libxc = false ;
116- }
117- else if ( xc_func == " PW91" ) // PW91_X+PW91_C
118- {
152+ }
153+ else if ( xc_func == " PW91" ) // PW91_X+PW91_C
154+ {
119155 func_id.push_back (XC_GGA_X_PW91);
120156 func_id.push_back (XC_GGA_C_PW91);
121157 func_type = 2 ;
122158 use_libxc = false ;
123- }
124- else if ( xc_func == " HCTH" ) // HCTH_X+HCTH_C
125- {
159+ }
160+ else if ( xc_func == " HCTH" ) // HCTH_X+HCTH_C
161+ {
126162 func_id.push_back (XC_GGA_X_HCTH_A);
127163 func_id.push_back (XC_GGA_C_HCTH_A);
128164 func_type = 2 ;
129165 use_libxc = false ;
130- }
131- else if ( xc_func == " OLYP" ) // OPTX+LYP
132- {
166+ }
167+ else if ( xc_func == " OLYP" ) // OPTX+LYP
168+ {
133169 func_id.push_back (XC_GGA_X_OPTX);
134170 func_id.push_back (XC_GGA_C_LYP);
135171 func_type = 2 ;
136172 use_libxc = false ;
137- }
173+ }
138174#ifdef USE_LIBXC
139- else if ( xc_func == " SCAN" )
140- {
175+ else if ( xc_func == " SCAN" )
176+ {
141177 func_id.push_back (XC_MGGA_X_SCAN);
142178 func_id.push_back (XC_MGGA_C_SCAN);
143179 func_type = 3 ;
144180 use_libxc = true ;
145- }
181+ }
146182 else if ( xc_func == " SCAN0" )
147- {
183+ {
148184 func_id.push_back (XC_MGGA_X_SCAN);
149185 func_id.push_back (XC_MGGA_C_SCAN);
150186 func_type = 5 ;
151187 use_libxc = true ;
152- }
188+ }
153189 else if ( xc_func == " LC_PBE" )
154190 {
155191 func_id.push_back (XC_HYB_GGA_XC_LC_PBEOP);
@@ -186,12 +222,12 @@ void XC_Functional::set_xc_type(const std::string xc_func_in)
186222 func_type = 4 ;
187223 use_libxc = false ;
188224 }
189- else if ( xc_func == " PBE0" )
190- {
225+ else if ( xc_func == " PBE0" )
226+ {
191227 func_id.push_back (XC_HYB_GGA_XC_PBEH);
192228 func_type = 4 ;
193229 use_libxc = false ;
194- }
230+ }
195231 else if ( xc_func == " OPT_ORB" || xc_func == " NONE" || xc_func == " NOX+NOC" )
196232 {
197233 // not doing anything
@@ -274,33 +310,28 @@ void XC_Functional::set_xc_type(const std::string xc_func_in)
274310#endif
275311 }
276312
277- if (func_type == 3 || func_type == 5 )
278- {
279- ked_flag = true ;
280- }
281- else
282- {
283- ked_flag = false ;
284- }
285-
286313 if (func_id[0 ] == XC_GGA_X_OPTX)
287314 {
288315 std::cerr << " \n OPTX untested please test," ;
289316 }
290317
291- // if((func_type == 4 || func_type == 5) && PARAM.inp.basis_type == "pw")
292- // {
293- // ModuleBase::WARNING_QUIT("set_xc_type","hybrid functional not realized for planewave yet");
294- // }
318+ if ((func_type == 4 || func_type == 5 ) && PARAM.inp .basis_type == " pw" )
319+ {
320+ ModuleBase::WARNING_QUIT (" set_xc_type" ," hybrid functional not realized for planewave yet" );
321+ }
295322 if ((func_type == 3 || func_type == 5 ) && PARAM.inp .nspin ==4 )
296323 {
297324 ModuleBase::WARNING_QUIT (" set_xc_type" ," meta-GGA has not been implemented for nspin = 4 yet" );
298325 }
326+ // if((func_type == 3 || func_type == 5) && PARAM.inp.cal_stress == 1 && PARAM.inp.nspin!=1)
327+ // {
328+ // ModuleBase::WARNING_QUIT("set_xc_type","mgga stress not implemented for polarized case yet");
329+ // }
299330
300331#ifndef __EXX
301- if (( func_type == 4 || func_type == 5 ) && PARAM. inp . basis_type == " lcao " )
332+ if (func_type == 4 || func_type == 5 )
302333 {
303- ModuleBase::WARNING_QUIT (" set_xc_type" ," compile with libri to use hybrid functional in lcao basis " );
334+ ModuleBase::WARNING_QUIT (" set_xc_type" ," compile with libri to use hybrid functional" );
304335 }
305336#endif
306337
0 commit comments