diff --git a/src/mesh/CMakeLists.txt b/src/mesh/CMakeLists.txt index a26145341f61d4ed7e25143ef9b41f9059cd43ca..c28b0643fd8bbf1b2677512423d2185d9a7ff970 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 bf5da944351faa562798ff71045a94c2c14b083e..47533fdb9ffc2b4b017c13c9b62acdc658c1d3fc 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 0e127c66d59b5de224fa906aa6552dd46f6f6312..23cfcd940fa752e50c0436685eca873278e45fcf 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 0000000000000000000000000000000000000000..f10e971f116e6db7db0f14b7c8b9452912660dd6 --- /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 0000000000000000000000000000000000000000..54ec0216df3bdcc23b7540ff98b45e083a91b514 --- /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