From 0c53afbfcf47b0c32b2295b891f9da534c1229b5 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" <sjplimp@singsing.sandia.gov> Date: Sat, 5 May 2018 10:39:01 -0600 Subject: [PATCH] more changes to fix rigid and fix poems --- src/POEMS/fix_poems.cpp | 103 ++++++++++++++-------------------- src/POEMS/fix_poems.h | 3 +- src/RIGID/fix_rigid.cpp | 13 ++++- src/RIGID/fix_rigid_small.cpp | 14 ++++- 4 files changed, 67 insertions(+), 66 deletions(-) diff --git a/src/POEMS/fix_poems.cpp b/src/POEMS/fix_poems.cpp index bc91293eec..11fea2caee 100644 --- a/src/POEMS/fix_poems.cpp +++ b/src/POEMS/fix_poems.cpp @@ -267,6 +267,10 @@ FixPOEMS::FixPOEMS(LAMMPS *lmp, int narg, char **arg) : poems = new Workspace; + // compute per body forces and torques inside final_integrate() by default + + earlyflag = 0; + // print statistics 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", 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 mask = 0; @@ -374,19 +355,25 @@ void FixPOEMS::init() int i,ibody; // warn if more than one POEMS 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,"poems") == 0) { - count++; - if (strcmp(modify->fix[i]->id,this->id) == 0) { - myindex = i; - myposition = count; + for (int i = 0; i < modify->nfix; i++) + if (strcmp(modify->fix[i]->style,"poems") == 0) count++; + if (count > 1 && comm->me == 0) error->warning(FLERR,"More than one fix poems"); + + if (earlyflag) { + int pflag = 0; + 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 @@ -400,29 +387,6 @@ void FixPOEMS::init() 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 dtv = update->dt; @@ -781,6 +745,13 @@ void FixPOEMS::initial_integrate(int vflag) set_xv(); } +/* ---------------------------------------------------------------------- */ + +void FixPOEMS::post_force(int vflag) +{ + if (earlyflag) compute_forces_and_torques(); +} + /* ---------------------------------------------------------------------- compute fcm,torque on each rigid 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 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() { dtv = update->dt; diff --git a/src/POEMS/fix_poems.h b/src/POEMS/fix_poems.h index eec146a8dd..7b2c77a1bd 100644 --- a/src/POEMS/fix_poems.h +++ b/src/POEMS/fix_poems.h @@ -28,7 +28,6 @@ class FixPOEMS : public Fix { public: FixPOEMS(class LAMMPS *, int narg, char **arg); ~FixPOEMS(); - int modify_param(int, char **); int setmask(); void init(); void setup(int); @@ -48,6 +47,7 @@ class FixPOEMS : public Fix { void pre_neighbor(); int dof(int); void deform(int); + int modify_param(int, char **); void reset_dt(); private: @@ -56,7 +56,6 @@ class FixPOEMS : public Fix { double *step_respa; int nlevels_respa; double total_ke; - int earlyflag; // 1 if forces and torques are computed at post_force() // atom assignment to rigid bodies diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index 73a8e487ce..2802056cf0 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -694,7 +694,7 @@ int FixRigid::setmask() int mask = 0; mask |= INITIAL_INTEGRATE; mask |= FINAL_INTEGRATE; - if (langflag || earlyflag) mask |= POST_FORCE; + if (langflag) mask |= POST_FORCE; mask |= PRE_NEIGHBOR; mask |= INITIAL_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; else if (strcmp(arg[1],"late") == 0) earlyflag = 0; 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; } diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 680ae876b1..d0cb596c82 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -540,7 +540,7 @@ int FixRigidSmall::setmask() int mask = 0; mask |= INITIAL_INTEGRATE; mask |= FINAL_INTEGRATE; - if (langflag || earlyflag) mask |= POST_FORCE; + if (langflag) mask |= POST_FORCE; mask |= PRE_NEIGHBOR; mask |= INITIAL_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; else if (strcmp(arg[1],"late") == 0) earlyflag = 0; 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; } -- GitLab