OpenFPM_pdata  1.1.0
Project that contain the implementation of distributed structures
 All Data Structures Namespaces Functions Variables Typedefs Enumerations Friends Pages
copy_grid_unit_test.cpp
1 /*
2  * copy_grid_unit_test.hpp
3  *
4  * Created on: Dec 4, 2017
5  * Author: i-bird
6  */
7 
8 #ifndef OPENFPM_DATA_SRC_GRID_ITERATORS_COPY_GRID_UNIT_TEST_HPP_
9 #define OPENFPM_DATA_SRC_GRID_ITERATORS_COPY_GRID_UNIT_TEST_HPP_
10 
11 #define BOOST_TEST_DYN_LINK
12 #include <boost/test/unit_test.hpp>
13 #include "Grid/map_grid.hpp"
14 #include "data_type/aggregate.hpp"
15 #include "Vector/map_vector.hpp"
16 
17 BOOST_AUTO_TEST_SUITE( copy_grid_test )
18 
19 template<unsigned int dim, typename grid>
20 void Test_copy_grid(grid & g_src, grid & g_dst,
21  Box<dim,size_t> & bsrc_1, Box<dim,size_t> & bdst_1)
22 {
23  auto gs1 = g_src.getGrid();
24  auto gd1 = g_dst.getGrid();
25  auto it = g_src.getIterator();
26 
27  grid_key_dx<dim> zero[1];
28  zero[0].zero();
29 
30  while (it.isNext())
31  {
32  auto key = it.get();
33 
34  g_src.template get<0>(key) = gs1.LinId(key);
35 
36  ++it;
37  }
38 
39  copy_grid_fast<false,
40  dim,
42  grid_sm<dim,aggregate<double>>>::copy(gs1,gd1,
43  bsrc_1,bdst_1,
44  g_src,g_dst,
45  zero);
46 
47  // Check
48 
49  bool match = true;
50 
51  grid_key_dx_iterator_sub<dim, no_stencil> its(gs1,bsrc_1.getKP1(), bsrc_1.getKP2());
52  grid_key_dx_iterator_sub<dim, no_stencil> itd(gd1,bdst_1.getKP1(), bdst_1.getKP2());
53 
54  while (its.isNext())
55  {
56  auto key_s = its.get();
57  auto key_d = itd.get();
58 
59  match &= g_src.template get<0>(key_s) == g_dst.template get<0>(key_d);
60 
61  ++its;
62  ++itd;
63  }
64 
65  BOOST_REQUIRE_EQUAL(match,true);
66 }
67 
68 template<unsigned int dim, typename grid>
69 void Test_copy_grid_cmp(grid & g_src, grid & g_dst,
70  Box<dim,size_t> & bsrc_1, Box<dim,size_t> & bdst_1)
71 {
72  auto gs1 = g_src.getGrid();
73  auto gd1 = g_dst.getGrid();
74  auto it = g_src.getIterator();
75 
76  grid_key_dx<dim> zero[1];
77  zero[0].zero();
78 
79  while (it.isNext())
80  {
81  auto key = it.get();
82 
83  for (size_t k = 0 ; k < (size_t)gs1.LinId(key) % 4 ; k++)
84  {
85  g_src.template get<0>(key).add(gs1.LinId(key) + 1);
86  }
87 
88  ++it;
89  }
90 
91  copy_grid_fast<true,
92  dim,
95  bsrc_1,bdst_1,
96  g_src,g_dst,
97  zero);
98 
99  // Check
100 
101  bool match = true;
102 
103  grid_key_dx_iterator_sub<dim, no_stencil> its(gs1,bsrc_1.getKP1(), bsrc_1.getKP2());
104  grid_key_dx_iterator_sub<dim, no_stencil> itd(gd1,bdst_1.getKP1(), bdst_1.getKP2());
105 
106  while (its.isNext())
107  {
108  auto key_s = its.get();
109  auto key_d = itd.get();
110 
111  match &= g_src.template get<0>(key_s).size() == g_dst.template get<0>(key_d).size();
112 
113  for (size_t i = 0 ; i < g_dst.template get<0>(key_d).size() ; i++)
114  {
115  match &= g_src.template get<0>(key_s).get(i) == g_dst.template get<0>(key_d).get(i);
116  }
117 
118  ++its;
119  ++itd;
120  }
121 
122  BOOST_REQUIRE_EQUAL(match,true);
123 }
124 
125 BOOST_AUTO_TEST_CASE( copy_grid_test_use)
126 {
127  {
128  size_t sz1[1] = {37};
129  size_t sz2[2] = {37,37};
130  size_t sz3[3] = {37,37,37};
131  size_t sz4[4] = {37,37,37,37};
132 
133  grid_cpu<1,aggregate<double>> g1_src(sz1);
134  grid_cpu<1,aggregate<double>> g1_dst(sz1);
135  grid_cpu<2,aggregate<double>> g2_src(sz2);
136  grid_cpu<2,aggregate<double>> g2_dst(sz2);
137  grid_cpu<3,aggregate<double>> g3_src(sz3);
138  grid_cpu<3,aggregate<double>> g3_dst(sz3);
139  grid_cpu<4,aggregate<double>> g4_src(sz4);
140  grid_cpu<4,aggregate<double>> g4_dst(sz4);
141  g1_src.setMemory();
142  g1_dst.setMemory();
143  g2_src.setMemory();
144  g2_dst.setMemory();
145  g3_src.setMemory();
146  g3_dst.setMemory();
147  g4_src.setMemory();
148  g4_dst.setMemory();
149 
150  // fill all grids
151 
152  Box<1,size_t> bsrc_1({4},{11});
153  Box<1,size_t> bdst_1{{20},{27}};
154 
155  Test_copy_grid(g1_src,g1_dst,bsrc_1,bdst_1);
156 
157  Box<2,size_t> bsrc_2({4,7},{11,20});
158  Box<2,size_t> bdst_2({20,5},{27,18});
159 
160  Test_copy_grid(g2_src,g2_dst,bsrc_2,bdst_2);
161 
162  Box<3,size_t> bsrc_3({4,7,1},{11,20,6});
163  Box<3,size_t> bdst_3({20,5,10},{27,18,15});
164 
165  Test_copy_grid(g3_src,g3_dst,bsrc_3,bdst_3);
166 
167 #ifdef SE_CLASS1
168  Box<4,size_t> bsrc_4({4,7,1,3},{11,20,6,6});
169  Box<4,size_t> bdst_4({20,5,10,13},{27,18,15,16});
170 
171  Test_copy_grid(g4_src,g4_dst,bsrc_4,bdst_4);
172 #else
173  Box<4,size_t> bsrc_4({4,7,1,3},{11,20,6,6});
174  Box<4,size_t> bdst_4({20,5,10,13},{27,18,15,16});
175 
176  Test_copy_grid(g4_src,g4_dst,bsrc_4,bdst_4);
177 #endif
178  }
180 
181  {
182  size_t sz1[1] = {37};
183  size_t sz2[2] = {37,37};
184  size_t sz3[3] = {37,37,37};
185  size_t sz4[4] = {37,37,37,37};
186 
195  g1_src.setMemory();
196  g1_dst.setMemory();
197  g2_src.setMemory();
198  g2_dst.setMemory();
199  g3_src.setMemory();
200  g3_dst.setMemory();
201  g4_src.setMemory();
202  g4_dst.setMemory();
203 
204  // fill all grids
205 
206  Box<1,size_t> bsrc_1({4},{11});
207  Box<1,size_t> bdst_1{{20},{27}};
208 
209  Test_copy_grid_cmp(g1_src,g1_dst,bsrc_1,bdst_1);
210 
211  Box<2,size_t> bsrc_2({4,7},{11,20});
212  Box<2,size_t> bdst_2({20,5},{27,18});
213 
214  Test_copy_grid_cmp(g2_src,g2_dst,bsrc_2,bdst_2);
215 
216 #ifndef SE_CLASS2
217 
218  Box<3,size_t> bsrc_3({4,7,1},{11,20,6});
219  Box<3,size_t> bdst_3({20,5,10},{27,18,15});
220 
221  Test_copy_grid_cmp(g3_src,g3_dst,bsrc_3,bdst_3);
222 
223 #ifdef SE_CLASS1
224  Box<4,size_t> bsrc_4({4,7,1,3},{7,14,6,6});
225  Box<4,size_t> bdst_4({20,5,10,13},{23,12,15,16});
226 
227  Test_copy_grid_cmp(g4_src,g4_dst,bsrc_4,bdst_4);
228 #else
229  Box<4,size_t> bsrc_4({4,7,1,3},{11,20,6,6});
230  Box<4,size_t> bdst_4({20,5,10,13},{27,18,15,16});
231 
232  Test_copy_grid_cmp(g4_src,g4_dst,bsrc_4,bdst_4);
233 #endif
234 #endif
235  }
236 }
237 
238 BOOST_AUTO_TEST_SUITE_END()
239 
240 
241 #endif /* OPENFPM_DATA_SRC_GRID_ITERATORS_COPY_GRID_UNIT_TEST_HPP_ */
grid_key_dx is the key to access any element in the grid
Definition: grid_key.hpp:18
grid_key_dx< dim > getKP2() const
Get the point p12 as grid_key_dx.
Definition: Box.hpp:592
This is a way to quickly copy a grid into another grid.
grid_key_dx< dim > getKP1() const
Get the point p1 as grid_key_dx.
Definition: Box.hpp:579
void zero()
Set to zero the key.
Definition: grid_key.hpp:116
This class represent an N-dimensional box.
Definition: Box.hpp:56
grid_key_dx< dim > get() const
Return the actual grid key iterator.
This class is a trick to indicate the compiler a specific specialization pattern. ...
Definition: memory_c.hpp:201
Declaration grid_sm.
Definition: grid_sm.hpp:71
Declaration grid_key_dx_iterator_sub.
Definition: grid_sm.hpp:77