2nd set of updates

This commit is contained in:
Steven J. Plimpton 2018-05-03 16:59:17 -06:00
parent 2b8576c7c7
commit 844858d3a7
11 changed files with 127 additions and 159 deletions

View File

@ -23,7 +23,7 @@ keyword = {temp} or {press} or {energy} or {virial} or {respa} or {dynamic/dof}
{dynamic/dof} value = {yes} or {no}
yes/no = do or do not recompute the number of degrees of freedom (DOF) contributing to the temperature
{bodyforces} value = {early} or {late}
early/late = compute per-rigid-body forces and torques at post_force (early) or at final_integrate (late) :pre
early/late = compute rigid-body forces/torques early or late in the timestep :pre
:ule
[Examples:]
@ -86,9 +86,8 @@ if you want virial contribution of the fix to be part of the
relaxation criteria, although this seems unlikely.
NOTE: This option is only supported by fixes that explicitly say
so. For some of these (e.g. the
"fix shake"_fix_shake.html command) the default setting is
{virial yes}, for others it is {virial no}.
so. For some of these (e.g. the "fix shake"_fix_shake.html command)
the default setting is {virial yes}, for others it is {virial no}.
For fixes that set or modify forces, it may be possible to select at
which "r-RESPA"_run_style.html level the fix operates via the {respa}
@ -122,22 +121,27 @@ compute to calculate temperature. See the "compute_modify
dynamic/dof"_compute_modify.html command for a similar way to insure
correct temperature normalization for those thermostats.
The {bodyforces} keyword determines whether the resultant forces and
torques acting on rigid bodies are computed at the post-force stage of
a time step (i.e. right after per-atom forces have been computed and
communicated among processors) or at the final-integrate stage (i.e.
after all other fixes have finished their post-force tasks). This option
applies for "fix rigid"_fix_rigid.html and "fix rigid/small"_fix_rigid.html,
along with their nve, nvt, npt, and nph versions. It also applies for
"fix poems"_fix_poems.html. Few fix styles actually do post-force
tasks. Some of them cause modifications in the computed per-atoms forces
(e.g. "fix addforce"_fix_addforce.html, "fix setforce"_fix_setforce.html,
"fix spring"_fix_spring.html, "fix shake"_fix_shake.html, and
"fix rattle"_fix_shake.html). These tasks are executed sequentially for
each fix, following the order of their definitions in the input script.
Therefore, once the {bodyforces} keyword is set as {early} for a given
rigid-style fix, per-atom force modifications done by other fixes defined
afterwards will have no effect on the per-body forces/torques it computes.
The {bodyforces} keyword determines whether the forces and torques
acting on rigid bodies are computed {early} at the post-force stage of
each timestep (right after per-atom forces have been computed and
communicated among processors), or {late} at the final-integrate stage
of each timestep (after any other fixes have finished their post-force
tasks). Only the rigid-body integration fixes use this option, which
includes "fix rigid"_fix_rigid.html and "fix
rigid/small"_fix_rigid.html, and their variants, and also "fix
poems"_fix_poems.html.
The default is {late}. If there are other fixes that add forces to
individual atoms, then the rigid-body constraints will include these
forces when time-integrating the rigid bodies. If {early} is
specified, then new fixes can be written that use or modify the
per-body force and torque, before time-integration of the rigid bodies
occurs. Note however this has the side effect, that fixes such as
"fix addforce"_fix_addforce.html, "fix setforce"_fix_setforce.html,
"fix spring"_fix_spring.html, which add forces to individual atoms
will have no effect on the motion of the rigid bodies if they are
specified in the input script after the fix rigid command. LAMMPS
will give a warning if that is the case.
[Restrictions:] none
@ -149,4 +153,5 @@ pressure"_compute_pressure.html, "thermo_style"_thermo_style.html
[Default:]
The option defaults are temp = ID defined by fix, press = ID defined
by fix, energy = no, virial = varies by fix style, respa = 0, bodyforces = late.
by fix, energy = no, virial = different for each fix style, respa = 0,
bodyforce = late.

View File

