Skip to content

Commit 548c326

Browse files
committed
update the autoset strategy: if user defined, then use
1 parent 21547a3 commit 548c326

File tree

5 files changed

+125
-72
lines changed

5 files changed

+125
-72
lines changed

source/module_hamilt_general/module_vdw/dftd3_xc_name.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ namespace DFTD3 {
299299
{"XC_GGA_X_B88+XC_GGA_C_OP_B88", "bop"}
300300
};
301301

302-
void search_xcname_libxc_xplusc(const std::string& xcpattern, std::string& xname)
302+
void _xcname_libxc_xplusc(const std::string& xcpattern, std::string& xname)
303303
{
304304
std::vector<std::string> xc_words = FmtCore::split(xcpattern, "+");
305305
assert(xc_words.size() == 2);
@@ -315,7 +315,7 @@ namespace DFTD3 {
315315
}
316316
}
317317

318-
void search_xcname_libxc_xc(const std::string& xcpattern, std::string& xname)
318+
void _xcname_libxc_xc(const std::string& xcpattern, std::string& xname)
319319
{
320320
std::vector<std::string> words = FmtCore::split(xcpattern, "_");
321321
if (xcname_libxc_xc_.find(xcpattern) != xcname_libxc_xc_.end()) {
@@ -326,22 +326,22 @@ namespace DFTD3 {
326326
}
327327
}
328328

329-
void search_xcname_libxc(const std::string& xcpattern, std::string& xname)
329+
void _xcname_libxc(const std::string& xcpattern, std::string& xname)
330330
{
331331
if (xcpattern.find("+") != std::string::npos) {
332-
search_xcname_libxc_xplusc(xcpattern, xname);
332+
_xcname_libxc_xplusc(xcpattern, xname);
333333
} else {
334-
search_xcname_libxc_xc(xcpattern, xname);
334+
_xcname_libxc_xc(xcpattern, xname);
335335
}
336336
}
337337

338-
std::string search_xcname(const std::string& xcpattern)
338+
std::string _xcname(const std::string& xcpattern)
339339
{
340340
std::string xcname = xcpattern;
341341
const std::regex pattern("XC_(LDA|GGA|MGGA|HYB|HYB_LDA|HYB_GGA|HYB_MGGA)_(X|C|XC|K)_(.*)");
342342
// as long as there is piece in xcpattern that can match, we can search for the corresponding name
343343
if (std::regex_match(xcpattern, pattern)) {
344-
search_xcname_libxc(xcpattern, xcname);
344+
_xcname_libxc(xcpattern, xcname);
345345
}
346346
return xcname;
347347
}

source/module_hamilt_general/module_vdw/dftd3_xc_param.h

Lines changed: 70 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include <iostream>
3333
#include <cassert>
3434
#include <algorithm>
35+
#include "dftd3_xc_name.h"
3536
// 's6', 'rs6', 'a1', 's8', 'rs8', 'a2', 's9', 'alp', 'bet'
3637
namespace DFTD3 {
3738
// DFT-D3(BJ)
@@ -316,7 +317,7 @@ namespace DFTD3 {
316317
{"ms2h", {1.0, 0.65, 0.65, 1.69464, 4.75, 4.75, 1.0, 14.0, 0.0}},
317318
};
318319
// a declaration
319-
std::string lowercase(const std::string& s);
320+
std::string _lowercase(const std::string& s);
320321
/**
321322
* @brief Get the dftd3 params object.
322323
* dftd3 method fall back: xc-bjm -> xc-bj -> pbe-bj
@@ -326,11 +327,11 @@ namespace DFTD3 {
326327
* @param d3method the d3 method, can be "bj", "zero-damping", "bj-modified", "zero-damping-modified", "op"
327328
* @param param the dftd3 parameters, ALL_KEYS = {'s6', 'rs6', 'a1', 's8', 'rs8', 'a2', 's9', 'alp', 'bet'}
328329
*/
329-
void search(const std::string& xc,
330+
void _search(const std::string& xc,
330331
const std::string& method,
331332
std::vector<double>& param)
332333
{
333-
const std::string xc_lowercase = lowercase(xc);
334+
const std::string xc_lowercase = _lowercase(xc);
334335
const std::vector<std::string> allowed_ = { "bj", "zero", "bjm", "zerom", "op" };
335336
assert(std::find(allowed_.begin(), allowed_.end(), method) != allowed_.end());
336337
if (method == "op")
@@ -342,7 +343,7 @@ namespace DFTD3 {
342343
else
343344
{
344345
std::cout << " WARNING: DFT-D3 (Optimized-Power) parameter for XC `" << xc << "` not found, fall back to PBE-D3(0) " << std::endl;
345-
search("PBE", "zero", param);
346+
_search("PBE", "zero", param);
346347
}
347348
}
348349
else if (method == "bjm")
@@ -354,7 +355,7 @@ namespace DFTD3 {
354355
else
355356
{
356357
std::cout << " WARNING: DFT-D3M(BJ) parameter for XC `" << xc << "` not found, fall back to DFT-D3(BJ)" << std::endl;
357-
search(xc, "bj", param);
358+
_search(xc, "bj", param);
358359
}
359360
}
360361
else if (method == "bj")
@@ -366,7 +367,7 @@ namespace DFTD3 {
366367
else
367368
{
368369
std::cout << " WARNING: DFT-D3(BJ) parameter for XC `" << xc << "` not found, fall back to DFT-D3(0)" << std::endl;
369-
search("pbe", "bj", param);
370+
_search("pbe", "bj", param);
370371
}
371372
}
372373
else if (method == "zerom")
@@ -378,7 +379,7 @@ namespace DFTD3 {
378379
else
379380
{
380381
std::cout << " WARNING: DFT-D3M(0) parameter for XC `" << xc << "` not found, fall back to DFT-D3(0)" << std::endl;
381-
search(xc, "zero", param);
382+
_search(xc, "zero", param);
382383
}
383384
}
384385
else // zero
@@ -390,17 +391,77 @@ namespace DFTD3 {
390391
else
391392
{
392393
std::cout << " WARNING: DFT-D3(0) parameter for XC `" << xc << "` not found, fall back to PBE-D3(0)" << std::endl;
393-
search("PBE", "zero", param);
394+
_search("PBE", "zero", param);
394395
}
395396
}
396397
}
397398

398-
std::string lowercase(const std::string& s)
399+
std::string _lowercase(const std::string& s)
399400
{
400401
std::string result = s;
401402
std::transform(s.begin(), s.end(), result.begin(), ::tolower);
402403
return result;
403404
}
405+
406+
/**
407+
* @brief Get DFT-D3 parameters. If if there are parameters defined,
408+
* then it will overwrite the search result. If all parameters are
409+
* defined already by user, then search will not performed.
410+
*
411+
* @param xc XC functional name
412+
* @param d3method can be "d3_0" or "d3_bj"
413+
* @param s6_in user defined s6, default is "default"
414+
* @param s8_in user defined s8, default is "default"
415+
* @param a1_in user defined a1, default is "default"
416+
* @param a2_in user defined a2, default is "default"
417+
* @param s6 [out] s6 parameter
418+
* @param s8 [out] s8 parameter
419+
* @param a1 [out] a1 parameter
420+
* @param a2 [out] a2 parameter
421+
*/
422+
void dftd3_params(const std::string& xc_in,
423+
const std::string& d3method,
424+
const std::string& s6_in,
425+
const std::string& s8_in,
426+
const std::string& a1_in,
427+
const std::string& a2_in,
428+
double& s6,
429+
double& s8,
430+
double& a1,
431+
double& a2)
432+
{
433+
bool search = true;
434+
const std::vector<std::string> flag = {s6_in, s8_in, a1_in, a2_in};
435+
const std::map<std::string, std::string> param_map = {
436+
{"d3_bj", "bj"}, {"d3_0", "zero"}, {"d3_bjm", "bjm"}, {"d3_0m", "zerom"},
437+
{"op", "op"}};
438+
for (const auto& f : flag)
439+
{
440+
if (f != "default")
441+
{
442+
search = false;
443+
break;
444+
}
445+
}
446+
if (!search)
447+
{
448+
s6 = std::stod(s6_in);
449+
s8 = std::stod(s8_in);
450+
a1 = std::stod(a1_in);
451+
a2 = std::stod(a2_in);
452+
}
453+
else
454+
{
455+
std::cout << " VDW: DFTD3 parameters are not provided, search based on XC " << std::endl;
456+
std::vector<double> param;
457+
const std::string xc = DFTD3::_xcname(xc_in);
458+
_search(xc, param_map.at(d3method), param);
459+
s6 = param[0];
460+
s8 = param[3];
461+
a1 = param[1];
462+
a2 = param[5];
463+
}
464+
}
404465
}
405466

406467
/*

source/module_hamilt_general/module_vdw/test/dftd3_xc_test.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,42 @@ TEST(DFTD3XCTest, SearchXcnameLibXCXplusC)
66
{
77
std::string xcpattern = "XC_GGA_X_PBE+XC_GGA_C_OP_PBE";
88
std::string xname;
9-
DFTD3::search_xcname_libxc_xplusc(xcpattern, xname);
9+
DFTD3::_xcname_libxc_xplusc(xcpattern, xname);
1010
EXPECT_EQ(xname, "pbeop");
1111
}
1212

1313
TEST(DFTD3XCTest, SearchXcnameLibXCXC)
1414
{
1515
std::string xcpattern = "XC_LDA_XC_TETER93";
1616
std::string xname;
17-
DFTD3::search_xcname_libxc_xc(xcpattern, xname);
17+
DFTD3::_xcname_libxc_xc(xcpattern, xname);
1818
EXPECT_EQ(xname, "teter93");
1919
}
2020

2121
TEST(DFTD3XCTest, SearchXcnameLibXC)
2222
{
2323
std::string xcpattern = "XC_GGA_X_PBE+XC_GGA_C_OP_PBE";
2424
std::string xname;
25-
DFTD3::search_xcname_libxc(xcpattern, xname);
25+
DFTD3::_xcname_libxc(xcpattern, xname);
2626
EXPECT_EQ(xname, "pbeop");
2727
}
2828

2929
TEST(DFTD3XCTest, SearchXcname)
3030
{
3131
std::string xcpattern = "XC_GGA_X_PBE+XC_GGA_C_OP_PBE";
32-
std::string xname = DFTD3::search_xcname(xcpattern);
32+
std::string xname = DFTD3::_xcname(xcpattern);
3333
EXPECT_EQ(xname, "pbeop");
3434

3535
xcpattern = "XC_LDA_XC_TETER93";
36-
xname = DFTD3::search_xcname(xcpattern);
36+
xname = DFTD3::_xcname(xcpattern);
3737
EXPECT_EQ(xname, "teter93");
3838

3939
xcpattern = "default";
40-
xname = DFTD3::search_xcname(xcpattern);
40+
xname = DFTD3::_xcname(xcpattern);
4141
EXPECT_EQ(xname, "default");
4242

4343
xcpattern = "pbe";
44-
xname = DFTD3::search_xcname(xcpattern);
44+
xname = DFTD3::_xcname(xcpattern);
4545
EXPECT_EQ(xname, "pbe");
4646
}
4747

source/module_hamilt_general/module_vdw/vdwd3_parameters.cpp

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#include "module_base/constants.h"
99
#include <map>
1010
#include "dftd3_xc_param.h"
11-
#include "dftd3_xc_name.h"
1211
namespace vdw
1312
{
1413

@@ -24,17 +23,10 @@ void Vdwd3Parameters::initial_parameters(const Input_para &input)
2423
std::vector<std::vector<std::vector<double>>>(
2524
5,
2625
std::vector<std::vector<double>>(max_elem_, std::vector<double>(max_elem_, 0.0)))));
27-
const std::string xc = DFTD3::search_xcname(input.dft_functional);
28-
const std::string vdw_method = input.vdw_method;
29-
const std::map<std::string, std::string> dftd3_method = {{"d3_bj", "bj"}, {"d3_0", "zero"},
30-
{"d3_bjm", "bjm"}, {"d3_0m", "zerom"},
31-
{"op", "op"}};
32-
std::vector<double> param;
33-
DFTD3::search(xc, dftd3_method.at(vdw_method), param);
34-
s6_ = param[0]; // s6
35-
s18_ = param[3]; // s8
36-
rs6_ = param[1]; // rs6 or a1
37-
rs18_ = param[5];// rs8 or a2
26+
27+
DFTD3::dftd3_params(input.dft_functional, input.vdw_method,
28+
input.vdw_s6, input.vdw_s8, input.vdw_a1, input.vdw_a2,
29+
s6_, s18_, rs6_, rs18_); /* rs6: a1, rs18: a2 */
3830
abc_ = input.vdw_abc;
3931
version_ = input.vdw_method;
4032
model_ = input.vdw_cutoff_type;

source/module_io/read_input_item_model.cpp

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,10 @@ void ReadInput::item_model()
147147
{
148148
para.input.vdw_s6 = "0.75";
149149
}
150-
else if (para.input.vdw_method == "d3_0" || para.input.vdw_method == "d3_bj")
151-
{
152-
para.input.vdw_s6 = "1.0";
153-
}
150+
// else if (para.input.vdw_method == "d3_0" || para.input.vdw_method == "d3_bj")
151+
// {
152+
// para.input.vdw_s6 = "1.0";
153+
// }
154154
}
155155
};
156156
read_sync_string(input.vdw_s6);
@@ -160,17 +160,17 @@ void ReadInput::item_model()
160160
Input_Item item("vdw_s8");
161161
item.annotation = "scale parameter of d3_0/d3_bj";
162162
item.reset_value = [](const Input_Item& item, Parameter& para) {
163-
if (para.input.vdw_s8 == "default")
164-
{
165-
if (para.input.vdw_method == "d3_0")
166-
{
167-
para.input.vdw_s8 = "0.722";
168-
}
169-
else if (para.input.vdw_method == "d3_bj")
170-
{
171-
para.input.vdw_s8 = "0.7875";
172-
}
173-
}
163+
// if (para.input.vdw_s8 == "default")
164+
// {
165+
// if (para.input.vdw_method == "d3_0")
166+
// {
167+
// para.input.vdw_s8 = "0.722";
168+
// }
169+
// else if (para.input.vdw_method == "d3_bj")
170+
// {
171+
// para.input.vdw_s8 = "0.7875";
172+
// }
173+
// }
174174
};
175175
read_sync_string(input.vdw_s8);
176176
this->add_item(item);
@@ -179,17 +179,17 @@ void ReadInput::item_model()
179179
Input_Item item("vdw_a1");
180180
item.annotation = "damping parameter of d3_0/d3_bj";
181181
item.reset_value = [](const Input_Item& item, Parameter& para) {
182-
if (para.input.vdw_a1 == "default")
183-
{
184-
if (para.input.vdw_method == "d3_0")
185-
{
186-
para.input.vdw_a1 = "1.217";
187-
}
188-
else if (para.input.vdw_method == "d3_bj")
189-
{
190-
para.input.vdw_a1 = "0.4289";
191-
}
192-
}
182+
// if (para.input.vdw_a1 == "default")
183+
// {
184+
// if (para.input.vdw_method == "d3_0")
185+
// {
186+
// para.input.vdw_a1 = "1.217";
187+
// }
188+
// else if (para.input.vdw_method == "d3_bj")
189+
// {
190+
// para.input.vdw_a1 = "0.4289";
191+
// }
192+
// }
193193
};
194194
read_sync_string(input.vdw_a1);
195195
this->add_item(item);
@@ -198,17 +198,17 @@ void ReadInput::item_model()
198198
Input_Item item("vdw_a2");
199199
item.annotation = "damping parameter of d3_bj";
200200
item.reset_value = [](const Input_Item& item, Parameter& para) {
201-
if (para.input.vdw_a2 == "default")
202-
{
203-
if (para.input.vdw_method == "d3_0")
204-
{
205-
para.input.vdw_a2 = "1.0";
206-
}
207-
else if (para.input.vdw_method == "d3_bj")
208-
{
209-
para.input.vdw_a2 = "4.4407";
210-
}
211-
}
201+
// if (para.input.vdw_a2 == "default")
202+
// {
203+
// if (para.input.vdw_method == "d3_0")
204+
// {
205+
// para.input.vdw_a2 = "1.0";
206+
// }
207+
// else if (para.input.vdw_method == "d3_bj")
208+
// {
209+
// para.input.vdw_a2 = "4.4407";
210+
// }
211+
// }
212212
};
213213
read_sync_string(input.vdw_a2);
214214
this->add_item(item);

0 commit comments

Comments
 (0)