From d8d7d0f6b9b644bd44ef6aaaecc9083e408a342f Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Wed, 22 Jul 2020 14:30:34 +0200
Subject: [PATCH] Continue refactoring of data mapper

This is related to connectivity <-> diamond-dual connectivity mapping.
---
 ...ityToDiamondDualConnectivityDataMapper.hpp | 73 +++----------------
 src/mesh/DiamondDualConnectivityBuilder.cpp   | 64 +++++++++++++++-
 src/mesh/DiamondDualConnectivityBuilder.hpp   |  5 ++
 src/mesh/ItemIdToItemIdMap.hpp                | 30 ++++++++
 4 files changed, 109 insertions(+), 63 deletions(-)
 create mode 100644 src/mesh/ItemIdToItemIdMap.hpp

diff --git a/src/mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp b/src/mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp
index 577bad4c4..8d35d2ff9 100644
--- a/src/mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp
+++ b/src/mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp
@@ -2,6 +2,7 @@
 #define CONNECTIVITY_TO_DIAMOND_DUAL_CONNECTIVITY_DATA_MAPPER_HPP
 
 #include <mesh/Connectivity.hpp>
+#include <mesh/ItemIdToItemIdMap.hpp>
 #include <mesh/ItemValue.hpp>
 #include <utils/Array.hpp>
 #include <utils/PugsAssert.hpp>
@@ -23,13 +24,8 @@ class ConnectivityToDiamondDualConnectivityDataMapper : public IConnectivityToDi
   const IConnectivity* m_primal_connectivity;
   const IConnectivity* m_dual_connectivity;
 
-  using NodeIdToNodeIdMap = Array<std::pair<NodeId, NodeId>>;
   NodeIdToNodeIdMap m_primal_node_to_dual_node_map;
-
-  using CellIdToNodeIdMap = Array<std::pair<CellId, NodeId>>;
   CellIdToNodeIdMap m_primal_cell_to_dual_node_map;
-
-  using FaceIdToCellIdMap = Array<std::pair<FaceId, CellId>>;
   FaceIdToCellIdMap m_primal_face_to_dual_cell_map;
 
  public:
@@ -142,63 +138,16 @@ class ConnectivityToDiamondDualConnectivityDataMapper : public IConnectivityToDi
   }
 
   ConnectivityToDiamondDualConnectivityDataMapper(const Connectivity<Dimension>& primal_connectivity,
-                                                  const Connectivity<Dimension>& dual_connectivity)
-    : m_primal_connectivity{&primal_connectivity}, m_dual_connectivity{&dual_connectivity}
-  {
-    if constexpr (Dimension == 1) {
-      const auto& node_to_cell_matrix = primal_connectivity.nodeToCellMatrix();
-
-      NodeId dual_node_id            = 0;
-      m_primal_node_to_dual_node_map = [&]() {
-        std::vector<std::pair<NodeId, NodeId>> primal_node_to_dual_node_vector;
-        for (NodeId primal_node_id = 0; primal_node_id < primal_connectivity.numberOfNodes(); ++primal_node_id) {
-          if (node_to_cell_matrix[primal_node_id].size() == 1) {
-            primal_node_to_dual_node_vector.push_back(std::make_pair(primal_node_id, dual_node_id++));
-          }
-        }
-        return convert_to_array(primal_node_to_dual_node_vector);
-      }();
-
-      m_primal_cell_to_dual_node_map = [&]() {
-        CellIdToNodeIdMap primal_cell_to_dual_node_map{primal_connectivity.numberOfCells()};
-        for (CellId primal_cell_id = 0; primal_cell_id < primal_cell_to_dual_node_map.size(); ++primal_cell_id) {
-          primal_cell_to_dual_node_map[primal_cell_id] = std::make_pair(primal_cell_id, dual_node_id++);
-        }
-        return primal_cell_to_dual_node_map;
-      }();
-
-    } else {
-      m_primal_node_to_dual_node_map = [&]() {
-        NodeIdToNodeIdMap primal_node_to_dual_node_map{primal_connectivity.numberOfNodes()};
-        for (NodeId primal_node_id = 0; primal_node_id < primal_node_to_dual_node_map.size(); ++primal_node_id) {
-          const NodeId dual_node_id = primal_node_id;
-
-          primal_node_to_dual_node_map[primal_node_id] = std::make_pair(primal_node_id, dual_node_id);
-        }
-        return primal_node_to_dual_node_map;
-      }();
-
-      m_primal_cell_to_dual_node_map = [&]() {
-        CellIdToNodeIdMap primal_cell_to_dual_node_map{primal_connectivity.numberOfCells()};
-        NodeId dual_node_id = m_primal_node_to_dual_node_map.size();
-        for (CellId primal_cell_id = 0; primal_cell_id < primal_cell_to_dual_node_map.size(); ++primal_cell_id) {
-          primal_cell_to_dual_node_map[primal_cell_id] = std::make_pair(primal_cell_id, dual_node_id++);
-        }
-        return primal_cell_to_dual_node_map;
-      }();
-    }
-
-    m_primal_face_to_dual_cell_map = [&]() {
-      FaceIdToCellIdMap primal_face_to_dual_cell_map{primal_connectivity.numberOfFaces()};
-      for (size_t id = 0; id < primal_face_to_dual_cell_map.size(); ++id) {
-        const CellId dual_cell_id   = id;
-        const FaceId primal_face_id = id;
-
-        primal_face_to_dual_cell_map[id] = std::make_pair(primal_face_id, dual_cell_id);
-      }
-      return primal_face_to_dual_cell_map;
-    }();
-  }
+                                                  const Connectivity<Dimension>& dual_connectivity,
+                                                  const NodeIdToNodeIdMap& primal_node_to_dual_node_map,
+                                                  const CellIdToNodeIdMap& primal_cell_to_dual_node_map,
+                                                  const FaceIdToCellIdMap& primal_face_to_dual_cell_map)
+    : m_primal_connectivity{&primal_connectivity},
+      m_dual_connectivity{&dual_connectivity},
+      m_primal_node_to_dual_node_map{primal_node_to_dual_node_map},
+      m_primal_cell_to_dual_node_map{primal_cell_to_dual_node_map},
+      m_primal_face_to_dual_cell_map{primal_face_to_dual_cell_map}
+  {}
 };
 
 #endif   // CONNECTIVITY_TO_DIAMOND_DUAL_CONNECTIVITY_DATA_MAPPER_HPP
