From aaf632f63bd89614f44a0fe62abd68193148d886 Mon Sep 17 00:00:00 2001 From: Joe Jordan Date: Wed, 21 Apr 2021 15:32:22 +0000 Subject: [PATCH] Mostly remove t_mdatoms from update signatures --- .../mdlib/tests/leapfrogtestrunners.cpp | 27 ++-- src/gromacs/mdlib/update.cpp | 116 ++++++++---------- src/gromacs/mdlib/update.h | 70 +++++++---- src/gromacs/mdlib/update_vv.cpp | 83 +++++++++++-- src/gromacs/mdrun/md.cpp | 41 ++++++- 5 files changed, 222 insertions(+), 115 deletions(-) diff --git a/src/gromacs/mdlib/tests/leapfrogtestrunners.cpp b/src/gromacs/mdlib/tests/leapfrogtestrunners.cpp index e2a38f88eb..0db80fc685 100644 --- a/src/gromacs/mdlib/tests/leapfrogtestrunners.cpp +++ b/src/gromacs/mdlib/tests/leapfrogtestrunners.cpp @@ -71,17 +71,22 @@ void LeapFrogHostTestRunner::integrate(LeapFrogTestData* testData, int numSteps) for (int step = 0; step < numSteps; step++) { - testData->update_->update_coords(testData->inputRecord_, - step, - &testData->mdAtoms_, - &testData->state_, - testData->f_, - testData->forceCalculationData_, - &testData->kineticEnergyData_, - testData->velocityScalingMatrix_, - etrtNONE, - nullptr, - false); + testData->update_->update_coords( + testData->inputRecord_, + step, + testData->mdAtoms_.homenr, + testData->mdAtoms_.havePartiallyFrozenAtoms, + gmx::arrayRefFromArray(testData->mdAtoms_.ptype, testData->mdAtoms_.nr), + gmx::arrayRefFromArray(testData->mdAtoms_.invmass, testData->mdAtoms_.nr), + gmx::arrayRefFromArray(testData->mdAtoms_.invMassPerDim, testData->mdAtoms_.nr), + &testData->state_, + testData->f_, + testData->forceCalculationData_, + &testData->kineticEnergyData_, + testData->velocityScalingMatrix_, + etrtNONE, + nullptr, + false); testData->update_->finish_update( testData->inputRecord_, &testData->mdAtoms_, &testData->state_, nullptr, false); } diff --git a/src/gromacs/mdlib/update.cpp b/src/gromacs/mdlib/update.cpp index e24ef4aeaf..ac2c566d71 100644 --- a/src/gromacs/mdlib/update.cpp +++ b/src/gromacs/mdlib/update.cpp @@ -126,7 +126,7 @@ public: bool havePartiallyFrozenAtoms, gmx::ArrayRef ptype, gmx::ArrayRef invMass, - gmx::ArrayRef invMassPerDim, + gmx::ArrayRef invMassPerDim, t_state* state, const gmx::ArrayRefWithPadding& f, const t_fcdata& fcdata, @@ -156,12 +156,12 @@ public: bool do_log, bool do_ene); - void update_for_constraint_virial(const t_inputrec& inputRecord, - int homenr, - bool havePartiallyFrozenAtoms, - gmx::ArrayRef invmass, - gmx::ArrayRef invMassPerDim, - const t_state& state, + void update_for_constraint_virial(const t_inputrec& inputRecord, + int homenr, + bool havePartiallyFrozenAtoms, + gmx::ArrayRef invmass, + gmx::ArrayRef invMassPerDim, + const t_state& state, const gmx::ArrayRefWithPadding& f, const gmx_ekindata_t& ekind); @@ -214,10 +214,14 @@ BoxDeformation* Update::deform() const return impl_->deform(); } -void Update::update_coords(const t_inputrec& inputRecord, - int64_t step, - const t_mdatoms* md, - t_state* state, +void Update::update_coords(const t_inputrec& inputRecord, + int64_t step, + const int homenr, + const bool havePartiallyFrozenAtoms, + gmx::ArrayRef ptype, + gmx::ArrayRef invMass, + gmx::ArrayRef invMassPerDim, + t_state* state, const gmx::ArrayRefWithPadding& f, const t_fcdata& fcdata, const gmx_ekindata_t* ekind, @@ -228,11 +232,11 @@ void Update::update_coords(const t_inputrec& inpu { return impl_->update_coords(inputRecord, step, - md->homenr, - md->havePartiallyFrozenAtoms, - gmx::arrayRefFromArray(md->ptype, md->nr), - gmx::arrayRefFromArray(md->invmass, md->nr), - gmx::arrayRefFromArray(md->invMassPerDim, md->nr), + homenr, + havePartiallyFrozenAtoms, + ptype, + invMass, + invMassPerDim, state, f, fcdata, @@ -252,47 +256,35 @@ void Update::finish_update(const t_inputrec& inputRecord, return impl_->finish_update(inputRecord, md, state, wcycle, haveConstraints); } -void Update::update_sd_second_half(const t_inputrec& inputRecord, - int64_t step, - real* dvdlambda, - const t_mdatoms* md, - t_state* state, - const t_commrec* cr, - t_nrnb* nrnb, - gmx_wallcycle* wcycle, - gmx::Constraints* constr, - bool do_log, - bool do_ene) +void Update::update_sd_second_half(const t_inputrec& inputRecord, + int64_t step, + real* dvdlambda, + const int homenr, + gmx::ArrayRef ptype, + gmx::ArrayRef invMass, + t_state* state, + const t_commrec* cr, + t_nrnb* nrnb, + gmx_wallcycle* wcycle, + gmx::Constraints* constr, + bool do_log, + bool do_ene) { - return impl_->update_sd_second_half(inputRecord, - step, - dvdlambda, - md->homenr, - gmx::arrayRefFromArray(md->ptype, md->nr), - gmx::arrayRefFromArray(md->invmass, md->nr), - state, - cr, - nrnb, - wcycle, - constr, - do_log, - do_ene); + return impl_->update_sd_second_half( + inputRecord, step, dvdlambda, homenr, ptype, invMass, state, cr, nrnb, wcycle, constr, do_log, do_ene); } -void Update::update_for_constraint_virial(const t_inputrec& inputRecord, - const t_mdatoms& md, - const t_state& state, +void Update::update_for_constraint_virial(const t_inputrec& inputRecord, + const int homenr, + const bool havePartiallyFrozenAtoms, + gmx::ArrayRef invmass, + gmx::ArrayRef invMassPerDim, + const t_state& state, const gmx::ArrayRefWithPadding& f, const gmx_ekindata_t& ekind) { - return impl_->update_for_constraint_virial(inputRecord, - md.homenr, - md.havePartiallyFrozenAtoms, - gmx::arrayRefFromArray(md.invmass, md.nr), - gmx::arrayRefFromArray(md.invMassPerDim, md.nr), - state, - f, - ekind); + return impl_->update_for_constraint_virial( + inputRecord, homenr, havePartiallyFrozenAtoms, invmass, invMassPerDim, state, f, ekind); } void Update::update_temperature_constants(const t_inputrec& inputRecord) @@ -802,10 +794,10 @@ static void doUpdateMDDoNotUpdateVelocities(int start, rvec* gmx_restrict xprime, const rvec* gmx_restrict v, const rvec* gmx_restrict f, - bool gmx_unused havePartiallyFrozenAtoms, - gmx::ArrayRef gmx_unused invmass, - gmx::ArrayRef invMassPerDim, - const gmx_ekindata_t& ekind) + bool gmx_unused havePartiallyFrozenAtoms, + gmx::ArrayRef gmx_unused invmass, + gmx::ArrayRef invMassPerDim, + const gmx_ekindata_t& ekind) { GMX_ASSERT(nrend == start || xprime != x, "For SIMD optimization certain compilers need to have xprime != x"); @@ -1530,7 +1522,7 @@ void Update::Impl::update_coords(const t_inputrec& inputRecord, bool havePartiallyFrozenAtoms, gmx::ArrayRef ptype, gmx::ArrayRef invMass, - gmx::ArrayRef invMassPerDim, + gmx::ArrayRef invMassPerDim, t_state* state, const gmx::ArrayRefWithPadding& f, const t_fcdata& fcdata, @@ -1688,12 +1680,12 @@ void Update::Impl::update_coords(const t_inputrec& inputRecord, } } -void Update::Impl::update_for_constraint_virial(const t_inputrec& inputRecord, - int homenr, - bool havePartiallyFrozenAtoms, - gmx::ArrayRef invmass, - gmx::ArrayRef invMassPerDim, - const t_state& state, +void Update::Impl::update_for_constraint_virial(const t_inputrec& inputRecord, + int homenr, + bool havePartiallyFrozenAtoms, + gmx::ArrayRef invmass, + gmx::ArrayRef invMassPerDim, + const t_state& state, const gmx::ArrayRefWithPadding& f, const gmx_ekindata_t& ekind) { diff --git a/src/gromacs/mdlib/update.h b/src/gromacs/mdlib/update.h index 5992a69e45..7fa36ae376 100644 --- a/src/gromacs/mdlib/update.h +++ b/src/gromacs/mdlib/update.h @@ -59,6 +59,7 @@ struct t_inputrec; struct t_mdatoms; struct t_nrnb; class t_state; +enum class ParticleType; namespace gmx { @@ -107,21 +108,29 @@ public: * * Selects the appropriate integrator, based on the input record and performs a numerical integration step. * - * \param[in] inputRecord Input record. - * \param[in] step Current timestep. - * \param[in] md MD atoms data. - * \param[in] state System state object. - * \param[in] f Buffer with atomic forces for home particles. - * \param[in] fcdata Force calculation data to update distance and orientation restraints. - * \param[in] ekind Kinetic energy data (for temperature coupling, energy groups, etc.). - * \param[in] M Parrinello-Rahman velocity scaling matrix. - * \param[in] updatePart What should be updated, coordinates or velocities. This enum only used in VV integrator. - * \param[in] cr Comunication record (Old comment: these shouldn't be here -- need to think about it). - * \param[in] haveConstraints If the system has constraints. + * \param[in] inputRecord Input record. + * \param[in] step Current timestep. + * \param[in] homenr The number of atoms on this processor. + * \param[in] havePartiallyFrozenAtoms Whether atoms are frozen along 1 or 2 (not 3) dimensions? + * \param[in] ptype The list of particle types. + * \param[in] invMass Inverse atomic mass per atom, 0 for vsites and shells. + * \param[in] invMassPerDim Inverse atomic mass per atom and dimension, 0 for vsites, shells and frozen dimensions + * \param[in] state System state object. + * \param[in] f Buffer with atomic forces for home particles. + * \param[in] fcdata Force calculation data to update distance and orientation restraints. + * \param[in] ekind Kinetic energy data (for temperature coupling, energy groups, etc.). + * \param[in] M Parrinello-Rahman velocity scaling matrix. + * \param[in] updatePart What should be updated, coordinates or velocities. This enum only used in VV integrator. + * \param[in] cr Comunication record (Old comment: these shouldn't be here -- need to think about it). + * \param[in] haveConstraints If the system has constraints. */ void update_coords(const t_inputrec& inputRecord, int64_t step, - const t_mdatoms* md, + int homenr, + bool havePartiallyFrozenAtoms, + gmx::ArrayRef ptype, + gmx::ArrayRef invMass, + gmx::ArrayRef invMassPerDim, t_state* state, const gmx::ArrayRefWithPadding& f, const t_fcdata& fcdata, @@ -155,7 +164,9 @@ public: * \param[in] step Current timestep. * \param[in] dvdlambda Free energy derivative. Contribution to be added to * the bonded interactions. - * \param[in] md MD atoms data. + * \param[in] homenr The number of atoms on this processor. + * \param[in] ptype The list of particle types. + * \param[in] invMass Inverse atomic mass per atom, 0 for vsites and shells. * \param[in] state System state object. * \param[in] cr Comunication record. * \param[in] nrnb Cycle counters. @@ -165,24 +176,29 @@ public: * \param[in] do_log If this is logging step. * \param[in] do_ene If this is an energy evaluation step. */ - void update_sd_second_half(const t_inputrec& inputRecord, - int64_t step, - real* dvdlambda, - const t_mdatoms* md, - t_state* state, - const t_commrec* cr, - t_nrnb* nrnb, - gmx_wallcycle* wcycle, - gmx::Constraints* constr, - bool do_log, - bool do_ene); + void update_sd_second_half(const t_inputrec& inputRecord, + int64_t step, + real* dvdlambda, + int homenr, + gmx::ArrayRef ptype, + gmx::ArrayRef invMass, + t_state* state, + const t_commrec* cr, + t_nrnb* nrnb, + gmx_wallcycle* wcycle, + gmx::Constraints* constr, + bool do_log, + bool do_ene); /*! \brief Performs a leap-frog update without updating \p state so the constrain virial * can be computed. */ - void update_for_constraint_virial(const t_inputrec& inputRecord, - const t_mdatoms& md, - const t_state& state, + void update_for_constraint_virial(const t_inputrec& inputRecord, + int homenr, + bool havePartiallyFrozenAtoms, + gmx::ArrayRef invmass, + gmx::ArrayRef invMassPerDim, + const t_state& state, const gmx::ArrayRefWithPadding& f, const gmx_ekindata_t& ekind); diff --git a/src/gromacs/mdlib/update_vv.cpp b/src/gromacs/mdlib/update_vv.cpp index 0db7c24791..acc112e0d2 100644 --- a/src/gromacs/mdlib/update_vv.cpp +++ b/src/gromacs/mdlib/update_vv.cpp @@ -137,8 +137,21 @@ void integrateVVFirstStep(int64_t step, trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, MassQ, trotter_seq, ettTSEQ1); } - upd->update_coords( - *ir, step, mdatoms, state, f->view().forceWithPadding(), fcdata, ekind, M, etrtVELOCITY1, cr, constr != nullptr); + upd->update_coords(*ir, + step, + mdatoms->homenr, + mdatoms->havePartiallyFrozenAtoms, + gmx::arrayRefFromArray(mdatoms->ptype, mdatoms->nr), + gmx::arrayRefFromArray(mdatoms->invmass, mdatoms->nr), + gmx::arrayRefFromArray(mdatoms->invMassPerDim, mdatoms->nr), + state, + f->view().forceWithPadding(), + fcdata, + ekind, + M, + etrtVELOCITY1, + cr, + constr != nullptr); wallcycle_stop(wcycle, WallCycleCounter::Update); constrain_velocities(constr, do_log, do_ene, step, state, nullptr, bCalcVir, shake_vir); @@ -332,8 +345,21 @@ void integrateVVSecondStep(int64_t step, gmx_wallcycle* wcycle) { /* velocity half-step update */ - upd->update_coords( - *ir, step, mdatoms, state, f->view().forceWithPadding(), fcdata, ekind, M, etrtVELOCITY2, cr, constr != nullptr); + upd->update_coords(*ir, + step, + mdatoms->homenr, + mdatoms->havePartiallyFrozenAtoms, + gmx::arrayRefFromArray(mdatoms->ptype, mdatoms->nr), + gmx::arrayRefFromArray(mdatoms->invmass, mdatoms->nr), + gmx::arrayRefFromArray(mdatoms->invMassPerDim, mdatoms->nr), + state, + f->view().forceWithPadding(), + fcdata, + ekind, + M, + etrtVELOCITY2, + cr, + constr != nullptr); /* Above, initialize just copies ekinh into ekin, @@ -352,16 +378,40 @@ void integrateVVSecondStep(int64_t step, updatePrevStepPullCom(pull_work, state); } - upd->update_coords( - *ir, step, mdatoms, state, f->view().forceWithPadding(), fcdata, ekind, M, etrtPOSITION, cr, constr != nullptr); + upd->update_coords(*ir, + step, + mdatoms->homenr, + mdatoms->havePartiallyFrozenAtoms, + gmx::arrayRefFromArray(mdatoms->ptype, mdatoms->nr), + gmx::arrayRefFromArray(mdatoms->invmass, mdatoms->nr), + gmx::arrayRefFromArray(mdatoms->invMassPerDim, mdatoms->nr), + state, + f->view().forceWithPadding(), + fcdata, + ekind, + M, + etrtPOSITION, + cr, + constr != nullptr); wallcycle_stop(wcycle, WallCycleCounter::Update); constrain_coordinates( constr, do_log, do_ene, step, state, upd->xp()->arrayRefWithPadding(), dvdl_constr, bCalcVir, shake_vir); - upd->update_sd_second_half( - *ir, step, dvdl_constr, mdatoms, state, cr, nrnb, wcycle, constr, do_log, do_ene); + upd->update_sd_second_half(*ir, + step, + dvdl_constr, + mdatoms->homenr, + gmx::arrayRefFromArray(mdatoms->ptype, mdatoms->nr), + gmx::arrayRefFromArray(mdatoms->invmass, mdatoms->nr), + state, + cr, + nrnb, + wcycle, + constr, + do_log, + do_ene); upd->finish_update(*ir, mdatoms, state, wcycle, constr != nullptr); if (ir->eI == IntegrationAlgorithm::VVAK) @@ -395,8 +445,21 @@ void integrateVVSecondStep(int64_t step, /* now we know the scaling, we can compute the positions again */ std::copy(cbuf->begin(), cbuf->end(), state->x.begin()); - upd->update_coords( - *ir, step, mdatoms, state, f->view().forceWithPadding(), fcdata, ekind, M, etrtPOSITION, cr, constr != nullptr); + upd->update_coords(*ir, + step, + mdatoms->homenr, + mdatoms->havePartiallyFrozenAtoms, + gmx::arrayRefFromArray(mdatoms->ptype, mdatoms->nr), + gmx::arrayRefFromArray(mdatoms->invmass, mdatoms->nr), + gmx::arrayRefFromArray(mdatoms->invMassPerDim, mdatoms->nr), + state, + f->view().forceWithPadding(), + fcdata, + ekind, + M, + etrtPOSITION, + cr, + constr != nullptr); wallcycle_stop(wcycle, WallCycleCounter::Update); /* do we need an extra constraint here? just need to copy out of as_rvec_array(state->v.data()) to upd->xp? */ diff --git a/src/gromacs/mdrun/md.cpp b/src/gromacs/mdrun/md.cpp index ecb0778652..f5db890f89 100644 --- a/src/gromacs/mdrun/md.cpp +++ b/src/gromacs/mdrun/md.cpp @@ -1544,7 +1544,14 @@ void gmx::LegacySimulator::do_md() if (fr->useMts && bCalcVir && constr != nullptr) { upd.update_for_constraint_virial( - *ir, *mdatoms, *state, f.view().forceWithPadding(), *ekind); + *ir, + mdatoms->homenr, + mdatoms->havePartiallyFrozenAtoms, + gmx::arrayRefFromArray(mdatoms->invmass, mdatoms->nr), + gmx::arrayRefFromArray(mdatoms->invMassPerDim, mdatoms->nr), + *state, + f.view().forceWithPadding(), + *ekind); constrain_coordinates(constr, do_log, @@ -1561,8 +1568,21 @@ void gmx::LegacySimulator::do_md() (fr->useMts && step % ir->mtsLevels[1].stepFactor == 0) ? f.view().forceMtsCombinedWithPadding() : f.view().forceWithPadding(); - upd.update_coords( - *ir, step, mdatoms, state, forceCombined, fcdata, ekind, M, etrtPOSITION, cr, constr != nullptr); + upd.update_coords(*ir, + step, + mdatoms->homenr, + mdatoms->havePartiallyFrozenAtoms, + gmx::arrayRefFromArray(md->ptype, md->nr), + gmx::arrayRefFromArray(md->invmass, md->nr), + gmx::arrayRefFromArray(md->invMassPerDim, md->nr), + state, + forceCombined, + fcdata, + ekind, + M, + etrtPOSITION, + cr, + constr != nullptr); wallcycle_stop(wcycle, WallCycleCounter::Update); @@ -1576,8 +1596,19 @@ void gmx::LegacySimulator::do_md() bCalcVir && !fr->useMts, shake_vir); - upd.update_sd_second_half( - *ir, step, &dvdl_constr, mdatoms, state, cr, nrnb, wcycle, constr, do_log, do_ene); + upd.update_sd_second_half(*ir, + step, + &dvdl_constr, + mdatoms->homenr, + gmx::arrayRefFromArray(md->ptype, md->nr), + gmx::arrayRefFromArray(md->invmass, md->nr), + state, + cr, + nrnb, + wcycle, + constr, + do_log, + do_ene); upd.finish_update(*ir, mdatoms, state, wcycle, constr != nullptr); } -- 2.22.0