Skip to content
Snippets Groups Projects
Commit e08e6666 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Fix parallel seed advancement

Also add a bunch of NDEBUG tests and assertions for safety
parent 73e4be46
No related branches found
No related tags found
1 merge request!96Add random number engine encapsulation.
...@@ -102,7 +102,6 @@ class MeshRandomizer ...@@ -102,7 +102,6 @@ class MeshRandomizer
void void
_applyBC(NodeValue<Rd>& shift) const _applyBC(NodeValue<Rd>& shift) const
{ {
std::cout << "applying " << m_boundary_condition_list.size() << " boundary conditions\n";
for (auto&& boundary_condition : m_boundary_condition_list) { for (auto&& boundary_condition : m_boundary_condition_list) {
std::visit( std::visit(
[&](auto&& bc) { [&](auto&& bc) {
...@@ -183,19 +182,22 @@ class MeshRandomizer ...@@ -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(), 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(); RandomEngine& random_engine = RandomEngine::instance();
Assert(isSynchronized(random_engine), "seed is not synchronized when entering mesh randomization");
NodeValue<Rd> shift_r{connectivity}; NodeValue<Rd> shift_r{connectivity};
int i_node_number = 0; int i_node_number = 0;
for (size_t i = 0; i < node_numbers_to_node_id.size(); ++i) { 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]; 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) { for (size_t j = 0; j < Dimension; ++j) {
dis(random_engine.engine()); dis(random_engine.engine());
} }
++i_node_number;
} }
double max_delta = max_delta_xr[node_id]; double max_delta = max_delta_xr[node_id];
...@@ -214,13 +216,22 @@ class MeshRandomizer ...@@ -214,13 +216,22 @@ class MeshRandomizer
parallel::allReduceMax(node_numbers_to_node_id[node_numbers_to_node_id.size() - 1].first); 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 // 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) { for (size_t j = 0; j < Dimension; ++j) {
dis(random_engine.engine()); dis(random_engine.engine());
} }
} }
this->_applyBC(shift_r); 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; return shift_r;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment