#include "gromacs/mdlib/mdatoms.h"
#include "gromacs/mdlib/mdoutf.h"
#include "gromacs/mdlib/stat.h"
+#include "gromacs/mdlib/tgroup.h"
#include "gromacs/mdlib/update.h"
#include "gromacs/mdtypes/commrec.h"
#include "gromacs/mdtypes/enerdata.h"
#include "gromacs/mdtypes/energyhistory.h"
+#include "gromacs/mdtypes/group.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/mdtypes/mdatom.h"
#include "gromacs/mdtypes/observableshistory.h"
const Constraints* constr,
FILE* fplog,
t_fcdata* fcd,
- const MdModulesNotifier& mdModulesNotifier,
+ const MDModulesNotifiers& mdModulesNotifiers,
bool isMasterRank,
ObservablesHistory* observablesHistory,
StartingBehavior startingBehavior,
- bool simulationsShareState) :
+ bool simulationsShareState,
+ pull_t* pullWork) :
element_(std::make_unique<Element>(this, isMasterRank)),
isMasterRank_(isMasterRank),
forceVirialStep_(-1),
constr_(constr),
fplog_(fplog),
fcd_(fcd),
- mdModulesNotifier_(mdModulesNotifier),
+ mdModulesNotifiers_(mdModulesNotifiers),
groups_(&globalTopology.groups),
observablesHistory_(observablesHistory),
- simulationsShareState_(simulationsShareState)
+ simulationsShareState_(simulationsShareState),
+ pullWork_(pullWork)
{
clear_mat(forceVirial_);
clear_mat(shakeVirial_);
void EnergyData::setup(gmx_mdoutf* outf)
{
- pull_t* pull_work = nullptr;
- energyOutput_ = std::make_unique<EnergyOutput>(mdoutf_get_fp_ene(outf),
+ energyOutput_ = std::make_unique<EnergyOutput>(mdoutf_get_fp_ene(outf),
top_global_,
*inputrec_,
- pull_work,
+ pullWork_,
mdoutf_get_fp_dhdl(outf),
false,
startingBehavior_,
simulationsShareState_,
- mdModulesNotifier_);
+ mdModulesNotifiers_);
if (!isMasterRank_)
{
mdAtoms_->mdatoms()->tmass,
enerd_,
inputrec_->fepvals.get(),
- inputrec_->expandedvals.get(),
statePropagatorData_->constPreviousBox(),
PTCouplingArrays({ parrinelloRahmanBoxVelocities_ ? parrinelloRahmanBoxVelocities_() : nullMatrix,
{},
{},
{} }),
freeEnergyPerturbationData_ ? freeEnergyPerturbationData_->currentFEPState() : 0,
- shakeVirial_,
- forceVirial_,
totalVirial_,
pressure_,
ekind_,
return enerd_;
}
+const gmx_enerdata_t* EnergyData::enerdata() const
+{
+ return enerd_;
+}
+
gmx_ekindata_t* EnergyData::ekindata()
{
return ekind_;
parrinelloRahmanBoxVelocities_ = parrinelloRahmanBoxVelocities;
}
+void EnergyData::updateKineticEnergy()
+{
+ // The legacy sum_ekin function does not offer named types, so define variables for readability
+ // dEkin/dlambda is not handled here
+ real* dEkinDLambda = nullptr;
+ // Whether we use the full step kinetic energy (vs the average of half step KEs)
+ const bool useFullStepKineticEnergy = (inputrec_->eI == IntegrationAlgorithm::VV);
+ /* Whether we're ignoring the NHC scaling factor, only used if useFullStepKineticEnergy
+ * is true. (This parameter is confusing, as it is named `bScaleEkin`, but prompts the
+ * function to ignore scaling. There is no use case within modular simulator to ignore
+ * these, so we set this to false.) */
+ const bool ignoreScalingFactor = false;
+
+ enerd_->term[F_TEMP] = sum_ekin(
+ &(inputrec_->opts), ekind_, dEkinDLambda, useFullStepKineticEnergy, ignoreScalingFactor);
+ enerd_->term[F_EKIN] = trace(ekind_->ekin);
+}
+
EnergyData::Element* EnergyData::element()
{
return element_.get();
StatePropagatorData gmx_unused* statePropagatorData,
EnergyData* energyData,
FreeEnergyPerturbationData gmx_unused* freeEnergyPerturbationData,
- GlobalCommunicationHelper gmx_unused* globalCommunicationHelper)
+ GlobalCommunicationHelper gmx_unused* globalCommunicationHelper,
+ ObservablesReducer* /*observablesReducer*/)
{
return energyData->element();
}