diff --git a/src/main.cpp b/src/main.cpp index 9fc0b67439e128e958552a7b8c72cc354fc2076c..c251c067301b93000f15b2f9502537483d09b66d 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 27850821bf64eb590915bbdccce8e8b365fc0eb4..c55ccd89970668f495602769dd7b17c4241a9a34 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 ee7b07fe043a44262c23afc053e748bcac448b50..725c69dba165cf69890a36428c6f2f035c1e27f1 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 82b31ae419fcb2f16b314aef5d4d55b4bb83e2fb..b5a383c9c7d05088ef840d10b58fc57daa5cea04 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 0000000000000000000000000000000000000000..4887f3c48271128239550a214662c2ea8a4396f5 --- /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 0000000000000000000000000000000000000000..9df677fac507545ca7559ecca4b6f55197e35c48 --- /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 1692bd7aca6edafd683fe7351c104cea8283a81c..fc137d3bbc1123f5a52bfe6f326ed8fccda308bc 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 084d9b9453cb683586ce8f9a6d7b72678bcd3aaa..9903c7ae52bb2734a9abf5b5137dec5f60e93c5a 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();