From b1fa9afb39374218e94990381481fad31f52a49e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Fri, 2 Apr 2021 13:10:57 +0200
Subject: [PATCH] Add a few missing ingredients

- Mesh::numberOfEdges() function
- construction of edges and faces similarly to nodes in 1d
- construction of edges similarly to faces in 1d
---
 src/mesh/Connectivity.cpp | 68 +++++++++++++++++++++++++++++++++++++--
 src/mesh/Connectivity.hpp |  2 --
 src/mesh/Mesh.hpp         |  7 ++++
 3 files changed, 73 insertions(+), 4 deletions(-)

diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp
index de8be5816..a542c35e0 100644
--- a/src/mesh/Connectivity.cpp
+++ b/src/mesh/Connectivity.cpp
@@ -82,7 +82,49 @@ Connectivity<Dimension>::_buildFrom(const ConnectivityDescriptor& descriptor)
   m_ref_node_list_vector = descriptor.template refItemListVector<ItemType::node>();
   m_ref_cell_list_vector = descriptor.template refItemListVector<ItemType::cell>();
 
-  if constexpr (Dimension > 1) {
+  if constexpr (Dimension == 1) {
+    // faces are similar to nodes
+    {
+      WeakFaceValue<int> face_number(*this);
+      face_number   = convert_to_array(descriptor.node_number_vector);
+      m_face_number = face_number;
+    }
+
+    {
+      WeakFaceValue<int> face_owner(*this);
+      face_owner   = convert_to_array(descriptor.node_owner_vector);
+      m_face_owner = face_owner;
+    }
+
+    {
+      const int rank = parallel::rank();
+      WeakFaceValue<bool> face_is_owned(*this);
+      parallel_for(
+        this->numberOfFaces(), PUGS_LAMBDA(FaceId l) { face_is_owned[l] = (m_face_owner[l] == rank); });
+      m_face_is_owned = face_is_owned;
+    }
+
+    // edges are similar to nodes
+    {
+      WeakEdgeValue<int> edge_number(*this);
+      edge_number   = convert_to_array(descriptor.node_number_vector);
+      m_edge_number = edge_number;
+    }
+
+    {
+      WeakEdgeValue<int> edge_owner(*this);
+      edge_owner   = convert_to_array(descriptor.node_owner_vector);
+      m_edge_owner = edge_owner;
+    }
+
+    {
+      const int rank = parallel::rank();
+      WeakEdgeValue<bool> edge_is_owned(*this);
+      parallel_for(
+        this->numberOfEdges(), PUGS_LAMBDA(EdgeId l) { edge_is_owned[l] = (m_edge_owner[l] == rank); });
+      m_edge_is_owned = edge_is_owned;
+    }
+  } else {
     m_item_to_item_matrix[itemTId(ItemType::face)][itemTId(ItemType::node)] = descriptor.face_to_node_vector;
 
     m_item_to_item_matrix[itemTId(ItemType::cell)][itemTId(ItemType::face)] = descriptor.cell_to_face_vector;
@@ -120,7 +162,29 @@ Connectivity<Dimension>::_buildFrom(const ConnectivityDescriptor& descriptor)
 
     m_ref_face_list_vector = descriptor.template refItemListVector<ItemType::face>();
 
-    if constexpr (Dimension > 2) {
+    if constexpr (Dimension == 2) {
+      // edges are similar to faces
+      {
+        WeakEdgeValue<int> edge_number(*this);
+        edge_number   = convert_to_array(descriptor.face_number_vector);
+        m_edge_number = edge_number;
+      }
+
+      {
+        WeakEdgeValue<int> edge_owner(*this);
+        edge_owner   = convert_to_array(descriptor.face_owner_vector);
+        m_edge_owner = edge_owner;
+      }
+
+      {
+        const int rank = parallel::rank();
+        WeakEdgeValue<bool> edge_is_owned(*this);
+        parallel_for(
+          this->numberOfEdges(), PUGS_LAMBDA(EdgeId l) { edge_is_owned[l] = (m_edge_owner[l] == rank); });
+        m_edge_is_owned = edge_is_owned;
+      }
+
+    } else {
       m_item_to_item_matrix[itemTId(ItemType::edge)][itemTId(ItemType::node)] = descriptor.edge_to_node_vector;
 
       m_item_to_item_matrix[itemTId(ItemType::face)][itemTId(ItemType::edge)] = descriptor.face_to_edge_vector;
diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index 0caec821a..5ca484b22 100644
--- a/src/mesh/Connectivity.hpp
+++ b/src/mesh/Connectivity.hpp
@@ -196,7 +196,6 @@ class Connectivity final : public IConnectivity
   const auto&
   edgeOwner() const
   {
-    throw NotImplementedError("edge owner not built");
     return m_edge_owner;
   }
 
@@ -242,7 +241,6 @@ class Connectivity final : public IConnectivity
   const auto&
   edgeIsOwned() const
   {
-    throw NotImplementedError("edge is owned not built");
     return m_edge_is_owned;
   }
 
diff --git a/src/mesh/Mesh.hpp b/src/mesh/Mesh.hpp
index 21c100384..45f4c8d05 100644
--- a/src/mesh/Mesh.hpp
+++ b/src/mesh/Mesh.hpp
@@ -49,6 +49,13 @@ class Mesh final : public IMesh
     return m_connectivity->numberOfNodes();
   }
 
+  PUGS_INLINE
+  size_t
+  numberOfEdges() const
+  {
+    return m_connectivity->numberOfEdges();
+  }
+
   PUGS_INLINE
   size_t
   numberOfFaces() const
-- 
GitLab