@ -105,17 +105,19 @@ off, and there is only a single fix poems defined.
[Restart, fix_modify, output, run start/stop, minimize info:]
The "fix_modify"_fix_modify.html {bodyforces} option is supported by
this fix style to set whether per-body forces and torques are
computed early or late in a time step, i.e., at the post-force stage
or at the final-integrate stage, respectively.
No information about this fix is written to "binary restart
files"_restart.html. No global or per-atom quantities are stored
by this fix for access by various "output
commands"_Section_howto.html#howto_15. No parameter of this fix can
be used with the {start/stop} keywords of the "run"_run.html command.
This fix is not invoked during "energy minimization"_minimize.html.
files"_restart.html.
The "fix_modify"_fix_modify.html {bodyforces} option is supported by
this fix style to set whether per-body forces and torques are computed
early or late in a timestep, i.e. at the post-force stage or at the
final-integrate stage, respectively.
No global or per-atom quantities are stored by this fix for access by
various "output commands"_Section_howto.html#howto_15. No parameter
of this fix can be used with the {start/stop} keywords of the
"run"_run.html command. This fix is not invoked during "energy
minimization"_minimize.html.
[Restrictions:]

View File

@ -223,10 +223,10 @@ via several options.
NOTE: With the {rigid/small} styles, which require that {bodystyle} be
specified as {molecule} or {custom}, you can define a system that has
no rigid bodies initially. This is useful when you are using the {mol}
keyword in conjunction with another fix that is adding rigid bodies
on-the-fly as molecules, such as "fix deposit"_fix_deposit.html or
"fix pour"_fix_pour.html.
no rigid bodies initially. This is useful when you are using the
{mol} keyword in conjunction with another fix that is adding rigid
bodies on-the-fly as molecules, such as "fix deposit"_fix_deposit.html
or "fix pour"_fix_pour.html.
For bodystyle {single} the entire fix group of atoms is treated as one
rigid body. This option is only allowed for the {rigid} styles.
@ -744,8 +744,8 @@ instantaneous temperature.
The "fix_modify"_fix_modify.html {bodyforces} option is supported by
all rigid styles to set whether per-body forces and torques are
computed early or late in a time step, i.e., at the post-force stage
or at the final-integrate stage, respectively.
computed early or late in a timestep, i.e. at the post-force stage or
at the final-integrate stage or the timestep, respectively.
The 2 NVE rigid fixes compute a global scalar which can be accessed by
various "output commands"_Section_howto.html#howto_15. The scalar

View File

