#include "gromacs/mdtypes/state.h"
#include "gromacs/pbcutil/pbc.h"
+#include "freeenergyperturbationdata.h"
#include "statepropagatordata.h"
#include "topologyholder.h"
DomDecHelper::DomDecHelper(bool isVerbose,
int verbosePrintInterval,
StatePropagatorData* statePropagatorData,
+ FreeEnergyPerturbationData* freeEnergyPerturbationData,
TopologyHolder* topologyHolder,
CheckBondedInteractionsCallback checkBondedInteractionsCallback,
int nstglobalcomm,
verbosePrintInterval_(verbosePrintInterval),
nstglobalcomm_(nstglobalcomm),
statePropagatorData_(statePropagatorData),
+ freeEnergyPerturbationData_(freeEnergyPerturbationData),
topologyHolder_(topologyHolder),
checkBondedInteractionsCallback_(std::move(checkBondedInteractionsCallback)),
fplog_(fplog),
void DomDecHelper::setup()
{
- std::unique_ptr<t_state> localState = statePropagatorData_->localState();
- t_state* globalState = statePropagatorData_->globalState();
- ForceBuffers* forcePointer = statePropagatorData_->forcePointer();
-
// constant choices for this call to dd_partition_system
const bool verbose = false;
const bool isMasterState = true;
gmx_wallcycle* wcycle = nullptr;
// Distribute the charge groups over the nodes from the master node
- dd_partition_system(fplog_, mdlog_, inputrec_->init_step, cr_, isMasterState, nstglobalcomm,
- globalState, topologyHolder_->globalTopology(), inputrec_, imdSession_,
- pull_work_, localState.get(), forcePointer, mdAtoms_,
- topologyHolder_->localTopology_.get(), fr_, vsite_, constr_, nrnb_, wcycle,
- verbose);
- topologyHolder_->updateLocalTopology();
- checkBondedInteractionsCallback_();
- statePropagatorData_->setLocalState(std::move(localState));
+ partitionSystem(verbose, isMasterState, nstglobalcomm, wcycle,
+ statePropagatorData_->localState(), statePropagatorData_->globalState());
}
void DomDecHelper::run(Step step, Time gmx_unused time)
{
return;
}
- std::unique_ptr<t_state> localState = statePropagatorData_->localState();
- t_state* globalState = statePropagatorData_->globalState();
- ForceBuffers* forcePointer = statePropagatorData_->forcePointer();
+ std::unique_ptr<t_state> localState = statePropagatorData_->localState();
+ t_state* globalState = statePropagatorData_->globalState();
// constant choices for this call to dd_partition_system
const bool verbose = isVerbose_ && (step % verbosePrintInterval_ == 0 || step == inputrec_->init_step);
}
// Distribute the charge groups over the nodes from the master node
- dd_partition_system(fplog_, mdlog_, step, cr_, isMasterState, nstglobalcomm_, globalState,
- topologyHolder_->globalTopology(), inputrec_, imdSession_, pull_work_,
- localState.get(), forcePointer, mdAtoms_, topologyHolder_->localTopology_.get(),
- fr_, vsite_, constr_, nrnb_, wcycle_, verbose);
+ partitionSystem(verbose, isMasterState, nstglobalcomm_, wcycle_, std::move(localState), globalState);
+}
+
+void DomDecHelper::partitionSystem(bool verbose,
+ bool isMasterState,
+ int nstglobalcomm,
+ gmx_wallcycle* wcycle,
+ std::unique_ptr<t_state> localState,
+ t_state* globalState)
+{
+ ForceBuffers* forcePointer = statePropagatorData_->forcePointer();
+
+ // Distribute the charge groups over the nodes from the master node
+ dd_partition_system(fplog_, mdlog_, inputrec_->init_step, cr_, isMasterState, nstglobalcomm,
+ globalState, topologyHolder_->globalTopology(), inputrec_, imdSession_,
+ pull_work_, localState.get(), forcePointer, mdAtoms_,
+ topologyHolder_->localTopology_.get(), fr_, vsite_, constr_, nrnb_, wcycle,
+ verbose);
topologyHolder_->updateLocalTopology();
checkBondedInteractionsCallback_();
statePropagatorData_->setLocalState(std::move(localState));
+ if (freeEnergyPerturbationData_)
+ {
+ freeEnergyPerturbationData_->updateMDAtoms();
+ }
}
std::optional<SignallerCallback> DomDecHelper::registerNSCallback()
namespace gmx
{
class Constraints;
+class FreeEnergyPerturbationData;
class ImdSession;
class MDAtoms;
class MDLogger;
DomDecHelper(bool isVerbose,
int verbosePrintInterval,
StatePropagatorData* statePropagatorData,
+ FreeEnergyPerturbationData* freeEnergyPerturbationData,
TopologyHolder* topologyHolder,
CheckBondedInteractionsCallback checkBondedInteractionsCallback,
int nstglobalcomm,
// TODO: Clarify relationship to data objects and find a more robust alternative to raw pointers (#3583)
//! Pointer to the micro state
StatePropagatorData* statePropagatorData_;
+ //! Pointer to the free energy data
+ FreeEnergyPerturbationData* freeEnergyPerturbationData_;
//! Pointer to the topology
TopologyHolder* topologyHolder_;
//! Pointer to the ComputeGlobalsHelper object - to ask for # of bonded interaction checking
CheckBondedInteractionsCallback checkBondedInteractionsCallback_;
+ //! Helper function unifying the DD partitioning calls in setup() and run()
+ void partitionSystem(bool verbose,
+ bool isMasterState,
+ int nstglobalcomm,
+ gmx_wallcycle* wcycle,
+ std::unique_ptr<t_state> localState,
+ t_state* globalState);
+
// Access to ISimulator data
//! Handles logging.
FILE* fplog_;
// available on master. We have the lambda vector available everywhere, so we pass a `true`
// for isMaster on all ranks. See #3647.
initialize_lambdas(fplog_, *inputrec_, true, ¤tFEPState_, lambda_);
- update_mdatoms(mdAtoms_->mdatoms(), lambda_[efptMASS]);
}
void FreeEnergyPerturbationData::Element::scheduleTask(Step step,
{
// at beginning of step (if lambdas change...)
lambda_ = currentLambdas(step, *(inputrec_->fepvals), currentFEPState_);
- update_mdatoms(mdAtoms_->mdatoms(), lambda_[efptMASS]);
+ updateMDAtoms();
}
ArrayRef<real> FreeEnergyPerturbationData::lambdaView()
return currentFEPState_;
}
+void FreeEnergyPerturbationData::updateMDAtoms()
+{
+ update_mdatoms(mdAtoms_->mdatoms(), lambda_[efptMASS]);
+}
+
namespace
{
/*!
dd_bcast(cr->dd, freeEnergyPerturbationData_->lambda_.size() * sizeof(real),
freeEnergyPerturbationData_->lambda_.data());
}
- update_mdatoms(freeEnergyPerturbationData_->mdAtoms_->mdatoms(),
- freeEnergyPerturbationData_->lambda_[efptMASS]);
}
const std::string& FreeEnergyPerturbationData::Element::clientID()
{
}
+void FreeEnergyPerturbationData::Element::elementSetup()
+{
+ freeEnergyPerturbationData_->updateMDAtoms();
+}
+
FreeEnergyPerturbationData::Element* FreeEnergyPerturbationData::element()
{
return element_.get();