From f6a819580c6b0fc145b01ba8ef0fcf924f30e11f Mon Sep 17 00:00:00 2001 From: Steve Plimpton <sjplimp@sandia.gov> Date: Fri, 6 Jan 2017 09:57:27 -0700 Subject: [PATCH] pair TIP4P bug fix for cutoffs >> box size --- src/KOKKOS/modify_kokkos.cpp | 70 +++++++++++++++++- src/KOKKOS/modify_kokkos.h | 3 + src/KSPACE/pair_lj_cut_tip4p_long.cpp | 40 ++++++---- src/KSPACE/pair_lj_long_tip4p_long.cpp | 40 ++++++---- src/KSPACE/pair_tip4p_long.cpp | 40 ++++++---- src/KSPACE/pppm_disp_tip4p.cpp | 7 +- src/KSPACE/pppm_tip4p.cpp | 7 +- src/MOLECULE/fix_cmap.cpp | 18 ++++- src/MOLECULE/fix_cmap.h | 1 + src/MOLECULE/pair_lj_cut_tip4p_cut.cpp | 42 ++++++----- src/MOLECULE/pair_tip4p_cut.cpp | 40 ++++++---- src/OPT/pair_lj_cut_tip4p_long_opt.cpp | 38 ++++++---- src/QEQ/fix_qeq.cpp | 7 -- src/QEQ/fix_qeq.h | 1 - src/REPLICA/compute_event_displace.cpp | 5 +- src/REPLICA/fix_neb.cpp | 2 +- src/USER-ATC/fix_atc.cpp | 23 ------ src/USER-ATC/fix_atc.h | 2 - src/USER-DPD/fix_shardlow.cpp | 7 -- src/USER-DPD/fix_shardlow.h | 1 - src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp | 40 ++++++---- src/USER-FEP/pair_tip4p_long_soft.cpp | 40 ++++++---- src/USER-INTEL/fix_intel.cpp | 7 ++ src/USER-INTEL/fix_intel.h | 2 + src/USER-OMP/pair_lj_cut_tip4p_cut_omp.cpp | 47 ++++++------ src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp | 46 ++++++------ .../pair_lj_cut_tip4p_long_soft_omp.cpp | 46 ++++++------ src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp | 64 +++++++++------- src/USER-OMP/pair_tip4p_cut_omp.cpp | 47 ++++++------ src/USER-OMP/pair_tip4p_long_omp.cpp | 48 ++++++------ src/USER-OMP/pair_tip4p_long_soft_omp.cpp | 48 ++++++------ src/USER-OMP/pppm_disp_tip4p_omp.cpp | 7 +- src/USER-OMP/pppm_tip4p_omp.cpp | 7 +- src/USER-REAXC/fix_qeq_reax.cpp | 7 -- src/USER-REAXC/fix_qeq_reax.h | 1 - src/domain.cpp | 40 ++++++---- src/finish.cpp | 73 +++++++++++++++++-- src/fix.h | 40 +++++----- src/fix_restrain.cpp | 3 +- src/min.cpp | 13 +++- src/modify.cpp | 38 ++++++++-- src/modify.h | 6 +- src/respa.cpp | 10 ++- src/run.cpp | 1 + src/verlet.cpp | 4 +- 45 files changed, 663 insertions(+), 416 deletions(-) diff --git a/src/KOKKOS/modify_kokkos.cpp b/src/KOKKOS/modify_kokkos.cpp index 9a035ac20c..ec3831dff8 100644 --- a/src/KOKKOS/modify_kokkos.cpp +++ b/src/KOKKOS/modify_kokkos.cpp @@ -81,7 +81,7 @@ void ModifyKokkos::setup_pre_exchange() atomKK->sync(fix[list_min_pre_exchange[i]]->execution_space, fix[list_min_pre_exchange[i]]->datamask_read); if (!fix[list_min_pre_exchange[i]]->kokkosable) lmp->kokkos->auto_sync = 1; - fix[list_min_pre_exchange[i]]->min_setup_pre_exchange(); + fix[list_min_pre_exchange[i]]->setup_pre_exchange(); lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_pre_exchange[i]]->execution_space, fix[list_min_pre_exchange[i]]->datamask_modify); @@ -110,7 +110,7 @@ void ModifyKokkos::setup_pre_neighbor() atomKK->sync(fix[list_min_pre_neighbor[i]]->execution_space, fix[list_min_pre_neighbor[i]]->datamask_read); if (!fix[list_min_pre_neighbor[i]]->kokkosable) lmp->kokkos->auto_sync = 1; - fix[list_min_pre_neighbor[i]]->min_setup_pre_neighbor(); + fix[list_min_pre_neighbor[i]]->setup_pre_neighbor(); lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_pre_neighbor[i]]->execution_space, fix[list_min_pre_neighbor[i]]->datamask_modify); @@ -139,13 +139,42 @@ void ModifyKokkos::setup_pre_force(int vflag) atomKK->sync(fix[list_min_pre_force[i]]->execution_space, fix[list_min_pre_force[i]]->datamask_read); if (!fix[list_min_pre_force[i]]->kokkosable) lmp->kokkos->auto_sync = 1; - fix[list_min_pre_force[i]]->min_setup_pre_force(vflag); + fix[list_min_pre_force[i]]->setup_pre_force(vflag); lmp->kokkos->auto_sync = 0; atomKK->modified(fix[list_min_pre_force[i]]->execution_space, fix[list_min_pre_force[i]]->datamask_modify); } } +/* ---------------------------------------------------------------------- + setup pre_reverse call, only for fixes that define pre_reverse + called from Verlet, RESPA, Min +------------------------------------------------------------------------- */ + +void ModifyKokkos::setup_pre_reverse(int eflag, int vflag) +{ + if (update->whichflag == 1) + for (int i = 0; i < n_pre_reverse; i++) { + atomKK->sync(fix[list_pre_reverse[i]]->execution_space, + fix[list_pre_reverse[i]]->datamask_read); + if (!fix[list_pre_reverse[i]]->kokkosable) lmp->kokkos->auto_sync = 1; + fix[list_pre_reverse[i]]->setup_pre_reverse(eflag,vflag); + lmp->kokkos->auto_sync = 0; + atomKK->modified(fix[list_pre_reverse[i]]->execution_space, + fix[list_pre_reverse[i]]->datamask_modify); + } + else if (update->whichflag == 2) + for (int i = 0; i < n_min_pre_reverse; i++) { + atomKK->sync(fix[list_min_pre_reverse[i]]->execution_space, + fix[list_min_pre_reverse[i]]->datamask_read); + if (!fix[list_min_pre_reverse[i]]->kokkosable) lmp->kokkos->auto_sync = 1; + fix[list_min_pre_reverse[i]]->setup_pre_reverse(eflag,vflag); + lmp->kokkos->auto_sync = 0; + atomKK->modified(fix[list_min_pre_reverse[i]]->execution_space, + fix[list_min_pre_reverse[i]]->datamask_modify); + } +} + /* ---------------------------------------------------------------------- 1st half of integrate call, only for relevant fixes ------------------------------------------------------------------------- */ @@ -231,6 +260,23 @@ void ModifyKokkos::pre_force(int vflag) } } +/* ---------------------------------------------------------------------- + pre_reverse call, only for relevant fixes +------------------------------------------------------------------------- */ + +void ModifyKokkos::pre_reverse(int eflag, int vflag) +{ + for (int i = 0; i < n_pre_reverse; i++) { + atomKK->sync(fix[list_pre_reverse[i]]->execution_space, + fix[list_pre_reverse[i]]->datamask_read); + if (!fix[list_pre_reverse[i]]->kokkosable) lmp->kokkos->auto_sync = 1; + fix[list_pre_reverse[i]]->pre_reverse(eflag,vflag); + lmp->kokkos->auto_sync = 0; + atomKK->modified(fix[list_pre_reverse[i]]->execution_space, + fix[list_pre_reverse[i]]->datamask_modify); + } +} + /* ---------------------------------------------------------------------- post_force call, only for relevant fixes ------------------------------------------------------------------------- */ @@ -476,6 +522,23 @@ void ModifyKokkos::min_pre_force(int vflag) } } +/* ---------------------------------------------------------------------- + minimizer pre-reverse call, only for relevant fixes +------------------------------------------------------------------------- */ + +void ModifyKokkos::min_pre_reverse(int eflag, int vflag) +{ + for (int i = 0; i < n_min_pre_reverse; i++) { + atomKK->sync(fix[list_min_pre_reverse[i]]->execution_space, + fix[list_min_pre_reverse[i]]->datamask_read); + if (!fix[list_min_pre_reverse[i]]->kokkosable) lmp->kokkos->auto_sync = 1; + fix[list_min_pre_reverse[i]]->min_pre_reverse(eflag,vflag); + lmp->kokkos->auto_sync = 0; + atomKK->modified(fix[list_min_pre_reverse[i]]->execution_space, + fix[list_min_pre_reverse[i]]->datamask_modify); + } +} + /* ---------------------------------------------------------------------- minimizer force adjustment call, only for relevant fixes ------------------------------------------------------------------------- */ @@ -658,4 +721,3 @@ int ModifyKokkos::min_reset_ref() } return itmpall; } - diff --git a/src/KOKKOS/modify_kokkos.h b/src/KOKKOS/modify_kokkos.h index b8e5f8de30..32dfb2fd97 100644 --- a/src/KOKKOS/modify_kokkos.h +++ b/src/KOKKOS/modify_kokkos.h @@ -26,12 +26,14 @@ class ModifyKokkos : public Modify { void setup_pre_exchange(); void setup_pre_neighbor(); void setup_pre_force(int); + void setup_pre_reverse(int, int); void initial_integrate(int); void post_integrate(); void pre_decide(); void pre_exchange(); void pre_neighbor(); void pre_force(int); + void pre_reverse(int,int); void post_force(int); void final_integrate(); void end_of_step(); @@ -48,6 +50,7 @@ class ModifyKokkos : public Modify { void min_pre_exchange(); void min_pre_neighbor(); void min_pre_force(int); + void min_pre_reverse(int,int); void min_post_force(int); double min_energy(double *); diff --git a/src/KSPACE/pair_lj_cut_tip4p_long.cpp b/src/KSPACE/pair_lj_cut_tip4p_long.cpp index 6e855e41f0..146d4e6f37 100644 --- a/src/KSPACE/pair_lj_cut_tip4p_long.cpp +++ b/src/KSPACE/pair_lj_cut_tip4p_long.cpp @@ -88,8 +88,8 @@ void PairLJCutTIP4PLong::compute(int eflag, int vflag) double r,r2inv,r6inv,forcecoul,forcelj,cforce; double factor_coul,factor_lj; double grij,expm2,prefactor,t,erfc; - double fO[3],fH[3],fd[3],v[6],xH1[3],xH2[3]; - double *x1,*x2; + double fO[3],fH[3],fd[3],v[6]; + double *x1,*x2,*xH1,*xH2; int *ilist,*jlist,*numneigh,**firstneigh; double rsq; @@ -146,14 +146,20 @@ void PairLJCutTIP4PLong::compute(int eflag, int vflag) if (itype == typeO) { if (hneigh[i][0] < 0) { - hneigh[i][0] = iH1 = atom->map(tag[i] + 1); - hneigh[i][1] = iH2 = atom->map(tag[i] + 2); - hneigh[i][2] = 1; + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite(x[i],x[iH1],x[iH2],newsite[i]); + hneigh[i][0] = iH1; + hneigh[i][1] = iH2; + hneigh[i][2] = 1; + } else { iH1 = hneigh[i][0]; iH2 = hneigh[i][1]; @@ -216,14 +222,20 @@ void PairLJCutTIP4PLong::compute(int eflag, int vflag) if (jtype == typeO) { if (hneigh[j][0] < 0) { - hneigh[j][0] = jH1 = atom->map(tag[j] + 1); - hneigh[j][1] = jH2 = atom->map(tag[j] + 2); - hneigh[j][2] = 1; + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite(x[j],x[jH1],x[jH2],newsite[j]); + hneigh[j][0] = jH1; + hneigh[j][1] = jH2; + hneigh[j][2] = 1; + } else { jH1 = hneigh[j][0]; jH2 = hneigh[j][1]; @@ -327,9 +339,8 @@ void PairLJCutTIP4PLong::compute(int eflag, int vflag) f[iH2][2] += fH[2]; if (vflag) { - domain->closest_image(x[i],x[iH1],xH1); - domain->closest_image(x[i],x[iH2],xH2); - + xH1 = x[iH1]; + xH2 = x[iH2]; v[0] = x[i][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] = x[i][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] = x[i][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -385,9 +396,8 @@ void PairLJCutTIP4PLong::compute(int eflag, int vflag) f[jH2][2] += fH[2]; if (vflag) { - domain->closest_image(x[j],x[jH1],xH1); - domain->closest_image(x[j],x[jH2],xH2); - + xH1 = x[jH1]; + xH2 = x[jH2]; v[0] += x[j][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] += x[j][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] += x[j][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -565,12 +575,10 @@ void PairLJCutTIP4PLong::compute_newsite(double *xO, double *xH1, double delx1 = xH1[0] - xO[0]; double dely1 = xH1[1] - xO[1]; double delz1 = xH1[2] - xO[2]; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2[0] - xO[0]; double dely2 = xH2[1] - xO[1]; double delz2 = xH2[2] - xO[2]; - domain->minimum_image(delx2,dely2,delz2); xM[0] = xO[0] + alpha * 0.5 * (delx1 + delx2); xM[1] = xO[1] + alpha * 0.5 * (dely1 + dely2); diff --git a/src/KSPACE/pair_lj_long_tip4p_long.cpp b/src/KSPACE/pair_lj_long_tip4p_long.cpp index b8ce8ece4c..c3d95c37a6 100644 --- a/src/KSPACE/pair_lj_long_tip4p_long.cpp +++ b/src/KSPACE/pair_lj_long_tip4p_long.cpp @@ -86,8 +86,8 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) double r,r2inv,forcecoul,forcelj,cforce; double factor_coul; double grij,expm2,prefactor,t,erfc; - double fO[3],fH[3],fd[3],v[6],xH1[3],xH2[3];// f1[3]; - double *x1,*x2; + double fO[3],fH[3],fd[3],v[6]; + double *x1,*x2,*xH1,*xH2; int *ilist,*jlist,*numneigh,**firstneigh; double rsq; @@ -145,14 +145,20 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) itype = type[i]; if (itype == typeO) { if (hneigh[i][0] < 0) { - hneigh[i][0] = iH1 = atom->map(tag[i] + 1); - hneigh[i][1] = iH2 = atom->map(tag[i] + 2); - hneigh[i][2] = 1; + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite(x[i],x[iH1],x[iH2],newsite[i]); + hneigh[i][0] = iH1; + hneigh[i][1] = iH2; + hneigh[i][2] = 1; + } else { iH1 = hneigh[i][0]; iH2 = hneigh[i][1]; @@ -253,14 +259,20 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) if (itype == typeO || jtype == typeO) { if (jtype == typeO) { if (hneigh[j][0] < 0) { - hneigh[j][0] = jH1 = atom->map(tag[j] + 1); - hneigh[j][1] = jH2 = atom->map(tag[j] + 2); - hneigh[j][2] = 1; + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite(x[j],x[jH1],x[jH2],newsite[j]); + hneigh[j][0] = jH1; + hneigh[j][1] = jH2; + hneigh[j][2] = 1; + } else { jH1 = hneigh[j][0]; jH2 = hneigh[j][1]; @@ -365,9 +377,8 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) f[iH2][2] += fH[2]; if (vflag) { - domain->closest_image(x[i],x[iH1],xH1); - domain->closest_image(x[i],x[iH2],xH2); - + xH1 = x[iH1]; + xH2 = x[iH2]; v[0] = x[i][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] = x[i][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] = x[i][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -423,9 +434,8 @@ void PairLJLongTIP4PLong::compute(int eflag, int vflag) f[jH2][2] += fH[2]; if (vflag) { - domain->closest_image(x[j],x[jH1],xH1); - domain->closest_image(x[j],x[jH2],xH2); - + xH1 = x[jH1]; + xH2 = x[jH2]; v[0] += x[j][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] += x[j][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] += x[j][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -1548,12 +1558,10 @@ void PairLJLongTIP4PLong::compute_newsite(double *xO, double *xH1, double delx1 = xH1[0] - xO[0]; double dely1 = xH1[1] - xO[1]; double delz1 = xH1[2] - xO[2]; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2[0] - xO[0]; double dely2 = xH2[1] - xO[1]; double delz2 = xH2[2] - xO[2]; - domain->minimum_image(delx2,dely2,delz2); xM[0] = xO[0] + alpha * 0.5 * (delx1 + delx2); xM[1] = xO[1] + alpha * 0.5 * (dely1 + dely2); diff --git a/src/KSPACE/pair_tip4p_long.cpp b/src/KSPACE/pair_tip4p_long.cpp index 0753a3f34d..1dd57ce822 100644 --- a/src/KSPACE/pair_tip4p_long.cpp +++ b/src/KSPACE/pair_tip4p_long.cpp @@ -84,8 +84,8 @@ void PairTIP4PLong::compute(int eflag, int vflag) double r,r2inv,forcecoul,cforce; double factor_coul; double grij,expm2,prefactor,t,erfc; - double fO[3],fH[3],fd[3],v[6],xH1[3],xH2[3]; - double *x1,*x2; + double fO[3],fH[3],fd[3],v[6]; + double *x1,*x2,*xH1,*xH2; int *ilist,*jlist,*numneigh,**firstneigh; double rsq; @@ -140,14 +140,20 @@ void PairTIP4PLong::compute(int eflag, int vflag) if (itype == typeO) { if (hneigh[i][0] < 0) { - hneigh[i][0] = iH1 = atom->map(tag[i] + 1); - hneigh[i][1] = iH2 = atom->map(tag[i] + 2); - hneigh[i][2] = 1; + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite(x[i],x[iH1],x[iH2],newsite[i]); + hneigh[i][0] = iH1; + hneigh[i][1] = iH2; + hneigh[i][2] = 1; + } else { iH1 = hneigh[i][0]; iH2 = hneigh[i][1]; @@ -184,14 +190,20 @@ void PairTIP4PLong::compute(int eflag, int vflag) if (jtype == typeO) { if (hneigh[j][0] < 0) { - hneigh[j][0] = jH1 = atom->map(tag[j] + 1); - hneigh[j][1] = jH2 = atom->map(tag[j] + 2); - hneigh[j][2] = 1; + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite(x[j],x[jH1],x[jH2],newsite[j]); + hneigh[j][0] = jH1; + hneigh[j][1] = jH2; + hneigh[j][2] = 1; + } else { jH1 = hneigh[j][0]; jH2 = hneigh[j][1]; @@ -295,9 +307,8 @@ void PairTIP4PLong::compute(int eflag, int vflag) f[iH2][2] += fH[2]; if (vflag) { - domain->closest_image(x[i],x[iH1],xH1); - domain->closest_image(x[i],x[iH2],xH2); - + xH1 = x[iH1]; + xH2 = x[iH2]; v[0] = x[i][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] = x[i][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] = x[i][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -353,9 +364,8 @@ void PairTIP4PLong::compute(int eflag, int vflag) f[jH2][2] += fH[2]; if (vflag) { - domain->closest_image(x[j],x[jH1],xH1); - domain->closest_image(x[j],x[jH2],xH2); - + xH1 = x[jH1]; + xH2 = x[jH2]; v[0] += x[j][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] += x[j][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] += x[j][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -488,12 +498,10 @@ void PairTIP4PLong::compute_newsite(double *xO, double *xH1, double delx1 = xH1[0] - xO[0]; double dely1 = xH1[1] - xO[1]; double delz1 = xH1[2] - xO[2]; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2[0] - xO[0]; double dely2 = xH2[1] - xO[1]; double delz2 = xH2[2] - xO[2]; - domain->minimum_image(delx2,dely2,delz2); xM[0] = xO[0] + alpha * 0.5 * (delx1 + delx2); xM[1] = xO[1] + alpha * 0.5 * (dely1 + dely2); diff --git a/src/KSPACE/pppm_disp_tip4p.cpp b/src/KSPACE/pppm_disp_tip4p.cpp index d5a85abb4c..cf3a3943b9 100644 --- a/src/KSPACE/pppm_disp_tip4p.cpp +++ b/src/KSPACE/pppm_disp_tip4p.cpp @@ -502,17 +502,20 @@ void PPPMDispTIP4P::find_M(int i, int &iH1, int &iH2, double *xM) if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); + double **x = atom->x; double delx1 = x[iH1][0] - x[i][0]; double dely1 = x[iH1][1] - x[i][1]; double delz1 = x[iH1][2] - x[i][2]; - domain->minimum_image(delx1,dely1,delz1); double delx2 = x[iH2][0] - x[i][0]; double dely2 = x[iH2][1] - x[i][1]; double delz2 = x[iH2][2] - x[i][2]; - domain->minimum_image(delx2,dely2,delz2); xM[0] = x[i][0] + alpha * 0.5 * (delx1 + delx2); xM[1] = x[i][1] + alpha * 0.5 * (dely1 + dely2); diff --git a/src/KSPACE/pppm_tip4p.cpp b/src/KSPACE/pppm_tip4p.cpp index 34d0616fe9..fa5820cb34 100644 --- a/src/KSPACE/pppm_tip4p.cpp +++ b/src/KSPACE/pppm_tip4p.cpp @@ -493,17 +493,20 @@ void PPPMTIP4P::find_M(int i, int &iH1, int &iH2, double *xM) if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); + double **x = atom->x; double delx1 = x[iH1][0] - x[i][0]; double dely1 = x[iH1][1] - x[i][1]; double delz1 = x[iH1][2] - x[i][2]; - domain->minimum_image(delx1,dely1,delz1); double delx2 = x[iH2][0] - x[i][0]; double dely2 = x[iH2][1] - x[i][1]; double delz2 = x[iH2][2] - x[i][2]; - domain->minimum_image(delx2,dely2,delz2); xM[0] = x[i][0] + alpha * 0.5 * (delx1 + delx2); xM[1] = x[i][1] + alpha * 0.5 * (dely1 + dely2); diff --git a/src/MOLECULE/fix_cmap.cpp b/src/MOLECULE/fix_cmap.cpp index da7d337b9b..26aaef60d7 100644 --- a/src/MOLECULE/fix_cmap.cpp +++ b/src/MOLECULE/fix_cmap.cpp @@ -62,10 +62,13 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -FixCMAP::FixCMAP(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), - crosstermlist(NULL), num_crossterm(NULL), crossterm_type(NULL), crossterm_atom1(NULL), - crossterm_atom2(NULL), crossterm_atom3(NULL), crossterm_atom4(NULL), crossterm_atom5(NULL), - g_axis(NULL), cmapgrid(NULL), d1cmapgrid(NULL), d2cmapgrid(NULL), d12cmapgrid(NULL) +FixCMAP::FixCMAP(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), + crosstermlist(NULL), num_crossterm(NULL), crossterm_type(NULL), + crossterm_atom1(NULL), crossterm_atom2(NULL), crossterm_atom3(NULL), + crossterm_atom4(NULL), crossterm_atom5(NULL), + g_axis(NULL), cmapgrid(NULL), d1cmapgrid(NULL), d2cmapgrid(NULL), + d12cmapgrid(NULL) { if (narg != 4) error->all(FLERR,"Illegal fix cmap command"); @@ -208,6 +211,13 @@ void FixCMAP::setup_pre_neighbor() /* --------------------------------------------------------------------- */ +void FixCMAP::setup_pre_reverse(int eflag, int vflag) +{ + pre_reverse(eflag,vflag); +} + +/* --------------------------------------------------------------------- */ + void FixCMAP::min_setup(int vflag) { pre_neighbor(); diff --git a/src/MOLECULE/fix_cmap.h b/src/MOLECULE/fix_cmap.h index 3573d213e8..d384d61d7d 100644 --- a/src/MOLECULE/fix_cmap.h +++ b/src/MOLECULE/fix_cmap.h @@ -31,6 +31,7 @@ class FixCMAP : public Fix { void init(); void setup(int); void setup_pre_neighbor(); + void setup_pre_reverse(int, int); void min_setup(int); void pre_neighbor(); void pre_reverse(int, int); diff --git a/src/MOLECULE/pair_lj_cut_tip4p_cut.cpp b/src/MOLECULE/pair_lj_cut_tip4p_cut.cpp index a9e00e80b4..15f5d52961 100644 --- a/src/MOLECULE/pair_lj_cut_tip4p_cut.cpp +++ b/src/MOLECULE/pair_lj_cut_tip4p_cut.cpp @@ -87,8 +87,8 @@ void PairLJCutTIP4PCut::compute(int eflag, int vflag) int n,vlist[6]; int iH1,iH2,jH1,jH2; double cforce; - double fO[3],fH[3],fd[3],v[6],xH1[3],xH2[3]; - double *x1,*x2; + double fO[3],fH[3],fd[3],v[6]; + double *x1,*x2,*xH1,*xH2; evdwl = ecoul = 0.0; if (eflag || vflag) ev_setup(eflag,vflag); @@ -139,14 +139,20 @@ void PairLJCutTIP4PCut::compute(int eflag, int vflag) if (itype == typeO) { if (hneigh[i][0] < 0) { - hneigh[i][0] = iH1 = atom->map(tag[i] + 1); - hneigh[i][1] = iH2 = atom->map(tag[i] + 2); - hneigh[i][2] = 1; + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite(x[i],x[iH1],x[iH2],newsite[i]); + hneigh[i][0] = iH1; + hneigh[i][1] = iH2; + hneigh[i][2] = 1; + } else { iH1 = hneigh[i][0]; iH2 = hneigh[i][1]; @@ -209,14 +215,20 @@ void PairLJCutTIP4PCut::compute(int eflag, int vflag) if (jtype == typeO) { if (hneigh[j][0] < 0) { - hneigh[j][0] = jH1 = atom->map(tag[j] + 1); - hneigh[j][1] = jH2 = atom->map(tag[j] + 2); - hneigh[j][2] = 1; + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite(x[j],x[jH1],x[jH2],newsite[j]); + hneigh[j][0] = jH1; + hneigh[j][1] = jH2; + hneigh[j][2] = 1; + } else { jH1 = hneigh[j][0]; jH2 = hneigh[j][1]; @@ -294,10 +306,9 @@ void PairLJCutTIP4PCut::compute(int eflag, int vflag) f[iH2][1] += fH[1]; f[iH2][2] += fH[2]; - if(vflag) { - domain->closest_image(x[i],x[iH1],xH1); - domain->closest_image(x[i],x[iH2],xH2); - + if (vflag) { + xH1 = x[iH1]; + xH2 = x[iH2]; v[0] = x[i][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] = x[i][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] = x[i][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -353,9 +364,8 @@ void PairLJCutTIP4PCut::compute(int eflag, int vflag) f[jH2][2] += fH[2]; if (vflag) { - domain->closest_image(x[j],x[jH1],xH1); - domain->closest_image(x[j],x[jH2],xH2); - + xH1 = x[jH1]; + xH2 = x[jH2]; v[0] += x[j][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] += x[j][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] += x[j][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -711,12 +721,10 @@ void PairLJCutTIP4PCut::compute_newsite(double *xO, double *xH1, double delx1 = xH1[0] - xO[0]; double dely1 = xH1[1] - xO[1]; double delz1 = xH1[2] - xO[2]; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2[0] - xO[0]; double dely2 = xH2[1] - xO[1]; double delz2 = xH2[2] - xO[2]; - domain->minimum_image(delx2,dely2,delz2); xM[0] = xO[0] + alpha * 0.5 * (delx1 + delx2); xM[1] = xO[1] + alpha * 0.5 * (dely1 + dely2); diff --git a/src/MOLECULE/pair_tip4p_cut.cpp b/src/MOLECULE/pair_tip4p_cut.cpp index dd48637f23..954bd35435 100644 --- a/src/MOLECULE/pair_tip4p_cut.cpp +++ b/src/MOLECULE/pair_tip4p_cut.cpp @@ -75,8 +75,8 @@ void PairTIP4PCut::compute(int eflag, int vflag) int n,vlist[6]; int iH1,iH2,jH1,jH2; double cforce; - double fO[3],fH[3],fd[3],v[6],xH1[3],xH2[3]; - double *x1,*x2; + double fO[3],fH[3],fd[3],v[6]; + double *x1,*x2,*xH1,*xH2; ecoul = 0.0; if (eflag || vflag) ev_setup(eflag,vflag); @@ -125,14 +125,20 @@ void PairTIP4PCut::compute(int eflag, int vflag) if (itype == typeO) { if (hneigh[i][0] < 0) { - hneigh[i][0] = iH1 = atom->map(tag[i] + 1); - hneigh[i][1] = iH2 = atom->map(tag[i] + 2); - hneigh[i][2] = 1; + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite(x[i],x[iH1],x[iH2],newsite[i]); + hneigh[i][0] = iH1; + hneigh[i][1] = iH2; + hneigh[i][2] = 1; + } else { iH1 = hneigh[i][0]; iH2 = hneigh[i][1]; @@ -169,14 +175,20 @@ void PairTIP4PCut::compute(int eflag, int vflag) if (jtype == typeO) { if (hneigh[j][0] < 0) { - hneigh[j][0] = jH1 = atom->map(tag[j] + 1); - hneigh[j][1] = jH2 = atom->map(tag[j] + 2); - hneigh[j][2] = 1; + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite(x[j],x[jH1],x[jH2],newsite[j]); + hneigh[j][0] = jH1; + hneigh[j][1] = jH2; + hneigh[j][2] = 1; + } else { jH1 = hneigh[j][0]; jH2 = hneigh[j][1]; @@ -255,9 +267,8 @@ void PairTIP4PCut::compute(int eflag, int vflag) f[iH2][2] += fH[2]; if(vflag) { - domain->closest_image(x[i],x[iH1],xH1); - domain->closest_image(x[i],x[iH2],xH2); - + xH1 = x[iH1]; + xH2 = x[iH2]; v[0] = x[i][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] = x[i][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] = x[i][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -313,9 +324,8 @@ void PairTIP4PCut::compute(int eflag, int vflag) f[jH2][2] += fH[2]; if (vflag) { - domain->closest_image(x[j],x[jH1],xH1); - domain->closest_image(x[j],x[jH2],xH2); - + xH1 = x[jH1]; + xH2 = x[jH2]; v[0] += x[j][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] += x[j][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] += x[j][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -526,12 +536,10 @@ void PairTIP4PCut::compute_newsite(double *xO, double *xH1, double delx1 = xH1[0] - xO[0]; double dely1 = xH1[1] - xO[1]; double delz1 = xH1[2] - xO[2]; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2[0] - xO[0]; double dely2 = xH2[1] - xO[1]; double delz2 = xH2[2] - xO[2]; - domain->minimum_image(delx2,dely2,delz2); xM[0] = xO[0] + alpha * 0.5 * (delx1 + delx2); xM[1] = xO[1] + alpha * 0.5 * (dely1 + dely2); diff --git a/src/OPT/pair_lj_cut_tip4p_long_opt.cpp b/src/OPT/pair_lj_cut_tip4p_long_opt.cpp index 2cca32baec..db9402b521 100644 --- a/src/OPT/pair_lj_cut_tip4p_long_opt.cpp +++ b/src/OPT/pair_lj_cut_tip4p_long_opt.cpp @@ -111,9 +111,9 @@ void PairLJCutTIP4PLongOpt::eval() double r,rsq,r2inv,r6inv,forcecoul,forcelj,cforce; double factor_coul,factor_lj; double grij,expm2,prefactor,t,erfc; - double v[6],xH1[3],xH2[3]; + double v[6]; double fdx,fdy,fdz,fOx,fOy,fOz,fHx,fHy,fHz; - const double *x1,*x2; + const double *x1,*x2,*xH1,*xH2; int *ilist,*jlist,*numneigh,**firstneigh; int i,j,ii,jj,inum,jnum,itype,jtype,itable,key; @@ -155,14 +155,21 @@ void PairLJCutTIP4PLongOpt::eval() if (itype == typeO) { if (hneigh[i][0] < 0) { - hneigh[i][0] = iH1 = atom->map(tag[i] + 1); - hneigh[i][1] = iH2 = atom->map(tag[i] + 2); + iH1 = atom->map(tag[i] + 1); + iH2 = atom->map(tag[i] + 2); hneigh[i][2] = 1; if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite_opt(x[i],x[iH1],x[iH2],newsite[i]); + hneigh[i][0] = iH1; + hneigh[i][1] = iH2; + hneigh[i][2] = 1; + } else { iH1 = hneigh[i][0]; iH2 = hneigh[i][1]; @@ -226,14 +233,21 @@ void PairLJCutTIP4PLongOpt::eval() if (jtype == typeO) { if (hneigh[j][0] < 0) { - hneigh[j][0] = jH1 = atom->map(tag[j] + 1); - hneigh[j][1] = jH2 = atom->map(tag[j] + 2); + jH1 = atom->map(tag[j] + 1); + jH2 = atom->map(tag[j] + 2); hneigh[j][2] = 1; if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite_opt(x[j],x[jH1],x[jH2],newsite[j]); + hneigh[j][0] = jH1; + hneigh[j][1] = jH2; + hneigh[j][2] = 1; + } else { jH1 = hneigh[j][0]; jH2 = hneigh[j][1]; @@ -339,9 +353,8 @@ void PairLJCutTIP4PLongOpt::eval() f[iH2][2] += fHz; if (VFLAG) { - domain->closest_image(x[i],x[iH1],xH1); - domain->closest_image(x[i],x[iH2],xH2); - + xH1 = x[iH1]; + xH2 = x[iH2]; v[0] = x[i][0]*fOx + xH1[0]*fHx + xH2[0]*fHx; v[1] = x[i][1]*fOy + xH1[1]*fHy + xH2[1]*fHy; v[2] = x[i][2]*fOz + xH1[2]*fHz + xH2[2]*fHz; @@ -399,9 +412,8 @@ void PairLJCutTIP4PLongOpt::eval() f[jH2][2] += fHz; if (VFLAG) { - domain->closest_image(x[j],x[jH1],xH1); - domain->closest_image(x[j],x[jH2],xH2); - + xH1 = x[jH1]; + xH2 = x[jH2]; v[0] += x[j][0]*fOx + xH1[0]*fHx + xH2[0]*fHx; v[1] += x[j][1]*fOy + xH1[1]*fHy + xH2[1]*fHy; v[2] += x[j][2]*fOz + xH1[2]*fHz + xH2[2]*fHz; @@ -448,12 +460,10 @@ void PairLJCutTIP4PLongOpt::compute_newsite_opt(const double * xO, double delx1 = xH1[0] - xO[0]; double dely1 = xH1[1] - xO[1]; double delz1 = xH1[2] - xO[2]; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2[0] - xO[0]; double dely2 = xH2[1] - xO[1]; double delz2 = xH2[2] - xO[2]; - domain->minimum_image(delx2,dely2,delz2); const double prefac = alpha * 0.5; xM[0] = xO[0] + prefac * (delx1 + delx2); diff --git a/src/QEQ/fix_qeq.cpp b/src/QEQ/fix_qeq.cpp index 01d51e12ed..7e8db7632c 100644 --- a/src/QEQ/fix_qeq.cpp +++ b/src/QEQ/fix_qeq.cpp @@ -310,13 +310,6 @@ void FixQEq::setup_pre_force_respa(int vflag, int ilevel) /* ---------------------------------------------------------------------- */ -void FixQEq::min_setup_pre_force(int vflag) -{ - setup_pre_force(vflag); -} - -/* ---------------------------------------------------------------------- */ - void FixQEq::init_storage() { nlocal = atom->nlocal; diff --git a/src/QEQ/fix_qeq.h b/src/QEQ/fix_qeq.h index 152ffd4e32..ed87412284 100644 --- a/src/QEQ/fix_qeq.h +++ b/src/QEQ/fix_qeq.h @@ -33,7 +33,6 @@ class FixQEq : public Fix { void setup_pre_force(int); void setup_pre_force_respa(int, int); void pre_force_respa(int, int, int); - void min_setup_pre_force(int); void min_pre_force(int); // derived child classes must provide these functions diff --git a/src/REPLICA/compute_event_displace.cpp b/src/REPLICA/compute_event_displace.cpp index cdd0e5de40..1431fc202e 100644 --- a/src/REPLICA/compute_event_displace.cpp +++ b/src/REPLICA/compute_event_displace.cpp @@ -48,7 +48,7 @@ ComputeEventDisplace::ComputeEventDisplace(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Distance must be > 0 for compute event/displace"); displace_distsq = displace_dist * displace_dist; - // fix event ID will be set later by PRD + // fix event ID will be set later by accelerated dynamics method id_event = NULL; } @@ -75,7 +75,8 @@ void ComputeEventDisplace::init() fix_event = (FixEvent*) modify->fix[ifix]; if (strcmp(fix_event->style,"EVENT/PRD") != 0 && - strcmp(fix_event->style,"EVENT/TAD") != 0) + strcmp(fix_event->style,"EVENT/TAD") != 0 && + strcmp(fix_event->style,"EVENT/HYPER") != 0) error->all(FLERR,"Compute event/displace has invalid fix event assigned"); } diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp index 939e4d7fac..249339191a 100644 --- a/src/REPLICA/fix_neb.cpp +++ b/src/REPLICA/fix_neb.cpp @@ -395,7 +395,7 @@ void FixNEB::inter_replica_comm() // ----------------------------------------------------- // single proc per replica - // all atoms are NEB atoms and no atom sorting + // all atoms are NEB atoms and no atom sorting is enabled // direct comm of x -> xprev and x -> xnext if (cmode == SINGLE_PROC_DIRECT) { diff --git a/src/USER-ATC/fix_atc.cpp b/src/USER-ATC/fix_atc.cpp index 0dc10e1773..96ad93481d 100644 --- a/src/USER-ATC/fix_atc.cpp +++ b/src/USER-ATC/fix_atc.cpp @@ -632,16 +632,6 @@ void FixATC::min_pre_exchange() throw; } } -void FixATC::min_setup_pre_exchange() -{ - try { - atc_->setup_pre_exchange(); - } - catch (ATC::ATC_Error& atcError) { - ATC::LammpsInterface::instance()->print_msg(atcError.error_description()); - throw; - } -} double FixATC::memory_usage() { @@ -896,19 +886,6 @@ void FixATC::setup_pre_neighbor() } } /* ---------------------------------------------------------------------- */ -void FixATC::min_setup_pre_neighbor() -{ - if (atc_->is_initialized()) { - try { - atc_->pre_neighbor(); - } - catch (ATC::ATC_Error& atcError) { - ATC::LammpsInterface::instance()->print_msg(atcError.error_description()); - throw; - } - } -} -/* ---------------------------------------------------------------------- */ void FixATC::min_pre_force(int vflag) { try { diff --git a/src/USER-ATC/fix_atc.h b/src/USER-ATC/fix_atc.h index b87c585e73..2512c658db 100644 --- a/src/USER-ATC/fix_atc.h +++ b/src/USER-ATC/fix_atc.h @@ -52,7 +52,6 @@ namespace LAMMPS_NS { and is called before domain->pbc() and comm->exchange(). */ void setup_pre_exchange(); void pre_exchange(); - void min_setup_pre_exchange(); void min_pre_exchange(); double memory_usage(); @@ -84,7 +83,6 @@ namespace LAMMPS_NS { neighbor->build(). */ void pre_neighbor(); void setup_pre_neighbor(); - void min_setup_pre_neighbor(); /** pre/post_force is used to modify fix-specific data and is before/after the various force computations. */ diff --git a/src/USER-DPD/fix_shardlow.cpp b/src/USER-DPD/fix_shardlow.cpp index 28c5382237..1b3d9f1c34 100644 --- a/src/USER-DPD/fix_shardlow.cpp +++ b/src/USER-DPD/fix_shardlow.cpp @@ -178,13 +178,6 @@ void FixShardlow::min_pre_exchange() /* ---------------------------------------------------------------------- */ -void FixShardlow::min_setup_pre_exchange() -{ - memset(atom->ssaAIR, 0, sizeof(int)*atom->nlocal); -} - -/* ---------------------------------------------------------------------- */ - void FixShardlow::setup(int vflag) { bool fixShardlow = false; diff --git a/src/USER-DPD/fix_shardlow.h b/src/USER-DPD/fix_shardlow.h index 45a7b030b9..139a6de02c 100644 --- a/src/USER-DPD/fix_shardlow.h +++ b/src/USER-DPD/fix_shardlow.h @@ -37,7 +37,6 @@ class FixShardlow : public Fix { virtual void initial_integrate(int); void setup_pre_exchange(); void pre_exchange(); - void min_setup_pre_exchange(); void min_pre_exchange(); void grow_arrays(int); diff --git a/src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp b/src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp index 2edad28bf3..5beed08b72 100644 --- a/src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp +++ b/src/USER-FEP/pair_lj_cut_tip4p_long_soft.cpp @@ -86,8 +86,8 @@ void PairLJCutTIP4PLongSoft::compute(int eflag, int vflag) double factor_coul,factor_lj; double grij,expm2,prefactor,t,erfc; double denc, denlj, r4sig6; - double fO[3],fH[3],fd[3],v[6],xH1[3],xH2[3]; - double *x1,*x2; + double fO[3],fH[3],fd[3],v[6]; + double *x1,*x2,*xH1,*xH2; int *ilist,*jlist,*numneigh,**firstneigh; double rsq; @@ -143,14 +143,20 @@ void PairLJCutTIP4PLongSoft::compute(int eflag, int vflag) if (itype == typeO) { if (hneigh[i][0] < 0) { - hneigh[i][0] = iH1 = atom->map(atom->tag[i] + 1); - hneigh[i][1] = iH2 = atom->map(atom->tag[i] + 2); - hneigh[i][2] = 1; + iH1 = atom->map(atom->tag[i] + 1); + iH2 = atom->map(atom->tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite(x[i],x[iH1],x[iH2],newsite[i]); + hneigh[i][0] = iH1; + hneigh[i][1] = iH2; + hneigh[i][2] = 1; + } else { iH1 = hneigh[i][0]; iH2 = hneigh[i][1]; @@ -216,14 +222,20 @@ void PairLJCutTIP4PLongSoft::compute(int eflag, int vflag) if (jtype == typeO) { if (hneigh[j][0] < 0) { - hneigh[j][0] = jH1 = atom->map(atom->tag[j] + 1); - hneigh[j][1] = jH2 = atom->map(atom->tag[j] + 2); - hneigh[j][2] = 1; + jH1 = atom->map(atom->tag[j] + 1); + jH2 = atom->map(atom->tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite(x[j],x[jH1],x[jH2],newsite[j]); + hneigh[j][0] = jH1; + hneigh[j][1] = jH2; + hneigh[j][2] = 1; + } else { jH1 = hneigh[j][0]; jH2 = hneigh[j][1]; @@ -314,9 +326,8 @@ void PairLJCutTIP4PLongSoft::compute(int eflag, int vflag) f[iH2][2] += fH[2]; if (vflag) { - domain->closest_image(x[i],x[iH1],xH1); - domain->closest_image(x[i],x[iH2],xH2); - + xH1 = x[iH1]; + xH2 = x[iH2]; v[0] = x[i][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] = x[i][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] = x[i][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -372,9 +383,8 @@ void PairLJCutTIP4PLongSoft::compute(int eflag, int vflag) f[jH2][2] += fH[2]; if (vflag) { - domain->closest_image(x[j],x[jH1],xH1); - domain->closest_image(x[j],x[jH2],xH2); - + xH1 = x[jH1]; + xH2 = x[jH2]; v[0] += x[j][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] += x[j][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] += x[j][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -549,12 +559,10 @@ void PairLJCutTIP4PLongSoft::compute_newsite(double *xO, double *xH1, double delx1 = xH1[0] - xO[0]; double dely1 = xH1[1] - xO[1]; double delz1 = xH1[2] - xO[2]; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2[0] - xO[0]; double dely2 = xH2[1] - xO[1]; double delz2 = xH2[2] - xO[2]; - domain->minimum_image(delx2,dely2,delz2); xM[0] = xO[0] + alpha * 0.5 * (delx1 + delx2); xM[1] = xO[1] + alpha * 0.5 * (dely1 + dely2); diff --git a/src/USER-FEP/pair_tip4p_long_soft.cpp b/src/USER-FEP/pair_tip4p_long_soft.cpp index 027882cfba..7ad654d95c 100644 --- a/src/USER-FEP/pair_tip4p_long_soft.cpp +++ b/src/USER-FEP/pair_tip4p_long_soft.cpp @@ -85,8 +85,8 @@ void PairTIP4PLongSoft::compute(int eflag, int vflag) double factor_coul; double grij,expm2,prefactor,t,erfc; double denc; - double fO[3],fH[3],fd[3],v[6],xH1[3],xH2[3]; - double *x1,*x2; + double fO[3],fH[3],fd[3],v[6]; + double *x1,*x2,*xH1,*xH2; int *ilist,*jlist,*numneigh,**firstneigh; double rsq; @@ -140,14 +140,20 @@ void PairTIP4PLongSoft::compute(int eflag, int vflag) if (itype == typeO) { if (hneigh[i][0] < 0) { - hneigh[i][0] = iH1 = atom->map(atom->tag[i] + 1); - hneigh[i][1] = iH2 = atom->map(atom->tag[i] + 2); - hneigh[i][2] = 1; + iH1 = atom->map(atom->tag[i] + 1); + iH2 = atom->map(atom->tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite(x[i],x[iH1],x[iH2],newsite[i]); + hneigh[i][0] = iH1; + hneigh[i][1] = iH2; + hneigh[i][2] = 1; + } else { iH1 = hneigh[i][0]; iH2 = hneigh[i][1]; @@ -184,14 +190,20 @@ void PairTIP4PLongSoft::compute(int eflag, int vflag) if (jtype == typeO) { if (hneigh[j][0] < 0) { - hneigh[j][0] = jH1 = atom->map(atom->tag[j] + 1); - hneigh[j][1] = jH2 = atom->map(atom->tag[j] + 2); - hneigh[j][2] = 1; + jH1 = atom->map(atom->tag[j] + 1); + jH2 = atom->map(atom->tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite(x[j],x[jH1],x[jH2],newsite[j]); + hneigh[j][0] = jH1; + hneigh[j][1] = jH2; + hneigh[j][2] = 1; + } else { jH1 = hneigh[j][0]; jH2 = hneigh[j][1]; @@ -282,9 +294,8 @@ void PairTIP4PLongSoft::compute(int eflag, int vflag) f[iH2][2] += fH[2]; if (vflag) { - domain->closest_image(x[i],x[iH1],xH1); - domain->closest_image(x[i],x[iH2],xH2); - + xH1 = x[iH1]; + xH2 = x[iH2]; v[0] = x[i][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] = x[i][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] = x[i][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -340,9 +351,8 @@ void PairTIP4PLongSoft::compute(int eflag, int vflag) f[jH2][2] += fH[2]; if (vflag) { - domain->closest_image(x[j],x[jH1],xH1); - domain->closest_image(x[j],x[jH2],xH2); - + xH1 = x[jH1]; + xH2 = x[jH2]; v[0] += x[j][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; v[1] += x[j][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; v[2] += x[j][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; @@ -473,12 +483,10 @@ void PairTIP4PLongSoft::compute_newsite(double *xO, double *xH1, double delx1 = xH1[0] - xO[0]; double dely1 = xH1[1] - xO[1]; double delz1 = xH1[2] - xO[2]; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2[0] - xO[0]; double dely2 = xH2[1] - xO[1]; double delz2 = xH2[2] - xO[2]; - domain->minimum_image(delx2,dely2,delz2); xM[0] = xO[0] + alpha * 0.5 * (delx1 + delx2); xM[1] = xO[1] + alpha * 0.5 * (dely1 + dely2); diff --git a/src/USER-INTEL/fix_intel.cpp b/src/USER-INTEL/fix_intel.cpp index 7c5dd0b34c..edd33eb72b 100644 --- a/src/USER-INTEL/fix_intel.cpp +++ b/src/USER-INTEL/fix_intel.cpp @@ -356,6 +356,13 @@ void FixIntel::setup(int vflag) /* ---------------------------------------------------------------------- */ +void FixIntel::setup_pre_reverse(int eflag, int vflag) +{ + pre_reverse(eflag,vflag); +} + +/* ---------------------------------------------------------------------- */ + void FixIntel::pair_init_check(const bool cdmessage) { #ifdef INTEL_VMASK diff --git a/src/USER-INTEL/fix_intel.h b/src/USER-INTEL/fix_intel.h index 6ffcb4ccab..f4c02b37b5 100644 --- a/src/USER-INTEL/fix_intel.h +++ b/src/USER-INTEL/fix_intel.h @@ -43,6 +43,8 @@ class FixIntel : public Fix { virtual int setmask(); virtual void init(); virtual void setup(int); + void setup_pre_reverse(int eflag = 0, int vflag = 0); + void pair_init_check(const bool cdmessage=false); void bond_init_check(); void kspace_init_check(); diff --git a/src/USER-OMP/pair_lj_cut_tip4p_cut_omp.cpp b/src/USER-OMP/pair_lj_cut_tip4p_cut_omp.cpp index 3b028fb67b..3b4d616149 100644 --- a/src/USER-OMP/pair_lj_cut_tip4p_cut_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_tip4p_cut_omp.cpp @@ -127,9 +127,9 @@ void PairLJCutTIP4PCutOMP::eval(int iifrom, int iito, ThrData * const thr) double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,evdwl,ecoul; double r,rsq,r2inv,r6inv,forcecoul,forcelj,cforce; double factor_coul,factor_lj; - double v[6],xH1[3],xH2[3]; + double v[6]; double fdx,fdy,fdz,fOx,fOy,fOz,fHx,fHy,fHz; - dbl3_t x1,x2; + dbl3_t x1,x2,xH1,xH2; int *ilist,*jlist,*numneigh,**firstneigh; int i,j,ii,jj,jnum,itype,jtype,key; @@ -179,10 +179,14 @@ void PairLJCutTIP4PCutOMP::eval(int iifrom, int iito, ThrData * const thr) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); hneigh_thr[i].t = 1; hneigh_thr[i].b = iH2; hneigh_thr[i].a = iH1; + } else { iH1 = hneigh_thr[i].a; iH2 = hneigh_thr[i].b; @@ -256,6 +260,9 @@ void PairLJCutTIP4PCutOMP::eval(int iifrom, int iito, ThrData * const thr) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); hneigh_thr[j].t = 1; hneigh_thr[j].b = jH2; @@ -341,15 +348,14 @@ void PairLJCutTIP4PCutOMP::eval(int iifrom, int iito, ThrData * const thr) f[iH2].z += fHz; if (VFLAG) { - domain->closest_image(&x[i].x,&x[iH1].x,xH1); - domain->closest_image(&x[i].x,&x[iH2].x,xH2); - - v[0] = x[i].x*fOx + xH1[0]*fHx + xH2[0]*fHx; - v[1] = x[i].y*fOy + xH1[1]*fHy + xH2[1]*fHy; - v[2] = x[i].z*fOz + xH1[2]*fHz + xH2[2]*fHz; - v[3] = x[i].x*fOy + xH1[0]*fHy + xH2[0]*fHy; - v[4] = x[i].x*fOz + xH1[0]*fHz + xH2[0]*fHz; - v[5] = x[i].y*fOz + xH1[1]*fHz + xH2[1]*fHz; + xH1 = x[iH1]; + xH2 = x[iH2]; + v[0] = x[i].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] = x[i].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] = x[i].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] = x[i].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] = x[i].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] = x[i].y*fOz + xH1.y*fHz + xH2.y*fHz; } if (EVFLAG) { vlist[n++] = i; @@ -401,15 +407,14 @@ void PairLJCutTIP4PCutOMP::eval(int iifrom, int iito, ThrData * const thr) f[jH2].z += fHz; if (VFLAG) { - domain->closest_image(&x[j].x,&x[jH1].x,xH1); - domain->closest_image(&x[j].x,&x[jH2].x,xH2); - - v[0] += x[j].x*fOx + xH1[0]*fHx + xH2[0]*fHx; - v[1] += x[j].y*fOy + xH1[1]*fHy + xH2[1]*fHy; - v[2] += x[j].z*fOz + xH1[2]*fHz + xH2[2]*fHz; - v[3] += x[j].x*fOy + xH1[0]*fHy + xH2[0]*fHy; - v[4] += x[j].x*fOz + xH1[0]*fHz + xH2[0]*fHz; - v[5] += x[j].y*fOz + xH1[1]*fHz + xH2[1]*fHz; + xH1 = x[jH1]; + xH2 = x[jH2]; + v[0] += x[j].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] += x[j].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] += x[j].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] += x[j].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] += x[j].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] += x[j].y*fOz + xH1.y*fHz + xH2.y*fHz; } if (EVFLAG) { vlist[n++] = j; @@ -446,12 +451,10 @@ void PairLJCutTIP4PCutOMP::compute_newsite_thr(const dbl3_t &xO, double delx1 = xH1.x - xO.x; double dely1 = xH1.y - xO.y; double delz1 = xH1.z - xO.z; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2.x - xO.x; double dely2 = xH2.y - xO.y; double delz2 = xH2.z - xO.z; - domain->minimum_image(delx2,dely2,delz2); const double prefac = alpha * 0.5; xM.x = xO.x + prefac * (delx1 + delx2); diff --git a/src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp b/src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp index 70be3e5228..2f1b98fc4f 100644 --- a/src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_tip4p_long_omp.cpp @@ -141,9 +141,9 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) double r,rsq,r2inv,r6inv,forcecoul,forcelj,cforce; double factor_coul,factor_lj; double grij,expm2,prefactor,t,erfc; - double v[6],xH1[3],xH2[3]; + double v[6]; double fdx,fdy,fdz,fOx,fOy,fOz,fHx,fHy,fHz; - dbl3_t x1,x2; + dbl3_t x1,x2,xH1,xH2; int *ilist,*jlist,*numneigh,**firstneigh; int i,j,ii,jj,jnum,itype,jtype,itable, key; @@ -193,6 +193,9 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); hneigh_thr[i].t = 1; hneigh_thr[i].b = iH2; @@ -270,6 +273,9 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); hneigh_thr[j].t = 1; hneigh_thr[j].b = jH2; @@ -379,15 +385,14 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) f[iH2].z += fHz; if (VFLAG) { - domain->closest_image(&x[i].x,&x[iH1].x,xH1); - domain->closest_image(&x[i].x,&x[iH2].x,xH2); - - v[0] = x[i].x*fOx + xH1[0]*fHx + xH2[0]*fHx; - v[1] = x[i].y*fOy + xH1[1]*fHy + xH2[1]*fHy; - v[2] = x[i].z*fOz + xH1[2]*fHz + xH2[2]*fHz; - v[3] = x[i].x*fOy + xH1[0]*fHy + xH2[0]*fHy; - v[4] = x[i].x*fOz + xH1[0]*fHz + xH2[0]*fHz; - v[5] = x[i].y*fOz + xH1[1]*fHz + xH2[1]*fHz; + xH1 = x[iH1]; + xH2 = x[iH2]; + v[0] = x[i].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] = x[i].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] = x[i].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] = x[i].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] = x[i].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] = x[i].y*fOz + xH1.y*fHz + xH2.y*fHz; } if (EVFLAG) { vlist[n++] = i; @@ -439,15 +444,14 @@ void PairLJCutTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) f[jH2].z += fHz; if (VFLAG) { - domain->closest_image(&x[j].x,&x[jH1].x,xH1); - domain->closest_image(&x[j].x,&x[jH2].x,xH2); - - v[0] += x[j].x*fOx + xH1[0]*fHx + xH2[0]*fHx; - v[1] += x[j].y*fOy + xH1[1]*fHy + xH2[1]*fHy; - v[2] += x[j].z*fOz + xH1[2]*fHz + xH2[2]*fHz; - v[3] += x[j].x*fOy + xH1[0]*fHy + xH2[0]*fHy; - v[4] += x[j].x*fOz + xH1[0]*fHz + xH2[0]*fHz; - v[5] += x[j].y*fOz + xH1[1]*fHz + xH2[1]*fHz; + xH1 = x[jH1]; + xH2 = x[jH2]; + v[0] += x[j].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] += x[j].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] += x[j].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] += x[j].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] += x[j].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] += x[j].y*fOz + xH1.y*fHz + xH2.y*fHz; } if (EVFLAG) { vlist[n++] = j; @@ -489,12 +493,10 @@ void PairLJCutTIP4PLongOMP::compute_newsite_thr(const dbl3_t &xO, double delx1 = xH1.x - xO.x; double dely1 = xH1.y - xO.y; double delz1 = xH1.z - xO.z; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2.x - xO.x; double dely2 = xH2.y - xO.y; double delz2 = xH2.z - xO.z; - domain->minimum_image(delx2,dely2,delz2); const double prefac = alpha * 0.5; xM.x = xO.x + prefac * (delx1 + delx2); diff --git a/src/USER-OMP/pair_lj_cut_tip4p_long_soft_omp.cpp b/src/USER-OMP/pair_lj_cut_tip4p_long_soft_omp.cpp index 2d4be0d884..b31c1c109b 100644 --- a/src/USER-OMP/pair_lj_cut_tip4p_long_soft_omp.cpp +++ b/src/USER-OMP/pair_lj_cut_tip4p_long_soft_omp.cpp @@ -129,9 +129,9 @@ void PairLJCutTIP4PLongSoftOMP::eval(int iifrom, int iito, ThrData * const thr) double factor_coul,factor_lj; double grij,expm2,prefactor,t,erfc; double denc, denlj, r4sig6; - double v[6],xH1[3],xH2[3]; + double v[6]; double fdx,fdy,fdz,fOx,fOy,fOz,fHx,fHy,fHz; - dbl3_t x1,x2; + dbl3_t x1,x2,xH1,xH2; int *ilist,*jlist,*numneigh,**firstneigh; int i,j,ii,jj,jnum,itype,jtype,key; @@ -181,6 +181,9 @@ void PairLJCutTIP4PLongSoftOMP::eval(int iifrom, int iito, ThrData * const thr) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); hneigh_thr[i].t = 1; hneigh_thr[i].b = iH2; @@ -261,6 +264,9 @@ void PairLJCutTIP4PLongSoftOMP::eval(int iifrom, int iito, ThrData * const thr) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); hneigh_thr[j].t = 1; hneigh_thr[j].b = jH2; @@ -357,15 +363,14 @@ void PairLJCutTIP4PLongSoftOMP::eval(int iifrom, int iito, ThrData * const thr) f[iH2].z += fHz; if (VFLAG) { - domain->closest_image(&x[i].x,&x[iH1].x,xH1); - domain->closest_image(&x[i].x,&x[iH2].x,xH2); - - v[0] = x[i].x*fOx + xH1[0]*fHx + xH2[0]*fHx; - v[1] = x[i].y*fOy + xH1[1]*fHy + xH2[1]*fHy; - v[2] = x[i].z*fOz + xH1[2]*fHz + xH2[2]*fHz; - v[3] = x[i].x*fOy + xH1[0]*fHy + xH2[0]*fHy; - v[4] = x[i].x*fOz + xH1[0]*fHz + xH2[0]*fHz; - v[5] = x[i].y*fOz + xH1[1]*fHz + xH2[1]*fHz; + xH1 = x[iH1]; + xH2 = x[iH2]; + v[0] = x[i].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] = x[i].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] = x[i].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] = x[i].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] = x[i].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] = x[i].y*fOz + xH1.y*fHz + xH2.y*fHz; } if (EVFLAG) { vlist[n++] = i; @@ -417,15 +422,14 @@ void PairLJCutTIP4PLongSoftOMP::eval(int iifrom, int iito, ThrData * const thr) f[jH2].z += fHz; if (VFLAG) { - domain->closest_image(&x[j].x,&x[jH1].x,xH1); - domain->closest_image(&x[j].x,&x[jH2].x,xH2); - - v[0] += x[j].x*fOx + xH1[0]*fHx + xH2[0]*fHx; - v[1] += x[j].y*fOy + xH1[1]*fHy + xH2[1]*fHy; - v[2] += x[j].z*fOz + xH1[2]*fHz + xH2[2]*fHz; - v[3] += x[j].x*fOy + xH1[0]*fHy + xH2[0]*fHy; - v[4] += x[j].x*fOz + xH1[0]*fHz + xH2[0]*fHz; - v[5] += x[j].y*fOz + xH1[1]*fHz + xH2[1]*fHz; + xH1 = x[jH1]; + xH2 = x[jH2]; + v[0] += x[j].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] += x[j].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] += x[j].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] += x[j].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] += x[j].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] += x[j].y*fOz + xH1.y*fHz + xH2.y*fHz; } if (EVFLAG) { vlist[n++] = j; @@ -463,12 +467,10 @@ void PairLJCutTIP4PLongSoftOMP::compute_newsite_thr(const dbl3_t &xO, double delx1 = xH1.x - xO.x; double dely1 = xH1.y - xO.y; double delz1 = xH1.z - xO.z; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2.x - xO.x; double dely2 = xH2.y - xO.y; double delz2 = xH2.z - xO.z; - domain->minimum_image(delx2,dely2,delz2); const double prefac = alpha * 0.5; xM.x = xO.x + prefac * (delx1 + delx2); diff --git a/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp b/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp index f04e6380c8..5072496cc6 100644 --- a/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp +++ b/src/USER-OMP/pair_lj_long_tip4p_long_omp.cpp @@ -737,8 +737,8 @@ void PairLJLongTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) double r,r2inv,forcecoul,forcelj,cforce; double factor_coul; double grij,expm2,prefactor,t,erfc; - double fO[3],fH[3],fd[3],v[6],xH1[3],xH2[3]; - dbl3_t x1,x2; + double fO[3],fH[3],fd[3],v[6]; + dbl3_t x1,x2,xH1,xH2; int *ilist,*jlist,*numneigh,**firstneigh; double rsq; @@ -763,14 +763,20 @@ void PairLJLongTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) itype = type[i]; if (itype == typeO) { if (hneigh_thr[i].a < 0) { - hneigh_thr[i].a = iH1 = atom->map(atom->tag[i] + 1); - hneigh_thr[i].b = iH2 = atom->map(atom->tag[i] + 2); - hneigh_thr[i].t = 1; + iH1 = atom->map(atom->tag[i] + 1); + iH2 = atom->map(atom->tag[i] + 2); if (iH1 == -1 || iH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); + hneigh_thr[i].a = iH1; + hneigh_thr[i].b = iH2; + hneigh_thr[i].t = 1; + } else { iH1 = hneigh_thr[i].a; iH2 = hneigh_thr[i].b; @@ -871,14 +877,20 @@ void PairLJLongTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) if (itype == typeO || jtype == typeO) { if (jtype == typeO) { if (hneigh_thr[j].a < 0) { - hneigh_thr[j].a = jH1 = atom->map(atom->tag[j] + 1); - hneigh_thr[j].b = jH2 = atom->map(atom->tag[j] + 2); - hneigh_thr[j].t = 1; + jH1 = atom->map(atom->tag[j] + 1); + jH2 = atom->map(atom->tag[j] + 2); if (jH1 == -1 || jH2 == -1) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); + hneigh_thr[j].a = jH1; + hneigh_thr[j].b = jH2; + hneigh_thr[j].t = 1; + } else { jH1 = hneigh_thr[j].a; jH2 = hneigh_thr[j].b; @@ -983,15 +995,14 @@ void PairLJLongTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) f[iH2][2] += fH[2]; if (EVFLAG) { - domain->closest_image(&x[i].x,&x[iH1].x,xH1); - domain->closest_image(&x[i].x,&x[iH2].x,xH2); - - v[0] = x[i].x*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; - v[1] = x[i].y*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; - v[2] = x[i].z*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; - v[3] = x[i].x*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1]; - v[4] = x[i].x*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2]; - v[5] = x[i].y*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2]; + xH1 = x[iH1]; + xH2 = x[iH2]; + v[0] = x[i].x*fO[0] + xH1.x*fH[0] + xH2.x*fH[0]; + v[1] = x[i].y*fO[1] + xH1.y*fH[1] + xH2.y*fH[1]; + v[2] = x[i].z*fO[2] + xH1.z*fH[2] + xH2.z*fH[2]; + v[3] = x[i].x*fO[1] + xH1.x*fH[1] + xH2.x*fH[1]; + v[4] = x[i].x*fO[2] + xH1.x*fH[2] + xH2.x*fH[2]; + v[5] = x[i].y*fO[2] + xH1.y*fH[2] + xH2.y*fH[2]; } vlist[n++] = i; vlist[n++] = iH1; @@ -1041,15 +1052,14 @@ void PairLJLongTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) f[jH2][2] += fH[2]; if (EVFLAG) { - domain->closest_image(&x[j].x,&x[jH1].x,xH1); - domain->closest_image(&x[j].x,&x[jH2].x,xH2); - - v[0] += x[j].x*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0]; - v[1] += x[j].y*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1]; - v[2] += x[j].z*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2]; - v[3] += x[j].x*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1]; - v[4] += x[j].x*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2]; - v[5] += x[j].y*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2]; + xH1 = x[jH1]; + xH2 = x[jH2]; + v[0] += x[j].x*fO[0] + xH1.x*fH[0] + xH2.x*fH[0]; + v[1] += x[j].y*fO[1] + xH1.y*fH[1] + xH2.y*fH[1]; + v[2] += x[j].z*fO[2] + xH1.z*fH[2] + xH2.z*fH[2]; + v[3] += x[j].x*fO[1] + xH1.x*fH[1] + xH2.x*fH[1]; + v[4] += x[j].x*fO[2] + xH1.x*fH[2] + xH2.x*fH[2]; + v[5] += x[j].y*fO[2] + xH1.y*fH[2] + xH2.y*fH[2]; } vlist[n++] = j; vlist[n++] = jH1; @@ -1981,12 +1991,10 @@ void PairLJLongTIP4PLongOMP::compute_newsite_thr(const dbl3_t &xO, double delx1 = xH1.x - xO.x; double dely1 = xH1.y - xO.y; double delz1 = xH1.z - xO.z; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2.x - xO.x; double dely2 = xH2.y - xO.y; double delz2 = xH2.z - xO.z; - domain->minimum_image(delx2,dely2,delz2); const double prefac = alpha * 0.5; xM.x = xO.x + prefac * (delx1 + delx2); diff --git a/src/USER-OMP/pair_tip4p_cut_omp.cpp b/src/USER-OMP/pair_tip4p_cut_omp.cpp index 2b125fde7f..3edd2b688f 100644 --- a/src/USER-OMP/pair_tip4p_cut_omp.cpp +++ b/src/USER-OMP/pair_tip4p_cut_omp.cpp @@ -126,9 +126,9 @@ void PairTIP4PCutOMP::eval(int iifrom, int iito, ThrData * const thr) double qtmp,xtmp,ytmp,ztmp,delx,dely,delz,ecoul; double r,rsq,r2inv,forcecoul,cforce; double factor_coul; - double v[6],xH1[3],xH2[3]; + double v[6]; double fdx,fdy,fdz,fOx,fOy,fOz,fHx,fHy,fHz; - dbl3_t x1,x2; + dbl3_t x1,x2,xH1,xH2; int *ilist,*jlist,*numneigh,**firstneigh; int i,j,ii,jj,jnum,itype,jtype,key; @@ -176,10 +176,14 @@ void PairTIP4PCutOMP::eval(int iifrom, int iito, ThrData * const thr) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); hneigh_thr[i].t = 1; hneigh_thr[i].b = iH2; hneigh_thr[i].a = iH1; + } else { iH1 = hneigh_thr[i].a; iH2 = hneigh_thr[i].b; @@ -227,6 +231,9 @@ void PairTIP4PCutOMP::eval(int iifrom, int iito, ThrData * const thr) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); hneigh_thr[j].t = 1; hneigh_thr[j].b = jH2; @@ -312,15 +319,14 @@ void PairTIP4PCutOMP::eval(int iifrom, int iito, ThrData * const thr) f[iH2].z += fHz; if (VFLAG) { - domain->closest_image(&x[i].x,&x[iH1].x,xH1); - domain->closest_image(&x[i].x,&x[iH2].x,xH2); - - v[0] = x[i].x*fOx + xH1[0]*fHx + xH2[0]*fHx; - v[1] = x[i].y*fOy + xH1[1]*fHy + xH2[1]*fHy; - v[2] = x[i].z*fOz + xH1[2]*fHz + xH2[2]*fHz; - v[3] = x[i].x*fOy + xH1[0]*fHy + xH2[0]*fHy; - v[4] = x[i].x*fOz + xH1[0]*fHz + xH2[0]*fHz; - v[5] = x[i].y*fOz + xH1[1]*fHz + xH2[1]*fHz; + xH1 = x[iH1]; + xH2 = x[iH2]; + v[0] = x[i].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] = x[i].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] = x[i].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] = x[i].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] = x[i].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] = x[i].y*fOz + xH1.y*fHz + xH2.y*fHz; } if (EVFLAG) { vlist[n++] = i; @@ -372,15 +378,14 @@ void PairTIP4PCutOMP::eval(int iifrom, int iito, ThrData * const thr) f[jH2].z += fHz; if (VFLAG) { - domain->closest_image(&x[j].x,&x[jH1].x,xH1); - domain->closest_image(&x[j].x,&x[jH2].x,xH2); - - v[0] += x[j].x*fOx + xH1[0]*fHx + xH2[0]*fHx; - v[1] += x[j].y*fOy + xH1[1]*fHy + xH2[1]*fHy; - v[2] += x[j].z*fOz + xH1[2]*fHz + xH2[2]*fHz; - v[3] += x[j].x*fOy + xH1[0]*fHy + xH2[0]*fHy; - v[4] += x[j].x*fOz + xH1[0]*fHz + xH2[0]*fHz; - v[5] += x[j].y*fOz + xH1[1]*fHz + xH2[1]*fHz; + xH1 = x[jH1]; + xH2 = x[jH2]; + v[0] += x[j].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] += x[j].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] += x[j].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] += x[j].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] += x[j].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] += x[j].y*fOz + xH1.y*fHz + xH2.y*fHz; } if (EVFLAG) { vlist[n++] = j; @@ -417,12 +422,10 @@ void PairTIP4PCutOMP::compute_newsite_thr(const dbl3_t &xO, double delx1 = xH1.x - xO.x; double dely1 = xH1.y - xO.y; double delz1 = xH1.z - xO.z; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2.x - xO.x; double dely2 = xH2.y - xO.y; double delz2 = xH2.z - xO.z; - domain->minimum_image(delx2,dely2,delz2); const double prefac = alpha * 0.5; xM.x = xO.x + prefac * (delx1 + delx2); diff --git a/src/USER-OMP/pair_tip4p_long_omp.cpp b/src/USER-OMP/pair_tip4p_long_omp.cpp index 96ebc64a90..bcd8659a54 100644 --- a/src/USER-OMP/pair_tip4p_long_omp.cpp +++ b/src/USER-OMP/pair_tip4p_long_omp.cpp @@ -141,9 +141,9 @@ void PairTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) double r,rsq,r2inv,forcecoul,cforce; double factor_coul; double grij,expm2,prefactor,t,erfc; - double v[6],xH1[3],xH2[3]; + double v[6]; double fdx,fdy,fdz,fOx,fOy,fOz,fHx,fHy,fHz; - dbl3_t x1,x2; + dbl3_t x1,x2,xH1,xH2; int *ilist,*jlist,*numneigh,**firstneigh; int i,j,ii,jj,jnum,itype,jtype,itable, key; @@ -191,10 +191,14 @@ void PairTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); hneigh_thr[i].t = 1; hneigh_thr[i].b = iH2; hneigh_thr[i].a = iH1; + } else { iH1 = hneigh_thr[i].a; iH2 = hneigh_thr[i].b; @@ -242,10 +246,14 @@ void PairTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); hneigh_thr[j].t = 1; hneigh_thr[j].b = jH2; hneigh_thr[j].a = jH1; + } else { jH1 = hneigh_thr[j].a; jH2 = hneigh_thr[j].b; @@ -351,15 +359,14 @@ void PairTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) f[iH2].z += fHz; if (VFLAG) { - domain->closest_image(&x[i].x,&x[iH1].x,xH1); - domain->closest_image(&x[i].x,&x[iH2].x,xH2); - - v[0] = x[i].x*fOx + xH1[0]*fHx + xH2[0]*fHx; - v[1] = x[i].y*fOy + xH1[1]*fHy + xH2[1]*fHy; - v[2] = x[i].z*fOz + xH1[2]*fHz + xH2[2]*fHz; - v[3] = x[i].x*fOy + xH1[0]*fHy + xH2[0]*fHy; - v[4] = x[i].x*fOz + xH1[0]*fHz + xH2[0]*fHz; - v[5] = x[i].y*fOz + xH1[1]*fHz + xH2[1]*fHz; + xH1 = x[iH1]; + xH2 = x[iH2]; + v[0] = x[i].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] = x[i].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] = x[i].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] = x[i].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] = x[i].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] = x[i].y*fOz + xH1.y*fHz + xH2.y*fHz; } if (EVFLAG) { vlist[n++] = i; @@ -411,15 +418,14 @@ void PairTIP4PLongOMP::eval(int iifrom, int iito, ThrData * const thr) f[jH2].z += fHz; if (VFLAG) { - domain->closest_image(&x[j].x,&x[jH1].x,xH1); - domain->closest_image(&x[j].x,&x[jH2].x,xH2); - - v[0] += x[j].x*fOx + xH1[0]*fHx + xH2[0]*fHx; - v[1] += x[j].y*fOy + xH1[1]*fHy + xH2[1]*fHy; - v[2] += x[j].z*fOz + xH1[2]*fHz + xH2[2]*fHz; - v[3] += x[j].x*fOy + xH1[0]*fHy + xH2[0]*fHy; - v[4] += x[j].x*fOz + xH1[0]*fHz + xH2[0]*fHz; - v[5] += x[j].y*fOz + xH1[1]*fHz + xH2[1]*fHz; + xH1 = x[jH1]; + xH2 = x[jH2]; + v[0] += x[j].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] += x[j].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] += x[j].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] += x[j].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] += x[j].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] += x[j].y*fOz + xH1.y*fHz + xH2.y*fHz; } if (EVFLAG) { vlist[n++] = j; @@ -461,12 +467,10 @@ void PairTIP4PLongOMP::compute_newsite_thr(const dbl3_t &xO, double delx1 = xH1.x - xO.x; double dely1 = xH1.y - xO.y; double delz1 = xH1.z - xO.z; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2.x - xO.x; double dely2 = xH2.y - xO.y; double delz2 = xH2.z - xO.z; - domain->minimum_image(delx2,dely2,delz2); const double prefac = alpha * 0.5; xM.x = xO.x + prefac * (delx1 + delx2); diff --git a/src/USER-OMP/pair_tip4p_long_soft_omp.cpp b/src/USER-OMP/pair_tip4p_long_soft_omp.cpp index ac3bcfc393..2f16a28b8c 100644 --- a/src/USER-OMP/pair_tip4p_long_soft_omp.cpp +++ b/src/USER-OMP/pair_tip4p_long_soft_omp.cpp @@ -128,9 +128,9 @@ void PairTIP4PLongSoftOMP::eval(int iifrom, int iito, ThrData * const thr) double r,rsq,forcecoul,cforce; double factor_coul,denc; double grij,expm2,prefactor,t,erfc; - double v[6],xH1[3],xH2[3]; + double v[6]; double fdx,fdy,fdz,fOx,fOy,fOz,fHx,fHy,fHz; - dbl3_t x1,x2; + dbl3_t x1,x2,xH1,xH2; int *ilist,*jlist,*numneigh,**firstneigh; int i,j,ii,jj,jnum,itype,jtype,key; @@ -178,10 +178,14 @@ void PairTIP4PLongSoftOMP::eval(int iifrom, int iito, ThrData * const thr) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); compute_newsite_thr(x[i],x[iH1],x[iH2],newsite_thr[i]); hneigh_thr[i].t = 1; hneigh_thr[i].b = iH2; hneigh_thr[i].a = iH1; + } else { iH1 = hneigh_thr[i].a; iH2 = hneigh_thr[i].b; @@ -229,10 +233,14 @@ void PairTIP4PLongSoftOMP::eval(int iifrom, int iito, ThrData * const thr) error->one(FLERR,"TIP4P hydrogen is missing"); if (atom->type[jH1] != typeH || atom->type[jH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set jH1,jH2 to closest image to O + jH1 = domain->closest_image(j,jH1); + jH2 = domain->closest_image(j,jH2); compute_newsite_thr(x[j],x[jH1],x[jH2],newsite_thr[j]); hneigh_thr[j].t = 1; hneigh_thr[j].b = jH2; hneigh_thr[j].a = jH1; + } else { jH1 = hneigh_thr[j].a; jH2 = hneigh_thr[j].b; @@ -326,15 +334,14 @@ void PairTIP4PLongSoftOMP::eval(int iifrom, int iito, ThrData * const thr) f[iH2].z += fHz; if (VFLAG) { - domain->closest_image(&x[i].x,&x[iH1].x,xH1); - domain->closest_image(&x[i].x,&x[iH2].x,xH2); - - v[0] = x[i].x*fOx + xH1[0]*fHx + xH2[0]*fHx; - v[1] = x[i].y*fOy + xH1[1]*fHy + xH2[1]*fHy; - v[2] = x[i].z*fOz + xH1[2]*fHz + xH2[2]*fHz; - v[3] = x[i].x*fOy + xH1[0]*fHy + xH2[0]*fHy; - v[4] = x[i].x*fOz + xH1[0]*fHz + xH2[0]*fHz; - v[5] = x[i].y*fOz + xH1[1]*fHz + xH2[1]*fHz; + xH1 = x[iH1]; + xH2 = x[iH2]; + v[0] = x[i].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] = x[i].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] = x[i].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] = x[i].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] = x[i].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] = x[i].y*fOz + xH1.y*fHz + xH2.y*fHz; } if (EVFLAG) { vlist[n++] = i; @@ -386,15 +393,14 @@ void PairTIP4PLongSoftOMP::eval(int iifrom, int iito, ThrData * const thr) f[jH2].z += fHz; if (VFLAG) { - domain->closest_image(&x[j].x,&x[jH1].x,xH1); - domain->closest_image(&x[j].x,&x[jH2].x,xH2); - - v[0] += x[j].x*fOx + xH1[0]*fHx + xH2[0]*fHx; - v[1] += x[j].y*fOy + xH1[1]*fHy + xH2[1]*fHy; - v[2] += x[j].z*fOz + xH1[2]*fHz + xH2[2]*fHz; - v[3] += x[j].x*fOy + xH1[0]*fHy + xH2[0]*fHy; - v[4] += x[j].x*fOz + xH1[0]*fHz + xH2[0]*fHz; - v[5] += x[j].y*fOz + xH1[1]*fHz + xH2[1]*fHz; + xH1 = x[jH1]; + xH2 = x[jH2]; + v[0] += x[j].x*fOx + xH1.x*fHx + xH2.x*fHx; + v[1] += x[j].y*fOy + xH1.y*fHy + xH2.y*fHy; + v[2] += x[j].z*fOz + xH1.z*fHz + xH2.z*fHz; + v[3] += x[j].x*fOy + xH1.x*fHy + xH2.x*fHy; + v[4] += x[j].x*fOz + xH1.x*fHz + xH2.x*fHz; + v[5] += x[j].y*fOz + xH1.y*fHz + xH2.y*fHz; } if (EVFLAG) { vlist[n++] = j; @@ -432,12 +438,10 @@ void PairTIP4PLongSoftOMP::compute_newsite_thr(const dbl3_t &xO, double delx1 = xH1.x - xO.x; double dely1 = xH1.y - xO.y; double delz1 = xH1.z - xO.z; - domain->minimum_image(delx1,dely1,delz1); double delx2 = xH2.x - xO.x; double dely2 = xH2.y - xO.y; double delz2 = xH2.z - xO.z; - domain->minimum_image(delx2,dely2,delz2); const double prefac = alpha * 0.5; xM.x = xO.x + prefac * (delx1 + delx2); diff --git a/src/USER-OMP/pppm_disp_tip4p_omp.cpp b/src/USER-OMP/pppm_disp_tip4p_omp.cpp index 6606c9602c..8872c849f3 100644 --- a/src/USER-OMP/pppm_disp_tip4p_omp.cpp +++ b/src/USER-OMP/pppm_disp_tip4p_omp.cpp @@ -1852,17 +1852,20 @@ void PPPMDispTIP4POMP::find_M_thr(int i, int &iH1, int &iH2, dbl3_t &xM) if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); + const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0]; double delx1 = x[iH1].x - x[i].x; double dely1 = x[iH1].y - x[i].y; double delz1 = x[iH1].z - x[i].z; - domain->minimum_image(delx1,dely1,delz1); double delx2 = x[iH2].x - x[i].x; double dely2 = x[iH2].y - x[i].y; double delz2 = x[iH2].z - x[i].z; - domain->minimum_image(delx2,dely2,delz2); xM.x = x[i].x + alpha * 0.5 * (delx1 + delx2); xM.y = x[i].y + alpha * 0.5 * (dely1 + dely2); diff --git a/src/USER-OMP/pppm_tip4p_omp.cpp b/src/USER-OMP/pppm_tip4p_omp.cpp index 21da813123..fdc58bce10 100644 --- a/src/USER-OMP/pppm_tip4p_omp.cpp +++ b/src/USER-OMP/pppm_tip4p_omp.cpp @@ -742,17 +742,20 @@ void PPPMTIP4POMP::find_M_thr(int i, int &iH1, int &iH2, dbl3_t &xM) if (atom->type[iH1] != typeH || atom->type[iH2] != typeH) error->one(FLERR,"TIP4P hydrogen has incorrect atom type"); + // set iH1,iH2 to index of closest image to O + + iH1 = domain->closest_image(i,iH1); + iH2 = domain->closest_image(i,iH2); + const dbl3_t * _noalias const x = (dbl3_t *) atom->x[0]; double delx1 = x[iH1].x - x[i].x; double dely1 = x[iH1].y - x[i].y; double delz1 = x[iH1].z - x[i].z; - domain->minimum_image(delx1,dely1,delz1); double delx2 = x[iH2].x - x[i].x; double dely2 = x[iH2].y - x[i].y; double delz2 = x[iH2].z - x[i].z; - domain->minimum_image(delx2,dely2,delz2); xM.x = x[i].x + alpha * 0.5 * (delx1 + delx2); xM.y = x[i].y + alpha * 0.5 * (dely1 + dely2); diff --git a/src/USER-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index 5fa0ef6d79..26cf03f60a 100644 --- a/src/USER-REAXC/fix_qeq_reax.cpp +++ b/src/USER-REAXC/fix_qeq_reax.cpp @@ -440,13 +440,6 @@ void FixQEqReax::setup_pre_force_respa(int vflag, int ilevel) /* ---------------------------------------------------------------------- */ -void FixQEqReax::min_setup_pre_force(int vflag) -{ - setup_pre_force(vflag); -} - -/* ---------------------------------------------------------------------- */ - void FixQEqReax::init_storage() { int NN; diff --git a/src/USER-REAXC/fix_qeq_reax.h b/src/USER-REAXC/fix_qeq_reax.h index a0d29d6561..7c3e8a8f96 100644 --- a/src/USER-REAXC/fix_qeq_reax.h +++ b/src/USER-REAXC/fix_qeq_reax.h @@ -48,7 +48,6 @@ class FixQEqReax : public Fix { void setup_pre_force_respa(int, int); void pre_force_respa(int, int, int); - void min_setup_pre_force(int); void min_pre_force(int); int matvecs; diff --git a/src/domain.cpp b/src/domain.cpp index 54183f6f2c..bc184e79b5 100644 --- a/src/domain.cpp +++ b/src/domain.cpp @@ -938,28 +938,31 @@ void Domain::subbox_too_small_check(double thresh) } /* ---------------------------------------------------------------------- - minimum image convention + minimum image convention in periodic dimensions use 1/2 of box size as test for triclinic, also add/subtract tilt factors in other dims as needed + changed "if" to "while" to enable distance to + far-away ghost atom returned by atom->map() to be wrapped back into box + could be problem for looking up atom IDs when cutoff > boxsize ------------------------------------------------------------------------- */ void Domain::minimum_image(double &dx, double &dy, double &dz) { if (triclinic == 0) { if (xperiodic) { - if (fabs(dx) > xprd_half) { + while (fabs(dx) > xprd_half) { if (dx < 0.0) dx += xprd; else dx -= xprd; } } if (yperiodic) { - if (fabs(dy) > yprd_half) { + while (fabs(dy) > yprd_half) { if (dy < 0.0) dy += yprd; else dy -= yprd; } } if (zperiodic) { - if (fabs(dz) > zprd_half) { + while (fabs(dz) > zprd_half) { if (dz < 0.0) dz += zprd; else dz -= zprd; } @@ -967,7 +970,7 @@ void Domain::minimum_image(double &dx, double &dy, double &dz) } else { if (zperiodic) { - if (fabs(dz) > zprd_half) { + while (fabs(dz) > zprd_half) { if (dz < 0.0) { dz += zprd; dy += yz; @@ -980,7 +983,7 @@ void Domain::minimum_image(double &dx, double &dy, double &dz) } } if (yperiodic) { - if (fabs(dy) > yprd_half) { + while (fabs(dy) > yprd_half) { if (dy < 0.0) { dy += yprd; dx += xy; @@ -991,7 +994,7 @@ void Domain::minimum_image(double &dx, double &dy, double &dz) } } if (xperiodic) { - if (fabs(dx) > xprd_half) { + while (fabs(dx) > xprd_half) { if (dx < 0.0) dx += xprd; else dx -= xprd; } @@ -1000,28 +1003,31 @@ void Domain::minimum_image(double &dx, double &dy, double &dz) } /* ---------------------------------------------------------------------- - minimum image convention + minimum image convention in periodic dimensions use 1/2 of box size as test for triclinic, also add/subtract tilt factors in other dims as needed + changed "if" to "while" to enable distance to + far-away ghost atom returned by atom->map() to be wrapped back into box + could be problem for looking up atom IDs when cutoff > boxsize ------------------------------------------------------------------------- */ void Domain::minimum_image(double *delta) { if (triclinic == 0) { if (xperiodic) { - if (fabs(delta[0]) > xprd_half) { + while (fabs(delta[0]) > xprd_half) { if (delta[0] < 0.0) delta[0] += xprd; else delta[0] -= xprd; } } if (yperiodic) { - if (fabs(delta[1]) > yprd_half) { + while (fabs(delta[1]) > yprd_half) { if (delta[1] < 0.0) delta[1] += yprd; else delta[1] -= yprd; } } if (zperiodic) { - if (fabs(delta[2]) > zprd_half) { + while (fabs(delta[2]) > zprd_half) { if (delta[2] < 0.0) delta[2] += zprd; else delta[2] -= zprd; } @@ -1029,7 +1035,7 @@ void Domain::minimum_image(double *delta) } else { if (zperiodic) { - if (fabs(delta[2]) > zprd_half) { + while (fabs(delta[2]) > zprd_half) { if (delta[2] < 0.0) { delta[2] += zprd; delta[1] += yz; @@ -1042,7 +1048,7 @@ void Domain::minimum_image(double *delta) } } if (yperiodic) { - if (fabs(delta[1]) > yprd_half) { + while (fabs(delta[1]) > yprd_half) { if (delta[1] < 0.0) { delta[1] += yprd; delta[0] += xy; @@ -1053,7 +1059,7 @@ void Domain::minimum_image(double *delta) } } if (xperiodic) { - if (fabs(delta[0]) > xprd_half) { + while (fabs(delta[0]) > xprd_half) { if (delta[0] < 0.0) delta[0] += xprd; else delta[0] -= xprd; } @@ -1092,12 +1098,16 @@ int Domain::closest_image(int i, int j) closest = j; } } + return closest; } /* ---------------------------------------------------------------------- find and return Xj image = periodic image of Xj that is closest to Xi for triclinic, add/subtract tilt factors in other dims as needed + not currently used (Jan 2017): + used to be called by pair TIP4P styles but no longer, + due to use of other closest_image() method ------------------------------------------------------------------------- */ void Domain::closest_image(const double * const xi, const double * const xj, @@ -1984,7 +1994,7 @@ void Domain::subbox_corners() /* ---------------------------------------------------------------------- compute 8 corner pts of any triclinic box with lo/hi in lamda coords - 8 output conners are ordered with x changing fastest, then y, finally z + 8 output corners are ordered with x changing fastest, then y, finally z could be more efficient if just coded with xy,yz,xz explicitly ------------------------------------------------------------------------- */ diff --git a/src/finish.cpp b/src/finish.cpp index 850bc0b019..9222d4e868 100644 --- a/src/finish.cpp +++ b/src/finish.cpp @@ -65,7 +65,8 @@ void Finish::end(int flag) { int i,m,nneigh,nneighfull; int histo[10]; - int minflag,prdflag,tadflag,timeflag,fftflag,histoflag,neighflag; + int minflag,prdflag,tadflag,hyperflag; + int timeflag,fftflag,histoflag,neighflag; double time,tmp,ave,max,min; double time_loop,time_other,cpu_loop; @@ -86,9 +87,11 @@ void Finish::end(int flag) // flag = 1 = dynamics or minimization // flag = 2 = PRD // flag = 3 = TAD + // flag = 4 = HYPER // turn off neighflag for Kspace partition of verlet/split integrator - minflag = prdflag = tadflag = timeflag = fftflag = histoflag = neighflag = 0; + minflag = prdflag = tadflag = hyperflag = 0; + timeflag = fftflag = histoflag = neighflag = 0; time_loop = cpu_loop = time_other = 0.0; if (flag == 1) { @@ -103,6 +106,7 @@ void Finish::end(int flag) } if (flag == 2) prdflag = timeflag = histoflag = neighflag = 1; if (flag == 3) tadflag = histoflag = neighflag = 1; + if (flag == 4) hyperflag = timeflag = histoflag = neighflag = 1; // loop stats @@ -161,8 +165,10 @@ void Finish::end(int flag) if (lmp->kokkos) { const char fmt2[] = "%.1f%% CPU use with %d MPI tasks x %d OpenMP threads\n"; - if (screen) fprintf(screen,fmt2,cpu_loop,nprocs,lmp->kokkos->num_threads); - if (logfile) fprintf(logfile,fmt2,cpu_loop,nprocs,lmp->kokkos->num_threads); + if (screen) fprintf(screen,fmt2,cpu_loop,nprocs, + lmp->kokkos->num_threads); + if (logfile) fprintf(logfile,fmt2,cpu_loop,nprocs, + lmp->kokkos->num_threads); } else { #if defined(_OPENMP) const char fmt2[] = @@ -409,12 +415,61 @@ void Finish::end(int flag) } } + // HYPER stats using PAIR,BOND,KSPACE for dynamics,quench + + if (hyperflag) { + if (me == 0) { + if (screen) fprintf(screen,"\nHyper stats:\n"); + if (logfile) fprintf(logfile,"\nHyper stats:\n"); + } + + time = timer->get_wall(Timer::DYNAMICS); + MPI_Allreduce(&time,&tmp,1,MPI_DOUBLE,MPI_SUM,world); + time = tmp/nprocs; + if (me == 0) { + if (screen) + fprintf(screen," Dynamics time (%%) = %g (%g)\n", + time,time/time_loop*100.0); + if (logfile) + fprintf(logfile," Dynamics time (%%) = %g (%g)\n", + time,time/time_loop*100.0); + } + + time = timer->get_wall(Timer::QUENCH); + MPI_Allreduce(&time,&tmp,1,MPI_DOUBLE,MPI_SUM,world); + time = tmp/nprocs; + if (me == 0) { + if (screen) + fprintf(screen," Quench time (%%) = %g (%g)\n", + time,time/time_loop*100.0); + if (logfile) + fprintf(logfile," Quench time (%%) = %g (%g)\n", + time,time/time_loop*100.0); + } + + time = time_other; + MPI_Allreduce(&time,&tmp,1,MPI_DOUBLE,MPI_SUM,world); + time = tmp/nprocs; + if (me == 0) { + if (screen) + fprintf(screen," Other time (%%) = %g (%g)\n", + time,time/time_loop*100.0); + if (logfile) + fprintf(logfile," Other time (%%) = %g (%g)\n", + time,time/time_loop*100.0); + } + } + + // further timing breakdowns + if (timeflag && timer->has_normal()) { if (timer->has_full()) { const char hdr[] = "\nMPI task timing breakdown:\n" - "Section | min time | avg time | max time |%varavg| %CPU | %total\n" - "-----------------------------------------------------------------------\n"; + "Section | min time | avg time | max time " + "|%varavg| %CPU | %total\n" + "-----------------------------------------------" + "------------------------\n"; if (me == 0) { if (screen) fputs(hdr,screen); if (logfile) fputs(hdr,logfile); @@ -516,8 +571,10 @@ void Finish::end(int flag) if (lmp->kokkos && lmp->kokkos->ngpu > 0) if (const char* env_clb = getenv("CUDA_LAUNCH_BLOCKING")) if (!(strcmp(env_clb,"1") == 0)) { - error->warning(FLERR,"Timing breakdown may not be accurate since GPU/CPU overlap is enabled. " - "Using 'export CUDA_LAUNCH_BLOCKING=1' will give an accurate timing breakdown but will reduce performance"); + error->warning(FLERR,"Timing breakdown may not be accurate " + "since GPU/CPU overlap is enabled\n" + "Using 'export CUDA_LAUNCH_BLOCKING=1' will give an " + "accurate timing breakdown but will reduce performance"); } // FFT timing statistics diff --git a/src/fix.h b/src/fix.h index 65ababf287..bd3189afe7 100644 --- a/src/fix.h +++ b/src/fix.h @@ -113,6 +113,7 @@ class Fix : protected Pointers { virtual void setup_pre_exchange() {} virtual void setup_pre_neighbor() {} virtual void setup_pre_force(int) {} + virtual void setup_pre_reverse(int, int) {} virtual void min_setup(int) {} virtual void initial_integrate(int) {} virtual void post_integrate() {} @@ -151,12 +152,10 @@ class Fix : protected Pointers { virtual void post_force_respa(int, int, int) {} virtual void final_integrate_respa(int, int) {} - virtual void min_setup_pre_exchange() {} - virtual void min_setup_pre_neighbor() {} - virtual void min_setup_pre_force(int) {} virtual void min_pre_exchange() {} virtual void min_pre_neighbor() {} virtual void min_pre_force(int) {} + virtual void min_pre_reverse(int,int) {} virtual void min_post_force(int) {} virtual double min_energy(double *) {return 0.0;} @@ -241,23 +240,24 @@ namespace FixConst { static const int PRE_EXCHANGE = 1<<2; static const int PRE_NEIGHBOR = 1<<3; static const int PRE_FORCE = 1<<4; - static const int POST_FORCE = 1<<5; - static const int FINAL_INTEGRATE = 1<<6; - static const int END_OF_STEP = 1<<7; - static const int THERMO_ENERGY = 1<<8; - static const int INITIAL_INTEGRATE_RESPA = 1<<9; - static const int POST_INTEGRATE_RESPA = 1<<10; - static const int PRE_FORCE_RESPA = 1<<11; - static const int POST_FORCE_RESPA = 1<<12; - static const int FINAL_INTEGRATE_RESPA = 1<<13; - static const int MIN_PRE_EXCHANGE = 1<<14; - static const int MIN_PRE_NEIGHBOR = 1<<15; - static const int MIN_PRE_FORCE = 1<<16; - static const int MIN_POST_FORCE = 1<<17; - static const int MIN_ENERGY = 1<<18; - static const int POST_RUN = 1<<19; - static const int PRE_REVERSE = 1<<20; - static const int FIX_CONST_LAST = 1<<21; + static const int PRE_REVERSE = 1<<5; + static const int POST_FORCE = 1<<6; + static const int FINAL_INTEGRATE = 1<<7; + static const int END_OF_STEP = 1<<8; + static const int POST_RUN = 1<<9; + static const int THERMO_ENERGY = 1<<10; + static const int INITIAL_INTEGRATE_RESPA = 1<<11; + static const int POST_INTEGRATE_RESPA = 1<<12; + static const int PRE_FORCE_RESPA = 1<<13; + static const int POST_FORCE_RESPA = 1<<14; + static const int FINAL_INTEGRATE_RESPA = 1<<15; + static const int MIN_PRE_EXCHANGE = 1<<16; + static const int MIN_PRE_NEIGHBOR = 1<<17; + static const int MIN_PRE_FORCE = 1<<18; + static const int MIN_PRE_REVERSE = 1<<19; + static const int MIN_POST_FORCE = 1<<20; + static const int MIN_ENERGY = 1<<21; + static const int FIX_CONST_LAST = 1<<22; } } diff --git a/src/fix_restrain.cpp b/src/fix_restrain.cpp index 067f1014d5..f276be76af 100644 --- a/src/fix_restrain.cpp +++ b/src/fix_restrain.cpp @@ -45,7 +45,8 @@ enum{BOND,ANGLE,DIHEDRAL}; FixRestrain::FixRestrain(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), - rstyle(NULL), ids(NULL), kstart(NULL), kstop(NULL), target(NULL), cos_target(NULL), sin_target(NULL) + rstyle(NULL), ids(NULL), kstart(NULL), kstop(NULL), target(NULL), + cos_target(NULL), sin_target(NULL) { if (narg < 4) error->all(FLERR,"Illegal fix restrain command"); diff --git a/src/min.cpp b/src/min.cpp index 6e568aee0b..9207c6bdc2 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -284,7 +284,7 @@ void Min::setup() else force->kspace->compute_dummy(eflag,vflag); } - modify->pre_reverse(eflag,vflag); + modify->setup_pre_reverse(eflag,vflag); if (force->newton) comm->reverse_comm(); // update per-atom minimization variables stored by pair styles @@ -365,7 +365,7 @@ void Min::setup_minimal(int flag) else force->kspace->compute_dummy(eflag,vflag); } - modify->pre_reverse(eflag,vflag); + modify->setup_pre_reverse(eflag,vflag); if (force->newton) comm->reverse_comm(); // update per-atom minimization variables stored by pair styles @@ -493,6 +493,11 @@ double Min::energy_force(int resetflag) comm->borders(); if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); timer->stamp(Timer::COMM); + if (modify->n_min_pre_neighbor) { + timer->stamp(); + modify->min_pre_neighbor(); + timer->stamp(Timer::MODIFY); + } neighbor->build(); timer->stamp(Timer::NEIGH); } @@ -525,8 +530,8 @@ double Min::energy_force(int resetflag) timer->stamp(Timer::KSPACE); } - if (modify->n_pre_reverse) { - modify->pre_reverse(eflag,vflag); + if (modify->n_min_pre_reverse) { + modify->min_pre_reverse(eflag,vflag); timer->stamp(Timer::MODIFY); } diff --git a/src/modify.cpp b/src/modify.cpp index 2e5bd78504..14e55ab414 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -47,7 +47,8 @@ Modify::Modify(LAMMPS *lmp) : Pointers(lmp) n_thermo_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_min_pre_exchange = n_min_pre_force = n_min_post_force = n_min_energy = 0; + n_min_pre_exchange = n_min_pre_force = n_min_pre_reverse = 0; + n_min_post_force = n_min_energy = 0; fix = NULL; fmask = NULL; @@ -60,7 +61,7 @@ Modify::Modify(LAMMPS *lmp) : Pointers(lmp) list_pre_force_respa = list_post_force_respa = NULL; list_final_integrate_respa = NULL; list_min_pre_exchange = list_min_pre_neighbor = NULL; - list_min_pre_force = list_min_post_force = NULL; + list_min_pre_force = list_min_pre_reverse = list_min_post_force = NULL; list_min_energy = NULL; end_of_step_every = NULL; @@ -136,6 +137,7 @@ Modify::~Modify() delete [] list_min_pre_exchange; delete [] list_min_pre_neighbor; delete [] list_min_pre_force; + delete [] list_min_pre_reverse; delete [] list_min_post_force; delete [] list_min_energy; @@ -188,6 +190,7 @@ void Modify::init() list_init(MIN_PRE_EXCHANGE,n_min_pre_exchange,list_min_pre_exchange); list_init(MIN_PRE_NEIGHBOR,n_min_pre_neighbor,list_min_pre_neighbor); list_init(MIN_PRE_FORCE,n_min_pre_force,list_min_pre_force); + list_init(MIN_PRE_REVERSE,n_min_pre_reverse,list_min_pre_reverse); list_init(MIN_POST_FORCE,n_min_post_force,list_min_post_force); list_init(MIN_ENERGY,n_min_energy,list_min_energy); @@ -307,7 +310,7 @@ void Modify::setup_pre_exchange() fix[list_pre_exchange[i]]->setup_pre_exchange(); else if (update->whichflag == 2) for (int i = 0; i < n_min_pre_exchange; i++) - fix[list_min_pre_exchange[i]]->min_setup_pre_exchange(); + fix[list_min_pre_exchange[i]]->setup_pre_exchange(); } /* ---------------------------------------------------------------------- @@ -322,7 +325,7 @@ void Modify::setup_pre_neighbor() fix[list_pre_neighbor[i]]->setup_pre_neighbor(); else if (update->whichflag == 2) for (int i = 0; i < n_min_pre_neighbor; i++) - fix[list_min_pre_neighbor[i]]->min_setup_pre_neighbor(); + fix[list_min_pre_neighbor[i]]->setup_pre_neighbor(); } /* ---------------------------------------------------------------------- @@ -337,7 +340,22 @@ void Modify::setup_pre_force(int vflag) fix[list_pre_force[i]]->setup_pre_force(vflag); else if (update->whichflag == 2) for (int i = 0; i < n_min_pre_force; i++) - fix[list_min_pre_force[i]]->min_setup_pre_force(vflag); + fix[list_min_pre_force[i]]->setup_pre_force(vflag); +} + +/* ---------------------------------------------------------------------- + setup pre_reverse call, only for fixes that define pre_reverse + called from Verlet, RESPA, Min +------------------------------------------------------------------------- */ + +void Modify::setup_pre_reverse(int eflag, int vflag) +{ + if (update->whichflag == 1) + for (int i = 0; i < n_pre_reverse; i++) + fix[list_pre_reverse[i]]->setup_pre_reverse(eflag,vflag); + else if (update->whichflag == 2) + for (int i = 0; i < n_min_pre_reverse; i++) + fix[list_min_pre_reverse[i]]->setup_pre_reverse(eflag,vflag); } /* ---------------------------------------------------------------------- @@ -580,6 +598,16 @@ void Modify::min_pre_force(int vflag) fix[list_min_pre_force[i]]->min_pre_force(vflag); } +/* ---------------------------------------------------------------------- + minimizer pre-reverse call, only for relevant fixes +------------------------------------------------------------------------- */ + +void Modify::min_pre_reverse(int eflag, int vflag) +{ + for (int i = 0; i < n_min_pre_reverse; i++) + fix[list_min_pre_reverse[i]]->min_pre_reverse(eflag,vflag); +} + /* ---------------------------------------------------------------------- minimizer force adjustment call, only for relevant fixes ------------------------------------------------------------------------- */ diff --git a/src/modify.h b/src/modify.h index f6f59a6a9c..d6793a754e 100644 --- a/src/modify.h +++ b/src/modify.h @@ -35,7 +35,7 @@ class Modify : protected Pointers { int n_initial_integrate_respa,n_post_integrate_respa; int n_pre_force_respa,n_post_force_respa,n_final_integrate_respa; int n_min_pre_exchange,n_min_pre_neighbor; - int n_min_pre_force,n_min_post_force,n_min_energy; + int n_min_pre_force,n_min_pre_reverse,n_min_post_force,n_min_energy; int restart_pbc_any; // 1 if any fix sets restart_pbc int nfix_restart_global; // stored fix global info from restart file @@ -54,6 +54,7 @@ class Modify : protected Pointers { virtual void setup_pre_exchange(); virtual void setup_pre_neighbor(); virtual void setup_pre_force(int); + virtual void setup_pre_reverse(int, int); virtual void initial_integrate(int); virtual void post_integrate(); virtual void pre_exchange(); @@ -78,6 +79,7 @@ class Modify : protected Pointers { virtual void min_pre_exchange(); virtual void min_pre_neighbor(); virtual void min_pre_force(int); + virtual void min_pre_reverse(int,int); virtual void min_post_force(int); virtual double min_energy(double *); @@ -124,7 +126,7 @@ class Modify : protected Pointers { int *list_pre_force_respa,*list_post_force_respa; int *list_final_integrate_respa; int *list_min_pre_exchange,*list_min_pre_neighbor; - int *list_min_pre_force,*list_min_post_force; + int *list_min_pre_force,*list_min_pre_reverse,*list_min_post_force; int *list_min_energy; int *end_of_step_every; diff --git a/src/respa.cpp b/src/respa.cpp index db0f11d5b3..7646115fa9 100644 --- a/src/respa.cpp +++ b/src/respa.cpp @@ -44,8 +44,10 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -Respa::Respa(LAMMPS *lmp, int narg, char **arg) : Integrate(lmp, narg, arg), -step(NULL), loop(NULL), hybrid_level(NULL), hybrid_compute(NULL), newton(NULL), fix_respa(NULL) +Respa::Respa(LAMMPS *lmp, int narg, char **arg) : + Integrate(lmp, narg, arg), + step(NULL), loop(NULL), hybrid_level(NULL), hybrid_compute(NULL), + newton(NULL), fix_respa(NULL) { nhybrid_styles = 0; if (narg < 1) error->all(FLERR,"Illegal run_style respa command"); @@ -473,7 +475,7 @@ void Respa::setup() if (kspace_compute_flag) force->kspace->compute(eflag,vflag); } - modify->pre_reverse(eflag,vflag); + modify->setup_pre_reverse(eflag,vflag); if (newton[ilevel]) comm->reverse_comm(); copy_f_flevel(ilevel); } @@ -549,7 +551,7 @@ void Respa::setup_minimal(int flag) if (kspace_compute_flag) force->kspace->compute(eflag,vflag); } - modify->pre_reverse(eflag,vflag); + modify->setup_pre_reverse(eflag,vflag); if (newton[ilevel]) comm->reverse_comm(); copy_f_flevel(ilevel); } diff --git a/src/run.cpp b/src/run.cpp index f238e7852b..3317545342 100644 --- a/src/run.cpp +++ b/src/run.cpp @@ -43,6 +43,7 @@ void Run::command(int narg, char **arg) error->all(FLERR,"Run command before simulation box is defined"); // ignore run command, if walltime limit was already reached + if (timer->is_timeout()) return; bigint nsteps_input = force->bnumeric(FLERR,arg[0]); diff --git a/src/verlet.cpp b/src/verlet.cpp index 035cab79ef..915648040e 100644 --- a/src/verlet.cpp +++ b/src/verlet.cpp @@ -144,7 +144,7 @@ void Verlet::setup() else force->kspace->compute_dummy(eflag,vflag); } - modify->pre_reverse(eflag,vflag); + modify->setup_pre_reverse(eflag,vflag); if (force->newton) comm->reverse_comm(); modify->setup(vflag); @@ -205,7 +205,7 @@ void Verlet::setup_minimal(int flag) else force->kspace->compute_dummy(eflag,vflag); } - modify->pre_reverse(eflag,vflag); + modify->setup_pre_reverse(eflag,vflag); if (force->newton) comm->reverse_comm(); modify->setup(vflag); -- GitLab