From d0331b2799c4693a4eb50ffb5812ba03a94e34f2 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Thu, 7 Mar 2019 19:13:57 +0100
Subject: [PATCH] Rename MeshDispatcher -> ConnectivityDispatcher

Connectivity dispatcher does not refer to the mesh any more
---
 src/mesh/CMakeLists.txt                       |   2 +-
 ...patcher.cpp => ConnectivityDispatcher.cpp} | 184 +++++++-----------
 src/mesh/ConnectivityDispatcher.hpp           | 140 +++++++++++++
 src/mesh/GmshReader.cpp                       |  10 +-
 src/mesh/Mesh.hpp                             |  10 +-
 src/mesh/MeshDispatcher.hpp                   | 112 -----------
 6 files changed, 224 insertions(+), 234 deletions(-)
 rename src/mesh/{MeshDispatcher.cpp => ConnectivityDispatcher.cpp} (84%)
 create mode 100644 src/mesh/ConnectivityDispatcher.hpp
 delete mode 100644 src/mesh/MeshDispatcher.hpp

diff --git a/src/mesh/CMakeLists.txt b/src/mesh/CMakeLists.txt
index 9c232ea60..ad245fb03 100644
--- a/src/mesh/CMakeLists.txt
+++ b/src/mesh/CMakeLists.txt
@@ -8,7 +8,7 @@ add_library(
   Connectivity.cpp
   ConnectivityComputer.cpp
   GmshReader.cpp
-  MeshDispatcher.cpp
+  ConnectivityDispatcher.cpp
   SynchronizerManager.cpp)
 
 include_directories(${PASTIS_BINARY_DIR}/src/utils)
diff --git a/src/mesh/MeshDispatcher.cpp b/src/mesh/ConnectivityDispatcher.cpp
similarity index 84%
rename from src/mesh/MeshDispatcher.cpp
rename to src/mesh/ConnectivityDispatcher.cpp
index a5201895f..c0a7b7776 100644
--- a/src/mesh/MeshDispatcher.cpp
+++ b/src/mesh/ConnectivityDispatcher.cpp
@@ -1,11 +1,11 @@
-#include <MeshDispatcher.hpp>
+#include <ConnectivityDispatcher.hpp>
 #include <Partitioner.hpp>
 
 #include <unordered_map>
 
 template <int Dimension>
 CellValue<int>
-MeshDispatcher<Dimension>::_getCellNewOwner()
+ConnectivityDispatcher<Dimension>::_getCellNewOwner()
 {
   CSRGraph connectivity_graph = m_connectivity.cellToCellGraph();
   Partitioner P;
@@ -17,7 +17,7 @@ MeshDispatcher<Dimension>::_getCellNewOwner()
 
 template <int Dimension>
 FaceValue<int>
-MeshDispatcher<Dimension>::_getFaceNewOwner()
+ConnectivityDispatcher<Dimension>::_getFaceNewOwner()
 {
   const auto& face_to_cell_matrix
       = m_connectivity.faceToCellMatrix();
@@ -37,13 +37,14 @@ MeshDispatcher<Dimension>::_getFaceNewOwner()
       face_new_owner[l] = m_cell_new_owner[Jmin];
     });
 
-  synchronize(face_new_owner);
+#warning Add missing synchronize (fix it!)
+  //  synchronize(face_new_owner);
   return face_new_owner;
 }
 
 template <int Dimension>
 NodeValue<int>
-MeshDispatcher<Dimension>::_getNodeNewOwner()
+ConnectivityDispatcher<Dimension>::_getNodeNewOwner()
 {
   const auto& node_to_cell_matrix = m_connectivity.nodeToCellMatrix();
   const auto& cell_number = m_connectivity.cellNumber();
@@ -62,13 +63,14 @@ MeshDispatcher<Dimension>::_getNodeNewOwner()
       node_new_owner[r] = m_cell_new_owner[Jmin];
     });
 
-  synchronize(node_new_owner);
+#warning Add missing synchronize (fix it!)
+  //  synchronize(node_new_owner);
   return node_new_owner;
 }
 
 template <int Dimension>
