From b4c6ee7071c07907b48f5ed9e7fe98d6c4658002 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Wed, 26 Jun 2024 19:23:51 +0200
Subject: [PATCH] Begin code cleaning and interface improvements

---
 src/scheme/DiscreteFunctionDPk.hpp      |  16 +--
 src/scheme/PolynomialReconstruction.cpp | 142 ++----------------------
 tests/test_PolynomialReconstruction.cpp |  16 ++-
 3 files changed, 31 insertions(+), 143 deletions(-)

diff --git a/src/scheme/DiscreteFunctionDPk.hpp b/src/scheme/DiscreteFunctionDPk.hpp
index 64be52ef2..2690646b7 100644
--- a/src/scheme/DiscreteFunctionDPk.hpp
+++ b/src/scheme/DiscreteFunctionDPk.hpp
@@ -135,7 +135,7 @@ class PolynomialCenteredCanonicalBasisView
     if constexpr (Dimension == 1) {
       const double x_xj = (x - m_xj)[0];
 
-      DataType result = m_coefficients[m_degree];
+      std::remove_const_t<DataType> result = m_coefficients[m_degree];
       for (ssize_t i_coeffiencient = m_degree - 1; i_coeffiencient >= 0; --i_coeffiencient) {
         result = x_xj * result + m_coefficients[i_coeffiencient];
       }
@@ -148,9 +148,9 @@ class PolynomialCenteredCanonicalBasisView
 
       size_t i = m_coefficients.size() - 1;
 
-      DataType result = m_coefficients[i--];
+      std::remove_const_t<DataType> result = m_coefficients[i--];
       for (ssize_t i_y = m_degree - 1; i_y >= 0; --i_y) {
-        DataType x_result = m_coefficients[i--];
+        std::remove_const_t<DataType> x_result = m_coefficients[i--];
         for (ssize_t i_x = m_degree - i_y - 1; i_x >= 0; --i_x) {
           x_result = x_xj * x_result + m_coefficients[i--];
         }
@@ -166,11 +166,11 @@ class PolynomialCenteredCanonicalBasisView
 
       size_t i = m_coefficients.size() - 1;
 
-      DataType result = m_coefficients[i--];
+      std::remove_const_t<DataType> result = m_coefficients[i--];
       for (ssize_t i_z = m_degree - 1; i_z >= 0; --i_z) {
-        DataType y_result = m_coefficients[i--];
+        std::remove_const_t<DataType> y_result = m_coefficients[i--];
         for (ssize_t i_y = m_degree - i_z - 1; i_y >= 0; --i_y) {
-          DataType x_result = m_coefficients[i--];
+          std::remove_const_t<DataType> x_result = m_coefficients[i--];
           for (ssize_t i_x = m_degree - i_z - i_y - 1; i_x >= 0; --i_x) {
             x_result = x_xj * x_result + m_coefficients[i--];
           }
@@ -297,7 +297,7 @@ class DiscreteFunctionDPk
       m_xj{MeshDataManager::instance().getMeshData(*m_mesh_v->get<Mesh<Dimension>>()).xj()}
   {}
 
-  DiscreteFunctionDPk(const std::shared_ptr<const MeshVariant>& mesh_v, const CellValue<DataType>& cell_array)
+  DiscreteFunctionDPk(const std::shared_ptr<const MeshVariant>& mesh_v, const CellArray<DataType>& cell_array)
     : m_mesh_v{mesh_v},
       m_degree{BasisView::degreeFromDimension(cell_array.sizeOfArrays())},
       m_by_cell_coefficients{cell_array},
@@ -312,7 +312,7 @@ class DiscreteFunctionDPk
   {}
 
   template <MeshConcept MeshType>
-  DiscreteFunctionDPk(const std::shared_ptr<const MeshType>& p_mesh, const CellValue<DataType>& cell_array)
+  DiscreteFunctionDPk(const std::shared_ptr<const MeshType>& p_mesh, const CellArray<DataType>& cell_array)
     : DiscreteFunctionDPk{p_mesh->meshVariant(), cell_array}
   {
     Assert(m_mesh_v->connectivity().id() == cell_array.connectivity_ptr()->id());
diff --git a/src/scheme/PolynomialReconstruction.cpp b/src/scheme/PolynomialReconstruction.cpp
index 74fe08b7d..ed6a9cfc6 100644
--- a/src/scheme/PolynomialReconstruction.cpp
+++ b/src/scheme/PolynomialReconstruction.cpp
@@ -305,141 +305,17 @@ PolynomialReconstruction::_build(
       }
     });
 
-  return {};
-
-  // parallel_for(
-  //   mesh.numberOfCells(), PUGS_LAMBDA(const CellId cell_j_id) {
-  //     if (cell_is_owned[cell_j_id]) {
-  //       const int32_t t = tokens.acquire();
-
-  //       auto stencil_cell_list = stencil[cell_j_id];
-  //       ShrinkMatrixView B(B_pool[t], stencil_cell_list.size());
-
-  //       size_t column_begin = 0;
-  //       for (size_t i_discrete_function_variant = 0;
-  //            i_discrete_function_variant < discrete_function_variant_list.size(); ++i_discrete_function_variant) {
-  //         // const auto& discrete_function_variant = discrete_function_variant_list[i_discrete_function_variant];
-
-  //         // std::visit(
-  //         //   [&](auto&& discrete_function) {
-  //         //     using DiscreteFunctionT = std::decay_t<decltype(discrete_function)>;
-  //         //     if constexpr (is_discrete_function_P0_v<DiscreteFunctionT>) {
-  //         //       using DataType = std::decay_t<typename DiscreteFunctionT::data_type>;
-
-  //         //       const DataType& pj = discrete_function[cell_j_id];
-  //         //       for (size_t i = 0; i < stencil_cell_list.size(); ++i) {
-  //         //         const CellId cell_i_id = stencil_cell_list[i];
-  //         //         const DataType& pi_pj  = discrete_function[cell_i_id] - pj;
-  //         //         if constexpr (std::is_arithmetic_v<DataType>) {
-  //         //           B(i, column_begin) = pi_pj;
-  //         //         } else if constexpr (is_tiny_vector_v<DataType>) {
-  //         //           for (size_t kB = column_begin, k = 0; k < DataType::Dimension; ++k, ++kB) {
-  //         //             B(i, kB) = pi_pj[k];
-  //         //           }
-  //         //         } else if constexpr (is_tiny_matrix_v<DataType>) {
-  //         //           for (size_t k = 0; k < DataType::NumberOfRows; ++k) {
-  //         //             for (size_t l = 0; l < DataType::NumberOfColumns; ++l) {
-  //         //               B(i, column_begin + k * DataType::NumberOfColumns + l) = pi_pj(k, l);
-  //         //             }
-  //         //           }
-  //         //         }
-  //         //       }
-
-  //         //       if constexpr (std::is_arithmetic_v<DataType>) {
-  //         //         ++column_begin;
-  //         //       } else if constexpr (is_tiny_vector_v<DataType> or is_tiny_matrix_v<DataType>) {
-  //         //         column_begin += DataType::Dimension;
-  //         //       }
-  //         //     }
-  //         //   },
-  //         //   discrete_function_variant->discreteFunction());
-
-  //         using DataType = double;
-
-  //         const DataType& pj = my_discrete_function[cell_j_id];
-  //         for (size_t i = 0; i < stencil_cell_list.size(); ++i) {
-  //           const CellId cell_i_id = stencil_cell_list[i];
-  //           const DataType& pi_pj  = my_discrete_function[cell_i_id] - pj;
-  //           B(i, column_begin)     = pi_pj;
-  //         }
-
-  //         ++column_begin;
-  //       }
-  //       ShrinkMatrixView A(A_pool[t], stencil_cell_list.size());
-
-  //       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];
-  //         const Rd Xi_Xj         = xj[cell_i_id] - Xj;
-  //         for (size_t l = 0; l < MeshType::Dimension; ++l) {
-  //           A(i, l) = Xi_Xj[l];
-  //         }
-  //       }
-
-  //       const SmallMatrix<double>& X = X_pool[t];
-  //       Givens::solveCollectionInPlace(A, X, B);
-
-  //       column_begin = 0;
-  //       for (size_t i_discrete_function_variant = 0;
-  //            i_discrete_function_variant < discrete_function_variant_list.size(); ++i_discrete_function_variant) {
-  //         auto discrete_function_variant = discrete_function_variant_list[i_discrete_function_variant];
-
-  //         std::visit(
-  //           [&](auto&& discrete_function) {
-  //             using DiscreteFunctionT = std::decay_t<decltype(discrete_function)>;
-  //             if constexpr (is_discrete_function_P0_v<DiscreteFunctionT>) {
-  //               using DataType = std::decay_t<typename DiscreteFunctionT::data_type>;
-
-  //               const DataType& pj         = discrete_function[cell_j_id];
-  //               auto discrete_function_dpk = mutable_discrete_function_dpk_variant_list[i_discrete_function_variant]
-  //                                              .get<DiscreteFunctionDPk<MeshType::Dimension, DataType>>();
-  //               auto dpk_j = discrete_function_dpk.coefficients(cell_j_id);
-  //               dpk_j[0]   = pj;
-
-  //               if constexpr (std::is_arithmetic_v<DataType>) {
-  //                 for (size_t i = 0; i < MeshType::Dimension; ++i) {
-  //                   auto& dpk_j_ip1 = dpk_j[i + 1];
-  //                   dpk_j_ip1       = X(i, column_begin);
-  //                 }
-  //                 ++column_begin;
-  //               } else if constexpr (is_tiny_vector_v<DataType>) {
-  //                 for (size_t i = 0; i < MeshType::Dimension; ++i) {
-  //                   auto& dpk_j_ip1 = dpk_j[i + 1];
-  //                   for (size_t k = 0; k < DataType::Dimension; ++k) {
-  //                     dpk_j_ip1[k] = X(i, column_begin + k);
-  //                   }
-  //                 }
-  //                 column_begin += DataType::Dimension;
-  //               } else if constexpr (is_tiny_matrix_v<DataType>) {
-  //                 for (size_t i = 0; i < MeshType::Dimension; ++i) {
-  //                   auto& dpk_j_ip1 = dpk_j[i + 1];
-  //                   for (size_t k = 0; k < DataType::NumberOfRows; ++k) {
-  //                     for (size_t l = 0; l < DataType::NumberOfColumns; ++l) {
-  //                       dpk_j_ip1(k, l) = X(i, column_begin + k * DataType::NumberOfColumns + l);
-  //                     }
-  //                   }
-  //                 }
-  //                 column_begin += DataType::Dimension;
-  //               }
-
-  //             } else {
-  //               throw NotImplementedError("discrete function type");
-  //             }
-  //           },
-  //           discrete_function_variant->discreteFunction());
-  //       }
-
-  //       tokens.release(t);
-  //     }
-  //   });
-
   std::vector<std::shared_ptr<const DiscreteFunctionDPkVariant>> discrete_function_dpk_variant_list;
 
-  // for (auto discrete_function_dpk_variant_p : mutable_discrete_function_dpk_variant_list) {
-  //   discrete_function_dpk_variant_list.push_back(
-  //     std::make_shared<const DiscreteFunctionDPkVariant>(discrete_function_dpk_variant_p));
-  // }
+  for (auto discrete_function_dpk_variant_p : mutable_discrete_function_dpk_variant_list) {
+    std::visit(
+      [&](auto&& mutable_function_dpk) {
+        synchronize(mutable_function_dpk.cellArrays());
+        discrete_function_dpk_variant_list.push_back(
+          std::make_shared<DiscreteFunctionDPkVariant>(mutable_function_dpk));
+      },
+      discrete_function_dpk_variant_p.mutableDiscreteFunctionDPk());
+  }
 
   return discrete_function_dpk_variant_list;
 }
diff --git a/tests/test_PolynomialReconstruction.cpp b/tests/test_PolynomialReconstruction.cpp
index 72036d09f..d90d0e84a 100644
--- a/tests/test_PolynomialReconstruction.cpp
+++ b/tests/test_PolynomialReconstruction.cpp
@@ -12,10 +12,21 @@
 #include <mesh/Mesh.hpp>
 #include <mesh/MeshDataManager.hpp>
 #include <scheme/DiscreteFunctionP0.hpp>
+#include <scheme/DiscreteFunctionVariant.hpp>
 #include <scheme/PolynomialReconstruction.hpp>
 
 #include <MeshDataBaseForTests.hpp>
 
+template <typename... DataType>
+std::vector<std::shared_ptr<const DiscreteFunctionVariant>>
+build_list(DiscreteFunctionP0<DataType>... input)
+{
+  std::vector<std::shared_ptr<const DiscreteFunctionVariant>> variant_vector;
+  variant_vector.push_back(std::make_shared<DiscreteFunctionVariant>(input...));
+
+  return variant_vector;
+}
+
 // clazy:excludeall=non-pod-global-static
 
 TEST_CASE("PolynomialReconstruction", "[scheme]")
@@ -40,8 +51,9 @@ TEST_CASE("PolynomialReconstruction", "[scheme]")
           parallel_for(
             mesh.numberOfCells(), PUGS_LAMBDA(const CellId cell_id) { fh[cell_id] = affine(xj[cell_id]); });
 
-          PolynomialReconstruction reconstruction;
-          auto dpk = reconstruction.build(mesh, fh);
+          auto reconstructions = PolynomialReconstruction{}.build(build_list(fh));
+
+          auto dpk = reconstructions[0]->get<DiscreteFunctionDPk<1, const double>>();
 
           {
             double max_mean_error = 0;
-- 
GitLab