From ce17e81d93d7416c0e2da3c941768fdd17fcfc8a Mon Sep 17 00:00:00 2001 From: Mark Abraham Date: Wed, 3 Apr 2019 15:58:39 +0200 Subject: [PATCH] Initial deactivation of group scheme. mdrun now gives a fatal error with a group-scheme .tpr, so anybody using one won't get a segfault. do_force now only has one implementation, which suits those working on improved force calculations. More removal of inactive code will follow later. Noted TODO to fix the release notes properly in such a commit. Refs #1852 Change-Id: I3b13135565951f4d7f872ddf3b8518860eccfdb0 --- .../2020/major/removed-functionality.rst | 10 + src/gromacs/mdlib/force.h | 60 ++- src/gromacs/mdlib/forcerec.cpp | 5 + src/gromacs/mdlib/shellfc.cpp | 59 ++- src/gromacs/mdlib/shellfc.h | 56 ++- src/gromacs/mdlib/sim_util.cpp | 464 ++------------------- src/gromacs/mdrun/md.cpp | 4 +- src/gromacs/mdrun/mimic.cpp | 4 +- src/gromacs/mdrun/minimize.cpp | 3 +- src/gromacs/mdrun/rerun.cpp | 4 +- src/gromacs/mdrun/tpi.cpp | 2 +- 11 files changed, 150 insertions(+), 521 deletions(-) diff --git a/docs/release-notes/2020/major/removed-functionality.rst b/docs/release-notes/2020/major/removed-functionality.rst index b324c2897b..264f6345e0 100644 --- a/docs/release-notes/2020/major/removed-functionality.rst +++ b/docs/release-notes/2020/major/removed-functionality.rst @@ -7,6 +7,16 @@ Removed functionality Also, please use the syntax :issue:`number` to reference issues on redmine, without the a space between the colon and number! +Group cut-off scheme +"""""""""""""""""""" + +The group cut-off scheme has been removed. Several kinds of simulation +that depend on it no longer work. + +.. TODO list those (Mark has other work incoming that does so) + +:issue:`1852` + gmx anadock """"""""""" The gmx anadock tool was removed since it does not belong in gromacs diff --git a/src/gromacs/mdlib/force.h b/src/gromacs/mdlib/force.h index 47c947b14c..0bcc3478e3 100644 --- a/src/gromacs/mdlib/force.h +++ b/src/gromacs/mdlib/force.h @@ -89,38 +89,34 @@ void sum_epot(gmx_grppairener_t *grpp, real *epot); void sum_dhdl(gmx_enerdata_t *enerd, gmx::ArrayRef lambda, t_lambda *fepvals); /* Sum the free energy contributions */ -void do_force(FILE *log, - const t_commrec *cr, - const gmx_multisim_t *ms, - const t_inputrec *inputrec, - gmx::Awh *awh, - gmx_enfrot *enforcedRotation, - int64_t step, - t_nrnb *nrnb, - gmx_wallcycle *wcycle, - // TODO top can be const when the group scheme no longer - // builds exclusions during neighbor searching within - // do_force_cutsGROUP. - gmx_localtop_t *top, - const SimulationGroups *groups, - matrix box, - gmx::ArrayRefWithPadding coordinates, - history_t *hist, - gmx::ArrayRefWithPadding force, - tensor vir_force, - const t_mdatoms *mdatoms, - gmx_enerdata_t *enerd, - t_fcdata *fcd, - gmx::ArrayRef lambda, - t_graph *graph, - t_forcerec *fr, - gmx::PpForceWorkload *ppForceWorkload, - const gmx_vsite_t *vsite, - rvec mu_tot, - double t, - gmx_edsam *ed, - int flags, - const DDBalanceRegionHandler &ddBalanceRegionHandler); +void do_force(FILE *log, + const t_commrec *cr, + const gmx_multisim_t *ms, + const t_inputrec *inputrec, + gmx::Awh *awh, + gmx_enfrot *enforcedRotation, + int64_t step, + t_nrnb *nrnb, + gmx_wallcycle *wcycle, + const gmx_localtop_t *top, + matrix box, + gmx::ArrayRefWithPadding coordinates, + history_t *hist, + gmx::ArrayRefWithPadding force, + tensor vir_force, + const t_mdatoms *mdatoms, + gmx_enerdata_t *enerd, + t_fcdata *fcd, + gmx::ArrayRef lambda, + t_graph *graph, + t_forcerec *fr, + gmx::PpForceWorkload *ppForceWorkload, + const gmx_vsite_t *vsite, + rvec mu_tot, + double t, + gmx_edsam *ed, + int flags, + const DDBalanceRegionHandler &ddBalanceRegionHandler); /* Communicate coordinates (if parallel). * Do neighbor searching (if necessary). diff --git a/src/gromacs/mdlib/forcerec.cpp b/src/gromacs/mdlib/forcerec.cpp index 56c5707d92..cc8a6151d1 100644 --- a/src/gromacs/mdlib/forcerec.cpp +++ b/src/gromacs/mdlib/forcerec.cpp @@ -1628,6 +1628,11 @@ void init_forcerec(FILE *fp, gmx_bool bFEP_NonBonded; int *nm_ind, egp_flags; + if (fr->cutoff_scheme == ecutsGROUP) + { + gmx_fatal(FARGS, "This group-scheme .tpr file can no longer be run by mdrun. Please update to the Verlet scheme, or use an earlier version of GROMACS if necessary."); + } + /* By default we turn SIMD kernels on, but it might be turned off further down... */ fr->use_simd_kernels = TRUE; diff --git a/src/gromacs/mdlib/shellfc.cpp b/src/gromacs/mdlib/shellfc.cpp index 1917fd7675..1ef9940df6 100644 --- a/src/gromacs/mdlib/shellfc.cpp +++ b/src/gromacs/mdlib/shellfc.cpp @@ -964,34 +964,33 @@ static void init_adir(gmx_shellfc_t *shfc, nullptr, nullptr, gmx::ConstraintVariable::Deriv_FlexCon); } -void relax_shell_flexcon(FILE *fplog, - const t_commrec *cr, - const gmx_multisim_t *ms, - gmx_bool bVerbose, - gmx_enfrot *enforcedRotation, - int64_t mdstep, - const t_inputrec *inputrec, - gmx_bool bDoNS, - int force_flags, - gmx_localtop_t *top, - gmx::Constraints *constr, - gmx_enerdata_t *enerd, - t_fcdata *fcd, - t_state *state, - gmx::ArrayRefWithPadding f, - tensor force_vir, - const t_mdatoms *md, - t_nrnb *nrnb, - gmx_wallcycle_t wcycle, - t_graph *graph, - const SimulationGroups *groups, - gmx_shellfc_t *shfc, - t_forcerec *fr, - gmx::PpForceWorkload *ppForceWorkload, - double t, - rvec mu_tot, - const gmx_vsite_t *vsite, - const DDBalanceRegionHandler &ddBalanceRegionHandler) +void relax_shell_flexcon(FILE *fplog, + const t_commrec *cr, + const gmx_multisim_t *ms, + gmx_bool bVerbose, + gmx_enfrot *enforcedRotation, + int64_t mdstep, + const t_inputrec *inputrec, + gmx_bool bDoNS, + int force_flags, + gmx_localtop_t *top, + gmx::Constraints *constr, + gmx_enerdata_t *enerd, + t_fcdata *fcd, + t_state *state, + gmx::ArrayRefWithPadding f, + tensor force_vir, + const t_mdatoms *md, + t_nrnb *nrnb, + gmx_wallcycle_t wcycle, + t_graph *graph, + gmx_shellfc_t *shfc, + t_forcerec *fr, + gmx::PpForceWorkload *ppForceWorkload, + double t, + rvec mu_tot, + const gmx_vsite_t *vsite, + const DDBalanceRegionHandler &ddBalanceRegionHandler) { int nshell; t_shell *shell; @@ -1125,7 +1124,7 @@ void relax_shell_flexcon(FILE *fplog, } int shellfc_flags = force_flags | (bVerbose ? GMX_FORCE_ENERGY : 0); do_force(fplog, cr, ms, inputrec, nullptr, enforcedRotation, - mdstep, nrnb, wcycle, top, groups, + mdstep, nrnb, wcycle, top, state->box, state->x.arrayRefWithPadding(), &state->hist, forceWithPadding[Min], force_vir, md, enerd, fcd, state->lambda, graph, @@ -1236,7 +1235,7 @@ void relax_shell_flexcon(FILE *fplog, /* Try the new positions */ do_force(fplog, cr, ms, inputrec, nullptr, enforcedRotation, 1, nrnb, wcycle, - top, groups, state->box, posWithPadding[Try], &state->hist, + top, state->box, posWithPadding[Try], &state->hist, forceWithPadding[Try], force_vir, md, enerd, fcd, state->lambda, graph, fr, ppForceWorkload, vsite, mu_tot, t, nullptr, diff --git a/src/gromacs/mdlib/shellfc.h b/src/gromacs/mdlib/shellfc.h index d5e6004187..81e91c00e5 100644 --- a/src/gromacs/mdlib/shellfc.h +++ b/src/gromacs/mdlib/shellfc.h @@ -46,7 +46,6 @@ class DDBalanceRegionHandler; struct gmx_enerdata_t; struct gmx_enfrot; -struct SimulationGroups; struct gmx_multisim_t; struct gmx_shellfc_t; struct gmx_mtop_t; @@ -75,34 +74,33 @@ void make_local_shells(const t_commrec *cr, gmx_shellfc_t *shfc); /* Optimize shell positions */ -void relax_shell_flexcon(FILE *log, - const t_commrec *cr, - const gmx_multisim_t *ms, - gmx_bool bVerbose, - gmx_enfrot *enforcedRotation, - int64_t mdstep, - const t_inputrec *inputrec, - gmx_bool bDoNS, - int force_flags, - gmx_localtop_t *top, - gmx::Constraints *constr, - gmx_enerdata_t *enerd, - t_fcdata *fcd, - t_state *state, - gmx::ArrayRefWithPadding f, - tensor force_vir, - const t_mdatoms *md, - t_nrnb *nrnb, - gmx_wallcycle_t wcycle, - t_graph *graph, - const SimulationGroups *groups, - gmx_shellfc_t *shfc, - t_forcerec *fr, - gmx::PpForceWorkload *ppForceWorkload, - double t, - rvec mu_tot, - const gmx_vsite_t *vsite, - const DDBalanceRegionHandler &ddBalanceRegionHandler); +void relax_shell_flexcon(FILE *log, + const t_commrec *cr, + const gmx_multisim_t *ms, + gmx_bool bVerbose, + gmx_enfrot *enforcedRotation, + int64_t mdstep, + const t_inputrec *inputrec, + gmx_bool bDoNS, + int force_flags, + gmx_localtop_t *top, + gmx::Constraints *constr, + gmx_enerdata_t *enerd, + t_fcdata *fcd, + t_state *state, + gmx::ArrayRefWithPadding f, + tensor force_vir, + const t_mdatoms *md, + t_nrnb *nrnb, + gmx_wallcycle_t wcycle, + t_graph *graph, + gmx_shellfc_t *shfc, + t_forcerec *fr, + gmx::PpForceWorkload *ppForceWorkload, + double t, + rvec mu_tot, + const gmx_vsite_t *vsite, + const DDBalanceRegionHandler &ddBalanceRegionHandler); /* Print some final output */ void done_shellfc(FILE *fplog, gmx_shellfc_t *shellfc, int64_t numSteps); diff --git a/src/gromacs/mdlib/sim_util.cpp b/src/gromacs/mdlib/sim_util.cpp index 857986d814..a72f6e97b4 100644 --- a/src/gromacs/mdlib/sim_util.cpp +++ b/src/gromacs/mdlib/sim_util.cpp @@ -797,41 +797,47 @@ setupForceWorkload(gmx::PpForceWorkload *forceWork, forceWork->haveCpuListedForceWork = haveCpuListedForces(*fr, idef, *fcd); } -static void do_force_cutsVERLET(FILE *fplog, - const t_commrec *cr, - const gmx_multisim_t *ms, - const t_inputrec *inputrec, - gmx::Awh *awh, - gmx_enfrot *enforcedRotation, - int64_t step, - t_nrnb *nrnb, - gmx_wallcycle_t wcycle, - const gmx_localtop_t *top, - const SimulationGroups * /* groups */, - matrix box, gmx::ArrayRefWithPadding x, - history_t *hist, - gmx::ArrayRefWithPadding force, - tensor vir_force, - const t_mdatoms *mdatoms, - gmx_enerdata_t *enerd, t_fcdata *fcd, - real *lambda, - t_graph *graph, - t_forcerec *fr, - gmx::PpForceWorkload *ppForceWorkload, - interaction_const_t *ic, - const gmx_vsite_t *vsite, - rvec mu_tot, - double t, - gmx_edsam *ed, - const int flags, - const DDBalanceRegionHandler &ddBalanceRegionHandler) +void do_force(FILE *fplog, + const t_commrec *cr, + const gmx_multisim_t *ms, + const t_inputrec *inputrec, + gmx::Awh *awh, + gmx_enfrot *enforcedRotation, + int64_t step, + t_nrnb *nrnb, + gmx_wallcycle_t wcycle, + const gmx_localtop_t *top, + matrix box, + gmx::ArrayRefWithPadding x, //NOLINT(performance-unnecessary-value-param) + history_t *hist, + gmx::ArrayRefWithPadding force, //NOLINT(performance-unnecessary-value-param) + tensor vir_force, + const t_mdatoms *mdatoms, + gmx_enerdata_t *enerd, + t_fcdata *fcd, + gmx::ArrayRef lambda, + t_graph *graph, + t_forcerec *fr, + gmx::PpForceWorkload *ppForceWorkload, + const gmx_vsite_t *vsite, + rvec mu_tot, + double t, + gmx_edsam *ed, + int flags, + const DDBalanceRegionHandler &ddBalanceRegionHandler) { - int i, j; - double mu[2*DIM]; - gmx_bool bStateChanged, bNS, bFillGrid, bCalcCGCM; - gmx_bool bDoForces, bUseGPU, bUseOrEmulGPU; - nonbonded_verlet_t *nbv = fr->nbv.get(); + int i, j; + double mu[2*DIM]; + gmx_bool bStateChanged, bNS, bFillGrid, bCalcCGCM; + gmx_bool bDoForces, bUseGPU, bUseOrEmulGPU; + nonbonded_verlet_t *nbv = fr->nbv.get(); + interaction_const_t *ic = fr->ic; + /* modify force flag if not doing nonbonded */ + if (!fr->bNonbonded) + { + flags &= ~GMX_FORCE_NONBONDED; + } bStateChanged = ((flags & GMX_FORCE_STATECHANGED) != 0); bNS = ((flags & GMX_FORCE_NS) != 0); bFillGrid = (bNS && bStateChanged); @@ -1213,14 +1219,14 @@ static void do_force_cutsVERLET(FILE *fplog, wallcycle_sub_start(wcycle, ewcsNONBONDED); nbv->dispatchFreeEnergyKernel(Nbnxm::InteractionLocality::Local, fr, as_rvec_array(x.unpaddedArrayRef().data()), forceOut.f, *mdatoms, - inputrec->fepvals, lambda, + inputrec->fepvals, lambda.data(), enerd, flags, nrnb); if (havePPDomainDecomposition(cr)) { nbv->dispatchFreeEnergyKernel(Nbnxm::InteractionLocality::NonLocal, fr, as_rvec_array(x.unpaddedArrayRef().data()), forceOut.f, *mdatoms, - inputrec->fepvals, lambda, + inputrec->fepvals, lambda.data(), enerd, flags, nrnb); } wallcycle_sub_stop(wcycle, ewcsNONBONDED); @@ -1264,7 +1270,7 @@ static void do_force_cutsVERLET(FILE *fplog, do_force_lowlevel(fr, inputrec, &(top->idef), cr, ms, nrnb, wcycle, mdatoms, as_rvec_array(x.unpaddedArrayRef().data()), hist, forceOut.f, &forceOut.forceWithVirial, enerd, fcd, - box, inputrec->fepvals, lambda, graph, &(top->excls), fr->mu_tot, + box, inputrec->fepvals, lambda.data(), graph, &(top->excls), fr->mu_tot, flags, ddBalanceRegionHandler); @@ -1272,7 +1278,7 @@ static void do_force_cutsVERLET(FILE *fplog, computeSpecialForces(fplog, cr, inputrec, awh, enforcedRotation, step, t, wcycle, - fr->forceProviders, box, x.unpaddedArrayRef(), mdatoms, lambda, + fr->forceProviders, box, x.unpaddedArrayRef(), mdatoms, lambda.data(), flags, &forceOut.forceWithVirial, enerd, ed, bNS); @@ -1474,390 +1480,6 @@ static void do_force_cutsVERLET(FILE *fplog, checkPotentialEnergyValidity(step, *enerd, *inputrec); } } -} - -static void do_force_cutsGROUP(FILE *fplog, - const t_commrec *cr, - const gmx_multisim_t *ms, - const t_inputrec *inputrec, - gmx::Awh *awh, - gmx_enfrot *enforcedRotation, - int64_t step, - t_nrnb *nrnb, - gmx_wallcycle_t wcycle, - gmx_localtop_t *top, - const SimulationGroups *groups, - matrix box, gmx::ArrayRefWithPadding x, - history_t *hist, - gmx::ArrayRefWithPadding force, - tensor vir_force, - const t_mdatoms *mdatoms, - gmx_enerdata_t *enerd, - t_fcdata *fcd, - real *lambda, - t_graph *graph, - t_forcerec *fr, - const gmx_vsite_t *vsite, - rvec mu_tot, - double t, - gmx_edsam *ed, - int flags, - const DDBalanceRegionHandler &ddBalanceRegionHandler) -{ - int cg0, cg1, i, j; - double mu[2*DIM]; - gmx_bool bStateChanged, bNS, bFillGrid, bCalcCGCM; - gmx_bool bDoForces; - - const int start = 0; - const int homenr = mdatoms->homenr; - - clear_mat(vir_force); - - cg0 = 0; - if (DOMAINDECOMP(cr)) - { - cg1 = cr->dd->globalAtomGroupIndices.size(); - } - else - { - cg1 = top->cgs.nr; - } - if (fr->n_tpi > 0) - { - cg1--; - } - - bStateChanged = ((flags & GMX_FORCE_STATECHANGED) != 0); - bNS = ((flags & GMX_FORCE_NS) != 0); - /* Should we perform the long-range nonbonded evaluation inside the neighborsearching? */ - bFillGrid = (bNS && bStateChanged); - bCalcCGCM = (bFillGrid && !DOMAINDECOMP(cr)); - bDoForces = ((flags & GMX_FORCE_FORCES) != 0); - - if (bStateChanged) - { - update_forcerec(fr, box); - - if (inputrecNeedMutot(inputrec)) - { - /* Calculate total (local) dipole moment in a temporary common array. - * This makes it possible to sum them over nodes faster. - */ - calc_mu(start, homenr, - x.unpaddedArrayRef(), mdatoms->chargeA, mdatoms->chargeB, mdatoms->nChargePerturbed, - mu, mu+DIM); - } - } - - if (fr->ePBC != epbcNONE) - { - /* Compute shift vectors every step, - * because of pressure coupling or box deformation! - */ - if ((flags & GMX_FORCE_DYNAMICBOX) && bStateChanged) - { - calc_shifts(box, fr->shift_vec); - } - - if (bCalcCGCM) - { - put_charge_groups_in_box(fplog, cg0, cg1, fr->ePBC, box, - &(top->cgs), as_rvec_array(x.unpaddedArrayRef().data()), fr->cg_cm); - inc_nrnb(nrnb, eNR_CGCM, homenr); - inc_nrnb(nrnb, eNR_RESETX, cg1-cg0); - } - else if (EI_ENERGY_MINIMIZATION(inputrec->eI) && graph) - { - unshift_self(graph, box, as_rvec_array(x.unpaddedArrayRef().data())); - } - } - else if (bCalcCGCM) - { - calc_cgcm(fplog, cg0, cg1, &(top->cgs), as_rvec_array(x.unpaddedArrayRef().data()), fr->cg_cm); - inc_nrnb(nrnb, eNR_CGCM, homenr); - } - - if (bCalcCGCM && gmx_debug_at) - { - pr_rvecs(debug, 0, "cgcm", fr->cg_cm, top->cgs.nr); - } - -#if GMX_MPI - if (!thisRankHasDuty(cr, DUTY_PME)) - { - /* Send particle coordinates to the pme nodes. - * Since this is only implemented for domain decomposition - * and domain decomposition does not use the graph, - * we do not need to worry about shifting. - */ - gmx_pme_send_coordinates(cr, box, as_rvec_array(x.unpaddedArrayRef().data()), - lambda[efptCOUL], lambda[efptVDW], - (flags & (GMX_FORCE_VIRIAL | GMX_FORCE_ENERGY)) != 0, - step, wcycle); - } -#endif /* GMX_MPI */ - - /* Communicate coordinates and sum dipole if necessary */ - if (DOMAINDECOMP(cr)) - { - dd_move_x(cr->dd, box, x.unpaddedArrayRef(), wcycle); - - /* No GPU support, no move_x overlap, so reopen the balance region here */ - ddBalanceRegionHandler.reopenRegionCpu(); - } - - if (inputrecNeedMutot(inputrec)) - { - if (bStateChanged) - { - if (PAR(cr)) - { - gmx_sumd(2*DIM, mu, cr); - - ddBalanceRegionHandler.reopenRegionCpu(); - } - for (i = 0; i < 2; i++) - { - for (j = 0; j < DIM; j++) - { - fr->mu_tot[i][j] = mu[i*DIM + j]; - } - } - } - if (fr->efep == efepNO) - { - copy_rvec(fr->mu_tot[0], mu_tot); - } - else - { - for (j = 0; j < DIM; j++) - { - mu_tot[j] = - (1.0 - lambda[efptCOUL])*fr->mu_tot[0][j] + lambda[efptCOUL]*fr->mu_tot[1][j]; - } - } - } - - /* Reset energies */ - reset_enerdata(enerd); - clear_rvecs(SHIFTS, fr->fshift); - - if (bNS) - { - wallcycle_start(wcycle, ewcNS); - - if (graph && bStateChanged) - { - /* Calculate intramolecular shift vectors to make molecules whole */ - mk_mshift(fplog, graph, fr->ePBC, box, as_rvec_array(x.unpaddedArrayRef().data())); - } - - /* Do the actual neighbour searching */ - ns(fplog, fr, box, - groups, top, mdatoms, - cr, nrnb, bFillGrid); - - wallcycle_stop(wcycle, ewcNS); - } - - if (DOMAINDECOMP(cr) && !thisRankHasDuty(cr, DUTY_PME)) - { - wallcycle_start(wcycle, ewcPPDURINGPME); - dd_force_flop_start(cr->dd, nrnb); - } - - if (inputrec->bRot) - { - wallcycle_start(wcycle, ewcROT); - do_rotation(cr, enforcedRotation, box, as_rvec_array(x.unpaddedArrayRef().data()), t, step, bNS); - wallcycle_stop(wcycle, ewcROT); - } - - - /* Start the force cycle counter. - * Note that a different counter is used for dynamic load balancing. - */ - wallcycle_start(wcycle, ewcFORCE); - - // set up and clear force outputs - struct ForceOutputs forceOut = setupForceOutputs(fr, *inputrec, force, bDoForces, ((flags & GMX_FORCE_VIRIAL) != 0), wcycle); - - if (inputrec->bPull && pull_have_constraint(inputrec->pull_work)) - { - clear_pull_forces(inputrec->pull_work); - } - - /* update QMMMrec, if necessary */ - if (fr->bQMMM) - { - update_QMMMrec(cr, fr, as_rvec_array(x.unpaddedArrayRef().data()), mdatoms, box); - } - - /* Compute the bonded and non-bonded energies and optionally forces */ - do_force_lowlevel(fr, inputrec, &(top->idef), - cr, ms, nrnb, wcycle, mdatoms, - as_rvec_array(x.unpaddedArrayRef().data()), hist, forceOut.f, &forceOut.forceWithVirial, enerd, fcd, - box, inputrec->fepvals, lambda, - graph, &(top->excls), fr->mu_tot, - flags, - ddBalanceRegionHandler); - - wallcycle_stop(wcycle, ewcFORCE); - - if (DOMAINDECOMP(cr)) - { - dd_force_flop_stop(cr->dd, nrnb); - - ddBalanceRegionHandler.closeAfterForceComputationCpu(); - } - - computeSpecialForces(fplog, cr, inputrec, awh, enforcedRotation, - step, t, wcycle, - fr->forceProviders, box, x.unpaddedArrayRef(), mdatoms, lambda, - flags, &forceOut.forceWithVirial, enerd, - ed, bNS); - - if (bDoForces) - { - /* Communicate the forces */ - if (DOMAINDECOMP(cr)) - { - dd_move_f(cr->dd, force.unpaddedArrayRef(), fr->fshift, wcycle); - /* Do we need to communicate the separate force array - * for terms that do not contribute to the single sum virial? - * Position restraints and electric fields do not introduce - * inter-cg forces, only full electrostatics methods do. - * When we do not calculate the virial, fr->f_novirsum = forceOut.f, - * so we have already communicated these forces. - */ - if (EEL_FULL(fr->ic->eeltype) && cr->dd->n_intercg_excl && - (flags & GMX_FORCE_VIRIAL)) - { - dd_move_f(cr->dd, forceOut.forceWithVirial.force_, nullptr, wcycle); - } - } - - /* If we have NoVirSum forces, but we do not calculate the virial, - * we sum fr->f_novirsum=forceOut.f later. - */ - if (vsite && !(fr->haveDirectVirialContributions && !(flags & GMX_FORCE_VIRIAL))) - { - spread_vsite_f(vsite, as_rvec_array(x.unpaddedArrayRef().data()), forceOut.f, fr->fshift, FALSE, nullptr, nrnb, - &top->idef, fr->ePBC, fr->bMolPBC, graph, box, cr, wcycle); - } - - if (flags & GMX_FORCE_VIRIAL) - { - /* Calculation of the virial must be done after vsites! */ - calc_virial(0, mdatoms->homenr, as_rvec_array(x.unpaddedArrayRef().data()), forceOut.f, - vir_force, graph, box, nrnb, fr, inputrec->ePBC); - } - } - - if (PAR(cr) && !thisRankHasDuty(cr, DUTY_PME)) - { - /* In case of node-splitting, the PP nodes receive the long-range - * forces, virial and energy from the PME nodes here. - */ - pme_receive_force_ener(cr, &forceOut.forceWithVirial, enerd, wcycle); - } - - if (bDoForces) - { - post_process_forces(cr, step, nrnb, wcycle, - top, box, as_rvec_array(x.unpaddedArrayRef().data()), forceOut.f, &forceOut.forceWithVirial, - vir_force, mdatoms, graph, fr, vsite, - flags); - } - - if (flags & GMX_FORCE_ENERGY) - { - /* Sum the potential energy terms from group contributions */ - sum_epot(&(enerd->grpp), enerd->term); - - if (!EI_TPI(inputrec->eI)) - { - checkPotentialEnergyValidity(step, *enerd, *inputrec); - } - } - -} - -void do_force(FILE *fplog, - const t_commrec *cr, - const gmx_multisim_t *ms, - const t_inputrec *inputrec, - gmx::Awh *awh, - gmx_enfrot *enforcedRotation, - int64_t step, - t_nrnb *nrnb, - gmx_wallcycle_t wcycle, - gmx_localtop_t *top, - const SimulationGroups *groups, - matrix box, - gmx::ArrayRefWithPadding x, //NOLINT(performance-unnecessary-value-param) - history_t *hist, - gmx::ArrayRefWithPadding force, //NOLINT(performance-unnecessary-value-param) - tensor vir_force, - const t_mdatoms *mdatoms, - gmx_enerdata_t *enerd, - t_fcdata *fcd, - gmx::ArrayRef lambda, - t_graph *graph, - t_forcerec *fr, - gmx::PpForceWorkload *ppForceWorkload, - const gmx_vsite_t *vsite, - rvec mu_tot, - double t, - gmx_edsam *ed, - int flags, - const DDBalanceRegionHandler &ddBalanceRegionHandler) -{ - /* modify force flag if not doing nonbonded */ - if (!fr->bNonbonded) - { - flags &= ~GMX_FORCE_NONBONDED; - } - - switch (inputrec->cutoff_scheme) - { - case ecutsVERLET: - do_force_cutsVERLET(fplog, cr, ms, inputrec, - awh, enforcedRotation, step, nrnb, wcycle, - top, - groups, - box, x, hist, - force, vir_force, - mdatoms, - enerd, fcd, - lambda.data(), graph, - fr, - ppForceWorkload, - fr->ic, - vsite, mu_tot, - t, ed, - flags, - ddBalanceRegionHandler); - break; - case ecutsGROUP: - do_force_cutsGROUP(fplog, cr, ms, inputrec, - awh, enforcedRotation, step, nrnb, wcycle, - top, - groups, - box, x, hist, - force, vir_force, - mdatoms, - enerd, fcd, - lambda.data(), graph, - fr, vsite, mu_tot, - t, ed, - flags, - ddBalanceRegionHandler); - break; - default: - gmx_incons("Invalid cut-off scheme passed!"); - } /* In case we don't have constraints and are using GPUs, the next balancing * region starts here. diff --git a/src/gromacs/mdrun/md.cpp b/src/gromacs/mdrun/md.cpp index 13c2fadea6..b9b28657c2 100644 --- a/src/gromacs/mdrun/md.cpp +++ b/src/gromacs/mdrun/md.cpp @@ -845,7 +845,7 @@ void gmx::Integrator::do_md() ir, bNS, force_flags, &top, constr, enerd, fcd, state, f.arrayRefWithPadding(), force_vir, mdatoms, - nrnb, wcycle, graph, groups, + nrnb, wcycle, graph, shellfc, fr, ppForceWorkload, t, mu_tot, vsite, ddBalanceRegionHandler); @@ -871,7 +871,7 @@ void gmx::Integrator::do_md() * Check comments in sim_util.c */ do_force(fplog, cr, ms, ir, awh.get(), enforcedRotation, - step, nrnb, wcycle, &top, groups, + step, nrnb, wcycle, &top, state->box, state->x.arrayRefWithPadding(), &state->hist, f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd, state->lambda, graph, diff --git a/src/gromacs/mdrun/mimic.cpp b/src/gromacs/mdrun/mimic.cpp index b1549b7970..cd45831023 100644 --- a/src/gromacs/mdrun/mimic.cpp +++ b/src/gromacs/mdrun/mimic.cpp @@ -433,7 +433,7 @@ void gmx::Integrator::do_mimic() ir, bNS, force_flags, &top, constr, enerd, fcd, state, f.arrayRefWithPadding(), force_vir, mdatoms, - nrnb, wcycle, graph, groups, + nrnb, wcycle, graph, shellfc, fr, ppForceWorkload, t, mu_tot, vsite, ddBalanceRegionHandler); @@ -448,7 +448,7 @@ void gmx::Integrator::do_mimic() Awh *awh = nullptr; gmx_edsam *ed = nullptr; do_force(fplog, cr, ms, ir, awh, enforcedRotation, - step, nrnb, wcycle, &top, groups, + step, nrnb, wcycle, &top, state->box, state->x.arrayRefWithPadding(), &state->hist, f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd, state->lambda, graph, diff --git a/src/gromacs/mdrun/minimize.cpp b/src/gromacs/mdrun/minimize.cpp index 039c3bddfd..f1f9298bed 100644 --- a/src/gromacs/mdrun/minimize.cpp +++ b/src/gromacs/mdrun/minimize.cpp @@ -848,7 +848,7 @@ EnergyEvaluator::run(em_state_t *ems, rvec mu_tot, * We do not unshift, so molecules are always whole in congrad.c */ do_force(fplog, cr, ms, inputrec, nullptr, nullptr, - count, nrnb, wcycle, top, &top_global->groups, + count, nrnb, wcycle, top, ems->s.box, ems->s.x.arrayRefWithPadding(), &ems->s.hist, ems->f.arrayRefWithPadding(), force_vir, mdAtoms->mdatoms(), enerd, fcd, ems->s.lambda, graph, fr, ppForceWorkload, vsite, mu_tot, t, nullptr, @@ -2858,7 +2858,6 @@ Integrator::do_nm() nrnb, wcycle, graph, - &top_global->groups, shellfc, fr, ppForceWorkload, diff --git a/src/gromacs/mdrun/rerun.cpp b/src/gromacs/mdrun/rerun.cpp index 61999f570a..9a17de5baf 100644 --- a/src/gromacs/mdrun/rerun.cpp +++ b/src/gromacs/mdrun/rerun.cpp @@ -554,7 +554,7 @@ void gmx::Integrator::do_rerun() ir, bNS, force_flags, &top, constr, enerd, fcd, state, f.arrayRefWithPadding(), force_vir, mdatoms, - nrnb, wcycle, graph, groups, + nrnb, wcycle, graph, shellfc, fr, ppForceWorkload, t, mu_tot, vsite, ddBalanceRegionHandler); @@ -569,7 +569,7 @@ void gmx::Integrator::do_rerun() Awh *awh = nullptr; gmx_edsam *ed = nullptr; do_force(fplog, cr, ms, ir, awh, enforcedRotation, - step, nrnb, wcycle, &top, groups, + step, nrnb, wcycle, &top, state->box, state->x.arrayRefWithPadding(), &state->hist, f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd, state->lambda, graph, diff --git a/src/gromacs/mdrun/tpi.cpp b/src/gromacs/mdrun/tpi.cpp index d13a848609..e446179bda 100644 --- a/src/gromacs/mdrun/tpi.cpp +++ b/src/gromacs/mdrun/tpi.cpp @@ -643,7 +643,7 @@ Integrator::do_tpi() std::fenv_t floatingPointEnvironment; std::feholdexcept(&floatingPointEnvironment); do_force(fplog, cr, ms, inputrec, nullptr, nullptr, - step, nrnb, wcycle, &top, &top_global->groups, + step, nrnb, wcycle, &top, state_global->box, state_global->x.arrayRefWithPadding(), &state_global->hist, f.arrayRefWithPadding(), force_vir, mdatoms, enerd, fcd, state_global->lambda, -- 2.11.4.GIT