diff --git a/src/variable.cpp b/src/variable.cpp index d77bc0e696c2414cb31202aa03ac3bdb055446cb..399fddeee164d36ed99fdb257c42d653082be6a0 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -933,7 +933,7 @@ double Variable::compute_equal(int ivar) double Variable::compute_equal(char *str) { - return evaluate(str,NULL); + return evaluate(str,NULL,-1); } /* ---------------------------------------------------------------------- @@ -956,7 +956,7 @@ void Variable::compute_atom(int ivar, int igroup, if (style[ivar] == ATOM) { treetype = ATOM; - evaluate(data[ivar][0],&tree); + evaluate(data[ivar][0],&tree,ivar); collapse_tree(tree); } else vstore = reader[ivar]->fixstore->vstore; @@ -1030,7 +1030,7 @@ int Variable::compute_vector(int ivar, double **result) eval_in_progress[ivar] = 1; treetype = VECTOR; - evaluate(data[ivar][0],&tree); + evaluate(data[ivar][0],&tree,ivar); collapse_tree(tree); int nlen = size_tree_vector(tree); if (nlen == 0) @@ -1206,9 +1206,9 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (tree) { Tree *newtree; - evaluate(contents,&newtree); + evaluate(contents,&newtree,ivar); treestack[ntreestack++] = newtree; - } else argstack[nargstack++] = evaluate(contents,NULL); + } else argstack[nargstack++] = evaluate(contents,NULL,ivar); delete [] contents; @@ -1891,7 +1891,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) "vector-style variable formula",ivar); Tree *newtree; - evaluate(data[ivar][0],&newtree); + evaluate(data[ivar][0],&newtree,ivar); treestack[ntreestack++] = newtree; // v_name = per-atom vector from atomfile-style variable @@ -1997,12 +1997,12 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) i = find_matching_paren(str,i,contents,ivar); i++; - if (math_function(word,contents,tree, - treestack,ntreestack,argstack,nargstack)); - else if (group_function(word,contents,tree, - treestack,ntreestack,argstack,nargstack)); - else if (special_function(word,contents,tree, - treestack,ntreestack,argstack,nargstack)); + 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 (special_function(word,contents,tree,treestack,ntreestack, + argstack,nargstack,ivar)); else { char msg[128]; sprintf(msg,"Invalid math/group/special function '%s()'" @@ -3271,7 +3271,7 @@ tagint Variable::int_between_brackets(char *&ptr, int varallow) int Variable::math_function(char *word, char *contents, Tree **tree, Tree **treestack, int &ntreestack, - double *argstack, int &nargstack) + double *argstack, int &nargstack, int ivar) { // word not a match to any math function @@ -3306,16 +3306,16 @@ int Variable::math_function(char *word, char *contents, Tree **tree, newtree->first = newtree->second = NULL; newtree->nextra = 0; Tree *argtree; - evaluate(args[0],&argtree); + evaluate(args[0],&argtree,ivar); newtree->first = argtree; if (narg > 1) { - evaluate(args[1],&argtree); + evaluate(args[1],&argtree,ivar); newtree->second = argtree; if (narg > 2) { newtree->nextra = narg-2; newtree->extra = new Tree*[narg-2]; for (int i = 2; i < narg; i++) { - evaluate(args[i],&argtree); + evaluate(args[i],&argtree,ivar); newtree->extra[i-2] = argtree; } } @@ -3323,12 +3323,12 @@ int Variable::math_function(char *word, char *contents, Tree **tree, treestack[ntreestack++] = newtree; } else { - value1 = evaluate(args[0],NULL); + value1 = evaluate(args[0],NULL,ivar); if (narg > 1) { - value2 = evaluate(args[1],NULL); + value2 = evaluate(args[1],NULL,ivar); if (narg > 2) { for (int i = 2; i < narg; i++) - values[i-2] = evaluate(args[i],NULL); + values[i-2] = evaluate(args[i],NULL,ivar); } } } @@ -3338,112 +3338,113 @@ int Variable::math_function(char *word, char *contents, Tree **tree, if (strcmp(word,"sqrt") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = SQRT; else { if (value1 < 0.0) - error->all(FLERR,"Sqrt of negative value in variable formula"); + print_var_error(FLERR,"Sqrt of negative value in " + "variable formula",ivar); argstack[nargstack++] = sqrt(value1); } } else if (strcmp(word,"exp") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = EXP; else argstack[nargstack++] = exp(value1); } else if (strcmp(word,"ln") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = LN; else { if (value1 <= 0.0) - error->all(FLERR,"Log of zero/negative value in variable formula"); + print_var_error(FLERR,"Log of zero/negative value in variable formula",ivar); argstack[nargstack++] = log(value1); } } else if (strcmp(word,"log") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = LOG; else { if (value1 <= 0.0) - error->all(FLERR,"Log of zero/negative value in variable formula"); + print_var_error(FLERR,"Log of zero/negative value in variable formula",ivar); argstack[nargstack++] = log10(value1); } } else if (strcmp(word,"abs") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = ABS; else argstack[nargstack++] = fabs(value1); } else if (strcmp(word,"sin") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = SIN; else argstack[nargstack++] = sin(value1); } else if (strcmp(word,"cos") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = COS; else argstack[nargstack++] = cos(value1); } else if (strcmp(word,"tan") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = TAN; else argstack[nargstack++] = tan(value1); } else if (strcmp(word,"asin") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = ASIN; else { if (value1 < -1.0 || value1 > 1.0) - error->all(FLERR,"Arcsin of invalid value in variable formula"); + print_var_error(FLERR,"Arcsin of invalid value in variable formula",ivar); argstack[nargstack++] = asin(value1); } } else if (strcmp(word,"acos") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = ACOS; else { if (value1 < -1.0 || value1 > 1.0) - error->all(FLERR,"Arccos of invalid value in variable formula"); + print_var_error(FLERR,"Arccos of invalid value in variable formula",ivar); argstack[nargstack++] = acos(value1); } } else if (strcmp(word,"atan") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = ATAN; else argstack[nargstack++] = atan(value1); } else if (strcmp(word,"atan2") == 0) { if (narg != 2) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = ATAN2; else argstack[nargstack++] = atan2(value1,value2); } else if (strcmp(word,"random") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = RANDOM; else { if (randomequal == NULL) { int seed = static_cast<int> (values[0]); if (seed <= 0) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); randomequal = new RanMars(lmp,seed); } argstack[nargstack++] = randomequal->uniform()*(value2-value1) + value1; } } else if (strcmp(word,"normal") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = NORMAL; else { if (value2 < 0.0) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (randomequal == NULL) { int seed = static_cast<int> (values[0]); if (seed <= 0) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); randomequal = new RanMars(lmp,seed); } argstack[nargstack++] = value1 + value2*randomequal->gaussian(); @@ -3451,27 +3452,27 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"ceil") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = CEIL; else argstack[nargstack++] = ceil(value1); } else if (strcmp(word,"floor") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = FLOOR; else argstack[nargstack++] = floor(value1); } else if (strcmp(word,"round") == 0) { if (narg != 1) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = ROUND; else argstack[nargstack++] = MYROUND(value1); } else if (strcmp(word,"ramp") == 0) { if (narg != 2) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (update->whichflag == 0) - error->all(FLERR,"Cannot use ramp in variable formula between runs"); + print_var_error(FLERR,"Cannot use ramp in variable formula between runs",ivar); if (tree) newtree->type = RAMP; else { double delta = update->ntimestep - update->beginstep; @@ -3482,13 +3483,13 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"stagger") == 0) { if (narg != 2) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = STAGGER; else { int ivalue1 = static_cast<int> (value1); int ivalue2 = static_cast<int> (value2); if (ivalue1 <= 0 || ivalue2 <= 0 || ivalue1 <= ivalue2) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); int lower = update->ntimestep/ivalue1 * ivalue1; int delta = update->ntimestep - lower; double value; @@ -3499,14 +3500,14 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"logfreq") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = LOGFREQ; else { int ivalue1 = static_cast<int> (value1); int ivalue2 = static_cast<int> (value2); int ivalue3 = static_cast<int> (values[0]); if (ivalue1 <= 0 || ivalue2 <= 0 || ivalue3 <= 0 || ivalue2 >= ivalue3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); double value; if (update->ntimestep < ivalue1) value = ivalue1; else { @@ -3521,14 +3522,14 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"logfreq2") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = LOGFREQ2; else { int ivalue1 = static_cast<int> (value1); int ivalue2 = static_cast<int> (value2); int ivalue3 = static_cast<int> (values[0]); if (ivalue1 <= 0 || ivalue2 <= 0 || ivalue3 <= 0 ) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); double value; if (update->ntimestep < ivalue1) value = ivalue1; else { @@ -3546,7 +3547,7 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"stride") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = STRIDE; else { int ivalue1 = static_cast<int> (value1); @@ -3566,7 +3567,7 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"stride2") == 0) { if (narg != 6) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (tree) newtree->type = STRIDE2; else { int ivalue1 = static_cast<int> (value1); @@ -3604,9 +3605,9 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"vdisplace") == 0) { if (narg != 2) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (update->whichflag == 0) - error->all(FLERR,"Cannot use vdisplace in variable formula between runs"); + print_var_error(FLERR,"Cannot use vdisplace in variable formula between runs",ivar); if (tree) newtree->type = VDISPLACE; else { double delta = update->ntimestep - update->beginstep; @@ -3616,13 +3617,13 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"swiggle") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (update->whichflag == 0) - error->all(FLERR,"Cannot use swiggle in variable formula between runs"); + print_var_error(FLERR,"Cannot use swiggle in variable formula between runs",ivar); if (tree) newtree->type = CWIGGLE; else { if (values[0] == 0.0) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); double delta = update->ntimestep - update->beginstep; double omega = 2.0*MY_PI/values[0]; double value = value1 + value2*sin(omega*delta*update->dt); @@ -3631,13 +3632,13 @@ int Variable::math_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"cwiggle") == 0) { if (narg != 3) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); if (update->whichflag == 0) - error->all(FLERR,"Cannot use cwiggle in variable formula between runs"); + print_var_error(FLERR,"Cannot use cwiggle in variable formula between runs",ivar); if (tree) newtree->type = CWIGGLE; else { if (values[0] == 0.0) - error->all(FLERR,"Invalid math function in variable formula"); + print_var_error(FLERR,"Invalid math function in variable formula",ivar); double delta = update->ntimestep - update->beginstep; double omega = 2.0*MY_PI/values[0]; double value = value1 + value2*(1.0-cos(omega*delta*update->dt)); @@ -3667,7 +3668,7 @@ int Variable::math_function(char *word, char *contents, Tree **tree, int Variable::group_function(char *word, char *contents, Tree **tree, Tree **treestack, int &ntreestack, - double *argstack, int &nargstack) + double *argstack, int &nargstack, int ivar) { // word not a match to any group function @@ -3690,7 +3691,7 @@ int Variable::group_function(char *word, char *contents, Tree **tree, int igroup = group->find(args[0]); if (igroup == -1) - error->all(FLERR,"Group ID in variable formula does not exist"); + print_var_error(FLERR,"Group ID in variable formula does not exist",ivar); // match word to group function @@ -3698,18 +3699,18 @@ int Variable::group_function(char *word, char *contents, Tree **tree, if (strcmp(word,"count") == 0) { if (narg == 1) value = group->count(igroup); - else if (narg == 2) value = group->count(igroup,region_function(args[1])); - else error->all(FLERR,"Invalid group function in variable formula"); + else if (narg == 2) value = group->count(igroup,region_function(args[1],ivar)); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"mass") == 0) { if (narg == 1) value = group->mass(igroup); - else if (narg == 2) value = group->mass(igroup,region_function(args[1])); - else error->all(FLERR,"Invalid group function in variable formula"); + else if (narg == 2) value = group->mass(igroup,region_function(args[1],ivar)); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"charge") == 0) { if (narg == 1) value = group->charge(igroup); - else if (narg == 2) value = group->charge(igroup,region_function(args[1])); - else error->all(FLERR,"Invalid group function in variable formula"); + else if (narg == 2) value = group->charge(igroup,region_function(args[1],ivar)); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"xcm") == 0) { atom->check_mass(FLERR); @@ -3718,14 +3719,14 @@ int Variable::group_function(char *word, char *contents, Tree **tree, double masstotal = group->mass(igroup); group->xcm(igroup,masstotal,xcm); } else if (narg == 3) { - int iregion = region_function(args[2]); + int iregion = region_function(args[2],ivar); double masstotal = group->mass(igroup,iregion); group->xcm(igroup,masstotal,xcm,iregion); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"x") == 0) value = xcm[0]; else if (strcmp(args[1],"y") == 0) value = xcm[1]; else if (strcmp(args[1],"z") == 0) value = xcm[2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"vcm") == 0) { atom->check_mass(FLERR); @@ -3734,37 +3735,37 @@ int Variable::group_function(char *word, char *contents, Tree **tree, double masstotal = group->mass(igroup); group->vcm(igroup,masstotal,vcm); } else if (narg == 3) { - int iregion = region_function(args[2]); + int iregion = region_function(args[2],ivar); double masstotal = group->mass(igroup,iregion); group->vcm(igroup,masstotal,vcm,iregion); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"x") == 0) value = vcm[0]; else if (strcmp(args[1],"y") == 0) value = vcm[1]; else if (strcmp(args[1],"z") == 0) value = vcm[2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"fcm") == 0) { double fcm[3]; if (narg == 2) group->fcm(igroup,fcm); - else if (narg == 3) group->fcm(igroup,fcm,region_function(args[2])); - else error->all(FLERR,"Invalid group function in variable formula"); + else if (narg == 3) group->fcm(igroup,fcm,region_function(args[2],ivar)); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"x") == 0) value = fcm[0]; else if (strcmp(args[1],"y") == 0) value = fcm[1]; else if (strcmp(args[1],"z") == 0) value = fcm[2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"bound") == 0) { double minmax[6]; if (narg == 2) group->bounds(igroup,minmax); - else if (narg == 3) group->bounds(igroup,minmax,region_function(args[2])); - else error->all(FLERR,"Invalid group function in variable formula"); + else if (narg == 3) group->bounds(igroup,minmax,region_function(args[2],ivar)); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"xmin") == 0) value = minmax[0]; else if (strcmp(args[1],"xmax") == 0) value = minmax[1]; else if (strcmp(args[1],"ymin") == 0) value = minmax[2]; else if (strcmp(args[1],"ymax") == 0) value = minmax[3]; else if (strcmp(args[1],"zmin") == 0) value = minmax[4]; else if (strcmp(args[1],"zmax") == 0) value = minmax[5]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"gyration") == 0) { atom->check_mass(FLERR); @@ -3774,16 +3775,16 @@ int Variable::group_function(char *word, char *contents, Tree **tree, group->xcm(igroup,masstotal,xcm); value = group->gyration(igroup,masstotal,xcm); } else if (narg == 2) { - int iregion = region_function(args[1]); + int iregion = region_function(args[1],ivar); double masstotal = group->mass(igroup,iregion); group->xcm(igroup,masstotal,xcm,iregion); value = group->gyration(igroup,masstotal,xcm,iregion); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"ke") == 0) { if (narg == 1) value = group->ke(igroup); - else if (narg == 2) value = group->ke(igroup,region_function(args[1])); - else error->all(FLERR,"Invalid group function in variable formula"); + else if (narg == 2) value = group->ke(igroup,region_function(args[1],ivar)); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"angmom") == 0) { atom->check_mass(FLERR); @@ -3793,15 +3794,15 @@ int Variable::group_function(char *word, char *contents, Tree **tree, group->xcm(igroup,masstotal,xcm); group->angmom(igroup,xcm,lmom); } else if (narg == 3) { - int iregion = region_function(args[2]); + int iregion = region_function(args[2],ivar); double masstotal = group->mass(igroup,iregion); group->xcm(igroup,masstotal,xcm,iregion); group->angmom(igroup,xcm,lmom,iregion); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"x") == 0) value = lmom[0]; else if (strcmp(args[1],"y") == 0) value = lmom[1]; else if (strcmp(args[1],"z") == 0) value = lmom[2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"torque") == 0) { atom->check_mass(FLERR); @@ -3811,15 +3812,15 @@ int Variable::group_function(char *word, char *contents, Tree **tree, group->xcm(igroup,masstotal,xcm); group->torque(igroup,xcm,tq); } else if (narg == 3) { - int iregion = region_function(args[2]); + int iregion = region_function(args[2],ivar); double masstotal = group->mass(igroup,iregion); group->xcm(igroup,masstotal,xcm,iregion); group->torque(igroup,xcm,tq,iregion); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"x") == 0) value = tq[0]; else if (strcmp(args[1],"y") == 0) value = tq[1]; else if (strcmp(args[1],"z") == 0) value = tq[2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"inertia") == 0) { atom->check_mass(FLERR); @@ -3829,18 +3830,18 @@ int Variable::group_function(char *word, char *contents, Tree **tree, group->xcm(igroup,masstotal,xcm); group->inertia(igroup,xcm,inertia); } else if (narg == 3) { - int iregion = region_function(args[2]); + int iregion = region_function(args[2],ivar); double masstotal = group->mass(igroup,iregion); group->xcm(igroup,masstotal,xcm,iregion); group->inertia(igroup,xcm,inertia,iregion); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"xx") == 0) value = inertia[0][0]; else if (strcmp(args[1],"yy") == 0) value = inertia[1][1]; else if (strcmp(args[1],"zz") == 0) value = inertia[2][2]; else if (strcmp(args[1],"xy") == 0) value = inertia[0][1]; else if (strcmp(args[1],"yz") == 0) value = inertia[1][2]; else if (strcmp(args[1],"xz") == 0) value = inertia[0][2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } else if (strcmp(word,"omega") == 0) { atom->check_mass(FLERR); @@ -3852,17 +3853,17 @@ int Variable::group_function(char *word, char *contents, Tree **tree, group->inertia(igroup,xcm,inertia); group->omega(angmom,inertia,omega); } else if (narg == 3) { - int iregion = region_function(args[2]); + int iregion = region_function(args[2],ivar); double masstotal = group->mass(igroup,iregion); group->xcm(igroup,masstotal,xcm,iregion); group->angmom(igroup,xcm,angmom,iregion); group->inertia(igroup,xcm,inertia,iregion); group->omega(angmom,inertia,omega); - } else error->all(FLERR,"Invalid group function in variable formula"); + } else print_var_error(FLERR,"Invalid group function in variable formula",ivar); if (strcmp(args[1],"x") == 0) value = omega[0]; else if (strcmp(args[1],"y") == 0) value = omega[1]; else if (strcmp(args[1],"z") == 0) value = omega[2]; - else error->all(FLERR,"Invalid group function in variable formula"); + else print_var_error(FLERR,"Invalid group function in variable formula",ivar); } // delete stored args @@ -3885,11 +3886,11 @@ int Variable::group_function(char *word, char *contents, Tree **tree, /* ---------------------------------------------------------------------- */ -int Variable::region_function(char *id) +int Variable::region_function(char *id, int ivar) { int iregion = domain->find_region(id); if (iregion == -1) - error->all(FLERR,"Region ID in variable formula does not exist"); + print_var_error(FLERR,"Region ID in variable formula does not exist",ivar); // init region in case sub-regions have been deleted @@ -3911,7 +3912,7 @@ int Variable::region_function(char *id) int Variable::special_function(char *word, char *contents, Tree **tree, Tree **treestack, int &ntreestack, - double *argstack, int &nargstack) + double *argstack, int &nargstack, int ivar) { double value,xvalue,sx,sy,sxx,sxy; @@ -3946,7 +3947,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, else if (strcmp(word,"slope") == 0) method = SLOPE; if (narg != 1) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); Compute *compute = NULL; Fix *fix = NULL; @@ -3974,8 +3975,8 @@ int Variable::special_function(char *word, char *contents, Tree **tree, if (index == 0 && compute->vector_flag) { if (update->whichflag == 0) { if (compute->invoked_vector != update->ntimestep) - error->all(FLERR, - "Compute used in variable between runs is not current"); + print_var_error(FLERR,"Compute used in variable between runs " + "is not current",ivar); } else if (!(compute->invoked_flag & INVOKED_VECTOR)) { compute->compute_vector(); compute->invoked_flag |= INVOKED_VECTOR; @@ -3984,19 +3985,19 @@ int Variable::special_function(char *word, char *contents, Tree **tree, nstride = 1; } else if (index && compute->array_flag) { if (index > compute->size_array_cols) - error->all(FLERR,"Variable formula compute array " - "is accessed out-of-range"); + print_var_error(FLERR,"Variable formula compute array " + "is accessed out-of-range",ivar); if (update->whichflag == 0) { if (compute->invoked_array != update->ntimestep) - error->all(FLERR, - "Compute used in variable between runs is not current"); + print_var_error(FLERR,"Compute used in variable between runs " + "is not current",ivar); } else if (!(compute->invoked_flag & INVOKED_ARRAY)) { compute->compute_array(); compute->invoked_flag |= INVOKED_ARRAY; } nvec = compute->size_array_rows; nstride = compute->size_array_cols; - } else error->all(FLERR,"Mismatched compute in variable formula"); + } else print_var_error(FLERR,"Mismatched compute in variable formula",ivar); // argument is fix @@ -4009,22 +4010,22 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else index = 0; int ifix = modify->find_fix(&args[0][2]); - if (ifix < 0) error->all(FLERR,"Invalid fix ID in variable formula"); + if (ifix < 0) print_var_error(FLERR,"Invalid fix ID in variable formula",ivar); fix = modify->fix[ifix]; if (index == 0 && fix->vector_flag) { if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - error->all(FLERR,"Fix in variable not computed at compatible time"); + print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); nvec = fix->size_vector; nstride = 1; } else if (index && fix->array_flag) { if (index > fix->size_array_cols) - error->all(FLERR, - "Variable formula fix array is accessed out-of-range"); + print_var_error(FLERR,"Variable formula fix array " + "is accessed out-of-range",ivar); if (update->whichflag > 0 && update->ntimestep % fix->global_freq) - error->all(FLERR,"Fix in variable not computed at compatible time"); + print_var_error(FLERR,"Fix in variable not computed at compatible time",ivar); nvec = fix->size_array_rows; nstride = fix->size_array_cols; - } else error->all(FLERR,"Mismatched fix in variable formula"); + } else print_var_error(FLERR,"Mismatched fix in variable formula",ivar); // argument is vector-style variable @@ -4037,21 +4038,21 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else index = 0; if (index) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); ivar = find(&args[0][2]); if (ivar < 0) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); if (style[ivar] != VECTOR) - error->all(FLERR, - "Mis-matched special function variable in variable formula"); + print_var_error(FLERR,"Mis-matched special function variable " + "in variable formula",ivar); if (eval_in_progress[ivar]) - error->all(FLERR,"Variable has circular dependency"); + print_var_error(FLERR,"Variable has circular dependency",ivar); double *vec; nvec = compute_vector(ivar,&vec); nstride = 1; - } else error->all(FLERR,"Invalid special function in variable formula"); + } else print_var_error(FLERR,"Invalid special function in variable formula",ivar); value = 0.0; if (method == SLOPE) sx = sy = sxx = sxy = 0.0; @@ -4158,13 +4159,13 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"gmask") == 0) { if (tree == NULL) - error->all(FLERR,"Gmask function in equal-style variable formula"); + print_var_error(FLERR,"Gmask function in equal-style variable formula",ivar); if (narg != 1) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); int igroup = group->find(args[0]); if (igroup == -1) - error->all(FLERR,"Group ID in variable formula does not exist"); + print_var_error(FLERR,"Group ID in variable formula does not exist",ivar); Tree *newtree = new Tree(); newtree->type = GMASK; @@ -4175,11 +4176,11 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"rmask") == 0) { if (tree == NULL) - error->all(FLERR,"Rmask function in equal-style variable formula"); + print_var_error(FLERR,"Rmask function in equal-style variable formula",ivar); if (narg != 1) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); - int iregion = region_function(args[0]); + int iregion = region_function(args[0],ivar); domain->regions[iregion]->prematch(); Tree *newtree = new Tree(); @@ -4191,14 +4192,14 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"grmask") == 0) { if (tree == NULL) - error->all(FLERR,"Grmask function in equal-style variable formula"); + print_var_error(FLERR,"Grmask function in equal-style variable formula",ivar); if (narg != 2) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); int igroup = group->find(args[0]); if (igroup == -1) - error->all(FLERR,"Group ID in variable formula does not exist"); - int iregion = region_function(args[1]); + print_var_error(FLERR,"Group ID in variable formula does not exist",ivar); + int iregion = region_function(args[1],ivar); domain->regions[iregion]->prematch(); Tree *newtree = new Tree(); @@ -4213,11 +4214,11 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"next") == 0) { if (narg != 1) - error->all(FLERR,"Invalid special function in variable formula"); + print_var_error(FLERR,"Invalid special function in variable formula",ivar); int ivar = find(args[0]); if (ivar < 0) - error->all(FLERR,"Variable ID in variable formula does not exist"); + print_var_error(FLERR,"Variable ID in variable formula does not exist",ivar); // SCALARFILE has single current value, read next one // save value in tree or on argstack @@ -4242,7 +4243,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (style[ivar] == ATOMFILE) { if (tree == NULL) - error->all(FLERR,"Atomfile variable in equal-style variable formula"); + print_var_error(FLERR,"Atomfile variable in equal-style variable formula",ivar); double *result; memory->create(result,atom->nlocal,"variable:result"); @@ -4260,11 +4261,11 @@ int Variable::special_function(char *word, char *contents, Tree **tree, newtree->nextra = 0; treestack[ntreestack++] = newtree; - } else error->all(FLERR,"Invalid variable style in special function next"); + } else print_var_error(FLERR,"Invalid variable style in special function next",ivar); } else if (strcmp(word,"is_active") == 0) { if (narg != 2) - error->all(FLERR,"Invalid is_active() function in variable formula"); + print_var_error(FLERR,"Invalid is_active() function in variable formula",ivar); Info info(lmp); value = (info.is_active(args[0],args[1])) ? 1.0 : 0.0; @@ -4282,7 +4283,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"is_available") == 0) { if (narg != 2) - error->all(FLERR,"Invalid is_available() function in variable formula"); + print_var_error(FLERR,"Invalid is_available() function in variable formula",ivar); Info info(lmp); value = (info.is_available(args[0],args[1])) ? 1.0 : 0.0; @@ -4300,7 +4301,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree, } else if (strcmp(word,"is_defined") == 0) { if (narg != 2) - error->all(FLERR,"Invalid is_defined() function in variable formula"); + print_var_error(FLERR,"Invalid is_defined() function in variable formula",ivar); Info info(lmp); value = (info.is_defined(args[0],args[1])) ? 1.0 : 0.0; @@ -4663,7 +4664,7 @@ double Variable::evaluate_boolean(char *str) expect = OP; char *contents; - i = find_matching_paren(str,i,contents); + i = find_matching_paren(str,i,contents,-1); i++; // evaluate contents and push on stack diff --git a/src/variable.h b/src/variable.h index 49d00d975aeae70ab8a10725306a7dd3cf82b937..428c4edce864d7d871c128c9302ab0754b40b9d5 100644 --- a/src/variable.h +++ b/src/variable.h @@ -97,18 +97,20 @@ class Variable : protected Pointers { void remove(int); void grow(); void copy(int, char **, char **); - double evaluate(char *, Tree **, int ivar=-1); + double evaluate(char *, Tree **, int); double collapse_tree(Tree *); double eval_tree(Tree *, int); int size_tree_vector(Tree *); int compare_tree_vector(int, int); void free_tree(Tree *); - int find_matching_paren(char *, int, char *&, int ivar=-1); - int math_function(char *, char *, Tree **, Tree **, int &, double *, int &); - int group_function(char *, char *, Tree **, Tree **, int &, double *, int &); - int region_function(char *); + int find_matching_paren(char *, int, char *&, int); + int math_function(char *, char *, Tree **, Tree **, + int &, double *, int &, int); + int group_function(char *, char *, Tree **, Tree **, + int &, double *, int &, int); + int region_function(char *, int); int special_function(char *, char *, Tree **, Tree **, - int &, double *, int &); + int &, double *, int &, int); void peratom2global(int, char *, double *, int, tagint, Tree **, Tree **, int &, double *, int &); int is_atom_vector(char *);