From 20d0fb486ca8c38b2c210a208ab3280bb1638f83 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Tue, 19 Apr 2022 19:48:27 +0200
Subject: [PATCH] Store RefFaceList instead of face list

Simplify access to MeshFaceBoundary (simpler and safer)
---
 src/mesh/MeshFaceBoundary.cpp     |  2 +-
 src/mesh/MeshFaceBoundary.hpp     | 11 +++++++++--
 src/mesh/MeshFlatFaceBoundary.cpp | 18 ++++--------------
 3 files changed, 14 insertions(+), 17 deletions(-)

diff --git a/src/mesh/MeshFaceBoundary.cpp b/src/mesh/MeshFaceBoundary.cpp
index f061ed646..2aeaa4b9d 100644
--- a/src/mesh/MeshFaceBoundary.cpp
+++ b/src/mesh/MeshFaceBoundary.cpp
@@ -6,7 +6,7 @@
 
 template <size_t Dimension>
 MeshFaceBoundary<Dimension>::MeshFaceBoundary(const Mesh<Connectivity<Dimension>>&, const RefFaceList& ref_face_list)
-  : m_face_list(ref_face_list.list()), m_boundary_name(ref_face_list.refId().tagName())
+  : m_ref_face_list(ref_face_list), m_boundary_name(ref_face_list.refId().tagName())
 {}
 
 template MeshFaceBoundary<1>::MeshFaceBoundary(const Mesh<Connectivity<1>>&, const RefFaceList&);
diff --git a/src/mesh/MeshFaceBoundary.hpp b/src/mesh/MeshFaceBoundary.hpp
index 7493e9cd4..6ef095797 100644
--- a/src/mesh/MeshFaceBoundary.hpp
+++ b/src/mesh/MeshFaceBoundary.hpp
@@ -16,7 +16,7 @@ template <size_t Dimension>
 class [[nodiscard]] MeshFaceBoundary   // clazy:exclude=copyable-polymorphic
 {
  protected:
-  Array<const FaceId> m_face_list;
+  RefFaceList m_ref_face_list;
   std::string m_boundary_name;
 
   std::array<TinyVector<Dimension>, Dimension*(Dimension - 1)> _getBounds(const Mesh<Connectivity<Dimension>>& mesh)
@@ -30,9 +30,16 @@ class [[nodiscard]] MeshFaceBoundary   // clazy:exclude=copyable-polymorphic
   MeshFaceBoundary& operator=(const MeshFaceBoundary&) = default;
   MeshFaceBoundary& operator=(MeshFaceBoundary&&) = default;
 
+  PUGS_INLINE
+  const RefFaceList& refFaceList() const
+  {
+    return m_ref_face_list;
+  }
+
+  PUGS_INLINE
   const Array<const FaceId>& faceList() const
   {
-    return m_face_list;
+    return m_ref_face_list.list();
   }
 
  protected:
diff --git a/src/mesh/MeshFlatFaceBoundary.cpp b/src/mesh/MeshFlatFaceBoundary.cpp
index cb7740c67..87d353e25 100644
--- a/src/mesh/MeshFlatFaceBoundary.cpp
+++ b/src/mesh/MeshFlatFaceBoundary.cpp
@@ -8,21 +8,11 @@ template <size_t Dimension>
 MeshFlatFaceBoundary<Dimension>
 getMeshFlatFaceBoundary(const Mesh<Connectivity<Dimension>>& mesh, const IBoundaryDescriptor& boundary_descriptor)
 {
-  for (size_t i_ref_face_list = 0; i_ref_face_list < mesh.connectivity().template numberOfRefItemList<ItemType::face>();
-       ++i_ref_face_list) {
-    const auto& ref_face_list = mesh.connectivity().template refItemList<ItemType::face>(i_ref_face_list);
-    const RefId& ref          = ref_face_list.refId();
-    if (ref == boundary_descriptor) {
-      MeshFlatNodeBoundary<Dimension> mesh_flat_node_boundary = getMeshFlatNodeBoundary(mesh, boundary_descriptor);
+  MeshFaceBoundary<Dimension> mesh_face_boundary          = getMeshFaceBoundary(mesh, boundary_descriptor);
+  MeshFlatNodeBoundary<Dimension> mesh_flat_node_boundary = getMeshFlatNodeBoundary(mesh, boundary_descriptor);
 
-      return MeshFlatFaceBoundary<Dimension>{mesh, ref_face_list, mesh_flat_node_boundary.outgoingNormal()};
-    }
-  }
-
-  std::ostringstream ost;
-  ost << "cannot find face list with name \"" << rang::fgB::red << boundary_descriptor << rang::style::reset << "\"";
-
-  throw NormalError(ost.str());
+  return MeshFlatFaceBoundary<Dimension>{mesh, mesh_face_boundary.refFaceList(),
+                                         mesh_flat_node_boundary.outgoingNormal()};
 }
 
 template MeshFlatFaceBoundary<1> getMeshFlatFaceBoundary(const Mesh<Connectivity<1>>&, const IBoundaryDescriptor&);
-- 
GitLab