From 51ec69efa5a8b9f1e0f1a51051806bf92d207631 Mon Sep 17 00:00:00 2001 From: Joe Jordan Date: Fri, 19 Mar 2021 09:54:58 +0000 Subject: [PATCH] Make non bonded energy terms enum class Also renamed some of the enum values. --- src/gromacs/gmxana/gmx_enemat.cpp | 14 +++++ src/gromacs/gmxana/gmx_energy.cpp | 2 +- src/gromacs/listed_forces/gpubonded_impl.cu | 4 +- src/gromacs/listed_forces/listed_forces.cpp | 8 +-- src/gromacs/listed_forces/pairs.cpp | 8 +-- src/gromacs/mdlib/enerdata_utils.cpp | 18 +++--- src/gromacs/mdlib/energyoutput.cpp | 64 ++++++++++++--------- src/gromacs/mdlib/energyoutput.h | 6 +- src/gromacs/mdlib/sim_util.cpp | 50 ++++++++-------- src/gromacs/mdlib/stat.cpp | 10 ++-- src/gromacs/mdlib/tests/energyoutput.cpp | 4 +- src/gromacs/mdrun/tpi.cpp | 12 +++- src/gromacs/mdtypes/enerdata.h | 22 +++---- src/gromacs/nbnxm/kerneldispatch.cpp | 41 +++++++------ src/gromacs/trajectory/energyframe.h | 6 +- 15 files changed, 152 insertions(+), 117 deletions(-) diff --git a/src/gromacs/gmxana/gmx_enemat.cpp b/src/gromacs/gmxana/gmx_enemat.cpp index fab46dce52..fcc13f7bb1 100644 --- a/src/gromacs/gmxana/gmx_enemat.cpp +++ b/src/gromacs/gmxana/gmx_enemat.cpp @@ -83,6 +83,20 @@ static int search_str2(int nstr, char** str, char* key) return -1; } +// The non-bonded energy terms accumulated for energy group pairs. These were superseded elsewhere +// by NonBondedEnergyTerms but not updated here due to the need for refactoring here first. +enum +{ + egCOULSR, + egLJSR, + egBHAMSR, + egCOUL14, + egLJ14, + egNR +}; +static const char* egrp_nm[egNR + 1] = { "Coul-SR", "LJ-SR", "Buck-SR", "Coul-14", "LJ-14", nullptr }; + + int gmx_enemat(int argc, char* argv[]) { const char* desc[] = { diff --git a/src/gromacs/gmxana/gmx_energy.cpp b/src/gromacs/gmxana/gmx_energy.cpp index b13a137695..ebd5f5a3f4 100644 --- a/src/gromacs/gmxana/gmx_energy.cpp +++ b/src/gromacs/gmxana/gmx_energy.cpp @@ -1248,7 +1248,7 @@ static void analyse_ener(gmx_bool bCorr, #if 0 do_autocorr(corrfn, oenv, buf, edat->nframes, bSum ? 1 : nset, - bSum ? &edat->s[nset-1].ener : eneset, + bSum ? &edat->s[nset-1].energyGroupPairTerms : eneset, (delta_t/edat->nframes), eacNormal, FALSE); #endif } diff --git a/src/gromacs/listed_forces/gpubonded_impl.cu b/src/gromacs/listed_forces/gpubonded_impl.cu index d8e34936cf..0689950b56 100644 --- a/src/gromacs/listed_forces/gpubonded_impl.cu +++ b/src/gromacs/listed_forces/gpubonded_impl.cu @@ -339,8 +339,8 @@ void GpuBonded::Impl::waitAccumulateEnergyTerms(gmx_enerdata_t* enerd) // Note: We do not support energy groups here gmx_grppairener_t* grppener = &enerd->grpp; GMX_RELEASE_ASSERT(grppener->nener == 1, "No energy group support for bondeds on the GPU"); - grppener->ener[egLJ14][0] += vTot_[F_LJ14]; - grppener->ener[egCOUL14][0] += vTot_[F_COUL14]; + grppener->energyGroupPairTerms[NonBondedEnergyTerms::LJ14][0] += vTot_[F_LJ14]; + grppener->energyGroupPairTerms[NonBondedEnergyTerms::Coulomb14][0] += vTot_[F_COUL14]; } void GpuBonded::Impl::clearEnergies() diff --git a/src/gromacs/listed_forces/listed_forces.cpp b/src/gromacs/listed_forces/listed_forces.cpp index 0364a2d734..e8b92fc82b 100644 --- a/src/gromacs/listed_forces/listed_forces.cpp +++ b/src/gromacs/listed_forces/listed_forces.cpp @@ -221,11 +221,11 @@ void zero_thread_output(f_thread_t* f_t) { f_t->ener[i] = 0; } - for (int i = 0; i < egNR; i++) + for (int i = 0; i < static_cast(NonBondedEnergyTerms::Count); i++) { for (int j = 0; j < f_t->grpp.nener; j++) { - f_t->grpp.ener[i][j] = 0; + f_t->grpp.energyGroupPairTerms[i][j] = 0; } } for (auto i : keysOf(f_t->dvdl)) @@ -338,13 +338,13 @@ void reduce_thread_output(gmx::ForceWithShiftForces* forceWithShiftForces, ener[i] += f_t[t]->ener[i]; } } - for (int i = 0; i < egNR; i++) + for (int i = 0; i < static_cast(NonBondedEnergyTerms::Count); i++) { for (int j = 0; j < f_t[1]->grpp.nener; j++) { for (int t = 1; t < bt->nthreads; t++) { - grpp->ener[i][j] += f_t[t]->grpp.ener[i][j]; + grpp->energyGroupPairTerms[i][j] += f_t[t]->grpp.energyGroupPairTerms[i][j]; } } } diff --git a/src/gromacs/listed_forces/pairs.cpp b/src/gromacs/listed_forces/pairs.cpp index 77c78746fd..f84fe890ab 100644 --- a/src/gromacs/listed_forces/pairs.cpp +++ b/src/gromacs/listed_forces/pairs.cpp @@ -376,12 +376,12 @@ static real do_pairs_general(int ftype, { case F_LJ14: case F_LJC14_Q: - energygrp_elec = grppener->ener[egCOUL14].data(); - energygrp_vdw = grppener->ener[egLJ14].data(); + energygrp_elec = grppener->energyGroupPairTerms[NonBondedEnergyTerms::Coulomb14].data(); + energygrp_vdw = grppener->energyGroupPairTerms[NonBondedEnergyTerms::LJ14].data(); break; case F_LJC_PAIRS_NB: - energygrp_elec = grppener->ener[egCOULSR].data(); - energygrp_vdw = grppener->ener[egLJSR].data(); + energygrp_elec = grppener->energyGroupPairTerms[NonBondedEnergyTerms::CoulombSR].data(); + energygrp_vdw = grppener->energyGroupPairTerms[NonBondedEnergyTerms::LJSR].data(); break; default: energygrp_elec = nullptr; /* Keep compiler happy */ diff --git a/src/gromacs/mdlib/enerdata_utils.cpp b/src/gromacs/mdlib/enerdata_utils.cpp index be5b282c07..1559acd0eb 100644 --- a/src/gromacs/mdlib/enerdata_utils.cpp +++ b/src/gromacs/mdlib/enerdata_utils.cpp @@ -106,15 +106,15 @@ void sum_epot(const gmx_grppairener_t& grpp, real* epot) int i; /* Accumulate energies */ - epot[F_COUL_SR] = sum_v(grpp.nener, grpp.ener[egCOULSR]); - epot[F_LJ] = sum_v(grpp.nener, grpp.ener[egLJSR]); - epot[F_LJ14] = sum_v(grpp.nener, grpp.ener[egLJ14]); - epot[F_COUL14] = sum_v(grpp.nener, grpp.ener[egCOUL14]); + epot[F_COUL_SR] = sum_v(grpp.nener, grpp.energyGroupPairTerms[NonBondedEnergyTerms::CoulombSR]); + epot[F_LJ] = sum_v(grpp.nener, grpp.energyGroupPairTerms[NonBondedEnergyTerms::LJSR]); + epot[F_LJ14] = sum_v(grpp.nener, grpp.energyGroupPairTerms[NonBondedEnergyTerms::LJ14]); + epot[F_COUL14] = sum_v(grpp.nener, grpp.energyGroupPairTerms[NonBondedEnergyTerms::Coulomb14]); /* lattice part of LR doesnt belong to any group * and has been added earlier */ - epot[F_BHAM] = sum_v(grpp.nener, grpp.ener[egBHAMSR]); + epot[F_BHAM] = sum_v(grpp.nener, grpp.energyGroupPairTerms[NonBondedEnergyTerms::BuckinghamSR]); epot[F_EPOT] = 0; for (i = 0; (i < F_EPOT); i++) @@ -315,11 +315,11 @@ void reset_foreign_enerdata(gmx_enerdata_t* enerd) /* First reset all foreign energy components. Foreign energies always called on neighbor search steps */ - for (i = 0; (i < egNR); i++) + for (i = 0; (i < static_cast(NonBondedEnergyTerms::Count)); i++) { for (j = 0; (j < enerd->grpp.nener); j++) { - enerd->foreign_grpp.ener[i][j] = 0.0; + enerd->foreign_grpp.energyGroupPairTerms[i][j] = 0.0; } } @@ -344,11 +344,11 @@ void reset_enerdata(gmx_enerdata_t* enerd) int i, j; /* First reset all energy components. */ - for (i = 0; (i < egNR); i++) + for (i = 0; (i < static_cast(NonBondedEnergyTerms::Count)); i++) { for (j = 0; (j < enerd->grpp.nener); j++) { - enerd->grpp.ener[i][j] = 0.0_real; + enerd->grpp.energyGroupPairTerms[i][j] = 0.0_real; } } diff --git a/src/gromacs/mdlib/energyoutput.cpp b/src/gromacs/mdlib/energyoutput.cpp index 1f75ff4781..0fb6175301 100644 --- a/src/gromacs/mdlib/energyoutput.cpp +++ b/src/gromacs/mdlib/energyoutput.cpp @@ -108,7 +108,14 @@ static const char* enthalpy_nm[] = { "Enthalpy" }; static std::array boxvel_nm = { "Box-Vel-XX", "Box-Vel-YY", "Box-Vel-ZZ", "Box-Vel-YX", "Box-Vel-ZX", "Box-Vel-ZY" }; -const char* egrp_nm[egNR + 1] = { "Coul-SR", "LJ-SR", "Buck-SR", "Coul-14", "LJ-14", nullptr }; +const char* enumValueToString(NonBondedEnergyTerms enumValue) +{ + static constexpr gmx::EnumerationArray nonBondedEnergyTermTypeNames = { + "Coul-SR", "LJ-SR", "Buck-SR", "Coul-14", "LJ-14" + }; + return nonBondedEnergyTermTypeNames[enumValue]; +} + //! \} namespace gmx @@ -154,7 +161,7 @@ EnergyOutput::EnergyOutput(ener_file* fp_ene, char** gnm; char buf[256]; const char* bufi; - int i, j, ni, nj, n, k, kk, ncon, nset; + int i, j, ni, nj, n, ncon, nset; bool bBHAM, b14; if (EI_DYNAMICS(inputrec.eI)) @@ -190,9 +197,9 @@ EnergyOutput::EnergyOutput(ener_file* fp_ene, } /* Energy monitoring */ - for (i = 0; i < egNR; i++) + for (auto& term : bEInd_) { - bEInd_[i] = false; + term = false; } // Setting true only to those energy terms, that have active interactions and @@ -333,27 +340,27 @@ EnergyOutput::EnergyOutput(ener_file* fp_ene, } /* Energy monitoring */ - for (i = 0; i < egNR; i++) + for (auto& term : bEInd_) { - bEInd_[i] = false; + term = false; } - bEInd_[egCOULSR] = true; - bEInd_[egLJSR] = true; + bEInd_[NonBondedEnergyTerms::CoulombSR] = true; + bEInd_[NonBondedEnergyTerms::LJSR] = true; if (bBHAM) { - bEInd_[egLJSR] = false; - bEInd_[egBHAMSR] = true; + bEInd_[NonBondedEnergyTerms::LJSR] = false; + bEInd_[NonBondedEnergyTerms::BuckinghamSR] = true; } if (b14) { - bEInd_[egLJ14] = true; - bEInd_[egCOUL14] = true; + bEInd_[NonBondedEnergyTerms::LJ14] = true; + bEInd_[NonBondedEnergyTerms::Coulomb14] = true; } nEc_ = 0; - for (i = 0; (i < egNR); i++) + for (auto term : bEInd_) { - if (bEInd_[i]) + if (term) { nEc_++; } @@ -367,7 +374,7 @@ EnergyOutput::EnergyOutput(ener_file* fp_ene, { n = 0; snew(gnm, nEc_); - for (k = 0; (k < nEc_); k++) + for (int k = 0; (k < nEc_); k++) { snew(gnm[k], STRLEN); } @@ -376,24 +383,25 @@ EnergyOutput::EnergyOutput(ener_file* fp_ene, ni = groups->groups[SimulationAtomGroupType::EnergyOutput][i]; for (j = i; (j < gmx::ssize(groups->groups[SimulationAtomGroupType::EnergyOutput])); j++) { - nj = groups->groups[SimulationAtomGroupType::EnergyOutput][j]; - for (k = kk = 0; (k < egNR); k++) + nj = groups->groups[SimulationAtomGroupType::EnergyOutput][j]; + int k = 0; + for (auto key : keysOf(bEInd_)) { - if (bEInd_[k]) + if (bEInd_[key]) { - sprintf(gnm[kk], + sprintf(gnm[k], "%s:%s-%s", - egrp_nm[k], + enumValueToString(key), *(groups->groupNames[ni]), *(groups->groupNames[nj])); - kk++; + k++; } } igrp_[n] = get_ebin_space(ebin_, nEc_, gnm, unit_energy); n++; } } - for (k = 0; (k < nEc_); k++) + for (int k = 0; (k < nEc_); k++) { sfree(gnm[k]); } @@ -871,7 +879,7 @@ void EnergyOutput::addDataAtEnergyStep(bool bDoDHDL, int j, k, kk, n, gid; real crmsd[2], tmp6[6]; real bs[tricl_boxs_nm.size()], vol, dens, enthalpy; - real eee[egNR]; + real eee[static_cast(NonBondedEnergyTerms::Count)]; gmx::EnumerationArray store_dhdl; real store_energy = 0; real tmp; @@ -969,11 +977,11 @@ void EnergyOutput::addDataAtEnergyStep(bool bDoDHDL, for (j = i; (j < nEg_); j++) { gid = GID(i, j, nEg_); - for (k = kk = 0; (k < egNR); k++) + for (k = kk = 0; (k < static_cast(NonBondedEnergyTerms::Count)); k++) { if (bEInd_[k]) { - eee[kk++] = enerd->grpp.ener[k][gid]; + eee[kk++] = enerd->grpp.energyGroupPairTerms[k][gid]; } } add_ebin(ebin_, igrp_[n], nEc_, eee, bSum); @@ -1386,11 +1394,11 @@ void EnergyOutput::printAverages(FILE* log, const SimulationGroups* groups) { int padding = 8 - strlen(unit_energy); fprintf(log, "%*sEpot (%s) ", padding, "", unit_energy); - for (int i = 0; (i < egNR); i++) + for (auto key : keysOf(bEInd_)) { - if (bEInd_[i]) + if (bEInd_[key]) { - fprintf(log, "%12s ", egrp_nm[i]); + fprintf(log, "%12s ", enumValueToString(key)); } } fprintf(log, "\n"); diff --git a/src/gromacs/mdlib/energyoutput.h b/src/gromacs/mdlib/energyoutput.h index 8322e2dc1d..f8071be93f 100644 --- a/src/gromacs/mdlib/energyoutput.h +++ b/src/gromacs/mdlib/energyoutput.h @@ -78,7 +78,7 @@ enum class StartingBehavior; } // namespace gmx //! \brief Printed names for intergroup energies -extern const char* egrp_nm[egNR + 1]; +const char* enumValueToString(NonBondedEnergyTerms enumValue); /* \brief delta_h block type enum: the kinds of energies written out. */ enum @@ -375,8 +375,8 @@ private: //! Index for viscocity int ivisc_ = 0; - //! Which energy terms from egNR list should be printed in group-to-group block - bool bEInd_[egNR] = { false }; + //! Which energy terms from NonBondedEnergyTerms list should be printed in group-to-group block + gmx::EnumerationArray bEInd_; //! Number of energy terms to be printed (these, for which bEInd[] == true) int nEc_ = 0; //! Number of energy output groups diff --git a/src/gromacs/mdlib/sim_util.cpp b/src/gromacs/mdlib/sim_util.cpp index 1db242af88..55b94a7abb 100644 --- a/src/gromacs/mdlib/sim_util.cpp +++ b/src/gromacs/mdlib/sim_util.cpp @@ -798,14 +798,15 @@ static void alternatePmeNbGpuWaitReduce(nonbonded_verlet_t* nbv, auto& forceBuffersNonbonded = forceOutputsNonbonded->forceWithShiftForces(); GpuTaskCompletion completionType = (isPmeGpuDone) ? GpuTaskCompletion::Wait : GpuTaskCompletion::Check; - isNbGpuDone = Nbnxm::gpu_try_finish_task(nbv->gpu_nbv, - stepWork, - AtomLocality::Local, - enerd->grpp.ener[egLJSR].data(), - enerd->grpp.ener[egCOULSR].data(), - forceBuffersNonbonded.shiftForces(), - completionType, - wcycle); + isNbGpuDone = Nbnxm::gpu_try_finish_task( + nbv->gpu_nbv, + stepWork, + AtomLocality::Local, + enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::LJSR].data(), + enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::CoulombSR].data(), + forceBuffersNonbonded.shiftForces(), + completionType, + wcycle); if (isNbGpuDone) { @@ -1821,7 +1822,7 @@ void do_force(FILE* fplog, x.unpaddedConstArrayRef(), &forceOutMtsLevel0.forceWithVirial(), lambda[static_cast(FreeEnergyPerturbationCouplingType::Vdw)], - enerd->grpp.ener[egLJSR].data(), + enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::LJSR].data(), nrnb); enerd->dvdl_lin[FreeEnergyPerturbationCouplingType::Vdw] += dvdl_walls; } @@ -1957,13 +1958,14 @@ void do_force(FILE* fplog, { if (simulationWork.useGpuNonbonded) { - cycles_wait_gpu += Nbnxm::gpu_wait_finish_task(nbv->gpu_nbv, - stepWork, - AtomLocality::NonLocal, - enerd->grpp.ener[egLJSR].data(), - enerd->grpp.ener[egCOULSR].data(), - forceWithShiftForces.shiftForces(), - wcycle); + cycles_wait_gpu += Nbnxm::gpu_wait_finish_task( + nbv->gpu_nbv, + stepWork, + AtomLocality::NonLocal, + enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::LJSR].data(), + enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::CoulombSR].data(), + forceWithShiftForces.shiftForces(), + wcycle); } else { @@ -2106,14 +2108,14 @@ void do_force(FILE* fplog, * of the step time. */ const float gpuWaitApiOverheadMargin = 2e6F; /* cycles */ - const float waitCycles = - Nbnxm::gpu_wait_finish_task(nbv->gpu_nbv, - stepWork, - AtomLocality::Local, - enerd->grpp.ener[egLJSR].data(), - enerd->grpp.ener[egCOULSR].data(), - forceOutNonbonded->forceWithShiftForces().shiftForces(), - wcycle); + const float waitCycles = Nbnxm::gpu_wait_finish_task( + nbv->gpu_nbv, + stepWork, + AtomLocality::Local, + enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::LJSR].data(), + enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::CoulombSR].data(), + forceOutNonbonded->forceWithShiftForces().shiftForces(), + wcycle); if (ddBalanceRegionHandler.useBalancingRegion()) { diff --git a/src/gromacs/mdlib/stat.cpp b/src/gromacs/mdlib/stat.cpp index fa522f3537..5aac4a342a 100644 --- a/src/gromacs/mdlib/stat.cpp +++ b/src/gromacs/mdlib/stat.cpp @@ -157,7 +157,7 @@ void global_stat(const gmx_global_stat* gs, int idedl = 0, idedlo = 0, idvdll = 0, idvdlnl = 0, iepl = 0, icm = 0, imass = 0, ica = 0, inb = 0; int isig = -1; int icj = -1, ici = -1, icx = -1; - int inn[egNR]; + int inn[static_cast(NonBondedEnergyTerms::Count)]; real copyenerd[F_NRE]; int nener, j; double nb; @@ -243,9 +243,9 @@ void global_stat(const gmx_global_stat* gs, irmsd = add_binr(rb, 2, constraintsRmsdData.data()); } - for (j = 0; (j < egNR); j++) + for (j = 0; (j < static_cast(NonBondedEnergyTerms::Count)); j++) { - inn[j] = add_binr(rb, enerd->grpp.nener, enerd->grpp.ener[j].data()); + inn[j] = add_binr(rb, enerd->grpp.nener, enerd->grpp.energyGroupPairTerms[j].data()); } if (inputrec->efep != FreeEnergyPerturbationType::No) { @@ -340,9 +340,9 @@ void global_stat(const gmx_global_stat* gs, extract_binr(rb, irmsd, constraintsRmsdData); } - for (j = 0; (j < egNR); j++) + for (j = 0; (j < static_cast(NonBondedEnergyTerms::Count)); j++) { - extract_binr(rb, inn[j], enerd->grpp.nener, enerd->grpp.ener[j].data()); + extract_binr(rb, inn[j], enerd->grpp.nener, enerd->grpp.energyGroupPairTerms[j].data()); } if (inputrec->efep != FreeEnergyPerturbationType::No) { diff --git a/src/gromacs/mdlib/tests/energyoutput.cpp b/src/gromacs/mdlib/tests/energyoutput.cpp index b82e610fe5..fac276b9f6 100644 --- a/src/gromacs/mdlib/tests/energyoutput.cpp +++ b/src/gromacs/mdlib/tests/energyoutput.cpp @@ -420,9 +420,9 @@ public: // Group pairs for (int i = 0; i < enerdata_->grpp.nener; i++) { - for (int k = 0; k < egNR; k++) + for (int k = 0; k < static_cast(NonBondedEnergyTerms::Count); k++) { - enerdata_->grpp.ener[k][i] = (*testValue += 0.1); + enerdata_->grpp.energyGroupPairTerms[k][i] = (*testValue += 0.1); } } diff --git a/src/gromacs/mdrun/tpi.cpp b/src/gromacs/mdrun/tpi.cpp index 41ff5e0b38..f392cadfdc 100644 --- a/src/gromacs/mdrun/tpi.cpp +++ b/src/gromacs/mdrun/tpi.cpp @@ -866,14 +866,18 @@ void LegacySimulator::do_tpi() { for (i = 0; i < ngid; i++) { - sum_UgembU[e++] += enerd->grpp.ener[egBHAMSR][GID(i, gid_tp, ngid)] * embU; + sum_UgembU[e++] += + enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::BuckinghamSR][GID(i, gid_tp, ngid)] + * embU; } } else { for (i = 0; i < ngid; i++) { - sum_UgembU[e++] += enerd->grpp.ener[egLJSR][GID(i, gid_tp, ngid)] * embU; + sum_UgembU[e++] += + enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::LJSR][GID(i, gid_tp, ngid)] + * embU; } } if (bDispCorr) @@ -884,7 +888,9 @@ void LegacySimulator::do_tpi() { for (i = 0; i < ngid; i++) { - sum_UgembU[e++] += enerd->grpp.ener[egCOULSR][GID(i, gid_tp, ngid)] * embU; + sum_UgembU[e++] += + enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::CoulombSR][GID(i, gid_tp, ngid)] + * embU; } if (bRFExcl) { diff --git a/src/gromacs/mdtypes/enerdata.h b/src/gromacs/mdtypes/enerdata.h index f2d18f7b40..528352a47f 100644 --- a/src/gromacs/mdtypes/enerdata.h +++ b/src/gromacs/mdtypes/enerdata.h @@ -50,14 +50,14 @@ struct t_commrec; struct t_lambda; // The non-bonded energy terms accumulated for energy group pairs -enum +enum class NonBondedEnergyTerms : int { - egCOULSR, - egLJSR, - egBHAMSR, - egCOUL14, - egLJ14, - egNR + CoulombSR, + LJSR, + BuckinghamSR, + Coulomb14, + LJ14, + Count }; // Struct for accumulating non-bonded energies between energy group pairs @@ -65,14 +65,14 @@ struct gmx_grppairener_t { gmx_grppairener_t(int numEnergyGroups) : nener(numEnergyGroups * numEnergyGroups) { - for (auto& elem : ener) + for (auto& term : energyGroupPairTerms) { - elem.resize(nener); + term.resize(nener); } } - int nener; /* The number of energy group pairs */ - std::array, egNR> ener; /* Energy terms for each pair of groups */ + int nener; /* The number of energy group pairs */ + gmx::EnumerationArray> energyGroupPairTerms; /* Energy terms for each pair of groups */ }; //! Accumulates free-energy foreign lambda energies and dH/dlamba diff --git a/src/gromacs/nbnxm/kerneldispatch.cpp b/src/gromacs/nbnxm/kerneldispatch.cpp index ae9edafd6a..7cbfabfc78 100644 --- a/src/gromacs/nbnxm/kerneldispatch.cpp +++ b/src/gromacs/nbnxm/kerneldispatch.cpp @@ -454,16 +454,18 @@ void nonbonded_verlet_t::dispatchNonbondedKernel(gmx::InteractionLocality iLoc case Nbnxm::KernelType::Cpu4x4_PlainC: case Nbnxm::KernelType::Cpu4xN_Simd_4xN: case Nbnxm::KernelType::Cpu4xN_Simd_2xNN: - nbnxn_kernel_cpu(pairlistSet, - kernelSetup(), - nbat.get(), - ic, - fr.shift_vec, - stepWork, - clearF, - enerd->grpp.ener[egCOULSR].data(), - fr.bBHAM ? enerd->grpp.ener[egBHAMSR].data() : enerd->grpp.ener[egLJSR].data(), - wcycle_); + nbnxn_kernel_cpu( + pairlistSet, + kernelSetup(), + nbat.get(), + ic, + fr.shift_vec, + stepWork, + clearF, + enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::CoulombSR].data(), + fr.bBHAM ? enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::BuckinghamSR].data() + : enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::LJSR].data(), + wcycle_); break; case Nbnxm::KernelType::Gpu8x8x8: @@ -480,8 +482,9 @@ void nonbonded_verlet_t::dispatchNonbondedKernel(gmx::InteractionLocality iLoc clearF, nbat->out[0].f, nbat->out[0].fshift.data(), - enerd->grpp.ener[egCOULSR].data(), - fr.bBHAM ? enerd->grpp.ener[egBHAMSR].data() : enerd->grpp.ener[egLJSR].data()); + enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::CoulombSR].data(), + fr.bBHAM ? enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::BuckinghamSR].data() + : enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::LJSR].data()); break; default: GMX_RELEASE_ASSERT(false, "Invalid nonbonded kernel type passed!"); @@ -532,8 +535,8 @@ void nonbonded_verlet_t::dispatchFreeEnergyKernel(gmx::InteractionLocality iLo kernel_data.lambda = lambda; kernel_data.dvdl = dvdl_nb; - kernel_data.energygrp_elec = enerd->grpp.ener[egCOULSR].data(); - kernel_data.energygrp_vdw = enerd->grpp.ener[egLJSR].data(); + kernel_data.energygrp_elec = enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::CoulombSR].data(); + kernel_data.energygrp_vdw = enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::LJSR].data(); GMX_ASSERT(gmx_omp_nthreads_get(emntNonbonded) == nbl_fep.ssize(), "Number of lists should be same as number of NB threads"); @@ -573,10 +576,12 @@ void nonbonded_verlet_t::dispatchFreeEnergyKernel(gmx::InteractionLocality iLo gmx::EnumerationArray lam_i; kernel_data.flags = (donb_flags & ~(GMX_NONBONDED_DO_FORCE | GMX_NONBONDED_DO_SHIFTFORCE)) | GMX_NONBONDED_DO_FOREIGNLAMBDA; - kernel_data.lambda = lam_i; - kernel_data.dvdl = dvdl_nb; - kernel_data.energygrp_elec = enerd->foreign_grpp.ener[egCOULSR].data(); - kernel_data.energygrp_vdw = enerd->foreign_grpp.ener[egLJSR].data(); + kernel_data.lambda = lam_i; + kernel_data.dvdl = dvdl_nb; + kernel_data.energygrp_elec = + enerd->foreign_grpp.energyGroupPairTerms[NonBondedEnergyTerms::CoulombSR].data(); + kernel_data.energygrp_vdw = + enerd->foreign_grpp.energyGroupPairTerms[NonBondedEnergyTerms::LJSR].data(); for (gmx::index i = 0; i < 1 + enerd->foreignLambdaTerms.numLambdas(); i++) { diff --git a/src/gromacs/trajectory/energyframe.h b/src/gromacs/trajectory/energyframe.h index b37f14d4c8..2f9609bd39 100644 --- a/src/gromacs/trajectory/energyframe.h +++ b/src/gromacs/trajectory/energyframe.h @@ -4,7 +4,7 @@ * Copyright (c) 1991-2000, University of Groningen, The Netherlands. * Copyright (c) 2001-2004, The GROMACS development team. * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team. - * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by + * Copyright (c) 2018,2019,2020,2021, 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. @@ -63,10 +63,10 @@ struct t_enxframe int64_t step; /* MD step */ int64_t nsteps; /* The number of steps between frames */ double dt; /* The MD time step */ - int nsum; /* The number of terms for the sums in ener */ + int nsum; /* The number of terms for the sums in energyGroupPairTerms */ int nre; /* Number of energies */ int e_size; /* Size (in bytes) of energies */ - int e_alloc; /* Allocated size (in elements) of ener */ + int e_alloc; /* Allocated size (in elements) of energyGroupPairTerms */ t_energy* ener; /* The energies */ int nblock; /* Number of following energy blocks */ t_enxblock* block; /* The blocks */ -- 2.22.0