git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@9050 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp
2012-11-10 01:18:09 +00:00
parent 75e9a2e218
commit 8cc9aa5698
3 changed files with 172 additions and 25 deletions

View File

@ -37,7 +37,6 @@ NeighRequest::NeighRequest(LAMMPS *lmp) : Pointers(lmp)
gran = granhistory = 0; gran = granhistory = 0;
respainner = respamiddle = respaouter = 0; respainner = respamiddle = respaouter = 0;
half_from_full = 0; half_from_full = 0;
ghost = 0;
// default is every reneighboring // default is every reneighboring
// default is use newton_pair setting in force // default is use newton_pair setting in force

View File

@ -39,10 +39,11 @@ using namespace MathConst;
#define VARDELTA 4 #define VARDELTA 4
#define MAXLEVEL 4 #define MAXLEVEL 4
#define MAXLINE 256
#define MYROUND(a) (( a-floor(a) ) >= .5) ? ceil(a) : floor(a) #define MYROUND(a) (( a-floor(a) ) >= .5) ? ceil(a) : floor(a)
enum{INDEX,LOOP,WORLD,UNIVERSE,ULOOP,STRING,EQUAL,ATOM}; enum{INDEX,LOOP,WORLD,UNIVERSE,ULOOP,STRING,FILEVAR,EQUAL,ATOM};
enum{ARG,OP}; enum{ARG,OP};
// customize by adding a function // customize by adding a function
@ -56,7 +57,7 @@ enum{DONE,ADD,SUBTRACT,MULTIPLY,DIVIDE,CARAT,UNARY,
// customize by adding a special function // customize by adding a special function
enum{SUM,XMIN,XMAX,AVE,TRAP}; enum{SUM,XMIN,XMAX,AVE,TRAP,NEXT};
#define INVOKED_SCALAR 1 #define INVOKED_SCALAR 1
#define INVOKED_VECTOR 2 #define INVOKED_VECTOR 2
@ -77,6 +78,7 @@ Variable::Variable(LAMMPS *lmp) : Pointers(lmp)
num = NULL; num = NULL;
which = NULL; which = NULL;
pad = NULL; pad = NULL;
reader = NULL;
data = NULL; data = NULL;
eval_in_progress = NULL; eval_in_progress = NULL;
@ -101,6 +103,7 @@ Variable::~Variable()
{ {
for (int i = 0; i < nvar; i++) { for (int i = 0; i < nvar; i++) {
delete [] names[i]; delete [] names[i];
delete reader[i];
if (style[i] == LOOP || style[i] == ULOOP) delete [] data[i][0]; if (style[i] == LOOP || style[i] == ULOOP) delete [] data[i][0];
else for (int j = 0; j < num[i]; j++) delete [] data[i][j]; else for (int j = 0; j < num[i]; j++) delete [] data[i][j];
delete [] data[i]; delete [] data[i];
@ -110,6 +113,7 @@ Variable::~Variable()
memory->destroy(num); memory->destroy(num);
memory->destroy(which); memory->destroy(which);
memory->destroy(pad); memory->destroy(pad);
memory->sfree(reader);
memory->sfree(data); memory->sfree(data);
memory->destroy(eval_in_progress); memory->destroy(eval_in_progress);
@ -245,7 +249,8 @@ void Variable::set(int narg, char **arg)
for (int jvar = 0; jvar < nvar; jvar++) for (int jvar = 0; jvar < nvar; jvar++)
if (num[jvar] && (style[jvar] == UNIVERSE || style[jvar] == ULOOP) && if (num[jvar] && (style[jvar] == UNIVERSE || style[jvar] == ULOOP) &&
num[nvar] != num[jvar]) num[nvar] != num[jvar])
error->all(FLERR,"All universe/uloop variables must have same # of values"); error->all(FLERR,
"All universe/uloop variables must have same # of values");
// STRING // STRING
// remove pre-existing var if also style STRING (allows it to be reset) // remove pre-existing var if also style STRING (allows it to be reset)
@ -267,6 +272,23 @@ void Variable::set(int narg, char **arg)
data[nvar] = new char*[num[nvar]]; data[nvar] = new char*[num[nvar]];
copy(1,&arg[2],data[nvar]); copy(1,&arg[2],data[nvar]);
// FILEVAR for strings or numbers
// which = 1st value
} else if (strcmp(arg[1],"file") == 0) {
if (narg != 3) error->all(FLERR,"Illegal variable command");
if (find(arg[0]) >= 0) return;
if (nvar == maxvar) grow();
style[nvar] = FILEVAR;
num[nvar] = 1;
which[nvar] = 0;
pad[nvar] = 0;
data[nvar] = new char*[num[nvar]];
data[nvar][0] = new char[MAXLINE];
reader[nvar] = new VarReader(lmp,arg[2]);
int flag = reader[nvar]->read(data[nvar][0]);
if (flag) error->all(FLERR,"File variable could not read value");
// EQUAL // EQUAL
// remove pre-existing var if also style EQUAL (allows it to be reset) // remove pre-existing var if also style EQUAL (allows it to be reset)
// num = 2, which = 1st value // num = 2, which = 1st value
@ -385,6 +407,17 @@ int Variable::next(int narg, char **arg)
} }
} }
} else if (istyle == FILEVAR) {
for (int iarg = 0; iarg < narg; iarg++) {
ivar = find(arg[iarg]);
int done = reader[ivar]->read(data[ivar][0]);
if (done) {
flag = 1;
remove(ivar);
}
}
} else if (istyle == UNIVERSE || istyle == ULOOP) { } else if (istyle == UNIVERSE || istyle == ULOOP) {
// wait until lock file can be created and owned by proc 0 of this world // wait until lock file can be created and owned by proc 0 of this world
@ -445,7 +478,8 @@ char *Variable::retrieve(char *name)
char *str; char *str;
if (style[ivar] == INDEX || style[ivar] == WORLD || if (style[ivar] == INDEX || style[ivar] == WORLD ||
style[ivar] == UNIVERSE || style[ivar] == STRING) { style[ivar] == UNIVERSE || style[ivar] == STRING ||
style[ivar] == FILEVAR) {
str = data[ivar][which[ivar]]; str = data[ivar][which[ivar]];
} else if (style[ivar] == LOOP || style[ivar] == ULOOP) { } else if (style[ivar] == LOOP || style[ivar] == ULOOP) {
char result[16]; char result[16];
@ -575,6 +609,7 @@ void Variable::remove(int n)
num[i-1] = num[i]; num[i-1] = num[i];
which[i-1] = which[i]; which[i-1] = which[i];
pad[i-1] = pad[i]; pad[i-1] = pad[i];
reader[i-1] = reader[i];
data[i-1] = data[i]; data[i-1] = data[i];
} }
nvar--; nvar--;
@ -586,14 +621,20 @@ void Variable::remove(int n)
void Variable::grow() void Variable::grow()
{ {
int old = maxvar;
maxvar += VARDELTA; maxvar += VARDELTA;
names = (char **) names = (char **) memory->srealloc(names,maxvar*sizeof(char *),"var:names");
memory->srealloc(names,maxvar*sizeof(char *),"var:names");
memory->grow(style,maxvar,"var:style"); memory->grow(style,maxvar,"var:style");
memory->grow(num,maxvar,"var:num"); memory->grow(num,maxvar,"var:num");
memory->grow(which,maxvar,"var:which"); memory->grow(which,maxvar,"var:which");
memory->grow(pad,maxvar,"var:pad"); memory->grow(pad,maxvar,"var:pad");
reader = (VarReader **)
memory->srealloc(reader,maxvar*sizeof(VarReader *),"var:reader");
for (int i = old; i < maxvar; i++) reader[i] = NULL;
data = (char ***) memory->srealloc(data,maxvar*sizeof(char **),"var:data"); data = (char ***) memory->srealloc(data,maxvar*sizeof(char **),"var:data");
memory->grow(eval_in_progress,maxvar,"var:eval_in_progress"); memory->grow(eval_in_progress,maxvar,"var:eval_in_progress");
for (int i = 0; i < maxvar; i++) eval_in_progress[i] = 0; for (int i = 0; i < maxvar; i++) eval_in_progress[i] = 0;
} }
@ -743,14 +784,16 @@ double Variable::evaluate(char *str, Tree **tree)
if (strncmp(word,"c_",2) == 0) { if (strncmp(word,"c_",2) == 0) {
if (domain->box_exist == 0) if (domain->box_exist == 0)
error->all(FLERR,"Variable evaluation before simulation box is defined"); error->all(FLERR,
"Variable evaluation before simulation box is defined");
n = strlen(word) - 2 + 1; n = strlen(word) - 2 + 1;
char *id = new char[n]; char *id = new char[n];
strcpy(id,&word[2]); strcpy(id,&word[2]);
int icompute = modify->find_compute(id); int icompute = modify->find_compute(id);
if (icompute < 0) error->all(FLERR,"Invalid compute ID in variable formula"); if (icompute < 0)
error->all(FLERR,"Invalid compute ID in variable formula");
Compute *compute = modify->compute[icompute]; Compute *compute = modify->compute[icompute];
delete [] id; delete [] id;
@ -2826,7 +2869,7 @@ int Variable::special_function(char *word, char *contents, Tree **tree,
if (strcmp(word,"sum") && strcmp(word,"min") && strcmp(word,"max") && if (strcmp(word,"sum") && strcmp(word,"min") && strcmp(word,"max") &&
strcmp(word,"ave") && strcmp(word,"trap") && strcmp(word,"gmask") && strcmp(word,"ave") && strcmp(word,"trap") && strcmp(word,"gmask") &&
strcmp(word,"rmask") && strcmp(word,"grmask")) strcmp(word,"rmask") && strcmp(word,"grmask") && strcmp(word,"next"))
return 0; return 0;
// parse contents for arg1,arg2,arg3 separated by commas // parse contents for arg1,arg2,arg3 separated by commas
@ -2872,7 +2915,8 @@ int Variable::special_function(char *word, char *contents, Tree **tree,
else if (strcmp(word,"ave") == 0) method = AVE; else if (strcmp(word,"ave") == 0) method = AVE;
else if (strcmp(word,"trap") == 0) method = TRAP; else if (strcmp(word,"trap") == 0) method = TRAP;
if (narg != 1) error->all(FLERR,"Invalid special function in variable formula"); if (narg != 1)
error->all(FLERR,"Invalid special function in variable formula");
Compute *compute = NULL; Compute *compute = NULL;
Fix *fix = NULL; Fix *fix = NULL;
@ -2887,12 +2931,14 @@ int Variable::special_function(char *word, char *contents, Tree **tree,
} else index = 0; } else index = 0;
int icompute = modify->find_compute(&arg1[2]); int icompute = modify->find_compute(&arg1[2]);
if (icompute < 0) error->all(FLERR,"Invalid compute ID in variable formula"); if (icompute < 0)
error->all(FLERR,"Invalid compute ID in variable formula");
compute = modify->compute[icompute]; compute = modify->compute[icompute];
if (index == 0 && compute->vector_flag) { if (index == 0 && compute->vector_flag) {
if (update->whichflag == 0) { if (update->whichflag == 0) {
if (compute->invoked_vector != update->ntimestep) if (compute->invoked_vector != update->ntimestep)
error->all(FLERR,"Compute used in variable between runs is not current"); error->all(FLERR,
"Compute used in variable between runs is not current");
} else if (!(compute->invoked_flag & INVOKED_VECTOR)) { } else if (!(compute->invoked_flag & INVOKED_VECTOR)) {
compute->compute_vector(); compute->compute_vector();
compute->invoked_flag |= INVOKED_VECTOR; compute->invoked_flag |= INVOKED_VECTOR;
@ -2986,10 +3032,6 @@ int Variable::special_function(char *word, char *contents, Tree **tree,
if (method == AVE) value /= nvec; if (method == AVE) value /= nvec;
delete [] arg1;
delete [] arg2;
delete [] arg3;
// save value in tree or on argstack // save value in tree or on argstack
if (tree) { if (tree) {
@ -3005,7 +3047,8 @@ int Variable::special_function(char *word, char *contents, Tree **tree,
} else if (strcmp(word,"gmask") == 0) { } else if (strcmp(word,"gmask") == 0) {
if (tree == NULL) if (tree == NULL)
error->all(FLERR,"Gmask function in equal-style variable formula"); error->all(FLERR,"Gmask function in equal-style variable formula");
if (narg != 1) error->all(FLERR,"Invalid special function in variable formula"); if (narg != 1)
error->all(FLERR,"Invalid special function in variable formula");
int igroup = group->find(arg1); int igroup = group->find(arg1);
if (igroup == -1) if (igroup == -1)
@ -3020,7 +3063,8 @@ int Variable::special_function(char *word, char *contents, Tree **tree,
} else if (strcmp(word,"rmask") == 0) { } else if (strcmp(word,"rmask") == 0) {
if (tree == NULL) if (tree == NULL)
error->all(FLERR,"Rmask function in equal-style variable formula"); error->all(FLERR,"Rmask function in equal-style variable formula");
if (narg != 1) error->all(FLERR,"Invalid special function in variable formula"); if (narg != 1)
error->all(FLERR,"Invalid special function in variable formula");
int iregion = region_function(arg1); int iregion = region_function(arg1);
@ -3033,7 +3077,8 @@ int Variable::special_function(char *word, char *contents, Tree **tree,
} else if (strcmp(word,"grmask") == 0) { } else if (strcmp(word,"grmask") == 0) {
if (tree == NULL) if (tree == NULL)
error->all(FLERR,"Grmask function in equal-style variable formula"); error->all(FLERR,"Grmask function in equal-style variable formula");
if (narg != 2) error->all(FLERR,"Invalid special function in variable formula"); if (narg != 2)
error->all(FLERR,"Invalid special function in variable formula");
int igroup = group->find(arg1); int igroup = group->find(arg1);
if (igroup == -1) if (igroup == -1)
@ -3046,8 +3091,37 @@ int Variable::special_function(char *word, char *contents, Tree **tree,
newtree->ivalue2 = iregion; newtree->ivalue2 = iregion;
newtree->left = newtree->middle = newtree->right = NULL; newtree->left = newtree->middle = newtree->right = NULL;
treestack[ntreestack++] = newtree; treestack[ntreestack++] = newtree;
// file variable special function
} else if (strcmp(word,"next") == 0) {
if (narg != 1)
error->all(FLERR,"Invalid special function in variable formula");
int ivar = find(arg1);
if (ivar == -1)
error->all(FLERR,"Variable ID in variable formula does not exist");
if (style[ivar] != FILEVAR)
error->all(FLERR,"Invalid variable in special function next");
double value = atof(data[ivar][0]);
reader[ivar]->read(data[ivar][0]);
// save value in tree or on argstack
if (tree) {
Tree *newtree = new Tree();
newtree->type = VALUE;
newtree->value = value;
newtree->left = newtree->middle = newtree->right = NULL;
treestack[ntreestack++] = newtree;
} else argstack[nargstack++] = value;
} }
delete [] arg1;
delete [] arg2;
delete [] arg3;
return 1; return 1;
} }
@ -3067,7 +3141,8 @@ void Variable::peratom2global(int flag, char *word,
double *argstack, int &nargstack) double *argstack, int &nargstack)
{ {
if (atom->map_style == 0) if (atom->map_style == 0)
error->all(FLERR,"Indexed per-atom vector in variable formula without atom map"); error->all(FLERR,
"Indexed per-atom vector in variable formula without atom map");
int index = atom->map(id); int index = atom->map(id);
@ -3210,7 +3285,8 @@ double Variable::numeric(char *str)
if (isdigit(str[i])) continue; if (isdigit(str[i])) continue;
if (str[i] == '-' || str[i] == '+' || str[i] == '.') continue; if (str[i] == '-' || str[i] == '+' || str[i] == '.') continue;
if (str[i] == 'e' || str[i] == 'E') continue; if (str[i] == 'e' || str[i] == 'E') continue;
error->all(FLERR,"Expected floating point parameter in variable definition"); error->all(FLERR,
"Expected floating point parameter in variable definition");
} }
return atof(str); return atof(str);
@ -3296,7 +3372,8 @@ double Variable::evaluate_boolean(char *str)
// ---------------- // ----------------
else if (onechar == '(') { else if (onechar == '(') {
if (expect == OP) error->all(FLERR,"Invalid Boolean syntax in if command"); if (expect == OP)
error->all(FLERR,"Invalid Boolean syntax in if command");
expect = OP; expect = OP;
char *contents; char *contents;
@ -3314,7 +3391,8 @@ double Variable::evaluate_boolean(char *str)
// ---------------- // ----------------
} else if (isdigit(onechar) || onechar == '.' || onechar == '-') { } else if (isdigit(onechar) || onechar == '.' || onechar == '-') {
if (expect == OP) error->all(FLERR,"Invalid Boolean syntax in if command"); if (expect == OP)
error->all(FLERR,"Invalid Boolean syntax in if command");
expect = OP; expect = OP;
// istop = end of number, including scientific notation // istop = end of number, including scientific notation
@ -3383,7 +3461,8 @@ double Variable::evaluate_boolean(char *str)
continue; continue;
} }
if (expect == ARG) error->all(FLERR,"Invalid Boolean syntax in if command"); if (expect == ARG)
error->all(FLERR,"Invalid Boolean syntax in if command");
expect = ARG; expect = ARG;
// evaluate stack as deep as possible while respecting precedence // evaluate stack as deep as possible while respecting precedence
@ -3516,3 +3595,58 @@ unsigned int Variable::data_mask(char *str)
return datamask; return datamask;
} }
/* ----------------------------------------------------------------------
class to read variable values from a file, line by line
------------------------------------------------------------------------- */
VarReader::VarReader(LAMMPS *lmp, char *file) : Pointers(lmp)
{
MPI_Comm_rank(world,&me);
if (me == 0) {
fp = fopen(file,"r");
if (fp == NULL) {
char str[128];
sprintf(str,"Cannot open file variable file %s",file);
error->one(FLERR,str);
}
}
}
/* ---------------------------------------------------------------------- */
VarReader::~VarReader()
{
if (me == 0) fclose(fp);
}
/* ----------------------------------------------------------------------
read next value from file into str
strip comments, skip blank lines
return 0 if successful, 1 if end-of-file
------------------------------------------------------------------------- */
int VarReader::read(char *str)
{
int n;
char *ptr;
if (me == 0) {
while (1) {
if (fgets(str,MAXLINE,fp) == NULL) n = 0;
else n = strlen(str);
if (n == 0) break; // end of file
str[n-1] = '\0'; // strip newline
if (ptr = strchr(str,'#')) *ptr = '\0'; // strip comment
if (strtok(str," \t\n\r\f") == NULL) continue; // skip if blank
n = strlen(str) + 1;
break;
}
}
MPI_Bcast(&n,1,MPI_INT,0,world);
if (n == 0) return 1;
MPI_Bcast(str,n,MPI_CHAR,0,world);
return 0;
}

View File

@ -14,6 +14,7 @@
#ifndef LMP_VARIABLE_H #ifndef LMP_VARIABLE_H
#define LMP_VARIABLE_H #define LMP_VARIABLE_H
#include "stdlib.h"
#include "pointers.h" #include "pointers.h"
namespace LAMMPS_NS { namespace LAMMPS_NS {
@ -45,7 +46,9 @@ class Variable : protected Pointers {
int *num; // # of values for each variable int *num; // # of values for each variable
int *which; // next available value for each variable int *which; // next available value for each variable
int *pad; // 1 = pad loop/uloop variables with 0s, 0 = no pad int *pad; // 1 = pad loop/uloop variables with 0s, 0 = no pad
class VarReader **reader; // variable that reads lines from file
char ***data; // str value of each variable's values char ***data; // str value of each variable's values
int *eval_in_progress; // flag if evaluation of variable is in progress int *eval_in_progress; // flag if evaluation of variable is in progress
class RanMars *randomequal; // random number generator for equal-style vars class RanMars *randomequal; // random number generator for equal-style vars
@ -90,6 +93,17 @@ class Variable : protected Pointers {
void print_tree(Tree *, int); void print_tree(Tree *, int);
}; };
class VarReader : protected Pointers {
public:
VarReader(class LAMMPS *, char *);
~VarReader();
int read(char *);
private:
int me;
FILE *fp;
};
} }
#endif #endif