From dbf0459c8346039cc9fc75602a1aee09344e0cad Mon Sep 17 00:00:00 2001
From: labourasse <labourassee@gmail.com>
Date: Mon, 14 Feb 2022 09:39:20 +0100
Subject: [PATCH] Correction

---
 src/scheme/VectorDiamondScheme.cpp | 71 ++++++++++++++++--------------
 1 file changed, 39 insertions(+), 32 deletions(-)

diff --git a/src/scheme/VectorDiamondScheme.cpp b/src/scheme/VectorDiamondScheme.cpp
index 87173047e..fbbe3501e 100644
--- a/src/scheme/VectorDiamondScheme.cpp
+++ b/src/scheme/VectorDiamondScheme.cpp
@@ -281,11 +281,11 @@ class VectorDiamondSchemeHandler::VectorDiamondScheme : public VectorDiamondSche
                       const std::shared_ptr<const DiscreteFunctionP0<Dimension, double>>& dual_mub,
                       const std::shared_ptr<const DiscreteFunctionP0<Dimension, double>>& dual_lambda,
                       const std::shared_ptr<const DiscreteFunctionP0<Dimension, double>>& dual_mu,
-                      const std::shared_ptr<const DiscreteFunctionP0<Dimension, TinyVector<Dimension>>>& f,
+                      const std::shared_ptr<const DiscreteFunctionP0<Dimension, TinyVector<Dimension>>>& source,
                       const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list)
   {
     Assert(mesh == alpha->mesh());
-    Assert(mesh == f->mesh());
+    Assert(mesh == source->mesh());
     Assert(dual_lambda->mesh() == dual_mu->mesh());
     Assert(dual_lambdab->mesh() == dual_mu->mesh());
     Assert(dual_mub->mesh() == dual_mu->mesh());
@@ -533,7 +533,10 @@ class VectorDiamondSchemeHandler::VectorDiamondScheme : public VectorDiamondSche
         CellValue<const double> dual_mubj     = dual_mub->cellValues();
         CellValue<const double> dual_lambdabj = dual_lambdab->cellValues();
 
-        CellValue<const TinyVector<Dimension>> fj = f->cellValues();
+        CellValue<const TinyVector<Dimension>> fj = source->cellValues();
+        // for (CellId cell_id = 0; cell_id < mesh->numberOfCells(); ++cell_id) {
+        //   std::cout << xj[cell_id] << "-> fj[" << cell_id << "]=" << fj[cell_id] << '\n';
+        // }
 
         const CellValue<const double> dual_Vj = diamond_mesh_data.Vj();
 
@@ -727,7 +730,7 @@ class VectorDiamondSchemeHandler::VectorDiamondScheme : public VectorDiamondSche
             TinyMatrix<Dimension> Mb =
               beta_mub_l * I + beta_mub_l * tensorProduct(nil, nil) + beta_lambdab_l * tensorProduct(nil, nil);
             TinyMatrix<Dimension> N = 1.e0 * tensorProduct(nil, nil);
-
+            double coef_adim        = beta_mu_l + beta_lambdab_l;
             for (size_t j_cell = 0; j_cell < primal_face_to_cell.size(); ++j_cell) {
               const CellId j_id = primal_face_to_cell[j_cell];
               if (i_cell == j_cell) {
@@ -742,9 +745,9 @@ class VectorDiamondSchemeHandler::VectorDiamondScheme : public VectorDiamondSche
                     }
                     if (primal_face_is_symmetry[face_id]) {
                       S(face_dof_number[face_id] * Dimension + i, cell_dof_number[j_id] * Dimension + j) +=
-                        -((i == j) ? 1.e0 : 0) + N(i, j);
+                        ((i == j) ? -coef_adim : 0) + coef_adim * N(i, j);
                       S(face_dof_number[face_id] * Dimension + i, face_dof_number[face_id] * Dimension + j) +=
-                        (i == j) ? 1.e0 : 0;
+                        (i == j) ? coef_adim : 0;
                     }
                   }
                 }
@@ -847,7 +850,7 @@ class VectorDiamondSchemeHandler::VectorDiamondScheme : public VectorDiamondSche
         for (FaceId face_id = 0; face_id < mesh->numberOfFaces(); ++face_id) {
           if (primal_face_is_dirichlet[face_id]) {
             for (size_t i = 0; i < Dimension; ++i) {
-              S(face_dof_number[face_id] * Dimension + i, face_dof_number[face_id] * Dimension + i) += 1.e60;
+              S(face_dof_number[face_id] * Dimension + i, face_dof_number[face_id] * Dimension + i) += 1.e0;
             }
           }
         }
@@ -874,7 +877,7 @@ class VectorDiamondSchemeHandler::VectorDiamondScheme : public VectorDiamondSche
                   const FaceId face_id = face_list[i_face];
 
                   for (size_t i = 0; i < Dimension; ++i) {
-                    b[(face_dof_number[face_id] * Dimension) + i] += 1.e60 * value_list[i_face][i];
+                    b[(face_dof_number[face_id] * Dimension) + i] += 1.e0 * value_list[i_face][i];
                   }
                 }
               }
@@ -1231,15 +1234,15 @@ class EnergyComputerHandler::EnergyComputer : public EnergyComputerHandler::IEne
                  const std::shared_ptr<const DiscreteFunctionP0<Dimension, double>>& dual_lambdab,
                  const std::shared_ptr<const DiscreteFunctionP0<Dimension, double>>& dual_mub,
                  // const std::shared_ptr<const DiscreteFunctionP0<Dimension, double>>& dual_lambda,
-                 // const std::shared_ptr<const DiscreteFunctionP0<Dimension, double>>& dual_mu,
                  const std::shared_ptr<const DiscreteFunctionP0<Dimension, TinyVector<Dimension>>>& U,