-const typename MeshDispatcher<Dimension>::CellListToSendByProc
-MeshDispatcher<Dimension>::_buildCellListToSend() const
+std::vector<Array<const CellId>>
+ConnectivityDispatcher<Dimension>::_buildCellListToSend() const
 {
   const auto& node_to_cell_matrix
       = m_connectivity.nodeToCellMatrix();
@@ -107,7 +109,7 @@ MeshDispatcher<Dimension>::_buildCellListToSend() const
 
 template <int Dimension>
 Array<int>
-MeshDispatcher<Dimension>::_buildNbCellToSend()
+ConnectivityDispatcher<Dimension>::_buildNbCellToSend()
 {
   Array<int> nb_cell_to_send_by_proc(parallel::size());
   for (size_t i=0; i<parallel::size(); ++i) {
@@ -118,7 +120,7 @@ MeshDispatcher<Dimension>::_buildNbCellToSend()
 
 template <int Dimension>
 void
-MeshDispatcher<Dimension>::_dispatchFaces()
+ConnectivityDispatcher<Dimension>::_dispatchFaces()
 {
   if constexpr (Dimension>1) {
     std::vector<Array<int>> recv_number_of_face_per_cell_by_proc =
@@ -550,8 +552,8 @@ MeshDispatcher<Dimension>::_dispatchFaces()
 
 
 template <int Dimension>
-MeshDispatcher<Dimension>::MeshDispatcher(const MeshType& mesh_deprecated)
-    : m_connectivity(mesh_deprecated.connectivity()),
+ConnectivityDispatcher<Dimension>::ConnectivityDispatcher(const ConnectivityType& connectivity)
+    : m_connectivity(connectivity),
       m_cell_new_owner(_getCellNewOwner()),
       m_face_new_owner(_getFaceNewOwner()),
       m_node_new_owner(_getNodeNewOwner()),
@@ -663,62 +665,67 @@ MeshDispatcher<Dimension>::MeshDispatcher(const MeshType& mesh_deprecated)
     }
   }
 
-  std::vector<Array<const NodeId>> send_node_id_by_proc(parallel::size());
-  for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
-    Array<bool> tag(m_connectivity.numberOfNodes());
-    tag.fill(false);
-    std::vector<NodeId> node_id_vector;
-    for (size_t j=0; j<m_cell_list_to_send_by_proc[i_rank].size(); ++j) {
-      const CellId& cell_id = m_cell_list_to_send_by_proc[i_rank][j];
-      const auto& cell_node_list = cell_to_node_matrix[cell_id];
-      for (size_t r=0; r<cell_node_list.size(); ++r) {
-        const NodeId& node_id = cell_node_list[r];
-        if (not tag[node_id]) {
-          node_id_vector.push_back(node_id);
-          tag[node_id] = true;
+  m_node_list_to_send_by_proc =
+      [&] () {
+        std::vector<Array<const NodeId>> node_list_to_send_by_proc(parallel::size());
+        for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
+          Array<bool> tag(m_connectivity.numberOfNodes());
+          tag.fill(false);
+          std::vector<NodeId> node_id_vector;
+          for (size_t j=0; j<m_cell_list_to_send_by_proc[i_rank].size(); ++j) {
+            const CellId& cell_id = m_cell_list_to_send_by_proc[i_rank][j];
+            const auto& cell_node_list = cell_to_node_matrix[cell_id];
+            for (size_t r=0; r<cell_node_list.size(); ++r) {
+              const NodeId& node_id = cell_node_list[r];
+              if (not tag[node_id]) {
+                node_id_vector.push_back(node_id);
+                tag[node_id] = true;
+              }
+            }
+          }
+          node_list_to_send_by_proc[i_rank] = convert_to_array(node_id_vector);
         }
-      }
-    }
-    send_node_id_by_proc[i_rank] = convert_to_array(node_id_vector);
-  }
+        return node_list_to_send_by_proc;
+      } ();
 
   Array<unsigned int> nb_node_to_send_by_proc(parallel::size());
   for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
-    nb_node_to_send_by_proc[i_rank] = send_node_id_by_proc[i_rank].size();
+    nb_node_to_send_by_proc[i_rank] = m_node_list_to_send_by_proc[i_rank].size();
   }
-  Array<const unsigned int> nb_node_to_recv_by_proc
-      = parallel::allToAll(nb_node_to_send_by_proc);
+  m_nb_node_to_recv_by_proc = parallel::allToAll(nb_node_to_send_by_proc);
 
-  std::vector<Array<const NodeId>> recv_node_id_correspondance_by_proc(parallel::size());
-  {
-    const NodeValue<const int>& node_number = m_connectivity.nodeNumber();
-    std::vector<Array<const int>> send_node_number_by_proc(parallel::size());
-    for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
-      Array<int> send_node_number(send_node_id_by_proc[i_rank].size());
-      const Array<const NodeId> send_node_id = send_node_id_by_proc[i_rank];
-      parallel_for(send_node_number.size(), PASTIS_LAMBDA(const size_t& j){
-          send_node_number[j] = node_number[send_node_id[j]];
-        });
-      send_node_number_by_proc[i_rank] = send_node_number;
-    }
+  m_recv_node_id_correspondance_by_proc =
+      [&] () {
+        std::vector<Array<const NodeId>> recv_node_id_correspondance_by_proc(parallel::size());
+        const NodeValue<const int>& node_number = m_connectivity.nodeNumber();
+        std::vector<Array<const int>> send_node_number_by_proc(parallel::size());
+        for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
+          Array<int> send_node_number(m_node_list_to_send_by_proc[i_rank].size());
+          const Array<const NodeId> send_node_id = m_node_list_to_send_by_proc[i_rank];
+          parallel_for(send_node_number.size(), PASTIS_LAMBDA(const size_t& j){
+              send_node_number[j] = node_number[send_node_id[j]];
+            });
+          send_node_number_by_proc[i_rank] = send_node_number;
+        }
 
-    std::vector<Array<int>> recv_node_number_by_proc(parallel::size());
-    for (size_t i_rank=0; i_rank < parallel::size(); ++i_rank) {
-      recv_node_number_by_proc[i_rank] = Array<int>(nb_node_to_recv_by_proc[i_rank]);
-    }
-    parallel::exchange(send_node_number_by_proc, recv_node_number_by_proc);
+        std::vector<Array<int>> recv_node_number_by_proc(parallel::size());
+        for (size_t i_rank=0; i_rank < parallel::size(); ++i_rank) {
+          recv_node_number_by_proc[i_rank] = Array<int>(m_nb_node_to_recv_by_proc[i_rank]);
+        }
+        parallel::exchange(send_node_number_by_proc, recv_node_number_by_proc);
 
-    for (size_t i_rank=0; i_rank<nb_node_to_recv_by_proc.size(); ++i_rank) {
-      Array<NodeId> node_id_correspondace(nb_node_to_recv_by_proc[i_rank]);
-      for (size_t l=0; l<nb_node_to_recv_by_proc[i_rank]; ++l) {
-        const int& node_number = recv_node_number_by_proc[i_rank][l];
-        const auto& searched_node_id = m_node_number_id_map.find(node_number);
-        Assert(searched_node_id != m_node_number_id_map.end());
-        node_id_correspondace[l] = searched_node_id->second;
-      }
-      recv_node_id_correspondance_by_proc[i_rank] = node_id_correspondace;
-    }
-  }
+        for (size_t i_rank=0; i_rank<m_nb_node_to_recv_by_proc.size(); ++i_rank) {
+          Array<NodeId> node_id_correspondace(m_nb_node_to_recv_by_proc[i_rank]);
+          for (size_t l=0; l<m_nb_node_to_recv_by_proc[i_rank]; ++l) {
+            const int& node_number = recv_node_number_by_proc[i_rank][l];
+            const auto& searched_node_id = m_node_number_id_map.find(node_number);
+            Assert(searched_node_id != m_node_number_id_map.end());
+            node_id_correspondace[l] = searched_node_id->second;
+          }
+          recv_node_id_correspondance_by_proc[i_rank] = node_id_correspondace;
+        }
+        return recv_node_id_correspondance_by_proc;
+      } ();
 
   {
     std::vector<Array<int>> recv_cell_new_owner_by_proc
@@ -738,7 +745,7 @@ MeshDispatcher<Dimension>::MeshDispatcher(const MeshType& mesh_deprecated)
     std::vector<Array<const int>> send_node_owner_by_proc(parallel::size());
     for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
       Array<int> send_node_owner(nb_node_to_send_by_proc[i_rank]);
-      const Array<const NodeId> send_node_id = send_node_id_by_proc[i_rank];
+      const Array<const NodeId> send_node_id = m_node_list_to_send_by_proc[i_rank];
       parallel_for(send_node_id.size(), PASTIS_LAMBDA(const size_t& r) {
           const NodeId& node_id = send_node_id[r];
           send_node_owner[r] = m_node_new_owner[node_id];
@@ -748,14 +755,14 @@ MeshDispatcher<Dimension>::MeshDispatcher(const MeshType& mesh_deprecated)
 
     std::vector<Array<int>> recv_node_owner_by_proc(parallel::size());
     for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
-      recv_node_owner_by_proc[i_rank] = Array<int>(nb_node_to_recv_by_proc[i_rank]);
+      recv_node_owner_by_proc[i_rank] = Array<int>(m_nb_node_to_recv_by_proc[i_rank]);
     }
     parallel::exchange(send_node_owner_by_proc, recv_node_owner_by_proc);
 
     m_new_descriptor.node_owner_vector.resize(m_new_descriptor.node_number_vector.size());
     for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
       for (size_t r=0; r<recv_node_owner_by_proc[i_rank].size(); ++r) {
-        const NodeId& node_id = recv_node_id_correspondance_by_proc[i_rank][r];
+        const NodeId& node_id = m_recv_node_id_correspondance_by_proc[i_rank][r];
         m_new_descriptor.node_owner_vector[node_id] = recv_node_owner_by_proc[i_rank][r];
       }
     }
@@ -763,52 +770,9 @@ MeshDispatcher<Dimension>::MeshDispatcher(const MeshType& mesh_deprecated)
 
   this->_dispatchFaces();
 
-  using ConnectivityType = Connectivity<Dimension>;
-  std::shared_ptr m_dispatched_connectivity
-      = ConnectivityType::build(m_new_descriptor);
-
-  using Rd = TinyVector<Dimension, double>;
-
-  const NodeValue<const Rd>& xr = mesh_deprecated.xr();
-  std::vector<Array<const Rd>> send_node_coord_by_proc(parallel::size());
-  for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
-    Array<Rd> send_node_coord(nb_node_to_send_by_proc[i_rank]);
-    const Array<const NodeId> send_node_id = send_node_id_by_proc[i_rank];
-    parallel_for(send_node_id.size(), PASTIS_LAMBDA(const size_t& r) {
-        const NodeId& node_id = send_node_id[r];
-        send_node_coord[r] = xr[node_id];
-      });
-    send_node_coord_by_proc[i_rank] = send_node_coord;
-  }
-
-  std::vector<Array<Rd>> recv_node_coord_by_proc(parallel::size());
-  for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
-    recv_node_coord_by_proc[i_rank] = Array<Rd>(nb_node_to_recv_by_proc[i_rank]);
-  }
-  parallel::exchange(send_node_coord_by_proc, recv_node_coord_by_proc);
-
-  Array<const size_t> number_of_ref_node_list_per_proc
-      = parallel::allGather(m_connectivity.numberOfRefNodeList());
-  if (max(number_of_ref_node_list_per_proc) > 0) {
-    perr() << __FILE__ << ':' << __LINE__ << ": "
-           << rang::fgB::red << "exchange of node ref list not implemented yet!"
-           << rang::fg::reset << '\n';
-  }
-
-  // Finally build the mesh
-  NodeValue<Rd> new_xr(*m_dispatched_connectivity);
-  for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
-    for (size_t r=0; r<recv_node_coord_by_proc[i_rank].size(); ++r) {
-      const NodeId& node_id = recv_node_id_correspondance_by_proc[i_rank][r];
-      new_xr[node_id] = recv_node_coord_by_proc[i_rank][r];
-    }
-  }
-
-  m_dispatched_mesh = std::make_shared<MeshType>(m_dispatched_connectivity, new_xr);
+  m_dispatched_connectivity = ConnectivityType::build(m_new_descriptor);
 }
 
