Remove bLocalCG from DD code
authorBerk Hess <hess@kth.se>
Thu, 19 Sep 2019 13:00:13 +0000 (15:00 +0200)
committerMark Abraham <mark.j.abraham@gmail.com>
Thu, 19 Sep 2019 19:19:08 +0000 (21:19 +0200)
Replaced the use of bLocalCG in gmx_domdec_comm_t by ga2la,
which can be done since we no longer support charge groups.

Change-Id: I601e4a9c63e685b21f764fc99dc71c0080e84a43

src/gromacs/domdec/domdec.cpp
src/gromacs/domdec/domdec.h
src/gromacs/domdec/domdec_internal.h
src/gromacs/domdec/domdec_topology.cpp
src/gromacs/domdec/partition.cpp
src/gromacs/domdec/redistribute.cpp

index f707744ce11d6fba949fc7f478e26b0190af066d..655f475582a2b55dfa0c1c9ef32480fb148654f5 100644 (file)
@@ -2578,27 +2578,13 @@ static void set_dd_limits(const gmx::MDLogger &mdlog,
     }
 }
 
-static char *init_bLocalCG(const gmx_mtop_t *mtop)
-{
-    int   ncg, cg;
-    char *bLocalCG;
-
-    ncg = ncg_mtop(mtop);
-    snew(bLocalCG, ncg);
-    for (cg = 0; cg < ncg; cg++)
-    {
-        bLocalCG[cg] = FALSE;
-    }
-
-    return bLocalCG;
-}
-
-void dd_init_bondeds(FILE *fplog,
-                     gmx_domdec_t *dd,
-                     const gmx_mtop_t *mtop,
-                     const gmx_vsite_t *vsite,
-                     const t_inputrec *ir,
-                     gmx_bool bBCheck, cginfo_mb_t *cginfo_mb)
+void dd_init_bondeds(FILE                       *fplog,
+                     gmx_domdec_t               *dd,
+                     const gmx_mtop_t           *mtop,
+                     const gmx_vsite_t          *vsite,
+                     const t_inputrec           *ir,
+                     gmx_bool                    bBCheck,
+                     cginfo_mb_t                *cginfo_mb)
 {
     gmx_domdec_comm_t *comm;
 
@@ -2609,17 +2595,12 @@ void dd_init_bondeds(FILE *fplog,
     if (comm->systemInfo.filterBondedCommunication)
     {
         /* Communicate atoms beyond the cut-off for bonded interactions */
-        comm = dd->comm;
-
-        comm->cglink = make_charge_group_links(mtop, cginfo_mb);
-
-        comm->bLocalCG = init_bLocalCG(mtop);
+        comm->bondedLinks = makeBondedLinks(mtop, cginfo_mb);
     }
     else
     {
         /* Only communicate atoms based on cut-off */
-        comm->cglink   = nullptr;
-        comm->bLocalCG = nullptr;
+        comm->bondedLinks = nullptr;
     }
 }
 
index c6d8612375e11043d579d74e3d8ccbfb46d6336d..825a1918f3e63c3a54e4c4769aed2c197d581d16 100644 (file)
@@ -319,9 +319,12 @@ void dd_init_local_top(const gmx_mtop_t &top_global,
 void dd_init_local_state(struct gmx_domdec_t *dd,
                          const t_state *state_global, t_state *local_state);
 
-/*! \brief Generate a list of links between charge groups that are linked by bonded interactions */
-t_blocka *make_charge_group_links(const gmx_mtop_t *mtop,
-                                  cginfo_mb_t      *cginfo_mb);
+/*! \brief Generate a list of links between atoms that are linked by bonded interactions
+ *
+ * Also stores whether atoms are linked in \p cginfo_mb.
+ */
+t_blocka *makeBondedLinks(const gmx_mtop_t *mtop,
+                          cginfo_mb_t      *cginfo_mb);
 
 /*! \brief Calculate the maximum distance involved in 2-body and multi-body bonded interactions */
 void dd_bonded_cg_distance(const gmx::MDLogger &mdlog,
index 457c65fb62458b70ad1d95db223c9f045eef481e..3d24a1885ec5d1806fd4ab8c198478b1bab79d90 100644 (file)
@@ -588,10 +588,8 @@ struct gmx_domdec_comm_t // NOLINT (clang-analyzer-optin.performance.Padding)
     std::unique_ptr<gmx::UpdateGroupsCog> updateGroupsCog;
 
     /* Data for the optional filtering of communication of atoms for bonded interactions */
-    /**< Links between cg's through bonded interactions */
-    t_blocka *cglink = nullptr;
-    /**< Local cg availability, TODO: remove when group scheme is removed */
-    char     *bLocalCG = nullptr;
+    /**< Links between atoms through bonded interactions */
+    t_blocka *bondedLinks = nullptr;
 
     /* The DLB state, possible values are defined above */
     DlbState dlbState;
index d079dac6d9f3f7aafaf87e7b1c58808e82687d87..af9626ad948a31dfe838080a79d74b5ef9a53271 100644 (file)
@@ -1930,8 +1930,8 @@ static std::vector<int> make_at2cg(const t_block &cgs)
     return at2cg;
 }
 
-t_blocka *make_charge_group_links(const gmx_mtop_t *mtop,
-                                  cginfo_mb_t      *cginfo_mb)
+t_blocka *makeBondedLinks(const gmx_mtop_t *mtop,
+                          cginfo_mb_t      *cginfo_mb)
 {
     t_blocka           *link;
     cginfo_mb_t        *cgi_mb;
index 3d708665c8989198baadd275cb07232701f91f0d..a2a8a08e833e97925141286eb6713760c95c5a97 100644 (file)
@@ -466,7 +466,7 @@ static void restoreAtomGroups(gmx_domdec_t  *dd,
 
 //! Sets the cginfo structures.
 static void dd_set_cginfo(gmx::ArrayRef<const int> index_gl, int cg0, int cg1,
-                          t_forcerec *fr, char *bLocalCG)
+                          t_forcerec *fr)
 {
     if (fr != nullptr)
     {
@@ -478,14 +478,6 @@ static void dd_set_cginfo(gmx::ArrayRef<const int> index_gl, int cg0, int cg1,
             cginfo[cg] = ddcginfo(cginfo_mb, index_gl[cg]);
         }
     }
-
-    if (bLocalCG != nullptr)
-    {
-        for (int cg = cg0; cg < cg1; cg++)
-        {
-            bLocalCG[index_gl[cg]] = TRUE;
-        }
-    }
 }
 
 //! Makes the mappings between global and local atom indices during DD repartioning.
@@ -538,45 +530,10 @@ static void make_dd_indices(gmx_domdec_t *dd,
     }
 }
 
-//! Checks the charge-group assignements.
-static int check_bLocalCG(gmx_domdec_t *dd, int ncg_sys, const char *bLocalCG,
-                          const char *where)
-{
-    int nerr = 0;
-    if (bLocalCG == nullptr)
-    {
-        return nerr;
-    }
-    for (size_t i = 0; i < dd->globalAtomGroupIndices.size(); i++)
-    {
-        if (!bLocalCG[dd->globalAtomGroupIndices[i]])
-        {
-            fprintf(stderr,
-                    "DD rank %d, %s: atom group %zu, global atom group %d is not marked in bLocalCG (ncg_home %d)\n", dd->rank, where, i + 1, dd->globalAtomGroupIndices[i] + 1, dd->ncg_home);
-            nerr++;
-        }
-    }
-    size_t ngl = 0;
-    for (int i = 0; i < ncg_sys; i++)
-    {
-        if (bLocalCG[i])
-        {
-            ngl++;
-        }
-    }
-    if (ngl != dd->globalAtomGroupIndices.size())
-    {
-        fprintf(stderr, "DD rank %d, %s: In bLocalCG %zu atom groups are marked as local, whereas there are %zu\n", dd->rank, where, ngl, dd->globalAtomGroupIndices.size());
-        nerr++;
-    }
-
-    return nerr;
-}
-
 //! Checks whether global and local atom indices are consistent.
-static void check_index_consistency(gmx_domdec_t *dd,
-                                    int natoms_sys, int ncg_sys,
-                                    const char *where)
+static void check_index_consistency(const gmx_domdec_t *dd,
+                                    int                 natoms_sys,
+                                    const char         *where)
 {
     int       nerr = 0;
 
@@ -640,8 +597,6 @@ static void check_index_consistency(gmx_domdec_t *dd,
         }
     }
 
-    nerr += check_bLocalCG(dd, ncg_sys, dd->comm->bLocalCG, where);
-
     if (nerr > 0)
     {
         gmx_fatal(FARGS, "DD rank %d, %s: %d atom(group) index inconsistencies",
@@ -649,14 +604,13 @@ static void check_index_consistency(gmx_domdec_t *dd,
     }
 }
 
-//! Clear all DD global state indices, starting from \p atomGroupStart and \p atomStart
+//! Clear all DD global state indices
 static void clearDDStateIndices(gmx_domdec_t *dd,
-                                int           atomGroupStart,
-                                int           atomStart)
+                                const bool    keepLocalAtomIndices)
 {
     gmx_ga2la_t &ga2la = *dd->ga2la;
 
-    if (atomStart == 0)
+    if (!keepLocalAtomIndices)
     {
         /* Clear the whole list without the overhead of searching */
         ga2la.clear();
@@ -670,15 +624,6 @@ static void clearDDStateIndices(gmx_domdec_t *dd,
         }
     }
 
-    char *bLocalCG = dd->comm->bLocalCG;
-    if (bLocalCG)
-    {
-        for (size_t atomGroup = atomGroupStart; atomGroup < dd->globalAtomGroupIndices.size(); atomGroup++)
-        {
-            bLocalCG[dd->globalAtomGroupIndices[atomGroup]] = FALSE;
-        }
-    }
-
     dd_clear_local_vsite_indices(dd);
 
     if (dd->constraints)
@@ -1478,21 +1423,19 @@ static void make_cell2at_index(gmx_domdec_comm_dim_t        *cd,
 }
 
 //! Returns whether a link is missing.
-static gmx_bool missing_link(t_blocka *link, int cg_gl, const char *bLocalCG)
+static gmx_bool missing_link(const t_blocka    &link,
+                             const int          globalAtomIndex,
+                             const gmx_ga2la_t &ga2la)
 {
-    int      i;
-    gmx_bool bMiss;
-
-    bMiss = FALSE;
-    for (i = link->index[cg_gl]; i < link->index[cg_gl+1]; i++)
+    for (int i = link.index[globalAtomIndex]; i < link.index[globalAtomIndex + 1]; i++)
     {
-        if (!bLocalCG[link->a[i]])
+        if (!ga2la.findHome(link.a[i]))
         {
-            bMiss = TRUE;
+            return true;
         }
     }
 
-    return bMiss;
+    return false;
 }
 
 //! Domain corners for communication, a maximum of 4 i-zones see a j domain
@@ -1832,8 +1775,8 @@ get_zone_pulse_cgs(gmx_domdec_t *dd,
               (bDist2B && r2  < r_bcomm2)) &&
              (!bBondComm ||
               (GET_CGINFO_BOND_INTER(cginfo[cg]) &&
-               missing_link(comm->cglink, globalAtomGroupIndices[cg],
-                            comm->bLocalCG)))))
+               missing_link(*comm->bondedLinks, globalAtomGroupIndices[cg],
+                            *dd->ga2la)))))
         {
             /* Store the local and global atom group indices and position */
             localAtomGroups->push_back(cg);
@@ -1884,7 +1827,7 @@ static void setup_dd_communication(gmx_domdec_t *dd,
 {
     int                    dim_ind, dim, dim0, dim1, dim2, dimd, nat_tot;
     int                    nzone, nzone_send, zone, zonei, cg0, cg1;
-    int                    c, i, cg, cg_gl;
+    int                    c;
     int                   *zone_cg_range, pos_cg;
     gmx_domdec_comm_t     *comm;
     gmx_domdec_zones_t    *zones;
@@ -1979,7 +1922,7 @@ static void setup_dd_communication(gmx_domdec_t *dd,
 
         /* Check if we need to compute triclinic distances along this dim */
         bool distanceIsTriclinic = false;
-        for (i = 0; i <= dim_ind; i++)
+        for (int i = 0; i <= dim_ind; i++)
         {
             if (ddbox->tric_dir[dd->dim[i]])
             {
@@ -2028,7 +1971,7 @@ static void setup_dd_communication(gmx_domdec_t *dd,
                         sf2_round[dimd] = 1;
                         if (ddbox->tric_dir[dimd])
                         {
-                            for (i = dd->dim[dimd]+1; i < DIM; i++)
+                            for (int i = dd->dim[dimd] + 1; i < DIM; i++)
                             {
                                 /* If we are shifted in dimension i
                                  * and the cell plane is tilted forward
@@ -2186,17 +2129,10 @@ static void setup_dd_communication(gmx_domdec_t *dd,
                 zone = (p == 0 ? 0 : nzone - 1);
                 while (zone < nzone)
                 {
-                    for (cg = 0; cg < ind->nrecv[zone]; cg++)
+                    for (int i = 0; i < ind->nrecv[zone]; i++)
                     {
-                        cg_gl                              = dd->globalAtomGroupIndices[pos_cg];
-                        fr->cginfo[pos_cg]                 = ddcginfo(cginfo_mb, cg_gl);
-                        if (bBondComm)
-                        {
-                            /* Update the charge group presence,
-                             * so we can use it in the next pass of the loop.
-                             */
-                            comm->bLocalCG[cg_gl] = TRUE;
-                        }
+                        int globalAtomIndex = dd->globalAtomGroupIndices[pos_cg];
+                        fr->cginfo[pos_cg]  = ddcginfo(cginfo_mb, globalAtomIndex);
                         pos_cg++;
                     }
                     if (p == 0)
@@ -2235,7 +2171,7 @@ static void setup_dd_communication(gmx_domdec_t *dd,
          */
         dd_set_cginfo(dd->globalAtomGroupIndices,
                       dd->ncg_home, dd->globalAtomGroupIndices.size(),
-                      nullptr, comm->bLocalCG);
+                      nullptr);
     }
 
     if (debug)
@@ -2959,7 +2895,7 @@ void dd_partition_system(FILE                        *fplog,
     if (bMasterState)
     {
         /* Clear the old state */
-        clearDDStateIndices(dd, 0, 0);
+        clearDDStateIndices(dd, false);
         ncgindex_set = 0;
 
         auto xGlobal = positionsFromStatePointer(state_global);
@@ -2976,7 +2912,7 @@ void dd_partition_system(FILE                        *fplog,
 
         inc_nrnb(nrnb, eNR_CGCM, comm->atomRanges.numHomeAtoms());
 
-        dd_set_cginfo(dd->globalAtomGroupIndices, 0, dd->ncg_home, fr, comm->bLocalCG);
+        dd_set_cginfo(dd->globalAtomGroupIndices, 0, dd->ncg_home, fr);
     }
     else if (state_local->ddp_count != dd->ddp_count)
     {
@@ -2991,7 +2927,7 @@ void dd_partition_system(FILE                        *fplog,
         }
 
         /* Clear the old state */
-        clearDDStateIndices(dd, 0, 0);
+        clearDDStateIndices(dd, false);
 
         /* Restore the atom group indices from state_local */
         restoreAtomGroups(dd, state_local);
@@ -3000,7 +2936,7 @@ void dd_partition_system(FILE                        *fplog,
 
         inc_nrnb(nrnb, eNR_CGCM, comm->atomRanges.numHomeAtoms());
 
-        dd_set_cginfo(dd->globalAtomGroupIndices, 0, dd->ncg_home, fr, comm->bLocalCG);
+        dd_set_cginfo(dd->globalAtomGroupIndices, 0, dd->ncg_home, fr);
 
         set_ddbox(*dd, bMasterState, state_local->box,
                   true, state_local->x, &ddbox);
@@ -3012,7 +2948,7 @@ void dd_partition_system(FILE                        *fplog,
         /* We have the full state, only redistribute the cgs */
 
         /* Clear the non-home indices */
-        clearDDStateIndices(dd, dd->ncg_home, comm->atomRanges.numHomeAtoms());
+        clearDDStateIndices(dd, true);
         ncgindex_set = 0;
 
         /* To avoid global communication, we do not recompute the extent
@@ -3341,8 +3277,7 @@ void dd_partition_system(FILE                        *fplog,
     if (comm->ddSettings.DD_debug > 0)
     {
         /* Set the env var GMX_DD_DEBUG if you suspect corrupted indices */
-        check_index_consistency(dd, top_global.natoms, ncg_mtop(&top_global),
-                                "after partitioning");
+        check_index_consistency(dd, top_global.natoms, "after partitioning");
     }
 
     wallcycle_stop(wcycle, ewcDOMDEC);
index f56512a7ed9a5ef3ed7c98509273eb397b70accb..d27455043ba0d9a031f34d0acca741a33ea2ab71 100644 (file)
@@ -127,10 +127,8 @@ copyMovedUpdateGroupCogs(gmx::ArrayRef<const int> move,
 }
 
 static void clear_and_mark_ind(gmx::ArrayRef<const int>      move,
-                               gmx::ArrayRef<const int>      globalAtomGroupIndices,
                                gmx::ArrayRef<const int>      globalAtomIndices,
                                gmx_ga2la_t                  *ga2la,
-                               char                         *bLocalCG,
                                int                          *cell_index)
 {
     for (gmx::index a = 0; a < move.ssize(); a++)
@@ -139,10 +137,6 @@ static void clear_and_mark_ind(gmx::ArrayRef<const int>      move,
         {
             /* Clear the global indices */
             ga2la->erase(globalAtomIndices[a]);
-            if (bLocalCG)
-            {
-                bLocalCG[globalAtomGroupIndices[a]] = FALSE;
-            }
             /* Signal that this atom has moved using the ns cell index.
              * Here we set it to -1. fill_grid will change it
              * from -1 to NSGRID_SIGNAL_MOVED_FAC*grid->ncells.
@@ -742,8 +736,8 @@ void dd_redistribute_cg(FILE *fplog, int64_t step,
     int *moved = getMovedBuffer(comm, 0, dd->ncg_home);
 
     clear_and_mark_ind(move,
-                       dd->globalAtomGroupIndices, dd->globalAtomIndices,
-                       dd->ga2la, comm->bLocalCG,
+                       dd->globalAtomIndices,
+                       dd->ga2la,
                        moved);
 
     /* Now we can remove the excess global atom-group indices from the list */
@@ -913,10 +907,6 @@ void dd_redistribute_cg(FILE *fplog, int64_t step,
                 /* Set the cginfo */
                 fr->cginfo[home_pos_cg] = ddcginfo(cginfo_mb,
                                                    globalAtomGroupIndex);
-                if (comm->bLocalCG)
-                {
-                    comm->bLocalCG[globalAtomGroupIndex] = TRUE;
-                }
 
                 auto  x       = makeArrayRef(state->x);
                 auto  v       = makeArrayRef(state->v);