standardize flags for energy/virial computations in forces

This commit is contained in:
Steve Plimpton
2020-11-16 08:13:33 -07:00
parent aaae3da12a
commit dd23db9369
12 changed files with 100 additions and 39 deletions

View File

@ -75,7 +75,16 @@ void Angle::init()
/* ----------------------------------------------------------------------
setup for energy, virial computation
see integrate::ev_set() for values of eflag (0-3) and vflag (0-6)
see integrate::ev_set() for bitwise settings of eflag/vflag
set the following flags, values are otherwise 0:
evflag = 1 if any bits of eflag or vflag are set
eflag_global = 1 if ENERGY_GLOBAL bit of eflag set
eflag_atom = 1 if ENERGY_ATOM bit of eflag set
eflag_either = 1 if eflag_global or eflag_atom is set
vflag_global = 1 if VIRIAL_PAIR or VIRIAL_FDOTR bit of vflag set
vflag_atom = 1 if VIRIAL_PERATOM bit of vflag set
cvflag_atom = 1 if VIRIAL_CENTROID bit of vflag set
vflag_either = 1 if any of vflag_global, vflag_atom, cvflag_atom is set
------------------------------------------------------------------------- */
void Angle::ev_setup(int eflag, int vflag, int alloc)

View File

@ -80,7 +80,15 @@ void Bond::init()
/* ----------------------------------------------------------------------
setup for energy, virial computation
see integrate::ev_set() for values of eflag (0-3) and vflag (0-6)
see integrate::ev_set() for bitwise settings of eflag/vflag
set the following flags, values are otherwise 0:
evflag = 1 if any bits of eflag or vflag are set
eflag_global = 1 if ENERGY_GLOBAL bit of eflag set
eflag_atom = 1 if ENERGY_ATOM bit of eflag set
eflag_either = 1 if eflag_global or eflag_atom is set
vflag_global = 1 if VIRIAL_PAIR or VIRIAL_FDOTR bit of vflag set
vflag_atom = 1 if VIRIAL_PERATOM or VIRIAL_CENTROID bit of vflag set
vflag_either = 1 if vflag_global or vflag_atom is set
------------------------------------------------------------------------- */
void Bond::ev_setup(int eflag, int vflag, int alloc)

View File

