more changes to fix rigid and fix poems

This commit is contained in:
Steven J. Plimpton 2018-05-05 10:39:01 -06:00
parent c9d41178d8
commit 0c53afbfcf
4 changed files with 67 additions and 66 deletions

View File

@ -267,6 +267,10 @@ FixPOEMS::FixPOEMS(LAMMPS *lmp, int narg, char **arg) :
poems = new Workspace; poems = new Workspace;
// compute per body forces and torques inside final_integrate() by default
earlyflag = 0;
// print statistics // print statistics
int nsum = 0; int nsum = 0;
@ -281,10 +285,6 @@ FixPOEMS::FixPOEMS(LAMMPS *lmp, int narg, char **arg) :
fprintf(logfile,"%d clusters, %d bodies, %d joints, %d atoms\n", fprintf(logfile,"%d clusters, %d bodies, %d joints, %d atoms\n",
ncluster,nbody,njoint,nsum); ncluster,nbody,njoint,nsum);
} }
// compute per body forces and torques inside final_integrate() by default
earlyflag = 0;
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
@ -335,25 +335,6 @@ FixPOEMS::~FixPOEMS()
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
int FixPOEMS::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 FixPOEMS::setmask() int FixPOEMS::setmask()
{ {
int mask = 0; int mask = 0;
@ -374,19 +355,25 @@ void FixPOEMS::init()
int i,ibody; int i,ibody;
// warn if more than one POEMS fix // warn if more than one POEMS fix
// if earlyflag, warn if any post-force fixes come after POEMS fix
int count = 0; int count = 0;
int myindex, myposition; for (int i = 0; i < modify->nfix; i++)
for (i = 0; i < modify->nfix; i++) if (strcmp(modify->fix[i]->style,"poems") == 0) count++;
if (strcmp(modify->fix[i]->style,"poems") == 0) { if (count > 1 && comm->me == 0) error->warning(FLERR,"More than one fix poems");
count++;
if (strcmp(modify->fix[i]->id,this->id) == 0) { if (earlyflag) {
myindex = i; int pflag = 0;
myposition = count; for (i = 0; i < modify->nfix; i++) {
if (strcmp(modify->fix[i]->style,"poems") == 0) pflag = 1;
if (pflag && (modify->fmask[i] & POST_FORCE) &&
!modify->fix[i]->rigid_flag) {
char str[128];
sprintf(str,"Fix %d alters forces after fix poems",modify->fix[i]->id);
error->warning(FLERR,str);
}
} }
} }
if (count > 1 && myposition == 1 && comm->me == 0)
error->warning(FLERR,"More than one fix poems");
// error if npt,nph fix comes before rigid fix // error if npt,nph fix comes before rigid fix
@ -400,29 +387,6 @@ void FixPOEMS::init()
error->all(FLERR,"POEMS fix must come before NPT/NPH fix"); error->all(FLERR,"POEMS fix must come before NPT/NPH fix");
} }
// warn if fix poems 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 // timestep info
dtv = update->dt; dtv = update->dt;
@ -781,6 +745,13 @@ void FixPOEMS::initial_integrate(int vflag)
set_xv(); set_xv();
} }
/* ---------------------------------------------------------------------- */
void FixPOEMS::post_force(int vflag)
{
if (earlyflag) compute_forces_and_torques();
}
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
compute fcm,torque on each rigid body compute fcm,torque on each rigid body
only count joint atoms in 1st body only count joint atoms in 1st body
@ -837,13 +808,6 @@ void FixPOEMS::compute_forces_and_torques()
} }
} }
/* ---------------------------------------------------------------------- */
void FixPOEMS::post_force(int vflag)
{
if (earlyflag) compute_forces_and_torques();
}
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
update vcm,omega by last 1/2 step update vcm,omega by last 1/2 step
set v of body atoms accordingly set v of body atoms accordingly
@ -1678,6 +1642,21 @@ int FixPOEMS::unpack_exchange(int nlocal, double *buf)
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
int FixPOEMS::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 FixPOEMS::reset_dt() void FixPOEMS::reset_dt()
{ {
dtv = update->dt; dtv = update->dt;

View File

@ -28,7 +28,6 @@ class FixPOEMS : public Fix {
public: public:
FixPOEMS(class LAMMPS *, int narg, char **arg); FixPOEMS(class LAMMPS *, int narg, char **arg);
~FixPOEMS(); ~FixPOEMS();
int modify_param(int, char **);
int setmask(); int setmask();
void init(); void init();
void setup(int); void setup(int);
@ -48,6 +47,7 @@ class FixPOEMS : public Fix {
void pre_neighbor(); void pre_neighbor();
int dof(int); int dof(int);
void deform(int); void deform(int);
int modify_param(int, char **);
void reset_dt(); void reset_dt();
private: private:
@ -56,7 +56,6 @@ class FixPOEMS : public Fix {
double *step_respa; double *step_respa;
int nlevels_respa; int nlevels_respa;
double total_ke; double total_ke;
int earlyflag; // 1 if forces and torques are computed at post_force() int earlyflag; // 1 if forces and torques are computed at post_force()
// atom assignment to rigid bodies // atom assignment to rigid bodies

View File

@ -694,7 +694,7 @@ int FixRigid::setmask()
int mask = 0; int mask = 0;
mask |= INITIAL_INTEGRATE; mask |= INITIAL_INTEGRATE;
mask |= FINAL_INTEGRATE; mask |= FINAL_INTEGRATE;
if (langflag || earlyflag) mask |= POST_FORCE; if (langflag) mask |= POST_FORCE;
mask |= PRE_NEIGHBOR; mask |= PRE_NEIGHBOR;
mask |= INITIAL_INTEGRATE_RESPA; mask |= INITIAL_INTEGRATE_RESPA;
mask |= FINAL_INTEGRATE_RESPA; mask |= FINAL_INTEGRATE_RESPA;
@ -2638,6 +2638,17 @@ int FixRigid::modify_param(int narg, char **arg)
if (strcmp(arg[1],"early") == 0) earlyflag = 1; if (strcmp(arg[1],"early") == 0) earlyflag = 1;
else if (strcmp(arg[1],"late") == 0) earlyflag = 0; else if (strcmp(arg[1],"late") == 0) earlyflag = 0;
else error->all(FLERR,"Illegal fix_modify command"); else error->all(FLERR,"Illegal fix_modify command");
// reset fix mask
// must do here and not in init,
// since modify.cpp::init() uses fix masks before calling fix::init()
for (int i = 0; i < modify->nfix; i++)
if (strcmp(modify->fix[i]->id,id) == 0) {
if (earlyflag) modify->fmask[i] |= POST_FORCE;
else if (!langflag) modify->fmask[i] &= ~POST_FORCE;
break;
}
return 2; return 2;
} }

View File

@ -540,7 +540,7 @@ int FixRigidSmall::setmask()
int mask = 0; int mask = 0;
mask |= INITIAL_INTEGRATE; mask |= INITIAL_INTEGRATE;
mask |= FINAL_INTEGRATE; mask |= FINAL_INTEGRATE;
if (langflag || earlyflag) mask |= POST_FORCE; if (langflag) mask |= POST_FORCE;
mask |= PRE_NEIGHBOR; mask |= PRE_NEIGHBOR;
mask |= INITIAL_INTEGRATE_RESPA; mask |= INITIAL_INTEGRATE_RESPA;
mask |= FINAL_INTEGRATE_RESPA; mask |= FINAL_INTEGRATE_RESPA;
@ -3428,6 +3428,18 @@ int FixRigidSmall::modify_param(int narg, char **arg)
if (strcmp(arg[1],"early") == 0) earlyflag = 1; if (strcmp(arg[1],"early") == 0) earlyflag = 1;
else if (strcmp(arg[1],"late") == 0) earlyflag = 0; else if (strcmp(arg[1],"late") == 0) earlyflag = 0;
else error->all(FLERR,"Illegal fix_modify command"); else error->all(FLERR,"Illegal fix_modify command");
// reset fix mask
// must do here and not in init,
// since modify.cpp::init() uses fix masks before calling fix::init()
for (int i = 0; i < modify->nfix; i++)
if (strcmp(modify->fix[i]->id,id) == 0) {
if (earlyflag) modify->fmask[i] |= POST_FORCE;
else if (!langflag) modify->fmask[i] &= ~POST_FORCE;
break;
}
return 2; return 2;
} }