-template MeshDispatcher<1>::MeshDispatcher(const MeshType& mesh);
-
-template MeshDispatcher<2>::MeshDispatcher(const MeshType& mesh);
-
-template MeshDispatcher<3>::MeshDispatcher(const MeshType& mesh);
+template ConnectivityDispatcher<1>::ConnectivityDispatcher(const ConnectivityType&);
+template ConnectivityDispatcher<2>::ConnectivityDispatcher(const ConnectivityType&);
+template ConnectivityDispatcher<3>::ConnectivityDispatcher(const ConnectivityType&);
diff --git a/src/mesh/ConnectivityDispatcher.hpp b/src/mesh/ConnectivityDispatcher.hpp
new file mode 100644
index 000000000..67556eef4
--- /dev/null
+++ b/src/mesh/ConnectivityDispatcher.hpp
@@ -0,0 +1,140 @@
+#ifndef CONNECTIVITY_DISPATCHER_HPP
+#define CONNECTIVITY_DISPATCHER_HPP
+
+#include <Mesh.hpp>
+#include <ItemValue.hpp>
+#include <ItemValueUtils.hpp>
+
+#include <unordered_map>
+
+template <int Dimension>
+class ConnectivityDispatcher
+{
+ public:
+  using ConnectivityType = Connectivity<Dimension>;
+
+ private:
+  const ConnectivityType& m_connectivity;
+
+  ConnectivityDescriptor m_new_descriptor;
+
+  std::shared_ptr<ConnectivityType> m_dispatched_connectivity;
+
+  CellValue<const int> m_cell_new_owner;
+  FaceValue<const int> m_face_new_owner;
+  NodeValue<const int> m_node_new_owner;
+
+  const std::vector<Array<const CellId>> m_cell_list_to_send_by_proc;
+#warning use a const sementic too
+  std::vector<Array<const NodeId>> m_node_list_to_send_by_proc;
+
+  Array<const int> m_nb_cell_to_send_by_proc;
+  Array<const int> m_nb_cell_to_recv_by_proc;
+
+  Array<const unsigned int> m_nb_node_to_recv_by_proc;
+
+  std::vector<Array<const NodeId>> m_recv_node_id_correspondance_by_proc;
+
+  std::vector<Array<int>> m_recv_cell_number_by_proc;
+  std::unordered_map<int, int> m_node_number_id_map;
+
+  CellValue<int> _getCellNewOwner();
+  FaceValue<int> _getFaceNewOwner();
+  NodeValue<int> _getNodeNewOwner();
+
+  std::vector<Array<const CellId>> _buildCellListToSend() const;
+
+  Array<int> _buildNbCellToSend();
+
+  void _dispatchFaces();
+ public:
+  std::shared_ptr<const ConnectivityType>
+  dispatchedConnectivity() const
+  {
+    return m_dispatched_connectivity;
+  }
+
+  PASTIS_INLINE
+  const CellValue<const int>& cellNewOwner() const
+  {
+    return m_cell_new_owner;
+  }
+
+  PASTIS_INLINE
+  const FaceValue<const int>& faceNewOwner() const
+  {
+    return m_face_new_owner;
+  }
+
+  PASTIS_INLINE
+  const NodeValue<const int>& nodeNewOwner() const
+  {
+    return m_node_new_owner;
+  }
+
+  template<typename DataType, typename ConnectivityPtr>
+  std::vector<Array<std::remove_const_t<DataType>>>
+  exchange(ItemValue<DataType, ItemType::cell, ConnectivityPtr> cell_value) const
+  {
+    using MutableDataType = std::remove_const_t<DataType>;
+    std::vector<Array<DataType>> cell_value_to_send_by_proc(parallel::size());
+    for (size_t i=0; i<parallel::size(); ++i) {
+      const Array<const CellId>& cell_list = m_cell_list_to_send_by_proc[i];
+      Array<MutableDataType> cell_value_list(cell_list.size());
+      parallel_for (cell_list.size(), PASTIS_LAMBDA(const CellId& cell_id) {
+          cell_value_list[cell_id] = cell_value[cell_list[cell_id]];
+        });
+      cell_value_to_send_by_proc[i] = cell_value_list;
+    }
+
+    std::vector<Array<MutableDataType>> recv_cell_value_by_proc(parallel::size());
+    for (size_t i=0; i<parallel::size(); ++i) {
+      recv_cell_value_by_proc[i] = Array<MutableDataType>(m_nb_cell_to_recv_by_proc[i]);
+    }
+
+    parallel::exchange(cell_value_to_send_by_proc, recv_cell_value_by_proc);
+    return recv_cell_value_by_proc;
+  }
+
+#warning Should write this function generically w.r. to the item type
+  template<typename DataType, typename ConnectivityPtr>
+  ItemValue<DataType, ItemType::node, ConnectivityPtr>
+  dispatch(ItemValue<DataType, ItemType::node, ConnectivityPtr> node_value) const
+  {
+    Assert(m_dispatched_connectivity.use_count()> 0,
+           "cannot dispatch quantity before connectivity");
+    using MutableDataType = std::remove_const_t<DataType>;
+    std::vector<Array<DataType>> node_value_to_send_by_proc(parallel::size());
+    for (size_t i=0; i<parallel::size(); ++i) {
+      const Array<const NodeId>& node_list = m_node_list_to_send_by_proc[i];
+      Array<MutableDataType> node_value_list(node_list.size());
+      parallel_for (node_list.size(), PASTIS_LAMBDA(const NodeId& node_id) {
+          node_value_list[node_id] = node_value[node_list[node_id]];
+        });
+      node_value_to_send_by_proc[i] = node_value_list;
+    }
+
+    std::vector<Array<MutableDataType>> recv_node_value_by_proc(parallel::size());
+    for (size_t i=0; i<parallel::size(); ++i) {
+      recv_node_value_by_proc[i] = Array<MutableDataType>(m_nb_node_to_recv_by_proc[i]);
+    }
+
+    parallel::exchange(node_value_to_send_by_proc, recv_node_value_by_proc);
+
+    NodeValue<MutableDataType> new_node_value(*m_dispatched_connectivity);
+    for (size_t i_rank=0; i_rank<parallel::size(); ++i_rank) {
+      for (size_t r=0; r<recv_node_value_by_proc[i_rank].size(); ++r) {
+        const NodeId& node_id = m_recv_node_id_correspondance_by_proc[i_rank][r];
+        new_node_value[node_id] = recv_node_value_by_proc[i_rank][r];
+      }
+    }
+    return new_node_value;
+  }
+
+  ConnectivityDispatcher(const ConnectivityType& mesh);
+  ConnectivityDispatcher(const ConnectivityDispatcher&) = delete;
+  ~ConnectivityDispatcher() = default;
+};
+
+
+#endif // CONNECTIVITY_DISPATCHER_HPP
diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp
index 29b6e4ebe..d19fc8d34 100644
--- a/src/mesh/GmshReader.cpp
+++ b/src/mesh/GmshReader.cpp
@@ -18,7 +18,7 @@
 #include <ArrayUtils.hpp>
 #include <ItemValueUtils.hpp>
 
