From aba4e879ec9251e5e3d589344846729e7c576fb6 Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Tue, 30 Jun 2020 22:28:05 +0200 Subject: [PATCH] Reorganize DiamondDualMeshBuilder Extracts dimension 1 treatment to improve readability --- src/mesh/DiamondDualMeshBuilder.cpp | 289 ++++++++++++++-------------- 1 file changed, 148 insertions(+), 141 deletions(-) diff --git a/src/mesh/DiamondDualMeshBuilder.cpp b/src/mesh/DiamondDualMeshBuilder.cpp index 8bf89b010..4c8c06580 100644 --- a/src/mesh/DiamondDualMeshBuilder.cpp +++ b/src/mesh/DiamondDualMeshBuilder.cpp @@ -19,67 +19,33 @@ DiamondDualMeshBuilder::_buildDiamondConnectivityDescriptor(const Connectivity<D const size_t primal_number_of_faces = primal_connectivity.numberOfFaces(); const size_t primal_number_of_cells = primal_connectivity.numberOfCells(); - const size_t diamond_number_of_nodes = [&]() { - if constexpr (Dimension == 1) { - return 2 * primal_number_of_nodes - primal_number_of_cells; - } else { - return primal_number_of_cells + primal_number_of_nodes; - } - }(); + const size_t diamond_number_of_nodes = primal_number_of_cells + primal_number_of_nodes; diamond_descriptor.node_number_vector.resize(diamond_number_of_nodes); - if constexpr (Dimension == 1) { - const auto& primal_node_number = primal_connectivity.nodeNumber(); - - const size_t diamond_number_of_cells = primal_number_of_faces; - const size_t number_of_kept_nodes = 2 * (diamond_number_of_nodes - diamond_number_of_cells); - - const auto& primal_node_to_cell_matrix = primal_connectivity.nodeToCellMatrix(); - size_t next_kept_node_id = 0; - - for (NodeId node_id = 0; node_id < primal_connectivity.numberOfNodes(); ++node_id) { - const auto& primal_node_cell_list = primal_node_to_cell_matrix[node_id]; - if (primal_node_cell_list.size() == 1) { - diamond_descriptor.node_number_vector[next_kept_node_id++] = primal_node_number[node_id]; - } - } - - if (number_of_kept_nodes != next_kept_node_id) { - throw UnexpectedError("unexpected number of kept node" + std::to_string(next_kept_node_id) + - " != " + std::to_string(number_of_kept_nodes)); - } - - } else { - const auto& primal_node_number = primal_connectivity.nodeNumber(); + const auto& primal_node_number = primal_connectivity.nodeNumber(); - for (NodeId primal_node_id = 0; primal_node_id < primal_connectivity.numberOfNodes(); ++primal_node_id) { - diamond_descriptor.node_number_vector[primal_node_id] = primal_node_number[primal_node_id]; - } + for (NodeId primal_node_id = 0; primal_node_id < primal_connectivity.numberOfNodes(); ++primal_node_id) { + diamond_descriptor.node_number_vector[primal_node_id] = primal_node_number[primal_node_id]; + } - const auto& primal_cell_number = primal_connectivity.cellNumber(); + const auto& primal_cell_number = primal_connectivity.cellNumber(); - const size_t max_node_number = max(primal_node_number); + const size_t max_node_number = max(primal_node_number); - for (CellId primal_cell_id = 0; primal_cell_id < primal_number_of_cells; ++primal_cell_id) { - diamond_descriptor.node_number_vector[primal_number_of_nodes + primal_cell_id] = - primal_cell_number[primal_cell_id] + max_node_number; - } + for (CellId primal_cell_id = 0; primal_cell_id < primal_number_of_cells; ++primal_cell_id) { + diamond_descriptor.node_number_vector[primal_number_of_nodes + primal_cell_id] = + primal_cell_number[primal_cell_id] + max_node_number; } + const size_t diamond_number_of_cells = primal_number_of_faces; diamond_descriptor.cell_number_vector.resize(diamond_number_of_cells); - if constexpr (Dimension == 1) { - const auto& primal_node_number = primal_connectivity.nodeNumber(); - for (NodeId primal_node_id = 0; primal_node_id < primal_number_of_nodes; ++primal_node_id) { - diamond_descriptor.cell_number_vector[primal_node_id] = primal_node_number[primal_node_id]; - } - } else { - const auto& primal_face_number = primal_connectivity.faceNumber(); - for (FaceId i_primal_face = 0; i_primal_face < primal_number_of_faces; ++i_primal_face) { - diamond_descriptor.cell_number_vector[i_primal_face] = primal_face_number[i_primal_face]; - } + const auto& primal_face_number = primal_connectivity.faceNumber(); + for (FaceId i_primal_face = 0; i_primal_face < primal_number_of_faces; ++i_primal_face) { + diamond_descriptor.cell_number_vector[i_primal_face] = primal_face_number[i_primal_face]; } + if constexpr (Dimension == 3) { const size_t number_of_edges = diamond_descriptor.edge_to_node_vector.size(); diamond_descriptor.edge_number_vector.resize(number_of_edges); @@ -99,18 +65,14 @@ DiamondDualMeshBuilder::_buildDiamondConnectivityDescriptor(const Connectivity<D const size_t i_cell = i_face; const auto& primal_face_cell_list = primal_face_to_cell_matrix[i_face]; - if constexpr (Dimension == 1) { - diamond_descriptor.cell_type_vector[i_cell] = CellType::Line; - } else if constexpr (Dimension == 2) { - if (primal_face_cell_list.size() == 1) { - diamond_descriptor.cell_type_vector[i_cell] = CellType::Triangle; - } else { - Assert(primal_face_cell_list.size() == 2); - diamond_descriptor.cell_type_vector[i_cell] = CellType::Quadrangle; - } + if (primal_face_cell_list.size() == 1) { + diamond_descriptor.cell_type_vector[i_cell] = CellType::Triangle; } else { - static_assert(Dimension == 3, "unexpected dimension"); + Assert(primal_face_cell_list.size() == 2); + diamond_descriptor.cell_type_vector[i_cell] = CellType::Quadrangle; + } + if constexpr (Dimension == 3) { if (primal_face_cell_list.size() == 1) { diamond_descriptor.cell_type_vector[i_cell] = CellType::Pyramid; } else { @@ -122,19 +84,134 @@ DiamondDualMeshBuilder::_buildDiamondConnectivityDescriptor(const Connectivity<D diamond_descriptor.cell_to_node_vector.resize(diamond_number_of_cells); - if constexpr (Dimension == 1) { - const auto& primal_node_to_cell_matrix = primal_connectivity.nodeToCellMatrix(); - const size_t number_of_kept_nodes = 2 * (diamond_number_of_nodes - diamond_number_of_cells); - size_t next_kept_node_id = 0; + const auto& primal_face_to_node_matrix = primal_connectivity.faceToNodeMatrix(); + const auto& primal_face_local_number_in_their_cells = primal_connectivity.faceLocalNumbersInTheirCells(); + const auto& cell_face_is_reversed = primal_connectivity.cellFaceIsReversed(); + for (FaceId i_face = 0; i_face < primal_connectivity.numberOfFaces(); ++i_face) { + const size_t& i_diamond_cell = i_face; + const auto& primal_face_cell_list = primal_face_to_cell_matrix[i_face]; + const auto& primal_face_node_list = primal_face_to_node_matrix[i_face]; + if (primal_face_cell_list.size() == 1) { + diamond_descriptor.cell_to_node_vector[i_diamond_cell].resize(primal_face_node_list.size() + 1); - const auto& primal_node_local_number_in_their_cells = primal_connectivity.nodeLocalNumbersInTheirCells(); + const CellId cell_id = primal_face_cell_list[0]; + const auto i_face_in_cell = primal_face_local_number_in_their_cells(i_face, 0); + + for (size_t i_node = 0; i_node < primal_face_node_list.size(); ++i_node) { + diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node] = primal_face_node_list[i_node]; + } + diamond_descriptor.cell_to_node_vector[i_diamond_cell][primal_face_node_list.size()] = + primal_number_of_nodes + cell_id; + + if (cell_face_is_reversed(cell_id, i_face_in_cell)) { + if constexpr (Dimension == 2) { + std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][0], + diamond_descriptor.cell_to_node_vector[i_diamond_cell][1]); + + } else { + for (size_t i_node = 0; i_node < primal_face_node_list.size() / 2; ++i_node) { + std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node], + diamond_descriptor + .cell_to_node_vector[i_diamond_cell][primal_face_node_list.size() - 1 - i_node]); + } + } + } + } else { + Assert(primal_face_cell_list.size() == 2); + diamond_descriptor.cell_to_node_vector[i_diamond_cell].resize(primal_face_node_list.size() + 2); + + const CellId cell0_id = primal_face_cell_list[0]; + const CellId cell1_id = primal_face_cell_list[1]; + const auto i_face_in_cell0 = primal_face_local_number_in_their_cells(i_face, 0); + + if constexpr (Dimension == 2) { + Assert(primal_face_node_list.size() == 2); + diamond_descriptor.cell_to_node_vector[i_diamond_cell][0] = primal_number_of_nodes + cell0_id; + diamond_descriptor.cell_to_node_vector[i_diamond_cell][1] = primal_face_node_list[0]; + diamond_descriptor.cell_to_node_vector[i_diamond_cell][2] = primal_number_of_nodes + cell1_id; + diamond_descriptor.cell_to_node_vector[i_diamond_cell][3] = primal_face_node_list[1]; + + if (cell_face_is_reversed(cell0_id, i_face_in_cell0)) { + std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][1], + diamond_descriptor.cell_to_node_vector[i_diamond_cell][3]); + } + } else { + diamond_descriptor.cell_to_node_vector[i_diamond_cell][0] = primal_number_of_nodes + cell0_id; + for (size_t i_node = 0; i_node < primal_face_node_list.size(); ++i_node) { + diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node + 1] = primal_face_node_list[i_node]; + } + diamond_descriptor.cell_to_node_vector[i_diamond_cell][primal_face_node_list.size() + 1] = + primal_number_of_nodes + cell1_id; + + if (cell_face_is_reversed(cell0_id, i_face_in_cell0)) { + std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][0], + diamond_descriptor.cell_to_node_vector[i_diamond_cell][primal_face_node_list.size() + 1]); + } + } + } + } +} +template <> +void +DiamondDualMeshBuilder::_buildDiamondConnectivityDescriptor<1>(const Connectivity<1>& primal_connectivity, + ConnectivityDescriptor& diamond_descriptor) +{ + const size_t primal_number_of_nodes = primal_connectivity.numberOfNodes(); + const size_t primal_number_of_faces = primal_connectivity.numberOfFaces(); + const size_t primal_number_of_cells = primal_connectivity.numberOfCells(); + + const size_t diamond_number_of_nodes = 2 * primal_number_of_nodes - primal_number_of_cells; + + diamond_descriptor.node_number_vector.resize(diamond_number_of_nodes); + + const auto& primal_node_number = primal_connectivity.nodeNumber(); + + const size_t diamond_number_of_cells = primal_number_of_faces; + const size_t number_of_kept_nodes = 2 * (diamond_number_of_nodes - diamond_number_of_cells); + + const auto& primal_node_to_cell_matrix = primal_connectivity.nodeToCellMatrix(); + size_t next_kept_node_id = 0; + + for (NodeId node_id = 0; node_id < primal_connectivity.numberOfNodes(); ++node_id) { + const auto& primal_node_cell_list = primal_node_to_cell_matrix[node_id]; + if (primal_node_cell_list.size() == 1) { + diamond_descriptor.node_number_vector[next_kept_node_id++] = primal_node_number[node_id]; + } + } + + if (number_of_kept_nodes != next_kept_node_id) { + throw UnexpectedError("unexpected number of kept node" + std::to_string(next_kept_node_id) + + " != " + std::to_string(number_of_kept_nodes)); + } + + diamond_descriptor.cell_number_vector.resize(diamond_number_of_cells); + + for (NodeId primal_node_id = 0; primal_node_id < primal_number_of_nodes; ++primal_node_id) { + diamond_descriptor.cell_number_vector[primal_node_id] = primal_node_number[primal_node_id]; + } + + diamond_descriptor.cell_type_vector.resize(diamond_number_of_cells); + + for (NodeId node_id = 0; node_id < primal_connectivity.numberOfNodes(); ++node_id) { + const size_t i_cell = node_id; + + diamond_descriptor.cell_type_vector[i_cell] = CellType::Line; + } + + diamond_descriptor.cell_to_node_vector.resize(diamond_number_of_cells); + + ; + + const auto& primal_node_local_number_in_their_cells = primal_connectivity.nodeLocalNumbersInTheirCells(); + + { + size_t next_kept_node_id = 0; for (NodeId i_node = 0; i_node < primal_connectivity.numberOfNodes(); ++i_node) { const size_t& i_diamond_cell = i_node; const auto& primal_node_cell_list = primal_node_to_cell_matrix[i_node]; diamond_descriptor.cell_to_node_vector[i_diamond_cell].resize(2); if (primal_node_cell_list.size() == 1) { - const CellId cell_id = primal_node_cell_list[0]; const auto i_node_in_cell = primal_node_local_number_in_their_cells(i_node, 0); diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node_in_cell] = next_kept_node_id++; @@ -145,75 +222,6 @@ DiamondDualMeshBuilder::_buildDiamondConnectivityDescriptor(const Connectivity<D diamond_descriptor.cell_to_node_vector[i_diamond_cell][1] = number_of_kept_nodes + primal_node_cell_list[1]; } } - } else { - static_assert(Dimension > 1, "invalid dimension"); - - const auto& primal_face_to_node_matrix = primal_connectivity.faceToNodeMatrix(); - const auto& primal_face_local_number_in_their_cells = primal_connectivity.faceLocalNumbersInTheirCells(); - const auto& cell_face_is_reversed = primal_connectivity.cellFaceIsReversed(); - for (FaceId i_face = 0; i_face < primal_connectivity.numberOfFaces(); ++i_face) { - const size_t& i_diamond_cell = i_face; - const auto& primal_face_cell_list = primal_face_to_cell_matrix[i_face]; - const auto& primal_face_node_list = primal_face_to_node_matrix[i_face]; - if (primal_face_cell_list.size() == 1) { - diamond_descriptor.cell_to_node_vector[i_diamond_cell].resize(primal_face_node_list.size() + 1); - - const CellId cell_id = primal_face_cell_list[0]; - const auto i_face_in_cell = primal_face_local_number_in_their_cells(i_face, 0); - - for (size_t i_node = 0; i_node < primal_face_node_list.size(); ++i_node) { - diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node] = primal_face_node_list[i_node]; - } - diamond_descriptor.cell_to_node_vector[i_diamond_cell][primal_face_node_list.size()] = - primal_number_of_nodes + cell_id; - - if (cell_face_is_reversed(cell_id, i_face_in_cell)) { - if constexpr (Dimension == 2) { - std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][0], - diamond_descriptor.cell_to_node_vector[i_diamond_cell][1]); - - } else { - for (size_t i_node = 0; i_node < primal_face_node_list.size() / 2; ++i_node) { - std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node], - diamond_descriptor - .cell_to_node_vector[i_diamond_cell][primal_face_node_list.size() - 1 - i_node]); - } - } - } - } else { - Assert(primal_face_cell_list.size() == 2); - diamond_descriptor.cell_to_node_vector[i_diamond_cell].resize(primal_face_node_list.size() + 2); - - const CellId cell0_id = primal_face_cell_list[0]; - const CellId cell1_id = primal_face_cell_list[1]; - const auto i_face_in_cell0 = primal_face_local_number_in_their_cells(i_face, 0); - - if constexpr (Dimension == 2) { - Assert(primal_face_node_list.size() == 2); - diamond_descriptor.cell_to_node_vector[i_diamond_cell][0] = primal_number_of_nodes + cell0_id; - diamond_descriptor.cell_to_node_vector[i_diamond_cell][1] = primal_face_node_list[0]; - diamond_descriptor.cell_to_node_vector[i_diamond_cell][2] = primal_number_of_nodes + cell1_id; - diamond_descriptor.cell_to_node_vector[i_diamond_cell][3] = primal_face_node_list[1]; - - if (cell_face_is_reversed(cell0_id, i_face_in_cell0)) { - std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][1], - diamond_descriptor.cell_to_node_vector[i_diamond_cell][3]); - } - } else { - diamond_descriptor.cell_to_node_vector[i_diamond_cell][0] = primal_number_of_nodes + cell0_id; - for (size_t i_node = 0; i_node < primal_face_node_list.size(); ++i_node) { - diamond_descriptor.cell_to_node_vector[i_diamond_cell][i_node + 1] = primal_face_node_list[i_node]; - } - diamond_descriptor.cell_to_node_vector[i_diamond_cell][primal_face_node_list.size() + 1] = - primal_number_of_nodes + cell1_id; - - if (cell_face_is_reversed(cell0_id, i_face_in_cell0)) { - std::swap(diamond_descriptor.cell_to_node_vector[i_diamond_cell][0], - diamond_descriptor.cell_to_node_vector[i_diamond_cell][primal_face_node_list.size() + 1]); - } - } - } - } } } @@ -252,8 +260,7 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh> for (size_t i_node_list = 0; i_node_list < primal_connectivity.template numberOfRefItemList<ItemType::node>(); ++i_node_list) { const auto& primal_ref_node_list = primal_connectivity.template refItemList<ItemType::node>(i_node_list); - std::cout << "treating " << primal_ref_node_list.refId() << '\n'; - const auto& primal_node_list = primal_ref_node_list.list(); + const auto& primal_node_list = primal_ref_node_list.list(); const std::vector<NodeId> diamond_node_list = [&]() { std::vector<NodeId> diamond_node_list; @@ -275,6 +282,7 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh> node_array[i] = diamond_node_list[i]; } diamond_descriptor.addRefItemList(RefNodeList{primal_ref_node_list.refId(), node_array}); + std::cout << "stored " << primal_ref_node_list.refId() << '\n'; } } } @@ -297,8 +305,7 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh> for (size_t i_face_list = 0; i_face_list < primal_connectivity.template numberOfRefItemList<ItemType::face>(); ++i_face_list) { const auto& primal_ref_face_list = primal_connectivity.template refItemList<ItemType::face>(i_face_list); - std::cout << "treating " << primal_ref_face_list.refId() << '\n'; - const auto& primal_face_list = primal_ref_face_list.list(); + const auto& primal_face_list = primal_ref_face_list.list(); const std::vector<FaceId> diamond_face_list = [&]() { std::vector<FaceId> diamond_face_list; @@ -329,6 +336,7 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh> face_array[i] = diamond_face_list[i]; } diamond_descriptor.addRefItemList(RefFaceList{primal_ref_face_list.refId(), face_array}); + std::cout << "stored " << primal_ref_face_list.refId() << '\n'; } } } @@ -349,8 +357,7 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh> for (size_t i_edge_list = 0; i_edge_list < primal_connectivity.template numberOfRefItemList<ItemType::edge>(); ++i_edge_list) { const auto& primal_ref_edge_list = primal_connectivity.template refItemList<ItemType::edge>(i_edge_list); - std::cout << "treating " << primal_ref_edge_list.refId() << '\n'; - const auto& primal_edge_list = primal_ref_edge_list.list(); + const auto& primal_edge_list = primal_ref_edge_list.list(); const std::vector<EdgeId> diamond_edge_list = [&]() { std::vector<EdgeId> diamond_edge_list; @@ -381,6 +388,7 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh> edge_array[i] = diamond_edge_list[i]; } diamond_descriptor.addRefItemList(RefEdgeList{primal_ref_edge_list.refId(), edge_array}); + std::cout << "stored " << primal_ref_edge_list.refId() << '\n'; } } } @@ -476,7 +484,6 @@ DiamondDualMeshBuilder::_buildDiamondMeshFrom(const std::shared_ptr<const IMesh> const auto primal_xj = primal_mesh_data.xj(); { -#warning define transfer functions if constexpr (Dimension == 1) { const auto& node_to_cell_matrix = primal_connectivity.nodeToCellMatrix(); NodeId next_node_id = 0; -- GitLab