diff --git a/src/mesh/DiamondDualConnectivityBuilder.cpp b/src/mesh/DiamondDualConnectivityBuilder.cpp
index 44606bc0e..32c9a140b 100644
--- a/src/mesh/DiamondDualConnectivityBuilder.cpp
+++ b/src/mesh/DiamondDualConnectivityBuilder.cpp
@@ -8,8 +8,11 @@
 #include <mesh/Mesh.hpp>
 #include <mesh/RefId.hpp>
 #include <utils/Array.hpp>
+#include <utils/ArrayUtils.hpp>
 #include <utils/Messenger.hpp>
 
+#include <vector>
+
 template <size_t Dimension>
 void
 DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connectivity<Dimension>& primal_connectivity,
@@ -483,10 +486,69 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit
 
   m_connectivity = ConnectivityType::build(diamond_descriptor);
 
+  {
+    if constexpr (Dimension == 1) {
+      const auto& node_to_cell_matrix = primal_connectivity.nodeToCellMatrix();
+
+      NodeId dual_node_id            = 0;
+      m_primal_node_to_dual_node_map = [&]() {
+        std::vector<std::pair<NodeId, NodeId>> primal_node_to_dual_node_vector;
+        for (NodeId primal_node_id = 0; primal_node_id < primal_connectivity.numberOfNodes(); ++primal_node_id) {
+          if (node_to_cell_matrix[primal_node_id].size() == 1) {
+            primal_node_to_dual_node_vector.push_back(std::make_pair(primal_node_id, dual_node_id++));
+          }
+        }
+        return convert_to_array(primal_node_to_dual_node_vector);
+      }();
+
+      m_primal_cell_to_dual_node_map = [&]() {
+        CellIdToNodeIdMap primal_cell_to_dual_node_map{primal_connectivity.numberOfCells()};
+        for (CellId primal_cell_id = 0; primal_cell_id < primal_cell_to_dual_node_map.size(); ++primal_cell_id) {
+          primal_cell_to_dual_node_map[primal_cell_id] = std::make_pair(primal_cell_id, dual_node_id++);
+        }
+        return primal_cell_to_dual_node_map;
+      }();
+
+    } else {
+      m_primal_node_to_dual_node_map = [&]() {
+        NodeIdToNodeIdMap primal_node_to_dual_node_map{primal_connectivity.numberOfNodes()};
+        for (NodeId primal_node_id = 0; primal_node_id < primal_node_to_dual_node_map.size(); ++primal_node_id) {
+          const NodeId dual_node_id = primal_node_id;
+
+          primal_node_to_dual_node_map[primal_node_id] = std::make_pair(primal_node_id, dual_node_id);
+        }
+        return primal_node_to_dual_node_map;
+      }();
+
+      m_primal_cell_to_dual_node_map = [&]() {
+        CellIdToNodeIdMap primal_cell_to_dual_node_map{primal_connectivity.numberOfCells()};
+        NodeId dual_node_id = m_primal_node_to_dual_node_map.size();
+        for (CellId primal_cell_id = 0; primal_cell_id < primal_cell_to_dual_node_map.size(); ++primal_cell_id) {
+          primal_cell_to_dual_node_map[primal_cell_id] = std::make_pair(primal_cell_id, dual_node_id++);
+        }
+        return primal_cell_to_dual_node_map;
+      }();
+    }
+
+    m_primal_face_to_dual_cell_map = [&]() {
+      FaceIdToCellIdMap primal_face_to_dual_cell_map{primal_connectivity.numberOfFaces()};
+      for (size_t id = 0; id < primal_face_to_dual_cell_map.size(); ++id) {
+        const CellId dual_cell_id   = id;
+        const FaceId primal_face_id = id;
+
+        primal_face_to_dual_cell_map[id] = std::make_pair(primal_face_id, dual_cell_id);
+      }
+      return primal_face_to_dual_cell_map;
+    }();
+  }
+
   m_mapper =
     std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(primal_connectivity,
                                                                                  dynamic_cast<const ConnectivityType&>(
-                                                                                   *m_connectivity));
+                                                                                   *m_connectivity),
+                                                                                 m_primal_node_to_dual_node_map,
+                                                                                 m_primal_cell_to_dual_node_map,
+                                                                                 m_primal_face_to_dual_cell_map);
 }
 
 DiamondDualConnectivityBuilder::DiamondDualConnectivityBuilder(const IConnectivity& connectivity)
