simplify with STL classes
This commit is contained in:
@ -44,6 +44,7 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
using namespace LAMMPS_NS;
|
using namespace LAMMPS_NS;
|
||||||
using namespace MathConst;
|
using namespace MathConst;
|
||||||
@ -2285,7 +2286,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar)
|
|||||||
|
|
||||||
if (math_function(word,contents,tree,treestack,ntreestack,argstack,nargstack,ivar));
|
if (math_function(word,contents,tree,treestack,ntreestack,argstack,nargstack,ivar));
|
||||||
else if (group_function(word,contents,tree,treestack,ntreestack,argstack,nargstack,ivar));
|
else if (group_function(word,contents,tree,treestack,ntreestack,argstack,nargstack,ivar));
|
||||||
else if (special_function(word,contents,tree,treestack,ntreestack,argstack,nargstack,ivar));
|
else if (special_function(std::string(word),contents,tree,treestack,ntreestack,argstack,nargstack,ivar));
|
||||||
else if (feature_function(word,contents,tree,treestack,ntreestack,argstack,nargstack,ivar));
|
else if (feature_function(word,contents,tree,treestack,ntreestack,argstack,nargstack,ivar));
|
||||||
else print_var_error(FLERR,fmt::format("Invalid math/group/special/feature function '{}()' "
|
else print_var_error(FLERR,fmt::format("Invalid math/group/special/feature function '{}()' "
|
||||||
"in variable formula", word),ivar);
|
"in variable formula", word),ivar);
|
||||||
@ -4267,32 +4268,29 @@ Region *Variable::region_function(char *id, int ivar)
|
|||||||
extract_setting(x),label2type(x,y),is_typelabel(x,y)
|
extract_setting(x),label2type(x,y),is_typelabel(x,y)
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
int Variable::special_function(char *word, char *contents, Tree **tree, Tree **treestack,
|
int Variable::special_function(const std::string &word, char *contents, Tree **tree, Tree **treestack,
|
||||||
int &ntreestack, double *argstack, int &nargstack, int ivar)
|
int &ntreestack, double *argstack, int &nargstack, int ivar)
|
||||||
{
|
{
|
||||||
double sx,sxx;
|
double sx,sxx;
|
||||||
double value,sy,sxy;
|
double value,sy,sxy;
|
||||||
|
|
||||||
// word is not a match to any special function
|
// word is not a match to any special function
|
||||||
|
std::unordered_set<std::string> functions = {
|
||||||
|
"sum", "min", "max", "ave", "trap", "slope", "sort", "rsort", "gmask", "rmask", "grmask",
|
||||||
|
"next", "is_file", "is_os", "extract_setting", "label2type", "is_typelabel" };
|
||||||
|
|
||||||
if (strcmp(word,"sum") != 0 && strcmp(word,"min") && strcmp(word,"max") != 0 &&
|
if (functions.find(word) == functions.end()) return 0;
|
||||||
strcmp(word,"ave") != 0 && strcmp(word,"trap") != 0 && strcmp(word,"slope") != 0 &&
|
|
||||||
strcmp(word,"gmask") != 0 && strcmp(word,"rmask") != 0 && strcmp(word,"grmask") != 0 &&
|
|
||||||
strcmp(word,"next") != 0 && strcmp(word,"is_file") != 0 && strcmp(word,"is_os") != 0 &&
|
|
||||||
strcmp(word,"extract_setting") != 0 && strcmp(word,"label2type") != 0 &&
|
|
||||||
strcmp(word,"is_typelabel") != 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// process label2type() separately b/c its label arg can have commas in it
|
// process label2type() separately b/c its label arg can have commas in it
|
||||||
|
|
||||||
if (strcmp(word,"label2type") == 0 || strcmp(word,"is_typelabel") == 0) {
|
if ((word == "label2type") || (word == "is_typelabel")) {
|
||||||
if (!atom->labelmapflag)
|
if (!atom->labelmapflag)
|
||||||
print_var_error(FLERR,fmt::format("Cannot use {}() function without a labelmap",word),ivar);
|
print_var_error(FLERR,fmt::format("Cannot use {}() function without a labelmap",word),ivar);
|
||||||
|
|
||||||
std::string contents_copy(contents);
|
std::string contents_copy(contents);
|
||||||
auto pos = contents_copy.find_first_of(',');
|
auto pos = contents_copy.find_first_of(',');
|
||||||
if (pos == std::string::npos) {
|
if (pos == std::string::npos) {
|
||||||
if (strcmp(word,"label2type") == 0) {
|
if (word == "label2type") {
|
||||||
print_var_error(FLERR, fmt::format("Invalid label2type({}) function in variable formula",
|
print_var_error(FLERR, fmt::format("Invalid label2type({}) function in variable formula",
|
||||||
contents_copy), ivar);
|
contents_copy), ivar);
|
||||||
} else {
|
} else {
|
||||||
@ -4319,7 +4317,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, Tree **t
|
|||||||
print_var_error(FLERR, fmt::format("Invalid kind {} in {}() in variable", kind, word),ivar);
|
print_var_error(FLERR, fmt::format("Invalid kind {} in {}() in variable", kind, word),ivar);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(word,"label2type") == 0) {
|
if (word == "label2type") {
|
||||||
if (value == -1)
|
if (value == -1)
|
||||||
print_var_error(FLERR, fmt::format("Invalid {} type label {} in label2type() in variable",
|
print_var_error(FLERR, fmt::format("Invalid {} type label {} in label2type() in variable",
|
||||||
kind, typestr), ivar);
|
kind, typestr), ivar);
|
||||||
@ -4348,20 +4346,21 @@ int Variable::special_function(char *word, char *contents, Tree **tree, Tree **t
|
|||||||
|
|
||||||
// special functions that operate on global vectors
|
// special functions that operate on global vectors
|
||||||
|
|
||||||
if (strcmp(word,"sum") == 0 || strcmp(word,"min") == 0 ||
|
if ((word == "sum") || (word == "min") || (word == "max") || (word == "ave") ||
|
||||||
strcmp(word,"max") == 0 || strcmp(word,"ave") == 0 ||
|
(word == "trap") || (word == "slope") || (word == "sort") || (word == "rsort")) {
|
||||||
strcmp(word,"trap") == 0 || strcmp(word,"slope") == 0) {
|
|
||||||
|
|
||||||
int method = 0;
|
int method = 0;
|
||||||
if (strcmp(word,"sum") == 0) method = SUM;
|
if (word == "sum") method = SUM;
|
||||||
else if (strcmp(word,"min") == 0) method = XMIN;
|
else if (word == "min") method = XMIN;
|
||||||
else if (strcmp(word,"max") == 0) method = XMAX;
|
else if (word == "max") method = XMAX;
|
||||||
else if (strcmp(word,"ave") == 0) method = AVE;
|
else if (word == "ave") method = AVE;
|
||||||
else if (strcmp(word,"trap") == 0) method = TRAP;
|
else if (word == "trap") method = TRAP;
|
||||||
else if (strcmp(word,"slope") == 0) method = SLOPE;
|
else if (word == "slope") method = SLOPE;
|
||||||
|
else if (word == "sort") method = SORT;
|
||||||
|
else if (word == "rsort") method = RSORT;
|
||||||
|
|
||||||
if (narg != 1)
|
if (narg != 1)
|
||||||
print_var_error(FLERR,"Invalid special function in variable formula",ivar);
|
print_var_error(FLERR,fmt::format("Invalid special function {}() in variable formula", word),ivar);
|
||||||
|
|
||||||
Compute *compute = nullptr;
|
Compute *compute = nullptr;
|
||||||
Fix *fix = nullptr;
|
Fix *fix = nullptr;
|
||||||
@ -4570,7 +4569,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, Tree **t
|
|||||||
|
|
||||||
// mask special functions
|
// mask special functions
|
||||||
|
|
||||||
} else if (strcmp(word,"gmask") == 0) {
|
} else if (word == "gmask") {
|
||||||
if (tree == nullptr)
|
if (tree == nullptr)
|
||||||
print_var_error(FLERR,"Gmask function in equal-style variable formula",ivar);
|
print_var_error(FLERR,"Gmask function in equal-style variable formula",ivar);
|
||||||
if (narg != 1)
|
if (narg != 1)
|
||||||
@ -4585,7 +4584,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, Tree **t
|
|||||||
newtree->ivalue = group->bitmask[igroup];
|
newtree->ivalue = group->bitmask[igroup];
|
||||||
treestack[ntreestack++] = newtree;
|
treestack[ntreestack++] = newtree;
|
||||||
|
|
||||||
} else if (strcmp(word,"rmask") == 0) {
|
} else if (word == "rmask") {
|
||||||
if (tree == nullptr)
|
if (tree == nullptr)
|
||||||
print_var_error(FLERR,"Rmask function in equal-style variable formula",ivar);
|
print_var_error(FLERR,"Rmask function in equal-style variable formula",ivar);
|
||||||
if (narg != 1)
|
if (narg != 1)
|
||||||
@ -4599,7 +4598,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, Tree **t
|
|||||||
newtree->region = region;
|
newtree->region = region;
|
||||||
treestack[ntreestack++] = newtree;
|
treestack[ntreestack++] = newtree;
|
||||||
|
|
||||||
} else if (strcmp(word,"grmask") == 0) {
|
} else if (word == "grmask") {
|
||||||
if (tree == nullptr)
|
if (tree == nullptr)
|
||||||
print_var_error(FLERR,"Grmask function in equal-style variable formula",ivar);
|
print_var_error(FLERR,"Grmask function in equal-style variable formula",ivar);
|
||||||
if (narg != 2)
|
if (narg != 2)
|
||||||
@ -4619,7 +4618,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, Tree **t
|
|||||||
|
|
||||||
// special function for file-style or atomfile-style variables
|
// special function for file-style or atomfile-style variables
|
||||||
|
|
||||||
} else if (strcmp(word,"next") == 0) {
|
} else if (word == "next") {
|
||||||
if (narg != 1)
|
if (narg != 1)
|
||||||
print_var_error(FLERR,"Invalid special function in variable formula",ivar);
|
print_var_error(FLERR,"Invalid special function in variable formula",ivar);
|
||||||
|
|
||||||
@ -4670,7 +4669,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, Tree **t
|
|||||||
|
|
||||||
} else print_var_error(FLERR,"Invalid variable style in special function next",ivar);
|
} else print_var_error(FLERR,"Invalid variable style in special function next",ivar);
|
||||||
|
|
||||||
} else if (strcmp(word,"is_file") == 0) {
|
} else if (word == "is_file") {
|
||||||
if (narg != 1)
|
if (narg != 1)
|
||||||
print_var_error(FLERR,"Invalid is_file() function in variable formula",ivar);
|
print_var_error(FLERR,"Invalid is_file() function in variable formula",ivar);
|
||||||
|
|
||||||
@ -4687,7 +4686,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, Tree **t
|
|||||||
treestack[ntreestack++] = newtree;
|
treestack[ntreestack++] = newtree;
|
||||||
} else argstack[nargstack++] = value;
|
} else argstack[nargstack++] = value;
|
||||||
|
|
||||||
} else if (strcmp(word,"is_os") == 0) {
|
} else if (word == "is_os") {
|
||||||
if (narg != 1) print_var_error(FLERR,"Invalid is_os() function in variable formula",ivar);
|
if (narg != 1) print_var_error(FLERR,"Invalid is_os() function in variable formula",ivar);
|
||||||
value = utils::strmatch(platform::os_info(), args[0]) ? 1.0 : 0.0;
|
value = utils::strmatch(platform::os_info(), args[0]) ? 1.0 : 0.0;
|
||||||
|
|
||||||
@ -4700,7 +4699,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, Tree **t
|
|||||||
treestack[ntreestack++] = newtree;
|
treestack[ntreestack++] = newtree;
|
||||||
} else argstack[nargstack++] = value;
|
} else argstack[nargstack++] = value;
|
||||||
|
|
||||||
} else if (strcmp(word,"extract_setting") == 0) {
|
} else if (word == "extract_setting") {
|
||||||
if (narg != 1) print_var_error(FLERR,"Invalid extract_setting() function in variable formula",ivar);
|
if (narg != 1) print_var_error(FLERR,"Invalid extract_setting() function in variable formula",ivar);
|
||||||
|
|
||||||
value = lammps_extract_setting(lmp, args[0]);
|
value = lammps_extract_setting(lmp, args[0]);
|
||||||
|
|||||||
@ -143,7 +143,7 @@ class Variable : protected Pointers {
|
|||||||
int math_function(char *, char *, Tree **, Tree **, int &, double *, int &, int);
|
int math_function(char *, char *, Tree **, Tree **, int &, double *, int &, int);
|
||||||
int group_function(char *, char *, Tree **, Tree **, int &, double *, int &, int);
|
int group_function(char *, char *, Tree **, Tree **, int &, double *, int &, int);
|
||||||
Region *region_function(char *, int);
|
Region *region_function(char *, int);
|
||||||
int special_function(char *, char *, Tree **, Tree **, int &, double *, int &, int);
|
int special_function(const std::string &, char *, Tree **, Tree **, int &, double *, int &, int);
|
||||||
int feature_function(char *, char *, Tree **, Tree **, int &, double *, int &, int);
|
int feature_function(char *, char *, Tree **, Tree **, int &, double *, int &, int);
|
||||||
void peratom2global(int, char *, double *, int, tagint, Tree **, Tree **, int &, double *, int &);
|
void peratom2global(int, char *, double *, int, tagint, Tree **, Tree **, int &, double *, int &);
|
||||||
void custom2global(int *, double *, int, tagint, Tree **, Tree **, int &, double *, int &);
|
void custom2global(int *, double *, int, tagint, Tree **, Tree **, int &, double *, int &);
|
||||||
|
|||||||
Reference in New Issue
Block a user