Use SimulatorStateData.
authorPrashanth Kanduri <kanduri@cscs.ch>
Mon, 22 Jun 2020 14:59:57 +0000 (17:59 +0300)
committerJoe Jordan <ejjordan12@gmail.com>
Fri, 26 Jun 2020 10:54:08 +0000 (10:54 +0000)
Implement `SimulatorBuilder.add(SimulatorStateData&&)`

Refs #3567

src/gromacs/mdrun/runner.cpp
src/gromacs/mdrun/simulatorbuilder.cpp
src/gromacs/mdrun/simulatorbuilder.h

index ceaa1b3c68daac840d1cdcdd807238280a8706ae..698e71e0a5e0ae1cef188a36568ee3c0ad3365bf 100644 (file)
@@ -1641,6 +1641,7 @@ int Mdrunner::mdrunner()
         GMX_ASSERT(stopHandlerBuilder_, "Runner must provide StopHandlerBuilder to simulator.");
         SimulatorBuilder simulatorBuilder;
 
+        simulatorBuilder.add(SimulatorStateData(globalState.get(), &observablesHistory, &enerd, &ekind));
         simulatorBuilder.add(MembedHolder(membed));
         simulatorBuilder.add(std::move(stopHandlerBuilder_));
 
@@ -1649,9 +1650,9 @@ int Mdrunner::mdrunner()
                 useModularSimulator, fplog, cr, ms, mdlog, static_cast<int>(filenames.size()),
                 filenames.data(), oenv, mdrunOptions, startingBehavior, vsite.get(), constr.get(),
                 enforcedRotation ? enforcedRotation->getLegacyEnfrot() : nullptr, deform.get(),
-                mdModules_->outputProvider(), mdModules_->notifier(), inputrec, imdSession.get(), pull_work,
-                swap, &mtop, globalState.get(), &observablesHistory, mdAtoms.get(), &nrnb, wcycle,
-                fr, &enerd, &ekind, &runScheduleWork, replExParams, walltime_accounting, doRerun);
+                mdModules_->outputProvider(), mdModules_->notifier(), inputrec, imdSession.get(),
+                pull_work, swap, &mtop, mdAtoms.get(), &nrnb, wcycle, fr, &runScheduleWork,
+                replExParams, walltime_accounting, doRerun);
         simulator->run();
 
         if (fr->pmePpCommGpu)
index e3078f864203aee0d5c475e278163f25a594af37..b43d373648432f8de682a77d6900b2c461ff6210 100644 (file)
@@ -77,14 +77,10 @@ std::unique_ptr<ISimulator> SimulatorBuilder::build(bool                     use
                                                     pull_t*                  pull_work,
                                                     t_swap*                  swap,
                                                     gmx_mtop_t*              top_global,
-                                                    t_state*                 state_global,
-                                                    ObservablesHistory*      observablesHistory,
                                                     MDAtoms*                 mdAtoms,
                                                     t_nrnb*                  nrnb,
                                                     gmx_wallcycle*           wcycle,
                                                     t_forcerec*              fr,
-                                                    gmx_enerdata_t*          enerd,
-                                                    gmx_ekindata_t*          ekind,
                                                     MdrunScheduleWorkload*   runScheduleWork,
                                                     const ReplicaExchangeParameters& replExParams,
                                                     gmx_walltime_accounting* walltime_accounting,
@@ -98,24 +94,32 @@ std::unique_ptr<ISimulator> SimulatorBuilder::build(bool                     use
     {
         throw APIError("You must add a MembedHolder before calling build().");
     }
+    if (!simulatorStateData_)
+    {
+        throw APIError("Simulator State Data has not been added to the builder");
+    }
 
     if (useModularSimulator)
     {
         // NOLINTNEXTLINE(modernize-make-unique): make_unique does not work with private constructor
         return std::unique_ptr<ModularSimulator>(new ModularSimulator(
-                fplog, cr, ms, mdlog, nfile, fnm, oenv, mdrunOptions, startingBehavior, vsite, constr,
-                enforcedRotation, deform, outputProvider, mdModulesNotifier, inputrec, imdSession,
-                pull_work, swap, top_global, state_global, observablesHistory, mdAtoms, nrnb,
-                wcycle, fr, enerd, ekind, runScheduleWork, replExParams, membedHolder_->membed(),
-                walltime_accounting, std::move(stopHandlerBuilder_), doRerun));
+                fplog, cr, ms, mdlog, nfile, fnm, oenv, mdrunOptions, startingBehavior, vsite,
+                constr, enforcedRotation, deform, outputProvider, mdModulesNotifier, inputrec,
+                imdSession, pull_work, swap, top_global, simulatorStateData_->globalState_p,
+                simulatorStateData_->observablesHistory_p, mdAtoms, nrnb, wcycle, fr,
+                simulatorStateData_->enerdata_p, simulatorStateData_->ekindata_p, runScheduleWork,
+                replExParams, membedHolder_->membed(), walltime_accounting,
+                std::move(stopHandlerBuilder_), doRerun));
     }
     // NOLINTNEXTLINE(modernize-make-unique): make_unique does not work with private constructor
     return std::unique_ptr<LegacySimulator>(new LegacySimulator(
             fplog, cr, ms, mdlog, nfile, fnm, oenv, mdrunOptions, startingBehavior, vsite, constr,
             enforcedRotation, deform, outputProvider, mdModulesNotifier, inputrec, imdSession,
-            pull_work, swap, top_global, state_global, observablesHistory, mdAtoms, nrnb, wcycle,
-            fr, enerd, ekind, runScheduleWork, replExParams, membedHolder_->membed(),
-            walltime_accounting, std::move(stopHandlerBuilder_), doRerun));
+            pull_work, swap, top_global, simulatorStateData_->globalState_p,
+            simulatorStateData_->observablesHistory_p, mdAtoms, nrnb, wcycle, fr,
+            simulatorStateData_->enerdata_p, simulatorStateData_->ekindata_p, runScheduleWork, replExParams,
+            membedHolder_->membed(), walltime_accounting, std::move(stopHandlerBuilder_), doRerun));
 }
 
