From e6bb5bed0c240b3cd4efc11432bfa0bf0f18c5a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Fri, 26 Jul 2024 14:53:54 +0200 Subject: [PATCH] Reorganize slightly integration descriptors --- src/scheme/IntegrationMethodType.hpp | 38 +++++++++++++++++++ src/scheme/PolynomialReconstruction.cpp | 10 ++--- .../PolynomialReconstructionDescriptor.hpp | 20 +++------- src/scheme/test_reconstruction.cpp | 33 ++++------------ tests/test_PolynomialReconstruction.cpp | 4 +- ...est_PolynomialReconstructionDescriptor.cpp | 13 ++----- ...test_QuadraticPolynomialReconstruction.cpp | 25 ++++++------ 7 files changed, 70 insertions(+), 73 deletions(-) create mode 100644 src/scheme/IntegrationMethodType.hpp diff --git a/src/scheme/IntegrationMethodType.hpp b/src/scheme/IntegrationMethodType.hpp new file mode 100644 index 000000000..33264f1dc --- /dev/null +++ b/src/scheme/IntegrationMethodType.hpp @@ -0,0 +1,38 @@ +#ifndef INTEGRATION_METHOD_TYPE_HPP +#define INTEGRATION_METHOD_TYPE_HPP + +#include <utils/PugsMacros.hpp> + +#include <string> + +enum class IntegrationMethodType +{ + boundary, // use divergence theorem to compute polynomial + // integrals + cell_center, // use exact integrals for degree 1 polynomials + // using evaluation at mass center + element // use element based quadrature to compute + // polynomial integrals +}; + +std::string PUGS_INLINE +name(const IntegrationMethodType& method_type) +{ + std::string method_name; + switch (method_type) { + case IntegrationMethodType::boundary: { + method_name = "boundary"; + break; + } + case IntegrationMethodType::cell_center: { + method_name = "cell center"; + break; + } + case IntegrationMethodType::element: { + method_name = "element"; + } + } + return method_name; +} + +#endif // INTEGRATION_METHOD_TYPE_HPP diff --git a/src/scheme/PolynomialReconstruction.cpp b/src/scheme/PolynomialReconstruction.cpp index 270d663c3..7673255bb 100644 --- a/src/scheme/PolynomialReconstruction.cpp +++ b/src/scheme/PolynomialReconstruction.cpp @@ -671,7 +671,7 @@ PolynomialReconstruction::_build( ShrinkMatrixView A(A_pool[t], stencil_cell_list.size()); if ((m_descriptor.degree() == 1) and - (m_descriptor.integrationMethod() == PolynomialReconstructionDescriptor::IntegrationMethod::cell_center)) { + (m_descriptor.integrationMethodType() == IntegrationMethodType::cell_center)) { const Rd& Xj = xj[cell_j_id]; for (size_t i = 0; i < stencil_cell_list.size(); ++i) { const CellId cell_i_id = stencil_cell_list[i]; @@ -681,11 +681,9 @@ PolynomialReconstruction::_build( } } - } else if ((m_descriptor.integrationMethod() == - PolynomialReconstructionDescriptor::IntegrationMethod::element) or - (m_descriptor.integrationMethod() == - PolynomialReconstructionDescriptor::IntegrationMethod::boundary)) { - if ((m_descriptor.integrationMethod() == PolynomialReconstructionDescriptor::IntegrationMethod::boundary) and + } else if ((m_descriptor.integrationMethodType() == IntegrationMethodType::element) or + (m_descriptor.integrationMethodType() == IntegrationMethodType::boundary)) { + if ((m_descriptor.integrationMethodType() == IntegrationMethodType::boundary) and (MeshType::Dimension == 2)) { if constexpr (MeshType::Dimension == 2) { SmallArray<double>& inv_Vj_alpha_p_1_wq_X_prime_orth_ek = inv_Vj_alpha_p_1_wq_X_prime_orth_ek_pool[t]; diff --git a/src/scheme/PolynomialReconstructionDescriptor.hpp b/src/scheme/PolynomialReconstructionDescriptor.hpp index b561f7080..1160724c4 100644 --- a/src/scheme/PolynomialReconstructionDescriptor.hpp +++ b/src/scheme/PolynomialReconstructionDescriptor.hpp @@ -1,6 +1,7 @@ #ifndef POLYNOMIAL_RECONSTRUCTION_DESCRIPTOR_HPP #define POLYNOMIAL_RECONSTRUCTION_DESCRIPTOR_HPP +#include <scheme/IntegrationMethodType.hpp> #include <utils/PugsMacros.hpp> #include <cstddef> @@ -8,26 +9,15 @@ class PolynomialReconstructionDescriptor { public: - enum class IntegrationMethod - { - cell_center, // use exact integrals for degree 1 polynomials - // using evaluation at mass center - element, // use element based quadrature to compute - // polynomial integrals - boundary // use divergence theorem to compute polynomial - // integrals - }; - private: - IntegrationMethod m_integration_method; + IntegrationMethodType m_integration_method; size_t m_degree; bool m_preconditioning = true; bool m_row_weighting = true; public: - PUGS_INLINE - IntegrationMethod - integrationMethod() const + PUGS_INLINE IntegrationMethodType + integrationMethodType() const { return m_integration_method; } @@ -74,7 +64,7 @@ class PolynomialReconstructionDescriptor m_row_weighting = row_weighting; } - PolynomialReconstructionDescriptor(const IntegrationMethod integration_method, const size_t degree) + PolynomialReconstructionDescriptor(const IntegrationMethodType integration_method, const size_t degree) : m_integration_method{integration_method}, m_degree{degree} {} diff --git a/src/scheme/test_reconstruction.cpp b/src/scheme/test_reconstruction.cpp index 3753143d3..01007d156 100644 --- a/src/scheme/test_reconstruction.cpp +++ b/src/scheme/test_reconstruction.cpp @@ -1,5 +1,6 @@ #include <scheme/test_reconstruction.hpp> +#include <scheme/IntegrationMethodType.hpp> #include <scheme/PolynomialReconstruction.hpp> #include <utils/Timer.hpp> @@ -7,36 +8,18 @@ void test_reconstruction(const std::vector<std::shared_ptr<const DiscreteFunctionVariant>>& discrete_function_variant_list, uint64_t degree) { - std::vector descriptor_list = - {PolynomialReconstructionDescriptor{PolynomialReconstructionDescriptor::IntegrationMethod::cell_center, degree}, - PolynomialReconstructionDescriptor{PolynomialReconstructionDescriptor::IntegrationMethod::element, degree}, - PolynomialReconstructionDescriptor{PolynomialReconstructionDescriptor::IntegrationMethod::boundary, degree}}; + std::vector descriptor_list = {PolynomialReconstructionDescriptor{IntegrationMethodType::cell_center, degree}, + PolynomialReconstructionDescriptor{IntegrationMethodType::element, degree}, + PolynomialReconstructionDescriptor{IntegrationMethodType::boundary, degree}}; [[maybe_unused]] auto x = - PolynomialReconstruction{ - PolynomialReconstructionDescriptor{PolynomialReconstructionDescriptor::IntegrationMethod::cell_center, degree}} - .build(discrete_function_variant_list); + PolynomialReconstruction{PolynomialReconstructionDescriptor{IntegrationMethodType::cell_center, degree}}.build( + discrete_function_variant_list); for (auto&& descriptor : descriptor_list) { - std::string method_name; - switch (descriptor.integrationMethod()) { - case PolynomialReconstructionDescriptor::IntegrationMethod::element: { - method_name = "element"; - break; - } - case PolynomialReconstructionDescriptor::IntegrationMethod::boundary: { - method_name = "boundary"; - break; - } - case PolynomialReconstructionDescriptor::IntegrationMethod::cell_center: { - method_name = "cell_center"; - break; - } - } - const size_t nb_loops = 50; - std::cout << "** variable list at once (" << nb_loops << " times) using " << rang::fgB::yellow << method_name - << rang::fg::reset << "\n"; + std::cout << "** variable list at once (" << nb_loops << " times) using " << rang::fgB::yellow + << name(descriptor.integrationMethodType()) << rang::fg::reset << "\n"; PolynomialReconstruction reconstruction{descriptor}; Timer t; diff --git a/tests/test_PolynomialReconstruction.cpp b/tests/test_PolynomialReconstruction.cpp index dfa092bb1..3efabce26 100644 --- a/tests/test_PolynomialReconstruction.cpp +++ b/tests/test_PolynomialReconstruction.cpp @@ -24,9 +24,7 @@ TEST_CASE("PolynomialReconstruction", "[scheme]") { SECTION("degree 1") { - PolynomialReconstructionDescriptor::IntegrationMethod method = - PolynomialReconstructionDescriptor::IntegrationMethod::cell_center; - PolynomialReconstructionDescriptor descriptor{method, 1}; + PolynomialReconstructionDescriptor descriptor{IntegrationMethodType::cell_center, 1}; SECTION("1D") { diff --git a/tests/test_PolynomialReconstructionDescriptor.cpp b/tests/test_PolynomialReconstructionDescriptor.cpp index eda18e3d6..cadc6aaf4 100644 --- a/tests/test_PolynomialReconstructionDescriptor.cpp +++ b/tests/test_PolynomialReconstructionDescriptor.cpp @@ -11,9 +11,7 @@ TEST_CASE("PolynomialReconstructionDescriptor", "[scheme]") #warning tests are not completed SECTION("degree 1") { - PolynomialReconstructionDescriptor::IntegrationMethod method = - PolynomialReconstructionDescriptor::IntegrationMethod::cell_center; - PolynomialReconstructionDescriptor descriptor{method, 1}; + PolynomialReconstructionDescriptor descriptor{IntegrationMethodType::cell_center, 1}; REQUIRE(descriptor.degree() == 1); REQUIRE(descriptor.preconditioning() == true); @@ -22,10 +20,7 @@ TEST_CASE("PolynomialReconstructionDescriptor", "[scheme]") SECTION("degree 4") { - PolynomialReconstructionDescriptor::IntegrationMethod method = - PolynomialReconstructionDescriptor::IntegrationMethod::cell_center; - - PolynomialReconstructionDescriptor descriptor{method, 4}; + PolynomialReconstructionDescriptor descriptor{IntegrationMethodType::cell_center, 4}; REQUIRE(descriptor.degree() == 4); REQUIRE(descriptor.preconditioning() == true); @@ -34,9 +29,7 @@ TEST_CASE("PolynomialReconstructionDescriptor", "[scheme]") SECTION("utlities") { - PolynomialReconstructionDescriptor::IntegrationMethod method = - PolynomialReconstructionDescriptor::IntegrationMethod::cell_center; - PolynomialReconstructionDescriptor descriptor{method, 3}; + PolynomialReconstructionDescriptor descriptor{IntegrationMethodType::cell_center, 3}; REQUIRE(descriptor.degree() == 3); REQUIRE(descriptor.preconditioning() == true); diff --git a/tests/test_QuadraticPolynomialReconstruction.cpp b/tests/test_QuadraticPolynomialReconstruction.cpp index 6b992e960..c9b1e7222 100644 --- a/tests/test_QuadraticPolynomialReconstruction.cpp +++ b/tests/test_QuadraticPolynomialReconstruction.cpp @@ -35,12 +35,9 @@ TEST_CASE("QuadraticPolynomialReconstruction", "[scheme]") { SECTION("degree 2") { - PolynomialReconstructionDescriptor::IntegrationMethod method = - PolynomialReconstructionDescriptor::IntegrationMethod::element; - PolynomialReconstructionDescriptor descriptor{method, 2}; - SECTION("1D") { + PolynomialReconstructionDescriptor descriptor{IntegrationMethodType::element, 2}; using R1 = TinyVector<1>; QuadratureFormula<1> qf = QuadratureManager::instance().getLineFormula(GaussLegendreQuadratureDescriptor{2}); @@ -584,14 +581,12 @@ TEST_CASE("QuadraticPolynomialReconstruction", "[scheme]") return L1_error; }; - std::map<std::string, PolynomialReconstructionDescriptor> name_method_map = - {{"element", - PolynomialReconstructionDescriptor{PolynomialReconstructionDescriptor::IntegrationMethod::element, 2}}, - {"boundary", - PolynomialReconstructionDescriptor{PolynomialReconstructionDescriptor::IntegrationMethod::boundary, 2}}}; + std::vector<PolynomialReconstructionDescriptor> descriptor_list = + {PolynomialReconstructionDescriptor{IntegrationMethodType::element, 2}, + PolynomialReconstructionDescriptor{IntegrationMethodType::boundary, 2}}; - for (auto [method_name, method_descriptor] : name_method_map) { - SECTION(method_name) + for (auto descriptor : descriptor_list) { + SECTION(name(descriptor.integrationMethodType())) { SECTION("R data") { @@ -621,7 +616,7 @@ TEST_CASE("QuadraticPolynomialReconstruction", "[scheme]") fh[cell_id] = value / Vj[cell_id]; }); - auto reconstructions = PolynomialReconstruction{method_descriptor}.build(fh); + auto reconstructions = PolynomialReconstruction{descriptor}.build(fh); auto dpk_fh = reconstructions[0]->get<DiscreteFunctionDPk<2, const double>>(); @@ -669,7 +664,7 @@ TEST_CASE("QuadraticPolynomialReconstruction", "[scheme]") uh[cell_id] = 1. / Vj[cell_id] * value; }); - auto reconstructions = PolynomialReconstruction{method_descriptor}.build(uh); + auto reconstructions = PolynomialReconstruction{descriptor}.build(uh); auto dpk_uh = reconstructions[0]->get<DiscreteFunctionDPk<2, const R3>>(); @@ -718,7 +713,7 @@ TEST_CASE("QuadraticPolynomialReconstruction", "[scheme]") Ah[cell_id] = 1. / Vj[cell_id] * value; }); - auto reconstructions = PolynomialReconstruction{method_descriptor}.build(Ah); + auto reconstructions = PolynomialReconstruction{descriptor}.build(Ah); auto dpk_Ah = reconstructions[0]->get<DiscreteFunctionDPk<2, const R2x2>>(); @@ -733,6 +728,8 @@ TEST_CASE("QuadraticPolynomialReconstruction", "[scheme]") SECTION("3D") { + PolynomialReconstructionDescriptor descriptor{IntegrationMethodType::element, 2}; + using R3 = TinyVector<3>; auto integrate_in_cell = [](const CellType& cell_type, const auto& cell_node_list, const auto& xr, -- GitLab