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

This commit is contained in:
sjplimp 2010-06-28 18:11:19 +00:00
parent 304376aa02
commit 2238c1ca6f
1 changed files with 31 additions and 18 deletions

View File

@ -79,7 +79,8 @@ Variable::~Variable()
{
for (int i = 0; i < nvar; i++) {
delete [] names[i];
for (int j = 0; j < num[i]; j++) delete [] data[i][j];
if (style[i] == LOOP || style[i] == ULOOP) delete [] data[i][0];
else for (int j = 0; j < num[i]; j++) delete [] data[i][j];
delete [] data[i];
}
memory->sfree(names);
@ -119,18 +120,27 @@ void Variable::set(int narg, char **arg)
copy(num[nvar],&arg[2],data[nvar]);
// LOOP
// num = N, index = 1st value, data = list of NULLS since never used
// 1 arg: num = N, index = 1st value, data = single string
// 2 args: num = N2, index = N1, data = single string
} else if (strcmp(arg[1],"loop") == 0) {
if (narg != 3) error->all("Illegal variable command");
if (narg < 3 || narg > 4) error->all("Illegal variable command");
if (find(arg[0]) >= 0) return;
if (nvar == maxvar) extend();
style[nvar] = LOOP;
num[nvar] = atoi(arg[2]);
index[nvar] = 0;
data[nvar] = new char*[num[nvar]];
for (int i = 0; i < num[nvar]; i++) data[nvar][i] = NULL;
int nfirst,nlast;
if (narg == 3) {
nfirst = 1;
nlast = atoi(arg[2]);
} else {
nfirst = atoi(arg[2]);
nlast = atoi(arg[3]);
}
num[nvar] = nlast;
index[nvar] = nfirst-1;
data[nvar] = new char*[1];
data[nvar][0] = NULL;
// WORLD
// num = listed args, index = partition this proc is in, data = copied args
// error check that num = # of worlds in universe
@ -149,7 +159,7 @@ void Variable::set(int narg, char **arg)
// UNIVERSE and ULOOP
// for UNIVERSE: num = listed args, data = copied args
// for ULOOP: num = N, data = list of NULLS since never used
// for ULOOP: num = N, data = single string
// index = partition this proc is in
// universe proc 0 creates lock file
// error check that all other universe/uloop variables are same length
@ -169,8 +179,8 @@ void Variable::set(int narg, char **arg)
if (nvar == maxvar) extend();
style[nvar] = ULOOP;
num[nvar] = atoi(arg[2]);
data[nvar] = new char*[num[nvar]];
for (int i = 0; i < num[nvar]; i++) data[nvar][i] = NULL;
data[nvar] = new char*[1];
data[nvar][0] = NULL;
}
if (num[nvar] < universe->nworlds)
@ -258,8 +268,8 @@ void Variable::set(int narg, char **arg)
for (int i = 0; i < n-1; i++)
if (!isalnum(names[nvar][i]) && names[nvar][i] != '_')
error->all("Variable name must be alphanumeric or underscore characters");
error->all("Variable name must be alphanumeric or "
"underscore characters");
nvar++;
}
@ -368,7 +378,10 @@ int Variable::next(int narg, char **arg)
/* ----------------------------------------------------------------------
return ptr to the data text associated with a variable
if EQUAL var, evaluates variable and puts result in str
if INDEX or WORLD or UNIVERSE or STRING var, return ptr to stored string
if LOOP or ULOOP var, write int to data[0] and return ptr to string
if EQUAL var, evaluate variable and put result in str
if ATOM var, return NULL
return NULL if no variable or index is bad, caller must respond
------------------------------------------------------------------------- */
@ -386,7 +399,7 @@ char *Variable::retrieve(char *name)
char *value = new char[16];
sprintf(value,"%d",index[ivar]+1);
int n = strlen(value) + 1;
if (data[ivar][0]) delete [] data[ivar][0];
delete [] data[ivar][0];
data[ivar][0] = new char[n];
strcpy(data[ivar][0],value);
delete [] value;
@ -489,7 +502,8 @@ int Variable::atomstyle(int ivar)
void Variable::remove(int n)
{
delete [] names[n];
for (int i = 0; i < num[n]; i++) delete [] data[n][i];
if (style[n] == LOOP || style[n] == ULOOP) delete [] data[n][0];
else for (int i = 0; i < num[n]; i++) delete [] data[n][i];
delete [] data[n];
for (int i = n+1; i < nvar; i++) {
@ -519,13 +533,12 @@ void Variable::extend()
}
/* ----------------------------------------------------------------------
copy narg strings from **from to **to
copy narg strings from **from to **to, and allocate space for them
------------------------------------------------------------------------- */
void Variable::copy(int narg, char **from, char **to)
{
int n;
for (int i = 0; i < narg; i++) {
n = strlen(from[i]) + 1;
to[i] = new char[n];