+                 const std::shared_ptr<const DiscreteFunctionP0<Dimension, TinyVector<Dimension>>>& dual_U,
                  const std::shared_ptr<const DiscreteFunctionP0<Dimension, TinyVector<Dimension>>>& source,
                  const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list)
   {
     // Assert(mesh == alpha->mesh());
     Assert(mesh == U->mesh());
     // Assert(dual_lambda->mesh() == dual_mu->mesh());
-    // Assert(dual_lambdab->mesh() == dual_mu->mesh());
+    Assert(dual_lambdab->mesh() == dual_U->mesh());
     Assert(U->mesh() == source->mesh());
     Assert(dual_lambdab->mesh() == dual_mub->mesh());
     if (DiamondDualMeshManager::instance().getDiamondDualMesh(mesh) != dual_mub->mesh()) {
@@ -1651,28 +1654,28 @@ class EnergyComputerHandler::EnergyComputer : public EnergyComputerHandler::IEne
           return computed_dual_cell_face_id;
         }();
 
-        m_dual_solution      = std::make_shared<DiscreteFunctionP0<Dimension, TinyVector<Dimension>>>(diamond_mesh);
-        m_solution           = std::make_shared<DiscreteFunctionP0<Dimension, TinyVector<Dimension>>>(mesh);
-        const auto& solution = *U;
-        auto& dual_solution  = *m_dual_solution;
-        dual_solution.fill(zero);
-        const auto& face_to_cell_matrix = mesh->connectivity().faceToCellMatrix();
-        for (CellId cell_id = 0; cell_id < diamond_mesh->numberOfCells(); ++cell_id) {
-          const FaceId face_id = dual_cell_face_id[cell_id];
-          CellId cell_id1      = face_to_cell_matrix[face_id][0];
-          if (primal_face_is_on_boundary[face_id]) {
-            for (size_t i = 0; i < Dimension; ++i) {
-              // A revoir!!
-              dual_solution[cell_id][i] = solution[cell_id1][i];
-            }
-          } else {
-            CellId cell_id1 = face_to_cell_matrix[face_id][0];
-            CellId cell_id2 = face_to_cell_matrix[face_id][1];
-            for (size_t i = 0; i < Dimension; ++i) {
-              dual_solution[cell_id][i] = 0.5 * (solution[cell_id1][i] + solution[cell_id2][i]);
-            }
-          }
-        }
+        m_dual_solution = std::make_shared<DiscreteFunctionP0<Dimension, TinyVector<Dimension>>>(diamond_mesh);
+        // m_solution           = std::make_shared<DiscreteFunctionP0<Dimension, TinyVector<Dimension>>>(mesh);
+        // const auto& solution = *U;
+        auto& dual_solution = *dual_U;
+        //  dual_solution.fill(zero);
+        // const auto& face_to_cell_matrix = mesh->connectivity().faceToCellMatrix();
+        // for (CellId cell_id = 0; cell_id < diamond_mesh->numberOfCells(); ++cell_id) {
+        //   const FaceId face_id = dual_cell_face_id[cell_id];
+        //   CellId cell_id1      = face_to_cell_matrix[face_id][0];
+        //   if (primal_face_is_on_boundary[face_id]) {
+        //     for (size_t i = 0; i < Dimension; ++i) {
+        //       // A revoir!!
+        //       dual_solution[cell_id][i] = solution[cell_id1][i];
+        //     }
+        //   } else {
+        //     CellId cell_id1 = face_to_cell_matrix[face_id][0];
+        //     CellId cell_id2 = face_to_cell_matrix[face_id][1];
+        //     for (size_t i = 0; i < Dimension; ++i) {
+        //       dual_solution[cell_id][i] = 0.5 * (solution[cell_id1][i] + solution[cell_id2][i]);
+        //     }
+        //   }
+        // }
 
         // const Array<int> non_zeros{number_of_dof * Dimension};
         // non_zeros.fill(Dimension * Dimension);
@@ -1947,6 +1950,7 @@ EnergyComputerHandler::EnergyComputerHandler(
   const std::shared_ptr<const IDiscreteFunction>& dual_lambdab,
   const std::shared_ptr<const IDiscreteFunction>& dual_mub,
   const std::shared_ptr<const IDiscreteFunction>& U,
+  const std::shared_ptr<const IDiscreteFunction>& dual_U,
   const std::shared_ptr<const IDiscreteFunction>& source,
   const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list)
 {
@@ -1971,6 +1975,7 @@ EnergyComputerHandler::EnergyComputerHandler(
                                           std::dynamic_pointer_cast<const DiscreteScalarFunctionType>(dual_lambdab),
                                           std::dynamic_pointer_cast<const DiscreteScalarFunctionType>(dual_mub),
                                           std::dynamic_pointer_cast<const DiscreteVectorFunctionType>(U),
+                                          std::dynamic_pointer_cast<const DiscreteVectorFunctionType>(dual_U),
                                           std::dynamic_pointer_cast<const DiscreteVectorFunctionType>(source),
                                           bc_descriptor_list);
     break;
@@ -1991,6 +1996,7 @@ EnergyComputerHandler::EnergyComputerHandler(
                                           std::dynamic_pointer_cast<const DiscreteScalarFunctionType>(dual_lambdab),
                                           std::dynamic_pointer_cast<const DiscreteScalarFunctionType>(dual_mub),
                                           std::dynamic_pointer_cast<const DiscreteVectorFunctionType>(U),
+                                          std::dynamic_pointer_cast<const DiscreteVectorFunctionType>(dual_U),
                                           std::dynamic_pointer_cast<const DiscreteVectorFunctionType>(source),
                                           bc_descriptor_list);
     break;
@@ -2011,6 +2017,7 @@ EnergyComputerHandler::EnergyComputerHandler(
                                           std::dynamic_pointer_cast<const DiscreteScalarFunctionType>(dual_lambdab),
                                           std::dynamic_pointer_cast<const DiscreteScalarFunctionType>(dual_mub),
                                           std::dynamic_pointer_cast<const DiscreteVectorFunctionType>(U),
+                                          std::dynamic_pointer_cast<const DiscreteVectorFunctionType>(dual_U),
                                           std::dynamic_pointer_cast<const DiscreteVectorFunctionType>(source),
                                           bc_descriptor_list);
     break;
-- 
GitLab