libMesh
parallel_point_test.C
Go to the documentation of this file.
1 #include <libmesh/parallel.h>
2 #include <libmesh/parallel_algebra.h>
3 
4 #include "test_comm.h"
5 #include "libmesh_cppunit.h"
6 
7 
8 using namespace libMesh;
9 
10 class ParallelPointTest : public CppUnit::TestCase {
11 public:
12  CPPUNIT_TEST_SUITE( ParallelPointTest );
13 
14 #if LIBMESH_DIM > 2
15  CPPUNIT_TEST( testAllGatherPoint );
16  CPPUNIT_TEST( testAllGatherPairPointPoint );
17  CPPUNIT_TEST( testAllGatherPairRealPoint );
18 #endif
19 
20  CPPUNIT_TEST( testBroadcastVectorValueInt );
21  CPPUNIT_TEST( testBroadcastVectorValueReal );
22  CPPUNIT_TEST( testBroadcastPoint );
23  CPPUNIT_TEST( testIsendRecv );
24  CPPUNIT_TEST( testIrecvSend );
25 
26  CPPUNIT_TEST_SUITE_END();
27 
28 private:
29 
30 public:
31  void setUp()
32  {}
33 
34  void tearDown()
35  {}
36 
37 
38 
40  {
41  std::vector<Point> vals;
42  Real myrank = TestCommWorld->rank();
43  TestCommWorld->allgather(Point(myrank, myrank+0.25, myrank+0.5),vals);
44 
45  const std::size_t comm_size = TestCommWorld->size();
46  const std::size_t vec_size = vals.size();
47  CPPUNIT_ASSERT_EQUAL( comm_size, vec_size );
48  for (processor_id_type i=0; i<vals.size(); i++)
49  {
50  Real theirrank = i;
51  CPPUNIT_ASSERT_EQUAL( theirrank, vals[i](0) );
52  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.25), vals[i](1) );
53  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.5), vals[i](2) );
54  }
55  }
56 
57 
58 
60  {
61  std::vector<std::pair<Point, Point>> vals;
62  Real myrank = TestCommWorld->rank();
63  TestCommWorld->allgather
64  (std::make_pair(Point(myrank, myrank+0.125, myrank+0.25), Point(myrank+0.5, myrank+0.625, myrank+0.75)), vals);
65 
66  const std::size_t comm_size = TestCommWorld->size();
67  const std::size_t vec_size = vals.size();
68  CPPUNIT_ASSERT_EQUAL( comm_size, vec_size );
69 
70  for (processor_id_type i=0; i<vals.size(); i++)
71  {
72  Real theirrank = i;
73  CPPUNIT_ASSERT_EQUAL( theirrank, vals[i].first(0) );
74  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.125), vals[i].first(1) );
75  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.25), vals[i].first(2) );
76  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.5), vals[i].second(0) );
77  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.625), vals[i].second(1) );
78  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.75), vals[i].second(2) );
79  }
80  }
81 
82 
84  {
85  std::vector<std::pair<Real, Point>> vals;
86  Real myrank = TestCommWorld->rank();
87  TestCommWorld->allgather
88  (std::make_pair(Real(myrank+0.75), Point(myrank, myrank+0.25, myrank+0.5)), vals);
89 
90  const std::size_t comm_size = TestCommWorld->size();
91  const std::size_t vec_size = vals.size();
92  CPPUNIT_ASSERT_EQUAL( comm_size, vec_size );
93 
94  for (processor_id_type i=0; i<vals.size(); i++)
95  {
96  Real theirrank = i;
97  CPPUNIT_ASSERT_EQUAL( theirrank, vals[i].second(0) );
98  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.25), vals[i].second(1) );
99  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.5), vals[i].second(2) );
100  CPPUNIT_ASSERT_EQUAL( theirrank+Real(0.75), vals[i].first );
101  }
102  }
103 
104 
105 
106  template <typename T>
108  {
109  std::vector<VectorValue<T>> src(3), dest(3);
110 
111  {
112  T val=T(0);
113  for (unsigned int i=0; i<3; i++)
114  for (unsigned int j=0; j<LIBMESH_DIM; j++)
115  src[i](j) = val++;
116 
117  if (TestCommWorld->rank() == 0)
118  dest = src;
119  }
120 
121  TestCommWorld->broadcast(dest);
122 
123  for (unsigned int i=0; i<3; i++)
124  for (unsigned int j=0; j<LIBMESH_DIM; j++)
125  CPPUNIT_ASSERT_EQUAL (src[i](j), dest[i](j) );
126  }
127 
128 
129 
131  {
132  this->testBroadcastVectorValue<int>();
133  }
134 
135 
136 
138  {
139  this->testBroadcastVectorValue<Real>();
140  }
141 
142 
143 
145  {
146  std::vector<Point> src(3), dest(3);
147 
148  {
149  Real val=0.;
150  for (unsigned int i=0; i<3; i++)
151  for (unsigned int j=0; j<LIBMESH_DIM; j++)
152  src[i](j) = val++;
153 
154  if (TestCommWorld->rank() == 0)
155  dest = src;
156  }
157 
158  TestCommWorld->broadcast(dest);
159 
160  for (unsigned int i=0; i<3; i++)
161  for (unsigned int j=0; j<LIBMESH_DIM; j++)
162  CPPUNIT_ASSERT_EQUAL (src[i](j), dest[i](j) );
163  }
164 
165 
166 
168  {
169  unsigned int procup = (TestCommWorld->rank() + 1) %
170  TestCommWorld->size();
171  unsigned int procdown = (TestCommWorld->size() +
172  TestCommWorld->rank() - 1) %
173  TestCommWorld->size();
174 
175  std::vector<unsigned int> src_val(3), recv_val(3);
176 
177  src_val[0] = 0;
178  src_val[1] = 1;
179  src_val[2] = 2;
180 
181  Parallel::Request request;
182 
183  if (TestCommWorld->size() > 1)
184  {
185  // Default communication
186  TestCommWorld->send_mode(Parallel::Communicator::DEFAULT);
187 
188  TestCommWorld->send (procup,
189  src_val,
190  request);
191 
192  TestCommWorld->receive (procdown,
193  recv_val);
194 
195  Parallel::wait (request);
196 
197  CPPUNIT_ASSERT_EQUAL ( src_val.size() , recv_val.size() );
198 
199  for (std::size_t i=0; i<src_val.size(); i++)
200  CPPUNIT_ASSERT_EQUAL( src_val[i] , recv_val[i] );
201 
202 
203  // Synchronous communication
204  TestCommWorld->send_mode(Parallel::Communicator::SYNCHRONOUS);
205  std::fill (recv_val.begin(), recv_val.end(), 0);
206 
207  TestCommWorld->send (procup,
208  src_val,
209  request);
210 
211  TestCommWorld->receive (procdown,
212  recv_val);
213 
214  Parallel::wait (request);
215 
216  CPPUNIT_ASSERT_EQUAL ( src_val.size() , recv_val.size() );
217 
218  for (std::size_t i=0; i<src_val.size(); i++)
219  CPPUNIT_ASSERT_EQUAL( src_val[i] , recv_val[i] );
220 
221  // Restore default communication
222  TestCommWorld->send_mode(Parallel::Communicator::DEFAULT);
223  }
224  }
225 
226 
227 
229  {
230  unsigned int procup = (TestCommWorld->rank() + 1) %
231  TestCommWorld->size();
232  unsigned int procdown = (TestCommWorld->size() +
233  TestCommWorld->rank() - 1) %
234  TestCommWorld->size();
235 
236  std::vector<unsigned int> src_val(3), recv_val(3);
237 
238  src_val[0] = 0;
239  src_val[1] = 1;
240  src_val[2] = 2;
241 
242  Parallel::Request request;
243 
244  if (TestCommWorld->size() > 1)
245  {
246  // Default communication
247  TestCommWorld->send_mode(Parallel::Communicator::DEFAULT);
248 
249  TestCommWorld->receive (procdown,
250  recv_val,
251  request);
252 
253  TestCommWorld->send (procup,
254  src_val);
255 
256  Parallel::wait (request);
257 
258  CPPUNIT_ASSERT_EQUAL ( src_val.size() , recv_val.size() );
259 
260  for (std::size_t i=0; i<src_val.size(); i++)
261  CPPUNIT_ASSERT_EQUAL( src_val[i] , recv_val[i] );
262 
263  // Synchronous communication
264  TestCommWorld->send_mode(Parallel::Communicator::SYNCHRONOUS);
265  std::fill (recv_val.begin(), recv_val.end(), 0);
266 
267 
268  TestCommWorld->receive (procdown,
269  recv_val,
270  request);
271 
272  TestCommWorld->send (procup,
273  src_val);
274 
275  Parallel::wait (request);
276 
277  CPPUNIT_ASSERT_EQUAL ( src_val.size() , recv_val.size() );
278 
279  for (std::size_t i=0; i<src_val.size(); i++)
280  CPPUNIT_ASSERT_EQUAL( src_val[i] , recv_val[i] );
281 
282  // Restore default communication
283  TestCommWorld->send_mode(Parallel::Communicator::DEFAULT);
284  }
285  }
286 
287 
288 
289 
290 };
291 
ParallelPointTest::testBroadcastVectorValue
void testBroadcastVectorValue()
Definition: parallel_point_test.C:107
ParallelPointTest::testAllGatherPairRealPoint
void testAllGatherPairRealPoint()
Definition: parallel_point_test.C:83
CPPUNIT_TEST_SUITE_REGISTRATION
CPPUNIT_TEST_SUITE_REGISTRATION(ParallelPointTest)
libMesh
The libMesh namespace provides an interface to certain functionality in the library.
Definition: factoryfunction.C:55
ParallelPointTest::tearDown
void tearDown()
Definition: parallel_point_test.C:34
ParallelPointTest::testAllGatherPairPointPoint
void testAllGatherPairPointPoint()
Definition: parallel_point_test.C:59
ParallelPointTest::testBroadcastPoint
void testBroadcastPoint()
Definition: parallel_point_test.C:144
ParallelPointTest::setUp
void setUp()
Definition: parallel_point_test.C:31
TestCommWorld
libMesh::Parallel::Communicator * TestCommWorld
Definition: driver.C:111
libMesh::Point
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:38
libMesh::processor_id_type
uint8_t processor_id_type
Definition: id_types.h:104
ParallelPointTest::testIrecvSend
void testIrecvSend()
Definition: parallel_point_test.C:228
libmesh_cppunit.h
ParallelPointTest::testBroadcastVectorValueReal
void testBroadcastVectorValueReal()
Definition: parallel_point_test.C:137
libMesh::Real
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Definition: libmesh_common.h:121
test_comm.h
ParallelPointTest::testBroadcastVectorValueInt
void testBroadcastVectorValueInt()
Definition: parallel_point_test.C:130
ParallelPointTest::testIsendRecv
void testIsendRecv()
Definition: parallel_point_test.C:167
ParallelPointTest::testAllGatherPoint
void testAllGatherPoint()
Definition: parallel_point_test.C:39
ParallelPointTest
Definition: parallel_point_test.C:10