From 9bd3bf71eb83d0f11820ff5aa44e22e92691c2f6 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Fri, 10 Aug 2018 11:27:08 +0200
Subject: [PATCH] Add all item local number in child items

Access function are defined to forbid inappropriate use and to match classical
nomenclature
- edge <-> face/node are forbidden except in dimension>2
- face <-> node are forbidden except in dimension>1
- when calling edge <-> cell in dimension<2 use face <-> cell
...
---
 src/mesh/Connectivity.hpp        | 94 ++++++++++++++++++++++++++++----
 src/mesh/SubItemValuePerItem.hpp | 28 +++++++++-
 2 files changed, 111 insertions(+), 11 deletions(-)

diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index 6647cecb9..96433d7d7 100644
--- a/src/mesh/Connectivity.hpp
+++ b/src/mesh/Connectivity.hpp
@@ -236,16 +236,20 @@ class Connectivity final
   FaceValuePerCell<const bool> m_cell_face_is_reversed;
 
   NodeValuePerCell<const unsigned short> m_cell_local_numbers_in_their_nodes;
+  EdgeValuePerCell<const unsigned short> m_cell_local_numbers_in_their_edges;
+  FaceValuePerCell<const unsigned short> m_cell_local_numbers_in_their_faces;
 
   CellValuePerFace<const unsigned short> m_face_local_numbers_in_their_cells;
+  EdgeValuePerFace<const unsigned short> m_face_local_numbers_in_their_edges;
+  NodeValuePerFace<const unsigned short> m_face_local_numbers_in_their_nodes;
 
-  CellValuePerNode<const unsigned short> m_node_local_numbers_in_their_cells;
+  CellValuePerEdge<const unsigned short> m_edge_local_numbers_in_their_cells;
+  FaceValuePerEdge<const unsigned short> m_edge_local_numbers_in_their_faces;
+  NodeValuePerEdge<const unsigned short> m_edge_local_numbers_in_their_nodes;
 
-  // not plugged ...
-#warning remaining def
-  NodeValuePerFace<unsigned short> m_node_local_numbers_in_their_faces;
-  FaceValuePerNode<unsigned short> m_face_local_numbers_in_their_nodes;
-  // ... not plugged
+  CellValuePerNode<const unsigned short> m_node_local_numbers_in_their_cells;
+  EdgeValuePerNode<const unsigned short> m_node_local_numbers_in_their_edges;
+  FaceValuePerNode<const unsigned short> m_node_local_numbers_in_their_faces;
 
   ConnectivityComputer m_connectivity_computer;
 
@@ -300,34 +304,104 @@ class Connectivity final
     return connectivity_matrix;
   }
 
+  KOKKOS_INLINE_FUNCTION
   const auto& cellFaceIsReversed() const
   {
     static_assert(dimension>1, "reversed faces makes no sense in dimension 1");
     return m_cell_face_is_reversed;
   }
 
+  KOKKOS_INLINE_FUNCTION
   const auto& cellLocalNumbersInTheirNodes() const
   {
     return _lazzyBuildItemNumberInTheirChild(m_cell_local_numbers_in_their_nodes);
   }
 
-  const auto& nodeLocalNumbersInTheirCells() const
+  KOKKOS_INLINE_FUNCTION
+  const auto& cellLocalNumbersInTheirEdges() const
   {
-    return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_cells);
+    if constexpr (dimension>2) {
+      return _lazzyBuildItemNumberInTheirChild(m_cell_local_numbers_in_their_edges);
+    } else {
+      return cellLocalNumbersInTheirFaces();
+    }
   }
 
+  KOKKOS_INLINE_FUNCTION
+  const auto& cellLocalNumbersInTheirFaces() const
+  {
+    if constexpr (dimension>1) {
+      return _lazzyBuildItemNumberInTheirChild(m_cell_local_numbers_in_their_faces);
+    } else {
+      return cellLocalNumbersInTheirNodes();
+    }
+  }
+
+  KOKKOS_INLINE_FUNCTION
   const auto& faceLocalNumbersInTheirCells() const
   {
     if constexpr(dimension>1) {
       return _lazzyBuildItemNumberInTheirChild(m_face_local_numbers_in_their_cells);
     } else {
-      return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_cells);
+      return nodeLocalNumbersInTheirCells();
     }
   }
 
