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