Merge remote-tracking branch 'lammps-ro/master' into lammps-icms

Resolved Conflicts:
	doc/Manual.html
	doc/Manual.txt
	src/MAKE/Makefile.ubuntu
	src/USER-REAXC/pair_reax_c.cpp
	src/USER-REAXC/reaxc_allocate.cpp
	src/USER-REAXC/reaxc_init_md.cpp
	src/USER-REAXC/reaxc_list.cpp
	src/USER-REAXC/reaxc_multi_body.cpp
	src/USER-REAXC/reaxc_reset_tools.cpp
	src/USER-REAXC/reaxc_tool_box.cpp
	src/USER-REAXC/reaxc_traj.cpp
	src/USER-REAXC/reaxc_types.h
	src/USER-REAXC/reaxc_vector.cpp
	src/write_data.cpp
This commit is contained in:
Axel Kohlmeyer
2014-05-03 08:13:28 -04:00
175 changed files with 20411 additions and 19287 deletions

View File

@ -647,11 +647,12 @@ char *Variable::retrieve(char *name)
double Variable::compute_equal(int ivar)
{
// eval_in_progress used to detect circle dependencies
// could extend this later to check v_a = c_b + v_a constructs?
if (eval_in_progress[ivar])
error->all(FLERR,"Variable has circular dependency");
eval_in_progress[ivar] = 1;
double value = evaluate(data[ivar][0],NULL);
eval_in_progress[ivar] = 0;
return value;
}
@ -679,6 +680,10 @@ void Variable::compute_atom(int ivar, int igroup,
Tree *tree;
double *vstore;
if (eval_in_progress[ivar])
error->all(FLERR,"Variable has circular dependency");
eval_in_progress[ivar] = 1;
if (style[ivar] == ATOM) {
evaluate(data[ivar][0],&tree);
collapse_tree(tree);
@ -724,6 +729,8 @@ void Variable::compute_atom(int ivar, int igroup,
}
if (style[ivar] == ATOM) free_tree(tree);
eval_in_progress[ivar] = 0;
}
/* ----------------------------------------------------------------------
@ -975,12 +982,12 @@ double Variable::evaluate(char *str, Tree **tree)
else {
nbracket = 1;
ptr = &str[i];
index1 = int_between_brackets(ptr);
index1 = int_between_brackets(ptr,1);
i = ptr-str+1;
if (str[i] == '[') {
nbracket = 2;
ptr = &str[i];
index2 = int_between_brackets(ptr);
index2 = int_between_brackets(ptr,1);
i = ptr-str+1;
}
}
@ -1189,12 +1196,12 @@ double Variable::evaluate(char *str, Tree **tree)
else {
nbracket = 1;
ptr = &str[i];
index1 = int_between_brackets(ptr);
index1 = int_between_brackets(ptr,1);
i = ptr-str+1;
if (str[i] == '[') {
nbracket = 2;
ptr = &str[i];
index2 = int_between_brackets(ptr);
index2 = int_between_brackets(ptr,1);
i = ptr-str+1;
}
}
@ -1361,7 +1368,7 @@ double Variable::evaluate(char *str, Tree **tree)
else {
nbracket = 1;
ptr = &str[i];
index = int_between_brackets(ptr);
index = int_between_brackets(ptr,1);
i = ptr-str+1;
}
@ -1467,7 +1474,7 @@ double Variable::evaluate(char *str, Tree **tree)
"Variable evaluation before simulation box is defined");
ptr = &str[i];
int id = int_between_brackets(ptr);
int id = int_between_brackets(ptr,1);
i = ptr-str+1;
peratom2global(0,word,NULL,0,id,
@ -2450,25 +2457,59 @@ int Variable::find_matching_paren(char *str, int i,char *&contents)
find int between brackets and return it
ptr initially points to left bracket
return it pointing to right bracket
error if no right bracket or brackets are empty
error if any between-bracket chars are non-digits or value == 0
error if no right bracket or brackets are empty or index = 0
if varallow = 0: error if any between-bracket chars are non-digits
if varallow = 1: also allow for v_name, where name is variable name
------------------------------------------------------------------------- */
int Variable::int_between_brackets(char *&ptr)
int Variable::int_between_brackets(char *&ptr, int varallow)
{
int varflag,index;
char *start = ++ptr;
while (*ptr && *ptr != ']') {
if (!isdigit(*ptr))
error->all(FLERR,"Non digit character between brackets in variable");
ptr++;
if (varallow && strstr(ptr,"v_") == ptr) {
varflag = 1;
while (*ptr && *ptr != ']') {
if (!isalnum(*ptr) && *ptr != '_')
error->all(FLERR,"Variable name between brackets must be "
"alphanumeric or underscore characters");
ptr++;
}
} else {
varflag = 0;
while (*ptr && *ptr != ']') {
if (!isdigit(*ptr))
error->all(FLERR,"Non digit character between brackets in variable");
ptr++;
}
}
if (*ptr != ']') error->all(FLERR,"Mismatched brackets in variable");
if (ptr == start) error->all(FLERR,"Empty brackets in variable");
*ptr = '\0';
int index = atoi(start);
// evaluate index as variable or as simple integer via atoi()
if (varflag) {
char *id = start+2;
int ivar = find(id);
if (ivar < 0)
error->all(FLERR,"Invalid variable name in variable formula");
if (eval_in_progress[ivar])
error->all(FLERR,"Variable has circular dependency");
char *var = retrieve(id);
if (var == NULL)
error->all(FLERR,"Invalid variable evaluation in variable formula");
index = static_cast<int> (atof(var));
} else {
index = atoi(start);
}
*ptr = ']';
if (index == 0)
@ -3182,7 +3223,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree,
ptr1 = strchr(arg1,'[');
if (ptr1) {
ptr2 = ptr1;
index = int_between_brackets(ptr2);
index = int_between_brackets(ptr2,0);
*ptr1 = '\0';
} else index = 0;
@ -3221,7 +3262,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree,
ptr1 = strchr(arg1,'[');
if (ptr1) {
ptr2 = ptr1;
index = int_between_brackets(ptr2);
index = int_between_brackets(ptr2,0);
*ptr1 = '\0';
} else index = 0;
@ -3348,6 +3389,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree,
error->all(FLERR,"Invalid special function in variable formula");
int iregion = region_function(arg1);
domain->regions[iregion]->prematch();
Tree *newtree = new Tree();
newtree->type = RMASK;
@ -3365,6 +3407,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree,
if (igroup == -1)
error->all(FLERR,"Group ID in variable formula does not exist");
int iregion = region_function(arg2);
domain->regions[iregion]->prematch();
Tree *newtree = new Tree();
newtree->type = GRMASK;