From acdb51c473b1360047f378006fe790470a9f3897 Mon Sep 17 00:00:00 2001
From: Alexandre Gangloff <alexandre.gangloff@cea.fr>
Date: Mon, 24 Feb 2025 14:06:23 +0100
Subject: [PATCH] Add time second order extension for coupling method

---
 .../Order2LocalDtHyperelasticSolver.cpp       | 105 ++++++++++++------
 1 file changed, 72 insertions(+), 33 deletions(-)

diff --git a/src/scheme/Order2LocalDtHyperelasticSolver.cpp b/src/scheme/Order2LocalDtHyperelasticSolver.cpp
index a98d525a1..0dfe808d2 100644
--- a/src/scheme/Order2LocalDtHyperelasticSolver.cpp
+++ b/src/scheme/Order2LocalDtHyperelasticSolver.cpp
@@ -1911,6 +1911,67 @@ class Order2LocalDtHyperelasticSolverHandler::Order2LocalDtHyperelasticSolver fi
     return {sub_m, sub_rho, sub_u, sub_E, sub_CG};
   }
 
+  std::tuple<std::shared_ptr<const MeshVariant>,
+             std::shared_ptr<const DiscreteFunctionVariant>,
+             std::shared_ptr<const DiscreteFunctionVariant>,
+             std::shared_ptr<const DiscreteFunctionVariant>,
+             std::shared_ptr<const DiscreteFunctionVariant>>
+  compute_sub_iterations_midpoint_method(const SolverType& solver_type,
+                                         const size_t& law,
+                                         const double& CFL,
+                                         const double& dt,
+                                         const std::shared_ptr<const DiscreteFunctionVariant>& rho,
+                                         const std::shared_ptr<const DiscreteFunctionVariant>& u,
+                                         const std::shared_ptr<const DiscreteFunctionVariant>& E,
+                                         const std::shared_ptr<const DiscreteFunctionVariant>& CG,
+                                         const std::vector<std::shared_ptr<const IBoundaryConditionDescriptor>>& bc_descriptor_list,
+                                         NodeValue<Rd> CR_ur,
+                                         NodeValuePerCell<Rd> CR_Fjr,
+                                         std::vector<NodeId> map2,
+                                         const size_t& chi_solid,
+                                         const double& lambda,
+                                         const double& mu,
+                                         const double& gamma,
+                                         const double& p_inf) const
+  {
+    std::shared_ptr sub_m = getCommonMesh({rho, u});
+    std::shared_ptr<const DiscreteFunctionVariant> sub_rho = rho;
+    std::shared_ptr<const DiscreteFunctionVariant> sub_u   = u;
+    std::shared_ptr<const DiscreteFunctionVariant> sub_E   = E;
+    std::shared_ptr<const DiscreteFunctionVariant> sub_CG  = CG;
+
+    double sum_dt = 0;
+    while(sum_dt < dt){
+      const auto& [sigma, aL, aT, p] = _apply_state_law(law,sub_rho,sub_u,sub_E,sub_CG,chi_solid,lambda,mu,gamma,p_inf);
+
+      const DiscreteScalarFunction& aL_d = aL->template get<DiscreteScalarFunction>();
+      const DiscreteScalarFunction& aT_d = aT->template get<DiscreteScalarFunction>();
+      const std::shared_ptr<const DiscreteFunctionVariant>& c =
+        std::make_shared<const DiscreteFunctionVariant>(aL_d + aT_d);
+
+      double sub_dt = CFL * hyperelastic_dt(c);
+      if(sum_dt + sub_dt > dt){
+	      sub_dt = dt - sum_dt;
+      }
+
+      auto [sub_ur, sub_Fjr]       = compute_fluxes(solver_type, sub_rho, aL, aT, sub_u, sigma, p, bc_descriptor_list, CR_ur, CR_Fjr, map2);
+      auto [sub_ur_o1, sub_Fjr_o1] = compute_fluxes(solver_type, sub_rho, aL, aT, sub_u, sigma, bc_descriptor_list, CR_ur, CR_Fjr, map2);
+
+      auto [sub_m_app, sub_rho_app, sub_u_app, sub_E_app, sub_CG_app] = apply_fluxes(sub_dt/2., sub_rho, sub_u, sub_E, sub_CG, sub_ur, sub_ur_o1, sub_Fjr, sub_Fjr_o1);
+
+      const auto& [sigma_app, aL_app, aT_app, p_app] = _apply_state_law(law,sub_rho_app,sub_u_app,sub_E_app,sub_CG_app,chi_solid,lambda,mu,gamma,p_inf);
+
+      auto [sub_ur_app, sub_Fjr_app]       = compute_fluxes(solver_type, sub_rho_app, aL_app, aT_app, sub_u_app, sigma_app, p_app, bc_descriptor_list, CR_ur, CR_Fjr, map2);
+      auto [sub_ur_o1_app, sub_Fjr_o1_app] = compute_fluxes(solver_type, sub_rho_app, aL_app, aT_app, sub_u_app, sigma_app, bc_descriptor_list, CR_ur, CR_Fjr, map2);
+
+      std::tie(sub_m, sub_rho, sub_u, sub_E, sub_CG) = order2_apply_fluxes(sub_dt, sub_rho, sub_u, sub_E, sub_CG, sub_rho_app, sub_CG_app, sub_ur_app, sub_ur_o1_app, sub_Fjr_app, sub_Fjr_o1_app); 
+
+      sum_dt += sub_dt;
+    }
+
+    return {sub_m, sub_rho, sub_u, sub_E, sub_CG};
+  }
+
   //std::tuple<std::shared_ptr<const MeshVariant>,
   //           std::shared_ptr<const DiscreteFunctionVariant>,
   //           std::shared_ptr<const DiscreteFunctionVariant>,
