diff --git a/src/main.cpp b/src/main.cpp index aad67d58a5d228cdc502e9b024cfc497fef23291..cf382d69b491e85968d977e9023ac094d81c3bc2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,10 +1,10 @@ -#include <utils/PugsUtils.hpp> - #include <language/PugsParser.hpp> #include <mesh/DiamondDualConnectivityManager.hpp> #include <mesh/DiamondDualMeshManager.hpp> #include <mesh/MeshDataManager.hpp> #include <mesh/SynchronizerManager.hpp> +#include <utils/PugsUtils.hpp> +#include <utils/RandomEngine.hpp> int main(int argc, char* argv[]) @@ -12,6 +12,7 @@ main(int argc, char* argv[]) std::string filename = initialize(argc, argv); SynchronizerManager::create(); + RandomEngine::create(); MeshDataManager::create(); DiamondDualConnectivityManager::create(); DiamondDualMeshManager::create(); @@ -21,7 +22,10 @@ main(int argc, char* argv[]) DiamondDualMeshManager::destroy(); DiamondDualConnectivityManager::destroy(); MeshDataManager::destroy(); + RandomEngine::destroy(); SynchronizerManager::destroy(); + finalize(); + return 0; } diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt index 7639963d4fc73094f2e79f64e9f9c9383426ac43..19feb273c4a6e2ad09818f467caa9f0f79636b35 100644 --- a/src/utils/CMakeLists.txt +++ b/src/utils/CMakeLists.txt @@ -12,6 +12,7 @@ add_library( Partitioner.cpp PETScWrapper.cpp PugsUtils.cpp + RandomEngine.cpp RevisionInfo.cpp SignalManager.cpp SLEPcWrapper.cpp) diff --git a/src/utils/RandomEngine.cpp b/src/utils/RandomEngine.cpp new file mode 100644 index 0000000000000000000000000000000000000000..998e6388678921576e45abfefc3e27d30d032e63 --- /dev/null +++ b/src/utils/RandomEngine.cpp @@ -0,0 +1,44 @@ + +#include <utils/Messenger.hpp> +#include <utils/RandomEngine.hpp> + +std::unique_ptr<RandomEngine> RandomEngine::m_instance; + +void +RandomEngine::create() +{ + m_instance = std::unique_ptr<RandomEngine>(new RandomEngine); +} + +void +RandomEngine::destroy() +{ + m_instance.reset(); +} + +RandomEngine::RandomEngine() +{ + m_initial_seed = std::random_device{}(); + parallel::broadcast(m_initial_seed, 0); + + m_random_engine = std::default_random_engine(m_initial_seed); + + std::cout << " * setting " << rang::fgB::green << "random seed" << rang::style::reset << " to " << rang::fgB::yellow + << m_initial_seed << rang::style::reset << '\n'; +} + +void +RandomEngine::setRandomSeed(const uint64_t random_seed) +{ + m_initial_seed = random_seed; + m_random_engine = std::default_random_engine(m_initial_seed); + + std::cout << " * setting " << rang::fgB::green << "random seed" << rang::style::reset << " to " << rang::fgB::yellow + << m_initial_seed << rang::style::reset << '\n'; +} + +void +RandomEngine::resetRandomSeed() +{ + m_instance = std::unique_ptr<RandomEngine>(new RandomEngine); +} diff --git a/src/utils/RandomEngine.hpp b/src/utils/RandomEngine.hpp new file mode 100644 index 0000000000000000000000000000000000000000..4df44d3c15f3066ca6b4d5f6310fb6db77f4869a --- /dev/null +++ b/src/utils/RandomEngine.hpp @@ -0,0 +1,49 @@ +#ifndef RANDOM_ENGINE_HPP +#define RANDOM_ENGINE_HPP + +#include <utils/PugsAssert.hpp> +#include <utils/PugsMacros.hpp> + +#include <memory> +#include <random> + +class RandomEngine +{ + private: + static std::unique_ptr<RandomEngine> m_instance; + + uint64_t m_initial_seed; + std::default_random_engine m_random_engine; + + RandomEngine(); + + public: + void setRandomSeed(const uint64_t random_seed); + void resetRandomSeed(); + + static void create(); + + PUGS_INLINE + std::default_random_engine& + engine() + { + return m_random_engine; + } + + PUGS_INLINE + static RandomEngine& + instance() + { + Assert(m_instance.get() != nullptr, "undefined random engine instance"); + return *m_instance; + } + + static void destroy(); + + RandomEngine(const RandomEngine&) = delete; + RandomEngine(RandomEngine&&) = delete; + + ~RandomEngine() = default; +}; + +#endif // RANDOM_ENGINE_HPP