41 const std::size_t first = label.find_first_not_of(
" \t\r\n");
42 if (first == std::string::npos)
44 std::string trimmed = label.substr(first, label.find_last_not_of(
" \t\r\n") - first + 1);
45 for (
auto& character : trimmed)
46 character =
static_cast<char>(std::tolower(
static_cast<unsigned char>(character)));
48 std::vector<std::string> words;
50 for (
char character : trimmed +
" ") {
51 if (std::isspace(
static_cast<unsigned char>(character)) || character ==
'-' ||
54 words.push_back(word);
63 if (words.front() ==
"xc" && trimmed[2] ==
'-')
66 static const std::map<std::string, std::string> short_names = {
75 if (words.size() == 1) {
76 auto found = short_names.find(words.front());
77 return found == short_names.end() ? std::string{} : found->second;
80 static const std::map<std::vector<std::string>, std::string> component_sets = {
81 {{
"sla",
"pz",
"nogx",
"nogc"},
"pz"},
82 {{
"sla",
"pw",
"pbx",
"pbc"},
"pbe"},
83 {{
"sla",
"pw",
"pbe",
"pbe"},
"pbe"},
84 {{
"sla",
"pw",
"psx",
"psc"},
"pbesol"},
85 {{
"sla",
"lyp",
"b88",
"blyp"},
"blyp"},
86 {{
"sla",
"pw",
"revx",
"pbc"},
"revpbe"},
87 {{
"sla",
"pw",
"rpb",
"pbc"},
"revpbe"},
91 auto found = component_sets.find(std::vector<std::string>(words.begin(), words.begin() + 4));
92 if (found == component_sets.end())
100 for (
auto extra = words.begin() + 4; extra != words.end(); ++extra) {
101 auto short_name = short_names.find(*extra);
102 if (short_name == short_names.end() || short_name->second != found->second)
105 return found->second;