From 8c239f035d71582df8a5ac3398bbe654851f38ee Mon Sep 17 00:00:00 2001
From: Alexandre GANGLOFF <alexandre.gangloff@cea.fr>
Date: Fri, 15 Nov 2024 15:57:00 +0100
Subject: [PATCH] Add br and Fjr order 2 functions on LocalDtHyperelasticSolver

---
 .../Order2LocalDtHyperelasticSolver.cpp       | 26 ++++++++++++-------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/src/scheme/Order2LocalDtHyperelasticSolver.cpp b/src/scheme/Order2LocalDtHyperelasticSolver.cpp
index e809d74be..824790cec 100644
--- a/src/scheme/Order2LocalDtHyperelasticSolver.cpp
+++ b/src/scheme/Order2LocalDtHyperelasticSolver.cpp
@@ -190,12 +190,13 @@ class Order2LocalDtHyperelasticSolverHandler::Order2LocalDtHyperelasticSolver fi
   NodeValue<Rd>
   _computeBr(const Mesh<Dimension>& mesh,
              const NodeValuePerCell<const Rdxd>& Ajr,
-             const DiscreteVectorFunction& u,
-             const DiscreteTensorFunction& sigma) const
+             DiscreteFunctionDPk<Dimension, const Rd> DPk_u,
+             NodeValuePerCell<const Rdxd> DPk_sigma) const
   {
     MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(mesh);
 
     const NodeValuePerCell<const Rd>& Cjr = mesh_data.Cjr();
+    const auto& xr = mesh.xr();
 
     const auto& node_to_cell_matrix               = mesh.connectivity().nodeToCellMatrix();
     const auto& node_local_numbers_in_their_cells = mesh.connectivity().nodeLocalNumbersInTheirCells();
@@ -211,7 +212,7 @@ class Order2LocalDtHyperelasticSolverHandler::Order2LocalDtHyperelasticSolver fi
         for (size_t j = 0; j < node_to_cell.size(); ++j) {
           const CellId J       = node_to_cell[j];
           const unsigned int R = node_local_number_in_its_cells[j];
-          br += Ajr(J, R) * u[J] - sigma[J] * Cjr(J, R);
+          br += Ajr(J, R) * DPk_u[J](xr[r]) - DPk_sigma(J, R) * Cjr(J, R);
         }
 
         b[r] = br;
@@ -367,22 +368,27 @@ class Order2LocalDtHyperelasticSolverHandler::Order2LocalDtHyperelasticSolver fi
   _computeFjr(const MeshType& mesh,
               const NodeValuePerCell<const Rdxd>& Ajr,
               const NodeValue<const Rd>& ur,
-              const DiscreteVectorFunction& u,
-              const DiscreteTensorFunction& sigma) const
+              DiscreteFunctionDPk<Dimension,const Rd> DPk_uh,
+              NodeValuePerCell<const Rdxd> DPk_sigma) const
   {
     MeshDataType& mesh_data = MeshDataManager::instance().getMeshData(mesh);
 
     const NodeValuePerCell<const Rd> Cjr = mesh_data.Cjr();
+    const NodeValue<const Rd>& xr = mesh.xr();
 
-    const auto& cell_to_node_matrix = mesh.connectivity().cellToNodeMatrix();
+    const auto& node_to_cell_matrix               = mesh.connectivity().nodeToCellMatrix();
+    const auto& node_local_numbers_in_their_cells = mesh.connectivity().nodeLocalNumbersInTheirCells();
 
     NodeValuePerCell<Rd> F{mesh.connectivity()};
     parallel_for(
-      mesh.numberOfCells(), PUGS_LAMBDA(CellId j) {
-        const auto& cell_nodes = cell_to_node_matrix[j];
+      mesh.numberOfNodes(), PUGS_LAMBDA(NodeId r) {
+        const auto& node_to_cell                   = node_to_cell_matrix[r];
+        const auto& node_local_number_in_its_cells = node_local_numbers_in_their_cells.itemArray(r);
 
-        for (size_t r = 0; r < cell_nodes.size(); ++r) {
-          F(j, r) = -Ajr(j, r) * (u[j] - ur[cell_nodes[r]]) + sigma[j] * Cjr(j, r);
+        for(size_t j = 0; j < node_to_cell.size(); ++j){
+          const CellId J       = node_to_cell[j];
+          const unsigned int R = node_local_number_in_its_cells[j];
+          F(J,R) = -Ajr(J,R) * (DPk_uh[J](xr[r]) - ur[r]) + DPk_sigma(J,R) * Cjr(J,R);
         }
       });
 
-- 
GitLab