From 3d6ca051c141aab9585a18bf4e3b8cb28857b7d0 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Wed, 10 Oct 2018 19:20:55 +0200
Subject: [PATCH] Add preliminary generic messaging

Begin some tests with int and CellType. Must provide a mechanism to convert/view
none POD Arrays as simple types
---
 src/utils/Messenger.cpp | 41 +++++++++++++++++++++++++++--------------
 src/utils/Messenger.hpp | 13 +++++++++----
 2 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/src/utils/Messenger.cpp b/src/utils/Messenger.cpp
index ee6cfb5de..fbc8a4ead 100644
--- a/src/utils/Messenger.cpp
+++ b/src/utils/Messenger.cpp
@@ -114,28 +114,35 @@ _broadcast(Array<int>& array, int root_rank) const
   return array;
 }
 
-
+template <typename DataType>
 void Messenger::
-_exchange(const std::vector<Array<const int>>& sent_array_list,
-          std::vector<Array<int>>& recv_array_list) const
+_exchange(const std::vector<Array<DataType>>& sent_array_list,
+          std::vector<Array<std::remove_const_t<DataType>>>& recv_array_list) const
 {
 #ifdef PASTIS_HAS_MPI
   std::vector<MPI_Request> request_list;
 
+  MPI_Datatype type = [&] () -> MPI_Datatype {
+                if constexpr (std::is_same_v<int,std::remove_const_t<DataType>>) {
+                  return MPI_INT;
+                } else if constexpr (std::is_same_v<CellType,std::remove_const_t<DataType>>) {
+                  return MPI_SHORT;
+                }
+              } ();
   for (size_t i_send=0; i_send<sent_array_list.size(); ++i_send) {
-    const Array<const int> sent_array = sent_array_list[i_send];
+    const Array<DataType> sent_array = sent_array_list[i_send];
     if (sent_array.size()>0) {
       MPI_Request request;
-      MPI_Isend(&(sent_array[0]), sent_array.size(), MPI_INT, i_send, 0, MPI_COMM_WORLD, &request);
+      MPI_Isend(&(sent_array[0]), sent_array.size(), type, i_send, 0, MPI_COMM_WORLD, &request);
       request_list.push_back(request);
     }
   }
 
   for (size_t i_recv=0; i_recv<recv_array_list.size(); ++i_recv) {
-    Array<int> recv_array = recv_array_list[i_recv];
+    Array<std::remove_const_t<DataType>> recv_array = recv_array_list[i_recv];
     if (recv_array.size()>0) {
       MPI_Request request;
-      MPI_Irecv(&(recv_array[0]), recv_array.size(), MPI_INT, i_recv, 0, MPI_COMM_WORLD, &request);
+      MPI_Irecv(&(recv_array[0]), recv_array.size(), type, i_recv, 0, MPI_COMM_WORLD, &request);
       request_list.push_back(request);
     }
   }
@@ -152,10 +159,16 @@ _exchange(const std::vector<Array<const int>>& sent_array_list,
 #endif // PASTIS_HAS_MPI
 }
 
-void Messenger::
-_exchange(const std::vector<Array<int>>& sent_array_list,
-          std::vector<Array<int>>& recv_array_list) const
-{
-  std::cerr << "NIY\n";
-  std::exit(1);
-}
+template
+void Messenger::_exchange(const std::vector<Array<int>>& sent_array_list,
+                          std::vector<Array<int>>& recv_array_list) const;
+template
+void Messenger::_exchange(const std::vector<Array<const int>>& sent_array_list,
+                          std::vector<Array<int>>& recv_array_list) const;
+
+template
+void Messenger::_exchange(const std::vector<Array<CellType>>& sent_array_list,
+                          std::vector<Array<CellType>>& recv_array_list) const;
+template
+void Messenger::_exchange(const std::vector<Array<const CellType>>& sent_array_list,
+                          std::vector<Array<CellType>>& recv_array_list) const;
diff --git a/src/utils/Messenger.hpp b/src/utils/Messenger.hpp
index 796b08894..f12b54e02 100644
--- a/src/utils/Messenger.hpp
+++ b/src/utils/Messenger.hpp
@@ -6,6 +6,9 @@
 
 #include <Array.hpp>
 
+#warning REMOVE
+enum class CellType : unsigned short;
+
 class Messenger
 {
  private:
@@ -21,10 +24,10 @@ class Messenger
   Array<int> _broadcast(Array<int>& array, int root_rank) const;
   Array<int> _allToAll(const Array<int>& sent_array, Array<int>& recv_array) const;
 
-  void _exchange(const std::vector<Array<const int>>& sent_array_list,
-                 std::vector<Array<int>>& recv_array_list) const;
-  void _exchange(const std::vector<Array<int>>& sent_array_list,
-                 std::vector<Array<int>>& recv_array_list) const;
+  template <typename DataType>
+  void _exchange(const std::vector<Array<DataType>>& sent_array_list,
+                 std::vector<Array<std::remove_const_t<DataType>>>& recv_array_list) const;
+
  public:
   static void create(int& argc, char* argv[]);
   static void destroy();
@@ -112,6 +115,8 @@ class Messenger
 
     if constexpr(std::is_same<RecvDataType, int>()) {
       _exchange(sent_array_list, recv_array_list);
+    } else if constexpr(std::is_same<RecvDataType, CellType>()) {
+      _exchange(sent_array_list, recv_array_list);
     } else {
       static_assert(std::is_same<RecvDataType, int>(), "unexpected type of data");
     }
-- 
GitLab