libMesh
parallel_point_test.C
Go to the documentation of this file.
1 #include <libmesh/int_range.h>
2 #include <libmesh/parallel.h>
3 #include <libmesh/parallel_algebra.h>
4 
5 #include "test_comm.h"
6 #include "libmesh_cppunit.h"
7 
8 
9 using namespace libMesh;
10 
11 class ParallelPointTest : public CppUnit::TestCase {
12 public:
13  LIBMESH_CPPUNIT_TEST_SUITE( ParallelPointTest );
14 
15 #if LIBMESH_DIM > 2
16  CPPUNIT_TEST( testAllGatherPoint );
17  CPPUNIT_TEST( testAllGatherPairPointPoint );
18  CPPUNIT_TEST( testAllGatherPairRealPoint );
19  CPPUNIT_TEST( testMapUnionGradient );
20  CPPUNIT_TEST( testMapUnionPoint );
21 #endif
22 
23  CPPUNIT_TEST( testBroadcastVectorValueInt );
24  CPPUNIT_TEST( testBroadcastVectorValueReal );
25  CPPUNIT_TEST( testBroadcastPoint );
26  CPPUNIT_TEST( testIsendRecv );
27  CPPUNIT_TEST( testIrecvSend );
28 
29  CPPUNIT_TEST_SUITE_END();
30 
31 private:
32 
33 public:
34  void setUp()
35  {}
36 
37  void tearDown()
38  {}
39 
40 
41 
43  {
44  LOG_UNIT_TEST;
45 
46  std::vector<Point> vals;
47  Real myrank = TestCommWorld->rank();
48  TestCommWorld->allgather(Point(myrank, myrank+0.25, myrank+0.5),vals);
49 
50  const std::size_t comm_size = TestCommWorld->size();
51  const std::size_t vec_size = vals.size();
52  CPPUNIT_ASSERT_EQUAL( comm_size, vec_size );
53  for (processor_id_type i=0; i<vals.size(); i++)
54  {
55  Real theirrank = i;
56  CPPUNIT_ASSERT_EQUAL( theirrank, vals[i](0) );
57  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.25), vals[i](1) );
58  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.5), vals[i](2) );
59  }
60  }
61 
62 
63 
65  {
66  LOG_UNIT_TEST;
67 
68  std::vector<std::pair<Point, Point>> vals;
69  Real myrank = TestCommWorld->rank();
71  (std::make_pair(Point(myrank, myrank+0.125, myrank+0.25), Point(myrank+0.5, myrank+0.625, myrank+0.75)), vals);
72 
73  const std::size_t comm_size = TestCommWorld->size();
74  const std::size_t vec_size = vals.size();
75  CPPUNIT_ASSERT_EQUAL( comm_size, vec_size );
76 
77  for (processor_id_type i=0; i<vals.size(); i++)
78  {
79  Real theirrank = i;
80  CPPUNIT_ASSERT_EQUAL( theirrank, vals[i].first(0) );
81  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.125), vals[i].first(1) );
82  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.25), vals[i].first(2) );
83  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.5), vals[i].second(0) );
84  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.625), vals[i].second(1) );
85  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.75), vals[i].second(2) );
86  }
87  }
88 
89 
91  {
92  LOG_UNIT_TEST;
93 
94  std::vector<std::pair<Real, Point>> vals;
95  Real myrank = TestCommWorld->rank();
97  (std::make_pair(Real(myrank+0.75), Point(myrank, myrank+0.25, myrank+0.5)), vals);
98 
99  const std::size_t comm_size = TestCommWorld->size();
100  const std::size_t vec_size = vals.size();
101  CPPUNIT_ASSERT_EQUAL( comm_size, vec_size );
102 
103  for (processor_id_type i=0; i<vals.size(); i++)
104  {
105  Real theirrank = i;
106  CPPUNIT_ASSERT_EQUAL( theirrank, vals[i].second(0) );
107  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.25), vals[i].second(1) );
108  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.5), vals[i].second(2) );
109  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.75), vals[i].first );
110  }
111  }
112 
113 
114 
115  template <typename VecType>
117  {
118  // std::map<processor_id_type , std::vector<Point>> vals;
119  std::map<processor_id_type , std::vector<VecType>> vals;
120 
121  const processor_id_type myrank = TestCommWorld->rank();
122 
123  vals[myrank*2].resize(1);
124  vals[myrank*2][0](0) = myrank+1;
125 
126  TestCommWorld->set_union(vals);
127 
128  const processor_id_type comm_size = TestCommWorld->size();
129 
130  CPPUNIT_ASSERT_EQUAL(vals.size(), std::size_t(comm_size));
131  for (auto p : make_range(comm_size))
132  {
133  CPPUNIT_ASSERT_EQUAL(vals[p*2].size(), std::size_t(1));
134  CPPUNIT_ASSERT_EQUAL(Real(p+1), libmesh_real(vals[p*2][0](0)));
135  }
136  }
137 
138 
140  {
141  LOG_UNIT_TEST;
142 
143  testMapUnionVec<Gradient>();
144  }
145 
146 
148  {
149  LOG_UNIT_TEST;
150 
151  testMapUnionVec<Point>();
152  }
153 
154 
155  template <typename T>
157  {
158  std::vector<VectorValue<T>> src(3), dest(3);
159 
160  {
161  T val=T(0);
162  for (unsigned int i=0; i<3; i++)
163  for (unsigned int j=0; j<LIBMESH_DIM; j++)
164  src[i](j) = val++;
165 
166  if (TestCommWorld->rank() == 0)
167  dest = src;
168  }
169 
170  TestCommWorld->broadcast(dest);
171 
172  for (unsigned int i=0; i<3; i++)
173  for (unsigned int j=0; j<LIBMESH_DIM; j++)
174  CPPUNIT_ASSERT_EQUAL (src[i](j), dest[i](j) );
175  }
176 
177 
178 
180  {
181  LOG_UNIT_TEST;
182 
183  this->testBroadcastVectorValue<int>();
184  }
185 
186 
187 
189  {
190  LOG_UNIT_TEST;
191 
192  this->testBroadcastVectorValue<Real>();
193  }
194 
195 
196 
198  {
199  LOG_UNIT_TEST;
200 
201  std::vector<Point> src(3), dest(3);
202 
203  {
204  Real val=0.;
205  for (unsigned int i=0; i<3; i++)
206  for (unsigned int j=0; j<LIBMESH_DIM; j++)
207  src[i](j) = val++;
208 
209  if (TestCommWorld->rank() == 0)
210  dest = src;
211  }
212 
213  TestCommWorld->broadcast(dest);
214 
215  for (unsigned int i=0; i<3; i++)
216  for (unsigned int j=0; j<LIBMESH_DIM; j++)
217  CPPUNIT_ASSERT_EQUAL (src[i](j), dest[i](j) );
218  }
219 
220 
221 
223  {
224  LOG_UNIT_TEST;
225 
226  unsigned int procup = (TestCommWorld->rank() + 1) %
227  TestCommWorld->size();
228  unsigned int procdown = (TestCommWorld->size() +
229  TestCommWorld->rank() - 1) %
230  TestCommWorld->size();
231 
232  std::vector<unsigned int> src_val(3), recv_val(3);
233 
234  src_val[0] = 0;
235  src_val[1] = 1;
236  src_val[2] = 2;
237 
238  Parallel::Request request;
239 
240  if (TestCommWorld->size() > 1)
241  {
242  // Default communication
244 
245  TestCommWorld->send (procup,
246  src_val,
247  request);
248 
249  TestCommWorld->receive (procdown,
250  recv_val);
251 
252  Parallel::wait (request);
253 
254  CPPUNIT_ASSERT_EQUAL ( src_val.size() , recv_val.size() );
255 
256  for (std::size_t i=0; i<src_val.size(); i++)
257  CPPUNIT_ASSERT_EQUAL( src_val[i] , recv_val[i] );
258 
259 
260  // Synchronous communication
262  std::fill (recv_val.begin(), recv_val.end(), 0);
263 
264  TestCommWorld->send (procup,
265  src_val,
266  request);
267 
268  TestCommWorld->receive (procdown,
269  recv_val);
270 
271  Parallel::wait (request);
272 
273  CPPUNIT_ASSERT_EQUAL ( src_val.size() , recv_val.size() );
274 
275  for (std::size_t i=0; i<src_val.size(); i++)
276  CPPUNIT_ASSERT_EQUAL( src_val[i] , recv_val[i] );
277 
278  // Restore default communication
280  }
281  }
282 
283 
284 
286  {
287  LOG_UNIT_TEST;
288 
289  unsigned int procup = (TestCommWorld->rank() + 1) %
290  TestCommWorld->size();
291  unsigned int procdown = (TestCommWorld->size() +
292  TestCommWorld->rank() - 1) %
293  TestCommWorld->size();
294 
295  std::vector<unsigned int> src_val(3), recv_val(3);
296 
297  src_val[0] = 0;
298  src_val[1] = 1;
299  src_val[2] = 2;
300 
301  Parallel::Request request;
302 
303  if (TestCommWorld->size() > 1)
304  {
305  // Default communication
307 
308  TestCommWorld->receive (procdown,
309  recv_val,
310  request);
311 
312  TestCommWorld->send (procup,
313  src_val);
314 
315  Parallel::wait (request);
316 
317  CPPUNIT_ASSERT_EQUAL ( src_val.size() , recv_val.size() );
318 
319  for (std::size_t i=0; i<src_val.size(); i++)
320  CPPUNIT_ASSERT_EQUAL( src_val[i] , recv_val[i] );
321 
322  // Synchronous communication
324  std::fill (recv_val.begin(), recv_val.end(), 0);
325 
326 
327  TestCommWorld->receive (procdown,
328  recv_val,
329  request);
330 
331  TestCommWorld->send (procup,
332  src_val);
333 
334  Parallel::wait (request);
335 
336  CPPUNIT_ASSERT_EQUAL ( src_val.size() , recv_val.size() );
337 
338  for (std::size_t i=0; i<src_val.size(); i++)
339  CPPUNIT_ASSERT_EQUAL( src_val[i] , recv_val[i] );
340 
341  // Restore default communication
343  }
344  }
345 
346 
347 
348 
349 };
350 
T libmesh_real(T a)
MPI_Request request
void send_mode(const SendMode sm)
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:159
processor_id_type rank() const
The libMesh namespace provides an interface to certain functionality in the library.
void testIrecvSend()
processor_id_type size() const
uint8_t processor_id_type
Status receive(const unsigned int dest_processor_id, T &buf, const MessageTag &tag=any_tag) const
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void testIsendRecv()
void send(const unsigned int dest_processor_id, const T &buf, const MessageTag &tag=no_tag) const
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
CPPUNIT_TEST_SUITE_REGISTRATION(ParallelPointTest)
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:39
void set_union(T &data, const unsigned int root_id) const