diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp index f53b5857441250188d910e84b7acfcbfae927a29..5ce0c5aabfaa8a13533c2a3a0da459d9161a163f 100644 --- a/src/mesh/Connectivity.cpp +++ b/src/mesh/Connectivity.cpp @@ -249,12 +249,6 @@ Connectivity(const std::vector<std::vector<unsigned int>>& cell_by_node_vector) m_connectivity_computer.computeInverseConnectivityMatrix(cell_to_node_matrix, node_to_cell_matrix); - m_node_local_numbers_in_their_cells - = m_connectivity_computer.computeLocalItemNumberInChildItem<ItemType::node, ItemType::cell>(*this); - - m_cell_local_numbers_in_their_nodes - = m_connectivity_computer.computeLocalItemNumberInChildItem<ItemType::cell, ItemType::node>(*this); - if constexpr (Dimension>1) { this->_computeFaceCellConnectivities(); } diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp index 0c2a52fba635e00810573b00eaffd5d0ecd80c7d..420dbb8d0bce68a4aada4178bf78c3599e51c74c 100644 --- a/src/mesh/Connectivity.hpp +++ b/src/mesh/Connectivity.hpp @@ -230,6 +230,51 @@ class Connectivity final public: static constexpr size_t dimension = Dimension; + private: + ConnectivityMatrix m_item_to_item_matrix[Dimension+1][Dimension+1]; + + FaceValuePerCell<const bool> m_cell_face_is_reversed; + + NodeValuePerCell<const unsigned short> m_cell_local_numbers_in_their_nodes; + + CellValuePerFace<const unsigned short> m_face_local_numbers_in_their_cells; + + CellValuePerNode<const unsigned short> m_node_local_numbers_in_their_cells; + + // not plugged ... +#warning remaining def + NodeValuePerFace<unsigned short> m_node_local_numbers_in_their_faces; + FaceValuePerNode<unsigned short> m_face_local_numbers_in_their_nodes; + // ... not plugged + + ConnectivityComputer m_connectivity_computer; + + std::vector<RefFaceList> m_ref_face_list; + std::vector<RefNodeList> m_ref_node_list; + + Kokkos::View<double*> m_inv_cell_nb_nodes; + + using Face = ConnectivityFace<Dimension>; + + std::unordered_map<Face, unsigned int, typename Face::Hash> m_face_number_map; + + void _computeFaceCellConnectivities(); + + template <typename SubItemValuePerItemType> + KOKKOS_INLINE_FUNCTION + const SubItemValuePerItemType& + _lazzyBuildItemNumberInTheirChild(const SubItemValuePerItemType& sub_item_value_per_item) const + { + if (not sub_item_value_per_item.isBuilt()) { + const_cast<SubItemValuePerItemType&>(sub_item_value_per_item) + = m_connectivity_computer + . computeLocalItemNumberInChildItem<SubItemValuePerItemType::item_t, + SubItemValuePerItemType::sub_item_t>(*this); + } + return sub_item_value_per_item; + } + + public: template <ItemType item_type_0, ItemType item_type_1> const ConnectivityMatrix& itemToItemMatrix() const { @@ -250,60 +295,29 @@ class Connectivity final const auto& cellLocalNumbersInTheirNodes() const { - return m_cell_local_numbers_in_their_nodes; + return _lazzyBuildItemNumberInTheirChild(m_cell_local_numbers_in_their_nodes); } const auto& nodeLocalNumbersInTheirCells() const { - return m_node_local_numbers_in_their_cells; + return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_cells); } const auto& faceLocalNumbersInTheirCells() const { if constexpr(dimension>1) { - return m_face_local_numbers_in_their_cells; + return _lazzyBuildItemNumberInTheirChild(m_face_local_numbers_in_their_cells); } else { - return m_node_local_numbers_in_their_cells; + return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_cells); } } - const auto& nodeToFaceLocalNode() const + const auto& nodeLocalNumbersInTheirFaces() const { static_assert(Dimension==1,"this function has no meaning in 1d"); - return m_node_local_numbers_in_their_faces; + return _lazzyBuildItemNumberInTheirChild(m_node_local_numbers_in_their_faces); } -private: - ConnectivityMatrix m_item_to_item_matrix[Dimension+1][Dimension+1]; - - FaceValuePerCell<const bool> m_cell_face_is_reversed; - - NodeValuePerCell<const unsigned short> m_cell_local_numbers_in_their_nodes; - - CellValuePerFace<const unsigned short> m_face_local_numbers_in_their_cells; - - CellValuePerNode<const unsigned short> m_node_local_numbers_in_their_cells; - - // not plugged ... -#warning remaining def - NodeValuePerFace<unsigned short> m_node_local_numbers_in_their_faces; - FaceValuePerNode<unsigned short> m_face_local_numbers_in_their_nodes; - // ... not plugged - - ConnectivityComputer m_connectivity_computer; - - std::vector<RefFaceList> m_ref_face_list; - std::vector<RefNodeList> m_ref_node_list; - - Kokkos::View<double*> m_inv_cell_nb_nodes; - - using Face = ConnectivityFace<Dimension>; - - std::unordered_map<Face, unsigned int, typename Face::Hash> m_face_number_map; - - void _computeFaceCellConnectivities(); - - public: void addRefFaceList(const RefFaceList& ref_face_list) { m_ref_face_list.push_back(ref_face_list); diff --git a/src/mesh/SubItemValuePerItem.hpp b/src/mesh/SubItemValuePerItem.hpp index 7b1cddd143fcb85876007650080473a5aeee2d30..c6e98dcf6cebe539f008038051ce52a9927ef6a8 100644 --- a/src/mesh/SubItemValuePerItem.hpp +++ b/src/mesh/SubItemValuePerItem.hpp @@ -23,7 +23,12 @@ class SubItemValuePerItem<DataType, item_type, std::enable_if_t<sub_item_type != item_type>> { + public: + static const ItemType item_t{item_type}; + static const ItemType sub_item_t{sub_item_type}; private: + bool m_is_built{false}; + ConnectivityMatrix::HostRowType m_host_row_map; Kokkos::View<DataType*> m_values; @@ -76,9 +81,16 @@ class SubItemValuePerItem<DataType, } }; + KOKKOS_FORCEINLINE_FUNCTION + const bool& isBuilt() const + { + return m_is_built; + } + KOKKOS_FORCEINLINE_FUNCTION DataType& operator()(const size_t& j, const size_t& r) { + Assert(m_is_built); return m_values[m_host_row_map(j)+r]; } @@ -87,18 +99,21 @@ class SubItemValuePerItem<DataType, KOKKOS_FORCEINLINE_FUNCTION DataType& operator()(const size_t& j, const size_t& r) const { + Assert(m_is_built); return m_values[m_host_row_map(j)+r]; } KOKKOS_INLINE_FUNCTION size_t numberOfValues() const { + Assert(m_is_built); return m_values.extent(0); } KOKKOS_FORCEINLINE_FUNCTION DataType& operator[](const size_t& i) { + Assert(m_is_built); return m_values[i]; } @@ -107,12 +122,14 @@ class SubItemValuePerItem<DataType, KOKKOS_FORCEINLINE_FUNCTION DataType& operator[](const size_t & i) const { + Assert(m_is_built); return m_values[i]; } KOKKOS_INLINE_FUNCTION size_t numberOfItems() const { + Assert(m_is_built); Assert(m_host_row_map.extent(0) != 0); return m_host_row_map.extent(0); } @@ -120,12 +137,14 @@ class SubItemValuePerItem<DataType, KOKKOS_INLINE_FUNCTION size_t numberOfSubValues(const size_t& i_cell) const { + Assert(m_is_built); return m_host_row_map(i_cell+1)-m_host_row_map(i_cell); } KOKKOS_INLINE_FUNCTION SubView itemValues(const size_t& i_cell) { + Assert(m_is_built); const auto& cell_begin = m_host_row_map(i_cell); const auto& cell_end = m_host_row_map(i_cell+1); return SubView(m_values, cell_begin, cell_end); @@ -136,6 +155,7 @@ class SubItemValuePerItem<DataType, KOKKOS_INLINE_FUNCTION SubView itemValues(const size_t& i_cell) const { + Assert(m_is_built); const auto& cell_begin = m_host_row_map(i_cell); const auto& cell_end = m_host_row_map(i_cell+1); return SubView(m_values, cell_begin, cell_end); @@ -155,6 +175,9 @@ class SubItemValuePerItem<DataType, "Cannot assign const SubItemValuePerItem to a non const SubItemValuePerItem"); m_host_row_map = sub_item_value_per_item.m_host_row_map; m_values = sub_item_value_per_item.m_values; + + m_is_built = sub_item_value_per_item.m_is_built; + return *this; } @@ -168,6 +191,7 @@ class SubItemValuePerItem<DataType, SubItemValuePerItem() = default; SubItemValuePerItem(const IConnectivity& connectivity) + : m_is_built{true} { ConnectivityMatrix connectivity_matrix = connectivity.getMatrix(item_type, sub_item_type);