Fix UB when generating local indices for constraints
authorAndrey Alekseenko <al42and@gmail.com>
Mon, 18 Oct 2021 13:16:49 +0000 (13:16 +0000)
committerArtem Zhmurov <zhmurov@gmail.com>
Mon, 18 Oct 2021 13:16:49 +0000 (13:16 +0000)
src/gromacs/essentialdynamics/edsam.cpp
src/gromacs/mdlib/groupcoord.cpp

index ad5e7d9295b26d7eca62b9bbf8f5d98047c669e0..48dafd3d0ab91ccb97649b438728ad917c2b9409 100644 (file)
@@ -3062,14 +3062,15 @@ std::unique_ptr<gmx::EssentialDynamics> init_edsam(const gmx::MDLogger&        m
 
     } /* end of MASTER only section */
 
-    if (PAR(cr))
+    if (haveDDAtomOrdering(*cr))
     {
-        /* Broadcast the essential dynamics / flooding data to all nodes */
+        /* Broadcast the essential dynamics / flooding data to all nodes.
+         * In a single-rank case, only the necessary memory allocation is done. */
         broadcast_ed_data(cr, ed);
     }
     else
     {
-        /* In the single-CPU case, point the local atom numbers pointers to the global
+        /* In the non-DD case, point the local atom numbers pointers to the global
          * one, so that we can use the same notation in serial and parallel case: */
         /* Loop over all ED data sets (usually only one, though) */
         for (auto edi = ed->edpar.begin(); edi != ed->edpar.end(); ++edi)
index ac84c96273ee4eef5f82dc6eaa087852c34c98a9..adbf364c896113549b796f232d704f99989682ae 100644 (file)
@@ -62,6 +62,7 @@ void dd_make_local_group_indices(const gmx_ga2la_t* ga2la,
                                  int coll_ind[]) /* OUT (opt): Where is this position found in the collective array? */
 {
     GMX_ASSERT(ga2la, "We need a valid ga2la object");
+    GMX_RELEASE_ASSERT(anrs != *anrs_loc, "Can not update indices in-place");
 
     /* Loop over all the atom indices of the group to check
      * which ones are on the local node */