Also renamed some of the enum values.
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[] = {
#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
}
// 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()
{
f_t->ener[i] = 0;
}
- for (int i = 0; i < egNR; i++)
+ for (int i = 0; i < static_cast<int>(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))
ener[i] += f_t[t]->ener[i];
}
}
- for (int i = 0; i < egNR; i++)
+ for (int i = 0; i < static_cast<int>(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];
}
}
}
{
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 */
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++)
/* 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<int>(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;
}
}
int i, j;
/* First reset all energy components. */
- for (i = 0; (i < egNR); i++)
+ for (i = 0; (i < static_cast<int>(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;
}
}
static std::array<const char*, 6> 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<NonBondedEnergyTerms, const char*> nonBondedEnergyTermTypeNames = {
+ "Coul-SR", "LJ-SR", "Buck-SR", "Coul-14", "LJ-14"
+ };
+ return nonBondedEnergyTermTypeNames[enumValue];
+}
+
//! \}
namespace gmx
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))
}
/* 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
}
/* 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_++;
}
{
n = 0;
snew(gnm, nEc_);
- for (k = 0; (k < nEc_); k++)
+ for (int k = 0; (k < nEc_); k++)
{
snew(gnm[k], STRLEN);
}
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]);
}
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<int>(NonBondedEnergyTerms::Count)];
gmx::EnumerationArray<FreeEnergyPerturbationCouplingType, double> store_dhdl;
real store_energy = 0;
real tmp;
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<int>(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);
{
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");
} // 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
//! 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<NonBondedEnergyTerms, bool> bEInd_;
//! Number of energy terms to be printed (these, for which bEInd[] == true)
int nEc_ = 0;
//! Number of energy output groups
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)
{
x.unpaddedConstArrayRef(),
&forceOutMtsLevel0.forceWithVirial(),
lambda[static_cast<int>(FreeEnergyPerturbationCouplingType::Vdw)],
- enerd->grpp.ener[egLJSR].data(),
+ enerd->grpp.energyGroupPairTerms[NonBondedEnergyTerms::LJSR].data(),
nrnb);
enerd->dvdl_lin[FreeEnergyPerturbationCouplingType::Vdw] += dvdl_walls;
}
{
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
{
* 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())
{
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<int>(NonBondedEnergyTerms::Count)];
real copyenerd[F_NRE];
int nener, j;
double nb;
irmsd = add_binr(rb, 2, constraintsRmsdData.data());
}
- for (j = 0; (j < egNR); j++)
+ for (j = 0; (j < static_cast<int>(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)
{
extract_binr(rb, irmsd, constraintsRmsdData);
}
- for (j = 0; (j < egNR); j++)
+ for (j = 0; (j < static_cast<int>(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)
{
// 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<int>(NonBondedEnergyTerms::Count); k++)
{
- enerdata_->grpp.ener[k][i] = (*testValue += 0.1);
+ enerdata_->grpp.energyGroupPairTerms[k][i] = (*testValue += 0.1);
}
}
{
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)
{
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)
{
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
{
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<std::vector<real>, egNR> ener; /* Energy terms for each pair of groups */
+ int nener; /* The number of energy group pairs */
+ gmx::EnumerationArray<NonBondedEnergyTerms, std::vector<real>> energyGroupPairTerms; /* Energy terms for each pair of groups */
};
//! Accumulates free-energy foreign lambda energies and dH/dlamba
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:
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!");
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");
gmx::EnumerationArray<FreeEnergyPerturbationCouplingType, real> 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++)
{
* 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.
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 */