@ -126,7 +126,7 @@ void ComputeCentroidStressAtom::init()
// check if pair styles support centroid atom stress
if (pairflag && force->pair)
if (force->pair->centroidstressflag & 4)
if (force->pair->centroidstressflag == CENTROID_NOTAVAIL)
error->all(FLERR, "Pair style does not support compute centroid/stress/atom");
}
@ -178,7 +178,7 @@ void ComputeCentroidStressAtom::compute_peratom()
// per-atom virial and per-atom centroid virial are the same for two-body
// many-body pair styles not yet implemented
if (pairflag && force->pair && force->pair->compute_flag) {
if (force->pair->centroidstressflag & 2) {
if (force->pair->centroidstressflag == CENTROID_AVAIL) {
double **cvatom = force->pair->cvatom;
for (i = 0; i < npair; i++)
for (j = 0; j < 9; j++)

View File

@ -74,7 +74,16 @@ void Dihedral::init()
/* ----------------------------------------------------------------------
setup for energy, virial computation
see integrate::ev_set() for values of eflag (0-3) and vflag (0-6)
see integrate::ev_set() for bitwise settings of eflag/vflag
set the following flags, values are otherwise 0:
evflag = 1 if any bits of eflag or vflag are set
eflag_global = 1 if ENERGY_GLOBAL bit of eflag set
eflag_atom = 1 if ENERGY_ATOM bit of eflag set
eflag_either = 1 if eflag_global or eflag_atom is set
vflag_global = 1 if VIRIAL_PAIR or VIRIAL_FDOTR bit of vflag set
vflag_atom = 1 if VIRIAL_PERATOM bit of vflag set
cvflag_atom = 1 if VIRIAL_CENTROID bit of vflag set
vflag_either = 1 if any of vflag_global, vflag_atom, cvflag_atom is set
------------------------------------------------------------------------- */
void Dihedral::ev_setup(int eflag, int vflag, int alloc)

View File

@ -72,7 +72,16 @@ void Improper::init()
/* ----------------------------------------------------------------------
setup for energy, virial computation
see integrate::ev_set() for values of eflag (0-3) and vflag (0-6)
see integrate::ev_set() for bitwise settings of eflag/vflag
set the following flags, values are otherwise 0:
evflag = 1 if any bits of eflag or vflag are set
eflag_global = 1 if ENERGY_GLOBAL bit of eflag set
eflag_atom = 1 if ENERGY_ATOM bit of eflag set
eflag_either = 1 if eflag_global or eflag_atom is set
vflag_global = 1 if VIRIAL_PAIR or VIRIAL_FDOTR bit of vflag set
vflag_atom = 1 if VIRIAL_PERATOM bit of vflag set
cvflag_atom = 1 if VIRIAL_CENTROID bit of vflag set
vflag_either = 1 if any of vflag_global, vflag_atom, cvflag_atom is set
------------------------------------------------------------------------- */
void Improper::ev_setup(int eflag, int vflag, int alloc)

View File

@ -111,21 +111,18 @@ void Integrate::ev_setup()
/* ----------------------------------------------------------------------
set eflag,vflag for current iteration
based on computes that need energy/virial info on this timestep
invoke matchstep() on all timestep-dependent computes to clear their arrays
eflag/vflag based on computes that need info on this ntimestep
eflag = 0 = no energy computation
eflag = 1 = global energy only
eflag = 2 = per-atom energy only
eflag = 3 = both global and per-atom energy
vflag = 0 = no virial computation (pressure)
vflag = 1 = global virial with pair portion via sum of pairwise interactions
vflag = 2 = global virial with pair portion via F dot r including ghosts
vflag = 4 = per-atom virial only
vflag = 5 or 6 = both global and per-atom virial
vflag = 8 = per-atom centroid virial only
vflag = 9 or 10 = both global and per-atom centroid virial
vflag = 12 = both per-atom virial and per-atom centroid virial
vflag = 13 or 14 = global, per-atom virial and per-atom centroid virial
eflag: set any or no bits
ENERGY_GLOBAL bit for global energy
ENERGY_ATOM bit for per-atom energy
vflag: set any or no bits, but GLOBAL/FDOTR bit cannot both be set
VIRIAL_PAIR bit for global virial as sum of pairwise terms
VIRIAL_FDOTR bit for global virial via F dot r
VIRIAL_ATOM bit for per-atom virial
VIRIAL_CENTROID bit for per-atom centroid virial
all force components (pair,bond,angle,...,kspace) use eflag/vflag
in their ev_setup() method to set local energy/virial flags
------------------------------------------------------------------------- */
void Integrate::ev_set(bigint ntimestep)
@ -136,7 +133,7 @@ void Integrate::ev_set(bigint ntimestep)
int eflag_global = 0;
for (i = 0; i < nelist_global; i++)
if (elist_global[i]->matchstep(ntimestep)) flag = 1;
if (flag) eflag_global = 1;
if (flag) eflag_global = ENERGY_GLOBAL;
flag = 0;
int eflag_atom = 0;

View File

@ -214,7 +214,15 @@ void KSpace::pair_check()
/* ----------------------------------------------------------------------
setup for energy, virial computation
see integrate::ev_set() for values of eflag (0-3) and vflag (0-6)
see integrate::ev_set() for bitwise settings of eflag/vflag
set the following flags, values are otherwise 0:
evflag = 1 if any bits of eflag or vflag are set
eflag_global = 1 if ENERGY_GLOBAL bit of eflag set
eflag_atom = 1 if ENERGY_ATOM bit of eflag set
eflag_either = 1 if eflag_global or eflag_atom is set
vflag_global = 1 if VIRIAL_PAIR or VIRIAL_FDOTR bit of vflag set
vflag_atom = 1 if VIRIAL_PERATOM bit of vflag set
vflag_either = 1 if vflag_global or vflag_atom is set
------------------------------------------------------------------------- */
void KSpace::ev_setup(int eflag, int vflag, int alloc)

View File

@ -144,11 +144,12 @@ void Min::init()
requestor = nullptr;
// virial_style:
// 1 if computed explicitly by pair->compute via sum over pair interactions
// 2 if computed implicitly by pair->virial_compute via sum over ghost atoms
// VIRIAL_PAIR if computed explicitly in pair via sum over pair interactions
// VIRIAL_FDOTR if computed implicitly in pair by
// virial_fdotr_compute() via sum over ghosts
if (force->newton_pair) virial_style = 2;
else virial_style = 1;
if (force->newton_pair) virial_style = VIRIAL_FDOTR;
else virial_style = VIRIAL_PAIR;
// setup lists of computes for global and per-atom PE and pressure

View File

@ -74,9 +74,10 @@ Pair::Pair(LAMMPS *lmp) : Pointers(lmp)
setflag = nullptr;
cutsq = nullptr;
ewaldflag = pppmflag = msmflag = dispersionflag = tip4pflag = dipoleflag = spinflag = 0;
ewaldflag = pppmflag = msmflag = dispersionflag =
tip4pflag = dipoleflag = spinflag = 0;
reinitflag = 1;
centroidstressflag = 4;
centroidstressflag = CENTROID_SAME;
// pair_modify settings
@ -776,7 +777,24 @@ void Pair::del_tally_callback(Compute *ptr)
/* ----------------------------------------------------------------------
setup for energy, virial computation
see integrate::ev_set() for values of eflag (0-3) and vflag (0-6)
see integrate::ev_set() for bitwise settings of eflag/vflag
set the following flags, values are otherwise 0:
evflag = 1 if any bits of eflag or vflag are set
eflag_global = 1 if ENERGY_GLOBAL bit of eflag set
eflag_atom = 1 if ENERGY_ATOM bit of eflag set
eflag_either = 1 if eflag_global or eflag_atom is set
vflag_global = 1 if VIRIAL_PAIR bit of vflag set
vflag_global = 2 if VIRIAL_FDOTR bit of vflag set
vflag_atom = 1 if VIRIAL_PERATOM bit of vflag set
vflag_atom = 1 if VIRIAL_CENTROID bit of vflag set
and centroidstressflag != CENTROID_AVAIL
cvflag_atom = 1 if VIRIAL_CENTROID bit of vflag set
and centroidstressflag = CENTROID_AVAIL
vflag_either = 1 if any of vflag_global, vflag_atom, cvflag_atom is set
centroidstressflag is set by the pair style to one of these values:
CENTROID_SAME = same as two-body stress
CENTROID_AVAIL = different and implemented
CENTROID_NOTAVAIL = different but not yet implemented
------------------------------------------------------------------------- */
void Pair::ev_setup(int eflag, int vflag, int alloc)

View File

@ -68,10 +68,10 @@ class Pair : protected Pointers {
int spinflag; // 1 if compatible with spin solver
int reinitflag; // 1 if compatible with fix adapt and alike
int centroidstressflag; // compatibility with centroid atomic stress
// 1 if same as two-body atomic stress
// 2 if implemented and different from two-body
// 4 if not compatible/implemented
int centroidstressflag; // centroid atomic compared to two-body stress
// CENTROID_SAME = same as two-body stress
// CENTROID_AVAIL = different and implemented
// CENTROID_NOTAVAIL = different, not yet implemented
int tail_flag; // pair_modify flag for LJ tail correction
double etail,ptail; // energy/pressure tail corrections

View File

@ -311,9 +311,10 @@ void Respa::init()
if (force->pair && force->pair->respa_enable == 0)
error->all(FLERR,"Pair style does not support rRESPA inner/middle/outer");
// virial_style = 1 (explicit) since never computed implicitly like Verlet
// virial_style = VIRIAL_PAIR (explicit)
// since never computed implicitly with virial_fdotr_compute() like Verlet
virial_style = 1;
virial_style = VIRIAL_PAIR;
// setup lists of computes for global and per-atom PE and pressure

View File

@ -54,11 +54,12 @@ void Verlet::init()
error->warning(FLERR,"No fixes defined, atoms won't move");
// virial_style:
// 1 if computed explicitly by pair->compute via sum over pair interactions
// 2 if computed implicitly by pair->virial_fdotr_compute via sum over ghosts
// VIRIAL_PAIR if computed explicitly in pair via sum over pair interactions
// VIRIAL_FDOTR if computed implicitly in pair by
// virial_fdotr_compute() via sum over ghosts
if (force->newton_pair) virial_style = 2;
else virial_style = 1;
if (force->newton_pair) virial_style = VIRIAL_FDOTR;
else virial_style = VIRIAL_PAIR;
// setup lists of computes for global and per-atom PE and pressure