git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@987 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
@ -30,9 +30,9 @@ class Compute : protected Pointers {
|
|||||||
|
|
||||||
int scalar_flag; // 0/1 if compute_scalar() function exists
|
int scalar_flag; // 0/1 if compute_scalar() function exists
|
||||||
int vector_flag; // 0/1 if compute_vector() function exists
|
int vector_flag; // 0/1 if compute_vector() function exists
|
||||||
int peratom_flag; // 0/1 if compute_peratom() function exists
|
|
||||||
int size_vector; // N = size of global vector
|
int size_vector; // N = size of global vector
|
||||||
int size_peratom; // 0 = just scalar_atom, N = size of vector_atom
|
int peratom_flag; // 0/1 if compute_peratom() function exists
|
||||||
|
int size_peratom; // 0 = scalar_atom, N = size of vector_atom
|
||||||
|
|
||||||
int extensive; // 0/1 if scalar,vector are intensive/extensive values
|
int extensive; // 0/1 if scalar,vector are intensive/extensive values
|
||||||
int tempflag; // 1 if Compute can be used as temperature
|
int tempflag; // 1 if Compute can be used as temperature
|
||||||
|
|||||||
@ -42,7 +42,8 @@ Fix::Fix(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp)
|
|||||||
rigid_flag = 0;
|
rigid_flag = 0;
|
||||||
virial_flag = 0;
|
virial_flag = 0;
|
||||||
no_change_box = 0;
|
no_change_box = 0;
|
||||||
peratom_flag = 0;
|
|
||||||
|
scalar_flag = vector_flag = peratom_flag = 0;
|
||||||
|
|
||||||
comm_forward = comm_reverse = 0;
|
comm_forward = comm_reverse = 0;
|
||||||
|
|
||||||
|
|||||||
@ -35,6 +35,11 @@ class Fix : protected Pointers {
|
|||||||
int virial_flag; // 1 if Fix contributes to virial, 0 if not
|
int virial_flag; // 1 if Fix contributes to virial, 0 if not
|
||||||
int no_change_box; // 1 if cannot swap ortho <-> triclinic
|
int no_change_box; // 1 if cannot swap ortho <-> triclinic
|
||||||
|
|
||||||
|
int scalar_flag; // 0/1 if compute_scalar() function exists
|
||||||
|
int vector_flag; // 0/1 if compute_vector() function exists
|
||||||
|
int size_vector; // N = size of global vector
|
||||||
|
int scalar_vector_freq; // frequency compute s/v data is available at
|
||||||
|
|
||||||
int peratom_flag; // 0/1 if per-atom data is stored
|
int peratom_flag; // 0/1 if per-atom data is stored
|
||||||
int size_peratom; // 0 = scalar_atom, N = size of vector_atom
|
int size_peratom; // 0 = scalar_atom, N = size of vector_atom
|
||||||
double *scalar_atom; // computed per-atom scalar
|
double *scalar_atom; // computed per-atom scalar
|
||||||
@ -93,7 +98,8 @@ class Fix : protected Pointers {
|
|||||||
virtual int pack_reverse_comm(int, int, double *) {return 0;}
|
virtual int pack_reverse_comm(int, int, double *) {return 0;}
|
||||||
virtual void unpack_reverse_comm(int, int *, double *) {}
|
virtual void unpack_reverse_comm(int, int *, double *) {}
|
||||||
|
|
||||||
virtual double thermo(int) {return 0.0;}
|
virtual double compute_scalar() {return 0.0;}
|
||||||
|
virtual double compute_vector(int) {return 0.0;}
|
||||||
|
|
||||||
virtual int dof(int) {return 0;}
|
virtual int dof(int) {return 0;}
|
||||||
virtual void deform(int) {}
|
virtual void deform(int) {}
|
||||||
|
|||||||
@ -260,10 +260,9 @@ void FixAveSpatial::init()
|
|||||||
if (ifix < 0)
|
if (ifix < 0)
|
||||||
error->all("Fix ID for fix ave/spatial does not exist");
|
error->all("Fix ID for fix ave/spatial does not exist");
|
||||||
fix = modify->fix[ifix];
|
fix = modify->fix[ifix];
|
||||||
if (nevery % modify->fix[ifix]->peratom_freq)
|
if (nevery % fix->peratom_freq)
|
||||||
error->all("Fix ave/spatial and fix not computed at compatible times");
|
error->all("Fix ave/spatial and fix not computed at compatible times");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|||||||
@ -26,29 +26,35 @@
|
|||||||
|
|
||||||
using namespace LAMMPS_NS;
|
using namespace LAMMPS_NS;
|
||||||
|
|
||||||
|
enum{COMPUTE,FIX};
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) :
|
FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) :
|
||||||
Fix(lmp, narg, arg)
|
Fix(lmp, narg, arg)
|
||||||
{
|
{
|
||||||
if (narg != 9) error->all("Illegal fix ave/time command");
|
if (narg != 10) error->all("Illegal fix ave/time command");
|
||||||
|
|
||||||
nevery = atoi(arg[3]);
|
nevery = atoi(arg[3]);
|
||||||
nrepeat = atoi(arg[4]);
|
nrepeat = atoi(arg[4]);
|
||||||
nfreq = atoi(arg[5]);
|
nfreq = atoi(arg[5]);
|
||||||
|
|
||||||
int n = strlen(arg[6]) + 1;
|
if (strcmp(arg[6],"compute") == 0) which = COMPUTE;
|
||||||
id_compute = new char[n];
|
else if (strcmp(arg[6],"fix") == 0) which = FIX;
|
||||||
strcpy(id_compute,arg[6]);
|
else error->all("Illegal fix ave/time command");
|
||||||
|
|
||||||
int flag = atoi(arg[7]);
|
int n = strlen(arg[7]) + 1;
|
||||||
|
id = new char[n];
|
||||||
|
strcpy(id,arg[7]);
|
||||||
|
|
||||||
|
int flag = atoi(arg[8]);
|
||||||
|
|
||||||
MPI_Comm_rank(world,&me);
|
MPI_Comm_rank(world,&me);
|
||||||
if (me == 0) {
|
if (me == 0) {
|
||||||
fp = fopen(arg[8],"w");
|
fp = fopen(arg[9],"w");
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
char str[128];
|
char str[128];
|
||||||
sprintf(str,"Cannot open fix ave/time file %s",arg[8]);
|
sprintf(str,"Cannot open fix ave/time file %s",arg[9]);
|
||||||
error->one(str);
|
error->one(str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -59,31 +65,52 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
if (nfreq < nevery || nfreq % nevery || (nrepeat-1)*nevery >= nfreq)
|
if (nfreq < nevery || nfreq % nevery || (nrepeat-1)*nevery >= nfreq)
|
||||||
error->all("Illegal fix ave/time command");
|
error->all("Illegal fix ave/time command");
|
||||||
|
|
||||||
int icompute = modify->find_compute(id_compute);
|
int icompute,ifix;
|
||||||
|
if (which == COMPUTE) {
|
||||||
|
icompute = modify->find_compute(id);
|
||||||
if (icompute < 0) error->all("Compute ID for fix ave/time does not exist");
|
if (icompute < 0) error->all("Compute ID for fix ave/time does not exist");
|
||||||
|
} else {
|
||||||
|
ifix = modify->find_fix(id);
|
||||||
|
if (ifix < 0) error->all("Fix ID for fix ave/time does not exist");
|
||||||
|
}
|
||||||
|
|
||||||
if (flag < 0 || flag > 2) error->all("Illegal fix ave/time command");
|
if (flag < 0 || flag > 2) error->all("Illegal fix ave/time command");
|
||||||
sflag = vflag = 0;
|
sflag = vflag = 0;
|
||||||
if (flag == 0 || flag == 2) sflag = 1;
|
if (flag == 0 || flag == 2) sflag = 1;
|
||||||
if (flag == 1 || flag == 2) vflag = 1;
|
if (flag == 1 || flag == 2) vflag = 1;
|
||||||
|
|
||||||
|
if (which == COMPUTE) {
|
||||||
if (sflag && modify->compute[icompute]->scalar_flag == 0)
|
if (sflag && modify->compute[icompute]->scalar_flag == 0)
|
||||||
error->all("Fix ave/time compute does not calculate a scalar");
|
error->all("Fix ave/time compute does not calculate a scalar");
|
||||||
if (vflag && modify->compute[icompute]->vector_flag == 0)
|
if (vflag && modify->compute[icompute]->vector_flag == 0)
|
||||||
error->all("Fix ave/time compute does not calculate a vector");
|
error->all("Fix ave/time compute does not calculate a vector");
|
||||||
|
} else {
|
||||||
|
if (sflag && modify->fix[ifix]->scalar_flag == 0)
|
||||||
|
error->all("Fix ave/time fix does not calculate a scalar");
|
||||||
|
if (vflag && modify->fix[ifix]->vector_flag == 0)
|
||||||
|
error->all("Fix ave/time fix does not calculate a vector");
|
||||||
|
}
|
||||||
|
|
||||||
if (modify->compute[icompute]->pressflag) pressure_every = nevery;
|
if (which == COMPUTE &&
|
||||||
|
modify->compute[icompute]->pressflag) pressure_every = nevery;
|
||||||
|
|
||||||
// setup list of computes to call, including pre-computes
|
// setup list of computes to call, including pre-computes
|
||||||
|
|
||||||
|
compute = NULL;
|
||||||
|
if (which == COMPUTE) {
|
||||||
ncompute = 1 + modify->compute[icompute]->npre;
|
ncompute = 1 + modify->compute[icompute]->npre;
|
||||||
compute = new Compute*[ncompute];
|
compute = new Compute*[ncompute];
|
||||||
|
} else ncompute = 0;
|
||||||
|
|
||||||
// print header into file
|
// print header into file
|
||||||
|
|
||||||
if (me == 0) {
|
if (me == 0) {
|
||||||
|
if (which == COMPUTE)
|
||||||
fprintf(fp,"Time-averaged data for fix %s, group %s, and compute %s\n",
|
fprintf(fp,"Time-averaged data for fix %s, group %s, and compute %s\n",
|
||||||
id,group->names[modify->compute[icompute]->igroup],id_compute);
|
id,group->names[modify->compute[icompute]->igroup],id);
|
||||||
|
else
|
||||||
|
fprintf(fp,"Time-averaged data for fix %s, group %s, and fix %s\n",
|
||||||
|
id,group->names[modify->fix[ifix]->igroup],id);
|
||||||
if (sflag and !vflag)
|
if (sflag and !vflag)
|
||||||
fprintf(fp,"TimeStep Value\n");
|
fprintf(fp,"TimeStep Value\n");
|
||||||
else if (!sflag and vflag)
|
else if (!sflag and vflag)
|
||||||
@ -94,7 +121,8 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
|
|
||||||
vector = NULL;
|
vector = NULL;
|
||||||
if (vflag) {
|
if (vflag) {
|
||||||
size_vector = modify->compute[icompute]->size_vector;
|
if (which == COMPUTE) size_vector = modify->compute[icompute]->size_vector;
|
||||||
|
else size_vector = modify->fix[ifix]->size_vector;
|
||||||
vector = new double[size_vector];
|
vector = new double[size_vector];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,7 +139,7 @@ FixAveTime::FixAveTime(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
|
|
||||||
FixAveTime::~FixAveTime()
|
FixAveTime::~FixAveTime()
|
||||||
{
|
{
|
||||||
delete [] id_compute;
|
delete [] id;
|
||||||
if (me == 0) fclose(fp);
|
if (me == 0) fclose(fp);
|
||||||
delete [] compute;
|
delete [] compute;
|
||||||
delete [] vector;
|
delete [] vector;
|
||||||
@ -132,7 +160,8 @@ void FixAveTime::init()
|
|||||||
{
|
{
|
||||||
// set ptrs to one or more computes called each end-of-step
|
// set ptrs to one or more computes called each end-of-step
|
||||||
|
|
||||||
int icompute = modify->find_compute(id_compute);
|
if (which == COMPUTE) {
|
||||||
|
int icompute = modify->find_compute(id);
|
||||||
if (icompute < 0)
|
if (icompute < 0)
|
||||||
error->all("Compute ID for fix ave/time does not exist");
|
error->all("Compute ID for fix ave/time does not exist");
|
||||||
|
|
||||||
@ -148,6 +177,19 @@ void FixAveTime::init()
|
|||||||
compute[ncompute++] = modify->compute[icompute];
|
compute[ncompute++] = modify->compute[icompute];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set ptr to fix ID
|
||||||
|
// check that fix frequency is acceptable
|
||||||
|
|
||||||
|
if (which == FIX) {
|
||||||
|
int ifix = modify->find_fix(id);
|
||||||
|
if (ifix < 0)
|
||||||
|
error->all("Fix ID for fix ave/time does not exist");
|
||||||
|
fix = modify->fix[ifix];
|
||||||
|
if (nevery % fix->scalar_vector_freq)
|
||||||
|
error->all("Fix ave/time and fix not computed at compatible times");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
void FixAveTime::end_of_step()
|
void FixAveTime::end_of_step()
|
||||||
@ -166,8 +208,9 @@ void FixAveTime::end_of_step()
|
|||||||
for (i = 0; i < size_vector; i++) vector[i] = 0.0;
|
for (i = 0; i < size_vector; i++) vector[i] = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// accumulate results of compute to local copy
|
// accumulate results of compute or fix to local copy
|
||||||
|
|
||||||
|
if (which == COMPUTE) {
|
||||||
if (sflag) {
|
if (sflag) {
|
||||||
double value;
|
double value;
|
||||||
for (i = 0; i < ncompute; i++) value = compute[i]->compute_scalar();
|
for (i = 0; i < ncompute; i++) value = compute[i]->compute_scalar();
|
||||||
@ -179,6 +222,13 @@ void FixAveTime::end_of_step()
|
|||||||
for (i = 0; i < size_vector; i++) vector[i] += cvector[i];
|
for (i = 0; i < size_vector; i++) vector[i] += cvector[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (sflag) scalar += fix->compute_scalar();
|
||||||
|
if (vflag)
|
||||||
|
for (i = 0; i < size_vector; i++)
|
||||||
|
vector[i] += fix->compute_vector(i);
|
||||||
|
}
|
||||||
|
|
||||||
irepeat++;
|
irepeat++;
|
||||||
nvalid += nevery;
|
nvalid += nevery;
|
||||||
|
|
||||||
|
|||||||
@ -29,8 +29,8 @@ class FixAveTime : public Fix {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
int me;
|
int me;
|
||||||
int nrepeat,nfreq,nvalid,irepeat;
|
int nrepeat,nfreq,nvalid,irepeat,which,ifix;
|
||||||
char *id_compute;
|
char *id;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
int sflag,vflag;
|
int sflag,vflag;
|
||||||
@ -38,6 +38,7 @@ class FixAveTime : public Fix {
|
|||||||
double scalar,*vector;
|
double scalar,*vector;
|
||||||
int ncompute;
|
int ncompute;
|
||||||
class Compute **compute;
|
class Compute **compute;
|
||||||
|
class Fix *fix;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -37,6 +37,12 @@ FixIndent::FixIndent(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
Fix(lmp, narg, arg)
|
Fix(lmp, narg, arg)
|
||||||
{
|
{
|
||||||
if (narg < 4) error->all("Illegal fix indent command");
|
if (narg < 4) error->all("Illegal fix indent command");
|
||||||
|
|
||||||
|
scalar_flag = 1;
|
||||||
|
vector_flag = 1;
|
||||||
|
size_vector = 3;
|
||||||
|
scalar_vector_freq = 1;
|
||||||
|
|
||||||
k = atof(arg[3]);
|
k = atof(arg[3]);
|
||||||
|
|
||||||
// set defaults
|
// set defaults
|
||||||
@ -122,7 +128,6 @@ void FixIndent::init()
|
|||||||
|
|
||||||
void FixIndent::setup()
|
void FixIndent::setup()
|
||||||
{
|
{
|
||||||
eflag_enable = 1;
|
|
||||||
if (strcmp(update->integrate_style,"verlet") == 0)
|
if (strcmp(update->integrate_style,"verlet") == 0)
|
||||||
post_force(1);
|
post_force(1);
|
||||||
else {
|
else {
|
||||||
@ -130,14 +135,12 @@ void FixIndent::setup()
|
|||||||
post_force_respa(1,nlevels_respa-1,0);
|
post_force_respa(1,nlevels_respa-1,0);
|
||||||
((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1);
|
((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1);
|
||||||
}
|
}
|
||||||
eflag_enable = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
void FixIndent::min_setup()
|
void FixIndent::min_setup()
|
||||||
{
|
{
|
||||||
eflag_enable = 1;
|
|
||||||
post_force(1);
|
post_force(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,10 +148,6 @@ void FixIndent::min_setup()
|
|||||||
|
|
||||||
void FixIndent::post_force(int vflag)
|
void FixIndent::post_force(int vflag)
|
||||||
{
|
{
|
||||||
bool eflag = false;
|
|
||||||
if (eflag_enable) eflag = true;
|
|
||||||
else if (output->next_thermo == update->ntimestep) eflag = true;
|
|
||||||
|
|
||||||
// set current r0
|
// set current r0
|
||||||
// for minimization, always set to r0_stop
|
// for minimization, always set to r0_stop
|
||||||
|
|
||||||
@ -160,8 +159,10 @@ void FixIndent::post_force(int vflag)
|
|||||||
r0 = r0_start + delta * (r0_stop-r0_start);
|
r0 = r0_start + delta * (r0_stop-r0_start);
|
||||||
}
|
}
|
||||||
|
|
||||||
double eng;
|
// indenter values, 0 = energy, 1-3 = force components
|
||||||
if (eflag) eng = 0.0;
|
|
||||||
|
indenter_flag = 0;
|
||||||
|
indenter[0] = indenter[1] = indenter[2] = indenter[3] = 0.0;
|
||||||
|
|
||||||
// spherical indenter
|
// spherical indenter
|
||||||
|
|
||||||
@ -179,7 +180,7 @@ void FixIndent::post_force(int vflag)
|
|||||||
int *mask = atom->mask;
|
int *mask = atom->mask;
|
||||||
int nlocal = atom->nlocal;
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
double delx,dely,delz,r,dr,fmag;
|
double delx,dely,delz,r,dr,fmag,fx,fy,fz;
|
||||||
|
|
||||||
for (int i = 0; i < nlocal; i++)
|
for (int i = 0; i < nlocal; i++)
|
||||||
if (mask[i] & groupbit) {
|
if (mask[i] & groupbit) {
|
||||||
@ -190,10 +191,16 @@ void FixIndent::post_force(int vflag)
|
|||||||
dr = r - r0;
|
dr = r - r0;
|
||||||
if (dr >= 0.0) continue;
|
if (dr >= 0.0) continue;
|
||||||
fmag = k*dr*dr;
|
fmag = k*dr*dr;
|
||||||
f[i][0] += delx*fmag/r;
|
fx = delx*fmag/r;
|
||||||
f[i][1] += dely*fmag/r;
|
fy = dely*fmag/r;
|
||||||
f[i][2] += delz*fmag/r;
|
fz = delz*fmag/r;
|
||||||
if (eflag) eng -= k3 * dr*dr*dr;
|
f[i][0] += fx;
|
||||||
|
f[i][1] += fy;
|
||||||
|
f[i][2] += fz;
|
||||||
|
indenter[0] -= k3 * dr*dr*dr;
|
||||||
|
indenter[1] -= fx;
|
||||||
|
indenter[2] -= fy;
|
||||||
|
indenter[3] -= fz;
|
||||||
}
|
}
|
||||||
|
|
||||||
// cylindrical indenter
|
// cylindrical indenter
|
||||||
@ -220,7 +227,7 @@ void FixIndent::post_force(int vflag)
|
|||||||
int *mask = atom->mask;
|
int *mask = atom->mask;
|
||||||
int nlocal = atom->nlocal;
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
double delx,dely,delz,r,dr,fmag;
|
double delx,dely,delz,r,dr,fmag,fx,fy,fz;
|
||||||
|
|
||||||
for (int i = 0; i < nlocal; i++)
|
for (int i = 0; i < nlocal; i++)
|
||||||
if (mask[i] & groupbit) {
|
if (mask[i] & groupbit) {
|
||||||
@ -241,14 +248,18 @@ void FixIndent::post_force(int vflag)
|
|||||||
dr = r - r0;
|
dr = r - r0;
|
||||||
if (dr >= 0.0) continue;
|
if (dr >= 0.0) continue;
|
||||||
fmag = k*dr*dr;
|
fmag = k*dr*dr;
|
||||||
f[i][0] += delx*fmag/r;
|
fx = delx*fmag/r;
|
||||||
f[i][1] += dely*fmag/r;
|
fy = dely*fmag/r;
|
||||||
f[i][2] += delz*fmag/r;
|
fz = delz*fmag/r;
|
||||||
if (eflag) eng -= k3 * dr*dr*dr;
|
f[i][0] += fx;
|
||||||
|
f[i][1] += fy;
|
||||||
|
f[i][2] += fz;
|
||||||
|
indenter[0] -= k3 * dr*dr*dr;
|
||||||
|
indenter[1] -= fx;
|
||||||
|
indenter[2] -= fy;
|
||||||
|
indenter[3] -= fz;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eflag) MPI_Allreduce(&eng,&etotal,1,MPI_DOUBLE,MPI_SUM,world);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
@ -265,12 +276,34 @@ void FixIndent::min_post_force(int vflag)
|
|||||||
post_force(vflag);
|
post_force(vflag);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------
|
||||||
|
energy of indenter interaction
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
double FixIndent::thermo(int n)
|
double FixIndent::compute_scalar()
|
||||||
{
|
{
|
||||||
if (n == 0) return etotal;
|
// only sum across procs one time
|
||||||
else return 0.0;
|
|
||||||
|
if (indenter_flag == 0) {
|
||||||
|
MPI_Allreduce(indenter,indenter_all,4,MPI_DOUBLE,MPI_SUM,world);
|
||||||
|
indenter_flag = 1;
|
||||||
|
}
|
||||||
|
return indenter_all[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
components of force on indenter
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double FixIndent::compute_vector(int n)
|
||||||
|
{
|
||||||
|
// only sum across procs one time
|
||||||
|
|
||||||
|
if (indenter_flag == 0) {
|
||||||
|
MPI_Allreduce(indenter,indenter_all,4,MPI_DOUBLE,MPI_SUM,world);
|
||||||
|
indenter_flag = 1;
|
||||||
|
}
|
||||||
|
return indenter_all[n];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
|
|||||||
@ -28,12 +28,15 @@ class FixIndent : public Fix {
|
|||||||
void post_force(int);
|
void post_force(int);
|
||||||
void post_force_respa(int, int, int);
|
void post_force_respa(int, int, int);
|
||||||
void min_post_force(int);
|
void min_post_force(int);
|
||||||
double thermo(int);
|
double compute_scalar();
|
||||||
|
double compute_vector(int);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int istyle,scaleflag,radflag,thermo_flag,eflag_enable;
|
int istyle,scaleflag,radflag,thermo_flag,eflag_enable;
|
||||||
double k,k3,eng,etotal;
|
double k,k3;
|
||||||
double x0,y0,z0,r0_stop,r0_start;
|
double x0,y0,z0,r0_stop,r0_start;
|
||||||
|
int indenter_flag;
|
||||||
|
double indenter[4],indenter_all[4];
|
||||||
int cdim;
|
int cdim;
|
||||||
double c1,c2;
|
double c1,c2;
|
||||||
double vx,vy,vz;
|
double vx,vy,vz;
|
||||||
|
|||||||
@ -46,6 +46,8 @@ FixNPH::FixNPH(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
restart_global = 1;
|
restart_global = 1;
|
||||||
pressure_every = 1;
|
pressure_every = 1;
|
||||||
box_change = 1;
|
box_change = 1;
|
||||||
|
scalar_flag = 1;
|
||||||
|
scalar_vector_freq = 1;
|
||||||
|
|
||||||
double p_period[3];
|
double p_period[3];
|
||||||
if (strcmp(arg[3],"xyz") == 0) {
|
if (strcmp(arg[3],"xyz") == 0) {
|
||||||
@ -306,7 +308,7 @@ void FixNPH::init()
|
|||||||
|
|
||||||
void FixNPH::setup()
|
void FixNPH::setup()
|
||||||
{
|
{
|
||||||
p_target[0] = p_start[0]; // needed by thermo() method
|
p_target[0] = p_start[0]; // used by compute_scalar()
|
||||||
p_target[1] = p_start[1];
|
p_target[1] = p_start[1];
|
||||||
p_target[2] = p_start[2];
|
p_target[2] = p_start[2];
|
||||||
|
|
||||||
@ -767,7 +769,7 @@ int FixNPH::modify_param(int narg, char **arg)
|
|||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
double FixNPH::thermo(int n)
|
double FixNPH::compute_scalar()
|
||||||
{
|
{
|
||||||
double volume;
|
double volume;
|
||||||
if (dimension == 3) volume = domain->xprd * domain->yprd * domain->zprd;
|
if (dimension == 3) volume = domain->xprd * domain->yprd * domain->zprd;
|
||||||
@ -781,6 +783,5 @@ double FixNPH::thermo(int n)
|
|||||||
energy += 0.5*nkt*omega_dot[i]*omega_dot[i] /
|
energy += 0.5*nkt*omega_dot[i]*omega_dot[i] /
|
||||||
(p_freq[i]*p_freq[i]) + p_target[i]*(volume-vol0) / (pdim*nktv2p);
|
(p_freq[i]*p_freq[i]) + p_target[i]*(volume-vol0) / (pdim*nktv2p);
|
||||||
|
|
||||||
if (n == 0) return energy;
|
return energy;
|
||||||
else return 0.0;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,7 +29,7 @@ class FixNPH : public Fix {
|
|||||||
void final_integrate();
|
void final_integrate();
|
||||||
void initial_integrate_respa(int,int);
|
void initial_integrate_respa(int,int);
|
||||||
void final_integrate_respa(int);
|
void final_integrate_respa(int);
|
||||||
double thermo(int);
|
double compute_scalar();
|
||||||
void write_restart(FILE *);
|
void write_restart(FILE *);
|
||||||
void restart(char *);
|
void restart(char *);
|
||||||
int modify_param(int, char **);
|
int modify_param(int, char **);
|
||||||
|
|||||||
@ -45,6 +45,8 @@ FixNPT::FixNPT(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
restart_global = 1;
|
restart_global = 1;
|
||||||
pressure_every = 1;
|
pressure_every = 1;
|
||||||
box_change = 1;
|
box_change = 1;
|
||||||
|
scalar_flag = 1;
|
||||||
|
scalar_vector_freq = 1;
|
||||||
|
|
||||||
t_start = atof(arg[3]);
|
t_start = atof(arg[3]);
|
||||||
t_stop = atof(arg[4]);
|
t_stop = atof(arg[4]);
|
||||||
@ -307,7 +309,7 @@ void FixNPT::init()
|
|||||||
|
|
||||||
void FixNPT::setup()
|
void FixNPT::setup()
|
||||||
{
|
{
|
||||||
t_target = t_start; // used by thermo()
|
t_target = t_start; // used by compute_scalar()
|
||||||
p_target[0] = p_start[0];
|
p_target[0] = p_start[0];
|
||||||
p_target[1] = p_start[1];
|
p_target[1] = p_start[1];
|
||||||
p_target[2] = p_start[2];
|
p_target[2] = p_start[2];
|
||||||
@ -796,7 +798,7 @@ int FixNPT::modify_param(int narg, char **arg)
|
|||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
double FixNPT::thermo(int n)
|
double FixNPT::compute_scalar()
|
||||||
{
|
{
|
||||||
double ke = temperature->dof * boltz * t_target;
|
double ke = temperature->dof * boltz * t_target;
|
||||||
double keplus = atom->natoms * boltz * t_target;
|
double keplus = atom->natoms * boltz * t_target;
|
||||||
@ -812,6 +814,5 @@ double FixNPT::thermo(int n)
|
|||||||
energy += 0.5*keplus*omega_dot[i]*omega_dot[i] /
|
energy += 0.5*keplus*omega_dot[i]*omega_dot[i] /
|
||||||
(p_freq[i]*p_freq[i]) + p_target[i]*(volume-vol0) / (pdim*nktv2p);
|
(p_freq[i]*p_freq[i]) + p_target[i]*(volume-vol0) / (pdim*nktv2p);
|
||||||
|
|
||||||
if (n == 0) return energy;
|
return energy;
|
||||||
else return 0.0;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,7 +29,7 @@ class FixNPT : public Fix {
|
|||||||
virtual void final_integrate();
|
virtual void final_integrate();
|
||||||
void initial_integrate_respa(int, int);
|
void initial_integrate_respa(int, int);
|
||||||
void final_integrate_respa(int);
|
void final_integrate_respa(int);
|
||||||
double thermo(int);
|
double compute_scalar();
|
||||||
void write_restart(FILE *);
|
void write_restart(FILE *);
|
||||||
void restart(char *);
|
void restart(char *);
|
||||||
int modify_param(int, char **);
|
int modify_param(int, char **);
|
||||||
|
|||||||
@ -39,6 +39,8 @@ FixNVT::FixNVT(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
if (narg < 6) error->all("Illegal fix nvt command");
|
if (narg < 6) error->all("Illegal fix nvt command");
|
||||||
|
|
||||||
restart_global = 1;
|
restart_global = 1;
|
||||||
|
scalar_flag = 1;
|
||||||
|
scalar_vector_freq = 1;
|
||||||
|
|
||||||
t_start = atof(arg[3]);
|
t_start = atof(arg[3]);
|
||||||
t_stop = atof(arg[4]);
|
t_stop = atof(arg[4]);
|
||||||
@ -129,7 +131,7 @@ void FixNVT::init()
|
|||||||
|
|
||||||
void FixNVT::setup()
|
void FixNVT::setup()
|
||||||
{
|
{
|
||||||
t_target = t_start; // needed by thermo() method
|
t_target = t_start; // used by compute_scalar()
|
||||||
t_current = temperature->compute_scalar();
|
t_current = temperature->compute_scalar();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -377,11 +379,9 @@ void FixNVT::reset_target(double t_new)
|
|||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
double FixNVT::thermo(int n)
|
double FixNVT::compute_scalar()
|
||||||
{
|
{
|
||||||
double ke = temperature->dof * force->boltz * t_target;
|
double ke = temperature->dof * force->boltz * t_target;
|
||||||
double energy = ke * (eta + 0.5*eta_dot*eta_dot/(t_freq*t_freq));
|
double energy = ke * (eta + 0.5*eta_dot*eta_dot/(t_freq*t_freq));
|
||||||
|
return energy;
|
||||||
if (n == 0) return energy;
|
|
||||||
else return 0.0;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,7 +29,7 @@ class FixNVT : public Fix {
|
|||||||
virtual void final_integrate();
|
virtual void final_integrate();
|
||||||
virtual void initial_integrate_respa(int,int);
|
virtual void initial_integrate_respa(int,int);
|
||||||
void final_integrate_respa(int);
|
void final_integrate_respa(int);
|
||||||
double thermo(int);
|
double compute_scalar();
|
||||||
void write_restart(FILE *);
|
void write_restart(FILE *);
|
||||||
void restart(char *);
|
void restart(char *);
|
||||||
int modify_param(int, char **);
|
int modify_param(int, char **);
|
||||||
|
|||||||
@ -46,6 +46,9 @@ FixOrientFCC::FixOrientFCC(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
|
|
||||||
if (narg != 11) error->all("Illegal fix orient/fcc command");
|
if (narg != 11) error->all("Illegal fix orient/fcc command");
|
||||||
|
|
||||||
|
scalar_flag = 1;
|
||||||
|
scalar_vector_freq = 1;
|
||||||
|
|
||||||
nstats = atoi(arg[3]);
|
nstats = atoi(arg[3]);
|
||||||
direction_of_motion = atoi(arg[4]);
|
direction_of_motion = atoi(arg[4]);
|
||||||
a = atof(arg[5]);
|
a = atof(arg[5]);
|
||||||
@ -194,7 +197,6 @@ void FixOrientFCC::init_list(int id, NeighList *ptr)
|
|||||||
|
|
||||||
void FixOrientFCC::setup()
|
void FixOrientFCC::setup()
|
||||||
{
|
{
|
||||||
eflag_enable = 1;
|
|
||||||
if (strcmp(update->integrate_style,"verlet") == 0)
|
if (strcmp(update->integrate_style,"verlet") == 0)
|
||||||
post_force(1);
|
post_force(1);
|
||||||
else {
|
else {
|
||||||
@ -202,7 +204,6 @@ void FixOrientFCC::setup()
|
|||||||
post_force_respa(1,nlevels_respa-1,0);
|
post_force_respa(1,nlevels_respa-1,0);
|
||||||
((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1);
|
((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1);
|
||||||
}
|
}
|
||||||
eflag_enable = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
@ -211,16 +212,12 @@ void FixOrientFCC::post_force(int vflag)
|
|||||||
{
|
{
|
||||||
int i,j,k,ii,jj,inum,jnum,m,n,nn,nsort,id_self;
|
int i,j,k,ii,jj,inum,jnum,m,n,nn,nsort,id_self;
|
||||||
int *ilist,*jlist,*numneigh,**firstneigh;
|
int *ilist,*jlist,*numneigh,**firstneigh;
|
||||||
double edelta,added_energy,omega;
|
double edelta,omega;
|
||||||
double dx,dy,dz,rsq,xismooth,xi_sq,duxi,duxi_other;
|
double dx,dy,dz,rsq,xismooth,xi_sq,duxi,duxi_other;
|
||||||
double dxi[3];
|
double dxi[3];
|
||||||
double *dxiptr;
|
double *dxiptr;
|
||||||
bool found_myself;
|
bool found_myself;
|
||||||
|
|
||||||
bool eflag = false;
|
|
||||||
if (eflag_enable) eflag = true;
|
|
||||||
else if (output->next_thermo == update->ntimestep) eflag = true;
|
|
||||||
|
|
||||||
// set local ptrs
|
// set local ptrs
|
||||||
|
|
||||||
double **x = atom->x;
|
double **x = atom->x;
|
||||||
@ -246,7 +243,7 @@ void FixOrientFCC::post_force(int vflag)
|
|||||||
// loop over owned atoms and build Nbr data structure of neighbors
|
// loop over owned atoms and build Nbr data structure of neighbors
|
||||||
// use full neighbor list
|
// use full neighbor list
|
||||||
|
|
||||||
if (eflag) added_energy = 0.0;
|
added_energy = 0.0;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int mincount = BIG;
|
int mincount = BIG;
|
||||||
int maxcount = 0;
|
int maxcount = 0;
|
||||||
@ -319,16 +316,16 @@ void FixOrientFCC::post_force(int vflag)
|
|||||||
|
|
||||||
if (xi_total < xi0) {
|
if (xi_total < xi0) {
|
||||||
nbr[i].duxi = 0.0;
|
nbr[i].duxi = 0.0;
|
||||||
if (eflag) edelta = 0.0;
|
edelta = 0.0;
|
||||||
} else if (xi_total > xi1) {
|
} else if (xi_total > xi1) {
|
||||||
nbr[i].duxi = 0.0;
|
nbr[i].duxi = 0.0;
|
||||||
if (eflag) edelta = Vxi;
|
edelta = Vxi;
|
||||||
} else {
|
} else {
|
||||||
omega = (0.5*PI)*(xi_total-xi0) / (xi1-xi0);
|
omega = (0.5*PI)*(xi_total-xi0) / (xi1-xi0);
|
||||||
nbr[i].duxi = PI*Vxi*sin(2.0*omega) / (2.0*(xi1-xi0));
|
nbr[i].duxi = PI*Vxi*sin(2.0*omega) / (2.0*(xi1-xi0));
|
||||||
if (eflag) edelta = Vxi*(1 - cos(2.0*omega)) / 2.0;
|
edelta = Vxi*(1 - cos(2.0*omega)) / 2.0;
|
||||||
}
|
}
|
||||||
if (eflag) added_energy += edelta;
|
added_energy += edelta;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxcount) delete [] sort;
|
if (maxcount) delete [] sort;
|
||||||
@ -391,11 +388,6 @@ void FixOrientFCC::post_force(int vflag)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// sum energy across procs
|
|
||||||
|
|
||||||
if (eflag)
|
|
||||||
MPI_Allreduce(&added_energy,&total_added_e,1,MPI_DOUBLE,MPI_SUM,world);
|
|
||||||
|
|
||||||
// print statistics every nstats timesteps
|
// print statistics every nstats timesteps
|
||||||
|
|
||||||
if (nstats && update->ntimestep % nstats == 0) {
|
if (nstats && update->ntimestep % nstats == 0) {
|
||||||
@ -433,10 +425,10 @@ void FixOrientFCC::post_force_respa(int vflag, int ilevel, int iloop)
|
|||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
double FixOrientFCC::thermo(int n)
|
double FixOrientFCC::compute_scalar()
|
||||||
{
|
{
|
||||||
if (n == 0) return total_added_e;
|
MPI_Allreduce(&added_energy,&total_added_e,1,MPI_DOUBLE,MPI_SUM,world);
|
||||||
else return 0.0;
|
return total_added_e;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|||||||
@ -45,7 +45,7 @@ class FixOrientFCC : public Fix {
|
|||||||
void setup();
|
void setup();
|
||||||
void post_force(int);
|
void post_force(int);
|
||||||
void post_force_respa(int, int, int);
|
void post_force_respa(int, int, int);
|
||||||
double thermo(int);
|
double compute_scalar();
|
||||||
int pack_comm(int, int *, double *, int, int *);
|
int pack_comm(int, int *, double *, int, int *);
|
||||||
void unpack_comm(int, int, double *);
|
void unpack_comm(int, int, double *);
|
||||||
double memory_usage();
|
double memory_usage();
|
||||||
@ -64,9 +64,8 @@ class FixOrientFCC : public Fix {
|
|||||||
char *xifilename, *chifilename; // file names for 2 crystal orientations
|
char *xifilename, *chifilename; // file names for 2 crystal orientations
|
||||||
|
|
||||||
bool use_xismooth;
|
bool use_xismooth;
|
||||||
int eflag_enable;
|
|
||||||
double Rxi[12][3],Rchi[12][3],half_xi_chi_vec[2][6][3];
|
double Rxi[12][3],Rchi[12][3],half_xi_chi_vec[2][6][3];
|
||||||
double xiid,xi0,xi1,xicutoffsq,cutsq,total_added_e;
|
double xiid,xi0,xi1,xicutoffsq,cutsq,added_energy,total_added_e;
|
||||||
int half_fcc_nn,nmax;
|
int half_fcc_nn,nmax;
|
||||||
|
|
||||||
Nbr *nbr;
|
Nbr *nbr;
|
||||||
|
|||||||
@ -28,6 +28,10 @@ FixSetForce::FixSetForce(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
{
|
{
|
||||||
if (narg != 6) error->all("Illegal fix setforce command");
|
if (narg != 6) error->all("Illegal fix setforce command");
|
||||||
|
|
||||||
|
vector_flag = 1;
|
||||||
|
size_vector = 3;
|
||||||
|
scalar_vector_freq = 1;
|
||||||
|
|
||||||
flagx = flagy = flagz = 1;
|
flagx = flagy = flagz = 1;
|
||||||
if (strcmp(arg[3],"NULL") == 0) flagx = 0;
|
if (strcmp(arg[3],"NULL") == 0) flagx = 0;
|
||||||
else xvalue = atof(arg[3]);
|
else xvalue = atof(arg[3]);
|
||||||
@ -86,6 +90,7 @@ void FixSetForce::post_force(int vflag)
|
|||||||
int nlocal = atom->nlocal;
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
foriginal[0] = foriginal[1] = foriginal[2] = 0.0;
|
foriginal[0] = foriginal[1] = foriginal[2] = 0.0;
|
||||||
|
force_flag = 0;
|
||||||
|
|
||||||
for (int i = 0; i < nlocal; i++)
|
for (int i = 0; i < nlocal; i++)
|
||||||
if (mask[i] & groupbit) {
|
if (mask[i] & groupbit) {
|
||||||
@ -111,6 +116,7 @@ void FixSetForce::post_force_respa(int vflag, int ilevel, int iloop)
|
|||||||
int nlocal = atom->nlocal;
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
foriginal[0] = foriginal[1] = foriginal[2] = 0.0;
|
foriginal[0] = foriginal[1] = foriginal[2] = 0.0;
|
||||||
|
force_flag = 0;
|
||||||
|
|
||||||
for (int i = 0; i < nlocal; i++)
|
for (int i = 0; i < nlocal; i++)
|
||||||
if (mask[i] & groupbit) {
|
if (mask[i] & groupbit) {
|
||||||
@ -132,15 +138,16 @@ void FixSetForce::min_post_force(int vflag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
allow setforce values to be printed with thermo output
|
return components of total force on fix group before reset
|
||||||
n = 1,2,3 = components of total force on fix group before reset
|
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
double FixSetForce::thermo(int n)
|
double FixSetForce::compute_vector(int n)
|
||||||
{
|
{
|
||||||
if (n >= 1 && n <= 3) {
|
// only sum across procs one time
|
||||||
double ftotal;
|
|
||||||
MPI_Allreduce(&foriginal[n-1],&ftotal,1,MPI_DOUBLE,MPI_SUM,world);
|
if (force_flag == 0) {
|
||||||
return ftotal;
|
MPI_Allreduce(foriginal,foriginal_all,3,MPI_DOUBLE,MPI_SUM,world);
|
||||||
} else return 0.0;
|
force_flag = 1;
|
||||||
|
}
|
||||||
|
return foriginal_all[n];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,12 +28,13 @@ class FixSetForce : public Fix {
|
|||||||
void post_force(int);
|
void post_force(int);
|
||||||
void post_force_respa(int, int, int);
|
void post_force_respa(int, int, int);
|
||||||
void min_post_force(int);
|
void min_post_force(int);
|
||||||
double thermo(int);
|
double compute_vector(int);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int flagx,flagy,flagz;
|
int flagx,flagy,flagz;
|
||||||
double xvalue,yvalue,zvalue;
|
double xvalue,yvalue,zvalue;
|
||||||
double foriginal[3];
|
double foriginal[3],foriginal_all[3];
|
||||||
|
int force_flag;
|
||||||
int nlevels_respa;
|
int nlevels_respa;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -36,9 +36,13 @@ FixTempRescale::FixTempRescale(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
Fix(lmp, narg, arg)
|
Fix(lmp, narg, arg)
|
||||||
{
|
{
|
||||||
if (narg < 8) error->all("Illegal fix temp/rescale command");
|
if (narg < 8) error->all("Illegal fix temp/rescale command");
|
||||||
|
|
||||||
nevery = atoi(arg[3]);
|
nevery = atoi(arg[3]);
|
||||||
if (nevery <= 0) error->all("Illegal fix temp/rescale command");
|
if (nevery <= 0) error->all("Illegal fix temp/rescale command");
|
||||||
|
|
||||||
|
scalar_flag = 1;
|
||||||
|
scalar_vector_freq = nevery;
|
||||||
|
|
||||||
t_start = atof(arg[4]);
|
t_start = atof(arg[4]);
|
||||||
t_end = atof(arg[5]);
|
t_end = atof(arg[5]);
|
||||||
t_window = atof(arg[6]);
|
t_window = atof(arg[6]);
|
||||||
@ -223,8 +227,7 @@ int FixTempRescale::modify_param(int narg, char **arg)
|
|||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
double FixTempRescale::thermo(int n)
|
double FixTempRescale::compute_scalar()
|
||||||
{
|
{
|
||||||
if (n == 0) return energy;
|
return energy;
|
||||||
else return 0.0;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,7 +25,7 @@ class FixTempRescale : public Fix {
|
|||||||
int setmask();
|
int setmask();
|
||||||
void init();
|
void init();
|
||||||
void end_of_step();
|
void end_of_step();
|
||||||
double thermo(int);
|
double compute_scalar();
|
||||||
int modify_param(int, char **);
|
int modify_param(int, char **);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@ -35,6 +35,11 @@ FixWallLJ126::FixWallLJ126(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
{
|
{
|
||||||
if (narg != 8) error->all("Illegal fix wall/lj126 command");
|
if (narg != 8) error->all("Illegal fix wall/lj126 command");
|
||||||
|
|
||||||
|
scalar_flag = 1;
|
||||||
|
vector_flag = 1;
|
||||||
|
size_vector = 3;
|
||||||
|
scalar_vector_freq = 1;
|
||||||
|
|
||||||
if (strcmp(arg[3],"xlo") == 0) {
|
if (strcmp(arg[3],"xlo") == 0) {
|
||||||
dim = 0;
|
dim = 0;
|
||||||
side = -1;
|
side = -1;
|
||||||
@ -101,7 +106,6 @@ void FixWallLJ126::init()
|
|||||||
|
|
||||||
void FixWallLJ126::setup()
|
void FixWallLJ126::setup()
|
||||||
{
|
{
|
||||||
eflag_enable = 1;
|
|
||||||
if (strcmp(update->integrate_style,"verlet") == 0)
|
if (strcmp(update->integrate_style,"verlet") == 0)
|
||||||
post_force(1);
|
post_force(1);
|
||||||
else {
|
else {
|
||||||
@ -109,14 +113,12 @@ void FixWallLJ126::setup()
|
|||||||
post_force_respa(1,nlevels_respa-1,0);
|
post_force_respa(1,nlevels_respa-1,0);
|
||||||
((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1);
|
((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1);
|
||||||
}
|
}
|
||||||
eflag_enable = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
void FixWallLJ126::min_setup()
|
void FixWallLJ126::min_setup()
|
||||||
{
|
{
|
||||||
eflag_enable = 1;
|
|
||||||
post_force(1);
|
post_force(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,17 +126,14 @@ void FixWallLJ126::min_setup()
|
|||||||
|
|
||||||
void FixWallLJ126::post_force(int vflag)
|
void FixWallLJ126::post_force(int vflag)
|
||||||
{
|
{
|
||||||
bool eflag = false;
|
|
||||||
if (eflag_enable) eflag = true;
|
|
||||||
else if (output->next_thermo == update->ntimestep) eflag = true;
|
|
||||||
|
|
||||||
double **x = atom->x;
|
double **x = atom->x;
|
||||||
double **f = atom->f;
|
double **f = atom->f;
|
||||||
int *mask = atom->mask;
|
int *mask = atom->mask;
|
||||||
int nlocal = atom->nlocal;
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
double delta,rinv,r2inv,r6inv,eng;
|
double delta,rinv,r2inv,r6inv,fwall;
|
||||||
if (eflag) eng = 0.0;
|
wall[0] = wall[1] = wall[2] = wall[3] = 0.0;
|
||||||
|
wall_flag = 0;
|
||||||
|
|
||||||
for (int i = 0; i < nlocal; i++)
|
for (int i = 0; i < nlocal; i++)
|
||||||
if (mask[i] & groupbit) {
|
if (mask[i] & groupbit) {
|
||||||
@ -145,11 +144,11 @@ void FixWallLJ126::post_force(int vflag)
|
|||||||
rinv = 1.0/delta;
|
rinv = 1.0/delta;
|
||||||
r2inv = rinv*rinv;
|
r2inv = rinv*rinv;
|
||||||
r6inv = r2inv*r2inv*r2inv;
|
r6inv = r2inv*r2inv*r2inv;
|
||||||
f[i][dim] -= r6inv*(coeff1*r6inv - coeff2) * side;
|
fwall = r6inv*(coeff1*r6inv - coeff2) * side;
|
||||||
if (eflag) eng += r6inv*(coeff3*r6inv - coeff4) - offset;
|
f[i][dim] -= fwall;
|
||||||
|
wall[0] += r6inv*(coeff3*r6inv - coeff4) - offset;
|
||||||
|
wall[dim] += fwall;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eflag) MPI_Allreduce(&eng,&etotal,1,MPI_DOUBLE,MPI_SUM,world);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
@ -166,10 +165,32 @@ void FixWallLJ126::min_post_force(int vflag)
|
|||||||
post_force(vflag);
|
post_force(vflag);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------
|
||||||
|
energy of wall interaction
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
double FixWallLJ126::thermo(int n)
|
double FixWallLJ126::compute_scalar()
|
||||||
{
|
{
|
||||||
if (n == 0) return etotal;
|
// only sum across procs one time
|
||||||
else return 0.0;
|
|
||||||
|
if (wall_flag == 0) {
|
||||||
|
MPI_Allreduce(wall,wall_all,4,MPI_DOUBLE,MPI_SUM,world);
|
||||||
|
wall_flag = 1;
|
||||||
|
}
|
||||||
|
return wall_all[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
components of force on wall
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double FixWallLJ126::compute_vector(int n)
|
||||||
|
{
|
||||||
|
// only sum across procs one time
|
||||||
|
|
||||||
|
if (wall_flag == 0) {
|
||||||
|
MPI_Allreduce(wall,wall_all,4,MPI_DOUBLE,MPI_SUM,world);
|
||||||
|
wall_flag = 1;
|
||||||
|
}
|
||||||
|
return wall_all[n];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,13 +28,15 @@ class FixWallLJ126 : public Fix {
|
|||||||
void post_force(int);
|
void post_force(int);
|
||||||
void post_force_respa(int, int, int);
|
void post_force_respa(int, int, int);
|
||||||
void min_post_force(int);
|
void min_post_force(int);
|
||||||
double thermo(int);
|
double compute_scalar();
|
||||||
|
double compute_vector(int);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int dim,side,thermo_flag,eflag_enable;
|
int dim,side,thermo_flag,eflag_enable;
|
||||||
double coord,epsilon,sigma,cutoff;
|
double coord,epsilon,sigma,cutoff;
|
||||||
double coeff1,coeff2,coeff3,coeff4,offset;
|
double coeff1,coeff2,coeff3,coeff4,offset;
|
||||||
double etotal;
|
double wall[4],wall_all[4];
|
||||||
|
int wall_flag;
|
||||||
int nlevels_respa;
|
int nlevels_respa;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -31,6 +31,11 @@ FixWallLJ93::FixWallLJ93(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
{
|
{
|
||||||
if (narg != 8) error->all("Illegal fix wall/lj93 command");
|
if (narg != 8) error->all("Illegal fix wall/lj93 command");
|
||||||
|
|
||||||
|
scalar_flag = 1;
|
||||||
|
vector_flag = 1;
|
||||||
|
size_vector = 3;
|
||||||
|
scalar_vector_freq = 1;
|
||||||
|
|
||||||
if (strcmp(arg[3],"xlo") == 0) {
|
if (strcmp(arg[3],"xlo") == 0) {
|
||||||
dim = 0;
|
dim = 0;
|
||||||
side = -1;
|
side = -1;
|
||||||
@ -98,7 +103,6 @@ void FixWallLJ93::init()
|
|||||||
|
|
||||||
void FixWallLJ93::setup()
|
void FixWallLJ93::setup()
|
||||||
{
|
{
|
||||||
eflag_enable = 1;
|
|
||||||
if (strcmp(update->integrate_style,"verlet") == 0)
|
if (strcmp(update->integrate_style,"verlet") == 0)
|
||||||
post_force(1);
|
post_force(1);
|
||||||
else {
|
else {
|
||||||
@ -106,14 +110,12 @@ void FixWallLJ93::setup()
|
|||||||
post_force_respa(1,nlevels_respa-1,0);
|
post_force_respa(1,nlevels_respa-1,0);
|
||||||
((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1);
|
((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1);
|
||||||
}
|
}
|
||||||
eflag_enable = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
void FixWallLJ93::min_setup()
|
void FixWallLJ93::min_setup()
|
||||||
{
|
{
|
||||||
eflag_enable = 1;
|
|
||||||
post_force(1);
|
post_force(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,17 +123,14 @@ void FixWallLJ93::min_setup()
|
|||||||
|
|
||||||
void FixWallLJ93::post_force(int vflag)
|
void FixWallLJ93::post_force(int vflag)
|
||||||
{
|
{
|
||||||
bool eflag = false;
|
|
||||||
if (eflag_enable) eflag = true;
|
|
||||||
else if (output->next_thermo == update->ntimestep) eflag = true;
|
|
||||||
|
|
||||||
double **x = atom->x;
|
double **x = atom->x;
|
||||||
double **f = atom->f;
|
double **f = atom->f;
|
||||||
int *mask = atom->mask;
|
int *mask = atom->mask;
|
||||||
int nlocal = atom->nlocal;
|
int nlocal = atom->nlocal;
|
||||||
|
|
||||||
double delta,rinv,r2inv,r4inv,r10inv,eng;
|
double delta,rinv,r2inv,r4inv,r10inv,fwall;
|
||||||
if (eflag) eng = 0.0;
|
wall[0] = wall[1] = wall[2] = wall[3] = 0.0;
|
||||||
|
wall_flag = 0;
|
||||||
|
|
||||||
for (int i = 0; i < nlocal; i++)
|
for (int i = 0; i < nlocal; i++)
|
||||||
if (mask[i] & groupbit) {
|
if (mask[i] & groupbit) {
|
||||||
@ -143,11 +142,11 @@ void FixWallLJ93::post_force(int vflag)
|
|||||||
r2inv = rinv*rinv;
|
r2inv = rinv*rinv;
|
||||||
r4inv = r2inv*r2inv;
|
r4inv = r2inv*r2inv;
|
||||||
r10inv = r4inv*r4inv*r2inv;
|
r10inv = r4inv*r4inv*r2inv;
|
||||||
f[i][dim] -= (coeff1*r10inv - coeff2*r4inv) * side;
|
fwall = (coeff1*r10inv - coeff2*r4inv) * side;
|
||||||
if (eflag) eng += coeff3*r4inv*r4inv*rinv - coeff4*r2inv*rinv - offset;
|
f[i][dim] -= fwall;
|
||||||
|
wall[0] += coeff3*r4inv*r4inv*rinv - coeff4*r2inv*rinv - offset;
|
||||||
|
wall[dim] += fwall;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eflag) MPI_Allreduce(&eng,&etotal,1,MPI_DOUBLE,MPI_SUM,world);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
@ -164,10 +163,34 @@ void FixWallLJ93::min_post_force(int vflag)
|
|||||||
post_force(vflag);
|
post_force(vflag);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------
|
||||||
|
energy of wall interaction
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
double FixWallLJ93::thermo(int n)
|
double FixWallLJ93::compute_scalar()
|
||||||
{
|
{
|
||||||
if (n == 0) return etotal;
|
// only sum across procs one time
|
||||||
else return 0.0;
|
|
||||||
|
if (wall_flag == 0) {
|
||||||
|
MPI_Allreduce(wall,wall_all,4,MPI_DOUBLE,MPI_SUM,world);
|
||||||
|
wall_flag = 1;
|
||||||
}
|
}
|
||||||
|
return wall_all[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
components of force on wall
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double FixWallLJ93::compute_vector(int n)
|
||||||
|
{
|
||||||
|
// only sum across procs one time
|
||||||
|
|
||||||
|
if (wall_flag == 0) {
|
||||||
|
MPI_Allreduce(wall,wall_all,4,MPI_DOUBLE,MPI_SUM,world);
|
||||||
|
wall_flag = 1;
|
||||||
|
}
|
||||||
|
return wall_all[n];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -29,13 +29,15 @@ class FixWallLJ93 : public Fix {
|
|||||||
void post_force(int);
|
void post_force(int);
|
||||||
void post_force_respa(int, int, int);
|
void post_force_respa(int, int, int);
|
||||||
void min_post_force(int);
|
void min_post_force(int);
|
||||||
double thermo(int);
|
double compute_scalar();
|
||||||
|
double compute_vector(int);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int dim,side,thermo_flag,eflag_enable;
|
int dim,side,thermo_flag,eflag_enable;
|
||||||
double coord,epsilon,sigma,cutoff;
|
double coord,epsilon,sigma,cutoff;
|
||||||
double coeff1,coeff2,coeff3,coeff4,offset;
|
double coeff1,coeff2,coeff3,coeff4,offset;
|
||||||
double etotal;
|
double wall[4],wall_all[4];
|
||||||
|
int wall_flag;
|
||||||
int nlevels_respa;
|
int nlevels_respa;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -235,14 +235,14 @@ void Modify::end_of_step()
|
|||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
thermo energy call only for relevant fixes
|
thermo energy call only for relevant fixes
|
||||||
called by Thermo class
|
called by Thermo class
|
||||||
arg to Fix thermo() is 0, so fix will return its energy contribution
|
compute_scalar() is fix call to return energy
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
double Modify::thermo_energy()
|
double Modify::thermo_energy()
|
||||||
{
|
{
|
||||||
double energy = 0.0;
|
double energy = 0.0;
|
||||||
for (int i = 0; i < n_thermo_energy; i++)
|
for (int i = 0; i < n_thermo_energy; i++)
|
||||||
energy += fix[list_thermo_energy[i]]->thermo(0);
|
energy += fix[list_thermo_energy[i]]->compute_scalar();
|
||||||
return energy;
|
return energy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -793,12 +793,20 @@ void Thermo::parse_fields(char *str)
|
|||||||
for (int ic = 0; ic < modify->compute[n]->npre; ic++)
|
for (int ic = 0; ic < modify->compute[n]->npre; ic++)
|
||||||
int tmp = add_compute(modify->compute[n]->id_pre[ic],
|
int tmp = add_compute(modify->compute[n]->id_pre[ic],
|
||||||
arg_object[nfield]);
|
arg_object[nfield]);
|
||||||
|
|
||||||
field2object[nfield] = add_compute(id,arg_object[nfield]);
|
field2object[nfield] = add_compute(id,arg_object[nfield]);
|
||||||
addfield(copy,&Thermo::compute_compute,FLOAT);
|
addfield(copy,&Thermo::compute_compute,FLOAT);
|
||||||
|
|
||||||
} else if (word[0] == 'f') {
|
} else if (word[0] == 'f') {
|
||||||
n = modify->find_fix(id);
|
n = modify->find_fix(id);
|
||||||
if (n < 0) error->all("Could not find thermo custom fix ID");
|
if (n < 0) error->all("Could not find thermo custom fix ID");
|
||||||
|
if (arg_object[nfield] == 0 && modify->fix[n]->scalar_flag == 0)
|
||||||
|
error->all("Thermo fix ID does not compute scalar info");
|
||||||
|
if (arg_object[nfield] > 0 && modify->fix[n]->vector_flag == 0)
|
||||||
|
error->all("Thermo fix ID does not compute vector info");
|
||||||
|
if (arg_object[nfield] > 0 &&
|
||||||
|
arg_object[nfield] > modify->fix[n]->size_vector)
|
||||||
|
error->all("Thermo fix ID vector is not large enough");
|
||||||
field2object[nfield] = add_fix(id);
|
field2object[nfield] = add_fix(id);
|
||||||
addfield(copy,&Thermo::compute_fix,FLOAT);
|
addfield(copy,&Thermo::compute_fix,FLOAT);
|
||||||
|
|
||||||
@ -1027,7 +1035,8 @@ void Thermo::compute_compute()
|
|||||||
void Thermo::compute_fix()
|
void Thermo::compute_fix()
|
||||||
{
|
{
|
||||||
int index = field2object[ifield];
|
int index = field2object[ifield];
|
||||||
dvalue = fixes[index]->thermo(arg_object[ifield]);
|
if (arg_object[ifield] == 0) dvalue = fixes[index]->compute_scalar();
|
||||||
|
else dvalue = fixes[index]->compute_vector(arg_object[ifield]-1);
|
||||||
if (normflag) dvalue /= natoms;
|
if (normflag) dvalue /= natoms;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -24,6 +24,7 @@
|
|||||||
#include "domain.h"
|
#include "domain.h"
|
||||||
#include "modify.h"
|
#include "modify.h"
|
||||||
#include "compute.h"
|
#include "compute.h"
|
||||||
|
#include "fix.h"
|
||||||
#include "output.h"
|
#include "output.h"
|
||||||
#include "thermo.h"
|
#include "thermo.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
@ -407,6 +408,7 @@ void Variable::copy(int narg, char **from, char **to)
|
|||||||
group function = mass(group), xcm(group,x), ...
|
group function = mass(group), xcm(group,x), ...
|
||||||
atom vector = x[123], y[3], vx[34], ...
|
atom vector = x[123], y[3], vx[34], ...
|
||||||
compute vector = c_mytemp[0], c_thermo_press[3], ...
|
compute vector = c_mytemp[0], c_thermo_press[3], ...
|
||||||
|
fix vector = f_indent[0], f_setforce[3], ...
|
||||||
numbers start with a digit or "." or "-" (no parens or brackets)
|
numbers start with a digit or "." or "-" (no parens or brackets)
|
||||||
keywords start with a lowercase letter (no parens or brackets)
|
keywords start with a lowercase letter (no parens or brackets)
|
||||||
functions contain ()
|
functions contain ()
|
||||||
@ -414,7 +416,7 @@ void Variable::copy(int narg, char **from, char **to)
|
|||||||
vectors contain []
|
vectors contain []
|
||||||
single arg must be integer
|
single arg must be integer
|
||||||
for atom vectors, arg is global ID of atom
|
for atom vectors, arg is global ID of atom
|
||||||
for compute vectors, 0 is the scalar value, 1-N are vector values
|
for compute/fix vectors, 0 is the scalar value, 1-N are vector values
|
||||||
see lists of valid functions & vectors below
|
see lists of valid functions & vectors below
|
||||||
return answer = value of string
|
return answer = value of string
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
@ -662,6 +664,8 @@ double Variable::evaluate(char *str, Tree *tree)
|
|||||||
// index = everything between [] evaluated as integer
|
// index = everything between [] evaluated as integer
|
||||||
// if vector name starts with "c_", trailing chars are compute ID
|
// if vector name starts with "c_", trailing chars are compute ID
|
||||||
// check if compute ID exists, invoke it with index as arg
|
// check if compute ID exists, invoke it with index as arg
|
||||||
|
// if vector name starts with "cf_", trailing chars are fix ID
|
||||||
|
// check if fix ID exists, call its scalar or vector fn with index as arg
|
||||||
// else is atom vector
|
// else is atom vector
|
||||||
// find which proc owns atom via atom->map()
|
// find which proc owns atom via atom->map()
|
||||||
// grab atom-based value with index as global atom ID
|
// grab atom-based value with index as global atom ID
|
||||||
@ -696,7 +700,7 @@ double Variable::evaluate(char *str, Tree *tree)
|
|||||||
delete [] id;
|
delete [] id;
|
||||||
modify->compute[icompute]->init();
|
modify->compute[icompute]->init();
|
||||||
|
|
||||||
// call compute() if index = 0, else compute_vector()
|
// call compute_scalar() if index = 0, else compute_vector()
|
||||||
// make pre-call to Compute object's pre-compute(s) if defined
|
// make pre-call to Compute object's pre-compute(s) if defined
|
||||||
|
|
||||||
int index = atoi(arg);
|
int index = atoi(arg);
|
||||||
@ -713,7 +717,7 @@ double Variable::evaluate(char *str, Tree *tree)
|
|||||||
answer = modify->compute[icompute]->compute_scalar();
|
answer = modify->compute[icompute]->compute_scalar();
|
||||||
} else if (index > 0) {
|
} else if (index > 0) {
|
||||||
if (modify->compute[icompute]->vector_flag == 0)
|
if (modify->compute[icompute]->vector_flag == 0)
|
||||||
error->all("Variable compute ID does not compute scalar info");
|
error->all("Variable compute ID does not compute vector info");
|
||||||
if (index > modify->compute[icompute]->size_vector)
|
if (index > modify->compute[icompute]->size_vector)
|
||||||
error->all("Variable compute ID vector is not large enough");
|
error->all("Variable compute ID vector is not large enough");
|
||||||
if (modify->compute[icompute]->npre)
|
if (modify->compute[icompute]->npre)
|
||||||
@ -727,6 +731,33 @@ double Variable::evaluate(char *str, Tree *tree)
|
|||||||
answer = modify->compute[icompute]->vector[index-1];
|
answer = modify->compute[icompute]->vector[index-1];
|
||||||
} else error->all("Invalid compute ID index in variable");
|
} else error->all("Invalid compute ID index in variable");
|
||||||
|
|
||||||
|
} else if (strncmp(vector,"f_",2) == 0) {
|
||||||
|
n = strlen(vector) - 2 + 1;
|
||||||
|
char *id = new char[n];
|
||||||
|
strcpy(id,&vector[2]);
|
||||||
|
|
||||||
|
int ifix;
|
||||||
|
for (ifix = 0; ifix < modify->nfix; ifix++)
|
||||||
|
if (strcmp(id,modify->fix[ifix]->id) == 0) break;
|
||||||
|
if (ifix == modify->nfix)
|
||||||
|
error->all("Invalid fix ID in variable");
|
||||||
|
delete [] id;
|
||||||
|
|
||||||
|
// call compute_scalar() if index = 0, else compute_vector()
|
||||||
|
|
||||||
|
int index = atoi(arg);
|
||||||
|
if (index == 0) {
|
||||||
|
if (modify->fix[ifix]->scalar_flag == 0)
|
||||||
|
error->all("Variable fix ID does not compute scalar info");
|
||||||
|
answer = modify->fix[ifix]->compute_scalar();
|
||||||
|
} else if (index > 0) {
|
||||||
|
if (modify->fix[ifix]->vector_flag == 0)
|
||||||
|
error->all("Variable fix ID does not compute vector info");
|
||||||
|
if (index > modify->fix[ifix]->size_vector)
|
||||||
|
error->all("Variable fix ID vector is not large enough");
|
||||||
|
answer = modify->fix[ifix]->compute_vector(index-1);
|
||||||
|
} else error->all("Invalid fix ID index in variable");
|
||||||
|
|
||||||
} else if (tree) {
|
} else if (tree) {
|
||||||
|
|
||||||
if (strlen(arg)) error->all("Invalid atom vector in variable");
|
if (strlen(arg)) error->all("Invalid atom vector in variable");
|
||||||
|
|||||||
Reference in New Issue
Block a user