@@ -2050,51 +2111,29 @@ class Order2LocalDtHyperelasticSolverHandler::Order2LocalDtHyperelasticSolver fi
     std::shared_ptr m2 = getCommonMesh({rho2, aL2, aT2, u2, sigma2});
     std::shared_ptr m1     = getCommonMesh({rho1, aL1, aT1, u1, sigma1});
 
-    //std::shared_ptr m1_app = getCommonMesh({rho1, aL1, aT1, u1, sigma1});
-    //std::shared_ptr<const DiscreteFunctionVariant> rho1_app = rho1;
-    //std::shared_ptr<const DiscreteFunctionVariant> u1_app   = u1;
-    //std::shared_ptr<const DiscreteFunctionVariant> E1_app   = E1;
-    //std::shared_ptr<const DiscreteFunctionVariant> CG1_app  = CG1;
-
-    //std::shared_ptr m2_app = getCommonMesh({rho2, aL2, aT2, u2, sigma2});
-    //std::shared_ptr<const DiscreteFunctionVariant> rho2_app   = rho2;
-    //std::shared_ptr<const DiscreteFunctionVariant> u2_app     = u2;
-    //std::shared_ptr<const DiscreteFunctionVariant> E2_app     = E2;
-    //std::shared_ptr<const DiscreteFunctionVariant> CG2_app    = CG2;
-    std::shared_ptr<const DiscreteFunctionVariant> aL2_app    = aL2;
-    std::shared_ptr<const DiscreteFunctionVariant> aT2_app    = aT2;
-    std::shared_ptr<const DiscreteFunctionVariant> sigma2_app = sigma2;
-    std::shared_ptr<const DiscreteFunctionVariant> p2_app     = p2;
-
-
     auto [map1, map2] = _computeMapping(m1,m2,bc_descriptor_list1,bc_descriptor_list2);
 
-    auto [ur1, Fjr1, ur2, Fjr2, CR_ur, CR_Fjr] = compute_fluxes(solver_type,rho1,aL1,aT1,u1,sigma1,p1,bc_descriptor_list1,rho2,aL2,aT2,u2,sigma2,p2,bc_descriptor_list2,map1,map2);
-    auto [ur1_o1, Fjr1_o1, ur2_o1, Fjr2_o1, CR_ur_o1, CR_Fjr_o1] = compute_fluxes(solver_type,rho1,aL1,aT1,u1,sigma1,bc_descriptor_list1,rho2,aL2,aT2,u2,sigma2,bc_descriptor_list2,map1,map2);
-
-    //auto [m1_app, rho1_app, u1_app, E1_app, CG1_app] = apply_fluxes(dt1/2., rho1, u1, E1, CG1, ur1, ur1_o1, Fjr1, Fjr1_o1);
-
+    //Préparation au calcul des lois d'états
     size_t chi_solid = 0;
     if((mu_s!=0) or (lambda_s!=0)){
       chi_solid = 1;
     }
     const size_t chi_fluid = 1-chi_solid;
 
-    auto [new_m2, new_rho2, new_u2, new_E2, new_CG2] = compute_sub_iterations(solver_type,law,0.04,dt1,rho2,u2,E2,CG2,bc_descriptor_list2,CR_ur,CR_Fjr,map2,chi_solid,lambda_s,mu_s,gamma_s,p_inf_s);
+    auto [ur1, Fjr1, ur2, Fjr2, CR_ur, CR_Fjr]                   = compute_fluxes(solver_type,rho1,aL1,aT1,u1,sigma1,p1,bc_descriptor_list1,rho2,aL2,aT2,u2,sigma2,p2,bc_descriptor_list2,map1,map2);
+    auto [ur1_o1, Fjr1_o1, ur2_o1, Fjr2_o1, CR_ur_o1, CR_Fjr_o1] = compute_fluxes(solver_type,rho1,aL1,aT1,u1,sigma1,bc_descriptor_list1,rho2,aL2,aT2,u2,sigma2,bc_descriptor_list2,map1,map2);
 