-#include <MeshDispatcher.hpp>
+#include <ConnectivityDispatcher.hpp>
 
 #include <unordered_map>
 #include <map>
@@ -146,8 +146,12 @@ void GmshReader::_dispatch()
   }
   const MeshType& mesh = static_cast<const MeshType&>(*m_mesh);
 
-  MeshDispatcher<Dimension> dispatcher(mesh);
-  m_mesh = dispatcher.dispatchedMesh();
+  ConnectivityDispatcher<Dimension> dispatcher(mesh.connectivity());
+
+  std::shared_ptr dispatched_connectivity = dispatcher.dispatchedConnectivity();
+  NodeValue<Rd> dispatched_xr = dispatcher.dispatch(mesh.mutableXr());
+
+  m_mesh = std::make_shared<MeshType>(dispatched_connectivity, dispatched_xr);
 }
 
 
diff --git a/src/mesh/Mesh.hpp b/src/mesh/Mesh.hpp
index 3136f90ba..e111d1453 100644
--- a/src/mesh/Mesh.hpp
+++ b/src/mesh/Mesh.hpp
@@ -11,7 +11,7 @@
 struct IMesh
 {
   virtual size_t dimension() const = 0;
-  virtual CSRGraph cellToCellGraph() const = 0;
+  // virtual CSRGraph cellToCellGraph() const = 0;
   ~IMesh() = default;
 };
 
