From 9610f90df6792a8433bebb0cc41487b9ca2bc935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Fri, 17 Dec 2021 13:08:36 +0100 Subject: [PATCH] Add tests for ConnectivityToDiamondDualConnectivityDataMapper --- ...ityToDiamondDualConnectivityDataMapper.hpp | 30 +- tests/CMakeLists.txt | 1 + ...ityToDiamondDualConnectivityDataMapper.cpp | 309 ++++++++++++++++++ 3 files changed, 330 insertions(+), 10 deletions(-) create mode 100644 tests/test_ConnectivityToDiamondDualConnectivityDataMapper.cpp diff --git a/src/mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp b/src/mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp index 17cb3c0ad..be6833eb5 100644 --- a/src/mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp +++ b/src/mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp @@ -30,9 +30,12 @@ class ConnectivityToDiamondDualConnectivityDataMapper : public IConnectivityToDu static_assert(std::is_same_v<std::remove_const_t<OriginDataType1>, DestinationDataType>, "incompatible types"); static_assert(std::is_same_v<std::remove_const_t<OriginDataType2>, DestinationDataType>, "incompatible types"); - Assert(m_primal_connectivity == primal_cell_value.connectivity_ptr().get()); - Assert(m_primal_connectivity == primal_node_value.connectivity_ptr().get()); - Assert(m_dual_connectivity == dual_node_value.connectivity_ptr().get()); + Assert(m_primal_connectivity == primal_cell_value.connectivity_ptr().get(), + "unexpected connectivity for primal CellValue"); + Assert(m_primal_connectivity == primal_node_value.connectivity_ptr().get(), + "unexpected connectivity for primal NodeValue"); + Assert(m_dual_connectivity == dual_node_value.connectivity_ptr().get(), + "unexpected connectivity for dual NodeValue"); parallel_for( m_primal_node_to_dual_node_map.size(), PUGS_LAMBDA(size_t i) { @@ -59,9 +62,12 @@ class ConnectivityToDiamondDualConnectivityDataMapper : public IConnectivityToDu static_assert(std::is_same_v<std::remove_const_t<OriginDataType>, DestinationDataType1>, "incompatible types"); static_assert(std::is_same_v<std::remove_const_t<OriginDataType>, DestinationDataType2>, "incompatible types"); - Assert(m_primal_connectivity == primal_cell_value.connectivity_ptr().get()); - Assert(m_primal_connectivity == primal_node_value.connectivity_ptr().get()); - Assert(m_dual_connectivity == dual_node_value.connectivity_ptr().get()); + Assert(m_primal_connectivity == primal_cell_value.connectivity_ptr().get(), + "unexpected connectivity for primal CellValue"); + Assert(m_primal_connectivity == primal_node_value.connectivity_ptr().get(), + "unexpected connectivity for primal NodeValue"); + Assert(m_dual_connectivity == dual_node_value.connectivity_ptr().get(), + "unexpected connectivity for dual NodeValue"); parallel_for( m_primal_node_to_dual_node_map.size(), PUGS_LAMBDA(size_t i) { @@ -85,8 +91,10 @@ class ConnectivityToDiamondDualConnectivityDataMapper : public IConnectivityToDu static_assert(not std::is_const_v<DestinationDataType>, "destination data type must not be constant"); static_assert(std::is_same_v<std::remove_const_t<OriginDataType>, DestinationDataType>, "incompatible types"); - Assert(m_primal_connectivity == primal_face_value.connectivity_ptr().get()); - Assert(m_dual_connectivity == dual_cell_value.connectivity_ptr().get()); + Assert(m_primal_connectivity == primal_face_value.connectivity_ptr().get(), + "unexpected connectivity for primal FaceValue"); + Assert(m_dual_connectivity == dual_cell_value.connectivity_ptr().get(), + "unexpected connectivity for dual CellValue"); parallel_for( m_primal_face_to_dual_cell_map.size(), PUGS_LAMBDA(size_t i) { @@ -104,8 +112,10 @@ class ConnectivityToDiamondDualConnectivityDataMapper : public IConnectivityToDu static_assert(not std::is_const_v<DestinationDataType>, "destination data type must not be constant"); static_assert(std::is_same_v<std::remove_const_t<OriginDataType>, DestinationDataType>, "incompatible types"); - Assert(m_primal_connectivity == primal_face_value.connectivity_ptr().get()); - Assert(m_dual_connectivity == dual_cell_value.connectivity_ptr().get()); + Assert(m_primal_connectivity == primal_face_value.connectivity_ptr().get(), + "unexpected connectivity for primal FaceValue"); + Assert(m_dual_connectivity == dual_cell_value.connectivity_ptr().get(), + "unexpected connectivity for dual CellValue"); parallel_for( m_primal_face_to_dual_cell_map.size(), PUGS_LAMBDA(size_t i) { diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index c635fde52..3358d2966 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -56,6 +56,7 @@ add_executable (unit_tests test_CellIntegrator.cpp test_ConsoleManager.cpp test_CG.cpp + test_ConnectivityToDiamondDualConnectivityDataMapper.cpp test_ContinueProcessor.cpp test_ConcatExpressionProcessor.cpp test_CRSGraph.cpp diff --git a/tests/test_ConnectivityToDiamondDualConnectivityDataMapper.cpp b/tests/test_ConnectivityToDiamondDualConnectivityDataMapper.cpp new file mode 100644 index 000000000..1aa3a2c13 --- /dev/null +++ b/tests/test_ConnectivityToDiamondDualConnectivityDataMapper.cpp @@ -0,0 +1,309 @@ +#include <catch2/catch_test_macros.hpp> +#include <catch2/matchers/catch_matchers_all.hpp> + +#include <MeshDataBaseForTests.hpp> +#include <mesh/ConnectivityToDiamondDualConnectivityDataMapper.hpp> +#include <mesh/DualConnectivityManager.hpp> + +#include <mesh/Connectivity.hpp> +#include <mesh/Mesh.hpp> + +// clazy:excludeall=non-pod-global-static + +TEST_CASE("ConnectivityToDiamondDualConnectivityDataMapper", "[mesh]") +{ + SECTION("2D") + { + constexpr static size_t Dimension = 2; + + using ConnectivityType = Connectivity<Dimension>; + using MeshType = Mesh<ConnectivityType>; + + std::shared_ptr<const MeshType> mesh = MeshDataBaseForTests::get().hybrid2DMesh(); + const ConnectivityType& primal_connectivity = mesh->connectivity(); + + std::shared_ptr p_diamond_dual_connectivity = + DualConnectivityManager::instance().getDiamondDualConnectivity(primal_connectivity); + const ConnectivityType& dual_connectivity = *p_diamond_dual_connectivity; + + std::shared_ptr p_connectivity_to_dual_connectivity_mapper = + DualConnectivityManager::instance().getConnectivityToDiamondDualConnectivityDataMapper(primal_connectivity); + const auto& connectivity_to_dual_connectivity_mapper = *p_connectivity_to_dual_connectivity_mapper; + + SECTION("check data transfer between primal faces to dual cells") + { + const auto& primal_face_to_cell_matrix = primal_connectivity.faceToCellMatrix(); + + FaceValue<size_t> primal_face_value{primal_connectivity}; + parallel_for( + primal_face_value.numberOfItems(), PUGS_LAMBDA(const FaceId face_id) { + primal_face_value[face_id] = primal_face_to_cell_matrix[face_id].size() + face_id; + }); + + CellValue<size_t> dual_from_primal_face_value{dual_connectivity}; + + connectivity_to_dual_connectivity_mapper.toDualCell(primal_face_value, dual_from_primal_face_value); + + { + const auto& dual_cell_to_node_matrix = dual_connectivity.cellToNodeMatrix(); + bool correct_value = true; + for (CellId cell_id = 0; cell_id < dual_connectivity.numberOfCells(); ++cell_id) { + correct_value &= + (dual_cell_to_node_matrix[cell_id].size() + cell_id == dual_from_primal_face_value[cell_id] + 2); + } + REQUIRE(correct_value); + } + + { + bool is_same = true; + FaceValue<size_t> primal_from_dual_cell_value{primal_connectivity}; + connectivity_to_dual_connectivity_mapper.fromDualCell(dual_from_primal_face_value, primal_from_dual_cell_value); + for (FaceId face_id = 0; face_id < primal_connectivity.numberOfFaces(); ++face_id) { + is_same &= (primal_from_dual_cell_value[face_id] == primal_face_value[face_id]); + } + REQUIRE(is_same); + } + +#ifndef NDEBUG + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.toDualCell(FaceValue<size_t>{dual_connectivity}, + dual_from_primal_face_value), + "unexpected connectivity for primal FaceValue"); + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.toDualCell(primal_face_value, + CellValue<size_t>{primal_connectivity}), + "unexpected connectivity for dual CellValue"); + + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.fromDualCell(dual_from_primal_face_value, + FaceValue<size_t>{dual_connectivity}), + "unexpected connectivity for primal FaceValue"); + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.fromDualCell(CellValue<size_t>{primal_connectivity}, + primal_face_value), + "unexpected connectivity for dual CellValue"); + +#endif // NDEBUG + } + + SECTION("check data transfer between primal nodes and cells to dual nodes") + { + const auto& primal_cell_to_node_matrix = primal_connectivity.cellToNodeMatrix(); + CellValue<size_t> primal_cell_value{primal_connectivity}; + const size_t number_of_nodes = primal_connectivity.numberOfNodes(); + parallel_for( + primal_cell_value.numberOfItems(), PUGS_LAMBDA(const CellId cell_id) { + primal_cell_value[cell_id] = primal_cell_to_node_matrix[cell_id].size() + number_of_nodes + cell_id; + }); + + const auto& primal_node_to_face_matrix = primal_connectivity.nodeToFaceMatrix(); + NodeValue<size_t> primal_node_value{primal_connectivity}; + parallel_for( + primal_node_value.numberOfItems(), PUGS_LAMBDA(const NodeId node_id) { + primal_node_value[node_id] = primal_node_to_face_matrix[node_id].size() + node_id; + }); + + NodeValue<size_t> dual_from_primal_cell_and_node_value{dual_connectivity}; + + connectivity_to_dual_connectivity_mapper.toDualNode(primal_node_value, primal_cell_value, + dual_from_primal_cell_and_node_value); + + { + const auto& dual_node_to_cell_matrix = dual_connectivity.nodeToCellMatrix(); + bool correct_dual_value = true; + for (NodeId node_id = 0; node_id < dual_connectivity.numberOfNodes(); ++node_id) { + correct_dual_value &= + (dual_from_primal_cell_and_node_value[node_id] == dual_node_to_cell_matrix[node_id].size() + node_id); + } + REQUIRE(correct_dual_value); + } + + { + bool is_same = true; + NodeValue<size_t> primal_from_dual_node_value{primal_connectivity}; + CellValue<size_t> primal_from_dual_cell_value{primal_connectivity}; + connectivity_to_dual_connectivity_mapper.fromDualNode(dual_from_primal_cell_and_node_value, + primal_from_dual_node_value, primal_from_dual_cell_value); + for (CellId cell_id = 0; cell_id < primal_connectivity.numberOfCells(); ++cell_id) { + is_same &= (primal_cell_value[cell_id] == primal_from_dual_cell_value[cell_id]); + } + for (NodeId node_id = 0; node_id < primal_connectivity.numberOfNodes(); ++node_id) { + is_same &= (primal_node_value[node_id] == primal_from_dual_node_value[node_id]); + } + + REQUIRE(is_same); + } + +#ifndef NDEBUG + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.toDualNode(NodeValue<size_t>{dual_connectivity}, + primal_cell_value, + dual_from_primal_cell_and_node_value), + "unexpected connectivity for primal NodeValue"); + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.toDualNode(primal_node_value, + CellValue<size_t>{dual_connectivity}, + dual_from_primal_cell_and_node_value), + "unexpected connectivity for primal CellValue"); + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.toDualNode(primal_node_value, primal_cell_value, + NodeValue<size_t>{primal_connectivity}), + "unexpected connectivity for dual NodeValue"); + + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.fromDualNode(dual_from_primal_cell_and_node_value, + NodeValue<size_t>{dual_connectivity}, + primal_cell_value), + "unexpected connectivity for primal NodeValue"); + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.fromDualNode(dual_from_primal_cell_and_node_value, + primal_node_value, + CellValue<size_t>{dual_connectivity}), + "unexpected connectivity for primal CellValue"); + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.fromDualNode(NodeValue<size_t>{primal_connectivity}, + primal_node_value, primal_cell_value), + "unexpected connectivity for dual NodeValue"); + +#endif // NDEBUG + } + } + + SECTION("3D") + { + constexpr static size_t Dimension = 3; + + using ConnectivityType = Connectivity<Dimension>; + using MeshType = Mesh<ConnectivityType>; + + std::shared_ptr<const MeshType> mesh = MeshDataBaseForTests::get().hybrid3DMesh(); + const ConnectivityType& primal_connectivity = mesh->connectivity(); + + std::shared_ptr p_diamond_dual_connectivity = + DualConnectivityManager::instance().getDiamondDualConnectivity(primal_connectivity); + const ConnectivityType& dual_connectivity = *p_diamond_dual_connectivity; + + std::shared_ptr p_connectivity_to_dual_connectivity_mapper = + DualConnectivityManager::instance().getConnectivityToDiamondDualConnectivityDataMapper(primal_connectivity); + const auto& connectivity_to_dual_connectivity_mapper = *p_connectivity_to_dual_connectivity_mapper; + + SECTION("check data transfer between primal faces to dual cells") + { + const auto& primal_face_to_cell_matrix = primal_connectivity.faceToCellMatrix(); + const auto& primal_face_to_node_matrix = primal_connectivity.faceToNodeMatrix(); + + FaceValue<size_t> primal_face_value{primal_connectivity}; + parallel_for( + primal_face_value.numberOfItems(), PUGS_LAMBDA(const FaceId face_id) { + primal_face_value[face_id] = + primal_face_to_cell_matrix[face_id].size() + primal_face_to_node_matrix[face_id].size() + face_id; + }); + + CellValue<size_t> dual_from_primal_face_value{dual_connectivity}; + + connectivity_to_dual_connectivity_mapper.toDualCell(primal_face_value, dual_from_primal_face_value); + + { + const auto& dual_cell_to_node_matrix = dual_connectivity.cellToNodeMatrix(); + bool correct_value = true; + for (CellId cell_id = 0; cell_id < dual_connectivity.numberOfCells(); ++cell_id) { + correct_value &= (dual_cell_to_node_matrix[cell_id].size() + cell_id == dual_from_primal_face_value[cell_id]); + } + REQUIRE(correct_value); + } + + { + bool is_same = true; + FaceValue<size_t> primal_from_dual_cell_value{primal_connectivity}; + connectivity_to_dual_connectivity_mapper.fromDualCell(dual_from_primal_face_value, primal_from_dual_cell_value); + for (FaceId face_id = 0; face_id < primal_connectivity.numberOfFaces(); ++face_id) { + is_same &= (primal_from_dual_cell_value[face_id] == primal_face_value[face_id]); + } + REQUIRE(is_same); + } + +#ifndef NDEBUG + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.toDualCell(FaceValue<size_t>{dual_connectivity}, + dual_from_primal_face_value), + "unexpected connectivity for primal FaceValue"); + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.toDualCell(primal_face_value, + CellValue<size_t>{primal_connectivity}), + "unexpected connectivity for dual CellValue"); + + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.fromDualCell(dual_from_primal_face_value, + FaceValue<size_t>{dual_connectivity}), + "unexpected connectivity for primal FaceValue"); + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.fromDualCell(CellValue<size_t>{primal_connectivity}, + primal_face_value), + "unexpected connectivity for dual CellValue"); + +#endif // NDEBUG + } + + SECTION("check data transfer between primal nodes and cells to dual nodes") + { + const auto& primal_cell_to_face_matrix = primal_connectivity.cellToFaceMatrix(); + CellValue<size_t> primal_cell_value{primal_connectivity}; + const size_t number_of_nodes = primal_connectivity.numberOfNodes(); + parallel_for( + primal_cell_value.numberOfItems(), PUGS_LAMBDA(const CellId cell_id) { + primal_cell_value[cell_id] = primal_cell_to_face_matrix[cell_id].size() + number_of_nodes + cell_id; + }); + + const auto& primal_node_to_face_matrix = primal_connectivity.nodeToFaceMatrix(); + NodeValue<size_t> primal_node_value{primal_connectivity}; + parallel_for( + primal_node_value.numberOfItems(), PUGS_LAMBDA(const NodeId node_id) { + primal_node_value[node_id] = primal_node_to_face_matrix[node_id].size() + node_id; + }); + + NodeValue<size_t> dual_from_primal_cell_and_node_value{dual_connectivity}; + + connectivity_to_dual_connectivity_mapper.toDualNode(primal_node_value, primal_cell_value, + dual_from_primal_cell_and_node_value); + + { + const auto& dual_node_to_cell_matrix = dual_connectivity.nodeToCellMatrix(); + bool correct_dual_value = true; + for (NodeId node_id = 0; node_id < dual_connectivity.numberOfNodes(); ++node_id) { + correct_dual_value &= + (dual_from_primal_cell_and_node_value[node_id] == dual_node_to_cell_matrix[node_id].size() + node_id); + } + REQUIRE(correct_dual_value); + } + + { + bool is_same = true; + NodeValue<size_t> primal_from_dual_node_value{primal_connectivity}; + CellValue<size_t> primal_from_dual_cell_value{primal_connectivity}; + connectivity_to_dual_connectivity_mapper.fromDualNode(dual_from_primal_cell_and_node_value, + primal_from_dual_node_value, primal_from_dual_cell_value); + for (CellId cell_id = 0; cell_id < primal_connectivity.numberOfCells(); ++cell_id) { + is_same &= (primal_cell_value[cell_id] == primal_from_dual_cell_value[cell_id]); + } + for (NodeId node_id = 0; node_id < primal_connectivity.numberOfNodes(); ++node_id) { + is_same &= (primal_node_value[node_id] == primal_from_dual_node_value[node_id]); + } + + REQUIRE(is_same); + } + +#ifndef NDEBUG + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.toDualNode(NodeValue<size_t>{dual_connectivity}, + primal_cell_value, + dual_from_primal_cell_and_node_value), + "unexpected connectivity for primal NodeValue"); + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.toDualNode(primal_node_value, + CellValue<size_t>{dual_connectivity}, + dual_from_primal_cell_and_node_value), + "unexpected connectivity for primal CellValue"); + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.toDualNode(primal_node_value, primal_cell_value, + NodeValue<size_t>{primal_connectivity}), + "unexpected connectivity for dual NodeValue"); + + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.fromDualNode(dual_from_primal_cell_and_node_value, + NodeValue<size_t>{dual_connectivity}, + primal_cell_value), + "unexpected connectivity for primal NodeValue"); + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.fromDualNode(dual_from_primal_cell_and_node_value, + primal_node_value, + CellValue<size_t>{dual_connectivity}), + "unexpected connectivity for primal CellValue"); + REQUIRE_THROWS_WITH(connectivity_to_dual_connectivity_mapper.fromDualNode(NodeValue<size_t>{primal_connectivity}, + primal_node_value, primal_cell_value), + "unexpected connectivity for dual NodeValue"); + +#endif // NDEBUG + } + } +} -- GitLab