3 #include <libmesh/int_range.h> 4 #include <libmesh/simple_range.h> 7 #include <libmesh/parallel_sync.h> 35 CPPUNIT_TEST_SUITE_END();
53 for (
int d=0; d != M; ++d)
55 int diffsize = std::abs(d-rank);
56 int diffsqrt = std::sqrt(diffsize);
57 if (diffsqrt*diffsqrt == diffsize)
58 for (
int i=-1; i != diffsqrt; ++i)
73 for (
int d=0; d != M; ++d)
75 int diffsize = std::abs(d-rank);
76 int diffsqrt = std::sqrt(diffsize);
77 if (diffsqrt*diffsqrt == diffsize)
79 std::vector<unsigned int> v;
80 for (
int i=-1; i != diffsqrt; ++i)
99 for (
int d=0; d != M; ++d)
101 int diffsize = std::abs(d-rank);
102 int diffsqrt = std::sqrt(diffsize);
103 if (diffsqrt*diffsqrt == diffsize)
106 for (
int i=-1; i != diffsqrt; ++i)
107 data[d][0].push_back(d);
108 data[d][1].push_back(d);
124 for (
int d=0; d != M; ++d)
126 int diffsize = std::abs(d-rank);
127 int diffsqrt = std::sqrt(diffsize);
128 if (diffsqrt*diffsqrt == diffsize)
130 std::vector<std::vector<unsigned int>> vv(2);
131 for (
int i=-1; i != diffsqrt; ++i)
148 std::map<processor_id_type, std::vector<unsigned int> > data, received_data;
155 const typename std::vector<unsigned int> & data)
157 auto & vec = received_data[pid];
158 vec.insert(vec.end(), data.begin(), data.end());
161 Parallel::push_parallel_vector_data(*
TestCommWorld, data, collect_data);
165 std::vector<std::size_t> checked_sizes(size, 0);
166 for (
int p=rank; p < M; p += size)
167 for (
int srcp=0; srcp != size; ++srcp)
169 int diffsize = std::abs(srcp-p);
170 int diffsqrt = std::sqrt(diffsize);
171 if (diffsqrt*diffsqrt != diffsize)
173 if (received_data.count(srcp))
175 const std::vector<unsigned int> & datum = received_data[srcp];
176 CPPUNIT_ASSERT_EQUAL(std::count(datum.begin(), datum.end(), p), std::ptrdiff_t(0));
181 CPPUNIT_ASSERT_EQUAL(received_data.count(srcp), std::size_t(1));
182 const std::vector<unsigned int> & datum = received_data[srcp];
183 CPPUNIT_ASSERT_EQUAL(std::count(datum.begin(), datum.end(), p), std::ptrdiff_t(diffsqrt+1));
184 checked_sizes[srcp] += diffsqrt+1;
187 for (
int srcp=0; srcp != size; ++srcp)
188 CPPUNIT_ASSERT_EQUAL(checked_sizes[srcp], received_data[srcp].size());
210 std::map<processor_id_type, std::vector<unsigned int> > data, received_data;
214 auto compose_replies =
217 const std::vector<unsigned int> &
query,
218 std::vector<unsigned int> & response)
220 const std::size_t query_size =
query.size();
221 response.resize(query_size);
222 for (
unsigned int i=0; i != query_size; ++i)
227 auto collect_replies =
230 const std::vector<unsigned int> &
query,
231 const std::vector<unsigned int> & response)
233 const std::size_t query_size =
query.size();
234 CPPUNIT_ASSERT_EQUAL(query_size, response.size());
235 for (
unsigned int i=0; i != query_size; ++i)
237 CPPUNIT_ASSERT_EQUAL(
query[i]*
query[i], response[i]);
239 received_data[pid] = response;
243 unsigned int * ex =
nullptr;
244 Parallel::pull_parallel_vector_data
245 (*
TestCommWorld, data, compose_replies, collect_replies, ex);
248 for (
int p=0; p != M; ++p)
250 CPPUNIT_ASSERT_EQUAL(data[p].size(), received_data[p].size());
252 CPPUNIT_ASSERT_EQUAL(data[p][i]*data[p][i], received_data[p][i]);
270 std::map<processor_id_type, std::vector<std::vector<unsigned int>>> data;
271 std::map<processor_id_type, std::vector<unsigned int>> received_data;
278 const typename std::vector<std::vector<unsigned int>> & data)
280 auto & vec = received_data[pid];
281 vec.insert(vec.end(), data[0].begin(), data[0].end());
282 CPPUNIT_ASSERT_EQUAL(data.size(), std::size_t(2));
283 CPPUNIT_ASSERT_EQUAL(data[1].size(), std::size_t(1));
284 CPPUNIT_ASSERT_EQUAL(data[0][0], data[1][0]);
287 Parallel::push_parallel_vector_data(*
TestCommWorld, data, collect_data);
291 std::vector<std::size_t> checked_sizes(size, 0);
292 for (
int p=rank; p < M; p += size)
293 for (
int srcp=0; srcp != size; ++srcp)
295 int diffsize = std::abs(srcp-p);
296 int diffsqrt = std::sqrt(diffsize);
297 if (diffsqrt*diffsqrt != diffsize)
299 if (received_data.count(srcp))
301 const std::vector<unsigned int> & datum = received_data[srcp];
302 CPPUNIT_ASSERT_EQUAL(std::count(datum.begin(), datum.end(), p), std::ptrdiff_t(0));
307 CPPUNIT_ASSERT_EQUAL(received_data.count(srcp), std::size_t(1));
308 const std::vector<unsigned int> & datum = received_data[srcp];
309 CPPUNIT_ASSERT_EQUAL(std::count(datum.begin(), datum.end(), p), std::ptrdiff_t(diffsqrt+1));
310 checked_sizes[srcp] += diffsqrt+1;
313 for (
int srcp=0; srcp != size; ++srcp)
314 CPPUNIT_ASSERT_EQUAL(checked_sizes[srcp], received_data[srcp].size());
336 std::map<processor_id_type, std::vector<std::vector<unsigned int>>> data;
337 std::map<processor_id_type, std::vector<std::vector<unsigned int>>> received_data;
341 auto compose_replies =
344 const std::vector<std::vector<unsigned int>> &
query,
345 std::vector<std::vector<unsigned int>> & response)
347 const std::size_t query_size =
query.size();
348 response.resize(query_size);
349 for (
unsigned int i=0; i != query_size; ++i)
351 const std::size_t query_i_size =
query[i].size();
352 response[i].resize(query_i_size);
353 for (
unsigned int j=0; j != query_i_size; ++j)
359 auto collect_replies =
362 const std::vector<std::vector<unsigned int>> &
query,
363 const std::vector<std::vector<unsigned int>> & response)
365 const std::size_t query_size =
query.size();
366 CPPUNIT_ASSERT_EQUAL(query_size, response.size());
367 for (
unsigned int i=0; i != query_size; ++i)
369 const std::size_t query_i_size =
query[i].size();
370 CPPUNIT_ASSERT_EQUAL(query_i_size, response[i].size());
371 for (
unsigned int j=0; j != query_i_size; ++j)
372 CPPUNIT_ASSERT_EQUAL(
query[i][j]*
query[i][j], response[i][j]);
374 auto & vec = received_data[pid];
375 vec.emplace_back(response[0].begin(), response[0].end());
376 CPPUNIT_ASSERT_EQUAL(response[1].size(), std::size_t(1));
377 CPPUNIT_ASSERT_EQUAL(response[1][0], response[0][0]);
378 vec.emplace_back(response[1].begin(), response[1].end());
382 std::vector<unsigned int> * ex =
nullptr;
383 Parallel::pull_parallel_vector_data
384 (*
TestCommWorld, data, compose_replies, collect_replies, ex);
387 for (
int p=0; p != M; ++p)
389 CPPUNIT_ASSERT_EQUAL(data[p].size(), received_data[p].size());
392 CPPUNIT_ASSERT_EQUAL(data[p][i][j]*data[p][i][j], received_data[p][i][j]);
void testPullVecVecImpl(int M)
void testPullVecVecImpl(int M)
libMesh::Parallel::Communicator * TestCommWorld
void testPushVecVecImpl(int M)
processor_id_type rank() const
The libMesh namespace provides an interface to certain functionality in the library.
uint8_t processor_id_type
processor_id_type size() const
uint8_t processor_id_type
void testPushVecVecOversized()
void testPushVecVecImpl(int M)
void fill_scalar_data(std::map< processor_id_type, std::vector< unsigned int >> &data, int M)
CPPUNIT_TEST_SUITE_REGISTRATION(ParallelSyncTest)
void fill_vector_data(std::map< processor_id_type, std::vector< std::vector< unsigned int >>> &data, int M)
void testPushVecVecOversized()
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...