mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Merge pull request #4112 from akva2/fix_regression_variadic_bcast
fixed: wrong root rank in variadic broadcast
This commit is contained in:
commit
ec731fd523
@ -436,20 +436,20 @@ public:
|
|||||||
m_op = Operation::PACK;
|
m_op = Operation::PACK;
|
||||||
variadic_call(args...);
|
variadic_call(args...);
|
||||||
m_packSize = m_position;
|
m_packSize = m_position;
|
||||||
m_comm.broadcast(&m_packSize, 1, 0);
|
m_comm.broadcast(&m_packSize, 1, root);
|
||||||
m_comm.broadcast(m_buffer.data(), m_position, 0);
|
m_comm.broadcast(m_buffer.data(), m_position, root);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
m_packSize = std::numeric_limits<size_t>::max();
|
m_packSize = std::numeric_limits<size_t>::max();
|
||||||
m_comm.broadcast(&m_packSize, 1, 0);
|
m_comm.broadcast(&m_packSize, 1, root);
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
m_comm.broadcast(&m_packSize, 1, 0);
|
m_comm.broadcast(&m_packSize, 1, root);
|
||||||
if (m_packSize == std::numeric_limits<size_t>::max()) {
|
if (m_packSize == std::numeric_limits<size_t>::max()) {
|
||||||
throw std::runtime_error("Error detected in parallel serialization");
|
throw std::runtime_error("Error detected in parallel serialization");
|
||||||
}
|
}
|
||||||
m_buffer.resize(m_packSize);
|
m_buffer.resize(m_packSize);
|
||||||
m_comm.broadcast(m_buffer.data(), m_packSize, 0);
|
m_comm.broadcast(m_buffer.data(), m_packSize, root);
|
||||||
m_position = 0;
|
m_position = 0;
|
||||||
m_op = Operation::UNPACK;
|
m_op = Operation::UNPACK;
|
||||||
variadic_call(std::forward<Args>(args)...);
|
variadic_call(std::forward<Args>(args)...);
|
||||||
|
@ -61,18 +61,18 @@ BOOST_AUTO_TEST_CASE(BroadCast)
|
|||||||
auto cc = Dune::MPIHelper::getCollectiveCommunication();
|
auto cc = Dune::MPIHelper::getCollectiveCommunication();
|
||||||
|
|
||||||
std::vector<double> d(3);
|
std::vector<double> d(3);
|
||||||
if (cc.rank() == 0)
|
if (cc.rank() == 1)
|
||||||
std::iota(d.begin(), d.end(), 1.0);
|
std::iota(d.begin(), d.end(), 1.0);
|
||||||
|
|
||||||
std::vector<int> i(3);
|
std::vector<int> i(3);
|
||||||
if (cc.rank() == 0)
|
if (cc.rank() == 1)
|
||||||
std::iota(i.begin(), i.end(), 4);
|
std::iota(i.begin(), i.end(), 4);
|
||||||
|
|
||||||
double d1 = cc.rank() == 0 ? 7.0 : 0.0;
|
double d1 = cc.rank() == 1 ? 7.0 : 0.0;
|
||||||
size_t i1 = cc.rank() == 0 ? 8 : 0;
|
size_t i1 = cc.rank() == 1 ? 8 : 0;
|
||||||
|
|
||||||
Opm::EclMpiSerializer ser(cc);
|
Opm::EclMpiSerializer ser(cc);
|
||||||
ser.broadcast(0, d, i, d1, i1);
|
ser.broadcast(1, d, i, d1, i1);
|
||||||
|
|
||||||
for (size_t c = 0; c < 3; ++c) {
|
for (size_t c = 0; c < 3; ++c) {
|
||||||
BOOST_CHECK_EQUAL(d[c], 1.0+c);
|
BOOST_CHECK_EQUAL(d[c], 1.0+c);
|
||||||
|
Loading…
Reference in New Issue
Block a user