Make holder for simulation configuration
authorArtem Zhmurov <zhmurov@gmail.com>
Tue, 21 Apr 2020 14:30:03 +0000 (17:30 +0300)
committerJoe Jordan <ejjordan12@gmail.com>
Fri, 26 Jun 2020 10:54:08 +0000 (10:54 +0000)
Make a class that holds values of:

useModularSimulator
mdrunOptions
startingBehavior
doRerun
runScheduleWork

inside the SimulatorBuilder.

Refs #3567

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

index 698e71e0a5e0ae1cef188a36568ee3c0ad3365bf..2a4a744e0bc29079d09e27de2c71352d3b655b16 100644 (file)
@@ -1644,15 +1644,16 @@ int Mdrunner::mdrunner()
         simulatorBuilder.add(SimulatorStateData(globalState.get(), &observablesHistory, &enerd, &ekind));
         simulatorBuilder.add(MembedHolder(membed));
         simulatorBuilder.add(std::move(stopHandlerBuilder_));
+        simulatorBuilder.add(SimulatorConfig(mdrunOptions, startingBehavior, &runScheduleWork));
+
 
         // build and run simulator object based on user-input
         auto simulator = simulatorBuilder.build(
                 useModularSimulator, fplog, cr, ms, mdlog, static_cast<int>(filenames.size()),
-                filenames.data(), oenv, mdrunOptions, startingBehavior, vsite.get(), constr.get(),
+                filenames.data(), oenv, vsite.get(), constr.get(),
                 enforcedRotation ? enforcedRotation->getLegacyEnfrot() : nullptr, deform.get(),
-                mdModules_->outputProvider(), mdModules_->notifier(), inputrec, imdSession.get(),
-                pull_work, swap, &mtop, mdAtoms.get(), &nrnb, wcycle, fr, &runScheduleWork,
-                replExParams, walltime_accounting, doRerun);
+                mdModules_->outputProvider(), mdModules_->notifier(), inputrec, imdSession.get(), pull_work,
+                swap, &mtop, mdAtoms.get(), &nrnb, wcycle, fr, replExParams, walltime_accounting);
         simulator->run();
 
         if (fr->pmePpCommGpu)
index b43d373648432f8de682a77d6900b2c461ff6210..3b91a32330822b19c08da85c2ed2e26ef8195040 100644 (file)
@@ -43,6 +43,7 @@
 
 #include <memory>
 
+#include "gromacs/mdtypes/mdrunoptions.h"
 #include "gromacs/mdtypes/state.h"
 #include "gromacs/modularsimulator/modularsimulator.h"
 #include "gromacs/topology/topology.h"
@@ -64,8 +65,6 @@ std::unique_ptr<ISimulator> SimulatorBuilder::build(bool                     use
                                                     int                      nfile,
                                                     const t_filenm*          fnm,
                                                     const gmx_output_env_t*  oenv,
-                                                    const MdrunOptions&      mdrunOptions,
-                                                    StartingBehavior         startingBehavior,
                                                     VirtualSitesHandler*     vsite,
                                                     Constraints*             constr,
                                                     gmx_enfrot*              enforcedRotation,
@@ -81,10 +80,8 @@ std::unique_ptr<ISimulator> SimulatorBuilder::build(bool                     use
                                                     t_nrnb*                  nrnb,
                                                     gmx_wallcycle*           wcycle,
                                                     t_forcerec*              fr,
-                                                    MdrunScheduleWorkload*   runScheduleWork,
                                                     const ReplicaExchangeParameters& replExParams,
-                                                    gmx_walltime_accounting* walltime_accounting,
-                                                    bool                     doRerun)
+                                                    gmx_walltime_accounting* walltime_accounting)
 {
     if (!stopHandlerBuilder_)
     {
@@ -98,28 +95,32 @@ std::unique_ptr<ISimulator> SimulatorBuilder::build(bool                     use
     {
         throw APIError("Simulator State Data has not been added to the builder");
     }
+    if (!simulatorConfig_)
+    {
+        throw APIError("Simulator config should be set before building the simulator");
+    }
 
     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, 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));
+                fplog, cr, ms, mdlog, nfile, fnm, oenv, simulatorConfig_->mdrunOptions_,
+                simulatorConfig_->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,
+                simulatorConfig_->runScheduleWork_, replExParams, membedHolder_->membed(), walltime_accounting,
+                std::move(stopHandlerBuilder_), simulatorConfig_->mdrunOptions_.rerun));
     }
     // 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, 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));
