energyWritingStep_(-1),
energyCalculationStep_(-1),
freeEnergyCalculationStep_(-1),
- logWritingStep_(-1),
forceVirialStep_(-1),
shakeVirialStep_(-1),
totalVirialStep_(-1),
if (event == TrajectoryEvent::EnergyWritingStep && isMasterRank_)
{
return std::make_unique<ITrajectoryWriterCallback>(
- [this](gmx_mdoutf *mdoutf, Step step, Time time)
- {write(mdoutf, step, time); });
+ [this](gmx_mdoutf *mdoutf, Step step, Time time, bool writeTrajectory, bool writeLog)
+ {write(mdoutf, step, time, writeTrajectory, writeLog); });
}
return nullptr;
}
return nullptr;
}
-SignallerCallbackPtr EnergyElement::registerLoggingCallback()
-{
- return std::make_unique<SignallerCallback>(
- [this](Step step, Time){logWritingStep_ = step; });
-}
-
void EnergyElement::doStep(
Time time,
bool isEnergyCalculationStep,
ekind_, muTot_, constr_);
}
-void EnergyElement::write(gmx_mdoutf *outf, Step step, Time time)
+void EnergyElement::write(gmx_mdoutf *outf, Step step, Time time, bool writeTrajectory, bool writeLog)
{
- // This gets called by the trajectory writer, which means that
- // we only write to log when writing energy.
- // TODO: Think if we need to change that, i.e. writing to log without
- // writing to file.
-
- auto writeLog = logWritingStep_ == step;
if (writeLog)
{
energyOutput_->printHeader(fplog_, step, time);
// energyOutput_->printAnnealingTemperatures(writeLog ? fplog_ : nullptr, groups_, &(inputrec_->opts));
Awh *awh = nullptr;
energyOutput_->printStepToEnergyFile(
- mdoutf_get_fp_ene(outf), true, do_dr, do_or,
+ mdoutf_get_fp_ene(outf), writeTrajectory, do_dr, do_or,
writeLog ? fplog_ : nullptr, step, time, fcd_, awh);
}
public ITrajectoryWriterClient,
public ITrajectorySignallerClient,
public IEnergySignallerClient,
- public ILoggingSignallerClient,
public ICheckpointHelperClient
{
public:
registerTrajectoryWriterCallback(TrajectoryEvent event) override;
//! IEnergySignallerClient implementation
SignallerCallbackPtr registerEnergyCallback(EnergySignallerEvent event) override;
- //! ILoggingSignallerClient implementation
- SignallerCallbackPtr registerLoggingCallback() override;
/*! \brief Save data at energy steps
*
*/
void write(
gmx_mdoutf *outf,
- Step step, Time time);
+ Step step, Time time,
+ bool writeTrajectory, bool writeLog);
//! ICheckpointHelperClient implementation
void writeCheckpoint(t_state *localState, t_state *globalState) override;
Step energyCalculationStep_;
//! The next communicated free energy calculation step
Step freeEnergyCalculationStep_;
- //! The next communicated log writing step
- Step logWritingStep_;
//! The force virial tensor
tensor forceVirial_;
trajectoryElementBuilder.registerWriterClient(energyElementPtr);
trajectoryElementBuilder.registerSignallerClient(energyElementPtr);
energySignallerBuilder.registerSignallerClient(energyElementPtr);
- loggingSignallerBuilder.registerSignallerClient(energyElementPtr);
// Register the simulator itself to the neighbor search / last step signaller
neighborSearchSignallerBuilder.registerSignallerClient(compat::make_not_null(signalHelper_.get()));
auto trajectoryElement = trajectoryElementBuilder.build(
fplog, nfile, fnm, mdrunOptions, cr, outputProvider, mdModulesNotifier,
inputrec, top_global, oenv, wcycle, startingBehavior);
+ loggingSignallerBuilder.registerSignallerClient(compat::make_not_null(trajectoryElement.get()));
// Add checkpoint helper here since we need a pointer to the trajectory element and
// need to register it with the lastStepSignallerBuilder
* Trajectory writing clients are given a pointer to the output file handler,
* allowing them to write their own trajectory contribution
*/
-typedef std::function<void(gmx_mdoutf*, Step, Time)> ITrajectoryWriterCallback;
+typedef std::function<void(gmx_mdoutf*, Step, Time, bool, bool)> ITrajectoryWriterCallback;
//! Pointer to the function type for trajectory writing clients
typedef std::unique_ptr<ITrajectoryWriterCallback> ITrajectoryWriterCallbackPtr;
if (event == TrajectoryEvent::StateWritingStep)
{
return std::make_unique<ITrajectoryWriterCallback>(
- [this](gmx_mdoutf *outf, Step step, Time time)
- {write(outf, step, time); });
+ [this](gmx_mdoutf *outf, Step step, Time time, bool writeTrajectory, bool gmx_unused writeLog)
+ {
+ if (writeTrajectory)
+ {
+ write(outf, step, time);
+ }
+ });
}
return nullptr;
}
void TrajectoryElement::scheduleTask(
Step step, Time time, const RegisterRunFunctionPtr ®isterRunFunction)
{
- auto writeEnergyThisStep = writeEnergyStep_ == step;
- auto writeStateThisStep = writeStateStep_ == step;
- if (writeEnergyThisStep || writeStateThisStep)
+ const bool writeEnergyThisStep = writeEnergyStep_ == step;
+ const bool writeStateThisStep = writeStateStep_ == step;
+ const bool writeLogThisStep = logWritingStep_ == step;
+ if (writeEnergyThisStep || writeStateThisStep || writeLogThisStep)
{
(*registerRunFunction)(std::make_unique<SimulatorRunFunction>(
- [this, step, time, writeStateThisStep, writeEnergyThisStep]()
- {write(step, time, writeStateThisStep, writeEnergyThisStep); }));
+ [this, step, time, writeStateThisStep,
+ writeEnergyThisStep, writeLogThisStep]()
+ {write(step, time, writeStateThisStep,
+ writeEnergyThisStep, writeLogThisStep); }));
}
}
}
void TrajectoryElement::write(
- Step step, Time time, bool writeState, bool writeEnergy)
+ Step step, Time time, bool writeState, bool writeEnergy, bool writeLog)
{
- if (writeState)
+ if (writeState || writeLog)
{
for (auto &callback : runStateCallbacks_)
{
- (*callback)(outf_, step, time);
+ (*callback)(outf_, step, time, writeState, writeLog);
}
}
- if (writeEnergy)
+ if (writeEnergy || writeLog)
{
for (auto &callback : runEnergyCallbacks_)
{
- (*callback)(outf_, step, time);
+ (*callback)(outf_, step, time, writeEnergy, writeLog);
}
}
}
[this](Step step, Time gmx_unused time){this->lastStep_ = step; });
}
+SignallerCallbackPtr TrajectoryElement::registerLoggingCallback()
+{
+ return std::make_unique<SignallerCallback>(
+ [this](Step step, Time){logWritingStep_ = step; });
+}
+
void TrajectoryElementBuilder::registerSignallerClient(
compat::not_null<ITrajectorySignallerClient*> client)
{
class TrajectoryElement final :
public ISimulatorElement,
public ISignaller,
- public ILastStepSignallerClient
+ public ILastStepSignallerClient,
+ public ILoggingSignallerClient
{
public:
friend class TrajectoryElementBuilder;
Step writeEnergyStep_;
//! The next state writing step
Step writeStateStep_;
+ //! The next communicated log writing step
+ Step logWritingStep_;
//! The output object
gmx_mdoutf *outf_;
+ //! ILoggingSignallerClient implementation
+ SignallerCallbackPtr registerLoggingCallback() override;
+
/*
* Signaller
*/
//! }
//! The writing function - calls the clients to get their contributions
- void write(Step step, Time time, bool writeState, bool writeEnergy);
+ void write(Step step, Time time, bool writeState, bool writeEnergy, bool writeLog);
};
/*! \libinternal