From fc63eeaa576bf36c0da7ecae8b2ade778d0026eb Mon Sep 17 00:00:00 2001
From: Drouard <axelle.drouard@orange.fr>
Date: Tue, 7 Jun 2022 08:47:34 +0200
Subject: [PATCH] Fix renormalization v

---
 src/scheme/ScalarNodalScheme.cpp | 29 +++++++++++++++++------------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/src/scheme/ScalarNodalScheme.cpp b/src/scheme/ScalarNodalScheme.cpp
index c834964f7..2837089cd 100644
--- a/src/scheme/ScalarNodalScheme.cpp
+++ b/src/scheme/ScalarNodalScheme.cpp
@@ -143,7 +143,7 @@ class ScalarNodalSchemeHandler::ScalarNodalScheme : public ScalarNodalSchemeHand
   }
 
   ScalarNodalScheme(const std::shared_ptr<const MeshType>& mesh,
-                    const std::shared_ptr<const DiscreteFunctionP0<Dimension, TinyMatrix<Dimension>>>& cell_k_bound,
+                    const std::shared_ptr<const DiscreteFunctionP0<Dimension, TinyMatrix<Dimension>>>& cell_k_b,
                     const std::shared_ptr<const DiscreteFunctionP0<Dimension, TinyMatrix<Dimension>>>& cell_k,
                     const std::shared_ptr<const DiscreteFunctionP0<Dimension, double>>& f,
                     const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list)
@@ -409,7 +409,7 @@ class ScalarNodalSchemeHandler::ScalarNodalScheme : public ScalarNodalSchemeHand
 
     {
       CellValue<const TinyMatrix<Dimension>> cell_kappaj  = cell_k->cellValues();
-      CellValue<const TinyMatrix<Dimension>> cell_kappajb = cell_k_bound->cellValues();
+      CellValue<const TinyMatrix<Dimension>> cell_kappajb = cell_k_b->cellValues();
 
       const NodeValue<const TinyMatrix<Dimension>> node_kappar = [&] {
         NodeValue<TinyMatrix<Dimension>> kappa{mesh->connectivity()};
@@ -568,8 +568,12 @@ class ScalarNodalSchemeHandler::ScalarNodalScheme : public ScalarNodalSchemeHand
       const NodeValue<const TinyVector<Dimension>> v = [&] {
         NodeValue<TinyVector<Dimension>> compute_v{mesh->connectivity()};
         parallel_for(
-          mesh->numberOfNodes(),
-          PUGS_LAMBDA(NodeId node_id) { compute_v[node_id] = node_kapparb[node_id] * exterior_normal[node_id]; });
+          mesh->numberOfNodes(), PUGS_LAMBDA(NodeId node_id) {
+            if (is_boundary_node[node_id]) {
+              compute_v[node_id] = 1. / l2Norm(node_kapparb[node_id] * exterior_normal[node_id]) *
+                                   node_kapparb[node_id] * exterior_normal[node_id];
+            }
+          });
         return compute_v;
       }();
 
@@ -704,7 +708,7 @@ class ScalarNodalSchemeHandler::ScalarNodalScheme : public ScalarNodalSchemeHand
 
               b[cell_id] += node_boundary_values[node_id] *
                             (1. / (sum_theta[node_id] * l2Norm(node_kapparb[node_id] * n)) *
-                               dot(kapparb_invBetar[node_id] * sum_Cjr[node_id], P * Cjr(cell_id, i_node)) -
+                               dot(kapparb_invBetar[node_id] * sum_Cjr[node_id], P * Cjr(cell_id, i_node)) +
                              dot(Cjr(cell_id, i_node), n));
             }
           } else if (node_is_corner[node_id]) {
@@ -727,8 +731,9 @@ class ScalarNodalSchemeHandler::ScalarNodalScheme : public ScalarNodalSchemeHand
                 const CellId cell_id_k = node_to_cell[i_cell_k];
                 const size_t i_node_k  = node_local_number_in_its_cells[i_cell_k];
 
-                b[cell_id_j] += dot(node_boundary_values[node_id] * kappar_invBetar[node_id] * Cjr(cell_id_k, i_node_k),
-                                    Cjr(cell_id_j, i_node_j));
+                b[cell_id_j] +=
+                  dot(node_boundary_values[node_id] * kapparb_invBetar[node_id] * Cjr(cell_id_k, i_node_k),
+                      Cjr(cell_id_j, i_node_j));
               }
             }
 
@@ -742,7 +747,7 @@ class ScalarNodalSchemeHandler::ScalarNodalScheme : public ScalarNodalSchemeHand
                 const size_t i_node_k  = node_local_number_in_its_cells[i_cell_k];
 
                 b[cell_id_j] +=
-                  dot(node_boundary_values[node_id] * corner_kappar_invBetar[node_id] * Cjr(cell_id_k, i_node_k),
+                  dot(node_boundary_values[node_id] * corner_kapparb_invBetar[node_id] * Cjr(cell_id_k, i_node_k),
                       Cjr(cell_id_j, i_node_j));
               }
             }
@@ -771,7 +776,7 @@ ScalarNodalSchemeHandler::solution() const
 }
 
 ScalarNodalSchemeHandler::ScalarNodalSchemeHandler(
-  const std::shared_ptr<const IDiscreteFunction>& cell_k_bound,
+  const std::shared_ptr<const IDiscreteFunction>& cell_k_b,
   const std::shared_ptr<const IDiscreteFunction>& cell_k,
   const std::shared_ptr<const IDiscreteFunction>& f,
   const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list)
@@ -781,7 +786,7 @@ ScalarNodalSchemeHandler::ScalarNodalSchemeHandler(
     throw NormalError("primal discrete functions are not defined on the same mesh");
   }
 
-  checkDiscretizationType({cell_k_bound, cell_k, f}, DiscreteFunctionType::P0);
+  checkDiscretizationType({cell_k_b, cell_k, f}, DiscreteFunctionType::P0);
 
   switch (i_mesh->dimension()) {
   case 1: {
@@ -797,7 +802,7 @@ ScalarNodalSchemeHandler::ScalarNodalSchemeHandler(
 
     m_scheme =
       std::make_unique<ScalarNodalScheme<2>>(mesh,
-                                             std::dynamic_pointer_cast<const DiscreteTensorFunctionType>(cell_k_bound),
+                                             std::dynamic_pointer_cast<const DiscreteTensorFunctionType>(cell_k_b),
                                              std::dynamic_pointer_cast<const DiscreteTensorFunctionType>(cell_k),
                                              std::dynamic_pointer_cast<const DiscreteScalarFunctionType>(f),
                                              bc_descriptor_list);
@@ -812,7 +817,7 @@ ScalarNodalSchemeHandler::ScalarNodalSchemeHandler(
 
     m_scheme =
       std::make_unique<ScalarNodalScheme<3>>(mesh,
-                                             std::dynamic_pointer_cast<const DiscreteTensorFunctionType>(cell_k_bound),
+                                             std::dynamic_pointer_cast<const DiscreteTensorFunctionType>(cell_k_b),
                                              std::dynamic_pointer_cast<const DiscreteTensorFunctionType>(cell_k),
                                              std::dynamic_pointer_cast<const DiscreteScalarFunctionType>(f),
                                              bc_descriptor_list);
-- 
GitLab