From eb9fe85f1c07053c29f1c924e0ed5444c74911f3 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Wed, 25 Jul 2018 17:26:58 +0200 Subject: [PATCH] Add ConnectivityComputer utility --- src/mesh/CMakeLists.txt | 1 + src/mesh/Connectivity.cpp | 11 ++-- src/mesh/Connectivity.hpp | 91 ++++--------------------------- src/mesh/ConnectivityComputer.cpp | 60 ++++++++++++++++++++ src/mesh/ConnectivityComputer.hpp | 21 +++++++ 5 files changed, 100 insertions(+), 84 deletions(-) create mode 100644 src/mesh/ConnectivityComputer.cpp create mode 100644 src/mesh/ConnectivityComputer.hpp diff --git a/src/mesh/CMakeLists.txt b/src/mesh/CMakeLists.txt index a26145341..c28b0643f 100644 --- a/src/mesh/CMakeLists.txt +++ b/src/mesh/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_library( PastisMesh Connectivity.cpp + ConnectivityComputer.cpp GmshReader.cpp) #include_directories(${PASTIS_SOURCE_DIR}/utils) diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp index bf5da9443..47533fdb9 100644 --- a/src/mesh/Connectivity.cpp +++ b/src/mesh/Connectivity.cpp @@ -1,4 +1,5 @@ #include <Connectivity.hpp> +#include <map> template<> void Connectivity<3>::_computeFaceCellConnectivities() @@ -150,12 +151,12 @@ void Connectivity<3>::_computeFaceCellConnectivities() } } - this->_computeInverseConnectivityMatrix(m_cell_to_face_matrix, - m_face_to_cell_matrix); + m_connectivity_computer.computeInverseConnectivityMatrix(m_cell_to_face_matrix, + m_face_to_cell_matrix); - this->_computeLocalChildItemNumberInItem(m_cell_to_face_matrix, - m_face_to_cell_matrix, - m_face_to_cell_local_face_matrix); + m_connectivity_computer.computeLocalChildItemNumberInItem(m_cell_to_face_matrix, + m_face_to_cell_matrix, + m_face_to_cell_local_face_matrix); #warning check that the number of cell per faces is <=2 std::unordered_map<unsigned int, std::vector<unsigned int>> node_faces_map; diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp index 0e127c66d..23cfcd940 100644 --- a/src/mesh/Connectivity.hpp +++ b/src/mesh/Connectivity.hpp @@ -1,18 +1,14 @@ -#ifndef CONNECTIVITY_3D_HPP -#define CONNECTIVITY_3D_HPP +#ifndef CONNECTIVITY_HPP +#define CONNECTIVITY_HPP -#include <Kokkos_Core.hpp> #include <PastisAssert.hpp> #include <TinyVector.hpp> -#include <Kokkos_StaticCrsGraph.hpp> +#include <Kokkos_Core.hpp> -typedef Kokkos::StaticCrsGraph<unsigned int, Kokkos::HostSpace> ConnectivityMatrix; -#warning use right type (unsigned short) -typedef Kokkos::StaticCrsGraph<unsigned int, Kokkos::HostSpace> ConnectivityMatrixShort; +#include <ConnectivityComputer.hpp> #include <vector> -#include <map> #include <unordered_map> #include <algorithm> @@ -254,6 +250,8 @@ public: const ConnectivityMatrix& subItemIdPerItemMatrix() const = delete; private: + ConnectivityComputer m_connectivity_computer; + // Stores numbering of nodes of each cell. // gives an id to each node of each cell. (j,r) -> id // @@ -274,12 +272,6 @@ private: std::unordered_map<Face, unsigned int, typename Face::Hash> m_face_number_map; void _computeFaceCellConnectivities(); - void _computeInverseConnectivityMatrix(const ConnectivityMatrix& cell_to_node_matrix, - ConnectivityMatrix& node_to_cell_matrix); - - void _computeLocalChildItemNumberInItem(const ConnectivityMatrix& cell_to_node_matrix, - const ConnectivityMatrix& node_to_cell_matrix, - ConnectivityMatrixShort& node_to_cell_local_node_matrix); public: void addRefFaceList(const RefFaceList& ref_face_list) @@ -382,12 +374,12 @@ private: node_id_per_cell_vector); } - this->_computeInverseConnectivityMatrix(m_cell_to_node_matrix, - m_node_to_cell_matrix); + m_connectivity_computer.computeInverseConnectivityMatrix(m_cell_to_node_matrix, + m_node_to_cell_matrix); - this->_computeLocalChildItemNumberInItem(m_cell_to_node_matrix, - m_node_to_cell_matrix, - m_node_to_cell_local_node_matrix); + m_connectivity_computer.computeLocalChildItemNumberInItem(m_cell_to_node_matrix, + m_node_to_cell_matrix, + m_node_to_cell_local_node_matrix); if constexpr (Dimension>1) { this->_computeFaceCellConnectivities(); } @@ -399,65 +391,6 @@ private: } }; -template<size_t Dimension> -inline void Connectivity<Dimension>:: -_computeInverseConnectivityMatrix(const ConnectivityMatrix& item_to_child_item_matrix, - ConnectivityMatrix& child_item_to_item_matrix) -{ - std::map<unsigned int, std::vector<unsigned int>> child_item_to_item_vector_map; - const size_t& number_of_items = item_to_child_item_matrix.numRows(); - - for (unsigned int j=0; j<number_of_items; ++j) { - const auto& item_to_child_items = item_to_child_item_matrix.rowConst(j); - for (unsigned int r=0; r<item_to_child_items.length; ++r) { - child_item_to_item_vector_map[item_to_child_items(r)].push_back(j); - } - } - - { - size_t i=0; - for (const auto& [child_item_id, item_vector] : child_item_to_item_vector_map) { - if (child_item_id != i) { - std::cerr << "sparse item numerotation NIY\n"; - std::exit(0); - } - ++i; - } - } - - std::vector<std::vector<unsigned int>> child_item_to_items_vector(child_item_to_item_vector_map.size()); - for (const auto& [child_item_id, item_vector] : child_item_to_item_vector_map) { - child_item_to_items_vector[child_item_id] = item_vector; - } - child_item_to_item_matrix - = Kokkos::create_staticcrsgraph<ConnectivityMatrix>("child_item_to_item_matrix", child_item_to_items_vector); -} - -template<size_t Dimension> -inline void Connectivity<Dimension>:: -_computeLocalChildItemNumberInItem(const ConnectivityMatrix& item_to_child_items_matrix, - const ConnectivityMatrix& child_item_to_items_matrix, - ConnectivityMatrixShort& child_item_number_in_item_matrix) -{ - std::vector<std::vector<unsigned int>> child_item_number_in_item_vector(child_item_to_items_matrix.numRows()); - for (unsigned int r=0; r<child_item_to_items_matrix.numRows(); ++r) { - const auto& child_item_to_items = child_item_to_items_matrix.rowConst(r); - child_item_number_in_item_vector[r].resize(child_item_to_items.length); - for (unsigned short J=0; J<child_item_to_items.length; ++J) { - const unsigned int j = child_item_to_items(J); - const auto& item_to_child_items = item_to_child_items_matrix.rowConst(j); - - for (unsigned int R=0; R<item_to_child_items.length; ++R) { - if (item_to_child_items(R) == r) { - child_item_number_in_item_vector[r][J] = R; - break; - } - } - } - } - child_item_number_in_item_matrix - = Kokkos::create_staticcrsgraph<ConnectivityMatrixShort>("child_item_number_in_item_matrix", child_item_number_in_item_vector); -} using Connectivity3D = Connectivity<3>; @@ -492,4 +425,4 @@ Connectivity<1>::subItemIdPerItemMatrix<TypeOfItem::node, return m_node_id_per_cell_matrix; } -#endif // CONNECTIVITY_3D_HPP +#endif // CONNECTIVITY_HPP diff --git a/src/mesh/ConnectivityComputer.cpp b/src/mesh/ConnectivityComputer.cpp new file mode 100644 index 000000000..f10e971f1 --- /dev/null +++ b/src/mesh/ConnectivityComputer.cpp @@ -0,0 +1,60 @@ +#include <ConnectivityComputer.hpp> +#include <map> + +void ConnectivityComputer:: +computeInverseConnectivityMatrix(const ConnectivityMatrix& item_to_child_item_matrix, + ConnectivityMatrix& child_item_to_item_matrix) const +{ + std::map<unsigned int, std::vector<unsigned int>> child_item_to_item_vector_map; + const size_t& number_of_items = item_to_child_item_matrix.numRows(); + + for (unsigned int j=0; j<number_of_items; ++j) { + const auto& item_to_child_items = item_to_child_item_matrix.rowConst(j); + for (unsigned int r=0; r<item_to_child_items.length; ++r) { + child_item_to_item_vector_map[item_to_child_items(r)].push_back(j); + } + } + + { + size_t i=0; + for (const auto& [child_item_id, item_vector] : child_item_to_item_vector_map) { + if (child_item_id != i) { + std::cerr << "sparse item numerotation NIY\n"; + std::exit(0); + } + ++i; + } + } + + std::vector<std::vector<unsigned int>> child_item_to_items_vector(child_item_to_item_vector_map.size()); + for (const auto& [child_item_id, item_vector] : child_item_to_item_vector_map) { + child_item_to_items_vector[child_item_id] = item_vector; + } + child_item_to_item_matrix + = Kokkos::create_staticcrsgraph<ConnectivityMatrix>("child_item_to_item_matrix", child_item_to_items_vector); +} + +void ConnectivityComputer:: +computeLocalChildItemNumberInItem(const ConnectivityMatrix& item_to_child_items_matrix, + const ConnectivityMatrix& child_item_to_items_matrix, + ConnectivityMatrixShort& child_item_number_in_item_matrix) const +{ + std::vector<std::vector<unsigned int>> child_item_number_in_item_vector(child_item_to_items_matrix.numRows()); + for (unsigned int r=0; r<child_item_to_items_matrix.numRows(); ++r) { + const auto& child_item_to_items = child_item_to_items_matrix.rowConst(r); + child_item_number_in_item_vector[r].resize(child_item_to_items.length); + for (unsigned short J=0; J<child_item_to_items.length; ++J) { + const unsigned int j = child_item_to_items(J); + const auto& item_to_child_items = item_to_child_items_matrix.rowConst(j); + + for (unsigned int R=0; R<item_to_child_items.length; ++R) { + if (item_to_child_items(R) == r) { + child_item_number_in_item_vector[r][J] = R; + break; + } + } + } + } + child_item_number_in_item_matrix + = Kokkos::create_staticcrsgraph<ConnectivityMatrixShort>("child_item_number_in_item_matrix", child_item_number_in_item_vector); +} diff --git a/src/mesh/ConnectivityComputer.hpp b/src/mesh/ConnectivityComputer.hpp new file mode 100644 index 000000000..54ec0216d --- /dev/null +++ b/src/mesh/ConnectivityComputer.hpp @@ -0,0 +1,21 @@ +#ifndef CONNECTIVITY_COMPUTER_HPP +#define CONNECTIVITY_COMPUTER_HPP + +#include <Kokkos_Core.hpp> +#include <Kokkos_StaticCrsGraph.hpp> + +typedef Kokkos::StaticCrsGraph<unsigned int, Kokkos::HostSpace> ConnectivityMatrix; +#warning use right type (unsigned short) +typedef Kokkos::StaticCrsGraph<unsigned int, Kokkos::HostSpace> ConnectivityMatrixShort; + +struct ConnectivityComputer +{ + void computeInverseConnectivityMatrix(const ConnectivityMatrix& item_to_child_item_matrix, + ConnectivityMatrix& child_item_to_item_matrix) const; + + void computeLocalChildItemNumberInItem(const ConnectivityMatrix& item_to_child_items_matrix, + const ConnectivityMatrix& child_item_to_items_matrix, + ConnectivityMatrixShort& child_item_number_in_item_matrix) const; +}; + +#endif // CONNECTIVITY_COMPUTER_HPP -- GitLab