From cf2519aa60710354fde0e1d1678f8467332ee706 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Tue, 10 Oct 2023 23:22:19 +0200
Subject: [PATCH] Add a global variables manager

It contains only a connectivity identifier manager (which will be
useful for parallel checker and checkpoint/restart mechanisms).

Connectivity has now a unique identifier
---
 src/main.cpp                        |  5 ++++
 src/mesh/Connectivity.cpp           |  6 ++++-
 src/mesh/Connectivity.hpp           |  8 ++++++
 src/utils/CMakeLists.txt            |  1 +
 src/utils/GlobalVariableManager.cpp | 18 +++++++++++++
 src/utils/GlobalVariableManager.hpp | 39 +++++++++++++++++++++++++++++
 tests/mpi_test_main.cpp             |  3 +++
 tests/test_main.cpp                 |  3 +++
 8 files changed, 82 insertions(+), 1 deletion(-)
 create mode 100644 src/utils/GlobalVariableManager.cpp
 create mode 100644 src/utils/GlobalVariableManager.hpp

diff --git a/src/main.cpp b/src/main.cpp
index 9fc0b6743..c251c0673 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -6,6 +6,7 @@
 #include <mesh/MeshDataManager.hpp>
 #include <mesh/SynchronizerManager.hpp>
 #include <utils/ExecutionStatManager.hpp>
+#include <utils/GlobalVariableManager.hpp>
 #include <utils/PugsUtils.hpp>
 #include <utils/RandomEngine.hpp>
 
@@ -24,9 +25,13 @@ main(int argc, char* argv[])
   DualConnectivityManager::create();
   DualMeshManager::create();
 
+  GlobalVariableManager::create();
+
   parser(filename);
   ExecutionStatManager::printInfo();
 
+  GlobalVariableManager::destroy();
+
   DualMeshManager::destroy();
   DualConnectivityManager::destroy();
   MeshDataManager::destroy();
diff --git a/src/mesh/Connectivity.cpp b/src/mesh/Connectivity.cpp
index 27850821b..c55ccd899 100644
--- a/src/mesh/Connectivity.cpp
+++ b/src/mesh/Connectivity.cpp
@@ -2,12 +2,16 @@
 
 #include <mesh/ConnectivityDescriptor.hpp>
 #include <mesh/ItemValueUtils.hpp>
+#include <utils/GlobalVariableManager.hpp>
 #include <utils/Messenger.hpp>
 
 #include <map>
 
 template <size_t Dimension>
-Connectivity<Dimension>::Connectivity() = default;
+Connectivity<Dimension>::Connectivity() : m_id{GlobalVariableManager::instance().getAndIncrementConnectivityId()}
+{
+  Assert(parallel::allReduceMin(m_id) == m_id, "Parallel connectivity with different ids");
+}
 
 template <size_t Dimension>
 void
diff --git a/src/mesh/Connectivity.hpp b/src/mesh/Connectivity.hpp
index ee7b07fe0..725c69dba 100644
--- a/src/mesh/Connectivity.hpp
+++ b/src/mesh/Connectivity.hpp
@@ -50,6 +50,8 @@ class Connectivity final : public IConnectivity
   }
 
  private:
+  const size_t m_id;
+
   size_t m_number_of_cells;
   size_t m_number_of_faces;
   size_t m_number_of_edges;
@@ -115,6 +117,12 @@ class Connectivity final : public IConnectivity
   friend class ConnectivityComputer;
 
  public:
+  size_t
+  id() const
+  {
+    return m_id;
+  }
+
   PUGS_INLINE
   const ConnectivityMatrix&
   getMatrix(const ItemType& item_type_0, const ItemType& item_type_1) const final
diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt
index 82b31ae41..b5a383c9c 100644
--- a/src/utils/CMakeLists.txt
+++ b/src/utils/CMakeLists.txt
@@ -10,6 +10,7 @@ add_library(
   Exceptions.cpp
   ExecutionStatManager.cpp
   FPEManager.cpp
+  GlobalVariableManager.cpp
   Messenger.cpp
   Partitioner.cpp
   PETScWrapper.cpp
diff --git a/src/utils/GlobalVariableManager.cpp b/src/utils/GlobalVariableManager.cpp
new file mode 100644
index 000000000..4887f3c48
--- /dev/null
+++ b/src/utils/GlobalVariableManager.cpp
@@ -0,0 +1,18 @@
+#include <utils/GlobalVariableManager.hpp>
+
+GlobalVariableManager* GlobalVariableManager::m_instance = nullptr;
+
+void
+GlobalVariableManager::create()
+{
+  Assert(m_instance == nullptr);
+  m_instance = new GlobalVariableManager;
+}
+
+void
+GlobalVariableManager::destroy()
+{
+  Assert(m_instance != nullptr);
+  delete m_instance;
+  m_instance = nullptr;
+}
diff --git a/src/utils/GlobalVariableManager.hpp b/src/utils/GlobalVariableManager.hpp
new file mode 100644
index 000000000..9df677fac
--- /dev/null
+++ b/src/utils/GlobalVariableManager.hpp
@@ -0,0 +1,39 @@
+#ifndef GLOBAL_VARIABLE_MANAGER_HPP
+#define GLOBAL_VARIABLE_MANAGER_HPP
+
+#include <utils/PugsAssert.hpp>
+#include <utils/PugsMacros.hpp>
+
+class GlobalVariableManager
+{
+ private:
+  size_t m_connectivity_id = 0;
+
+  static GlobalVariableManager* m_instance;
+
+  explicit GlobalVariableManager()                    = default;
+  GlobalVariableManager(GlobalVariableManager&&)      = delete;
+  GlobalVariableManager(const GlobalVariableManager&) = delete;
+  ~GlobalVariableManager()                            = default;
+
+ public:
+  PUGS_INLINE
+  size_t
+  getAndIncrementConnectivityId()
+  {
+    return m_connectivity_id++;
+  }
+
+  PUGS_INLINE
+  static GlobalVariableManager&
+  instance()
+  {
+    Assert(m_instance != nullptr);
+    return *m_instance;
+  }
+
+  static void create();
+  static void destroy();
+};
+
+#endif   // GLOBAL_VARIABLE_MANAGER_HPP
diff --git a/tests/mpi_test_main.cpp b/tests/mpi_test_main.cpp
index 1692bd7ac..fc137d3bb 100644
--- a/tests/mpi_test_main.cpp
+++ b/tests/mpi_test_main.cpp
@@ -8,6 +8,7 @@
 #include <mesh/DualMeshManager.hpp>
 #include <mesh/MeshDataManager.hpp>
 #include <mesh/SynchronizerManager.hpp>
+#include <utils/GlobalVariableManager.hpp>
 #include <utils/Messenger.hpp>
 #include <utils/PETScWrapper.hpp>
 #include <utils/RandomEngine.hpp>
@@ -95,6 +96,7 @@ main(int argc, char* argv[])
       MeshDataManager::create();
       DualConnectivityManager::create();
       DualMeshManager::create();
+      GlobalVariableManager::create();
 
       MeshDataBaseForTests::create();
 
@@ -106,6 +108,7 @@ main(int argc, char* argv[])
 
       MeshDataBaseForTests::destroy();
 
+      GlobalVariableManager::destroy();
       DualMeshManager::destroy();
       DualConnectivityManager::destroy();
       MeshDataManager::destroy();
diff --git a/tests/test_main.cpp b/tests/test_main.cpp
index 084d9b945..9903c7ae5 100644
--- a/tests/test_main.cpp
+++ b/tests/test_main.cpp
@@ -8,6 +8,7 @@
 #include <mesh/DualMeshManager.hpp>
 #include <mesh/MeshDataManager.hpp>
 #include <mesh/SynchronizerManager.hpp>
+#include <utils/GlobalVariableManager.hpp>
 #include <utils/Messenger.hpp>
 #include <utils/PETScWrapper.hpp>
 #include <utils/RandomEngine.hpp>
@@ -54,6 +55,7 @@ main(int argc, char* argv[])
       MeshDataManager::create();
       DualConnectivityManager::create();
       DualMeshManager::create();
+      GlobalVariableManager::create();
 
       MeshDataBaseForTests::create();
 
@@ -65,6 +67,7 @@ main(int argc, char* argv[])
 
       MeshDataBaseForTests::destroy();
 
+      GlobalVariableManager::destroy();
       DualMeshManager::destroy();
       DualConnectivityManager::destroy();
       MeshDataManager::destroy();
-- 
GitLab