These members are only used for local storage and can be eliminated.
Added function to zero the energy group pair terms.
This will aid in further refactoring of the nonboded FEP kernels.
FILE* fplog) :
idefSelection_(ffparams),
threading_(std::make_unique<bonded_threading_t>(numThreads, numEnergyGroups, fplog)),
- interactionSelection_(interactionSelection)
+ interactionSelection_(interactionSelection),
+ foreignEnergyGroups_(std::make_unique<gmx_grppairener_t>(numEnergyGroups))
{
}
gmx::ArrayRef<real> forceBufferLambda,
gmx::ArrayRef<gmx::RVec> shiftForceBufferLambda,
gmx_grppairener_t* grpp,
- real* epot,
+ gmx::ArrayRef<real> epot,
gmx::ArrayRef<real> dvdl,
t_nrnb* nrnb,
gmx::ArrayRef<const real> lambda,
for (int i = 0; i < 1 + enerd->foreignLambdaTerms.numLambdas(); i++)
{
gmx::EnumerationArray<FreeEnergyPerturbationCouplingType, real> lam_i;
-
- reset_foreign_enerdata(enerd);
+ foreignEnergyGroups_->clear();
+ std::array<real, F_NRE> foreign_term = { 0 };
for (auto j : keysOf(lam_i))
{
lam_i[j] = (i == 0 ? lambda[static_cast<int>(j)] : fepvals->all_lambda[j][i - 1]);
pbc,
forceBufferLambda_,
shiftForceBufferLambda_,
- &(enerd->foreign_grpp),
- enerd->foreign_term.data(),
+ foreignEnergyGroups_.get(),
+ foreign_term,
dvdl,
nrnb,
lam_i,
md,
fcdata,
global_atom_index);
- sum_epot(enerd->foreign_grpp, enerd->foreign_term.data());
+ sum_epot(*foreignEnergyGroups_, foreign_term.data());
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);
+ enerd->foreignLambdaTerms.accumulate(i, foreign_term[F_EPOT], dvdlSum);
}
wallcycle_sub_stop(wcycle, WallCycleSubCounter::ListedFep);
}
std::vector<real> forceBufferLambda_;
//! Shift force buffer for free-energy forces
std::vector<gmx::RVec> shiftForceBufferLambda_;
+ //! Temporary array for storing foreign lambda group pair energies
+ std::unique_ptr<gmx_grppairener_t> foreignEnergyGroups_;
GMX_DISALLOW_COPY_AND_ASSIGN(ListedForces);
};
}
gmx_enerdata_t::gmx_enerdata_t(int numEnergyGroups, int numFepLambdas) :
- grpp(numEnergyGroups), foreignLambdaTerms(numFepLambdas), foreign_grpp(numEnergyGroups)
+ grpp(numEnergyGroups), foreignLambdaTerms(numFepLambdas)
{
}
enerd->term[F_DVDL_CONSTR] = 0;
}
-void reset_foreign_enerdata(gmx_enerdata_t* enerd)
+void gmx_grppairener_t::clear()
{
- int i, j;
-
- /* First reset all foreign energy components. Foreign energies always called on
- neighbor search steps */
- for (i = 0; (i < static_cast<int>(NonBondedEnergyTerms::Count)); i++)
+ for (int i = 0; (i < static_cast<int>(NonBondedEnergyTerms::Count)); i++)
{
- for (j = 0; (j < enerd->grpp.nener); j++)
+ for (int j = 0; (j < nener); j++)
{
- enerd->foreign_grpp.energyGroupPairTerms[i][j] = 0.0;
+ energyGroupPairTerms[i][j] = 0.0;
}
}
-
- /* potential energy components */
- for (i = 0; (i <= F_EPOT); i++)
- {
- enerd->foreign_term[i] = 0.0;
- }
}
void reset_dvdl_enerdata(gmx_enerdata_t* enerd)
enerd->term[F_DVDL_RESTRAINT] = 0.0_real;
enerd->term[F_DKDL] = 0.0_real;
enerd->foreignLambdaTerms.zeroAllTerms();
- /* reset foreign energy data and dvdl - separate functions since they are also called elsewhere */
- reset_foreign_enerdata(enerd);
+ /* reset dvdl - separate function since it is also called elsewhere */
reset_dvdl_enerdata(enerd);
}
* 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.
struct t_fepvals;
struct t_lambda;
-void reset_foreign_enerdata(gmx_enerdata_t* enerd);
-/* Resets only the foreign energy data */
-
void reset_dvdl_enerdata(gmx_enerdata_t* enerd);
/* Resets only the dvdl energy data */
fr.block[b].sub[0].type = XdrDataType::Float;
fr.block[b].sub[0].fval = block[b];
#else
- fr.block[b].sub[0].type = XdrDataType::Double;
- fr.block[b].sub[0].dval = block[b];
+ fr.block[b].sub[0].type = XdrDataType::Double;
+ fr.block[b].sub[0].dval = block[b];
#endif
}
}
}
+ void clear();
+
int nener; /* The number of energy group pairs */
gmx::EnumerationArray<NonBondedEnergyTerms, std::vector<real>> energyGroupPairTerms; /* Energy terms for each pair of groups */
};
//! Foreign lambda energies and dH/dl
ForeignLambdaTerms foreignLambdaTerms;
-
- //! Alternate, temporary array for storing foreign lambda energies
- std::array<real, F_NRE> foreign_term = { 0 };
- //! Alternate, temporary array for storing foreign lambda group pair energies
- struct gmx_grppairener_t foreign_grpp;
};
#endif
kernelLambda = lam_i;
kernelDvdl = dvdl_nb;
gmx::ArrayRef<real> energygrp_elec =
- enerd->foreign_grpp.energyGroupPairTerms[NonBondedEnergyTerms::CoulombSR];
+ foreignEnergyGroups_->energyGroupPairTerms[NonBondedEnergyTerms::CoulombSR];
gmx::ArrayRef<real> energygrp_vdw =
- enerd->foreign_grpp.energyGroupPairTerms[NonBondedEnergyTerms::LJSR];
+ foreignEnergyGroups_->energyGroupPairTerms[NonBondedEnergyTerms::LJSR];
for (gmx::index i = 0; i < 1 + enerd->foreignLambdaTerms.numLambdas(); i++)
{
{
lam_i[j] = (i == 0 ? lambda[j] : fepvals->all_lambda[j][i - 1]);
}
- reset_foreign_enerdata(enerd);
+ foreignEnergyGroups_->clear();
#pragma omp parallel for schedule(static) num_threads(nbl_fep.ssize())
for (gmx::index th = 0; th < nbl_fep.ssize(); th++)
{
}
GMX_CATCH_ALL_AND_EXIT_WITH_FATAL_ERROR
}
-
- sum_epot(enerd->foreign_grpp, enerd->foreign_term.data());
+ std::array<real, F_NRE> foreign_term = { 0 };
+ sum_epot(*foreignEnergyGroups_, foreign_term.data());
enerd->foreignLambdaTerms.accumulate(
i,
- enerd->foreign_term[F_EPOT],
+ foreign_term[F_EPOT],
dvdl_nb[FreeEnergyPerturbationCouplingType::Vdw]
+ dvdl_nb[FreeEnergyPerturbationCouplingType::Coul]);
}
struct t_nrnb;
struct t_forcerec;
struct t_inputrec;
+struct gmx_grppairener_t;
class GpuEventSynchronizer;
Nbnxm::KernelSetup kernelSetup_;
//! \brief Pointer to wallcycle structure.
gmx_wallcycle* wcycle_;
+ //! Temporary array for storing foreign lambda group pair energies
+ std::unique_ptr<gmx_grppairener_t> foreignEnergyGroups_;
public:
//! GPU Nbnxm data, only used with a physical GPU (TODO: use unique_ptr)
#include "gmxpre.h"
+#include <memory>
+
#include "gromacs/domdec/domdec.h"
#include "gromacs/domdec/domdec_struct.h"
#include "gromacs/hardware/hw_info.h"
#include "gromacs/mdlib/gmx_omp_nthreads.h"
#include "gromacs/mdtypes/commrec.h"
+#include "gromacs/mdtypes/enerdata.h"
#include "gromacs/mdtypes/forcerec.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/mdtypes/interaction_const.h"
case KernelType::Cpu4xN_Simd_2xNN:
#if GMX_SIMD
return "SIMD";
-#else // GMX_SIMD
+#else // GMX_SIMD
return "not available";
#endif // GMX_SIMD
case KernelType::Gpu8x8x8: return "GPU";
nbat(std::move(nbat_in)),
kernelSetup_(kernelSetup),
wcycle_(wcycle),
+ foreignEnergyGroups_(std::make_unique<gmx_grppairener_t>(nbat->params().nenergrp)),
gpu_nbv(gpu_nbv_ptr)
{
GMX_RELEASE_ASSERT(pairlistSets_, "Need valid pairlistSets");