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

This commit is contained in:
sjplimp 2015-03-31 23:50:13 +00:00
parent e8bd5c5bf9
commit bb28465783
5 changed files with 85 additions and 92 deletions

View File

@ -548,12 +548,9 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) :
MINUSPI = -MY_PI;
TWOPI = 2.0*MY_PI;
// if infile set, only setup rigid bodies once, using info from file
// this means users cannot change atom properties like mass between runs
// if they do, bodies will not reflect the changes
// wait to setup bodies until first init() using current atom properties
staticflag = 0;
if (infile) setup_bodies_static();
setupflag = 0;
// print statistics
@ -670,10 +667,17 @@ void FixRigid::init()
step_respa = ((Respa *) update->integrate)->step;
// setup rigid bodies, using current atom info
// allows resetting of atom properties like mass between runs
// only do this if not using an infile, else was called in constructor
// only do initialization once, b/c properties may not be re-computable
// especially if overlapping particles
// do not do dynamic init if read body properties from infile
// this is b/c the infile defines the static and dynamic properties
// and may not be computable if contain overlapping particles
// setup_bodies_static() reads infile itself
if (!infile) setup_bodies_static();
if (!setupflag) {
setup_bodies_static();
if (!infile) setup_bodies_dynamic();
}
// temperature scale factor
@ -709,7 +713,6 @@ void FixRigid::setup(int vflag)
// so angmom_to_omega() and set_v() below will set per-atom vels correctly
// re-calling it every run allows reset of body/atom velocities between runs
setup_bodies_dynamic();
// fcm = force on center-of-mass of each rigid body
@ -1085,7 +1088,7 @@ int FixRigid::dof(int tgroup)
{
// cannot count DOF correctly unless setup_bodies_static() has been called
if (!staticflag) {
if (!setupflag) {
if (comm->me == 0)
error->warning(FLERR,"Cannot count rigid body degrees-of-freedom "
"before bodies are initialized");
@ -1494,12 +1497,11 @@ void FixRigid::set_v()
}
/* ----------------------------------------------------------------------
initialization of static rigid body attributes
called from init() so body/atom properties can be changed between runs
unless reading from infile, in which case called once from constructor
one-time initialization of static rigid body attributes
sets extended flags, masstotal, center-of-mass
sets Cartesian and diagonalized inertia tensor
sets body image flags, but only on first call
sets body image flags
may read some properties from infile
------------------------------------------------------------------------- */
void FixRigid::setup_bodies_static()
@ -1585,14 +1587,12 @@ void FixRigid::setup_bodies_static()
}
}
// first-time setting of body xcmimage flags = true image flags
// set body xcmimage flags = true image flags
if (!staticflag) {
imageint *image = atom->image;
for (i = 0; i < nlocal; i++)
if (body[i] >= 0) xcmimage[i] = image[i];
else xcmimage[i] = 0;
}
imageint *image = atom->image;
for (i = 0; i < nlocal; i++)
if (body[i] >= 0) xcmimage[i] = image[i];
else xcmimage[i] = 0;
// compute masstotal & center-of-mass of each rigid body
// error if image flag is not 0 in a non-periodic dim
@ -1662,16 +1662,13 @@ void FixRigid::setup_bodies_static()
readfile(0,masstotal,xcm,inbody);
}
// one-time set of rigid body image flags to default values
// staticflag insures this is only done once, not on successive runs
// set rigid body image flags to default values
// then remap the xcm of each body back into simulation box
// and reset body xcmimage flags via pre_neighbor()
// and reset body and atom xcmimage flags via pre_neighbor()
if (!staticflag) {
for (ibody = 0; ibody < nbody; ibody++)
imagebody[ibody] = ((imageint) IMGMAX << IMG2BITS) |
((imageint) IMGMAX << IMGBITS) | IMGMAX;
}
for (ibody = 0; ibody < nbody; ibody++)
imagebody[ibody] = ((imageint) IMGMAX << IMG2BITS) |
((imageint) IMGMAX << IMGBITS) | IMGMAX;
pre_neighbor();
@ -2004,19 +2001,12 @@ void FixRigid::setup_bodies_static()
}
if (infile) memory->destroy(inbody);
// static properties have now been initialized once
// used to prevent re-initialization which would re-read infile
staticflag = 1;
}
/* ----------------------------------------------------------------------
initialization of dynamic rigid body attributes
one-time initialization of dynamic rigid body attributes
set vcm and angmom, computed explicitly from constituent particles
OK if wrong for overlapping particles,
since is just setting vcm/angmom at start of run,
which can be estimated value
not done if body properites read from file, e.g. for overlapping particles
------------------------------------------------------------------------- */
void FixRigid::setup_bodies_dynamic()

View File

