diff --git a/src/mesh/ItemArrayUtils.hpp b/src/mesh/ItemArrayUtils.hpp index 618dc8c8e061e55f9db3950b7cff71b3b281b111..6025bd0f3b17763be3f4b6646ab6730be0d6de18 100644 --- a/src/mesh/ItemArrayUtils.hpp +++ b/src/mesh/ItemArrayUtils.hpp @@ -23,4 +23,27 @@ synchronize(ItemArray<DataType, item_type, ConnectivityPtr>& item_array) } } +template <typename DataType, ItemType item_type, typename ConnectivityPtr> +bool +isSynchronized(ItemArray<const DataType, item_type, ConnectivityPtr> item_array) +{ + bool is_synchronized = true; + + if (parallel::size() > 1) { + ItemArray<std::remove_const_t<DataType>, item_type> item_array_copy = copy(item_array); + synchronize(item_array_copy); + for (ItemIdT<item_type> item_id = 0; item_id < item_array_copy.numberOfItems(); ++item_id) { + for (size_t i = 0; i < item_array.sizeOfArrays(); ++i) { + if (item_array_copy[item_id][i] != item_array[item_id][i]) { + is_synchronized = false; + } + } + } + + is_synchronized = parallel::allReduceAnd(is_synchronized); + } + + return is_synchronized; +} + #endif // ITEM_ARRAY_UTILS_HPP diff --git a/src/mesh/ItemValueUtils.hpp b/src/mesh/ItemValueUtils.hpp index ab39d5c5c6423dac3d8c7d3fd2c1cbeffd1a9809..b5151953c8bff1501124b027ef82c259c7bc17b7 100644 --- a/src/mesh/ItemValueUtils.hpp +++ b/src/mesh/ItemValueUtils.hpp @@ -304,4 +304,26 @@ synchronize(ItemValue<DataType, item_type, ConnectivityPtr>& item_value) } } +template <typename DataType, ItemType item_type, typename ConnectivityPtr> +bool +isSynchronized(const ItemValue<DataType, item_type, ConnectivityPtr>& item_value) +{ + bool is_synchronized = true; + + if (parallel::size() > 1) { + ItemValue<std::remove_const_t<DataType>, item_type> item_value_copy = copy(item_value); + synchronize(item_value_copy); + for (ItemIdT<item_type> item_id = 0; item_id < item_value_copy.numberOfItems(); ++item_id) { + if (item_value_copy[item_id] != item_value[item_id]) { + is_synchronized = false; + break; + } + } + + is_synchronized = parallel::allReduceAnd(is_synchronized); + } + + return is_synchronized; +} + #endif // ITEM_VALUE_UTILS_HPP diff --git a/src/utils/RandomEngine.cpp b/src/utils/RandomEngine.cpp index 998e6388678921576e45abfefc3e27d30d032e63..508f77a39123492376a5141662f4b3daa41476f9 100644 --- a/src/utils/RandomEngine.cpp +++ b/src/utils/RandomEngine.cpp @@ -4,6 +4,29 @@ std::unique_ptr<RandomEngine> RandomEngine::m_instance; +bool +isSynchronized(const RandomEngine& random_engine) +{ + const uint64_t current_seed = random_engine.getCurrentSeed(); + const uint64_t parallel_max_seed = parallel::allReduceMax(current_seed); + + return parallel::allReduceAnd(current_seed == parallel_max_seed); +} + +uint64_t +RandomEngine::getCurrentSeed() const +{ + std::ostringstream ostr; + ostr << m_random_engine; + + std::istringstream istr(ostr.str()); + + uint64_t current_seed; + istr >> current_seed; + + return current_seed; +} + void RandomEngine::create() { @@ -18,23 +41,22 @@ RandomEngine::destroy() RandomEngine::RandomEngine() { - m_initial_seed = std::random_device{}(); - parallel::broadcast(m_initial_seed, 0); + uint64_t random_seed = std::random_device{}(); + parallel::broadcast(random_seed, 0); - m_random_engine = std::default_random_engine(m_initial_seed); + m_random_engine = std::default_random_engine(random_seed); std::cout << " * setting " << rang::fgB::green << "random seed" << rang::style::reset << " to " << rang::fgB::yellow - << m_initial_seed << rang::style::reset << '\n'; + << random_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); + m_random_engine = std::default_random_engine(random_seed); std::cout << " * setting " << rang::fgB::green << "random seed" << rang::style::reset << " to " << rang::fgB::yellow - << m_initial_seed << rang::style::reset << '\n'; + << random_seed << rang::style::reset << '\n'; } void diff --git a/src/utils/RandomEngine.hpp b/src/utils/RandomEngine.hpp index 4df44d3c15f3066ca6b4d5f6310fb6db77f4869a..77af2e4970e7c98f5ceee6ef065cfa284c8d8627 100644 --- a/src/utils/RandomEngine.hpp +++ b/src/utils/RandomEngine.hpp @@ -12,7 +12,6 @@ class RandomEngine private: static std::unique_ptr<RandomEngine> m_instance; - uint64_t m_initial_seed; std::default_random_engine m_random_engine; RandomEngine(); @@ -21,8 +20,12 @@ class RandomEngine void setRandomSeed(const uint64_t random_seed); void resetRandomSeed(); + friend bool isSynchronized(const RandomEngine& random_engine); + static void create(); + uint64_t getCurrentSeed() const; + PUGS_INLINE std::default_random_engine& engine()