From e08e6666d416b3b859404f75a0464bcad97b8ff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com> Date: Mon, 12 Jul 2021 12:35:03 +0200 Subject: [PATCH] Fix parallel seed advancement Also add a bunch of NDEBUG tests and assertions for safety --- src/mesh/MeshRandomizer.hpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/mesh/MeshRandomizer.hpp b/src/mesh/MeshRandomizer.hpp index 71827bf2a..36b3b169d 100644 --- a/src/mesh/MeshRandomizer.hpp +++ b/src/mesh/MeshRandomizer.hpp @@ -102,7 +102,6 @@ class MeshRandomizer void _applyBC(NodeValue<Rd>& shift) const { - std::cout << "applying " << m_boundary_condition_list.size() << " boundary conditions\n"; for (auto&& boundary_condition : m_boundary_condition_list) { std::visit( [&](auto&& bc) { @@ -183,19 +182,22 @@ class MeshRandomizer }); std::sort(&node_numbers_to_node_id[0], &node_numbers_to_node_id[0] + node_numbers_to_node_id.size(), - [](IdCorrespondance& a, IdCorrespondance& b) { return a.first < b.first; }); + [](IdCorrespondance a, IdCorrespondance b) { return a.first < b.first; }); RandomEngine& random_engine = RandomEngine::instance(); + Assert(isSynchronized(random_engine), "seed is not synchronized when entering mesh randomization"); + NodeValue<Rd> shift_r{connectivity}; int i_node_number = 0; for (size_t i = 0; i < node_numbers_to_node_id.size(); ++i) { const auto [node_number, node_id] = node_numbers_to_node_id[i]; - for (; i_node_number < node_number; ++i_node_number) { + while (i_node_number < node_number) { for (size_t j = 0; j < Dimension; ++j) { dis(random_engine.engine()); } + ++i_node_number; } double max_delta = max_delta_xr[node_id]; @@ -214,13 +216,22 @@ class MeshRandomizer parallel::allReduceMax(node_numbers_to_node_id[node_numbers_to_node_id.size() - 1].first); // Advances random engine to preserve CPU random number generators synchronization - for (; i_node_number < max_node_number; ++i_node_number) { + for (; i_node_number <= max_node_number; ++i_node_number) { for (size_t j = 0; j < Dimension; ++j) { dis(random_engine.engine()); } } this->_applyBC(shift_r); + +#ifndef NDEBUG + if (not isSynchronized(shift_r)) { + throw UnexpectedError("randomized mesh coordinates are not synchronized"); + } +#endif // NDEBUG + + Assert(isSynchronized(random_engine), "seed is not synchronized after mesh randomization"); + return shift_r; } -- GitLab