-    //const auto& [sigma1_app, aL1_app, aT1_app, p1_app] = _apply_state_law(law,rho1_app,u1_app,E1_app,CG1_app,chi_fluid,lambda_f,mu_f,gamma_f,p_inf_f);
-    //std::tie(sigma2_app, aL2_app, aT2_app, p2_app) = _apply_state_law(law,rho2_app,u2_app,E2_app,CG2_app,chi_solid,lambda_s,mu_s,gamma_s,p_inf_s);
+    auto [m1_app, rho1_app, u1_app, E1_app, CG1_app]   = apply_fluxes(dt1/2., rho1, u1, E1, CG1, ur1, ur1_o1, Fjr1, Fjr1_o1);
+    const auto& [sigma1_app, aL1_app, aT1_app, p1_app] = _apply_state_law(law, rho1_app, u1_app, E1_app, CG1_app, chi_fluid, lambda_f, mu_f, gamma_f, p_inf_f);
 
-    //auto [ur1_app, Fjr1_app, ur2_app, Fjr2_app, CR_ur_app, CR_Fjr_app] = compute_fluxes(solver_type,rho1_app, aL1_app, aT1_app, u1_app, sigma1_app, p1_app, bc_descriptor_list1, 
-    //                                                                                     rho2_app, aL2_app, aT2_app, u2_app, sigma2_app, p2_app, bc_descriptor_list2, map1, map2);
-    //auto [ur1_app_o1, Fjr1_app_o1, ur2_app_o1, Fjr2_app_o1, CR_ur_app_o1, CR_Fjr_app_o1] = compute_fluxes(solver_type,rho1_app, aL1_app, aT1_app, u1_app, sigma1_app, bc_descriptor_list1, 
-    //                                                                                     rho2_app, aL2_app, aT2_app, u2_app, sigma2_app, bc_descriptor_list2, map1, map2);
+    auto [m2_app, rho2_app, u2_app, E2_app, CG2_app]   = compute_sub_iterations(solver_type,law,0.03,dt1/2.,rho2,u2,E2,CG2,bc_descriptor_list2,CR_ur,CR_Fjr,map2,chi_solid,lambda_s,mu_s,gamma_s,p_inf_s);
+    const auto& [sigma2_app, aL2_app, aT2_app, p2_app] = _apply_state_law(law, rho2_app, u2_app, E2_app, CG2_app, chi_solid, lambda_s, mu_s, gamma_s, p_inf_s);
 
-    //const auto [new_m1, new_rho1, new_u1, new_E1, new_CG1] = order2_apply_fluxes(dt1, rho1, u1, E1, CG1, rho1_app, CG1_app, ur1_app, ur1_app_o1, Fjr1_app, Fjr1_app_o1);
-    //auto [new_m2, new_rho2, new_u2, new_E2, new_CG2] = _compute_classic_midpoint_method(solver_type,law,dt1,rho2,u2,E2,CG2,aL2,aT2,sigma2,p2,bc_descriptor_list2,
-    //                                                                                    CR_ur_app,CR_Fjr_app,map2,chi_solid,lambda_s,mu_s,gamma_s,p_inf_s);
+    auto [ur1_app, Fjr1_app, ur2_app, Fjr2_app, CR_ur_app, CR_Fjr_app]                   = compute_fluxes(solver_type,rho1_app,aL1_app,aT1_app,u1_app,sigma1_app,p1_app,bc_descriptor_list1,rho2_app,aL2_app,aT2_app,u2_app,sigma2_app,p2_app,bc_descriptor_list2,map1,map2);
+    auto [ur1_o1_app, Fjr1_o1_app, ur2_o1_app, Fjr2_o1_app, CR_ur_o1_app, CR_Fjr_o1_app] = compute_fluxes(solver_type,rho1_app,aL1_app,aT1_app,u1_app,sigma1_app,bc_descriptor_list1,rho2_app,aL2_app,aT2_app,u2_app,sigma2_app,bc_descriptor_list2,map1,map2);
 
-    const auto [new_m1, new_rho1, new_u1, new_E1, new_CG1] = apply_fluxes(dt1, rho1, u1, E1, CG1, ur1, ur1_o1, Fjr1, Fjr1_o1);
+    const auto [new_m1, new_rho1, new_u1, new_E1, new_CG1] = order2_apply_fluxes(dt1, rho1, u1, E1, CG1, rho1_app, CG1_app, ur1_app, ur1_o1_app, Fjr1_app, Fjr1_o1_app);
+    auto [new_m2, new_rho2, new_u2, new_E2, new_CG2]       = compute_sub_iterations_midpoint_method(solver_type,law,0.03,dt1,rho2,u2,E2,CG2,bc_descriptor_list2,CR_ur_app,CR_Fjr_app,map2,chi_solid,lambda_s,mu_s,gamma_s,p_inf_s);
 
     std::tie(new_m2, new_rho2, new_u2, new_E2, new_CG2) = mesh_correction(new_m1, new_m2, new_rho2, new_u2, new_E2, new_CG2, map1, map2);
 
-- 
GitLab