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

This commit is contained in:
sjplimp 2013-04-23 19:03:43 +00:00
parent effd06c945
commit 313bbf774b
2 changed files with 87 additions and 13 deletions

View File

@ -300,7 +300,7 @@ FixColvars::FixColvars(LAMMPS *lmp, int narg, char **arg) :
if (atom->rmass_flag)
error->all(FLERR,"Cannot use fix colvars for atoms with rmass attribute");
if (instances)
if (instances > 0)
error->all(FLERR,"Only one fix colvars can be active at a time");
++instances;
@ -313,6 +313,7 @@ FixColvars::FixColvars(LAMMPS *lmp, int narg, char **arg) :
conf_file = strdup(arg[3]);
rng_seed = 1966;
unwrap_flag = 0;
inp_name = NULL;
out_name = NULL;
@ -327,6 +328,14 @@ FixColvars::FixColvars(LAMMPS *lmp, int narg, char **arg) :
out_name = strdup(arg[argsdone+1]);
} else if (0 == strcmp(arg[argsdone], "seed")) {
rng_seed = atoi(arg[argsdone+1]);
} else if (0 == strcmp(arg[argsdone], "unwrap")) {
if (0 == strcmp(arg[argsdone+1], "yes")) {
unwrap_flag = 1;
} else if (0 == strcmp(arg[argsdone+1], "no")) {
unwrap_flag = 0;
} else {
error->all(FLERR,"Incorrect fix colvars unwrap flag");
}
} else if (0 == strcmp(arg[argsdone], "tstat")) {
tmp_name = strdup(arg[argsdone+1]);
} else {
@ -538,6 +547,14 @@ void FixColvars::init()
memory->create(comm_buf,nmax,"colvars:comm_buf");
const double * const * const x = atom->x;
const tagint * const image = atom->image;
const double xprd = domain->xprd;
const double yprd = domain->yprd;
const double zprd = domain->zprd;
const double xy = domain->xy;
const double xz = domain->xz;
const double yz = domain->yz;
if (me == 0) {
@ -549,12 +566,24 @@ void FixColvars::init()
for (i=0; i<num_coords; ++i) {
const int k = atom->map(taglist[i]);
if ((k >= 0) && (k < nlocal)) {
of[i].tag = cd[i].tag = tag[k];
of[i].type = cd[i].type = type[k];
cd[i].x = x[k][0];
cd[i].y = x[k][1];
cd[i].z = x[k][2];
of[i].x = of[i].y = of[i].z = 0.0;
if (unwrap_flag) {
const int ix = (image[k] & IMGMASK) - IMGMAX;
const int iy = (image[k] >> IMGBITS & IMGMASK) - IMGMAX;
const int iz = (image[k] >> IMG2BITS) - IMGMAX;
cd[i].x = x[k][0] + ix * xprd + iy * xy + iz * xz;
cd[i].y = x[k][1] + iy * yprd + iz * yz;
cd[i].z = x[k][2] + iz * zprd;
} else {
cd[i].x = x[k][0];
cd[i].y = x[k][1];
cd[i].z = x[k][2];
}
}
}
@ -588,11 +617,24 @@ void FixColvars::init()
for (i=0; i<num_coords; ++i) {
const int k = atom->map(taglist[i]);
if ((k >= 0) && (k < nlocal)) {
comm_buf[nme].tag = tag[k];
comm_buf[nme].type = type[k];
comm_buf[nme].x = x[k][0];
comm_buf[nme].y = x[k][1];
comm_buf[nme].z = x[k][2];
if (unwrap_flag) {
const int ix = (image[k] & IMGMASK) - IMGMAX;
const int iy = (image[k] >> IMGBITS & IMGMASK) - IMGMAX;
const int iz = (image[k] >> IMG2BITS) - IMGMAX;
comm_buf[nme].x = x[k][0] + ix * xprd + iy * xy + iz * xz;
comm_buf[nme].y = x[k][1] + iy * yprd + iz * yz;
comm_buf[nme].z = x[k][2] + iz * zprd;
} else {
comm_buf[nme].x = x[k][0];
comm_buf[nme].y = x[k][1];
comm_buf[nme].z = x[k][2];
}
++nme;
}
}
@ -643,6 +685,14 @@ void FixColvars::post_force(int vflag)
const int * const tag = atom->tag;
const double * const * const x = atom->x;
double * const * const f = atom->f;
const tagint * const image = atom->image;
const double xprd = domain->xprd;
const double yprd = domain->yprd;
const double zprd = domain->zprd;
const double xy = domain->xy;
const double xz = domain->xz;
const double yz = domain->yz;
const int nlocal = atom->nlocal;
/* check and potentially grow local communication buffers. */
@ -671,9 +721,20 @@ void FixColvars::post_force(int vflag)
for (i=0; i<num_coords; ++i) {
const int k = atom->map(taglist[i]);
if ((k >= 0) && (k < nlocal)) {
cd[i].x = x[k][0];
cd[i].y = x[k][1];
cd[i].z = x[k][2];
if (unwrap_flag) {
const int ix = (image[k] & IMGMASK) - IMGMAX;
const int iy = (image[k] >> IMGBITS & IMGMASK) - IMGMAX;
const int iz = (image[k] >> IMG2BITS) - IMGMAX;
cd[i].x = x[k][0] + ix * xprd + iy * xy + iz * xz;
cd[i].y = x[k][1] + iy * yprd + iz * yz;
cd[i].z = x[k][2] + iz * zprd;
} else {
cd[i].x = x[k][0];
cd[i].y = x[k][1];
cd[i].z = x[k][2];
}
}
}
@ -703,9 +764,21 @@ void FixColvars::post_force(int vflag)
const int k = atom->map(taglist[i]);
if ((k >= 0) && (k < nlocal)) {
comm_buf[nme].tag = tag[k];
comm_buf[nme].x = x[k][0];
comm_buf[nme].y = x[k][1];
comm_buf[nme].z = x[k][2];
if (unwrap_flag) {
const int ix = (image[k] & IMGMASK) - IMGMAX;
const int iy = (image[k] >> IMGBITS & IMGMASK) - IMGMAX;
const int iz = (image[k] >> IMG2BITS) - IMGMAX;
comm_buf[nme].x = x[k][0] + ix * xprd + iy * xy + iz * xz;
comm_buf[nme].y = x[k][1] + iy * yprd + iz * yz;
comm_buf[nme].z = x[k][2] + iz * zprd;
} else {
comm_buf[nme].x = x[k][0];
comm_buf[nme].y = x[k][1];
comm_buf[nme].z = x[k][2];
}
++nme;
}
}

View File

@ -80,6 +80,7 @@ class FixColvars : public Fix {
int nlevels_respa; // flag to determine respa levels.
int store_forces; // flag to determine whether to store total forces
int unwrap_flag; // 1 if atom coords are unwrapped, 0 if not
static int instances; // count fix instances, since colvars currently
// only supports one instance at a time
};