fix bug when no other post_force fixes are defined

This commit is contained in:
Steve Plimpton
2022-04-22 17:10:56 -06:00
parent 0ece11c491
commit a90c632ae2
5 changed files with 33 additions and 22 deletions

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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);
}

View File

@ -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);