From 86b9863d023e91cb8b85475f9eb33c0754e8160c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Tue, 11 Jan 2022 16:58:12 +0100
Subject: [PATCH] Separate and factorize dual 1d mesh builder

It is now shared in 1d with median and diamond dual meshes
---
 src/language/modules/MeshModule.cpp | 12 +++---
 src/mesh/CMakeLists.txt             |  1 +
 src/mesh/DiamondDualMeshBuilder.cpp | 22 +++++------
 src/mesh/DiamondDualMeshBuilder.hpp |  4 +-
 src/mesh/Dual1DMeshBuilder.cpp      | 50 ++++++++++++++++++++++++
 src/mesh/Dual1DMeshBuilder.hpp      | 20 ++++++++++
 src/mesh/DualMeshManager.cpp        | 60 +++++++++++++++++++++--------
 src/mesh/DualMeshManager.hpp        |  8 ++--
 src/mesh/MedianDualMeshBuilder.cpp  | 17 +++-----
 src/mesh/MedianDualMeshBuilder.hpp  |  4 +-
 tests/test_CellIntegrator.cpp       |  2 +-
 tests/test_DualMeshManager.cpp      | 16 ++++----
 tests/test_EdgeIntegrator.cpp       |  2 +-
 tests/test_FaceIntegrator.cpp       |  2 +-
 14 files changed, 154 insertions(+), 66 deletions(-)
 create mode 100644 src/mesh/Dual1DMeshBuilder.cpp
 create mode 100644 src/mesh/Dual1DMeshBuilder.hpp

diff --git a/src/language/modules/MeshModule.cpp b/src/language/modules/MeshModule.cpp
index bf2f0f0af..153c1be11 100644
--- a/src/language/modules/MeshModule.cpp
+++ b/src/language/modules/MeshModule.cpp
@@ -146,19 +146,19 @@ MeshModule::MeshModule()
                                   using MeshType = Mesh<Connectivity<1>>;
 
                                   std::shared_ptr p_mesh = std::dynamic_pointer_cast<const MeshType>(i_mesh);