@ -174,7 +174,8 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) :
MPI_Allreduce(&vmin,&minval,1,MPI_INT,MPI_MIN,world);
molecule = new tagint[nlocal];
for (i = 0; i < nlocal; i++)
if (mask[i] & groupbit) molecule[i] = (tagint)((tagint)value[i] - minval + 1);
if (mask[i] & groupbit)
molecule[i] = (tagint)((tagint)value[i] - minval + 1);
delete[] value;
} else error->all(FLERR,"Unsupported fix rigid custom property");
} else {
@ -624,7 +625,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) :
setupflag = 0;
// compute per body forces and torques inside final_integrate() by default
// compute per body forces and torques at final_integrate() by default
earlyflag = 0;
@ -688,29 +689,12 @@ FixRigid::~FixRigid()
/* ---------------------------------------------------------------------- */
int FixRigid::modify_param(int narg, char **arg)
{
if (strcmp(arg[0],"bodyforces") == 0) {
if (narg < 2)
error->all(FLERR,"Illegal fix_modify command");
if (strcmp(arg[1],"early") == 0)
earlyflag = 1;
else if (strcmp(arg[1],"late") == 0)
earlyflag = 0;
else
error->all(FLERR,"Illegal fix_modify command");
return 2;
} else return 0;
}
/* ---------------------------------------------------------------------- */
int FixRigid::setmask()
{
int mask = 0;
mask |= INITIAL_INTEGRATE;
mask |= FINAL_INTEGRATE;
mask |= POST_FORCE;
if (langflag || earlyflag) mask |= POST_FORCE;
mask |= PRE_NEIGHBOR;
mask |= INITIAL_INTEGRATE_RESPA;
mask |= FINAL_INTEGRATE_RESPA;
@ -732,19 +716,25 @@ void FixRigid::init()
avec_tri = (AtomVecTri *) atom->style_match("tri");
// warn if more than one rigid fix
// if earlyflag, warn if any post-force fixes come after POEMS fix
int count = 0;
int myindex, myposition;
for (i = 0; i < modify->nfix; i++)
if (strcmp(modify->fix[i]->style,"rigid") == 0) {
count++;
if (strcmp(modify->fix[i]->id,this->id) == 0) {
myindex = i;
myposition = count;
if (modify->fix[i]->rigid_flag) count++;
if (count > 1 && me == 0) error->warning(FLERR,"More than one fix rigid");
if (earlyflag) {
int rflag = 0;
for (i = 0; i < modify->nfix; i++) {
if (modify->fix[i]->rigid_flag) rflag = 1;
if (rflag && (modify->fmask[i] & POST_FORCE) &&
!modify->fix[i]->rigid_flag) {
char str[128];
sprintf(str,"Fix %d alters forces after fix rigid",modify->fix[i]->id);
error->warning(FLERR,str);
}
}
if (count > 1 && myposition == 1 && comm->me == 0)
error->warning(FLERR,"More than one fix rigid");
}
// error if npt,nph fix comes before rigid fix
@ -758,29 +748,6 @@ void FixRigid::init()
error->all(FLERR,"Rigid fix must come before NPT/NPH fix");
}
// warn if fix rigid preceeds non-rigid fixes with post-force tasks
// when computing body forces and torques in post_force() instead of final_integrate()
if (earlyflag) {
int has_post_force[modify->nfix - myindex];
count = 0;
for (i = myindex + 1; i < modify->nfix; i++)
if ( (modify->fmask[i] & POST_FORCE) && (!modify->fix[i]->rigid_flag) )
has_post_force[count++] = i;
if (count) {
FILE *p[2] = {screen, logfile};
for (int j = 0; j < 2; j++)
if (p[j]) {
fprintf(p[j],"WARNING: fix %s %s",id,style);
fprintf(p[j]," will add up forces before they are handled by:\n");
for (int k = 0; k < count; k++) {
Fix *fix = modify->fix[has_post_force[k]];
fprintf(p[j]," => fix %s %s\n",fix->id,fix->style);
}
}
}
}
// timestep info
dtv = update->dt;
@ -993,7 +960,7 @@ void FixRigid::initial_integrate(int vflag)
apply Langevin thermostat to all 6 DOF of rigid bodies
computed by proc 0, broadcast to other procs
unlike fix langevin, this stores extra force in extra arrays,
which are added in when one calculates a new fcm/torque
which are added in when final_integrate() calculates a new fcm/torque
------------------------------------------------------------------------- */
void FixRigid::apply_langevin_thermostat()
@ -1063,6 +1030,7 @@ void FixRigid::enforce2d()
void FixRigid::compute_forces_and_torques()
{
int i,ibody;
double dtfm;
// sum over atoms to get force and torque on rigid body
@ -1125,6 +1093,7 @@ void FixRigid::compute_forces_and_torques()
}
}
/* ---------------------------------------------------------------------- */
void FixRigid::post_force(int vflag)
@ -2660,6 +2629,21 @@ void FixRigid::zero_rotation()
set_v();
}
/* ---------------------------------------------------------------------- */
int FixRigid::modify_param(int narg, char **arg)
{
if (strcmp(arg[0],"bodyforces") == 0) {
if (narg < 2) error->all(FLERR,"Illegal fix_modify command");
if (strcmp(arg[1],"early") == 0) earlyflag = 1;
else if (strcmp(arg[1],"late") == 0) earlyflag = 0;
else error->all(FLERR,"Illegal fix_modify command");
return 2;
}
return 0;
}
/* ----------------------------------------------------------------------
return temperature of collection of rigid bodies
non-active DOF are removed by fflag/tflag and in tfactor

View File

@ -28,7 +28,6 @@ class FixRigid : public Fix {
public:
FixRigid(class LAMMPS *, int, char **);
virtual ~FixRigid();
int modify_param(int, char **);
virtual int setmask();
virtual void init();
virtual void setup(int);
@ -55,6 +54,7 @@ class FixRigid : public Fix {
void reset_dt();
void zero_momentum();
void zero_rotation();
virtual int modify_param(int, char **);
virtual void *extract(const char*, int &);
double extract_ke();
double extract_erotational();
@ -70,7 +70,7 @@ class FixRigid : public Fix {
char *infile; // file to read rigid body attributes from
int rstyle; // SINGLE,MOLECULE,GROUP
int setupflag; // 1 if body properties are setup, else 0
int earlyflag; // 1 if forces and torques are computed at post_force()
int earlyflag; // 1 if forces/torques computed at post_force()
int dimension; // # of dimensions
int nbody; // # of rigid bodies
@ -146,7 +146,7 @@ class FixRigid : public Fix {
void setup_bodies_static();
void setup_bodies_dynamic();
void apply_langevin_thermostat();
virtual void compute_forces_and_torques();
void compute_forces_and_torques();
void readfile(int, double *, double **, double **, double **,
imageint *, int *);
};

View File

@ -591,9 +591,9 @@ void FixRigidNH::initial_integrate(int vflag)
void FixRigidNH::final_integrate()
{
int ibody;
int i,ibody;
double tmp,scale_t[3],scale_r;
double dtfm;
double dtfm,xy,xz,yz;
double mbody[3],tbody[3],fquat[4];
double dtf2 = dtf * 2.0;
@ -1249,7 +1249,9 @@ int FixRigidNH::modify_param(int narg, char **arg)
if (pressure->pressflag == 0)
error->all(FLERR,"Fix_modify pressure ID does not compute pressure");
return 2;
} else return FixRigid::modify_param(narg,arg);
}
return FixRigid::modify_param(narg,arg);
}
/* ---------------------------------------------------------------------- */

