]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add Utilities::MPI::compute_set_union 9819/head
authorPeter Munch <peterrmuench@gmail.com>
Tue, 7 Apr 2020 08:33:06 +0000 (10:33 +0200)
committerPeter Munch <peterrmuench@gmail.com>
Tue, 7 Apr 2020 11:45:21 +0000 (13:45 +0200)
doc/news/changes/minor/20200404PeterMunch
include/deal.II/base/mpi.h
include/deal.II/base/mpi.templates.h
source/base/mpi.cc
tests/mpi/union_01.cc
tests/mpi/union_01.mpirun=2.output

index 20b83cd62a363953adfd985c297bc1ad80387470..4cda0fa5626ffe8fe74a7e76587848ced76d248a 100644 (file)
@@ -1,4 +1,4 @@
-New: Add new function Utilities::MPI::compute_union(), which computes the union of given input 
-vectors of all processes in a given MPI communicator.
+New: Add new function Utilities::MPI::compute_set_union(), which computes the union of given input 
+sets and vectors of all processes in a given MPI communicator.
 <br>
 (Peter Munch, 2020/04/04)
index 8c118a978bef75ac32a5df0baf178d67fc2b1309..589260d15cc1a8f61c34642c5216bedaa3bd7de0 100644 (file)
@@ -1033,7 +1033,14 @@ namespace Utilities
      */
     template <typename T>
     std::vector<T>
-    compute_union(const std::vector<T> &vec, const MPI_Comm &comm);
+    compute_set_union(const std::vector<T> &vec, const MPI_Comm &comm);
+
+    /**
+     * The same as above but for std::set.
+     */
+    template <typename T>
+    std::set<T>
+    compute_set_union(const std::set<T> &set, const MPI_Comm &comm);
 
 #ifndef DOXYGEN
     // declaration for an internal function that lives in mpi.templates.h
index d99d6c484181e57d7d79a5a5fdaa36f7af0288a3..a71ab36f4932583dd164c323182aa4bb2c0e2ca6 100644 (file)
@@ -418,7 +418,7 @@ namespace Utilities
 
     template <typename T>
     std::vector<T>
-    compute_union(const std::vector<T> &vec, const MPI_Comm &comm)
+    compute_set_union(const std::vector<T> &vec, const MPI_Comm &comm)
     {
 #ifdef DEAL_II_WITH_MPI
       // 1) collect vector entries and create union
@@ -447,7 +447,7 @@ namespace Utilities
 
               const auto ierr_3 = MPI_Recv(result.data() + old_size,
                                            amount,
-                                           MPI_INT,
+                                           internal::mpi_type_id(vec.data()),
                                            status.MPI_SOURCE,
                                            status.MPI_TAG,
                                            comm,
@@ -484,6 +484,22 @@ namespace Utilities
 #endif
     }
 
+
+
+    template <typename T>
+    std::set<T>
+    compute_set_union(const std::set<T> &set_in, const MPI_Comm &comm)
+    {
+      // convert vector to set
+      std::vector<T> vector_in(set_in.begin(), set_in.end());
+
+      // perform operation to vector
+      const std::vector<T> vector_out = compute_set_union(vector_in, comm);
+
+      // convert vector to set
+      return std::set<T>(vector_out.begin(), vector_out.end());
+    }
+
   } // end of namespace MPI
 } // end of namespace Utilities
 
index d6784fe361f4e91652dee2349041175ead6779b0..f8cddf8b7f9ee595307713ff74adb154c6ef47da 100644 (file)
@@ -1128,7 +1128,12 @@ namespace Utilities
 
 
     template std::vector<unsigned int>
-    compute_union(const std::vector<unsigned int> &vec, const MPI_Comm &comm);
+    compute_set_union(const std::vector<unsigned int> &vec,
+                      const MPI_Comm &                 comm);
+
+
+    template std::set<unsigned int>
+    compute_set_union(const std::set<unsigned int> &set, const MPI_Comm &comm);
 
 #include "mpi.inst"
   } // end of namespace MPI
index 884e1134991dbc89ce23fb72a646593417faaf8e..6fa5c3ae7deb56f43ed445c23ecbcab93166fc0e 100644 (file)
@@ -14,7 +14,7 @@
 // ---------------------------------------------------------------------
 
 
-// Create a distributed triangulation with multigrid levels and copy it.
+// Test the function compute_set_union() for set::vector and std::set.
 
 #include <deal.II/base/mpi.h>
 
@@ -32,11 +32,24 @@ test(const MPI_Comm comm)
   else
     vector = std::vector<unsigned int>{5, 8, 9, 10};
 
-  const auto result = Utilities::MPI::compute_union(vector, comm);
+  // test function for vector
+  {
+    const auto result = Utilities::MPI::compute_set_union(vector, comm);
 
-  for (auto i : result)
-    deallog << i << " ";
-  deallog << std::endl;
+    for (auto i : result)
+      deallog << i << " ";
+    deallog << std::endl;
+  }
+
+  // test function for set
+  {
+    const auto result = Utilities::MPI::compute_set_union(
+      std::set<unsigned int>(vector.begin(), vector.end()), comm);
+
+    for (auto i : result)
+      deallog << i << " ";
+    deallog << std::endl;
+  }
 }
 
 int
index ba6eac9eb4ce352353b809154efc1c87c8642ee8..c0d718074a3110852a97ac05baf8c685f9ac9a73 100644 (file)
@@ -1,5 +1,7 @@
 
+DEAL:0::2 5 7 8 9 10 
 DEAL:0::2 5 7 8 9 10 
 
 DEAL:1::2 5 7 8 9 10 
+DEAL:1::2 5 7 8 9 10 
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.