diff --git a/src/fix_pair.cpp b/src/fix_pair.cpp index 5f9363daaa..8d3ce717d3 100644 --- a/src/fix_pair.cpp +++ b/src/fix_pair.cpp @@ -120,7 +120,8 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : atom->add_callback(Atom::GROW); // zero the vector/array since dump may access it on timestep 0 - // zero the vector/array since a variable may access it before first run + // zero the vector/array since a variable may access it before first ru + // initialize lasttime so step 0 will trigger/extract int nlocal = atom->nlocal; @@ -132,6 +133,8 @@ FixPair::FixPair(LAMMPS *lmp, int narg, char **arg) : for (int m = 0; m < ncols; m++) array[i][m] = 0.0; } + + lasttime = -1; } /* ---------------------------------------------------------------------- */ @@ -188,6 +191,13 @@ void FixPair::setup(int vflag) /* ---------------------------------------------------------------------- */ +void FixPair::min_setup(int vflag) +{ + setup(vflag); +} + +/* ---------------------------------------------------------------------- */ + void FixPair::setup_pre_force(int vflag) { pre_force(vflag); @@ -195,14 +205,18 @@ void FixPair::setup_pre_force(int vflag) /* ---------------------------------------------------------------------- trigger pair style computation on steps which are multiples of Nevery + lasttime prevents mulitiple triggers by min linesearch on same iteration ------------------------------------------------------------------------- */ void FixPair::pre_force(int /*vflag*/) { if (update->ntimestep % nevery) return; + if (update->ntimestep == lasttime) return; // set pair style triggers + printf("FPAIR preforce: set trigger %ld\n",update->ntimestep); + for (int ifield = 0; ifield < nfield; ifield++) if (trigger[ifield]) *(triggerptr[ifield]) = 1; } @@ -215,12 +229,15 @@ void FixPair::min_pre_force(int vflag) } /* ---------------------------------------------------------------------- - extract results from pair style + extract results from pair style on steps which are multiples of Nevery + lasttime prevents mulitiple extracts by min linesearch on same iteration ------------------------------------------------------------------------- */ void FixPair::post_force(int /*vflag*/) { if (update->ntimestep % nevery) return; + if (update->ntimestep == lasttime) return; + lasttime = update->ntimestep; // extract pair style fields one by one // store their values in this fix @@ -230,6 +247,8 @@ void FixPair::post_force(int /*vflag*/) int icol = 0; int columns; + printf("FPAIR postforce: extract %ld\n",update->ntimestep); + for (int ifield = 0; ifield < nfield; ifield++) { void *pvoid = pstyle->extract_peratom(fieldname[ifield],columns); if (pvoid == nullptr) diff --git a/src/fix_pair.h b/src/fix_pair.h index c4d0bb593c..c3d8454185 100644 --- a/src/fix_pair.h +++ b/src/fix_pair.h @@ -31,6 +31,7 @@ class FixPair : public Fix { int setmask() override; void init() override; void setup(int) override; + void min_setup(int) override; void setup_pre_force(int) override; void pre_force(int) override; void min_pre_force(int) override; @@ -46,6 +47,7 @@ class FixPair : public Fix { private: int nevery,nfield,ncols; + bigint lasttime; char *pairname; char **fieldname,**triggername; int *trigger;