View File

@ -618,7 +618,7 @@ void FixRigidNHSmall::initial_integrate(int vflag)
void FixRigidNHSmall::final_integrate()
{
int ibody;
int i,ibody;
double tmp,scale_t[3],scale_r;
double dtfm;
double mbody[3],tbody[3],fquat[4];
@ -1367,7 +1367,9 @@ int FixRigidNHSmall::modify_param(int narg, char **arg)
if (pressure->pressflag == 0)
error->all(FLERR,"Fix_modify pressure ID does not compute pressure");
return 2;
} else return FixRigidSmall::modify_param(narg,arg);
}
return FixRigidSmall::modify_param(narg,arg);
}
/* ---------------------------------------------------------------------- */

View File

@ -535,29 +535,12 @@ FixRigidSmall::~FixRigidSmall()
/* ---------------------------------------------------------------------- */
int FixRigidSmall::modify_param(int narg, char **arg)
{
if (strcmp(arg[0],"bodyforces") == 0) {
if (narg < 2)
error->all(FLERR,"Illegal fix_modify command");
if (strcmp(arg[1],"early") == 0)
earlyflag = 1;
else if (strcmp(arg[1],"late") == 0)
earlyflag = 0;
else
error->all(FLERR,"Illegal fix_modify command");
return 2;
} else return 0;
}
/* ---------------------------------------------------------------------- */
int FixRigidSmall::setmask()
{
int mask = 0;
mask |= INITIAL_INTEGRATE;
mask |= FINAL_INTEGRATE;
mask |= POST_FORCE;
if (langflag || earlyflag) mask |= POST_FORCE;
mask |= PRE_NEIGHBOR;
mask |= INITIAL_INTEGRATE_RESPA;
mask |= FINAL_INTEGRATE_RESPA;
@ -575,17 +558,22 @@ void FixRigidSmall::init()
// warn if more than one rigid fix
int count = 0;
int myindex, myposition;
for (i = 0; i < modify->nfix; i++)
if (strcmp(modify->fix[i]->style,"rigid") == 0) {
count++;
if (strcmp(modify->fix[i]->id,this->id) == 0) {
myindex = i;
myposition = count;
if (modify->fix[i]->rigid_flag) count++;
if (count > 1 && me == 0) error->warning(FLERR,"More than one fix rigid");
if (earlyflag) {
int rflag = 0;
for (i = 0; i < modify->nfix; i++) {
if (modify->fix[i]->rigid_flag) rflag = 1;
if (rflag && (modify->fmask[i] & POST_FORCE) &&
!modify->fix[i]->rigid_flag) {
char str[128];
sprintf(str,"Fix %d alters forces after fix rigid",modify->fix[i]->id);
error->warning(FLERR,str);
}
}
if (count > 1 && myposition == 1 && comm->me == 0)
error->warning(FLERR,"More than one fix rigid");
}
// error if npt,nph fix comes before rigid fix
@ -599,29 +587,6 @@ void FixRigidSmall::init()
error->all(FLERR,"Rigid fix must come before NPT/NPH fix");
}
// warn if fix rigid preceeds non-rigid fixes with post-force tasks
// when computing body forces and torques in post_force() instead of final_integrate()
if (earlyflag) {
int has_post_force[modify->nfix - myindex];
count = 0;
for (i = myindex + 1; i < modify->nfix; i++)
if ( (modify->fmask[i] & POST_FORCE) && (!modify->fix[i]->rigid_flag) )
has_post_force[count++] = i;
if (count) {
FILE *p[2] = {screen, logfile};
for (int j = 0; j < 2; j++)
if (p[j]) {
fprintf(p[j],"WARNING: fix %s %s",id,style);
fprintf(p[j]," will add up forces before they are handled by:\n");
for (int k = 0; k < count; k++) {
Fix *fix = modify->fix[has_post_force[k]];
fprintf(p[j]," => fix %s %s\n",fix->id,fix->style);
}
}
}
}
// timestep info
dtv = update->dt;
@ -822,10 +787,10 @@ void FixRigidSmall::initial_integrate(int vflag)
/* ----------------------------------------------------------------------
apply Langevin thermostat to all 6 DOF of rigid bodies I own
unlike fix langevin, this stores extra force in extra arrays,
which are added in when one calculates a new fcm/torque
which are added in when a new fcm/torque are calculated
------------------------------------------------------------------------- */
void FixRigidSmall::apply_langevin_thermostat()
void FixRigidSmall::apply_langevin_thermostat(int vflag)
{
double gamma1,gamma2;
@ -984,13 +949,6 @@ void FixRigidSmall::compute_forces_and_torques()
}
}
/* ---------------------------------------------------------------------- */
void FixRigidSmall::post_force(int vflag)
{
if (langflag) apply_langevin_thermostat();
if (earlyflag) compute_forces_and_torques();
}
/* ---------------------------------------------------------------------- */
@ -3454,6 +3412,21 @@ void FixRigidSmall::zero_rotation()
/* ---------------------------------------------------------------------- */
int FixRigidSmall::modify_param(int narg, char **arg)
{
if (strcmp(arg[0],"bodyforces") == 0) {
if (narg < 2) error->all(FLERR,"Illegal fix_modify command");
if (strcmp(arg[1],"early") == 0) earlyflag = 1;
else if (strcmp(arg[1],"late") == 0) earlyflag = 0;
else error->all(FLERR,"Illegal fix_modify command");
return 2;
}
return 0;
}
/* ---------------------------------------------------------------------- */
void *FixRigidSmall::extract(const char *str, int &dim)
{
if (strcmp(str,"body") == 0) {

View File

@ -33,7 +33,6 @@ class FixRigidSmall : public Fix {
public:
FixRigidSmall(class LAMMPS *, int, char **);
virtual ~FixRigidSmall();
int modify_param(int, char **);
virtual int setmask();
virtual void init();
virtual void setup(int);
@ -64,6 +63,7 @@ class FixRigidSmall : public Fix {
void reset_dt();
void zero_momentum();
void zero_rotation();
int modify_param(int, char **);
void *extract(const char*, int &);
double extract_ke();
double extract_erotational();
@ -79,7 +79,7 @@ class FixRigidSmall : public Fix {
char *infile; // file to read rigid body attributes from
int setupflag; // 1 if body properties are setup, else 0
int earlyflag; // 1 if forces and torques are computed at post_force()
int earlyflag; // 1 if forces/torques are computed at post_force()
int commflag; // various modes of forward/reverse comm
int customflag; // 1 if custom property/variable define bodies
int nbody; // total # of rigid bodies
@ -194,7 +194,7 @@ class FixRigidSmall : public Fix {
void setup_bodies_static();
void setup_bodies_dynamic();
void apply_langevin_thermostat();
virtual void compute_forces_and_torques();
void compute_forces_and_torques();
void readfile(int, double **, int *);
void grow_body();
void reset_atom2body();

View File

@ -45,4 +45,3 @@ class FixRigidOMP : public FixRigid {
#endif
#endif

View File

@ -618,3 +618,4 @@ void FixRigidSmallOMP::set_v_thr()
}
}
}