-                                  return DualMeshManager::instance().getDiamondDualMesh(p_mesh);
+                                  return DualMeshManager::instance().getDiamondDualMesh(*p_mesh);
                                 }
                                 case 2: {
                                   using MeshType = Mesh<Connectivity<2>>;
 
                                   std::shared_ptr p_mesh = std::dynamic_pointer_cast<const MeshType>(i_mesh);
-                                  return DualMeshManager::instance().getDiamondDualMesh(p_mesh);
+                                  return DualMeshManager::instance().getDiamondDualMesh(*p_mesh);
                                 }
                                 case 3: {
                                   using MeshType = Mesh<Connectivity<3>>;
 
                                   std::shared_ptr p_mesh = std::dynamic_pointer_cast<const MeshType>(i_mesh);
-                                  return DualMeshManager::instance().getDiamondDualMesh(p_mesh);
+                                  return DualMeshManager::instance().getDiamondDualMesh(*p_mesh);
                                 }
                                 default: {
                                   throw UnexpectedError("invalid dimension");
@@ -178,19 +178,19 @@ MeshModule::MeshModule()
                                   using MeshType = Mesh<Connectivity<1>>;
 
                                   std::shared_ptr p_mesh = std::dynamic_pointer_cast<const MeshType>(i_mesh);
-                                  return DualMeshManager::instance().getMedianDualMesh(p_mesh);
+                                  return DualMeshManager::instance().getMedianDualMesh(*p_mesh);
                                 }
                                 case 2: {
                                   using MeshType = Mesh<Connectivity<2>>;
 
                                   std::shared_ptr p_mesh = std::dynamic_pointer_cast<const MeshType>(i_mesh);
-                                  return DualMeshManager::instance().getMedianDualMesh(p_mesh);
+                                  return DualMeshManager::instance().getMedianDualMesh(*p_mesh);
                                 }
                                 case 3: {
                                   using MeshType = Mesh<Connectivity<3>>;
 
                                   std::shared_ptr p_mesh = std::dynamic_pointer_cast<const MeshType>(i_mesh);
-                                  return DualMeshManager::instance().getMedianDualMesh(p_mesh);
+                                  return DualMeshManager::instance().getMedianDualMesh(*p_mesh);
                                 }
                                 default: {
                                   throw UnexpectedError("invalid dimension");
diff --git a/src/mesh/CMakeLists.txt b/src/mesh/CMakeLists.txt
index b85297c51..7634b1134 100644
--- a/src/mesh/CMakeLists.txt
+++ b/src/mesh/CMakeLists.txt
@@ -10,6 +10,7 @@ add_library(
   DiamondDualConnectivityBuilder.cpp
   DiamondDualMeshBuilder.cpp
   Dual1DConnectivityBuilder.cpp
+  Dual1DMeshBuilder.cpp
   DualConnectivityManager.cpp
   DualMeshManager.cpp
   GmshReader.cpp
diff --git a/src/mesh/DiamondDualMeshBuilder.cpp b/src/mesh/DiamondDualMeshBuilder.cpp
index 5db07c20f..6f4c141cd 100644
--- a/src/mesh/DiamondDualMeshBuilder.cpp
+++ b/src/mesh/DiamondDualMeshBuilder.cpp
@@ -7,17 +7,17 @@
 #include <mesh/MeshData.hpp>
 #include <mesh/MeshDataManager.hpp>
 #include <mesh/PrimalToDiamondDualConnectivityDataMapper.hpp>
-#include <mesh/PrimalToDual1DConnectivityDataMapper.hpp>
 
 template <size_t Dimension>
 void
-DiamondDualMeshBuilder::_buildDualDiamondMeshFrom(const std::shared_ptr<const IMesh>& p_i_mesh)
+DiamondDualMeshBuilder::_buildDualDiamondMeshFrom(const IMesh& i_mesh)
 {
+  static_assert(Dimension > 1);
+
   using ConnectivityType = Connectivity<Dimension>;
   using MeshType         = Mesh<Connectivity<Dimension>>;
 
-  std::shared_ptr p_primal_mesh = std::dynamic_pointer_cast<const MeshType>(p_i_mesh);
-  const MeshType& primal_mesh   = *p_primal_mesh;
+  const MeshType& primal_mesh = dynamic_cast<const MeshType&>(i_mesh);
 
   DualConnectivityManager& manager = DualConnectivityManager::instance();
 
@@ -40,25 +40,21 @@ DiamondDualMeshBuilder::_buildDualDiamondMeshFrom(const std::shared_ptr<const IM
   m_mesh = std::make_shared<MeshType>(p_diamond_connectivity, diamond_xr);
 }
 
-DiamondDualMeshBuilder::DiamondDualMeshBuilder(const std::shared_ptr<const IMesh>& p_mesh)
+DiamondDualMeshBuilder::DiamondDualMeshBuilder(const IMesh& i_mesh)
 {
   std::cout << "building DiamondDualMesh\n";
 
-  switch (p_mesh->dimension()) {
-  case 1: {
-    this->_buildDualDiamondMeshFrom<1>(p_mesh);
-    break;
-  }
+  switch (i_mesh.dimension()) {
   case 2: {
-    this->_buildDualDiamondMeshFrom<2>(p_mesh);
+    this->_buildDualDiamondMeshFrom<2>(i_mesh);
     break;
   }
   case 3: {
-    this->_buildDualDiamondMeshFrom<3>(p_mesh);
+    this->_buildDualDiamondMeshFrom<3>(i_mesh);
     break;
   }
   default: {
-    throw UnexpectedError("invalid mesh dimension: " + std::to_string(p_mesh->dimension()));
+    throw UnexpectedError("invalid mesh dimension: " + std::to_string(i_mesh.dimension()));
   }
   }
 }
diff --git a/src/mesh/DiamondDualMeshBuilder.hpp b/src/mesh/DiamondDualMeshBuilder.hpp
index a380bcbba..1dc670638 100644
--- a/src/mesh/DiamondDualMeshBuilder.hpp
+++ b/src/mesh/DiamondDualMeshBuilder.hpp
@@ -9,10 +9,10 @@ class DiamondDualMeshBuilder : public MeshBuilderBase
 {
  private:
   template <size_t Dimension>
-  void _buildDualDiamondMeshFrom(const std::shared_ptr<const IMesh>&);
+  void _buildDualDiamondMeshFrom(const IMesh&);
 
   friend class DualMeshManager;
-  DiamondDualMeshBuilder(const std::shared_ptr<const IMesh>&);
+  DiamondDualMeshBuilder(const IMesh&);
 
  public:
   ~DiamondDualMeshBuilder() = default;
diff --git a/src/mesh/Dual1DMeshBuilder.cpp b/src/mesh/Dual1DMeshBuilder.cpp
new file mode 100644
index 000000000..0fd998478
--- /dev/null
+++ b/src/mesh/Dual1DMeshBuilder.cpp
@@ -0,0 +1,50 @@
+#include <mesh/Dual1DMeshBuilder.hpp>
+
+#include <mesh/Connectivity.hpp>
+#include <mesh/DualConnectivityManager.hpp>
+#include <mesh/ItemValueUtils.hpp>
+#include <mesh/Mesh.hpp>
+#include <mesh/MeshData.hpp>
+#include <mesh/MeshDataManager.hpp>
+#include <mesh/PrimalToDiamondDualConnectivityDataMapper.hpp>
+#include <mesh/PrimalToDual1DConnectivityDataMapper.hpp>
+
+void
+Dual1DMeshBuilder::_buildDual1DMeshFrom(const IMesh& i_mesh)
+{
+  using ConnectivityType = Connectivity<1>;
+  using MeshType         = Mesh<Connectivity<1>>;
+
+  const MeshType& primal_mesh = dynamic_cast<const MeshType&>(i_mesh);
+
+  DualConnectivityManager& manager = DualConnectivityManager::instance();
+
+  std::shared_ptr<const ConnectivityType> p_dual_connectivity =
+    manager.getDiamondDualConnectivity(primal_mesh.connectivity());
+
+  const ConnectivityType& dual_connectivity = *p_dual_connectivity;
+
+  const NodeValue<const TinyVector<1>> primal_xr = primal_mesh.xr();
+
+  MeshData<1>& primal_mesh_data                  = MeshDataManager::instance().getMeshData(primal_mesh);
+  const CellValue<const TinyVector<1>> primal_xj = primal_mesh_data.xj();
+
+  std::shared_ptr primal_to_dual_1d_connectivity_data_mapper =
+    manager.getPrimalToDual1DConnectivityDataMapper(primal_mesh.connectivity());
+
+  NodeValue<TinyVector<1>> dual_xr{dual_connectivity};
+  primal_to_dual_1d_connectivity_data_mapper->toDualNode(primal_xr, primal_xj, dual_xr);
+
+  m_mesh = std::make_shared<MeshType>(p_dual_connectivity, dual_xr);
+}
+
+Dual1DMeshBuilder::Dual1DMeshBuilder(const IMesh& i_mesh)
+{
+  std::cout << "building Dual1DMesh\n";
+
+  if (i_mesh.dimension() == 1) {
+    this->_buildDual1DMeshFrom(i_mesh);
+  } else {
+    throw UnexpectedError("invalid mesh dimension: " + std::to_string(i_mesh.dimension()));
+  }
+}
diff --git a/src/mesh/Dual1DMeshBuilder.hpp b/src/mesh/Dual1DMeshBuilder.hpp
new file mode 100644
index 000000000..d2b271aee
--- /dev/null
+++ b/src/mesh/Dual1DMeshBuilder.hpp
@@ -0,0 +1,20 @@
+#ifndef DUAL_1D_MESH_BUILDER_HPP
+#define DUAL_1D_MESH_BUILDER_HPP
+
+#include <mesh/MeshBuilderBase.hpp>
+
+#include <memory>
+
+class Dual1DMeshBuilder : public MeshBuilderBase
+{
+ private:
+  void _buildDual1DMeshFrom(const IMesh&);
+
+  friend class DualMeshManager;
+  Dual1DMeshBuilder(const IMesh&);
+
+ public:
+  ~Dual1DMeshBuilder() = default;
+};
+
+#endif   // DUAL_1D_MESH_BUILDER_HPP
diff --git a/src/mesh/DualMeshManager.cpp b/src/mesh/DualMeshManager.cpp
index 11f09ff21..86384b6ad 100644
--- a/src/mesh/DualMeshManager.cpp
+++ b/src/mesh/DualMeshManager.cpp
@@ -2,6 +2,7 @@
 
 #include <mesh/Connectivity.hpp>
 #include <mesh/DiamondDualMeshBuilder.hpp>
+#include <mesh/Dual1DMeshBuilder.hpp>
 #include <mesh/MedianDualMeshBuilder.hpp>
 #include <mesh/Mesh.hpp>
 #include <utils/Exceptions.hpp>
@@ -55,11 +56,35 @@ DualMeshManager::deleteMesh(const IMesh* p_mesh)
   } while (has_removed);
 }
 
+std::shared_ptr<const Mesh<Connectivity<1>>>
+DualMeshManager::getDual1DMesh(const Mesh<Connectivity<1>>& mesh)
+{
+  const IMesh* p_mesh = &mesh;
+
+  auto key = std::make_pair(DualMeshType::Dual1D, p_mesh);
+  if (auto i_mesh_data = m_mesh_to_dual_mesh_map.find(key); i_mesh_data != m_mesh_to_dual_mesh_map.end()) {
+    return std::dynamic_pointer_cast<const Mesh<Connectivity<1>>>(i_mesh_data->second);
+  } else {
+    Dual1DMeshBuilder builder{mesh};
+
+    m_mesh_to_dual_mesh_map[key] = builder.mesh();
+    return std::dynamic_pointer_cast<const Mesh<Connectivity<1>>>(builder.mesh());
+  }
+}
+
+template <>
+std::shared_ptr<const Mesh<Connectivity<1>>>
+DualMeshManager::getMedianDualMesh(const Mesh<Connectivity<1>>& mesh)
+{
+  return this->getDual1DMesh(mesh);
+}
+
 template <size_t Dimension>
 std::shared_ptr<const Mesh<Connectivity<Dimension>>>
-DualMeshManager::getMedianDualMesh(std::shared_ptr<const Mesh<Connectivity<Dimension>>> mesh)
+DualMeshManager::getMedianDualMesh(const Mesh<Connectivity<Dimension>>& mesh)
 {
-  const IMesh* p_mesh = mesh.get();
+  static_assert(Dimension > 1);
+  const IMesh* p_mesh = &mesh;
 
   auto key = std::make_pair(DualMeshType::Median, p_mesh);
   if (auto i_mesh_data = m_mesh_to_dual_mesh_map.find(key); i_mesh_data != m_mesh_to_dual_mesh_map.end()) {
@@ -72,11 +97,23 @@ DualMeshManager::getMedianDualMesh(std::shared_ptr<const Mesh<Connectivity<Dimen
   }
 }
 
+template std::shared_ptr<const Mesh<Connectivity<2>>> DualMeshManager::getMedianDualMesh(const Mesh<Connectivity<2>>&);
+template std::shared_ptr<const Mesh<Connectivity<3>>> DualMeshManager::getMedianDualMesh(const Mesh<Connectivity<3>>&);
+
+template <>
+std::shared_ptr<const Mesh<Connectivity<1>>>
+DualMeshManager::getDiamondDualMesh(const Mesh<Connectivity<1>>& mesh)
+{
+  return this->getDual1DMesh(mesh);
+}
+
 template <size_t Dimension>
 std::shared_ptr<const Mesh<Connectivity<Dimension>>>
-DualMeshManager::getDiamondDualMesh(std::shared_ptr<const Mesh<Connectivity<Dimension>>> mesh)
+DualMeshManager::getDiamondDualMesh(const Mesh<Connectivity<Dimension>>& mesh)
 {
-  const IMesh* p_mesh = mesh.get();
+  static_assert(Dimension > 1);
+
+  const IMesh* p_mesh = &mesh;
 
   auto key = std::make_pair(DualMeshType::Diamond, p_mesh);
   if (auto i_mesh_data = m_mesh_to_dual_mesh_map.find(key); i_mesh_data != m_mesh_to_dual_mesh_map.end()) {
@@ -89,16 +126,5 @@ DualMeshManager::getDiamondDualMesh(std::shared_ptr<const Mesh<Connectivity<Dime
   }
 }
 
-template std::shared_ptr<const Mesh<Connectivity<1>>> DualMeshManager::getMedianDualMesh(
-  std::shared_ptr<const Mesh<Connectivity<1>>>);
-template std::shared_ptr<const Mesh<Connectivity<2>>> DualMeshManager::getMedianDualMesh(
-  std::shared_ptr<const Mesh<Connectivity<2>>>);
-template std::shared_ptr<const Mesh<Connectivity<3>>> DualMeshManager::getMedianDualMesh(
-  std::shared_ptr<const Mesh<Connectivity<3>>>);
-
-template std::shared_ptr<const Mesh<Connectivity<1>>> DualMeshManager::getDiamondDualMesh(
-  std::shared_ptr<const Mesh<Connectivity<1>>>);
-template std::shared_ptr<const Mesh<Connectivity<2>>> DualMeshManager::getDiamondDualMesh(
-  std::shared_ptr<const Mesh<Connectivity<2>>>);
-template std::shared_ptr<const Mesh<Connectivity<3>>> DualMeshManager::getDiamondDualMesh(
-  std::shared_ptr<const Mesh<Connectivity<3>>>);
+template std::shared_ptr<const Mesh<Connectivity<2>>> DualMeshManager::getDiamondDualMesh(const Mesh<Connectivity<2>>&);
+template std::shared_ptr<const Mesh<Connectivity<3>>> DualMeshManager::getDiamondDualMesh(const Mesh<Connectivity<3>>&);
diff --git a/src/mesh/DualMeshManager.hpp b/src/mesh/DualMeshManager.hpp
index 77c14d5e4..7b6358b70 100644
--- a/src/mesh/DualMeshManager.hpp
+++ b/src/mesh/DualMeshManager.hpp
@@ -52,13 +52,13 @@ class DualMeshManager
 
   void deleteMesh(const IMesh*);
 
+  std::shared_ptr<const Mesh<Connectivity<1>>> getDual1DMesh(const Mesh<Connectivity<1>>&);
+
   template <size_t Dimension>
-  std::shared_ptr<const Mesh<Connectivity<Dimension>>> getDiamondDualMesh(
-    std::shared_ptr<const Mesh<Connectivity<Dimension>>>);
+  std::shared_ptr<const Mesh<Connectivity<Dimension>>> getDiamondDualMesh(const Mesh<Connectivity<Dimension>>&);
 
   template <size_t Dimension>
-  std::shared_ptr<const Mesh<Connectivity<Dimension>>> getMedianDualMesh(
-    std::shared_ptr<const Mesh<Connectivity<Dimension>>>);
+  std::shared_ptr<const Mesh<Connectivity<Dimension>>> getMedianDualMesh(const Mesh<Connectivity<Dimension>>&);
 };
 
 #endif   // DUAL_MESH_MANAGER_HPP
diff --git a/src/mesh/MedianDualMeshBuilder.cpp b/src/mesh/MedianDualMeshBuilder.cpp
index 87af0be24..1dde88902 100644
--- a/src/mesh/MedianDualMeshBuilder.cpp
+++ b/src/mesh/MedianDualMeshBuilder.cpp
@@ -10,15 +10,14 @@
 
 template <size_t Dimension>
 void
-MedianDualMeshBuilder::_buildMedianDualMeshFrom(const std::shared_ptr<const IMesh>& p_i_mesh)
+MedianDualMeshBuilder::_buildMedianDualMeshFrom(const IMesh& i_mesh)
 {
   static_assert(Dimension > 1);
 
   using ConnectivityType = Connectivity<Dimension>;
   using MeshType         = Mesh<Connectivity<Dimension>>;
 
-  std::shared_ptr p_primal_mesh = std::dynamic_pointer_cast<const MeshType>(p_i_mesh);
-  const MeshType& primal_mesh   = *p_primal_mesh;
+  const MeshType& primal_mesh = dynamic_cast<const MeshType&>(i_mesh);
 
   DualConnectivityManager& manager = DualConnectivityManager::instance();
 
@@ -42,15 +41,11 @@ MedianDualMeshBuilder::_buildMedianDualMeshFrom(const std::shared_ptr<const IMes
   m_mesh = std::make_shared<MeshType>(p_dual_connectivity, dual_xr);
 }
 
-MedianDualMeshBuilder::MedianDualMeshBuilder(const std::shared_ptr<const IMesh>& p_mesh)
+MedianDualMeshBuilder::MedianDualMeshBuilder(const IMesh& i_mesh)
 {
-  switch (p_mesh->dimension()) {
-  case 1: {
-    throw NotImplementedError("must be treated as a special common case with diamond dual meshes");
-    break;
-  }
+  switch (i_mesh.dimension()) {
   case 2: {
-    this->_buildMedianDualMeshFrom<2>(p_mesh);
+    this->_buildMedianDualMeshFrom<2>(i_mesh);
     break;
   }
   case 3: {
@@ -58,7 +53,7 @@ MedianDualMeshBuilder::MedianDualMeshBuilder(const std::shared_ptr<const IMesh>&
     break;
   }
   default: {
-    throw UnexpectedError("invalid mesh dimension: " + std::to_string(p_mesh->dimension()));
+    throw UnexpectedError("invalid mesh dimension: " + std::to_string(i_mesh.dimension()));
   }
   }
 }
diff --git a/src/mesh/MedianDualMeshBuilder.hpp b/src/mesh/MedianDualMeshBuilder.hpp
index 0d649c509..6f8f1842c 100644
--- a/src/mesh/MedianDualMeshBuilder.hpp
+++ b/src/mesh/MedianDualMeshBuilder.hpp
@@ -9,10 +9,10 @@ class MedianDualMeshBuilder : public MeshBuilderBase
 {
  private:
   template <size_t Dimension>
-  void _buildMedianDualMeshFrom(const std::shared_ptr<const IMesh>&);
+  void _buildMedianDualMeshFrom(const IMesh&);
 
   friend class DualMeshManager;
-  MedianDualMeshBuilder(const std::shared_ptr<const IMesh>&);
+  MedianDualMeshBuilder(const IMesh&);
 
  public:
   ~MedianDualMeshBuilder() = default;
diff --git a/tests/test_CellIntegrator.cpp b/tests/test_CellIntegrator.cpp
index a0f19555c..49f750afb 100644
--- a/tests/test_CellIntegrator.cpp
+++ b/tests/test_CellIntegrator.cpp
@@ -493,7 +493,7 @@ TEST_CASE("CellIntegrator", "[scheme]")
 
     std::vector<std::pair<std::string, decltype(hybrid_mesh)>> mesh_list;
     mesh_list.push_back(std::make_pair("hybrid mesh", hybrid_mesh));
-    mesh_list.push_back(std::make_pair("diamond mesh", DualMeshManager::instance().getDiamondDualMesh(hybrid_mesh)));
+    mesh_list.push_back(std::make_pair("diamond mesh", DualMeshManager::instance().getDiamondDualMesh(*hybrid_mesh)));
 
     for (auto mesh_info : mesh_list) {
       auto mesh_name = mesh_info.first;
diff --git a/tests/test_DualMeshManager.cpp b/tests/test_DualMeshManager.cpp
index 6e24f7aa9..e5c8dbcf8 100644
--- a/tests/test_DualMeshManager.cpp
+++ b/tests/test_DualMeshManager.cpp
@@ -18,12 +18,12 @@ TEST_CASE("DualMeshManager", "[mesh]")
 
   SECTION("diamond dual mesh access")
   {
-    std::shared_ptr p_diamond_dual_mesh = DualMeshManager::instance().getDiamondDualMesh(mesh);
+    std::shared_ptr p_diamond_dual_mesh = DualMeshManager::instance().getDiamondDualMesh(*mesh);
 
     const auto ref_counter = p_diamond_dual_mesh.use_count();
 
     {
-      std::shared_ptr p_diamond_dual_mesh2 = DualMeshManager::instance().getDiamondDualMesh(mesh);
+      std::shared_ptr p_diamond_dual_mesh2 = DualMeshManager::instance().getDiamondDualMesh(*mesh);
 
       REQUIRE(p_diamond_dual_mesh == p_diamond_dual_mesh2);
       REQUIRE(p_diamond_dual_mesh.use_count() == ref_counter + 1);
@@ -40,7 +40,7 @@ TEST_CASE("DualMeshManager", "[mesh]")
     REQUIRE(p_diamond_dual_mesh.use_count() == ref_counter - 1);
 
     // A new dual mesh is built
-    std::shared_ptr p_diamond_dual_mesh_rebuilt = DualMeshManager::instance().getDiamondDualMesh(mesh);
+    std::shared_ptr p_diamond_dual_mesh_rebuilt = DualMeshManager::instance().getDiamondDualMesh(*mesh);
     REQUIRE(p_diamond_dual_mesh != p_diamond_dual_mesh_rebuilt);
     REQUIRE(p_diamond_dual_mesh.get() != p_diamond_dual_mesh_rebuilt.get());
 
@@ -51,12 +51,12 @@ TEST_CASE("DualMeshManager", "[mesh]")
 
   SECTION("median dual mesh access")
   {
-    std::shared_ptr p_median_dual_mesh = DualMeshManager::instance().getMedianDualMesh(mesh);
+    std::shared_ptr p_median_dual_mesh = DualMeshManager::instance().getMedianDualMesh(*mesh);
 
     const auto ref_counter = p_median_dual_mesh.use_count();
 
     {
-      std::shared_ptr p_median_dual_mesh2 = DualMeshManager::instance().getMedianDualMesh(mesh);
+      std::shared_ptr p_median_dual_mesh2 = DualMeshManager::instance().getMedianDualMesh(*mesh);
 
       REQUIRE(p_median_dual_mesh == p_median_dual_mesh2);
       REQUIRE(p_median_dual_mesh.use_count() == ref_counter + 1);
@@ -73,7 +73,7 @@ TEST_CASE("DualMeshManager", "[mesh]")
     REQUIRE(p_median_dual_mesh.use_count() == ref_counter - 1);
 
     // A new dual mesh is built
-    std::shared_ptr p_median_dual_mesh_rebuilt = DualMeshManager::instance().getMedianDualMesh(mesh);
+    std::shared_ptr p_median_dual_mesh_rebuilt = DualMeshManager::instance().getMedianDualMesh(*mesh);
     REQUIRE(p_median_dual_mesh != p_median_dual_mesh_rebuilt);
     REQUIRE(p_median_dual_mesh.get() != p_median_dual_mesh_rebuilt.get());
 
@@ -84,8 +84,8 @@ TEST_CASE("DualMeshManager", "[mesh]")
 
   SECTION("check multiple dual mesh using/freeing")
   {
-    std::shared_ptr p_median_dual_mesh  = DualMeshManager::instance().getMedianDualMesh(mesh);
-    std::shared_ptr p_diamond_dual_mesh = DualMeshManager::instance().getDiamondDualMesh(mesh);
+    std::shared_ptr p_median_dual_mesh  = DualMeshManager::instance().getMedianDualMesh(*mesh);
+    std::shared_ptr p_diamond_dual_mesh = DualMeshManager::instance().getDiamondDualMesh(*mesh);
 
     const auto median_ref_counter  = p_median_dual_mesh.use_count();
     const auto diamond_ref_counter = p_diamond_dual_mesh.use_count();
diff --git a/tests/test_EdgeIntegrator.cpp b/tests/test_EdgeIntegrator.cpp
index dbfc74d49..f8ea09cee 100644
--- a/tests/test_EdgeIntegrator.cpp
+++ b/tests/test_EdgeIntegrator.cpp
@@ -30,7 +30,7 @@ TEST_CASE("EdgeIntegrator", "[scheme]")
 
     std::vector<std::pair<std::string, decltype(hybrid_mesh)>> mesh_list;
     mesh_list.push_back(std::make_pair("hybrid mesh", hybrid_mesh));
-    mesh_list.push_back(std::make_pair("diamond mesh", DualMeshManager::instance().getDiamondDualMesh(hybrid_mesh)));
+    mesh_list.push_back(std::make_pair("diamond mesh", DualMeshManager::instance().getDiamondDualMesh(*hybrid_mesh)));
 
     for (auto mesh_info : mesh_list) {
       auto mesh_name = mesh_info.first;
diff --git a/tests/test_FaceIntegrator.cpp b/tests/test_FaceIntegrator.cpp
index 4afe3f9dc..184f1a8f9 100644
--- a/tests/test_FaceIntegrator.cpp
+++ b/tests/test_FaceIntegrator.cpp
@@ -258,7 +258,7 @@ TEST_CASE("FaceIntegrator", "[scheme]")
 
     std::vector<std::pair<std::string, decltype(hybrid_mesh)>> mesh_list;
     mesh_list.push_back(std::make_pair("hybrid mesh", hybrid_mesh));
-    mesh_list.push_back(std::make_pair("diamond mesh", DualMeshManager::instance().getDiamondDualMesh(hybrid_mesh)));
+    mesh_list.push_back(std::make_pair("diamond mesh", DualMeshManager::instance().getDiamondDualMesh(*hybrid_mesh)));
 
     for (auto mesh_info : mesh_list) {
       auto mesh_name = mesh_info.first;
-- 
GitLab