From 14ea5b10ecfefb67bfd94710de008617aaa36abd Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Thu, 2 Aug 2018 11:28:46 +0200
Subject: [PATCH] Use m_item_to_item_matrix instead of m_face_to_node_matrix

---
 src/mesh/Connectivity.cpp     | 16 ++++++++++++----
 src/mesh/Connectivity.hpp     | 19 +++++++++++++++----
 src/mesh/MeshData.hpp         |  9 ++++-----
 src/mesh/MeshNodeBoundary.hpp |  4 +++-
 4 files changed, 34 insertions(+), 14 deletions(-)

diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp
index e72d0b806..c8f7242a8 100644
--- a/src/mesh/Connectivity.cpp
+++ b/src/mesh/Connectivity.cpp
@@ -129,6 +129,9 @@ void Connectivity<3>::_computeFaceCellConnectivities()
   }
 
   {
+    auto& face_to_node_matrix
+        = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
+
     std::vector<std::vector<unsigned int>> face_to_node_vector(face_cells_map.size());
     int l=0;
     for (const auto& face_info : face_cells_map) {
@@ -136,7 +139,7 @@ void Connectivity<3>::_computeFaceCellConnectivities()
       face_to_node_vector[l] = face.nodeIdList();
       ++l;
     }
-    m_face_to_node_matrix = face_to_node_vector;
+    face_to_node_matrix = face_to_node_vector;
   }
 
   {
@@ -159,10 +162,13 @@ void Connectivity<3>::_computeFaceCellConnectivities()
                                                             m_face_to_cell_matrix,
                                                             m_face_to_cell_local_face);
 
+  const auto& face_to_node_matrix
+      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
+
 #warning check that the number of cell per faces is <=2
   std::unordered_map<unsigned int, std::vector<unsigned int>> node_faces_map;
-  for (size_t l=0; l<m_face_to_node_matrix.numRows(); ++l) {
-    const auto& face_nodes = m_face_to_node_matrix.rowConst(l);
+  for (size_t l=0; l<face_to_node_matrix.numRows(); ++l) {
+    const auto& face_nodes = face_to_node_matrix.rowConst(l);
     for (size_t lr=0; lr<face_nodes.length; ++lr) {
       const unsigned int r = face_nodes(lr);
       node_faces_map[r].emplace_back(l);
@@ -225,7 +231,9 @@ void Connectivity<2>::_computeFaceCellConnectivities()
       face_to_node_vector[l] = {face.m_node0_id, face.m_node1_id};
       ++l;
     }
-    m_face_to_node_matrix = face_to_node_vector;
+    auto& face_to_node_matrix
+        = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
+    face_to_node_matrix = face_to_node_vector;
   }
 
   {
diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index 9a0eba325..dd421418b 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 faceToNodeMatrix() const
+  {
+    return m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
+  }
+
   KOKKOS_INLINE_FUNCTION
   ConnectivityMatrix nodeToCellMatrix() const
   {
@@ -255,7 +261,6 @@ class Connectivity final
 
   ConnectivityMatrix m_face_to_cell_matrix;
   CellValuePerFace<unsigned short> m_face_to_cell_local_face;
-  ConnectivityMatrix m_face_to_node_matrix;
 
   CellValuePerNode<unsigned short> m_node_to_cell_local_node;
 
@@ -443,7 +448,9 @@ inline const ConnectivityMatrix&
 Connectivity<3>::itemToItemMatrix<TypeOfItem::face,
                                   TypeOfItem::node>() const
 {
-  return m_face_to_node_matrix;
+  const auto& face_to_node_matrix
+      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
+  return face_to_node_matrix;
 }
 
 template <>
@@ -499,7 +506,9 @@ inline const ConnectivityMatrix&
 Connectivity<2>::itemToItemMatrix<TypeOfItem::face,
                                   TypeOfItem::node>() const
 {
-  return m_face_to_node_matrix;
+  const auto& face_to_node_matrix
+      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
+  return face_to_node_matrix;
 }
 
 template <>
@@ -556,7 +565,9 @@ Connectivity<1>::itemToItemMatrix<TypeOfItem::face,
                                   TypeOfItem::node>() const
 {
 #warning in 1d, faces and node are the same
-  return m_face_to_node_matrix;
+  const auto& face_to_node_matrix
+      = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)];
+  return face_to_node_matrix;
 }
 
 template <>
diff --git a/src/mesh/MeshData.hpp b/src/mesh/MeshData.hpp
index cd8250412..4b10a428e 100644
--- a/src/mesh/MeshData.hpp
+++ b/src/mesh/MeshData.hpp
@@ -106,11 +106,10 @@ class MeshData
     } else if (dimension ==3) {
       const Kokkos::View<const Rd*> xr = m_mesh.xr();
 
-#warning Rewrite using better data structures and remove this explicit 4
-      Kokkos::View<Rd**> Nlr("Nlr", m_mesh.connectivity().numberOfFaces(), 4);
-
+      NodeValuePerFace<Rd> Nlr(m_mesh.connectivity());
+      const auto& face_to_node_matrix = m_mesh.connectivity().faceToNodeMatrix();
       Kokkos::parallel_for(m_mesh.numberOfFaces(), KOKKOS_LAMBDA(const int& l) {
-          const auto& face_nodes = m_mesh.connectivity().m_face_to_node_matrix.rowConst(l);
+          const auto& face_nodes = face_to_node_matrix.rowConst(l);
           const size_t nb_nodes = face_nodes.length;
           std::vector<Rd> dxr(nb_nodes);
           for (size_t r=0; r<nb_nodes; ++r) {
@@ -143,7 +142,7 @@ class MeshData
 
           for (size_t L=0; L<cell_faces.length; ++L) {
             const size_t l = cell_faces(L);
-            const auto& face_nodes = m_mesh.connectivity().m_face_to_node_matrix.rowConst(l);
+            const auto& face_nodes = face_to_node_matrix.rowConst(l);
 
 #warning should this lambda be replaced by a precomputed correspondance?
             std::function local_node_number_in_cell
diff --git a/src/mesh/MeshNodeBoundary.hpp b/src/mesh/MeshNodeBoundary.hpp
index 37821696b..a14fdefe0 100644
--- a/src/mesh/MeshNodeBoundary.hpp
+++ b/src/mesh/MeshNodeBoundary.hpp
@@ -41,9 +41,11 @@ class MeshNodeBoundary
     Kokkos::vector<unsigned int> node_ids;
     // not enough but should reduce significantly the number of resizing
     node_ids.reserve(dimension*face_list.extent(0));
+    const auto& face_to_node_matrix = mesh.connectivity().faceToNodeMatrix();
+
     for (size_t l=0; l<face_list.extent(0); ++l) {
       const size_t face_number = face_list[l];
-      const auto& face_nodes = mesh.connectivity().m_face_to_node_matrix.rowConst(face_number);
+      const auto& face_nodes = face_to_node_matrix.rowConst(face_number);
 
       for (size_t r=0; r<face_nodes.length; ++r) {
         node_ids.push_back(face_nodes(r));
-- 
GitLab