+
 } // namespace gmx
index d39a561861f0a11625cacc371adf8ae787ee14e8..c8c16f2b28e1a9e7e00d34cce4530b44884984f9 100644 (file)
@@ -44,6 +44,7 @@
 #include <memory>
 
 #include "gromacs/mdlib/vsite.h"
+#include "gromacs/utility/gmxassert.h"
 #include "gromacs/utility/mdmodulenotification.h"
 
 class energyhistory_t;
@@ -99,6 +100,28 @@ private:
     gmx_membed_t* membed_;
 };
 
+// TODO: Reconsider the name.
+struct SimulatorStateData
+{
+    t_state*            globalState_p;
+    ObservablesHistory* observablesHistory_p;
+    gmx_enerdata_t*     enerdata_p;
+    gmx_ekindata_t*     ekindata_p;
+
+    SimulatorStateData(t_state*            globalState,
+                       ObservablesHistory* observablesHistory,
+                       gmx_enerdata_t*     enerdata,
+                       gmx_ekindata_t*     ekindata) :
+        globalState_p(globalState),
+        observablesHistory_p(observablesHistory),
+        enerdata_p(enerdata),
+        ekindata_p(ekindata)
+    {
+    }
+
+    SimulatorStateData(const SimulatorStateData& simulatorStateData) = default;
+};
+
 /*! \libinternal
  * \brief Class preparing the creation of Simulator objects
  *
@@ -118,6 +141,11 @@ public:
         stopHandlerBuilder_ = std::move(stopHandlerBuilder);
     }
 
+    void add(SimulatorStateData&& simulatorStateData)
+    {
+        simulatorStateData_ = std::make_unique<SimulatorStateData>(simulatorStateData);
+    }
+
     /*! \brief Build a Simulator object based on input data
      *
      * Return a pointer to a simulation object. The use of a parameter
@@ -149,14 +177,10 @@ public:
                                       pull_t*                          pull_work,
                                       t_swap*                          swap,
                                       gmx_mtop_t*                      top_global,
-                                      t_state*                         state_global,
-                                      ObservablesHistory*              observablesHistory,
                                       MDAtoms*                         mdAtoms,
                                       t_nrnb*                          nrnb,
                                       gmx_wallcycle*                   wcycle,
                                       t_forcerec*                      fr,
-                                      gmx_enerdata_t*                  enerd,
-                                      gmx_ekindata_t*                  ekind,
                                       MdrunScheduleWorkload*           runScheduleWork,
                                       const ReplicaExchangeParameters& replExParams,
                                       gmx_walltime_accounting*         walltime_accounting,
@@ -165,6 +189,7 @@ public:
 private:
     std::unique_ptr<MembedHolder>       membedHolder_;
     std::unique_ptr<StopHandlerBuilder> stopHandlerBuilder_;
+    std::unique_ptr<SimulatorStateData> simulatorStateData_;
 };
 
 } // namespace gmx