From: Pascal Merz Date: Fri, 24 Jan 2020 23:10:22 +0000 (+0000) Subject: Use ArrayRef in compute_globals X-Git-Url: http://biod.pnpi.spb.ru/gitweb/?a=commitdiff_plain;h=c6a73dfcdce8c05f7c6b7a14eae06e457c3cd941;p=alexxy%2Fgromacs.git Use ArrayRef in compute_globals This refactors compute_globals to use ArrayRef instead of rvec pointers. Change-Id: I0e16b7bcee0583326180c6c93a7feddbb7213bfe --- diff --git a/src/gromacs/domdec/domdec.h b/src/gromacs/domdec/domdec.h index 1f3fad4405..39f8bd0b89 100644 --- a/src/gromacs/domdec/domdec.h +++ b/src/gromacs/domdec/domdec.h @@ -261,13 +261,13 @@ gmx::ArrayRef dd_constraints_nlocalatoms(const gmx_domdec_t* dd); /* In domdec_top.c */ /*! \brief Print error output when interactions are missing */ -[[noreturn]] void dd_print_missing_interactions(const gmx::MDLogger& mdlog, - t_commrec* cr, - int local_count, - const gmx_mtop_t* top_global, - const gmx_localtop_t* top_local, - const rvec* x, - const matrix box); +[[noreturn]] void dd_print_missing_interactions(const gmx::MDLogger& mdlog, + t_commrec* cr, + int local_count, + const gmx_mtop_t* top_global, + const gmx_localtop_t* top_local, + gmx::ArrayRef x, + const matrix box); /*! \brief Generate and store the reverse topology */ void dd_make_reverse_top(FILE* fplog, diff --git a/src/gromacs/domdec/domdec_topology.cpp b/src/gromacs/domdec/domdec_topology.cpp index c34831c515..e627bd2262 100644 --- a/src/gromacs/domdec/domdec_topology.cpp +++ b/src/gromacs/domdec/domdec_topology.cpp @@ -329,13 +329,13 @@ static void print_missing_interactions_atoms(const gmx::MDLogger& mdlog, } } -void dd_print_missing_interactions(const gmx::MDLogger& mdlog, - t_commrec* cr, - int local_count, - const gmx_mtop_t* top_global, - const gmx_localtop_t* top_local, - const rvec* x, - const matrix box) +void dd_print_missing_interactions(const gmx::MDLogger& mdlog, + t_commrec* cr, + int local_count, + const gmx_mtop_t* top_global, + const gmx_localtop_t* top_local, + gmx::ArrayRef x, + const matrix box) { int ndiff_tot, cl[F_NRE], n, ndiff, rest_global, rest_local; int ftype, nral; @@ -399,7 +399,7 @@ void dd_print_missing_interactions(const gmx::MDLogger& mdlog, } print_missing_interactions_atoms(mdlog, cr, top_global, &top_local->idef); - write_dd_pdb("dd_dump_err", 0, "dump", top_global, cr, -1, x, box); + write_dd_pdb("dd_dump_err", 0, "dump", top_global, cr, -1, as_rvec_array(x.data()), box); std::string errorMessage; diff --git a/src/gromacs/domdec/partition.cpp b/src/gromacs/domdec/partition.cpp index 0d034175bd..e83408dfea 100644 --- a/src/gromacs/domdec/partition.cpp +++ b/src/gromacs/domdec/partition.cpp @@ -3227,14 +3227,14 @@ void dd_partition_system(FILE* fplog, } /*! \brief Check whether bonded interactions are missing, if appropriate */ -void checkNumberOfBondedInteractions(const gmx::MDLogger& mdlog, - t_commrec* cr, - int totalNumberOfBondedInteractions, - const gmx_mtop_t* top_global, - const gmx_localtop_t* top_local, - const rvec* x, - const matrix box, - bool* shouldCheckNumberOfBondedInteractions) +void checkNumberOfBondedInteractions(const gmx::MDLogger& mdlog, + t_commrec* cr, + int totalNumberOfBondedInteractions, + const gmx_mtop_t* top_global, + const gmx_localtop_t* top_local, + gmx::ArrayRef x, + const matrix box, + bool* shouldCheckNumberOfBondedInteractions) { if (*shouldCheckNumberOfBondedInteractions) { diff --git a/src/gromacs/domdec/partition.h b/src/gromacs/domdec/partition.h index fc07a745b1..721893a371 100644 --- a/src/gromacs/domdec/partition.h +++ b/src/gromacs/domdec/partition.h @@ -1,7 +1,7 @@ /* * This file is part of the GROMACS molecular simulation package. * - * Copyright (c) 2018,2019, by the GROMACS development team, led by + * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, * and including many others, as listed in the AUTHORS file in the * top-level source directory and at http://www.gromacs.org. @@ -139,13 +139,13 @@ void dd_partition_system(FILE* fplog, * \param[in] box Box matrix for the error message * \param[in,out] shouldCheckNumberOfBondedInteractions Whether we should do the check. Always set to false. */ -void checkNumberOfBondedInteractions(const gmx::MDLogger& mdlog, - t_commrec* cr, - int totalNumberOfBondedInteractions, - const gmx_mtop_t* top_global, - const gmx_localtop_t* top_local, - const rvec* x, - const matrix box, - bool* shouldCheckNumberOfBondedInteractions); +void checkNumberOfBondedInteractions(const gmx::MDLogger& mdlog, + t_commrec* cr, + int totalNumberOfBondedInteractions, + const gmx_mtop_t* top_global, + const gmx_localtop_t* top_local, + gmx::ArrayRef x, + const matrix box, + bool* shouldCheckNumberOfBondedInteractions); #endif diff --git a/src/gromacs/mdlib/md_support.cpp b/src/gromacs/mdlib/md_support.cpp index bc3536d247..fb3a048e72 100644 --- a/src/gromacs/mdlib/md_support.cpp +++ b/src/gromacs/mdlib/md_support.cpp @@ -154,30 +154,30 @@ int multisim_min(const gmx_multisim_t* ms, int nmin, int n) /* TODO Specialize this routine into init-time and loop-time versions? e.g. bReadEkin is only true when restoring from checkpoint */ -void compute_globals(gmx_global_stat* gstat, - t_commrec* cr, - const t_inputrec* ir, - t_forcerec* fr, - gmx_ekindata_t* ekind, - const rvec* x, - const rvec* v, - const matrix box, - real vdwLambda, - const t_mdatoms* mdatoms, - t_nrnb* nrnb, - t_vcm* vcm, - gmx_wallcycle_t wcycle, - gmx_enerdata_t* enerd, - tensor force_vir, - tensor shake_vir, - tensor total_vir, - tensor pres, - gmx::Constraints* constr, - gmx::SimulationSignaller* signalCoordinator, - const matrix lastbox, - int* totalNumberOfBondedInteractions, - gmx_bool* bSumEkinhOld, - const int flags) +void compute_globals(gmx_global_stat* gstat, + t_commrec* cr, + const t_inputrec* ir, + t_forcerec* fr, + gmx_ekindata_t* ekind, + gmx::ArrayRef x, + gmx::ArrayRef v, + const matrix box, + real vdwLambda, + const t_mdatoms* mdatoms, + t_nrnb* nrnb, + t_vcm* vcm, + gmx_wallcycle_t wcycle, + gmx_enerdata_t* enerd, + tensor force_vir, + tensor shake_vir, + tensor total_vir, + tensor pres, + gmx::Constraints* constr, + gmx::SimulationSignaller* signalCoordinator, + const matrix lastbox, + int* totalNumberOfBondedInteractions, + gmx_bool* bSumEkinhOld, + const int flags) { gmx_bool bEner, bPres, bTemp; gmx_bool bStopCM, bGStat, bReadEkin, bEkinAveVel, bScaleEkin, bConstrain; diff --git a/src/gromacs/mdlib/md_support.h b/src/gromacs/mdlib/md_support.h index 01cb5c7e8e..e13fa1f483 100644 --- a/src/gromacs/mdlib/md_support.h +++ b/src/gromacs/mdlib/md_support.h @@ -131,29 +131,29 @@ int multisim_min(const gmx_multisim_t* ms, int nmin, int n); * and for COM removal with rotational and acceleration correction modes. * Velocities v are needed for kinetic energy calculation and for COM removal. */ -void compute_globals(gmx_global_stat* gstat, - t_commrec* cr, - const t_inputrec* ir, - t_forcerec* fr, - gmx_ekindata_t* ekind, - const rvec* x, - const rvec* v, - const matrix box, - real vdwLambda, - const t_mdatoms* mdatoms, - t_nrnb* nrnb, - t_vcm* vcm, - gmx_wallcycle_t wcycle, - gmx_enerdata_t* enerd, - tensor force_vir, - tensor shake_vir, - tensor total_vir, - tensor pres, - gmx::Constraints* constr, - gmx::SimulationSignaller* signalCoordinator, - const matrix lastbox, - int* totalNumberOfBondedInteractions, - gmx_bool* bSumEkinhOld, - int flags); +void compute_globals(gmx_global_stat* gstat, + t_commrec* cr, + const t_inputrec* ir, + t_forcerec* fr, + gmx_ekindata_t* ekind, + gmx::ArrayRef x, + gmx::ArrayRef v, + const matrix box, + real vdwLambda, + const t_mdatoms* mdatoms, + t_nrnb* nrnb, + t_vcm* vcm, + gmx_wallcycle_t wcycle, + gmx_enerdata_t* enerd, + tensor force_vir, + tensor shake_vir, + tensor total_vir, + tensor pres, + gmx::Constraints* constr, + gmx::SimulationSignaller* signalCoordinator, + const matrix lastbox, + int* totalNumberOfBondedInteractions, + gmx_bool* bSumEkinhOld, + int flags); #endif diff --git a/src/gromacs/mdlib/update.cpp b/src/gromacs/mdlib/update.cpp index 2d00dd6aec..06a51f9fb2 100644 --- a/src/gromacs/mdlib/update.cpp +++ b/src/gromacs/mdlib/update.cpp @@ -1043,12 +1043,12 @@ static void do_update_bd(int start, } } -static void calc_ke_part_normal(const rvec v[], - const t_grpopts* opts, - const t_mdatoms* md, - gmx_ekindata_t* ekind, - t_nrnb* nrnb, - gmx_bool bEkinAveVel) +static void calc_ke_part_normal(ArrayRef v, + const t_grpopts* opts, + const t_mdatoms* md, + gmx_ekindata_t* ekind, + t_nrnb* nrnb, + gmx_bool bEkinAveVel) { int g; gmx::ArrayRef tcstat = ekind->tcstat; @@ -1159,14 +1159,14 @@ static void calc_ke_part_normal(const rvec v[], inc_nrnb(nrnb, eNR_EKIN, md->homenr); } -static void calc_ke_part_visc(const matrix box, - const rvec x[], - const rvec v[], - const t_grpopts* opts, - const t_mdatoms* md, - gmx_ekindata_t* ekind, - t_nrnb* nrnb, - gmx_bool bEkinAveVel) +static void calc_ke_part_visc(const matrix box, + ArrayRef x, + ArrayRef v, + const t_grpopts* opts, + const t_mdatoms* md, + gmx_ekindata_t* ekind, + t_nrnb* nrnb, + gmx_bool bEkinAveVel) { int start = 0, homenr = md->homenr; int g, d, n, m, gt = 0; @@ -1236,14 +1236,14 @@ static void calc_ke_part_visc(const matrix box, inc_nrnb(nrnb, eNR_EKIN, homenr); } -void calc_ke_part(const rvec* x, - const rvec* v, - const matrix box, - const t_grpopts* opts, - const t_mdatoms* md, - gmx_ekindata_t* ekind, - t_nrnb* nrnb, - gmx_bool bEkinAveVel) +void calc_ke_part(ArrayRef x, + ArrayRef v, + const matrix box, + const t_grpopts* opts, + const t_mdatoms* md, + gmx_ekindata_t* ekind, + t_nrnb* nrnb, + gmx_bool bEkinAveVel) { if (ekind->cosacc.cos_accel == 0) { diff --git a/src/gromacs/mdlib/update.h b/src/gromacs/mdlib/update.h index 5b9607b2aa..acd097e3b7 100644 --- a/src/gromacs/mdlib/update.h +++ b/src/gromacs/mdlib/update.h @@ -205,14 +205,14 @@ void finish_update(const t_inputrec* inputrec, /* Return TRUE if OK, FALSE in case of Shake Error */ -void calc_ke_part(const rvec* x, - const rvec* v, - const matrix box, - const t_grpopts* opts, - const t_mdatoms* md, - gmx_ekindata_t* ekind, - t_nrnb* nrnb, - gmx_bool bEkinAveVel); +void calc_ke_part(gmx::ArrayRef x, + gmx::ArrayRef v, + const matrix box, + const t_grpopts* opts, + const t_mdatoms* md, + gmx_ekindata_t* ekind, + t_nrnb* nrnb, + gmx_bool bEkinAveVel); /* * Compute the partial kinetic energy for home particles; * will be accumulated in the calling routine. diff --git a/src/gromacs/mdlib/vcm.cpp b/src/gromacs/mdlib/vcm.cpp index 89b923706b..b34bbdef35 100644 --- a/src/gromacs/mdlib/vcm.cpp +++ b/src/gromacs/mdlib/vcm.cpp @@ -152,7 +152,10 @@ static void update_tensor(const rvec x, real m0, tensor I) } /* Center of mass code for groups */ -void calc_vcm_grp(const t_mdatoms& md, const rvec x[], const rvec v[], t_vcm* vcm) +void calc_vcm_grp(const t_mdatoms& md, + gmx::ArrayRef x, + gmx::ArrayRef v, + t_vcm* vcm) { if (vcm->mode == ecmNO) { @@ -253,7 +256,7 @@ void calc_vcm_grp(const t_mdatoms& md, const rvec x[], const rvec v[], t_vcm* vc * \param[in] vcm VCM data */ template -static void doStopComMotionLinear(const t_mdatoms& mdatoms, rvec* v, const t_vcm& vcm) +static void doStopComMotionLinear(const t_mdatoms& mdatoms, gmx::ArrayRef v, const t_vcm& vcm) { const int homenr = mdatoms.homenr; const unsigned short* group_id = mdatoms.cVCM; @@ -313,11 +316,11 @@ static void doStopComMotionLinear(const t_mdatoms& mdatoms, rvec* v, const t_vcm * \param[in] vcm VCM data */ template -static void doStopComMotionAccelerationCorrection(int homenr, - const unsigned short* group_id, - rvec* gmx_restrict x, - rvec* gmx_restrict v, - const t_vcm& vcm) +static void doStopComMotionAccelerationCorrection(int homenr, + const unsigned short* group_id, + gmx::ArrayRef x, + gmx::ArrayRef v, + const t_vcm& vcm) { const real xCorrectionFactor = 0.5 * vcm.timeStep; @@ -348,7 +351,10 @@ static void doStopComMotionAccelerationCorrection(int homenr, } } -static void do_stopcm_grp(const t_mdatoms& mdatoms, rvec x[], rvec v[], const t_vcm& vcm) +static void do_stopcm_grp(const t_mdatoms& mdatoms, + gmx::ArrayRef x, + gmx::ArrayRef v, + const t_vcm& vcm) { if (vcm.mode == ecmNO) { @@ -365,7 +371,7 @@ static void do_stopcm_grp(const t_mdatoms& mdatoms, rvec x[], rvec v[], const t_ firstprivate(homenr) { if (vcm.mode == ecmLINEAR || vcm.mode == ecmANGULAR - || (vcm.mode == ecmLINEAR_ACCELERATION_CORRECTION && x == nullptr)) + || (vcm.mode == ecmLINEAR_ACCELERATION_CORRECTION && x.empty())) { /* Subtract linear momentum for v */ switch (vcm.ndim) @@ -397,7 +403,7 @@ static void do_stopcm_grp(const t_mdatoms& mdatoms, rvec x[], rvec v[], const t_ if (vcm.mode == ecmANGULAR) { /* Subtract angular momentum */ - GMX_ASSERT(x, "Need x to compute angular momentum correction"); + GMX_ASSERT(!x.empty(), "Need x to compute angular momentum correction"); int g = 0; #pragma omp for schedule(static) @@ -569,7 +575,11 @@ static void process_and_check_cm_grp(FILE* fp, t_vcm* vcm, real Temp_Max) } } -void process_and_stopcm_grp(FILE* fplog, t_vcm* vcm, const t_mdatoms& mdatoms, rvec x[], rvec v[]) +void process_and_stopcm_grp(FILE* fplog, + t_vcm* vcm, + const t_mdatoms& mdatoms, + gmx::ArrayRef x, + gmx::ArrayRef v) { if (vcm->mode != ecmNO) { diff --git a/src/gromacs/mdlib/vcm.h b/src/gromacs/mdlib/vcm.h index acafb8d8ba..b0c1424741 100644 --- a/src/gromacs/mdlib/vcm.h +++ b/src/gromacs/mdlib/vcm.h @@ -50,6 +50,12 @@ struct SimulationGroups; struct t_inputrec; struct t_mdatoms; +namespace gmx +{ +template +class ArrayRef; +} + struct t_vcm_thread { //! Linear momentum @@ -113,7 +119,10 @@ void reportComRemovalInfo(FILE* fp, const t_vcm& vcm); /* Do a per group center of mass things */ -void calc_vcm_grp(const t_mdatoms& md, const rvec x[], const rvec v[], t_vcm* vcm); +void calc_vcm_grp(const t_mdatoms& md, + gmx::ArrayRef x, + gmx::ArrayRef v, + t_vcm* vcm); /* Set the COM velocity to zero and potentially correct the COM position. * @@ -123,6 +132,10 @@ void calc_vcm_grp(const t_mdatoms& md, const rvec x[], const rvec v[], t_vcm* vc * and a pointer to the coordinates at normal MD steps. * When fplog != nullptr, a warning is printed to fplog with high COM velocity. */ -void process_and_stopcm_grp(FILE* fplog, t_vcm* vcm, const t_mdatoms& mdatoms, rvec x[], rvec v[]); +void process_and_stopcm_grp(FILE* fplog, + t_vcm* vcm, + const t_mdatoms& mdatoms, + gmx::ArrayRef x, + gmx::ArrayRef v); #endif diff --git a/src/gromacs/mdrun/md.cpp b/src/gromacs/mdrun/md.cpp index 5314e3ac9c..0f3fc85c07 100644 --- a/src/gromacs/mdrun/md.cpp +++ b/src/gromacs/mdrun/md.cpp @@ -540,10 +540,10 @@ void gmx::LegacySimulator::do_md() cglo_flags_iteration |= CGLO_STOPCM; cglo_flags_iteration &= ~CGLO_TEMPERATURE; } - compute_globals(gstat, cr, ir, fr, ekind, state->x.rvec_array(), state->v.rvec_array(), - state->box, state->lambda[efptVDW], mdatoms, nrnb, &vcm, nullptr, enerd, - force_vir, shake_vir, total_vir, pres, constr, &nullSignaller, state->box, - &totalNumberOfBondedInteractions, &bSumEkinhOld, + compute_globals(gstat, cr, ir, fr, ekind, makeConstArrayRef(state->x), + makeConstArrayRef(state->v), state->box, state->lambda[efptVDW], mdatoms, + nrnb, &vcm, nullptr, enerd, force_vir, shake_vir, total_vir, pres, constr, + &nullSignaller, state->box, &totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags_iteration | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)); @@ -552,17 +552,14 @@ void gmx::LegacySimulator::do_md() /* At initialization, do not pass x with acceleration-correction mode * to avoid (incorrect) correction of the initial coordinates. */ - rvec* xPtr = nullptr; - if (vcm.mode != ecmLINEAR_ACCELERATION_CORRECTION) - { - xPtr = state->x.rvec_array(); - } - process_and_stopcm_grp(fplog, &vcm, *mdatoms, xPtr, state->v.rvec_array()); + auto x = (vcm.mode == ecmLINEAR_ACCELERATION_CORRECTION) ? ArrayRef() + : makeArrayRef(state->x); + process_and_stopcm_grp(fplog, &vcm, *mdatoms, x, makeArrayRef(state->v)); inc_nrnb(nrnb, eNR_STOPCM, mdatoms->homenr); } } checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions, top_global, &top, - state->x.rvec_array(), state->box, + makeConstArrayRef(state->x), state->box, &shouldCheckNumberOfBondedInteractions); if (ir->eI == eiVVAK) { @@ -572,10 +569,10 @@ void gmx::LegacySimulator::do_md() kinetic energy calculation. This minimized excess variables, but perhaps loses some logic?*/ - compute_globals(gstat, cr, ir, fr, ekind, state->x.rvec_array(), state->v.rvec_array(), - state->box, state->lambda[efptVDW], mdatoms, nrnb, &vcm, nullptr, enerd, - force_vir, shake_vir, total_vir, pres, constr, &nullSignaller, state->box, - nullptr, &bSumEkinhOld, cglo_flags & ~CGLO_PRESSURE); + compute_globals(gstat, cr, ir, fr, ekind, makeConstArrayRef(state->x), + makeConstArrayRef(state->v), state->box, state->lambda[efptVDW], mdatoms, + nrnb, &vcm, nullptr, enerd, force_vir, shake_vir, total_vir, pres, constr, + &nullSignaller, state->box, nullptr, &bSumEkinhOld, cglo_flags & ~CGLO_PRESSURE); } /* Calculate the initial half step temperature, and save the ekinh_old */ @@ -875,13 +872,13 @@ void gmx::LegacySimulator::do_md() /* We need the kinetic energy at minus the half step for determining * the full step kinetic energy and possibly for T-coupling.*/ /* This may not be quite working correctly yet . . . . */ - compute_globals(gstat, cr, ir, fr, ekind, state->x.rvec_array(), state->v.rvec_array(), - state->box, state->lambda[efptVDW], mdatoms, nrnb, &vcm, wcycle, enerd, - nullptr, nullptr, nullptr, nullptr, constr, &nullSignaller, state->box, - &totalNumberOfBondedInteractions, &bSumEkinhOld, + compute_globals(gstat, cr, ir, fr, ekind, makeConstArrayRef(state->x), + makeConstArrayRef(state->v), state->box, state->lambda[efptVDW], mdatoms, + nrnb, &vcm, wcycle, enerd, nullptr, nullptr, nullptr, nullptr, constr, + &nullSignaller, state->box, &totalNumberOfBondedInteractions, &bSumEkinhOld, CGLO_GSTAT | CGLO_TEMPERATURE | CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS); checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions, top_global, - &top, state->x.rvec_array(), state->box, + &top, makeConstArrayRef(state->x), state->box, &shouldCheckNumberOfBondedInteractions); } clear_mat(force_vir); @@ -1013,16 +1010,17 @@ void gmx::LegacySimulator::do_md() if (bGStat || do_per_step(step - 1, nstglobalcomm)) { wallcycle_stop(wcycle, ewcUPDATE); - compute_globals(gstat, cr, ir, fr, ekind, state->x.rvec_array(), state->v.rvec_array(), - state->box, state->lambda[efptVDW], mdatoms, nrnb, &vcm, wcycle, - enerd, force_vir, shake_vir, total_vir, pres, constr, &nullSignaller, - state->box, &totalNumberOfBondedInteractions, &bSumEkinhOld, - (bGStat ? CGLO_GSTAT : 0) | (bCalcEner ? CGLO_ENERGY : 0) - | (bTemp ? CGLO_TEMPERATURE : 0) | (bPres ? CGLO_PRESSURE : 0) - | (bPres ? CGLO_CONSTRAINT : 0) | (bStopCM ? CGLO_STOPCM : 0) - | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS - : 0) - | CGLO_SCALEEKIN); + compute_globals( + gstat, cr, ir, fr, ekind, makeConstArrayRef(state->x), + makeConstArrayRef(state->v), state->box, state->lambda[efptVDW], mdatoms, + nrnb, &vcm, wcycle, enerd, force_vir, shake_vir, total_vir, pres, constr, + &nullSignaller, state->box, &totalNumberOfBondedInteractions, &bSumEkinhOld, + (bGStat ? CGLO_GSTAT : 0) | (bCalcEner ? CGLO_ENERGY : 0) + | (bTemp ? CGLO_TEMPERATURE : 0) | (bPres ? CGLO_PRESSURE : 0) + | (bPres ? CGLO_CONSTRAINT : 0) | (bStopCM ? CGLO_STOPCM : 0) + | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS + : 0) + | CGLO_SCALEEKIN); /* explanation of above: a) We compute Ekin at the full time step if 1) we are using the AveVel Ekin, and it's not the @@ -1031,12 +1029,12 @@ void gmx::LegacySimulator::do_md() b) If we are using EkinAveEkin for the kinetic energy for the temperature control, we still feed in EkinAveVel because it's needed for the pressure */ checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions, - top_global, &top, state->x.rvec_array(), state->box, - &shouldCheckNumberOfBondedInteractions); + top_global, &top, makeConstArrayRef(state->x), + state->box, &shouldCheckNumberOfBondedInteractions); if (bStopCM) { - process_and_stopcm_grp(fplog, &vcm, *mdatoms, state->x.rvec_array(), - state->v.rvec_array()); + process_and_stopcm_grp(fplog, &vcm, *mdatoms, makeArrayRef(state->x), + makeArrayRef(state->v)); inc_nrnb(nrnb, eNR_STOPCM, mdatoms->homenr); } wallcycle_start(wcycle, ewcUPDATE); @@ -1074,8 +1072,8 @@ void gmx::LegacySimulator::do_md() /* We need the kinetic energy at minus the half step for determining * the full step kinetic energy and possibly for T-coupling.*/ /* This may not be quite working correctly yet . . . . */ - compute_globals(gstat, cr, ir, fr, ekind, state->x.rvec_array(), - state->v.rvec_array(), state->box, state->lambda[efptVDW], + compute_globals(gstat, cr, ir, fr, ekind, makeConstArrayRef(state->x), + makeConstArrayRef(state->v), state->box, state->lambda[efptVDW], mdatoms, nrnb, &vcm, wcycle, enerd, nullptr, nullptr, nullptr, nullptr, constr, &nullSignaller, state->box, nullptr, &bSumEkinhOld, CGLO_GSTAT | CGLO_TEMPERATURE); @@ -1324,10 +1322,11 @@ void gmx::LegacySimulator::do_md() { /* erase F_EKIN and F_TEMP here? */ /* just compute the kinetic energy at the half step to perform a trotter step */ - compute_globals(gstat, cr, ir, fr, ekind, state->x.rvec_array(), state->v.rvec_array(), - state->box, state->lambda[efptVDW], mdatoms, nrnb, &vcm, wcycle, enerd, - force_vir, shake_vir, total_vir, pres, constr, &nullSignaller, lastbox, - nullptr, &bSumEkinhOld, (bGStat ? CGLO_GSTAT : 0) | CGLO_TEMPERATURE); + compute_globals(gstat, cr, ir, fr, ekind, makeConstArrayRef(state->x), + makeConstArrayRef(state->v), state->box, state->lambda[efptVDW], + mdatoms, nrnb, &vcm, wcycle, enerd, force_vir, shake_vir, total_vir, + pres, constr, &nullSignaller, lastbox, nullptr, &bSumEkinhOld, + (bGStat ? CGLO_GSTAT : 0) | CGLO_TEMPERATURE); wallcycle_start(wcycle, ewcUPDATE); trotter_update(ir, step, ekind, enerd, state, total_vir, mdatoms, &MassQ, trotter_seq, ettTSEQ4); /* now we know the scaling, we can compute the positions again */ @@ -1413,10 +1412,10 @@ void gmx::LegacySimulator::do_md() SimulationSignaller signaller(&signals, cr, ms, doInterSimSignal, doIntraSimSignal); compute_globals( - gstat, cr, ir, fr, ekind, state->x.rvec_array(), state->v.rvec_array(), - state->box, state->lambda[efptVDW], mdatoms, nrnb, &vcm, wcycle, enerd, - force_vir, shake_vir, total_vir, pres, constr, &signaller, lastbox, - &totalNumberOfBondedInteractions, &bSumEkinhOld, + gstat, cr, ir, fr, ekind, makeConstArrayRef(state->x), + makeConstArrayRef(state->v), state->box, state->lambda[efptVDW], mdatoms, + nrnb, &vcm, wcycle, enerd, force_vir, shake_vir, total_vir, pres, constr, + &signaller, lastbox, &totalNumberOfBondedInteractions, &bSumEkinhOld, (bGStat ? CGLO_GSTAT : 0) | (!EI_VV(ir->eI) && bCalcEner ? CGLO_ENERGY : 0) | (!EI_VV(ir->eI) && bStopCM ? CGLO_STOPCM : 0) | (!EI_VV(ir->eI) ? CGLO_TEMPERATURE : 0) @@ -1424,12 +1423,12 @@ void gmx::LegacySimulator::do_md() | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)); checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions, - top_global, &top, state->x.rvec_array(), state->box, - &shouldCheckNumberOfBondedInteractions); + top_global, &top, makeConstArrayRef(state->x), + state->box, &shouldCheckNumberOfBondedInteractions); if (!EI_VV(ir->eI) && bStopCM) { - process_and_stopcm_grp(fplog, &vcm, *mdatoms, state->x.rvec_array(), - state->v.rvec_array()); + process_and_stopcm_grp(fplog, &vcm, *mdatoms, makeArrayRef(state->x), + makeArrayRef(state->v)); inc_nrnb(nrnb, eNR_STOPCM, mdatoms->homenr); // TODO: The special case of removing CM motion should be dealt more gracefully diff --git a/src/gromacs/mdrun/mimic.cpp b/src/gromacs/mdrun/mimic.cpp index a5f484c5a2..12daf94c25 100644 --- a/src/gromacs/mdrun/mimic.cpp +++ b/src/gromacs/mdrun/mimic.cpp @@ -298,13 +298,13 @@ void gmx::LegacySimulator::do_mimic() | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)); bool bSumEkinhOld = false; t_vcm* vcm = nullptr; - compute_globals(gstat, cr, ir, fr, ekind, state->x.rvec_array(), state->v.rvec_array(), - state->box, state->lambda[efptVDW], mdatoms, nrnb, vcm, nullptr, enerd, - force_vir, shake_vir, total_vir, pres, constr, &nullSignaller, state->box, - &totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags); + compute_globals(gstat, cr, ir, fr, ekind, makeConstArrayRef(state->x), + makeConstArrayRef(state->v), state->box, state->lambda[efptVDW], mdatoms, nrnb, + vcm, nullptr, enerd, force_vir, shake_vir, total_vir, pres, constr, &nullSignaller, + state->box, &totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags); } checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions, top_global, &top, - state->x.rvec_array(), state->box, + makeConstArrayRef(state->x), state->box, &shouldCheckNumberOfBondedInteractions); if (MASTER(cr)) @@ -485,15 +485,15 @@ void gmx::LegacySimulator::do_mimic() t_vcm* vcm = nullptr; SimulationSignaller signaller(&signals, cr, ms, doInterSimSignal, doIntraSimSignal); - compute_globals(gstat, cr, ir, fr, ekind, state->x.rvec_array(), state->v.rvec_array(), - state->box, state->lambda[efptVDW], mdatoms, nrnb, vcm, wcycle, enerd, - nullptr, nullptr, nullptr, nullptr, constr, &signaller, state->box, - &totalNumberOfBondedInteractions, &bSumEkinhOld, + compute_globals(gstat, cr, ir, fr, ekind, makeConstArrayRef(state->x), + makeConstArrayRef(state->v), state->box, state->lambda[efptVDW], mdatoms, + nrnb, vcm, wcycle, enerd, nullptr, nullptr, nullptr, nullptr, constr, + &signaller, state->box, &totalNumberOfBondedInteractions, &bSumEkinhOld, CGLO_GSTAT | CGLO_ENERGY | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)); checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions, top_global, - &top, state->x.rvec_array(), state->box, + &top, makeConstArrayRef(state->x), state->box, &shouldCheckNumberOfBondedInteractions); } diff --git a/src/gromacs/mdrun/rerun.cpp b/src/gromacs/mdrun/rerun.cpp index 482fca7461..dc45ee5194 100644 --- a/src/gromacs/mdrun/rerun.cpp +++ b/src/gromacs/mdrun/rerun.cpp @@ -373,13 +373,13 @@ void gmx::LegacySimulator::do_rerun() | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)); bool bSumEkinhOld = false; t_vcm* vcm = nullptr; - compute_globals(gstat, cr, ir, fr, ekind, state->x.rvec_array(), state->v.rvec_array(), - state->box, state->lambda[efptVDW], mdatoms, nrnb, vcm, nullptr, enerd, - force_vir, shake_vir, total_vir, pres, constr, &nullSignaller, state->box, - &totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags); + compute_globals(gstat, cr, ir, fr, ekind, makeConstArrayRef(state->x), + makeConstArrayRef(state->v), state->box, state->lambda[efptVDW], mdatoms, nrnb, + vcm, nullptr, enerd, force_vir, shake_vir, total_vir, pres, constr, &nullSignaller, + state->box, &totalNumberOfBondedInteractions, &bSumEkinhOld, cglo_flags); } checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions, top_global, &top, - state->x.rvec_array(), state->box, + makeConstArrayRef(state->x), state->box, &shouldCheckNumberOfBondedInteractions); if (MASTER(cr)) @@ -617,15 +617,15 @@ void gmx::LegacySimulator::do_rerun() t_vcm* vcm = nullptr; SimulationSignaller signaller(&signals, cr, ms, doInterSimSignal, doIntraSimSignal); - compute_globals(gstat, cr, ir, fr, ekind, state->x.rvec_array(), state->v.rvec_array(), - state->box, state->lambda[efptVDW], mdatoms, nrnb, vcm, wcycle, enerd, - force_vir, shake_vir, total_vir, pres, constr, &signaller, state->box, - &totalNumberOfBondedInteractions, &bSumEkinhOld, + compute_globals(gstat, cr, ir, fr, ekind, makeConstArrayRef(state->x), + makeConstArrayRef(state->v), state->box, state->lambda[efptVDW], mdatoms, + nrnb, vcm, wcycle, enerd, force_vir, shake_vir, total_vir, pres, constr, + &signaller, state->box, &totalNumberOfBondedInteractions, &bSumEkinhOld, CGLO_GSTAT | CGLO_ENERGY | (shouldCheckNumberOfBondedInteractions ? CGLO_CHECK_NUMBER_OF_BONDED_INTERACTIONS : 0)); checkNumberOfBondedInteractions(mdlog, cr, totalNumberOfBondedInteractions, top_global, - &top, state->x.rvec_array(), state->box, + &top, makeConstArrayRef(state->x), state->box, &shouldCheckNumberOfBondedInteractions); } diff --git a/src/gromacs/modularsimulator/computeglobalselement.cpp b/src/gromacs/modularsimulator/computeglobalselement.cpp index 8f74b0d0f1..6ba52b8144 100644 --- a/src/gromacs/modularsimulator/computeglobalselement.cpp +++ b/src/gromacs/modularsimulator/computeglobalselement.cpp @@ -129,15 +129,13 @@ void ComputeGlobalsElement::elementSetup() compute(-1, CGLO_GSTAT | CGLO_STOPCM, nullSignaller_.get(), false, true); - auto v = as_rvec_array(statePropagatorData_->velocitiesView().paddedArrayRef().data()); + auto v = statePropagatorData_->velocitiesView(); // At initialization, do not pass x with acceleration-correction mode // to avoid (incorrect) correction of the initial coordinates. - rvec* xPtr = nullptr; - if (vcm_.mode != ecmLINEAR_ACCELERATION_CORRECTION) - { - xPtr = as_rvec_array(statePropagatorData_->positionsView().paddedArrayRef().data()); - } - process_and_stopcm_grp(fplog_, &vcm_, *mdAtoms_->mdatoms(), xPtr, v); + auto x = vcm_.mode == ecmLINEAR_ACCELERATION_CORRECTION ? ArrayRefWithPadding() + : statePropagatorData_->positionsView(); + process_and_stopcm_grp(fplog_, &vcm_, *mdAtoms_->mdatoms(), x.unpaddedArrayRef(), + v.unpaddedArrayRef()); inc_nrnb(nrnb_, eNR_STOPCM, mdAtoms_->mdatoms()->homenr); } @@ -285,8 +283,8 @@ void ComputeGlobalsElement::compute(gmx::Step step, bool useLastBox, bool isInit) { - auto x = as_rvec_array(statePropagatorData_->positionsView().paddedArrayRef().data()); - auto v = as_rvec_array(statePropagatorData_->velocitiesView().paddedArrayRef().data()); + auto x = statePropagatorData_->positionsView().unpaddedArrayRef(); + auto v = statePropagatorData_->velocitiesView().unpaddedArrayRef(); auto box = statePropagatorData_->constBox(); auto lastbox = useLastBox ? statePropagatorData_->constPreviousBox() : statePropagatorData_->constBox();