diff --git a/src/mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp b/src/mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp index 577bad4c499cd3aa91e6dd498c033b51ab0aac76..8d35d2ff9541fbfab7e8e6e30976bd5f88970f56 100644 --- a/src/mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp +++ b/src/mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp @@ -2,6 +2,7 @@ #define CONNECTIVITY_TO_DIAMOND_DUAL_CONNECTIVITY_DATA_MAPPER_HPP #include <mesh/Connectivity.hpp> +#include <mesh/ItemIdToItemIdMap.hpp> #include <mesh/ItemValue.hpp> #include <utils/Array.hpp> #include <utils/PugsAssert.hpp> @@ -23,13 +24,8 @@ class ConnectivityToDiamondDualConnectivityDataMapper : public IConnectivityToDi const IConnectivity* m_primal_connectivity; const IConnectivity* m_dual_connectivity; - using NodeIdToNodeIdMap = Array<std::pair<NodeId, NodeId>>; NodeIdToNodeIdMap m_primal_node_to_dual_node_map; - - using CellIdToNodeIdMap = Array<std::pair<CellId, NodeId>>; CellIdToNodeIdMap m_primal_cell_to_dual_node_map; - - using FaceIdToCellIdMap = Array<std::pair<FaceId, CellId>>; FaceIdToCellIdMap m_primal_face_to_dual_cell_map; public: @@ -142,63 +138,16 @@ class ConnectivityToDiamondDualConnectivityDataMapper : public IConnectivityToDi } ConnectivityToDiamondDualConnectivityDataMapper(const Connectivity<Dimension>& primal_connectivity, - const Connectivity<Dimension>& dual_connectivity) - : m_primal_connectivity{&primal_connectivity}, m_dual_connectivity{&dual_connectivity} - { - if constexpr (Dimension == 1) { - const auto& node_to_cell_matrix = primal_connectivity.nodeToCellMatrix(); - - NodeId dual_node_id = 0; - m_primal_node_to_dual_node_map = [&]() { - std::vector<std::pair<NodeId, NodeId>> primal_node_to_dual_node_vector; - for (NodeId primal_node_id = 0; primal_node_id < primal_connectivity.numberOfNodes(); ++primal_node_id) { - if (node_to_cell_matrix[primal_node_id].size() == 1) { - primal_node_to_dual_node_vector.push_back(std::make_pair(primal_node_id, dual_node_id++)); - } - } - return convert_to_array(primal_node_to_dual_node_vector); - }(); - - m_primal_cell_to_dual_node_map = [&]() { - CellIdToNodeIdMap primal_cell_to_dual_node_map{primal_connectivity.numberOfCells()}; - for (CellId primal_cell_id = 0; primal_cell_id < primal_cell_to_dual_node_map.size(); ++primal_cell_id) { - primal_cell_to_dual_node_map[primal_cell_id] = std::make_pair(primal_cell_id, dual_node_id++); - } - return primal_cell_to_dual_node_map; - }(); - - } else { - m_primal_node_to_dual_node_map = [&]() { - NodeIdToNodeIdMap primal_node_to_dual_node_map{primal_connectivity.numberOfNodes()}; - for (NodeId primal_node_id = 0; primal_node_id < primal_node_to_dual_node_map.size(); ++primal_node_id) { - const NodeId dual_node_id = primal_node_id; - - primal_node_to_dual_node_map[primal_node_id] = std::make_pair(primal_node_id, dual_node_id); - } - return primal_node_to_dual_node_map; - }(); - - m_primal_cell_to_dual_node_map = [&]() { - CellIdToNodeIdMap primal_cell_to_dual_node_map{primal_connectivity.numberOfCells()}; - NodeId dual_node_id = m_primal_node_to_dual_node_map.size(); - for (CellId primal_cell_id = 0; primal_cell_id < primal_cell_to_dual_node_map.size(); ++primal_cell_id) { - primal_cell_to_dual_node_map[primal_cell_id] = std::make_pair(primal_cell_id, dual_node_id++); - } - return primal_cell_to_dual_node_map; - }(); - } - - m_primal_face_to_dual_cell_map = [&]() { - FaceIdToCellIdMap primal_face_to_dual_cell_map{primal_connectivity.numberOfFaces()}; - for (size_t id = 0; id < primal_face_to_dual_cell_map.size(); ++id) { - const CellId dual_cell_id = id; - const FaceId primal_face_id = id; - - primal_face_to_dual_cell_map[id] = std::make_pair(primal_face_id, dual_cell_id); - } - return primal_face_to_dual_cell_map; - }(); - } + const Connectivity<Dimension>& dual_connectivity, + const NodeIdToNodeIdMap& primal_node_to_dual_node_map, + const CellIdToNodeIdMap& primal_cell_to_dual_node_map, + const FaceIdToCellIdMap& primal_face_to_dual_cell_map) + : m_primal_connectivity{&primal_connectivity}, + m_dual_connectivity{&dual_connectivity}, + m_primal_node_to_dual_node_map{primal_node_to_dual_node_map}, + m_primal_cell_to_dual_node_map{primal_cell_to_dual_node_map}, + m_primal_face_to_dual_cell_map{primal_face_to_dual_cell_map} + {} }; #endif // CONNECTIVITY_TO_DIAMOND_DUAL_CONNECTIVITY_DATA_MAPPER_HPP diff --git a/src/mesh/DiamondDualConnectivityBuilder.cpp b/src/mesh/DiamondDualConnectivityBuilder.cpp index 44606bc0edca1e6dfe70a979fa86b4595d1db52f..32c9a140b6f6140384f2f50607da4bcbc3836e46 100644 --- a/src/mesh/DiamondDualConnectivityBuilder.cpp +++ b/src/mesh/DiamondDualConnectivityBuilder.cpp @@ -8,8 +8,11 @@ #include <mesh/Mesh.hpp> #include <mesh/RefId.hpp> #include <utils/Array.hpp> +#include <utils/ArrayUtils.hpp> #include <utils/Messenger.hpp> +#include <vector> + template <size_t Dimension> void DiamondDualConnectivityBuilder::_buildDiamondConnectivityDescriptor(const Connectivity<Dimension>& primal_connectivity, @@ -483,10 +486,69 @@ DiamondDualConnectivityBuilder::_buildDiamondConnectivityFrom(const IConnectivit m_connectivity = ConnectivityType::build(diamond_descriptor); + { + if constexpr (Dimension == 1) { + const auto& node_to_cell_matrix = primal_connectivity.nodeToCellMatrix(); + + NodeId dual_node_id = 0; + m_primal_node_to_dual_node_map = [&]() { + std::vector<std::pair<NodeId, NodeId>> primal_node_to_dual_node_vector; + for (NodeId primal_node_id = 0; primal_node_id < primal_connectivity.numberOfNodes(); ++primal_node_id) { + if (node_to_cell_matrix[primal_node_id].size() == 1) { + primal_node_to_dual_node_vector.push_back(std::make_pair(primal_node_id, dual_node_id++)); + } + } + return convert_to_array(primal_node_to_dual_node_vector); + }(); + + m_primal_cell_to_dual_node_map = [&]() { + CellIdToNodeIdMap primal_cell_to_dual_node_map{primal_connectivity.numberOfCells()}; + for (CellId primal_cell_id = 0; primal_cell_id < primal_cell_to_dual_node_map.size(); ++primal_cell_id) { + primal_cell_to_dual_node_map[primal_cell_id] = std::make_pair(primal_cell_id, dual_node_id++); + } + return primal_cell_to_dual_node_map; + }(); + + } else { + m_primal_node_to_dual_node_map = [&]() { + NodeIdToNodeIdMap primal_node_to_dual_node_map{primal_connectivity.numberOfNodes()}; + for (NodeId primal_node_id = 0; primal_node_id < primal_node_to_dual_node_map.size(); ++primal_node_id) { + const NodeId dual_node_id = primal_node_id; + + primal_node_to_dual_node_map[primal_node_id] = std::make_pair(primal_node_id, dual_node_id); + } + return primal_node_to_dual_node_map; + }(); + + m_primal_cell_to_dual_node_map = [&]() { + CellIdToNodeIdMap primal_cell_to_dual_node_map{primal_connectivity.numberOfCells()}; + NodeId dual_node_id = m_primal_node_to_dual_node_map.size(); + for (CellId primal_cell_id = 0; primal_cell_id < primal_cell_to_dual_node_map.size(); ++primal_cell_id) { + primal_cell_to_dual_node_map[primal_cell_id] = std::make_pair(primal_cell_id, dual_node_id++); + } + return primal_cell_to_dual_node_map; + }(); + } + + m_primal_face_to_dual_cell_map = [&]() { + FaceIdToCellIdMap primal_face_to_dual_cell_map{primal_connectivity.numberOfFaces()}; + for (size_t id = 0; id < primal_face_to_dual_cell_map.size(); ++id) { + const CellId dual_cell_id = id; + const FaceId primal_face_id = id; + + primal_face_to_dual_cell_map[id] = std::make_pair(primal_face_id, dual_cell_id); + } + return primal_face_to_dual_cell_map; + }(); + } + m_mapper = std::make_shared<ConnectivityToDiamondDualConnectivityDataMapper<Dimension>>(primal_connectivity, dynamic_cast<const ConnectivityType&>( - *m_connectivity)); + *m_connectivity), + m_primal_node_to_dual_node_map, + m_primal_cell_to_dual_node_map, + m_primal_face_to_dual_cell_map); } DiamondDualConnectivityBuilder::DiamondDualConnectivityBuilder(const IConnectivity& connectivity) diff --git a/src/mesh/DiamondDualConnectivityBuilder.hpp b/src/mesh/DiamondDualConnectivityBuilder.hpp index bed1e9daff01e46e38908b1268f298c1045a6d73..36b120811ad6478af90b89112740d272014b2e7a 100644 --- a/src/mesh/DiamondDualConnectivityBuilder.hpp +++ b/src/mesh/DiamondDualConnectivityBuilder.hpp @@ -2,6 +2,7 @@ #define DIAMOND_DUAL_CONNECTIVITY_BUILDER_HPP #include <mesh/ConnectivityBuilderBase.hpp> +#include <mesh/ItemIdToItemIdMap.hpp> #include <memory> @@ -14,6 +15,10 @@ class IConnectivityToDiamondDualConnectivityDataMapper; class DiamondDualConnectivityBuilder : public ConnectivityBuilderBase { private: + NodeIdToNodeIdMap m_primal_node_to_dual_node_map; + CellIdToNodeIdMap m_primal_cell_to_dual_node_map; + FaceIdToCellIdMap m_primal_face_to_dual_cell_map; + std::shared_ptr<IConnectivityToDiamondDualConnectivityDataMapper> m_mapper; template <size_t Dimension> diff --git a/src/mesh/ItemIdToItemIdMap.hpp b/src/mesh/ItemIdToItemIdMap.hpp new file mode 100644 index 0000000000000000000000000000000000000000..0e92eb13ce3943c4e2487081ee2e48fc3deac8ee --- /dev/null +++ b/src/mesh/ItemIdToItemIdMap.hpp @@ -0,0 +1,30 @@ +#ifndef ITEM_ID_TO_ITEM_ID_MAP_HPP +#define ITEM_ID_TO_ITEM_ID_MAP_HPP + +#include <mesh/ItemId.hpp> +#include <utils/Array.hpp> + +template <ItemType type1, ItemType type2> +using ItemIdToItemIdMap = Array<std::pair<ItemIdT<type1>, ItemIdT<type2>>>; + +using NodeIdToNodeIdMap = ItemIdToItemIdMap<ItemType::node, ItemType::node>; +using NodeIdToEdgeIdMap = ItemIdToItemIdMap<ItemType::node, ItemType::edge>; +using NodeIdToFaceIdMap = ItemIdToItemIdMap<ItemType::node, ItemType::face>; +using NodeIdToCellIdMap = ItemIdToItemIdMap<ItemType::node, ItemType::cell>; + +using EdgeIdToNodeIdMap = ItemIdToItemIdMap<ItemType::edge, ItemType::node>; +using EdgeIdToEdgeIdMap = ItemIdToItemIdMap<ItemType::edge, ItemType::edge>; +using EdgeIdToFaceIdMap = ItemIdToItemIdMap<ItemType::edge, ItemType::face>; +using EdgeIdToCellIdMap = ItemIdToItemIdMap<ItemType::edge, ItemType::cell>; + +using FaceIdToNodeIdMap = ItemIdToItemIdMap<ItemType::face, ItemType::node>; +using FaceIdToEdgeIdMap = ItemIdToItemIdMap<ItemType::face, ItemType::edge>; +using FaceIdToFaceIdMap = ItemIdToItemIdMap<ItemType::face, ItemType::face>; +using FaceIdToCellIdMap = ItemIdToItemIdMap<ItemType::face, ItemType::cell>; + +using CellIdToNodeIdMap = ItemIdToItemIdMap<ItemType::cell, ItemType::node>; +using CellIdToEdgeIdMap = ItemIdToItemIdMap<ItemType::cell, ItemType::edge>; +using CellIdToFaceIdMap = ItemIdToItemIdMap<ItemType::cell, ItemType::face>; +using CellIdToCellIdMap = ItemIdToItemIdMap<ItemType::cell, ItemType::cell>; + +#endif // ITEM_ID_TO_ITEM_ID_MAP_HPP