OpenFPM_pdata  4.1.0
Project that contain the implementation of distributed structures
grid_dist_id_HDF5_chckpnt_restart_test.cpp
1 /*
2  * grid_dist_id_HDF5_chckpnt_restart_test.hpp
3  *
4  * Created on: Nov 9, 2016
5  * Author: Yaroslav Zaluzhnyi
6  */
7 
8 #define BOOST_TEST_DYN_LINK
9 #include <boost/test/unit_test.hpp>
10 
11 #include "Grid/grid_dist_id.hpp"
12 
13 BOOST_AUTO_TEST_SUITE( gd_hdf5_chckpnt_rstrt_test )
14 
15 BOOST_AUTO_TEST_CASE( grid_dist_id_hdf5_save_test )
16 {
17 
18  // Input data
19  size_t k = 2400;
20 
21  float ghost_part = 0.0;
22 
23  // Domain
24  Box<2,float> domain({0.0,0.0},{1.0,1.0});
25 
26  Vcluster<> & v_cl = create_vcluster();
27 
28  // Skip this test on big scale
29  if (v_cl.getProcessingUnits() >= 32)
30  return;
31 
32  // grid size
33  size_t sz[2];
34  sz[0] = k;
35  sz[1] = k;
36 
37  // Ghost
38  Ghost<2,float> g(ghost_part);
39 
40  // Distributed grid with id decomposition
42 
43  // get the decomposition
44  auto & dec = g_dist.getDecomposition();
45 
46  // check the consistency of the decomposition
47  bool val = dec.check_consistency();
48  BOOST_REQUIRE_EQUAL(val,true);
49 
50  size_t count = 0;
51 
52  auto it = g_dist.getDomainIterator();
53 
54  while (it.isNext())
55  {
56  //key
57  auto key = it.get();
58 
59  auto keyg = g_dist.getGKey(key);
60 
61  g_dist.template get<0>(key) = keyg.get(0);
62 
63  ++it;
64  count++;
65  }
66 
67  openfpm::vector<size_t> count_total;
68  v_cl.allGather(count,count_total);
69  v_cl.execute();
70 
71  size_t sum = 0;
72 
73  for (size_t i = 0; i < count_total.size(); i++)
74  {sum += count_total.get(i);}
75 
76  timer t;
77  t.start();
78  // Save the grid
79  g_dist.save("grid_dist_id.h5" + std::to_string(v_cl.getProcessingUnits()));
80  t.stop();
81 }
82 
83 BOOST_AUTO_TEST_CASE( grid_dist_id_hdf5_load_test )
84 {
85 
86  // Input data
87  size_t k = 2400;
88 
89  float ghost_part = 0.0;
90 
91  // Domain
92  Box<2,float> domain({0.0,0.0},{1.0,1.0});
93 
94  Vcluster<> & v_cl = create_vcluster();
95 
96  // Skip this test on big scale
97  if (v_cl.getProcessingUnits() >= 32)
98  return;
99 
100  // grid size
101  size_t sz[2];
102  sz[0] = k;
103  sz[1] = k;
104 
105  // Ghost
106  Ghost<2,float> g(ghost_part);
107 
108  // Distributed grid with id decomposition
110 
111  g_dist.load("grid_dist_id.h5" + std::to_string(v_cl.getProcessingUnits()));
112 
113  auto it = g_dist.getDomainIterator();
114 
115  size_t count = 0;
116 
117  bool match = true;
118  while (it.isNext())
119  {
120  //key
121  auto key = it.get();
122 
123  //BOOST_CHECK_CLOSE(g_dist.template get<0>(key),1,0.0001);
124  //std::cout << "Element: " << g_dist.template get<0>(key) << std::endl;
125 
126  auto keyg = g_dist.getGKey(key);
127 
128  match &= g_dist.template get<0>(key) == keyg.get(0);
129 
130  ++it;
131  count++;
132  }
133 
134  openfpm::vector<size_t> count_total;
135  v_cl.allGather(count,count_total);
136  v_cl.execute();
137 
138  size_t sum = 0;
139 
140  for (size_t i = 0; i < count_total.size(); i++)
141  sum += count_total.get(i);
142 
143  BOOST_REQUIRE_EQUAL(sum, (size_t)k*k);
144  BOOST_REQUIRE_EQUAL(match,true);
145 }
146 
147 
148 BOOST_AUTO_TEST_CASE( grid_dist_id_hdf5_copy_test )
149 {
150 
151  // Input data
152  size_t k = 2400;
153 
154  float ghost_part = 0.01;
155 
156  // Domain
157  Box<2,float> domain({0.0,0.0},{1.0,1.0});
158 
159  Vcluster<> & v_cl = create_vcluster();
160 
161  // Skip this test on big scale
162  if (v_cl.getProcessingUnits() >= 32)
163  return;
164 
165  // grid size
166  size_t sz[2];
167  sz[0] = k;
168  sz[1] = k;
169 
170  // Ghost
171  Ghost<2,float> g(ghost_part);
172 
173  // Distributed grid with id decomposition
175  grid_dist_id<2, float, aggregate<float>, CartDecomposition<2,float>> g_dist_copy(g_dist.getDecomposition(),sz,g);
176 
177  g_dist.load("test_data/test_data_three.h5");
178 
179  // Copy
180 
181  auto dom_sc = g_dist.getDomainIterator();
182  auto dom_ds = g_dist_copy.getDomainIterator();
183  while (dom_sc.isNext())
184  {
185  auto key_sc = dom_sc.get();
186  auto key_ds = dom_ds.get();
187  g_dist_copy.template get<0>(key_ds) = g_dist.template get<0>(key_sc);
188  ++dom_sc;
189  ++dom_ds;
190  }
191 
192 
193  auto it = g_dist_copy.getDomainIterator();
194 
195  size_t count = 0;
196 
197  bool match = true;
198  while (it.isNext())
199  {
200  //key
201  auto key = it.get();
202 
203  //BOOST_CHECK_CLOSE(g_dist.template get<0>(key),1,0.0001);
204  //std::cout << "Element: " << g_dist.template get<0>(key) << std::endl;
205 
206  auto keyg = g_dist_copy.getGKey(key);
207 
208  match &= g_dist_copy.template get<0>(key) == keyg.get(0);
209 
210  ++it;
211  count++;
212  }
213 
214  openfpm::vector<size_t> count_total;
215  v_cl.allGather(count,count_total);
216  v_cl.execute();
217 
218  size_t sum = 0;
219 
220  for (size_t i = 0; i < count_total.size(); i++)
221  sum += count_total.get(i);
222 
223  BOOST_REQUIRE_EQUAL(sum, (size_t)k*k);
224  BOOST_REQUIRE_EQUAL(match,true);
225 }
226 
227 BOOST_AUTO_TEST_CASE( grid_dist_id_hdf5_load_test_diff_proc )
228 {
229 
230  // Input data
231  size_t k = 200;
232 
233  float ghost_part = 0.0;
234 
235  // Domain
236  Box<2,float> domain({0.0,0.0},{1.0,1.0});
237 
238  Vcluster<> & v_cl = create_vcluster();
239 
240  // Skip this test on big scale
241  if (v_cl.getProcessingUnits() >= 32)
242  return;
243 
244  // grid size
245  size_t sz[2];
246  sz[0] = k;
247  sz[1] = k;
248 
249  // Ghost
250  Ghost<2,float> g(3);
251 
252  // Distributed grid with id decomposition
253  grid_dist_id<2, float, aggregate<float>> g_dist(sz,domain,g);
254 
255  g_dist.load("test_data/test_data_single.h5");
256 
257  auto it = g_dist.getDomainIterator();
258 
259  size_t count = 0;
260 
261  bool match = true;
262  while (it.isNext())
263  {
264  //key
265  auto key = it.get();
266 
267  //BOOST_CHECK_CLOSE(g_dist.template get<0>(key),1,0.0001);
268  //std::cout << "Element: " << g_dist.template get<0>(key) << std::endl;
269 
270  auto keyg = g_dist.getGKey(key);
271 
272  match &= g_dist.template get<0>(key) == keyg.get(0);
273 
274  ++it;
275  count++;
276  }
277 
278  v_cl.sum(count);
279  v_cl.execute();
280 
281  BOOST_REQUIRE_EQUAL(count, (size_t)k*k);
282  BOOST_REQUIRE_EQUAL(match,true);
283 }
284 
285 BOOST_AUTO_TEST_CASE( grid_dist_id_hdf5_2GB_save_test )
286 {
287  float ghost_part = 0.0;
288 
289  // Domain
290  Box<3,float> domain({0.0,0.0,0.0},{1.0,1.0,1.0});
291 
292  Vcluster<> & v_cl = create_vcluster();
293 
294  // Skip this test on big scale
295  if (v_cl.getProcessingUnits() != 1)
296  return;
297 
298  // grid size
299  size_t sz[3];
300  sz[0] = 970;
301  sz[1] = 650;
302  sz[2] = 512;
303 
304  // Ghost
305  Ghost<3,float> g(ghost_part);
306 
307  // Distributed grid with id decomposition
308  grid_dist_id<3, float, aggregate<double>> g_dist(sz,domain,g);
309 
310  // get the decomposition
311  auto & dec = g_dist.getDecomposition();
312 
313  // check the consistency of the decomposition
314  bool val = dec.check_consistency();
315  BOOST_REQUIRE_EQUAL(val,true);
316 
317  size_t count = 0;
318 
319  auto it = g_dist.getDomainIterator();
320 
321  while (it.isNext())
322  {
323  //key
324  auto key = it.get();
325 
326  auto keyg = g_dist.getGKey(key);
327 
328  g_dist.template get<0>(key) = keyg.get(0);
329 
330  ++it;
331  count++;
332  }
333 
334  openfpm::vector<size_t> count_total;
335  v_cl.allGather(count,count_total);
336  v_cl.execute();
337 
338  size_t sum = 0;
339 
340  for (size_t i = 0; i < count_total.size(); i++)
341  {sum += count_total.get(i);}
342 
343  timer t;
344  t.start();
345  // Save the grid
346  g_dist.save("grid_dist_2GB_id.h5" + std::to_string(v_cl.getProcessingUnits()));
347  t.stop();
348 }
349 
350 BOOST_AUTO_TEST_CASE( grid_dist_id_hdf5_2GB_load_test )
351 {
352  float ghost_part = 0.0;
353 
354  // Domain
355  Box<3,float> domain({0.0,0.0,0.0},{1.0,1.0,1,0});
356 
357  Vcluster<> & v_cl = create_vcluster();
358 
359  // Skip this test on big scale
360  if (v_cl.getProcessingUnits() != 1)
361  return;
362 
363  // grid size
364  size_t sz[3];
365  sz[0] = 970;
366  sz[1] = 650;
367  sz[2] = 512;
368 
369  // Ghost
370  Ghost<3,float> g(ghost_part);
371 
372  // Distributed grid with id decomposition
373  grid_dist_id<3, float, aggregate<double>> g_dist(sz,domain,g);
374 
375  g_dist.load("grid_dist_2GB_id.h5" + std::to_string(v_cl.getProcessingUnits()));
376 
377  auto it = g_dist.getDomainIterator();
378 
379  size_t count = 0;
380 
381  bool match = true;
382  while (it.isNext())
383  {
384  //key
385  auto key = it.get();
386 
387  auto keyg = g_dist.getGKey(key);
388 
389  match &= g_dist.template get<0>(key) == keyg.get(0);
390 
391  ++it;
392  count++;
393  }
394 
395  openfpm::vector<size_t> count_total;
396  v_cl.allGather(count,count_total);
397  v_cl.execute();
398 
399  size_t sum = 0;
400 
401  for (size_t i = 0; i < count_total.size(); i++)
402  sum += count_total.get(i);
403 
404  BOOST_REQUIRE_EQUAL(sum, (size_t)970*650*512);
405  BOOST_REQUIRE_EQUAL(match,true);
406 }
407 
408 BOOST_AUTO_TEST_SUITE_END()
409 
size_t size()
Stub size.
Definition: map_vector.hpp:211
Definition: Ghost.hpp:39
Implementation of VCluster class.
Definition: VCluster.hpp:58
This class decompose a space into sub-sub-domains and distribute them across processors.
This is a distributed grid.
void start()
Start the timer.
Definition: timer.hpp:90
This class represent an N-dimensional box.
Definition: Box.hpp:60
It model an expression expr1 + ... exprn.
Definition: sum.hpp:92
Class for cpu time benchmarking.
Definition: timer.hpp:27
void stop()
Stop the timer.
Definition: timer.hpp:119