diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp index 269ee24a496043123b7e2dcb295c8925ac3cce7f..5e1dc1b4da0860836f1e6e9b99ac6e2e293e0155 100644 --- a/src/mesh/Connectivity.hpp +++ b/src/mesh/Connectivity.hpp @@ -22,8 +22,6 @@ #include <tuple> #include <algorithm> -#include <IConnectivity.hpp> - template <size_t Dimension> class Connectivity; @@ -221,8 +219,7 @@ class ConnectivityFace<3> }; template <size_t Dimension> -class Connectivity final - : public IConnectivity +class Connectivity { private: constexpr static auto& itemId = ItemId<Dimension>::itemId; @@ -269,13 +266,18 @@ class Connectivity final CellValuePerNode<unsigned short> m_node_to_cell_local_node; - template <TypeOfItem SubItemType, - TypeOfItem ItemType> - const ConnectivityMatrix& itemToItemMatrix() const = delete; + template <TypeOfItem item_type_0, + TypeOfItem item_type_1> + const ConnectivityMatrix& itemToItemMatrix() const + { + const auto& item0_to_item1_matrix + = m_item_to_item_matrix[itemId(item_type_0)][itemId(item_type_1)]; + return item0_to_item1_matrix; + }; KOKKOS_INLINE_FUNCTION const ConnectivityMatrix& itemToItemMatrix(const TypeOfItem& item_type_0, - const TypeOfItem& item_type_1) const final; + const TypeOfItem& item_type_1) const; private: ConnectivityMatrix m_item_to_item_matrix[Dimension+1][Dimension+1]; @@ -415,241 +417,8 @@ private: } }; - using Connectivity3D = Connectivity<3>; - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<3>::itemToItemMatrix<TypeOfItem::cell, - TypeOfItem::face>() const -{ - const auto& cell_to_face_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::face)]; - return cell_to_face_matrix; -} - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<3>::itemToItemMatrix<TypeOfItem::cell, - TypeOfItem::node>() const -{ - const auto& cell_to_node_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::node)]; - - return cell_to_node_matrix; -} - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<3>::itemToItemMatrix<TypeOfItem::face, - TypeOfItem::cell>() const -{ - const auto& face_to_cell_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)]; - - return face_to_cell_matrix; -} - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<3>::itemToItemMatrix<TypeOfItem::face, - TypeOfItem::node>() const -{ - const auto& face_to_node_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)]; - return face_to_node_matrix; -} - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<3>::itemToItemMatrix<TypeOfItem::node, - TypeOfItem::cell>() const -{ - const auto& node_to_cell_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::node)][itemId(TypeOfItem::cell)]; - - return node_to_cell_matrix; -} - - using Connectivity2D = Connectivity<2>; - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<2>::itemToItemMatrix<TypeOfItem::cell, - TypeOfItem::face>() const -{ - const auto& cell_to_face_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::face)]; - return cell_to_face_matrix; -} - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<2>::itemToItemMatrix<TypeOfItem::cell, - TypeOfItem::node>() const -{ - const auto& cell_to_node_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::node)]; - - return cell_to_node_matrix; -} - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<2>::itemToItemMatrix<TypeOfItem::face, - TypeOfItem::cell>() const -{ - const auto& face_to_cell_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)]; - - return face_to_cell_matrix; -} - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<2>::itemToItemMatrix<TypeOfItem::face, - TypeOfItem::node>() const -{ - const auto& face_to_node_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)]; - return face_to_node_matrix; -} - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<2>::itemToItemMatrix<TypeOfItem::node, - TypeOfItem::cell>() const -{ - const auto& node_to_cell_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::node)][itemId(TypeOfItem::cell)]; - - return node_to_cell_matrix; -} - using Connectivity1D = Connectivity<1>; -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<1>::itemToItemMatrix<TypeOfItem::cell, - TypeOfItem::node>() const -{ - const auto& cell_to_node_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::node)]; - - return cell_to_node_matrix; -} - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<1>::itemToItemMatrix<TypeOfItem::cell, - TypeOfItem::face>() const -{ - const auto& cell_to_face_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::cell)][itemId(TypeOfItem::face)]; - return cell_to_face_matrix; -} - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<1>::itemToItemMatrix<TypeOfItem::face, - TypeOfItem::cell>() const -{ - const auto& face_to_cell_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::cell)]; - - return face_to_cell_matrix; -} - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<1>::itemToItemMatrix<TypeOfItem::face, - TypeOfItem::node>() const -{ -#warning in 1d, faces and node are the same - const auto& face_to_node_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::face)][itemId(TypeOfItem::node)]; - return face_to_node_matrix; -} - -template <> -template <> -inline const ConnectivityMatrix& -Connectivity<1>::itemToItemMatrix<TypeOfItem::node, - TypeOfItem::cell>() const -{ - const auto& node_to_cell_matrix - = m_item_to_item_matrix[itemId(TypeOfItem::node)][itemId(TypeOfItem::cell)]; - - return node_to_cell_matrix; -} - -template <size_t Dimension> -const ConnectivityMatrix& -Connectivity<Dimension>:: -itemToItemMatrix(const TypeOfItem& item_type_0, - const TypeOfItem& item_type_1) const -{ - switch (item_type_0) { - case TypeOfItem::cell: { - switch (item_type_1) { - case TypeOfItem::node: { - return itemToItemMatrix<TypeOfItem::cell, TypeOfItem::node>(); - } - case TypeOfItem::face: { - return itemToItemMatrix<TypeOfItem::cell, TypeOfItem::face>(); - } - default: { - std::cerr << __FILE__ << ":" << __LINE__ << ": NIY " << int(item_type_1) << "\n"; - std::exit(1); - } - } - } - case TypeOfItem::face: { - switch (item_type_1) { - case TypeOfItem::cell: { - return itemToItemMatrix<TypeOfItem::face, TypeOfItem::cell>(); - } - case TypeOfItem::node: { - return itemToItemMatrix<TypeOfItem::face, TypeOfItem::node>(); - } - default: { - std::cerr << __FILE__ << ":" << __LINE__ << ": NIY " << int(item_type_1) << "\n"; - std::exit(1); - } - } - } - case TypeOfItem::node: { - switch (item_type_1) { - case TypeOfItem::cell: { - return itemToItemMatrix<TypeOfItem::node, TypeOfItem::cell>(); - } - default: { - std::cerr << __FILE__ << ":" << __LINE__ << ": NIY " << int(item_type_1) << "\n"; - std::exit(1); - } - } - } - default: { - std::cerr << __FILE__ << ":" << __LINE__ << ": NIY " << int(item_type_0) << "\n"; - std::exit(1); - } - } -} - - #endif // CONNECTIVITY_HPP diff --git a/src/mesh/ConnectivityUtils.hpp b/src/mesh/ConnectivityUtils.hpp new file mode 100644 index 0000000000000000000000000000000000000000..50b788a4e360a87f29df46b0d6335816ab189f90 --- /dev/null +++ b/src/mesh/ConnectivityUtils.hpp @@ -0,0 +1,15 @@ +#ifndef CONNECTIVITY_UTILS_HPP +#define CONNECTIVITY_UTILS_HPP + +#include <TypeOfItem.hpp> +#include <ConnectivityMatrix.hpp> + +template <TypeOfItem item_type_0, + TypeOfItem item_type_1, + typename ConnectivityType> +const ConnectivityMatrix& getConnectivityMatrix(const ConnectivityType& connectivity) +{ + return connectivity.template itemToItemMatrix<item_type_0, item_type_1>(); +} + +#endif // CONNECTIVITY_UTILS_HPP diff --git a/src/mesh/IConnectivity.hpp b/src/mesh/IConnectivity.hpp deleted file mode 100644 index 6dc6ca4a2586f4fce344614f39c5bc82b69dd64c..0000000000000000000000000000000000000000 --- a/src/mesh/IConnectivity.hpp +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef ICONNECTIVITY_HPP -#define ICONNECTIVITY_HPP - -#include <TypeOfItem.hpp> -#include <ConnectivityMatrix.hpp> - -struct IConnectivity -{ - virtual const ConnectivityMatrix& - itemToItemMatrix(const TypeOfItem& item_type_0, - const TypeOfItem& item_type_1) const = 0; - - IConnectivity() = default; - IConnectivity(const IConnectivity&) = delete; - virtual ~IConnectivity() = default; -}; - -#endif // ICONNECTIVITY_HPP diff --git a/src/mesh/SubItemValuePerItem.hpp b/src/mesh/SubItemValuePerItem.hpp index a8016d0a5ee327797f18494b485ea77e9e009cf9..126c11f52b2f64f0b6cbee899578a581915836ba 100644 --- a/src/mesh/SubItemValuePerItem.hpp +++ b/src/mesh/SubItemValuePerItem.hpp @@ -6,7 +6,7 @@ #include <PastisAssert.hpp> #include <ConnectivityMatrix.hpp> -#include <IConnectivity.hpp> +#include <ConnectivityUtils.hpp> template <typename DataType, TypeOfItem SubItemType, @@ -130,10 +130,12 @@ class SubItemValuePerItem SubItemValuePerItem() = default; - SubItemValuePerItem(const IConnectivity& connectivity) + template <typename ConnectivityType> + SubItemValuePerItem(const ConnectivityType& connectivity) { ConnectivityMatrix connectivity_matrix - = connectivity.itemToItemMatrix(ItemType,SubItemType); + = getConnectivityMatrix<ItemType,SubItemType>(connectivity); + m_host_row_map = connectivity_matrix.rowsMap(); m_values = Kokkos::View<DataType*>("values", connectivity_matrix.numEntries()); }