Make non bonded energy terms enum class
authorJoe Jordan <ejjordan12@gmail.com>
Fri, 19 Mar 2021 09:54:58 +0000 (09:54 +0000)
committerMark Abraham <mark.j.abraham@gmail.com>
Fri, 19 Mar 2021 09:54:58 +0000 (09:54 +0000)
Also renamed some of the enum values.

15 files changed:
src/gromacs/gmxana/gmx_enemat.cpp
src/gromacs/gmxana/gmx_energy.cpp
src/gromacs/listed_forces/gpubonded_impl.cu
src/gromacs/listed_forces/listed_forces.cpp
src/gromacs/listed_forces/pairs.cpp
src/gromacs/mdlib/enerdata_utils.cpp
src/gromacs/mdlib/energyoutput.cpp
src/gromacs/mdlib/energyoutput.h
src/gromacs/mdlib/sim_util.cpp
src/gromacs/mdlib/stat.cpp
src/gromacs/mdlib/tests/energyoutput.cpp
src/gromacs/mdrun/tpi.cpp
src/gromacs/mdtypes/enerdata.h
src/gromacs/nbnxm/kerneldispatch.cpp
src/gromacs/trajectory/energyframe.h

index fab46dce5204ad3251aec9571d158da8858b8219..fcc13f7bb10c6a760cb827ac01ae762c6e816e94 100644 (file)
@@ -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[] = {
index b13a137695a5c90de5b663b0df87a74e04b5edef..ebd5f5a3f4a14ffd72db5b9176a5d8e6224f2545 100644 (file)
@@ -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
         }
index d8e34936cfd6620a0ef3dc2f38bec7502ebd7644..0689950b56ae9b73ed3b0ec734a6beb8fc44c864 100644 (file)
@@ -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()
index 0364a2d7349a86b6a0f60b60aa32b2b558e85e49..e8b92fc82b7dfa408f5df69f74cad165d23d643d 100644 (file)
@@ -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<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))
@@ -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<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];
                     }
                 }
             }
index 77c78746fddb9ad54a2b70c84672fc82df963d59..f84fe890abbe35410078b102d070f45a1a8844e0 100644 (file)
@@ -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 */
index be5b282c072466a509f7693365896c6ea60090fa..1559acd0eb20541e2c03c33787b6627cfe45e5eb 100644 (file)
@@ -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<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;
         }
     }
 
@@ -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<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;
         }
     }
 
index 1f75ff4781f444d79e26e978dc30041db3055b23..0fb61753014283389c9b035dd1c9fd54b930fb44 100644 (file)
@@ -108,7 +108,14 @@ static const char* enthalpy_nm[] = { "Enthalpy" };
 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
@@ -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<int>(NonBondedEnergyTerms::Count)];
     gmx::EnumerationArray<FreeEnergyPerturbationCouplingType, double> 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<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);
@@ -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");
index 8322e2dc1d1c5dd24b4c72cdaeaca35f52dd1817..f8071be93fb51b25512a15ec5cb9438fd756e9ab 100644 (file)
@@ -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<NonBondedEnergyTerms, bool> bEInd_;
     //! Number of energy terms to be printed (these, for which bEInd[] == true)
     int nEc_ = 0;
     //! Number of energy output groups
index 1db242af88b3374ced1cfadf2cc88826764b1df7..55b94a7abb9ed6fc2afafaa1b5b6a2ff87adc77e 100644 (file)
@@ -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<int>(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())
         {
index fa522f3537f461d01dddf430dbaccd98fca72de7..5aac4a342aa3ea935da9ed802d3923a947d169a4 100644 (file)
@@ -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<int>(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<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)
         {
@@ -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<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)
         {
index b82e610fe5b65b267554cdda622f70c7783a3ea1..fac276b9f65285b5f61a53fe232234ea81356dc4 100644 (file)
@@ -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<int>(NonBondedEnergyTerms::Count); k++)
             {
-                enerdata_->grpp.ener[k][i] = (*testValue += 0.1);
+                enerdata_->grpp.energyGroupPairTerms[k][i] = (*testValue += 0.1);
             }
         }
 
index 41ff5e0b38efe9e6f706cb38619b3decd41c2970..f392cadfdc189e4f2da7ee8c23589dfeebcaf59b 100644 (file)
@@ -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)
                     {
index f2d18f7b408bcbf963a54306d06033184f109a1a..528352a47f92514a38bbf6f10aa2942c0496f9e5 100644 (file)
@@ -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<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
index ae9edafd6a2110d81bf5dca0774db68ae966b1cb..7cbfabfc78619d12965d6f50099ab5deb1fbb900 100644 (file)
@@ -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<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++)
         {
index b37f14d4c8c49c03ca4031b0cf496bb66c7487c5..2f9609bd395be3945717a79a2c86bb19da1b01a0 100644 (file)
@@ -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                                    */