diff --git a/src/fix_addforce.cpp b/src/fix_addforce.cpp index 677a430141..2905bc3877 100644 --- a/src/fix_addforce.cpp +++ b/src/fix_addforce.cpp @@ -16,6 +16,7 @@ #include "fix_addforce.h" #include "atom.h" #include "update.h" +#include "modify.h" #include "domain.h" #include "region.h" #include "respa.h" @@ -248,10 +249,14 @@ void FixAddForce::post_force(int vflag) f[i][2] += zvalue; } - // variable force + // variable force, wrap with clear/add // potential energy = evar if defined, else 0.0 + // wrap with clear/add } else { + + modify->clearstep_compute(); + if (xstyle == EQUAL) xvalue = input->variable->compute_equal(xvar); else if (xstyle == ATOM) input->variable->compute_atom(xvar,igroup,&sforce[0][0],4,0); @@ -264,6 +269,8 @@ void FixAddForce::post_force(int vflag) if (estyle == ATOM) input->variable->compute_atom(evar,igroup,&sforce[0][3],4,0); + modify->addstep_compute(update->ntimestep + 1); + for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { if (iregion >= 0 && diff --git a/src/fix_aveforce.cpp b/src/fix_aveforce.cpp index 198a51ffa4..8d0865c19a 100644 --- a/src/fix_aveforce.cpp +++ b/src/fix_aveforce.cpp @@ -17,6 +17,7 @@ #include "fix_aveforce.h" #include "atom.h" #include "update.h" +#include "modify.h" #include "domain.h" #include "region.h" #include "respa.h" @@ -206,6 +207,7 @@ void FixAveForce::post_force(int vflag) // average the force on participating atoms // add in requested amount, computed via variable evaluation if necessary + // wrap variable evaluation with clear/add MPI_Allreduce(foriginal,foriginal_all,4,MPI_DOUBLE,MPI_SUM,world); @@ -213,9 +215,11 @@ void FixAveForce::post_force(int vflag) if (ncount == 0) return; if (varflag == EQUAL) { + modify->clearstep_compute(); if (xstyle == EQUAL) xvalue = input->variable->compute_equal(xvar); if (ystyle == EQUAL) yvalue = input->variable->compute_equal(yvar); if (zstyle == EQUAL) zvalue = input->variable->compute_equal(zvar); + modify->addstep_compute(update->ntimestep + 1); } double fave[3]; diff --git a/src/fix_efield.cpp b/src/fix_efield.cpp index 65b9a64663..f60522b56f 100644 --- a/src/fix_efield.cpp +++ b/src/fix_efield.cpp @@ -21,6 +21,7 @@ #include "fix_efield.h" #include "atom.h" #include "update.h" +#include "modify.h" #include "force.h" #include "respa.h" #include "input.h" @@ -176,7 +177,12 @@ void FixEfield::post_force(int vflag) f[i][2] += q[i]*ez; } + // variable efield, wrap with clear/add + } else { + + modify->clearstep_compute(); + if (xstyle == EQUAL) ex = qe2f * input->variable->compute_equal(xvar); else if (xstyle == ATOM) input->variable->compute_atom(xvar,igroup,&efield[0][0],3,0); @@ -187,6 +193,8 @@ void FixEfield::post_force(int vflag) else if (zstyle == ATOM) input->variable->compute_atom(zvar,igroup,&efield[0][2],3,0); + modify->addstep_compute(update->ntimestep + 1); + for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { if (xstyle == ATOM) f[i][0] += qe2f * q[i]*efield[i][0]; diff --git a/src/fix_indent.cpp b/src/fix_indent.cpp index 8bd4ac2a2c..e4601b713b 100644 --- a/src/fix_indent.cpp +++ b/src/fix_indent.cpp @@ -25,6 +25,7 @@ #include "domain.h" #include "lattice.h" #include "update.h" +#include "modify.h" #include "output.h" #include "respa.h" #include "error.h" @@ -81,6 +82,9 @@ FixIndent::FixIndent(LAMMPS *lmp, int narg, char **arg) : else if (cdim == 2 && !pstr) pvalue *= zscale; } else error->all("Illegal fix indent command"); + varflag = 0; + if (xstr || ystr || zstr || rstr || pstr) varflag = 1; + indenter_flag = 0; indenter[0] = indenter[1] = indenter[2] = indenter[3] = 0.0; } @@ -172,6 +176,9 @@ void FixIndent::min_setup(int vflag) void FixIndent::post_force(int vflag) { // indenter values, 0 = energy, 1-3 = force components + // wrap variable evaluations with clear/add + + if (varflag) modify->clearstep_compute(); indenter_flag = 0; indenter[0] = indenter[1] = indenter[2] = indenter[3] = 0.0; @@ -237,7 +244,7 @@ void FixIndent::post_force(int vflag) // ctr = current indenter axis // remap into periodic box // 3rd coord is just near box for remap(), since isn't used - + double ctr[3]; if (cdim == 0) { ctr[0] = domain->boxlo[0]; @@ -335,6 +342,8 @@ void FixIndent::post_force(int vflag) indenter[cdim+1] -= fatom; } } + + if (varflag) modify->addstep_compute(update->ntimestep + 1); } /* ---------------------------------------------------------------------- */ diff --git a/src/fix_indent.h b/src/fix_indent.h index 2418ce6f89..e94a9f4a18 100644 --- a/src/fix_indent.h +++ b/src/fix_indent.h @@ -46,7 +46,7 @@ class FixIndent : public Fix { double xvalue,yvalue,zvalue,rvalue,pvalue; int indenter_flag,planeside; double indenter[4],indenter_all[4]; - int cdim; + int cdim,varflag; int nlevels_respa; void options(int, char **); diff --git a/src/fix_move.cpp b/src/fix_move.cpp index 688a445014..d14908d9c2 100644 --- a/src/fix_move.cpp +++ b/src/fix_move.cpp @@ -18,6 +18,7 @@ #include "atom.h" #include "group.h" #include "update.h" +#include "modify.h" #include "force.h" #include "domain.h" #include "lattice.h" @@ -569,7 +570,9 @@ void FixMove::initial_integrate(int vflag) } } - // pre-compute variable values + // pre-compute variable values, wrap with clear/add + + modify->clearstep_compute(); if (xvarstr) { if (xvarstyle == EQUAL) dx = input->variable->compute_equal(xvar); @@ -596,6 +599,8 @@ void FixMove::initial_integrate(int vflag) else input->variable->compute_atom(vzvar,igroup,&velocity[0][2],3,0); } + modify->addstep_compute(update->ntimestep + 1); + // update x,v for (int i = 0; i < nlocal; i++) { diff --git a/src/fix_setforce.cpp b/src/fix_setforce.cpp index f9f30c868f..ce972a0c67 100644 --- a/src/fix_setforce.cpp +++ b/src/fix_setforce.cpp @@ -16,6 +16,7 @@ #include "fix_setforce.h" #include "atom.h" #include "update.h" +#include "modify.h" #include "domain.h" #include "region.h" #include "respa.h" @@ -222,7 +223,12 @@ void FixSetForce::post_force(int vflag) if (zstyle) f[i][2] = zvalue; } + // variable force, wrap with clear/add + } else { + + modify->clearstep_compute(); + if (xstyle == EQUAL) xvalue = input->variable->compute_equal(xvar); else if (xstyle == ATOM) input->variable->compute_atom(xvar,igroup,&sforce[0][0],3,0); @@ -233,6 +239,8 @@ void FixSetForce::post_force(int vflag) else if (zstyle == ATOM) input->variable->compute_atom(zvar,igroup,&sforce[0][2],3,0); + modify->addstep_compute(update->ntimestep + 1); + for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { if (iregion >= 0 && diff --git a/src/fix_setforce.h b/src/fix_setforce.h index f9f141c148..c8a493c624 100644 --- a/src/fix_setforce.h +++ b/src/fix_setforce.h @@ -45,7 +45,7 @@ class FixSetForce : public Fix { char *idregion; int xvar,yvar,zvar,xstyle,ystyle,zstyle; double foriginal[3],foriginal_all[3]; - int force_flag; + int varany,force_flag; int nlevels_respa; int maxatom; diff --git a/src/fix_wall.cpp b/src/fix_wall.cpp index 78632c99d8..3839b34192 100644 --- a/src/fix_wall.cpp +++ b/src/fix_wall.cpp @@ -21,6 +21,7 @@ #include "domain.h" #include "lattice.h" #include "update.h" +#include "modify.h" #include "respa.h" #include "error.h" @@ -145,10 +146,11 @@ FixWall::FixWall(LAMMPS *lmp, int narg, char **arg) : } } - // set time_depend if any wall positions are variable + // set time_depend and varflag if any wall positions are variable + varflag = 0; for (int m = 0; m < nwall; m++) - if (wallstyle[m] == VARIABLE) time_depend = 1; + if (wallstyle[m] == VARIABLE) time_depend = varflag = 1; eflag = 0; for (int m = 0; m <= nwall; m++) ewall[m] = 0.0; @@ -225,7 +227,9 @@ void FixWall::post_force(int vflag) for (int m = 0; m <= nwall; m++) ewall[m] = 0.0; // coord = current position of wall - // evaluate variable if necessary + // evaluate variable if necessary, wrap with clear/add + + if (varflag) modify->clearstep_compute(); double coord; for (int m = 0; m < nwall; m++) { @@ -235,6 +239,8 @@ void FixWall::post_force(int vflag) wall_particle(m,wallwhich[m],coord); } + + if (varflag) modify->addstep_compute(update->ntimestep + 1); } /* ---------------------------------------------------------------------- */ diff --git a/src/fix_wall.h b/src/fix_wall.h index 04abd315f2..8c0c39d024 100644 --- a/src/fix_wall.h +++ b/src/fix_wall.h @@ -41,11 +41,10 @@ class FixWall : public Fix { double coord0[6],epsilon[6],sigma[6],cutoff[6]; char *varstr[6]; int varindex[6]; - int eflag; + int eflag,varflag; double ewall[7],ewall_all[7]; int nlevels_respa; double dt; - int time_origin; }; } diff --git a/src/fix_wall_reflect.cpp b/src/fix_wall_reflect.cpp index 56bb32e270..95407231b0 100644 --- a/src/fix_wall_reflect.cpp +++ b/src/fix_wall_reflect.cpp @@ -16,6 +16,7 @@ #include "fix_wall_reflect.h" #include "atom.h" #include "comm.h" +#include "update.h" #include "modify.h" #include "domain.h" #include "lattice.h" @@ -132,10 +133,11 @@ FixWallReflect::FixWallReflect(LAMMPS *lmp, int narg, char **arg) : } } - // set time_depend if any wall positions are variable + // set time_depend and varflag if any wall positions are variable + varflag = 0; for (int m = 0; m < nwall; m++) - if (wallstyle[m] == VARIABLE) time_depend = 1; + if (wallstyle[m] == VARIABLE) time_depend = varflag = 1; } /* ---------------------------------------------------------------------- */ @@ -185,11 +187,16 @@ void FixWallReflect::post_integrate() int i,dim,side; double coord; + // coord = current position of wall + // evaluate variable if necessary, wrap with clear/add + double **x = atom->x; double **v = atom->v; int *mask = atom->mask; int nlocal = atom->nlocal; + if (varflag) modify->clearstep_compute(); + for (int m = 0; m < nwall; m++) { if (wallstyle[m] == VARIABLE) coord = input->variable->compute_equal(varindex[m]); @@ -213,4 +220,6 @@ void FixWallReflect::post_integrate() } } } + + if (varflag) modify->addstep_compute(update->ntimestep + 1); } diff --git a/src/fix_wall_reflect.h b/src/fix_wall_reflect.h index b0bda7b465..0bf98a33c0 100644 --- a/src/fix_wall_reflect.h +++ b/src/fix_wall_reflect.h @@ -38,6 +38,7 @@ class FixWallReflect : public Fix { double coord0[6]; char *varstr[6]; int varindex[6]; + int varflag; }; }