+  KOKKOS_INLINE_FUNCTION
+  const auto& faceLocalNumbersInTheirEdges() const
+  {
+    static_assert(dimension>2,"this function has no meaning in 1d or 2d");
+    return _lazzyBuildItemNumberInTheirChild(m_face_local_numbers_in_their_edges);
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  const auto& faceLocalNumbersInTheirNodes() const
+  {
+    static_assert(dimension>1,"this function has no meaning in 1d");
+    return _lazzyBuildItemNumberInTheirChild(m_face_local_numbers_in_their_nodes);
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  const auto& edgeLocalNumbersInTheirCells() const
+  {
+    if constexpr (dimension>2) {
+      return _lazzyBuildItemNumberInTheirChild(m_edge_local_numbers_in_their_cells);
+    } else {
+      return faceLocalNumbersInTheirCells();
+    }
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  const auto& edgeLocalNumbersInTheirFaces() const
+  {
+    static_assert(dimension>2, "this function has no meaning in 1d or 2d");
+    return _lazzyBuildItemNumberInTheirChild(m_edge_local_numbers_in_their_faces);
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  const auto& edgeLocalNumbersInTheirNodes() const
+  {
+    static_assert(dimension>2, "this function has no meaning in 1d or 2d");
+    return _lazzyBuildItemNumberInTheirChild(m_edge_local_numbers_in_their_nodes);
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  const auto& nodeLocalNumbersInTheirCells() const
+  {
+    return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_cells);
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  const auto& nodeLocalNumbersInTheirEdges() const
+  {
+    static_assert(dimension>2, "this function has no meaning in 1d or 2d");
+    return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_edges);
+  }
+
+  KOKKOS_INLINE_FUNCTION
   const auto& nodeLocalNumbersInTheirFaces() const
   {
-    static_assert(Dimension==1,"this function has no meaning in 1d");
+    static_assert(dimension>1,"this function has no meaning in 1d");
     return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_faces);
   }
 
diff --git a/src/mesh/SubItemValuePerItem.hpp b/src/mesh/SubItemValuePerItem.hpp
index 3ab0ac487..5778fc739 100644
--- a/src/mesh/SubItemValuePerItem.hpp
+++ b/src/mesh/SubItemValuePerItem.hpp
@@ -202,21 +202,47 @@ class SubItemValuePerItem<DataType,
   ~SubItemValuePerItem() = default;
 };
 
+// Item values at nodes
+
 template <typename DataType>
-using NodeValuePerCell = SubItemValuePerItem<DataType, ItemType::node, ItemType::cell>;
+using NodeValuePerEdge = SubItemValuePerItem<DataType, ItemType::node, ItemType::edge>;
 
 template <typename DataType>
 using NodeValuePerFace = SubItemValuePerItem<DataType, ItemType::node, ItemType::face>;
 
+template <typename DataType>
+using NodeValuePerCell = SubItemValuePerItem<DataType, ItemType::node, ItemType::cell>;
+
+// Item values at edges
+
+template <typename DataType>
+using EdgeValuePerNode = SubItemValuePerItem<DataType, ItemType::edge, ItemType::node>;
+
+template <typename DataType>
+using EdgeValuePerFace = SubItemValuePerItem<DataType, ItemType::edge, ItemType::face>;
+
+template <typename DataType>
+using EdgeValuePerCell = SubItemValuePerItem<DataType, ItemType::edge, ItemType::cell>;
+
+// Item values at faces
+
 template <typename DataType>
 using FaceValuePerNode = SubItemValuePerItem<DataType, ItemType::face, ItemType::node>;
 
+template <typename DataType>
+using FaceValuePerEdge = SubItemValuePerItem<DataType, ItemType::face, ItemType::edge>;
+
 template <typename DataType>
 using FaceValuePerCell = SubItemValuePerItem<DataType, ItemType::face, ItemType::cell>;
 
+// Item values at cells
+
 template <typename DataType>
 using CellValuePerNode = SubItemValuePerItem<DataType, ItemType::cell, ItemType::node>;
 
+template <typename DataType>
+using CellValuePerEdge = SubItemValuePerItem<DataType, ItemType::cell, ItemType::edge>;
+
 template <typename DataType>
 using CellValuePerFace = SubItemValuePerItem<DataType, ItemType::cell, ItemType::face>;
 
-- 
GitLab