@ -68,7 +68,7 @@ class FixRigid : public Fix {
char *infile; // file to read rigid body attributes from
int rstyle; // SINGLE,MOLECULE,GROUP
int staticflag; // 1 if static body properties are setup, else 0
int setupflag; // 1 if body properties are setup, else 0
int dimension; // # of dimensions
int nbody; // # of rigid bodies

View File

@ -45,9 +45,9 @@ using namespace MathConst;
FixRigidSmall *FixRigidSmall::frsptr;
#define MAXLINE 256
#define MAXLINE 1024
#define CHUNK 1024
#define ATTRIBUTE_PERBODY 11
#define ATTRIBUTE_PERBODY 17
#define TOLERANCE 1.0e-6
#define EPSILON 1.0e-7
@ -178,6 +178,7 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) :
"fix rigid/small does not exist");
onemols = &atom->molecules[imol];
nmol = onemols[0]->nset;
restart_file = 1;
iarg += 2;
} else if (strcmp(arg[iarg],"temp") == 0) {
@ -423,7 +424,9 @@ FixRigidSmall::FixRigidSmall(LAMMPS *lmp, int narg, char **arg) :
mass_body = NULL;
nmax_mass = 0;
staticflag = 0;
// wait to setup bodies until comm stencils are defined
setupflag = 0;
}
/* ---------------------------------------------------------------------- */
@ -507,11 +510,12 @@ void FixRigidSmall::init()
/* ----------------------------------------------------------------------
setup static/dynamic properties of rigid bodies, using current atom info
allows resetting of atom properties like mass between runs
only do static initialization must be done once
do not do again if using an infile or mol keyword
this is b/c the infile and Molecule class define the COM, etc
so should not reset those values
only do initialization once, b/c properties may not be re-computable
especially if overlapping particles or bodies inserted from mol template
do not do dynamic init if read body properties from infile
this is b/c the infile defines the static and dynamic properties
and may not be computable if contain overlapping particles
setup_bodies_static() reads infile itself
cannot do this until now, b/c requires comm->setup() to have setup stencil
invoke pre_neighbor() to insure body xcmimage flags are reset
needed if Verlet::setup::pbc() has remapped/migrated atoms for 2nd run
@ -520,14 +524,10 @@ void FixRigidSmall::init()
void FixRigidSmall::setup_pre_neighbor()
{
if (!staticflag || (!infile && !onemols)) setup_bodies_static();
if (!setupflag) setup_bodies_static();
else pre_neighbor();
//if (!staticflag || (!infile)) setup_bodies_static();
//else pre_neighbor();
//setup_bodies_dynamic();
if (!onemols) setup_bodies_dynamic();
if (!setupflag && !infile) setup_bodies_dynamic();
setupflag = 1;
}
/* ----------------------------------------------------------------------
@ -961,7 +961,7 @@ int FixRigidSmall::dof(int tgroup)
// cannot count DOF correctly unless setup_bodies_static() has been called
if (!staticflag) {
if (!setupflag) {
if (comm->me == 0)
error->warning(FLERR,"Cannot count rigid body degrees-of-freedom "
"before bodies are fully initialized");
@ -1659,13 +1659,11 @@ void FixRigidSmall::ring_farthest(int n, char *cbuf)
}
/* ----------------------------------------------------------------------
initialization of rigid body attributes
called at setup, so body/atom properties can be changed between runs
unless reading from infile or defined by Molecule class,
in which case only called once
one-time initialization of rigid body attributes
sets extended flags, masstotal, center-of-mass
sets Cartesian and diagonalized inertia tensor
sets body image flags, but only on first call
sets body image flags
may read some properties from infile
------------------------------------------------------------------------- */
void FixRigidSmall::setup_bodies_static()
@ -1764,14 +1762,12 @@ void FixRigidSmall::setup_bodies_static()
}
}
// first-time setting of body xcmimage flags = true image flags
// set body xcmimage flags = true image flags
if (!staticflag) {
imageint *image = atom->image;
for (i = 0; i < nlocal; i++)
if (bodytag[i] >= 0) xcmimage[i] = image[i];
else xcmimage[i] = 0;
}
imageint *image = atom->image;
for (i = 0; i < nlocal; i++)
if (bodytag[i] >= 0) xcmimage[i] = image[i];
else xcmimage[i] = 0;
// acquire ghost bodies via forward comm
// set atom2body for ghost atoms via forward comm
@ -1834,16 +1830,13 @@ void FixRigidSmall::setup_bodies_static()
readfile(0,NULL,inbody);
}
// one-time set of rigid body image flags to default values
// staticflag insures this is only done once, not on successive runs
// set rigid body image flags to default values
// then remap the xcm of each body back into simulation box
// and reset body xcmimage flags via pre_neighbor()
// and reset body and atom xcmimage flags via pre_neighbor()
if (!staticflag) {
for (ibody = 0; ibody < nlocal_body; ibody++)
body[ibody].image = ((imageint) IMGMAX << IMG2BITS) |
((imageint) IMGMAX << IMGBITS) | IMGMAX;
}
for (ibody = 0; ibody < nlocal_body; ibody++)
body[ibody].image = ((imageint) IMGMAX << IMG2BITS) |
((imageint) IMGMAX << IMGBITS) | IMGMAX;
pre_neighbor();
@ -2177,19 +2170,12 @@ void FixRigidSmall::setup_bodies_static()
memory->destroy(itensor);
if (infile) memory->destroy(inbody);
// static properties have now been initialized once
// used to prevent re-initialization which would re-read infile
staticflag = 1;
}
/* ----------------------------------------------------------------------
one-time initialization of dynamic rigid body attributes
vcm and angmom, computed explicitly from constituent particles
even if wrong for overlapping particles, is OK,
since is just setting initial time=0 vcm and angmom of the body
which can be estimated value
not done if body properites read from file, e.g. for overlapping particles
------------------------------------------------------------------------- */
void FixRigidSmall::setup_bodies_dynamic()
@ -2295,9 +2281,9 @@ void FixRigidSmall::setup_bodies_dynamic()
/* ----------------------------------------------------------------------
read per rigid body info from user-provided file
which = 0 to read total mass and center-of-mass
which = 1 to read 6 moments of inertia, store in array
flag inbody = 0 for local bodies whose info is read from file
which = 0 to read everthing except 6 moments of inertia
which = 1 to read just 6 moments of inertia, store in array
flag inbody = 0 for local bodies this proc initializes from file
nlines = # of lines of rigid body info, 0 is OK
one line = rigid-ID mass xcm ycm zcm ixx iyy izz ixy ixz iyz
and rigid-ID = mol-ID for fix rigid/small
@ -2390,6 +2376,12 @@ void FixRigidSmall::readfile(int which, double **array, int *inbody)
body[m].xcm[0] = atof(values[2]);
body[m].xcm[1] = atof(values[3]);
body[m].xcm[2] = atof(values[4]);
body[m].vcm[0] = atof(values[11]);
body[m].vcm[1] = atof(values[12]);
body[m].vcm[2] = atof(values[13]);
body[m].angmom[0] = atof(values[14]);
body[m].angmom[1] = atof(values[15]);
body[m].angmom[2] = atof(values[16]);
} else {
array[m][0] = atof(values[5]);
array[m][1] = atof(values[6]);
@ -2424,7 +2416,7 @@ void FixRigidSmall::write_restart_file(char *file)
// do not write file if bodies have not yet been intialized
if (!staticflag) return;
if (!setupflag) return;
// proc 0 opens file and writes header
@ -2446,8 +2438,9 @@ void FixRigidSmall::write_restart_file(char *file)
// communication buffer for all my rigid body info
// max_size = largest buffer needed by any proc
// ncol = # of values per line in output file
int ncol = 11;
int ncol = ATTRIBUTE_PERBODY;
int sendrow = nlocal_body;
int maxrow;
MPI_Allreduce(&sendrow,&maxrow,1,MPI_INT,MPI_MAX,world);
@ -2479,6 +2472,13 @@ void FixRigidSmall::write_restart_file(char *file)
buf[i][8] = ispace[0][1];
buf[i][9] = ispace[0][2];
buf[i][10] = ispace[1][2];
buf[i][10] = ispace[1][2];
buf[i][11] = body[i].vcm[0];
buf[i][12] = body[i].vcm[1];
buf[i][13] = body[i].vcm[2];
buf[i][14] = body[i].angmom[0];
buf[i][15] = body[i].angmom[1];
buf[i][16] = body[i].angmom[2];
}
// write one chunk of rigid body info per proc to file
@ -2501,10 +2501,13 @@ void FixRigidSmall::write_restart_file(char *file)
for (int i = 0; i < recvrow; i++)
fprintf(fp,"%d %-1.16e %-1.16e %-1.16e %-1.16e "
"%-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e "
"%-1.16e %-1.16e %-1.16e %-1.16e %-1.16e %-1.16e\n",
static_cast<int> (buf[i][0]),buf[i][1],
buf[i][2],buf[i][3],buf[i][4],
buf[i][5],buf[i][6],buf[i][7],buf[i][8],buf[i][9],buf[i][10]);
buf[i][5],buf[i][6],buf[i][7],buf[i][8],buf[i][9],buf[i][10],
buf[i][11],buf[i][12],buf[i][13],
buf[i][14],buf[i][15],buf[i][16]);
}
} else {

View File

@ -78,7 +78,7 @@ class FixRigidSmall : public Fix {
double MINUSPI,TWOPI;
char *infile; // file to read rigid body attributes from
int staticflag; // 1 if static body properties are setup, else 0
int setupflag; // 1 if body properties are setup, else 0
int commflag; // various modes of forward/reverse comm
int nbody; // total # of rigid bodies
tagint maxmol; // max mol-ID

View File

@ -64,8 +64,8 @@ void ComputeTemp::dof_compute()
double natoms = group->count(igroup);
dof = domain->dimension * natoms;
dof -= extra_dof + fix_dof;
if (dof < 0.0 && natoms > 0.0)
error->all(FLERR,"Temperature compute degrees of freedom < 0");
//if (dof < 0.0 && natoms > 0.0)
// error->all(FLERR,"Temperature compute degrees of freedom < 0");
if (dof > 0.0) tfactor = force->mvv2e / (dof * force->boltz);
else tfactor = 0.0;
}