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