fix bug when no other post_force fixes are defined
This commit is contained in:
@ -186,7 +186,6 @@ void FixGroup::set_group()
|
||||
// change the compute result since it will not be re-invoked at end-of-step,
|
||||
// e.g. if compute pe/atom includes pe contributions from fixes
|
||||
|
||||
|
||||
double *var = nullptr;
|
||||
int *ivector = nullptr;
|
||||
double *dvector = nullptr;
|
||||
|
||||
@ -51,22 +51,22 @@ Modify::Modify(LAMMPS *lmp) : Pointers(lmp)
|
||||
nfix = maxfix = 0;
|
||||
n_initial_integrate = n_post_integrate = 0;
|
||||
n_pre_exchange = n_pre_neighbor = n_post_neighbor = 0;
|
||||
n_pre_force = n_pre_reverse = n_post_force = 0;
|
||||
n_pre_force = n_pre_reverse = n_post_force_any = 0;
|
||||
n_final_integrate = n_end_of_step = 0;
|
||||
n_energy_couple = n_energy_global = n_energy_atom = 0;
|
||||
n_initial_integrate_respa = n_post_integrate_respa = 0;
|
||||
n_pre_force_respa = n_post_force_respa = n_final_integrate_respa = 0;
|
||||
n_pre_force_respa = n_post_force_respa_any = n_final_integrate_respa = 0;
|
||||
n_min_pre_exchange = n_min_pre_force = n_min_pre_reverse = 0;
|
||||
n_min_post_force = n_min_energy = 0;
|
||||
|
||||
n_post_force_group = 0;
|
||||
n_timeflag = -1;
|
||||
|
||||
fix = nullptr;
|
||||
fmask = nullptr;
|
||||
list_initial_integrate = list_post_integrate = nullptr;
|
||||
list_pre_exchange = list_pre_neighbor = list_post_neighbor = nullptr;
|
||||
list_pre_force = list_pre_reverse = list_post_force = nullptr;
|
||||
list_pre_force = list_pre_reverse = nullptr;
|
||||
list_post_force = list_post_force_group = nullptr;
|
||||
list_final_integrate = list_end_of_step = nullptr;
|
||||
list_energy_couple = list_energy_global = list_energy_atom = nullptr;
|
||||
list_initial_integrate_respa = list_post_integrate_respa = nullptr;
|
||||
@ -78,8 +78,6 @@ Modify::Modify(LAMMPS *lmp) : Pointers(lmp)
|
||||
|
||||
end_of_step_every = nullptr;
|
||||
|
||||
list_post_force_group = nullptr;
|
||||
|
||||
list_timeflag = nullptr;
|
||||
|
||||
nfix_restart_global = 0;
|
||||
@ -143,6 +141,7 @@ Modify::~Modify()
|
||||
delete[] list_pre_force;
|
||||
delete[] list_pre_reverse;
|
||||
delete[] list_post_force;
|
||||
delete[] list_post_force_group;
|
||||
delete[] list_final_integrate;
|
||||
delete[] list_end_of_step;
|
||||
delete[] list_energy_couple;
|
||||
@ -160,7 +159,6 @@ Modify::~Modify()
|
||||
delete[] list_min_pre_reverse;
|
||||
delete[] list_min_post_force;
|
||||
delete[] list_min_energy;
|
||||
delete[] list_post_force_group;
|
||||
|
||||
delete[] end_of_step_every;
|
||||
delete[] list_timeflag;
|
||||
@ -226,12 +224,12 @@ void Modify::init()
|
||||
list_init(PRE_FORCE, n_pre_force, list_pre_force);
|
||||
list_init(PRE_REVERSE, n_pre_reverse, list_pre_reverse);
|
||||
list_init(POST_FORCE, n_post_force, list_post_force);
|
||||
list_init_post_force_group(n_post_force_group, list_post_force_group);
|
||||
list_init(FINAL_INTEGRATE, n_final_integrate, list_final_integrate);
|
||||
list_init_end_of_step(END_OF_STEP, n_end_of_step, list_end_of_step);
|
||||
list_init_energy_couple(n_energy_couple, list_energy_couple);
|
||||
list_init_energy_global(n_energy_global, list_energy_global);
|
||||
list_init_energy_atom(n_energy_atom, list_energy_atom);
|
||||
list_init_post_force_group(n_post_force_group, list_post_force_group);
|
||||
|
||||
list_init(INITIAL_INTEGRATE_RESPA, n_initial_integrate_respa, list_initial_integrate_respa);
|
||||
list_init(POST_INTEGRATE_RESPA, n_post_integrate_respa, list_post_integrate_respa);
|
||||
@ -247,6 +245,11 @@ void Modify::init()
|
||||
list_init(MIN_POST_FORCE, n_min_post_force, list_min_post_force);
|
||||
list_init(MIN_ENERGY, n_min_energy, list_min_energy);
|
||||
|
||||
// two post_force_any counters used by integrators add in post_force_group
|
||||
|
||||
n_post_force_any = n_post_force + n_post_force_group;
|
||||
n_post_force_respa_any = n_post_force_respa + n_post_force_group;
|
||||
|
||||
// create list of computes that store invocation times
|
||||
|
||||
list_init_compute();
|
||||
@ -448,6 +451,7 @@ void Modify::pre_reverse(int eflag, int vflag)
|
||||
/* ----------------------------------------------------------------------
|
||||
post_force call, only for relevant fixes
|
||||
first call any instances of fix GROUP if they exist
|
||||
they are not in n_post_force count
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
void Modify::post_force(int vflag)
|
||||
@ -457,7 +461,10 @@ void Modify::post_force(int vflag)
|
||||
fix[list_post_force_group[i]]->post_force(vflag);
|
||||
}
|
||||
|
||||
for (int i = 0; i < n_post_force; i++) fix[list_post_force[i]]->post_force(vflag);
|
||||
if (n_post_force) {
|
||||
for (int i = 0; i < n_post_force; i++)
|
||||
fix[list_post_force[i]]->post_force(vflag);
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
@ -607,9 +614,11 @@ void Modify::post_force_respa(int vflag, int ilevel, int iloop)
|
||||
fix[list_post_force_group[i]]->post_force_respa(vflag, ilevel, iloop);
|
||||
}
|
||||
|
||||
if (n_post_force_respa) {
|
||||
for (int i = 0; i < n_post_force_respa; i++)
|
||||
fix[list_post_force_respa[i]]->post_force_respa(vflag, ilevel, iloop);
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
2nd half of rRESPA integrate call, only for relevant fixes
|
||||
|
||||
14
src/modify.h
14
src/modify.h
@ -33,11 +33,11 @@ class Modify : protected Pointers {
|
||||
public:
|
||||
int n_initial_integrate, n_post_integrate, n_pre_exchange;
|
||||
int n_pre_neighbor, n_post_neighbor;
|
||||
int n_pre_force, n_pre_reverse, n_post_force;
|
||||
int n_pre_force, n_pre_reverse, n_post_force_any;
|
||||
int n_final_integrate, n_end_of_step;
|
||||
int n_energy_couple, n_energy_global, n_energy_atom;
|
||||
int n_initial_integrate_respa, n_post_integrate_respa;
|
||||
int n_pre_force_respa, n_post_force_respa, n_final_integrate_respa;
|
||||
int n_pre_force_respa, n_post_force_respa_any, n_final_integrate_respa;
|
||||
int n_min_pre_exchange, n_min_pre_neighbor, n_min_post_neighbor;
|
||||
int n_min_pre_force, n_min_pre_reverse, n_min_post_force, n_min_energy;
|
||||
|
||||
@ -147,11 +147,16 @@ class Modify : protected Pointers {
|
||||
double memory_usage();
|
||||
|
||||
protected:
|
||||
// internal fix counts
|
||||
|
||||
int n_post_force, n_post_force_group, n_post_force_respa;
|
||||
|
||||
// lists of fixes to apply at different stages of timestep
|
||||
|
||||
int *list_initial_integrate, *list_post_integrate;
|
||||
int *list_pre_exchange, *list_pre_neighbor, *list_post_neighbor;
|
||||
int *list_pre_force, *list_pre_reverse, *list_post_force;
|
||||
int *list_pre_force, *list_pre_reverse;
|
||||
int *list_post_force, *list_post_force_group;
|
||||
int *list_final_integrate, *list_end_of_step;
|
||||
int *list_energy_couple, *list_energy_global, *list_energy_atom;
|
||||
int *list_initial_integrate_respa, *list_post_integrate_respa;
|
||||
@ -163,9 +168,6 @@ class Modify : protected Pointers {
|
||||
|
||||
int *end_of_step_every;
|
||||
|
||||
int n_post_force_group; // list of fix GROUPs for post_force invocation
|
||||
int *list_post_force_group;
|
||||
|
||||
int n_timeflag; // list of computes that store time invocation
|
||||
int *list_timeflag;
|
||||
|
||||
|
||||
@ -372,7 +372,7 @@ void Respa::setup(int flag)
|
||||
mesg += fmt::format(" {}:{}", ilevel + 1, step[ilevel]);
|
||||
|
||||
mesg += "\n r-RESPA fixes :";
|
||||
for (int l = 0; l < modify->n_post_force_respa; ++l) {
|
||||
for (int l = 0; l < modify->n_post_force_respa_any; ++l) {
|
||||
Fix *f = modify->get_fix_by_index(modify->list_post_force_respa[l]);
|
||||
if (f->respa_level >= 0)
|
||||
mesg += fmt::format(" {}:{}[{}]", MIN(f->respa_level + 1, nlevels), f->style, f->id);
|
||||
@ -704,7 +704,8 @@ void Respa::recurse(int ilevel)
|
||||
timer->stamp(Timer::COMM);
|
||||
}
|
||||
timer->stamp();
|
||||
if (modify->n_post_force_respa) modify->post_force_respa(vflag, ilevel, iloop);
|
||||
if (modify->n_post_force_respa_any)
|
||||
modify->post_force_respa(vflag, ilevel, iloop);
|
||||
modify->final_integrate_respa(ilevel, iloop);
|
||||
timer->stamp(Timer::MODIFY);
|
||||
}
|
||||
|
||||
@ -237,7 +237,7 @@ void Verlet::run(int n)
|
||||
int n_post_neighbor = modify->n_post_neighbor;
|
||||
int n_pre_force = modify->n_pre_force;
|
||||
int n_pre_reverse = modify->n_pre_reverse;
|
||||
int n_post_force = modify->n_post_force;
|
||||
int n_post_force_any = modify->n_post_force_any;
|
||||
int n_end_of_step = modify->n_end_of_step;
|
||||
|
||||
if (atom->sortfreq > 0) sortflag = 1;
|
||||
@ -344,7 +344,7 @@ void Verlet::run(int n)
|
||||
|
||||
// force modifications, final time integration, diagnostics
|
||||
|
||||
if (n_post_force) modify->post_force(vflag);
|
||||
if (n_post_force_any) modify->post_force(vflag);
|
||||
modify->final_integrate();
|
||||
if (n_end_of_step) modify->end_of_step();
|
||||
timer->stamp(Timer::MODIFY);
|
||||
|
||||
Reference in New Issue
Block a user