#include <algorithm>
#include <array>
+#include <numeric>
#include "gromacs/gmxlib/network.h"
#include "gromacs/gmxlib/nrnb.h"
{
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];
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);
}