Use ObservablesReducer for LINCS RMSD computation
authorMark Abraham <mark.j.abraham@gmail.com>
Mon, 27 Sep 2021 09:21:47 +0000 (09:21 +0000)
committerJoe Jordan <ejjordan12@gmail.com>
Mon, 27 Sep 2021 09:21:47 +0000 (09:21 +0000)
17 files changed:
src/gromacs/mdlib/constr.cpp
src/gromacs/mdlib/constr.h
src/gromacs/mdlib/lincs.cpp
src/gromacs/mdlib/lincs.h
src/gromacs/mdlib/md_support.cpp
src/gromacs/mdlib/md_support.h
src/gromacs/mdlib/stat.cpp
src/gromacs/mdlib/stat.h
src/gromacs/mdlib/tests/constrtestrunners.cpp
src/gromacs/mdlib/tests/energyoutput.cpp
src/gromacs/mdlib/update_vv.cpp
src/gromacs/mdrun/md.cpp
src/gromacs/mdrun/mimic.cpp
src/gromacs/mdrun/minimize.cpp
src/gromacs/mdrun/rerun.cpp
src/gromacs/mdrun/runner.cpp
src/gromacs/modularsimulator/computeglobalselement.cpp

index 798f4f12f1f7860a4f129556d5f0139e7a2bdc6e..9f7ee8146c7309ff15d70e25b2a8eefdcb623fdc 100644 (file)
@@ -99,18 +99,19 @@ namespace gmx
 class Constraints::Impl
 {
 public:
-    Impl(const gmx_mtop_t&     mtop_p,
-         const t_inputrec&     ir_p,
-         pull_t*               pull_work,
-         FILE*                 log_p,
-         const t_commrec*      cr_p,
-         bool                  useUpdateGroups,
-         const gmx_multisim_t* ms,
-         t_nrnb*               nrnb,
-         gmx_wallcycle*        wcycle_p,
-         bool                  pbcHandlingRequired,
-         int                   numConstraints,
-         int                   numSettles);
+    Impl(const gmx_mtop_t&          mtop_p,
+         const t_inputrec&          ir_p,
+         pull_t*                    pull_work,
+         FILE*                      log_p,
+         const t_commrec*           cr_p,
+         bool                       useUpdateGroups,
+         const gmx_multisim_t*      ms,
+         t_nrnb*                    nrnb,
+         gmx_wallcycle*             wcycle_p,
+         bool                       pbcHandlingRequired,
+         ObservablesReducerBuilder* observablesReducerBuilder,
+         int                        numConstraints,
+         int                        numSettles);
     ~Impl();
     void setConstraints(gmx_localtop_t*                     top,
                         int                                 numAtoms,
@@ -819,18 +820,6 @@ bool Constraints::Impl::apply(bool                      bLog,
     return bOK;
 } // namespace gmx
 
-ArrayRef<real> Constraints::rmsdData() const
-{
-    if (impl_->lincsd)
-    {
-        return lincs_rmsdData(impl_->lincsd);
-    }
-    else
-    {
-        return {};
-    }
-}
-
 real Constraints::rmsd() const
 {
     if (impl_->lincsd)
@@ -1077,34 +1066,36 @@ static std::vector<ListOfLists<int>> makeAtomToConstraintMappings(const gmx_mtop
     return mapping;
 }
 
-Constraints::Constraints(const gmx_mtop_t&     mtop,
-                         const t_inputrec&     ir,
-                         pull_t*               pull_work,
-                         FILE*                 log,
-                         const t_commrec*      cr,
-                         const bool            useUpdateGroups,
-                         const gmx_multisim_t* ms,
-                         t_nrnb*               nrnb,
-                         gmx_wallcycle*        wcycle,
-                         bool                  pbcHandlingRequired,
-                         int                   numConstraints,
-                         int                   numSettles) :
-    impl_(new Impl(mtop, ir, pull_work, log, cr, useUpdateGroups, ms, nrnb, wcycle, pbcHandlingRequired, numConstraints, numSettles))
+Constraints::Constraints(const gmx_mtop_t&          mtop,
+                         const t_inputrec&          ir,
+                         pull_t*                    pull_work,
+                         FILE*                      log,
+                         const t_commrec*           cr,
+                         const bool                 useUpdateGroups,
+                         const gmx_multisim_t*      ms,
+                         t_nrnb*                    nrnb,
+                         gmx_wallcycle*             wcycle,
+                         bool                       pbcHandlingRequired,
+                         ObservablesReducerBuilder* observablesReducerBuilder,
+                         int                        numConstraints,
+                         int                        numSettles) :
+    impl_(new Impl(mtop, ir, pull_work, log, cr, useUpdateGroups, ms, nrnb, wcycle, pbcHandlingRequired, observablesReducerBuilder, numConstraints, numSettles))
 {
 }
 
-Constraints::Impl::Impl(const gmx_mtop_t&     mtop_p,
-                        const t_inputrec&     ir_p,
-                        pull_t*               pull_work,
-                        FILE*                 log_p,
-                        const t_commrec*      cr_p,
-                        const bool            useUpdateGroups,
-                        const gmx_multisim_t* ms_p,
-                        t_nrnb*               nrnb_p,
-                        gmx_wallcycle*        wcycle_p,
-                        bool                  pbcHandlingRequired,
-                        int                   numConstraints,
-                        int                   numSettles) :
+Constraints::Impl::Impl(const gmx_mtop_t&          mtop_p,
+                        const t_inputrec&          ir_p,
+                        pull_t*                    pull_work,
+                        FILE*                      log_p,
+                        const t_commrec*           cr_p,
+                        const bool                 useUpdateGroups,
+                        const gmx_multisim_t*      ms_p,
+                        t_nrnb*                    nrnb_p,
+                        gmx_wallcycle*             wcycle_p,
+                        bool                       pbcHandlingRequired,
+                        ObservablesReducerBuilder* observablesReducerBuilder,
+                        int                        numConstraints,
+                        int                        numSettles) :
     ncon_tot(numConstraints),
     mtop(mtop_p),
     pbcHandlingRequired_(pbcHandlingRequired),
@@ -1163,7 +1154,7 @@ Constraints::Impl::Impl(const gmx_mtop_t&     mtop_p,
         if (ir.eConstrAlg == ConstraintAlgorithm::Lincs)
         {
             lincsd = init_lincs(
-                    log, mtop, nflexcon, at2con_mt, mayHaveSplitConstraints, ir.nLincsIter, ir.nProjOrder);
+                    log, mtop, nflexcon, at2con_mt, mayHaveSplitConstraints, ir.nLincsIter, ir.nProjOrder, observablesReducerBuilder);
         }
 
         if (ir.eConstrAlg == ConstraintAlgorithm::Shake)
index dc4d4f85033ef66ba2026698680450c002293ac5..ad8ff7458995e2705d9195910813c9ea0cfd1b06 100644 (file)
@@ -76,6 +76,7 @@ template<typename T>
 class ArrayRefWithPadding;
 template<typename>
 class ListOfLists;
+class ObservablesReducerBuilder;
 
 //! Describes supported flavours of constrained updates.
 enum class ConstraintVariable : int
@@ -101,18 +102,19 @@ private:
      *
      * Private to enforce use of makeConstraints() factory
      * function. */
-    Constraints(const gmx_mtop_t&     mtop,
-                const t_inputrec&     ir,
-                pull_t*               pull_work,
-                FILE*                 log,
-                const t_commrec*      cr,
-                bool                  useUpdateGroups,
-                const gmx_multisim_t* ms,
-                t_nrnb*               nrnb,
-                gmx_wallcycle*        wcycle,
-                bool                  pbcHandlingRequired,
-                int                   numConstraints,
-                int                   numSettles);
+    Constraints(const gmx_mtop_t&          mtop,
+                const t_inputrec&          ir,
+                pull_t*                    pull_work,
+                FILE*                      log,
+                const t_commrec*           cr,
+                bool                       useUpdateGroups,
+                const gmx_multisim_t*      ms,
+                t_nrnb*                    nrnb,
+                gmx_wallcycle*             wcycle,
+                bool                       pbcHandlingRequired,
+                ObservablesReducerBuilder* observablesReducerBuilder,
+                int                        numConstraints,
+                int                        numSettles);
 
 public:
     /*! \brief This member type helps implement a factory
@@ -197,10 +199,6 @@ public:
     //! Getter for use by domain decomposition.
     ArrayRef<const std::vector<int>> atom2settle_moltype() const;
 
-    /*! \brief Return the data for reduction for determining
-     * constraint RMS relative deviations, or an empty ArrayRef
-     * when not supported for any active constraints. */
-    ArrayRef<real> rmsdData() const;
     /*! \brief Return the RMSD of the constraints when available. */
     real rmsd() const;
 
index bc476f1d7d2f16be0635db1e6218ce6d1129b156..3c2f2d2547a9a859a0866596dafbe4dc6ce8cc86 100644 (file)
@@ -53,6 +53,7 @@
 #include <cstdlib>
 
 #include <algorithm>
+#include <optional>
 #include <vector>
 
 #include "gromacs/domdec/domdec.h"
@@ -68,6 +69,7 @@
 #include "gromacs/mdtypes/commrec.h"
 #include "gromacs/mdtypes/inputrec.h"
 #include "gromacs/mdtypes/md_enums.h"
+#include "gromacs/mdtypes/observablesreducer.h"
 #include "gromacs/pbcutil/pbc.h"
 #include "gromacs/pbcutil/pbc_simd.h"
 #include "gromacs/simd/simd.h"
@@ -207,8 +209,24 @@ public:
     /*! @} */
     //! The Lagrange multipliers times -1.
     std::vector<real, AlignedAllocator<real>> mlambda;
-    //! Storage for the constraint RMS relative deviation output.
-    std::array<real, 2> rmsdData = { { 0 } };
+    /*! \brief Callback used after constraining to require reduction
+     * of values later used to compute the constraint RMS relative
+     * deviation, so the latter can be output. */
+    std::optional<ObservablesReducerBuilder::CallbackToRequireReduction> callbackToRequireReduction;
+    /*! \brief View used for reducing the components of the global
+     * relative RMS constraint deviation.
+     *
+     * Can be written any time, but that is only useful when followed
+     * by a call of the callbackToRequireReduction. Useful to read
+     * only from the callback that the ObservablesReducer will later
+     * make after reduction. */
+    ArrayRef<double> rmsdReductionBuffer;
+    /*! \brief The value of the constraint RMS deviation after it has
+     * been computed.
+     *
+     * When DD is active, filled by the ObservablesReducer, otherwise
+     * filled directly here. */
+    std::optional<double> constraintRmsDeviation;
 };
 
 /*! \brief Define simd_width for memory allocation used for SIMD code */
@@ -218,16 +236,11 @@ static const int simd_width = GMX_SIMD_REAL_WIDTH;
 static const int simd_width = 1;
 #endif
 
-ArrayRef<real> lincs_rmsdData(Lincs* lincsd)
-{
-    return lincsd->rmsdData;
-}
-
 real lincs_rmsd(const Lincs* lincsd)
 {
-    if (lincsd->rmsdData[0] > 0)
+    if (lincsd->constraintRmsDeviation.has_value())
     {
-        return std::sqrt(lincsd->rmsdData[1] / lincsd->rmsdData[0]);
+        return real(lincsd->constraintRmsDeviation.value());
     }
     else
     {
@@ -1439,7 +1452,8 @@ Lincs* init_lincs(FILE*                            fplog,
                   ArrayRef<const ListOfLists<int>> atomToConstraintsPerMolType,
                   bool                             bPLINCS,
                   int                              nIter,
-                  int                              nProjOrder)
+                  int                              nProjOrder,
+                  ObservablesReducerBuilder*       observablesReducerBuilder)
 {
     // TODO this should become a unique_ptr
     Lincs* li;
@@ -1548,6 +1562,29 @@ Lincs* init_lincs(FILE*                            fplog,
         }
     }
 
+    if (observablesReducerBuilder)
+    {
+        ObservablesReducerBuilder::CallbackFromBuilder callbackFromBuilder =
+                [li](ObservablesReducerBuilder::CallbackToRequireReduction c, gmx::ArrayRef<double> v) {
+                    li->callbackToRequireReduction = std::move(c);
+                    li->rmsdReductionBuffer        = v;
+                };
+
+        // Make the callback that runs afer reduction.
+        ObservablesReducerBuilder::CallbackAfterReduction callbackAfterReduction = [li](gmx::Step /*step*/) {
+            if (li->rmsdReductionBuffer[0] > 0)
+            {
+                li->constraintRmsDeviation =
+                        std::sqrt(li->rmsdReductionBuffer[1] / li->rmsdReductionBuffer[0]);
+            }
+        };
+
+        const int reductionValuesRequired = 2;
+        observablesReducerBuilder->addSubscriber(reductionValuesRequired,
+                                                 std::move(callbackFromBuilder),
+                                                 std::move(callbackAfterReduction));
+    }
+
     return li;
 }
 
@@ -2136,9 +2173,6 @@ void set_lincs(const InteractionDefinitions& idef,
     }
 
     set_lincs_matrix(li, invmass, lambda);
-
-    li->rmsdData[0] = 0.0;
-    li->rmsdData[1] = 0.0;
 }
 
 //! Issues a warning when LINCS constraints cannot be satisfied.
@@ -2300,11 +2334,6 @@ bool constrain_lincs(bool                            computeRmsd,
 
     if (lincsd->nc == 0 && cr->dd == nullptr)
     {
-        if (computeRmsd)
-        {
-            lincsd->rmsdData = { { 0 } };
-        }
-
         return bOK;
     }
 
@@ -2410,15 +2439,27 @@ bool constrain_lincs(bool                            computeRmsd,
 
             if (computeRmsd)
             {
-                // This is reduced across domains in compute_globals and
-                // reported to the log file.
-                lincsd->rmsdData[0] = deviations.numConstraints;
-                lincsd->rmsdData[1] = deviations.sumSquaredDeviation;
-            }
-            else
-            {
-                // This is never read
-                lincsd->rmsdData = { { 0 } };
+                if (lincsd->callbackToRequireReduction.has_value())
+                {
+                    // This is reduced across domains in compute_globals and
+                    // reported to the log file.
+                    lincsd->rmsdReductionBuffer[0] = deviations.numConstraints;
+                    lincsd->rmsdReductionBuffer[1] = deviations.sumSquaredDeviation;
+
+                    // Call the ObservablesReducer via the callback it
+                    // gave us for the purpose.
+                    ObservablesReducerStatus status =
+                            lincsd->callbackToRequireReduction.value()(ReductionRequirement::Soon);
+                    GMX_RELEASE_ASSERT(status == ObservablesReducerStatus::ReadyToReduce,
+                                       "The LINCS RMSD is computed after observables have been "
+                                       "reduced, please reorder them.");
+                }
+                else
+                {
+                    // Compute the deviation directly
+                    lincsd->constraintRmsDeviation =
+                            std::sqrt(deviations.sumSquaredDeviation / deviations.numConstraints);
+                }
             }
             if (printDebugOutput)
             {
index fcaf91a9854cf9355dcda3e9d57ceff3f68552ce..d588a687dc60525e687c59b940fdbba36a6ffdca 100644 (file)
@@ -69,7 +69,7 @@ enum class ConstraintVariable : int;
 class Lincs;
 template<typename>
 class ListOfLists;
-
+class ObservablesReducerBuilder;
 
 /*! \brief Return the data for determining constraint RMS relative deviations. */
 ArrayRef<real> lincs_rmsdData(Lincs* lincsd);
@@ -84,7 +84,8 @@ Lincs* init_lincs(FILE*                            fplog,
                   ArrayRef<const ListOfLists<int>> atomsToConstraintsPerMolType,
                   bool                             bPLINCS,
                   int                              nIter,
-                  int                              nProjOrder);
+                  int                              nProjOrder,
+                  ObservablesReducerBuilder*       observablesReducerBuilder);
 
 /*! \brief Destructs the lincs object when it is not nullptr. */
 void done_lincs(Lincs* li);
index 1d25bc85c5ec18ec8fe56a899eadab3df71d3b13..c56dcf430fff875729be799d77c9bd84d68790c1 100644 (file)
@@ -299,7 +299,6 @@ void compute_globals(gmx_global_stat*               gstat,
                      tensor                         shake_vir,
                      tensor                         total_vir,
                      tensor                         pres,
-                     gmx::ArrayRef<real>            constraintsRmsdData,
                      gmx::SimulationSignaller*      signalCoordinator,
                      const matrix                   lastbox,
                      gmx_bool*                      bSumEkinhOld,
@@ -369,7 +368,6 @@ void compute_globals(gmx_global_stat*               gstat,
                             shake_vir,
                             *ir,
                             ekind,
-                            constraintsRmsdData,
                             bStopCM ? vcm : nullptr,
                             signalBuffer,
                             *bSumEkinhOld,
index f257e4df3b42a03bb13d04d3a42ef3327bc4b037..99e4385280971968151ba858868758a8bc41ba41 100644 (file)
@@ -60,7 +60,6 @@ namespace gmx
 {
 template<typename T>
 class ArrayRef;
-class Constraints;
 class MDLogger;
 class ObservablesReducer;
 class SimulationSignaller;
@@ -128,7 +127,6 @@ void compute_globals(gmx_global_stat*               gstat,
                      tensor                         shake_vir,
                      tensor                         total_vir,
                      tensor                         pres,
-                     gmx::ArrayRef<real>            constraintsRmsdData,
                      gmx::SimulationSignaller*      signalCoordinator,
                      const matrix                   lastbox,
                      gmx_bool*                      bSumEkinhOld,
index 3f10a0ab3a71b6652670b2607f20ae92b18b874e..fb05d820652bf7a551f0d572396f7f7225267f90 100644 (file)
@@ -148,7 +148,6 @@ void global_stat(const gmx_global_stat&   gs,
                  tensor                   svir,
                  const t_inputrec&        inputrec,
                  gmx_ekindata_t*          ekind,
-                 gmx::ArrayRef<real>      constraintsRmsdData,
                  t_vcm*                   vcm,
                  gmx::ArrayRef<real>      sig,
                  bool                     bSumEkinhOld,
@@ -157,7 +156,7 @@ void global_stat(const gmx_global_stat&   gs,
                  gmx::ObservablesReducer* observablesReducer)
 /* instead of current system, gmx_booleans for summing virial, kinetic energy, and other terms */
 {
-    int ie = 0, ifv = 0, isv = 0, irmsd = 0;
+    int ie = 0, ifv = 0, isv = 0;
     int idedl = 0, idedlo = 0, idvdll = 0, idvdlnl = 0, iepl = 0, icm = 0, imass = 0, ica = 0;
     int isig = -1;
     int icj = -1, ici = -1, icx = -1;
@@ -244,10 +243,6 @@ void global_stat(const gmx_global_stat&   gs,
     if (bEner)
     {
         ie = add_binr(rb, nener, copyenerd.data());
-        if (!constraintsRmsdData.empty())
-        {
-            irmsd = add_binr(rb, 2, constraintsRmsdData.data());
-        }
         for (auto key : gmx::keysOf(inn))
         {
             inn[key] = add_binr(rb, enerd->grpp.nener, enerd->grpp.energyGroupPairTerms[key].data());
@@ -338,10 +333,6 @@ void global_stat(const gmx_global_stat&   gs,
     if (bEner)
     {
         extract_binr(rb, ie, nener, copyenerd.data());
-        if (!constraintsRmsdData.empty())
-        {
-            extract_binr(rb, irmsd, constraintsRmsdData);
-        }
         for (auto key : gmx::keysOf(inn))
         {
             extract_binr(rb, inn[key], enerd->grpp.nener, enerd->grpp.energyGroupPairTerms[key].data());
index eb48f9d665182e656ef6ef89323fdd98682aa9ca..ec854a7c2a03e94b69ffedf7e6152d0ff0f6222e 100644 (file)
@@ -53,7 +53,6 @@ namespace gmx
 {
 template<typename T>
 class ArrayRef;
-class Constraints;
 class ObservablesReducer;
 } // namespace gmx
 
@@ -71,7 +70,6 @@ void global_stat(const gmx_global_stat&   gs,
                  tensor                   svir,
                  const t_inputrec&        inputrec,
                  gmx_ekindata_t*          ekind,
-                 gmx::ArrayRef<real>      constraintsRmsdData,
                  t_vcm*                   vcm,
                  gmx::ArrayRef<real>      sig,
                  bool                     bSumEkinhOld,
index 125ce3a4201a231540d64b8b9f7dcd958eb6c110..71e73bc6a609b8a14b7c361f190ed9f476c2e3f2 100644 (file)
@@ -138,7 +138,8 @@ void LincsConstraintsRunner::applyConstraints(ConstraintsTestData* testData, t_p
                         at2con_mt,
                         false,
                         testData->ir_.nLincsIter,
-                        testData->ir_.nProjOrder);
+                        testData->ir_.nProjOrder,
+                        nullptr);
     set_lincs(*testData->idef_,
               testData->numAtoms_,
               testData->invmass_,
index 66817384e98c3ebacfcc52c61b4fb20444ac76b2..c5b714a90829adea034729e25270516748254b15 100644 (file)
@@ -362,7 +362,7 @@ public:
         // TODO This object will always return zero as RMSD value.
         //      It is more relevant to have non-zero value for testing.
         constraints_ = makeConstraints(
-                mtop_, inputrec_, nullptr, false, nullptr, &cr_, false, nullptr, nullptr, nullptr, false);
+                mtop_, inputrec_, nullptr, false, nullptr, &cr_, false, nullptr, nullptr, nullptr, false, nullptr);
     }
 
     /*! \brief Helper function to generate synthetic data to output
index 8f8709e2f8bf0130ae227533f8876a626dec3d43..58bca1a17ee2858d9334ae941a8ae89b6d85efd7 100644 (file)
@@ -206,7 +206,6 @@ void integrateVVFirstStep(int64_t                   step,
                             shake_vir,
                             total_vir,
                             pres,
-                            (bCalcEner && constr != nullptr) ? constr->rmsdData() : gmx::ArrayRef<real>{},
                             nullSignaller,
                             state->box,
                             bSumEkinhOld,
@@ -288,7 +287,6 @@ void integrateVVFirstStep(int64_t                   step,
                                 nullptr,
                                 nullptr,
                                 nullptr,
-                                gmx::ArrayRef<real>{},
                                 nullSignaller,
                                 state->box,
                                 bSumEkinhOld,
@@ -452,7 +450,6 @@ void integrateVVSecondStep(int64_t                   step,
                         shake_vir,
                         total_vir,
                         pres,
-                        gmx::ArrayRef<real>{},
                         nullSignaller,
                         lastbox,
                         bSumEkinhOld,
index 7a649b7b4a085e4c8b94e279649167b3939e31dc..970bcd6781830a386e2e6e14424c7674b8bee7b9 100644 (file)
@@ -661,7 +661,6 @@ void gmx::LegacySimulator::do_md()
                         shake_vir,
                         total_vir,
                         pres,
-                        gmx::ArrayRef<real>{},
                         &nullSignaller,
                         state->box,
                         &bSumEkinhOld,
@@ -708,7 +707,6 @@ void gmx::LegacySimulator::do_md()
                         shake_vir,
                         total_vir,
                         pres,
-                        gmx::ArrayRef<real>{},
                         &nullSignaller,
                         state->box,
                         &bSumEkinhOld,
@@ -1052,7 +1050,6 @@ void gmx::LegacySimulator::do_md()
                             nullptr,
                             nullptr,
                             nullptr,
-                            gmx::ArrayRef<real>{},
                             &nullSignaller,
                             state->box,
                             &bSumEkinhOld,
@@ -1662,35 +1659,32 @@ void gmx::LegacySimulator::do_md()
                 bool                doIntraSimSignal = true;
                 SimulationSignaller signaller(&signals, cr, ms, doInterSimSignal, doIntraSimSignal);
 
-                compute_globals(
-                        gstat,
-                        cr,
-                        ir,
-                        fr,
-                        ekind,
-                        makeConstArrayRef(state->x),
-                        makeConstArrayRef(state->v),
-                        state->box,
-                        md,
-                        nrnb,
-                        &vcm,
-                        wcycle,
-                        enerd,
-                        force_vir,
-                        shake_vir,
-                        total_vir,
-                        pres,
-                        (!EI_VV(ir->eI) && bCalcEner && constr != nullptr) ? constr->rmsdData()
-                                                                           : gmx::ArrayRef<real>{},
-                        &signaller,
-                        lastbox,
-                        &bSumEkinhOld,
-                        (bGStat ? CGLO_GSTAT : 0) | (!EI_VV(ir->eI) && bCalcEner ? CGLO_ENERGY : 0)
-                                | (!EI_VV(ir->eI) && bStopCM ? CGLO_STOPCM : 0)
-                                | (!EI_VV(ir->eI) ? CGLO_TEMPERATURE : 0)
-                                | (!EI_VV(ir->eI) ? CGLO_PRESSURE : 0) | CGLO_CONSTRAINT,
-                        step,
-                        &observablesReducer);
+                compute_globals(gstat,
+                                cr,
+                                ir,
+                                fr,
+                                ekind,
+                                makeConstArrayRef(state->x),
+                                makeConstArrayRef(state->v),
+                                state->box,
+                                md,
+                                nrnb,
+                                &vcm,
+                                wcycle,
+                                enerd,
+                                force_vir,
+                                shake_vir,
+                                total_vir,
+                                pres,
+                                &signaller,
+                                lastbox,
+                                &bSumEkinhOld,
+                                (bGStat ? CGLO_GSTAT : 0) | (!EI_VV(ir->eI) && bCalcEner ? CGLO_ENERGY : 0)
+                                        | (!EI_VV(ir->eI) && bStopCM ? CGLO_STOPCM : 0)
+                                        | (!EI_VV(ir->eI) ? CGLO_TEMPERATURE : 0)
+                                        | (!EI_VV(ir->eI) ? CGLO_PRESSURE : 0) | CGLO_CONSTRAINT,
+                                step,
+                                &observablesReducer);
                 if (!EI_VV(ir->eI) && bStopCM)
                 {
                     process_and_stopcm_grp(
index 82f4bf7465d23982bcd900034ced501b2194d573..96b3666369ff0775d219c8b00b1150d6aeabd5a8 100644 (file)
@@ -357,7 +357,6 @@ void gmx::LegacySimulator::do_mimic()
                         shake_vir,
                         total_vir,
                         pres,
-                        gmx::ArrayRef<real>{},
                         &nullSignaller,
                         state->box,
                         &bSumEkinhOld,
@@ -640,7 +639,6 @@ void gmx::LegacySimulator::do_mimic()
                             nullptr,
                             nullptr,
                             nullptr,
-                            constr != nullptr ? constr->rmsdData() : gmx::ArrayRef<real>{},
                             &signaller,
                             state->box,
                             &bSumEkinhOld,
index e3ade12b7dfb88358927952877700a203503aee4..42b34a45ebb65dfad3a75720547581f460664f7d 100644 (file)
@@ -1050,7 +1050,6 @@ void EnergyEvaluator::run(em_state_t* ems, rvec mu_tot, tensor vir, tensor pres,
                     shake_vir,
                     *inputrec,
                     nullptr,
-                    gmx::ArrayRef<real>{},
                     nullptr,
                     std::vector<real>(1, terminate),
                     FALSE,
index 14eb21ffad675179f26ea0bbdef019b48d140b4d..3ee37edb73684a536091234b68cba7c93d402561 100644 (file)
@@ -406,7 +406,6 @@ void gmx::LegacySimulator::do_rerun()
                         shake_vir,
                         total_vir,
                         pres,
-                        gmx::ArrayRef<real>{},
                         &nullSignaller,
                         state->box,
                         &bSumEkinhOld,
@@ -755,7 +754,6 @@ void gmx::LegacySimulator::do_rerun()
                             shake_vir,
                             total_vir,
                             pres,
-                            constr != nullptr ? constr->rmsdData() : gmx::ArrayRef<real>{},
                             &signaller,
                             state->box,
                             &bSumEkinhOld,
index 5daf1606ca1256a9585148cc4367272b11aceaa8..8c3fbdf517855a22e7f5e9689a515619c193e7c5 100644 (file)
@@ -1975,7 +1975,8 @@ int Mdrunner::mdrunner()
                                       ms,
                                       &nrnb,
                                       wcycle.get(),
-                                      fr->bMolPBC);
+                                      fr->bMolPBC,
+                                      &observablesReducerBuilder);
 
         /* Energy terms and groups */
         gmx_enerdata_t enerd(mtop.groups.groups[SimulationAtomGroupType::EnergyOutput].size(),
index 4c3894dd6dc2ececb8ea22121c0f9bc1f65ab5fe..6586f9a6fa5ac250cbc7b852a3a60cecd96a19b1 100644 (file)
@@ -304,8 +304,6 @@ void ComputeGlobalsElement<algorithm>::compute(gmx::Step            step,
                     energyData_->constraintVirial(step),
                     energyData_->totalVirial(step),
                     energyData_->pressure(step),
-                    (((flags & CGLO_ENERGY) != 0) && constr_ != nullptr) ? constr_->rmsdData()
-                                                                         : gmx::ArrayRef<real>{},
                     signaller,
                     lastbox,
                     energyData_->needToSumEkinhOld(),