From 7a75a9109a2f8cdca64630132c3031ce3c1feffe Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Mon, 6 Jul 2020 22:20:49 +0200
Subject: [PATCH] Get ride of Mesh::m_mutable_xr (at last)

This impacts the use of AcousticSolver since updated mesh is now
returned by AcousticSolver::computeNextStep

Note that the code of AcousticSolver is now quite crappy and will be
reworked

Closes #9
---
 src/language/modules/SchemeModule.cpp |  2 +-
 src/main.cpp                          |  6 +++---
 src/mesh/Mesh.hpp                     | 10 +---------
 src/scheme/AcousticSolver.hpp         | 17 +++++++++++------
 4 files changed, 16 insertions(+), 19 deletions(-)

diff --git a/src/language/modules/SchemeModule.cpp b/src/language/modules/SchemeModule.cpp
index 9a367ef65..b1d606882 100644
--- a/src/language/modules/SchemeModule.cpp
+++ b/src/language/modules/SchemeModule.cpp
@@ -180,7 +180,7 @@ struct GlaceScheme
                 << " time=" << rang::fg::green << t << rang::style::reset << " dt=" << rang::fgB::blue << dt
                 << rang::style::reset << '\n';
 
-      acoustic_solver.computeNextStep(t, dt, unknowns);
+      m_mesh = acoustic_solver.computeNextStep(dt, unknowns);
 
       block_eos.updatePandCFromRhoE();
 
diff --git a/src/main.cpp b/src/main.cpp
index aa9e2e3ff..daf0d4edb 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -155,7 +155,7 @@ main(int argc, char* argv[])
         if (t + dt > tmax) {
           dt = tmax - t;
         }
-        acoustic_solver.computeNextStep(t, dt, unknowns);
+        mesh = acoustic_solver.computeNextStep(dt, unknowns);
 
         block_eos.updatePandCFromRhoE();
 
@@ -272,7 +272,7 @@ main(int argc, char* argv[])
         if (t + dt > tmax) {
           dt = tmax - t;
         }
-        acoustic_solver.computeNextStep(t, dt, unknowns);
+        mesh = acoustic_solver.computeNextStep(dt, unknowns);
 
         block_eos.updatePandCFromRhoE();
 
@@ -378,7 +378,7 @@ main(int argc, char* argv[])
         if (t + dt > tmax) {
           dt = tmax - t;
         }
-        acoustic_solver.computeNextStep(t, dt, unknowns);
+        mesh = acoustic_solver.computeNextStep(dt, unknowns);
         block_eos.updatePandCFromRhoE();
 
         t += dt;
diff --git a/src/mesh/Mesh.hpp b/src/mesh/Mesh.hpp
index 0fe378e7e..d04807650 100644
--- a/src/mesh/Mesh.hpp
+++ b/src/mesh/Mesh.hpp
@@ -20,7 +20,6 @@ class Mesh final : public IMesh
  private:
   const std::shared_ptr<const Connectivity> m_connectivity;
   NodeValue<const Rd> m_xr;
-  NodeValue<Rd> m_mutable_xr;
 
  public:
   PUGS_INLINE
@@ -72,16 +71,9 @@ class Mesh final : public IMesh
     return m_xr;
   }
 
-  PUGS_INLINE
-  NodeValue<Rd>
-  mutableXr() const
-  {
-    return m_mutable_xr;
-  }
-
   PUGS_INLINE
   Mesh(const std::shared_ptr<const Connectivity>& connectivity, NodeValue<Rd>& xr)
-    : m_connectivity{connectivity}, m_xr{xr}, m_mutable_xr{xr}
+    : m_connectivity{connectivity}, m_xr{xr}
   {
     ;
   }
diff --git a/src/scheme/AcousticSolver.hpp b/src/scheme/AcousticSolver.hpp
index 0a5ef970d..c531154bd 100644
--- a/src/scheme/AcousticSolver.hpp
+++ b/src/scheme/AcousticSolver.hpp
@@ -34,7 +34,7 @@ class AcousticSolver
   using MeshDataType = MeshData<Dimension>;
   using UnknownsType = FiniteVolumesEulerUnknowns<MeshDataType>;
 
-  const std::shared_ptr<MeshType> m_mesh;
+  std::shared_ptr<const MeshType> m_mesh;
   const typename MeshType::Connectivity& m_connectivity;
   const std::vector<BoundaryConditionHandler>& m_boundary_condition_list;
 
@@ -229,7 +229,7 @@ class AcousticSolver
   CellValue<double> m_Vj_over_cj;
 
  public:
-  AcousticSolver(std::shared_ptr<MeshType>& p_mesh, const std::vector<BoundaryConditionHandler>& bc_list)
+  AcousticSolver(std::shared_ptr<const MeshType> p_mesh, const std::vector<BoundaryConditionHandler>& bc_list)
     : m_mesh(p_mesh),
       m_connectivity(m_mesh->connectivity()),
       m_boundary_condition_list(bc_list),
@@ -268,8 +268,8 @@ class AcousticSolver
     return min(m_Vj_over_cj);
   }
 
-  void
-  computeNextStep(double, double dt, UnknownsType& unknowns)
+  [[nodiscard]] std::shared_ptr<const MeshType>
+  computeNextStep(double dt, UnknownsType& unknowns)
   {
     CellValue<double>& rhoj = unknowns.rhoj();
     CellValue<Rd>& uj       = unknowns.uj();
@@ -311,15 +311,20 @@ class AcousticSolver
     parallel_for(
       m_mesh->numberOfCells(), PUGS_LAMBDA(CellId j) { ej[j] = Ej[j] - 0.5 * (uj[j], uj[j]); });
 
-    NodeValue<Rd> new_xr = m_mesh->mutableXr();
+    NodeValue<Rd> new_xr = copy(m_mesh->xr());
     parallel_for(
       m_mesh->numberOfNodes(), PUGS_LAMBDA(NodeId r) { new_xr[r] += dt * ur[r]; });
 
     MeshDataManager::instance().getMeshData(*m_mesh).updateAllData();
 
+    m_mesh                         = std::make_shared<MeshType>(m_mesh->shared_connectivity(), new_xr);
+    CellValue<const double> new_Vj = MeshDataManager::instance().getMeshData(*m_mesh).Vj();
+
     const CellValue<const double> mj = unknowns.mj();
     parallel_for(
-      m_mesh->numberOfCells(), PUGS_LAMBDA(CellId j) { rhoj[j] = mj[j] / Vj[j]; });
+      m_mesh->numberOfCells(), PUGS_LAMBDA(CellId j) { rhoj[j] = mj[j] / new_Vj[j]; });
+
+    return m_mesh;
   }
 };
 
-- 
GitLab