enabled 1 PP + 1 PME node
[alexxy/gromacs.git] / src / gromacs / domdec / domdec_network.cpp
index 3710f598b645b794cb01717a77c4245bf761c480..c7424bfb22b6feb1341a4c791de55e41f0ba06aa 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2008,2009,2010,2012,2013,2014, by the GROMACS development team, led by
+ * Copyright (c) 2008,2009,2010,2012,2013,2014,2015, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -232,44 +232,61 @@ void dd_sendrecv2_rvec(const gmx_domdec_t gmx_unused *dd,
 void dd_bcast(gmx_domdec_t gmx_unused *dd, int gmx_unused nbytes, void gmx_unused *data)
 {
 #ifdef GMX_MPI
-#ifdef GMX_BLUEGENE
-    if (nbytes > 0)
+    if (dd->nnodes > 1)
     {
+#ifdef GMX_BLUEGENE
+        if (nbytes > 0)
+        {
 #endif
-    MPI_Bcast(data, nbytes, MPI_BYTE,
-              DDMASTERRANK(dd), dd->mpi_comm_all);
+        MPI_Bcast(data, nbytes, MPI_BYTE,
+                  DDMASTERRANK(dd), dd->mpi_comm_all);
 #ifdef GMX_BLUEGENE
-}
+    }
 #endif
+    }
 #endif
 }
 
 void dd_bcastc(gmx_domdec_t *dd, int nbytes, void *src, void *dest)
 {
-    if (DDMASTER(dd))
+    if (DDMASTER(dd) || dd->nnodes == 1)
     {
         memcpy(dest, src, nbytes);
     }
 #ifdef GMX_MPI
-#ifdef GMX_BLUEGENE
-    if (nbytes > 0)
+    if (dd->nnodes > 1)
     {
+#ifdef GMX_BLUEGENE
+        if (nbytes > 0)
+        {
 #endif
-    MPI_Bcast(dest, nbytes, MPI_BYTE,
-              DDMASTERRANK(dd), dd->mpi_comm_all);
+        MPI_Bcast(dest, nbytes, MPI_BYTE,
+                  DDMASTERRANK(dd), dd->mpi_comm_all);
 #ifdef GMX_BLUEGENE
-}
+    }
 #endif
+    }
 #endif
 }
 
-void dd_scatter(gmx_domdec_t gmx_unused *dd, int gmx_unused nbytes, void gmx_unused *src, void gmx_unused *dest)
+void dd_scatter(gmx_domdec_t gmx_unused *dd, int gmx_unused nbytes, void gmx_unused *src, void *dest)
 {
 #ifdef GMX_MPI
-    MPI_Scatter(src, nbytes, MPI_BYTE,
-                dest, nbytes, MPI_BYTE,
-                DDMASTERRANK(dd), dd->mpi_comm_all);
+    if (dd->nnodes > 1)
+    {
+        MPI_Scatter(src, nbytes, MPI_BYTE,
+                    dest, nbytes, MPI_BYTE,
+                    DDMASTERRANK(dd), dd->mpi_comm_all);
+    }
+    else
 #endif
+    {
+        /* 1 rank, either we copy everything, or dest=src: nothing to do */
+        if (dest != src)
+        {
+            memcpy(dest, src, nbytes);
+        }
+    }
 }
 
 void dd_gather(gmx_domdec_t gmx_unused *dd, int gmx_unused nbytes, void gmx_unused *src, void gmx_unused *dest)
@@ -282,21 +299,32 @@ void dd_gather(gmx_domdec_t gmx_unused *dd, int gmx_unused nbytes, void gmx_unus
 }
 
 void dd_scatterv(gmx_domdec_t gmx_unused *dd,
-                 int gmx_unused *scounts, int gmx_unused *disps, void gmx_unused *sbuf,
-                 int gmx_unused rcount, void gmx_unused *rbuf)
+                 int gmx_unused *scounts, int gmx_unused *disps, void *sbuf,
+                 int rcount, void *rbuf)
 {
 #ifdef GMX_MPI
     int dum;
 
-    if (rcount == 0)
+    if (dd->nnodes > 1)
     {
-        /* MPI does not allow NULL pointers */
-        rbuf = &dum;
+        if (rcount == 0)
+        {
+            /* MPI does not allow NULL pointers */
+            rbuf = &dum;
+        }
+        MPI_Scatterv(sbuf, scounts, disps, MPI_BYTE,
+                     rbuf, rcount, MPI_BYTE,
+                     DDMASTERRANK(dd), dd->mpi_comm_all);
     }
-    MPI_Scatterv(sbuf, scounts, disps, MPI_BYTE,
-                 rbuf, rcount, MPI_BYTE,
-                 DDMASTERRANK(dd), dd->mpi_comm_all);
+    else
 #endif
+    {
+        /* 1 rank, either we copy everything, or rbuf=sbuf: nothing to do */
+        if (rbuf != sbuf)
+        {
+            memcpy(rbuf, sbuf, rcount);
+        }
+    }
 }
 
 void dd_gatherv(gmx_domdec_t gmx_unused *dd,