From 228ec9dd1525806c1e0714a07e7f517184a835b1 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Thu, 2 Aug 2018 11:42:03 +0200
Subject: [PATCH] Use m_item_to_item_matrix instead of m_face_to_cell_matrix

---
 src/mesh/Connectivity.cpp     | 11 +++++++----
 src/mesh/Connectivity.hpp     | 28 ++++++++++++++++++++++------
 src/mesh/MeshNodeBoundary.hpp |  3 ++-
 3 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp
index c8f7242a8..2244d1355 100644
--- a/src/mesh/Connectivity.cpp
+++ b/src/mesh/Connectivity.cpp
@@ -153,13 +153,14 @@ void Connectivity<3>::_computeFaceCellConnectivities()
 
   const auto& cell_to_face_matrix
       = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::face)];
+  auto& face_to_cell_matrix
+      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
   m_connectivity_computer.computeInverseConnectivityMatrix(cell_to_face_matrix,
-                                                           m_face_to_cell_matrix);
+                                                           face_to_cell_matrix);
 
   m_face_to_cell_local_face = CellValuePerFace<unsigned short>(*this);
-
   m_connectivity_computer.computeLocalChildItemNumberInItem(cell_to_face_matrix,
-                                                            m_face_to_cell_matrix,
+                                                            face_to_cell_matrix,
                                                             m_face_to_cell_local_face);
 
   const auto& face_to_node_matrix
@@ -246,6 +247,8 @@ void Connectivity<2>::_computeFaceCellConnectivities()
       }
       ++l;
     }
-    m_face_to_cell_matrix = face_to_cell_vector;
+    auto& face_to_cell_matrix
+        = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
+    face_to_cell_matrix = face_to_cell_vector;
   }
 }
diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index dd421418b..269ee24a4 100644
--- a/src/mesh/Connectivity.hpp
+++ b/src/mesh/Connectivity.hpp
@@ -243,6 +243,12 @@ class Connectivity final
     return m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::face)];
   }
 
+  KOKKOS_INLINE_FUNCTION
+  ConnectivityMatrix faceToCellMatrix() const
+  {
+    return m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
+  }
+
   KOKKOS_INLINE_FUNCTION
   ConnectivityMatrix faceToNodeMatrix() const
   {
@@ -259,7 +265,6 @@ class Connectivity final
 
   FaceValuePerCell<bool> m_cell_face_is_reversed;
 
-  ConnectivityMatrix m_face_to_cell_matrix;
   CellValuePerFace<unsigned short> m_face_to_cell_local_face;
 
   CellValuePerNode<unsigned short> m_node_to_cell_local_node;
@@ -333,7 +338,9 @@ private:
   KOKKOS_INLINE_FUNCTION
   size_t numberOfFaces() const
   {
-    return m_face_to_cell_matrix.numRows();
+    const auto& face_to_node_matrix
+        = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
+    return face_to_node_matrix.numRows();
   }
 
   KOKKOS_INLINE_FUNCTION
@@ -440,8 +447,12 @@ inline const ConnectivityMatrix&
 Connectivity<3>::itemToItemMatrix<TypeOfItem::face,
                                   TypeOfItem::cell>() const
 {
-  return m_face_to_cell_matrix;
+  const auto& face_to_cell_matrix
+      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
+
+  return face_to_cell_matrix;
 }
+
 template <>
 template <>
 inline const ConnectivityMatrix&
@@ -497,7 +508,10 @@ inline const ConnectivityMatrix&
 Connectivity<2>::itemToItemMatrix<TypeOfItem::face,
                                   TypeOfItem::cell>() const
 {
-  return m_face_to_cell_matrix;
+  const auto& face_to_cell_matrix
+      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
+
+  return face_to_cell_matrix;
 }
 
 template <>
@@ -554,8 +568,10 @@ inline const ConnectivityMatrix&
 Connectivity<1>::itemToItemMatrix<TypeOfItem::face,
                                   TypeOfItem::cell>() const
 {
-#warning in 1d, faces and node are the same
-  return m_face_to_cell_matrix;
+  const auto& face_to_cell_matrix
+      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)];
+
+  return face_to_cell_matrix;
 }
 
 template <>
diff --git a/src/mesh/MeshNodeBoundary.hpp b/src/mesh/MeshNodeBoundary.hpp
index a14fdefe0..56d3d254e 100644
--- a/src/mesh/MeshNodeBoundary.hpp
+++ b/src/mesh/MeshNodeBoundary.hpp
@@ -29,9 +29,10 @@ class MeshNodeBoundary
                    const RefFaceList& ref_face_list)
   {
     static_assert(dimension == MeshType::dimension);
+    const auto& face_to_cell_matrix = mesh.connectivity().faceToCellMatrix();
     const Kokkos::View<const unsigned int*>& face_list = ref_face_list.faceList();
     Kokkos::parallel_for(face_list.extent(0), KOKKOS_LAMBDA(const int& l){
-        const auto& face_cells = mesh.connectivity().m_face_to_cell_matrix.rowConst(face_list[l]);
+        const auto& face_cells = face_to_cell_matrix.rowConst(face_list[l]);
         if (face_cells.length>1) {
           std::cerr << "internal faces cannot be used to define mesh boundaries\n";
           std::exit(1);
-- 
GitLab