Move foreign potential energy accumulation
[alexxy/gromacs.git] / src / gromacs / listed_forces / listed_forces.cpp
index e88f050fbd818af70a5719956836e0b310ef6f4f..c35a06a895fdf25fb27a2df3a8b90a25f60e6294 100644 (file)
@@ -50,6 +50,7 @@
 
 #include <algorithm>
 #include <array>
+#include <numeric>
 
 #include "gromacs/gmxlib/network.h"
 #include "gromacs/gmxlib/nrnb.h"
@@ -706,7 +707,7 @@ void ListedForces::calculate(struct gmx_wallcycle*          wcycle,
             {
                 gmx_incons("The bonded interactions are not sorted for free energy");
             }
-            for (size_t i = 0; i < enerd->enerpart_lambda.size(); i++)
+            for (int i = 0; i < 1 + enerd->foreignLambdaTerms.numLambdas(); i++)
             {
                 real lam_i[efptNR];
 
@@ -719,12 +720,9 @@ void ListedForces::calculate(struct gmx_wallcycle*          wcycle,
                                    shiftForceBufferLambda_, &(enerd->foreign_grpp), enerd->foreign_term,
                                    dvdl, nrnb, lam_i, md, &fcdata, global_atom_index);
                 sum_epot(enerd->foreign_grpp, enerd->foreign_term);
-                enerd->enerpart_lambda[i] += enerd->foreign_term[F_EPOT];
-                for (int j = 0; j < efptNR; j++)
-                {
-                    enerd->dhdlLambda[i] += dvdl[j];
-                    dvdl[j] = 0;
-                }
+                const double dvdlSum = std::accumulate(std::begin(dvdl), std::end(dvdl), 0.);
+                std::fill(std::begin(dvdl), std::end(dvdl), 0.0);
+                enerd->foreignLambdaTerms.accumulate(i, enerd->foreign_term[F_EPOT], dvdlSum);
             }
             wallcycle_sub_stop(wcycle, ewcsLISTED_FEP);
         }