diff --git a/doc/src/variable.rst b/doc/src/variable.rst index 245755a371..96d3999787 100644 --- a/doc/src/variable.rst +++ b/doc/src/variable.rst @@ -177,7 +177,7 @@ simulation. When an input script line is encountered that defines a variable of style *equal* or *vector* or *atom* or *python* that contains a formula or links to Python code, the formula or Python code is NOT - immediately evaluated. Instead, it is evaulated aech time the + immediately evaluated. Instead, it is evaluated each time the variable is **used**. If you simply want to evaluate a formula in place you can use a so-called immediate variable. as described in the preceding note. Or see the section below about "Immediate @@ -568,7 +568,7 @@ references, fix references, and references to other variables. +------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Feature functions | is_available(category,feature), is_active(category,feature), is_defined(category,id) | +------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -Python function wrappers | py_varname(x,y,z,...) | +| Python func wrappers | py_varname(x,y,z,...) | +------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Atom values | id[i], mass[i], type[i], mol[i], x[i], y[i], z[i], vx[i], vy[i], vz[i], fx[i], fy[i], fz[i], q[i] | +------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -1212,14 +1212,14 @@ input script: variable foo python truncate python truncate return v_foo input 1 v_pyarg1 format fi here """ -def truncate(x): - return int(x) -""" - variable pyarg1 internal 0.0 - variable xtrunc atom py_foo(x) - variable ytrunc atom py_foo(y) - variable ztrunc atom py_foo(z) - dump 1 all custom 100 tmp.dump id x y z v_xtrunc v_ytrunc v_ztrunc + def truncate(x): + return int(x) + """ + variable pyarg1 internal 0.0 + variable xtrunc atom py_foo(x) + variable ytrunc atom py_foo(y) + variable ztrunc atom py_foo(z) + dump 1 all custom 100 tmp.dump id x y z v_xtrunc v_ytrunc v_ztrunc The first two commands define a python-style variable *foo* and couple it to the Python-coded function *truncate()* which takes a single diff --git a/src/variable.cpp b/src/variable.cpp index 7b8ec6012a..36e50d5af5 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -3534,7 +3534,7 @@ double Variable::eval_tree(Tree *tree, int i) if (tree->type == SIGN) return (eval_tree(tree->first,i) >= 0.0) ? 1.0 : -1.0; // sign(eval_tree(tree->first,i)); - + if (tree->type == PYFUNCTION) { int narg = tree->argcount; for (int iarg = 0; iarg < narg; iarg++) { @@ -3546,7 +3546,7 @@ double Variable::eval_tree(Tree *tree, int i) arg = compute_equal(tree->pyvar); return arg; } - + if (tree->type == GMASK) { if (atom->mask[i] & tree->ivalue) return 1.0; else return 0.0; @@ -4137,7 +4137,7 @@ int Variable::math_function(char *word, char *contents, Tree **tree, Tree **tree double value = value1 + value2*(1.0-cos(omega*delta*update->dt)); argstack[nargstack++] = value; } - + } else if (strcmp(word,"sign") == 0) { if (narg != 1) print_var_error(FLERR,"Invalid math function in variable formula",ivar); @@ -4150,7 +4150,7 @@ int Variable::math_function(char *word, char *contents, Tree **tree, Tree **tree } else if (strstr(word,"py_") == word) { // text following py_ = python-style variable name - + int pyvar = find(&word[3]); if (style[pyvar] != PYTHON) print_var_error(FLERR,"Invalid python function variable name",ivar); @@ -4160,7 +4160,7 @@ int Variable::math_function(char *word, char *contents, Tree **tree, Tree **tree int *jvars = new int[narg]; char *internal_varname; - + for (int iarg = 0; iarg < narg; iarg++) { internal_varname = utils::strdup(fmt::format("pyarg{}", iarg+1)); jvars[iarg] = find(internal_varname); @@ -4173,7 +4173,7 @@ int Variable::math_function(char *word, char *contents, Tree **tree, Tree **tree // if tree: store python variable and arg info in tree for later eval // else: one-time eval of python function now - + if (tree) { newtree->type = PYFUNCTION; newtree->pyvar = pyvar;