+            fplog, cr, ms, mdlog, nfile, fnm, oenv, simulatorConfig_->mdrunOptions_,
+            simulatorConfig_->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,
+            simulatorConfig_->runScheduleWork_, replExParams, membedHolder_->membed(), walltime_accounting,
+            std::move(stopHandlerBuilder_), simulatorConfig_->mdrunOptions_.rerun));
 }
 
-
 } // namespace gmx
index c8c16f2b28e1a9e7e00d34cce4530b44884984f9..c7a953c5bc0348613fe47fa0225b17e079e00fdb 100644 (file)
@@ -82,6 +82,24 @@ class ISimulator;
 class StopHandlerBuilder;
 struct MdrunOptions;
 
+struct SimulatorConfig
+{
+public:
+    SimulatorConfig(const MdrunOptions&    mdrunOptions,
+                    StartingBehavior       startingBehavior,
+                    MdrunScheduleWorkload* runScheduleWork) :
+        mdrunOptions_(mdrunOptions),
+        startingBehavior_(startingBehavior),
+        runScheduleWork_(runScheduleWork)
+    {
+    }
+    // TODO: Specify copy and move semantics.
+
+    const MdrunOptions&    mdrunOptions_;
+    StartingBehavior       startingBehavior_;
+    MdrunScheduleWorkload* runScheduleWork_;
+};
+
 /*! \brief Membed SimulatorBuilder parameter type.
  *
  * Does not (yet) encapsulate ownership semantics of resources. Simulator is
@@ -146,6 +164,12 @@ public:
         simulatorStateData_ = std::make_unique<SimulatorStateData>(simulatorStateData);
     }
 
+    void add(SimulatorConfig&& simulatorConfig)
+    {
+        // Note: SimulatorConfig appears to the compiler to be trivially copyable,
+        // but this may not be safe and may change in the future.
+        simulatorConfig_ = std::make_unique<SimulatorConfig>(simulatorConfig);
+    }
     /*! \brief Build a Simulator object based on input data
      *
      * Return a pointer to a simulation object. The use of a parameter
@@ -164,8 +188,6 @@ public:
                                       int                              nfile,
                                       const t_filenm*                  fnm,
                                       const gmx_output_env_t*          oenv,
-                                      const MdrunOptions&              mdrunOptions,
-                                      StartingBehavior                 startingBehavior,
                                       VirtualSitesHandler*             vsite,
                                       Constraints*                     constr,
                                       gmx_enfrot*                      enforcedRotation,
@@ -181,12 +203,11 @@ public:
                                       t_nrnb*                          nrnb,
                                       gmx_wallcycle*                   wcycle,
                                       t_forcerec*                      fr,
-                                      MdrunScheduleWorkload*           runScheduleWork,
                                       const ReplicaExchangeParameters& replExParams,
-                                      gmx_walltime_accounting*         walltime_accounting,
-                                      bool                             doRerun);
+                                      gmx_walltime_accounting*         walltime_accounting);
 
 private:
+    std::unique_ptr<SimulatorConfig>    simulatorConfig_;
     std::unique_ptr<MembedHolder>       membedHolder_;
     std::unique_ptr<StopHandlerBuilder> stopHandlerBuilder_;
     std::unique_ptr<SimulatorStateData> simulatorStateData_;
index 896d7945cf358842b527bd6cc136efd0a9083c16..d58675bffa40d5392732833649360ef9e8e200a1 100644 (file)
@@ -945,7 +945,7 @@ bool ModularSimulator::isInputCompatible(bool                             exitOn
 
 void ModularSimulator::checkInputForDisabledFunctionality()
 {
-    isInputCompatible(true, inputrec, doRerun, *top_global, ms, replExParams,
+    isInputCompatible(true, inputrec, mdrunOptions.rerun, *top_global, ms, replExParams,
                       &fr->listedForces->fcdata(), opt2bSet("-ei", nfile, fnm), membed != nullptr);
     if (observablesHistory->edsamHistory)
     {