forked from lijiext/lammps
git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@1799 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
parent
aa5dd615eb
commit
e73bae6533
|
@ -40,7 +40,8 @@ using namespace LAMMPS_NS;
|
||||||
enum{INDEX,LOOP,EQUAL,WORLD,UNIVERSE,ULOOP,ATOM};
|
enum{INDEX,LOOP,EQUAL,WORLD,UNIVERSE,ULOOP,ATOM};
|
||||||
enum{ARG,OP};
|
enum{ARG,OP};
|
||||||
enum{DONE,ADD,SUBTRACT,MULTIPLY,DIVIDE,CARAT,UNARY,
|
enum{DONE,ADD,SUBTRACT,MULTIPLY,DIVIDE,CARAT,UNARY,
|
||||||
SQRT,EXP,LN,CEIL,FLOOR,ROUND,VALUE,ATOMARRAY,TYPEARRAY};
|
SQRT,EXP,LN,LOG,SIN,COS,TAN,ASIN,ACOS,ATAN,
|
||||||
|
CEIL,FLOOR,ROUND,VALUE,ATOMARRAY,TYPEARRAY};
|
||||||
|
|
||||||
#define INVOKED_SCALAR 1 // same as in computes
|
#define INVOKED_SCALAR 1 // same as in computes
|
||||||
#define INVOKED_VECTOR 2
|
#define INVOKED_VECTOR 2
|
||||||
|
@ -500,7 +501,9 @@ void Variable::copy(int narg, char **from, char **to)
|
||||||
string is a equal-style or atom-style formula containing one or more items:
|
string is a equal-style or atom-style formula containing one or more items:
|
||||||
number = 0.0, -5.45, 2.8e-4, ...
|
number = 0.0, -5.45, 2.8e-4, ...
|
||||||
thermo keyword = ke, vol, atoms, ...
|
thermo keyword = ke, vol, atoms, ...
|
||||||
math operation = (),-x,x+y,x-y,x*y,x/y,x^y,sqrt(x),exp(x),ln(x)
|
math operation = (),-x,x+y,x-y,x*y,x/y,x^y,
|
||||||
|
sqrt(x),exp(x),ln(x),log(x),
|
||||||
|
sin(x),cos(x),tan(x),asin(x),acos(x),atan(x)
|
||||||
group function = count(group), mass(group), xcm(group,x), ...
|
group function = count(group), mass(group), xcm(group,x), ...
|
||||||
atom value = x[123], y[3], vx[34], ...
|
atom value = x[123], y[3], vx[34], ...
|
||||||
atom vector = x[], y[], vx[], ...
|
atom vector = x[], y[], vx[], ...
|
||||||
|
@ -1076,6 +1079,10 @@ double Variable::evaluate(char *str, Tree **tree)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
process an evaulation tree
|
||||||
|
customize by adding a math function:
|
||||||
|
sqrt(),exp(),ln(),log(),sin(),cos(),tan(),asin(),acos(),atan()
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
double Variable::eval_tree(Tree *tree, int i)
|
double Variable::eval_tree(Tree *tree, int i)
|
||||||
|
@ -1115,6 +1122,34 @@ double Variable::eval_tree(Tree *tree, int i)
|
||||||
if (arg <= 0.0) error->all("Log of zero/negative in variable formula");
|
if (arg <= 0.0) error->all("Log of zero/negative in variable formula");
|
||||||
return log(arg);
|
return log(arg);
|
||||||
}
|
}
|
||||||
|
if (tree->type == LOG) {
|
||||||
|
double arg = eval_tree(tree->left,i);
|
||||||
|
if (arg <= 0.0) error->all("Log of zero/negative in variable formula");
|
||||||
|
return log10(arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tree->type == SIN)
|
||||||
|
return sin(eval_tree(tree->left,i));
|
||||||
|
if (tree->type == COS)
|
||||||
|
return cos(eval_tree(tree->left,i));
|
||||||
|
if (tree->type == TAN)
|
||||||
|
return tan(eval_tree(tree->left,i));
|
||||||
|
|
||||||
|
if (tree->type == ASIN) {
|
||||||
|
double arg = eval_tree(tree->left,i);
|
||||||
|
if (arg < -1.0 || arg > 1.0)
|
||||||
|
error->all("Arcsin of invalid value in variable formula");
|
||||||
|
return asin(arg);
|
||||||
|
}
|
||||||
|
if (tree->type == ACOS) {
|
||||||
|
double arg = eval_tree(tree->left,i);
|
||||||
|
if (arg < -1.0 || arg > 1.0)
|
||||||
|
error->all("Arccos of invalid value in variable formula");
|
||||||
|
return acos(arg);
|
||||||
|
}
|
||||||
|
if (tree->type == ATAN)
|
||||||
|
return atan(eval_tree(tree->left,i));
|
||||||
|
|
||||||
if (tree->type == CEIL)
|
if (tree->type == CEIL)
|
||||||
return ceil(eval_tree(tree->left,i));
|
return ceil(eval_tree(tree->left,i));
|
||||||
if (tree->type == FLOOR)
|
if (tree->type == FLOOR)
|
||||||
|
@ -1204,7 +1239,8 @@ int Variable::int_between_brackets(char *str, int i, int &index, int emptyflag)
|
||||||
word = math function
|
word = math function
|
||||||
contents = str bewteen parentheses
|
contents = str bewteen parentheses
|
||||||
return 0 if not a match, 1 if successfully processed
|
return 0 if not a match, 1 if successfully processed
|
||||||
customize by adding a math function: sqrt(),exp(),log()
|
customize by adding a math function in 2 places:
|
||||||
|
sqrt(),exp(),ln(),log(),sin(),cos(),tan(),asin(),acos(),atan()
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
int Variable::math_function(char *word, char *contents, Tree **tree,
|
int Variable::math_function(char *word, char *contents, Tree **tree,
|
||||||
|
@ -1213,7 +1249,11 @@ int Variable::math_function(char *word, char *contents, Tree **tree,
|
||||||
{
|
{
|
||||||
// word not a match to any math function
|
// word not a match to any math function
|
||||||
|
|
||||||
if (strcmp(word,"sqrt") && strcmp(word,"exp") && strcmp(word,"ln") &&
|
if (strcmp(word,"sqrt") && strcmp(word,"exp") &&
|
||||||
|
strcmp(word,"ln") && strcmp(word,"log") &&
|
||||||
|
strcmp(word,"sin") && strcmp(word,"cos") &&
|
||||||
|
strcmp(word,"tan") && strcmp(word,"asin") &&
|
||||||
|
strcmp(word,"acos") && strcmp(word,"atan") &&
|
||||||
strcmp(word,"ceil") && strcmp(word,"floor") && strcmp(word,"round"))
|
strcmp(word,"ceil") && strcmp(word,"floor") && strcmp(word,"round"))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -1239,13 +1279,46 @@ int Variable::math_function(char *word, char *contents, Tree **tree,
|
||||||
} else if (strcmp(word,"exp") == 0) {
|
} else if (strcmp(word,"exp") == 0) {
|
||||||
if (tree) newtree->type = EXP;
|
if (tree) newtree->type = EXP;
|
||||||
else argstack[nargstack++] = exp(value);
|
else argstack[nargstack++] = exp(value);
|
||||||
|
|
||||||
} else if (strcmp(word,"ln") == 0) {
|
} else if (strcmp(word,"ln") == 0) {
|
||||||
if (tree) newtree->type = LN;
|
if (tree) newtree->type = LN;
|
||||||
else {
|
else {
|
||||||
if (value <= 0.0) error->all("Log of zero/negative in variable formula");
|
if (value <= 0.0) error->all("Log of zero/negative in variable formula");
|
||||||
argstack[nargstack++] = log(value);
|
argstack[nargstack++] = log(value);
|
||||||
}
|
}
|
||||||
|
} else if (strcmp(word,"log") == 0) {
|
||||||
|
if (tree) newtree->type = LOG;
|
||||||
|
else {
|
||||||
|
if (value <= 0.0) error->all("Log of zero/negative in variable formula");
|
||||||
|
argstack[nargstack++] = log10(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (strcmp(word,"sin") == 0) {
|
||||||
|
if (tree) newtree->type = SIN;
|
||||||
|
else argstack[nargstack++] = sin(value);
|
||||||
|
} else if (strcmp(word,"cos") == 0) {
|
||||||
|
if (tree) newtree->type = COS;
|
||||||
|
else argstack[nargstack++] = cos(value);
|
||||||
|
} else if (strcmp(word,"tan") == 0) {
|
||||||
|
if (tree) newtree->type = TAN;
|
||||||
|
else argstack[nargstack++] = tan(value);
|
||||||
|
|
||||||
|
} else if (strcmp(word,"asin") == 0) {
|
||||||
|
if (tree) newtree->type = ASIN;
|
||||||
|
else {
|
||||||
|
if (value < -1.0 || value > 1.0)
|
||||||
|
error->all("Arcsin of invalid value in variable formula");
|
||||||
|
argstack[nargstack++] = asin(value);
|
||||||
|
}
|
||||||
|
} else if (strcmp(word,"acos") == 0) {
|
||||||
|
if (tree) newtree->type = ACOS;
|
||||||
|
else {
|
||||||
|
if (value < -1.0 || value > 1.0)
|
||||||
|
error->all("Arccos of invalid value in variable formula");
|
||||||
|
argstack[nargstack++] = acos(value);
|
||||||
|
}
|
||||||
|
} else if (strcmp(word,"atan") == 0) {
|
||||||
|
if (tree) newtree->type = ATAN;
|
||||||
|
else argstack[nargstack++] = atan(value);
|
||||||
|
|
||||||
} else if (strcmp(word,"ceil") == 0) {
|
} else if (strcmp(word,"ceil") == 0) {
|
||||||
if (tree) newtree->type = CEIL;
|
if (tree) newtree->type = CEIL;
|
||||||
|
|
Loading…
Reference in New Issue