diff --git a/src/mesh/DiamondDualConnectivityBuilder.hpp b/src/mesh/DiamondDualConnectivityBuilder.hpp
index bed1e9daf..36b120811 100644
--- a/src/mesh/DiamondDualConnectivityBuilder.hpp
+++ b/src/mesh/DiamondDualConnectivityBuilder.hpp
@@ -2,6 +2,7 @@
 #define DIAMOND_DUAL_CONNECTIVITY_BUILDER_HPP
 
 #include <mesh/ConnectivityBuilderBase.hpp>
+#include <mesh/ItemIdToItemIdMap.hpp>
 
 #include <memory>
 
@@ -14,6 +15,10 @@ class IConnectivityToDiamondDualConnectivityDataMapper;
 class DiamondDualConnectivityBuilder : public ConnectivityBuilderBase
 {
  private:
+  NodeIdToNodeIdMap m_primal_node_to_dual_node_map;
+  CellIdToNodeIdMap m_primal_cell_to_dual_node_map;
+  FaceIdToCellIdMap m_primal_face_to_dual_cell_map;
+
   std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper> m_mapper;
 
   template <size_t Dimension>
diff --git a/src/mesh/ItemIdToItemIdMap.hpp b/src/mesh/ItemIdToItemIdMap.hpp
new file mode 100644
index 000000000..0e92eb13c
--- /dev/null
+++ b/src/mesh/ItemIdToItemIdMap.hpp
@@ -0,0 +1,30 @@
+#ifndef ITEM_ID_TO_ITEM_ID_MAP_HPP
+#define ITEM_ID_TO_ITEM_ID_MAP_HPP
+
+#include <mesh/ItemId.hpp>
+#include <utils/Array.hpp>
+
+template <ItemType type1, ItemType type2>
+using ItemIdToItemIdMap = Array<std::pair<ItemIdT<type1>, ItemIdT<type2>>>;
+
+using NodeIdToNodeIdMap = ItemIdToItemIdMap<ItemType::node, ItemType::node>;
+using NodeIdToEdgeIdMap = ItemIdToItemIdMap<ItemType::node, ItemType::edge>;
+using NodeIdToFaceIdMap = ItemIdToItemIdMap<ItemType::node, ItemType::face>;
+using NodeIdToCellIdMap = ItemIdToItemIdMap<ItemType::node, ItemType::cell>;
+
+using EdgeIdToNodeIdMap = ItemIdToItemIdMap<ItemType::edge, ItemType::node>;
+using EdgeIdToEdgeIdMap = ItemIdToItemIdMap<ItemType::edge, ItemType::edge>;
+using EdgeIdToFaceIdMap = ItemIdToItemIdMap<ItemType::edge, ItemType::face>;
+using EdgeIdToCellIdMap = ItemIdToItemIdMap<ItemType::edge, ItemType::cell>;
+
+using FaceIdToNodeIdMap = ItemIdToItemIdMap<ItemType::face, ItemType::node>;
+using FaceIdToEdgeIdMap = ItemIdToItemIdMap<ItemType::face, ItemType::edge>;
+using FaceIdToFaceIdMap = ItemIdToItemIdMap<ItemType::face, ItemType::face>;
+using FaceIdToCellIdMap = ItemIdToItemIdMap<ItemType::face, ItemType::cell>;
+
+using CellIdToNodeIdMap = ItemIdToItemIdMap<ItemType::cell, ItemType::node>;
+using CellIdToEdgeIdMap = ItemIdToItemIdMap<ItemType::cell, ItemType::edge>;
+using CellIdToFaceIdMap = ItemIdToItemIdMap<ItemType::cell, ItemType::face>;
+using CellIdToCellIdMap = ItemIdToItemIdMap<ItemType::cell, ItemType::cell>;
+
+#endif   // ITEM_ID_TO_ITEM_ID_MAP_HPP
-- 
GitLab