@@ -30,12 +30,6 @@ private:
   NodeValue<Rd> m_mutable_xr;
 
 public:
-  PASTIS_INLINE
-  CSRGraph cellToCellGraph() const final
-  {
-    return m_connectivity->cellToCellGraph();
-  }
-
   PASTIS_INLINE
   size_t dimension() const
   {
@@ -80,7 +74,7 @@ public:
   }
 
   PASTIS_INLINE
-  Mesh(const std::shared_ptr<Connectivity>& connectivity,
+  Mesh(const std::shared_ptr<const Connectivity>& connectivity,
        NodeValue<Rd>& xr)
       : m_connectivity{connectivity},
         m_xr{xr},
diff --git a/src/mesh/MeshDispatcher.hpp b/src/mesh/MeshDispatcher.hpp
deleted file mode 100644
index 878a5a707..000000000
--- a/src/mesh/MeshDispatcher.hpp
+++ /dev/null
@@ -1,112 +0,0 @@
-#ifndef MESH_DISPATCHER_HPP
-#define MESH_DISPATCHER_HPP
-
-#include <Mesh.hpp>
-#include <ItemValue.hpp>
-#include <ItemValueUtils.hpp>
-
-#include <unordered_map>
-
-#warning use MeshType instead of dimension as template parameter?
-template <int Dimension>
-class MeshDispatcher
-{
- public:
-  using ConnectivityType = Connectivity<Dimension>;
-  using MeshType = Mesh<ConnectivityType>;
-
- private:
-  const ConnectivityType& m_connectivity;
-
-  ConnectivityDescriptor m_new_descriptor;
-
-  [[deprecated]]
-  std::shared_ptr<MeshType> m_dispatched_mesh;
-
-  std::shared_ptr<ConnectivityType> m_dispatched_connectivity;
-
-  CellValue<const int> m_cell_new_owner;
-  FaceValue<const int> m_face_new_owner;
-  NodeValue<const int> m_node_new_owner;
-
-  using CellListToSendByProc = std::vector<Array<const CellId>>;
-  const CellListToSendByProc m_cell_list_to_send_by_proc;
-
-  Array<int> m_nb_cell_to_send_by_proc;
-  Array<int> m_nb_cell_to_recv_by_proc;
-
-  std::vector<Array<int>> m_recv_cell_number_by_proc;
-  std::unordered_map<int, int> m_node_number_id_map;
-
-  CellValue<int> _getCellNewOwner();
-  FaceValue<int> _getFaceNewOwner();
-  NodeValue<int> _getNodeNewOwner();
-
-  const CellListToSendByProc _buildCellListToSend() const;
-
-  Array<int> _buildNbCellToSend();
-
-  void _dispatchFaces();
- public:
-
-  [[deprecated]]
-  std::shared_ptr<MeshType> dispatchedMesh() const
-  {
-    return m_dispatched_mesh;
-  }
-
-  const std::shared_ptr<ConnectivityType>& dispatchedConnectivity() const
-  {
-    return m_dispatched_connectivity;
-  }
-
-  PASTIS_INLINE
-  const CellValue<const int>& cellNewOwner() const
-  {
-    return m_cell_new_owner;
-  }
-
-  PASTIS_INLINE
-  const FaceValue<const int>& faceNewOwner() const
-  {
-    return m_face_new_owner;
-  }
-
-  PASTIS_INLINE
-  const NodeValue<const int>& nodeNewOwner() const
-  {
-    return m_node_new_owner;
-  }
-
-  template<typename DataType, typename ConnectivityPtr>
-  std::vector<Array<std::remove_const_t<DataType>>>
-  exchange(ItemValue<DataType, ItemType::cell, ConnectivityPtr> cell_value) const
-  {
-    using MutableDataType = std::remove_const_t<DataType>;
-    std::vector<Array<DataType>> cell_value_to_send_by_proc(parallel::size());
-    for (size_t i=0; i<parallel::size(); ++i) {
-      const Array<const CellId>& cell_list = m_cell_list_to_send_by_proc[i];
-      Array<MutableDataType> cell_value_list(cell_list.size());
-      parallel_for (cell_list.size(), PASTIS_LAMBDA(const CellId& cell_id) {
-          cell_value_list[cell_id] = cell_value[cell_list[cell_id]];
-        });
-      cell_value_to_send_by_proc[i] = cell_value_list;
-    }
-
-    std::vector<Array<MutableDataType>> recv_cell_value_by_proc(parallel::size());
-    for (size_t i=0; i<parallel::size(); ++i) {
-      recv_cell_value_by_proc[i] = Array<MutableDataType>(m_nb_cell_to_recv_by_proc[i]);
-    }
-
-    parallel::exchange(cell_value_to_send_by_proc, recv_cell_value_by_proc);
-    return recv_cell_value_by_proc;
-  }
-
-  MeshDispatcher(const MeshType& mesh);
-
-  MeshDispatcher(const MeshDispatcher&) = delete;
-  ~MeshDispatcher() = default;
-};
-
-
-#endif // MESH_DISPATCHER_HPP
-- 
GitLab