From b9c0fad4d1edd93d6326371127f63b9625d9c401 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Mon, 7 May 2018 15:10:12 +0200
Subject: [PATCH] Connectivities are now stored using shared_ptr

---
 src/main.cpp            |  2 +-
 src/mesh/GmshReader.cpp |  7 ++++---
 src/mesh/GmshReader.hpp |  1 -
 src/mesh/Mesh.hpp       | 22 ++++++++++++----------
 4 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/src/main.cpp b/src/main.cpp
index 8fab5c67e..fb2da6d32 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -226,7 +226,7 @@ int main(int argc, char *argv[])
     // class for acoustic solver test
     Kokkos::Timer timer;
     timer.reset();
-    Connectivity1D connectivity(number);
+    std::shared_ptr<Connectivity1D>connectivity( new Connectivity1D(number));
     typedef Mesh<Connectivity1D> MeshType;
     typedef MeshData<MeshType> MeshDataType;
     typedef FiniteVolumesEulerUnknowns<MeshDataType> UnknownsType;
diff --git a/src/mesh/GmshReader.cpp b/src/mesh/GmshReader.cpp
index 0bb82b29e..45151c589 100644
--- a/src/mesh/GmshReader.cpp
+++ b/src/mesh/GmshReader.cpp
@@ -805,8 +805,8 @@ GmshReader::__proceedData()
     for (size_t j=nb_triangles; j<nb_triangles+nb_quadrangles; ++j) {
       cell_nb_nodes[j] = 4;
     }
-    m_connectivity = new Connectivity2D(cell_nb_nodes, cell_nodes);
-    Connectivity2D& connectivity = *m_connectivity;
+    Connectivity2D* p_connectivity = new Connectivity2D(cell_nb_nodes, cell_nodes);
+    Connectivity2D& connectivity = *p_connectivity;
 
     std::map<unsigned int, std::vector<unsigned int>> ref_faces_map;
     for (unsigned int e=0; e<__edges.extent(0); ++e) {
@@ -856,7 +856,8 @@ GmshReader::__proceedData()
       xr[i][0] = __vertices[i][0];
       xr[i][1] = __vertices[i][1];
     }
-    m_mesh = new MeshType(connectivity, xr);
+    m_mesh = new MeshType(std::shared_ptr<Connectivity2D>(p_connectivity),
+			  xr);
     MeshType& mesh = *m_mesh;
 
     std::ofstream gnuplot("mesh.gnu");
diff --git a/src/mesh/GmshReader.hpp b/src/mesh/GmshReader.hpp
index 5cb7e9e7b..1baddb1ee 100644
--- a/src/mesh/GmshReader.hpp
+++ b/src/mesh/GmshReader.hpp
@@ -184,7 +184,6 @@ private:
    */
   void __readPhysicalNames2_2();
 
-  Connectivity2D* m_connectivity;
   Mesh<Connectivity2D>* m_mesh;
 public:
 
diff --git a/src/mesh/Mesh.hpp b/src/mesh/Mesh.hpp
index f7fa0cde6..40936ce84 100644
--- a/src/mesh/Mesh.hpp
+++ b/src/mesh/Mesh.hpp
@@ -4,6 +4,8 @@
 #include <Kokkos_Core.hpp>
 #include <TinyVector.hpp>
 
+#include <memory>
+
 template <typename ConnectivityType>
 class Mesh
 {
@@ -13,29 +15,29 @@ public:
   typedef TinyVector<dimension> Rd;
 
 private:
-  const Connectivity& m_connectivity;
+  const std::shared_ptr<Connectivity> m_connectivity;
   Kokkos::View<Rd*> m_xr;
 
 public:
 
   const Connectivity& connectivity() const
   {
-    return m_connectivity;
+    return *m_connectivity;
   }
 
   const size_t& numberOfNodes() const
   {
-    return m_connectivity.numberOfNodes();
+    return m_connectivity->numberOfNodes();
   }
 
   const size_t& numberOfFaces() const
   {
-    return m_connectivity.numberOfFaces();
+    return m_connectivity->numberOfFaces();
   }
 
   const size_t& numberOfCells() const
   {
-    return m_connectivity.numberOfCells();
+    return m_connectivity->numberOfCells();
   }
 
   Kokkos::View<Rd*> xr() const
@@ -44,19 +46,19 @@ public:
   }
 
   KOKKOS_INLINE_FUNCTION
-  Mesh(const Connectivity& connectivity)
+  Mesh(const std::shared_ptr<Connectivity>& connectivity)
     : m_connectivity(connectivity),
-      m_xr("xr", connectivity.numberOfNodes())
+      m_xr("xr", connectivity->numberOfNodes())
   {
     static_assert (Connectivity::dimension ==1,"no automatic calculation of vertices in dim>1");
-    const double delta_x = 1./connectivity.numberOfCells();
-    Kokkos::parallel_for(connectivity.numberOfNodes(), KOKKOS_LAMBDA(const int& r){
+    const double delta_x = 1./connectivity->numberOfCells();
+    Kokkos::parallel_for(connectivity->numberOfNodes(), KOKKOS_LAMBDA(const int& r){
 	m_xr[r][0] = r*delta_x;
       });
   }
 
   KOKKOS_INLINE_FUNCTION
-  Mesh(const Connectivity& connectivity,
+  Mesh(const std::shared_ptr<Connectivity>& connectivity,
        Kokkos::View<Rd*>& xr)
     : m_connectivity(connectivity),
       m_xr(xr)
-- 
GitLab