OpenFPM_pdata  1.0.0
Project that contain the implementation of distributed structures
 All Data Structures Functions Variables Typedefs Enumerations Friends Pages
vector_dist_complex_prp_unit_test.hpp
1 /*
2  * vector_dist_complex_prp_unit_test.hpp
3  *
4  * Created on: Sep 18, 2016
5  * Author: i-bird
6  */
7 
8 #ifndef SRC_VECTOR_VECTOR_DIST_COMPLEX_PRP_UNIT_TEST_HPP_
9 #define SRC_VECTOR_VECTOR_DIST_COMPLEX_PRP_UNIT_TEST_HPP_
10 
11 
12 BOOST_AUTO_TEST_CASE( vector_dist_periodic_complex_prp_test_use_3d )
13 {
14  Vcluster & v_cl = create_vcluster();
15 
16  if (v_cl.getProcessingUnits() > 48)
17  return;
18 
19  // set the seed
20  // create the random generator engine
21  std::srand(v_cl.getProcessUnitID());
22  std::default_random_engine eg;
23  std::uniform_real_distribution<float> ud(0.0f, 1.0f);
24 
25 #ifdef TEST_COVERAGE_MODE
26  long int k = 24288 * v_cl.getProcessingUnits();
27 #else
28  long int k = 124288 * v_cl.getProcessingUnits();
29 #endif
30 
31  long int big_step = k / 4;
32  big_step = (big_step == 0)?1:big_step;
33 
34  print_test_v( "Testing 3D vector full complex prp vector k<=",k);
35 
36  // 3D test
37  for ( ; k >= 2 ; k-= decrement(k,big_step) )
38  {
39  BOOST_TEST_CHECKPOINT( "Testing 3D full complex prp vector k=" << k );
40 
41  Box<3,float> box({0.0,0.0,0.0},{1.0,1.0,1.0});
42 
43  // Boundary conditions
44  size_t bc[3]={NON_PERIODIC,NON_PERIODIC,NON_PERIODIC};
45 
46  // factor
47  float factor = pow(create_vcluster().getProcessingUnits()/2.0f,1.0f/3.0f);
48 
49  // ghost
50  Ghost<3,float> ghost(0.05 / factor);
51 
52  // ghost2 (a little bigger because of round off error)
53  Ghost<3,float> ghost2(0.05001 / factor);
54 
55  // Distributed vector
57 
58  auto it = vd.getIterator();
59 
60  while (it.isNext())
61  {
62  auto key = it.get();
63 
64  vd.getPos(key)[0] = ud(eg);
65  vd.getPos(key)[1] = ud(eg);
66  vd.getPos(key)[2] = ud(eg);
67 
68  // initalize vector property and grid
69 
70  vd.getProp<0>(key).add(vd.getPos(key)[0]);
71  vd.getProp<0>(key).add(vd.getPos(key)[1]);
72  vd.getProp<0>(key).add(vd.getPos(key)[2]);
73 
74  vd.getProp<0>(key).add(vd.getPos(key)[0]+vd.getPos(key)[1]);
75  vd.getProp<0>(key).add(vd.getPos(key)[1]+vd.getPos(key)[2]);
76  vd.getProp<0>(key).add(vd.getPos(key)[0]+vd.getPos(key)[2]);
77 
78  // Grid
79  size_t sz[] = {3,3,3};
80  vd.getProp<1>(key).resize(sz);
81 
82  vd.getProp<1>(key).get<0>({0,0,0}) = vd.getPos(key)[0];
83  vd.getProp<1>(key).get<0>({0,0,1}) = vd.getPos(key)[1];
84  vd.getProp<1>(key).get<0>({0,0,2}) = vd.getPos(key)[2];
85 
86  vd.getProp<1>(key).get<0>({0,1,0}) = 2.0*vd.getPos(key)[0];
87  vd.getProp<1>(key).get<0>({0,1,1}) = 2.0*vd.getPos(key)[1];
88  vd.getProp<1>(key).get<0>({0,1,2}) = 2.0*vd.getPos(key)[2];
89 
90  vd.getProp<1>(key).get<0>({0,2,0}) = 3.0*vd.getPos(key)[0];
91  vd.getProp<1>(key).get<0>({0,2,1}) = 3.0*vd.getPos(key)[1];
92  vd.getProp<1>(key).get<0>({0,2,2}) = 3.0*vd.getPos(key)[2];
93 
94  vd.getProp<1>(key).get<0>({1,0,0}) = 4.0*vd.getPos(key)[0];
95  vd.getProp<1>(key).get<0>({1,0,1}) = 4.0*vd.getPos(key)[1];
96  vd.getProp<1>(key).get<0>({1,0,2}) = 4.0*vd.getPos(key)[2];
97 
98  vd.getProp<1>(key).get<0>({1,1,0}) = 5.0*vd.getPos(key)[0];
99  vd.getProp<1>(key).get<0>({1,1,1}) = 5.0*vd.getPos(key)[1];
100  vd.getProp<1>(key).get<0>({1,1,2}) = 5.0*vd.getPos(key)[2];
101 
102  vd.getProp<1>(key).get<0>({1,2,0}) = 6.0*vd.getPos(key)[0];
103  vd.getProp<1>(key).get<0>({1,2,1}) = 6.0*vd.getPos(key)[1];
104  vd.getProp<1>(key).get<0>({1,2,2}) = 6.0*vd.getPos(key)[2];
105 
106  vd.getProp<1>(key).get<0>({2,0,0}) = 7.0*vd.getPos(key)[0];
107  vd.getProp<1>(key).get<0>({2,0,1}) = 7.0*vd.getPos(key)[1];
108  vd.getProp<1>(key).get<0>({2,0,2}) = 7.0*vd.getPos(key)[2];
109 
110  vd.getProp<1>(key).get<0>({2,1,0}) = 8.0*vd.getPos(key)[0];
111  vd.getProp<1>(key).get<0>({2,1,1}) = 8.0*vd.getPos(key)[1];
112  vd.getProp<1>(key).get<0>({2,1,2}) = 8.0*vd.getPos(key)[2];
113 
114  vd.getProp<1>(key).get<0>({2,2,0}) = 9.0*vd.getPos(key)[0];
115  vd.getProp<1>(key).get<0>({2,2,1}) = 9.0*vd.getPos(key)[1];
116  vd.getProp<1>(key).get<0>({2,2,2}) = 9.0*vd.getPos(key)[2];
117 
118  ++it;
119  }
120 
121  vd.map();
122 
123  // sync the ghost
124  vd.ghost_get<0,1>();
125 
126  // Domain + ghost
127  Box<3,float> dom_ext = box;
128  dom_ext.enlarge(ghost2);
129 
130  // Iterate on all particles domain + ghost
131  size_t l_cnt = 0;
132  size_t nl_cnt = 0;
133  size_t n_out = 0;
134 
135  auto it2 = vd.getIterator();
136  count_local_n_local<3,vector_dist<3,float, aggregate<openfpm::vector<float>,grid_cpu<3,aggregate<double,double[3]>>>> >(vd,it2,bc,box,dom_ext,l_cnt,nl_cnt,n_out);
137 
138  // No particles should be out of domain + ghost
139  BOOST_REQUIRE_EQUAL(n_out,0ul);
140 
141  // Ghost must populated because we synchronized them
142  if (k > 524288)
143  {
144  BOOST_REQUIRE(nl_cnt != 0);
145  BOOST_REQUIRE(l_cnt > nl_cnt);
146  }
147 
148  // Sum all the particles inside the domain
149  v_cl.sum(l_cnt);
150  v_cl.execute();
151  BOOST_REQUIRE_EQUAL(l_cnt,(size_t)k);
152 
153  l_cnt = 0;
154  nl_cnt = 0;
155 
156  // Iterate only on the ghost particles
157  auto itg = vd.getGhostIterator();
158  count_local_n_local<3, vector_dist<3,float, aggregate<openfpm::vector<float>,grid_cpu<3,aggregate<double,double[3]>>>> >(vd,itg,bc,box,dom_ext,l_cnt,nl_cnt,n_out);
159 
160  // No particle on the ghost must be inside the domain
161  BOOST_REQUIRE_EQUAL(l_cnt,0ul);
162 
163  // Ghost must be populated
164  if (k > 524288)
165  {
166  BOOST_REQUIRE(nl_cnt != 0);
167  }
168 
169  // check that the particles contain the correct information
170 
171  bool ret = true;
172  auto it3 = vd.getDomainAndGhostIterator();
173 
174  while (it3.isNext())
175  {
176  auto key = it3.get();
177 
178  ret &= vd.getProp<0>(key).size() == 6;
179 
180  ret &= vd.getProp<0>(key).get(0) == vd.getPos(key)[0];
181  ret &= vd.getProp<0>(key).get(1) == vd.getPos(key)[1];
182  ret &= vd.getProp<0>(key).get(2) == vd.getPos(key)[2];
183 
184  ret &= vd.getProp<0>(key).get(3) == vd.getPos(key)[0]+vd.getPos(key)[1];
185  ret &= vd.getProp<0>(key).get(4) == vd.getPos(key)[1]+vd.getPos(key)[2];
186  ret &= vd.getProp<0>(key).get(5) == vd.getPos(key)[0]+vd.getPos(key)[2];
187 
188 // BOOST_REQUIRE_EQUAL(vd.getProp<0>(key).get(0),vd.getPos(key)[0]);
189 
190  ret &= vd.getProp<1>(key).size() == 3*3*3;
191  ret &= vd.getProp<1>(key).get<0>({0,0,0}) == vd.getPos(key)[0];
192  ret &= vd.getProp<1>(key).get<0>({0,0,1}) == vd.getPos(key)[1];
193  ret &= vd.getProp<1>(key).get<0>({0,0,2}) == vd.getPos(key)[2];
194 
195  ret &= vd.getProp<1>(key).get<0>({0,1,0}) == 2.0*vd.getPos(key)[0];
196  ret &= vd.getProp<1>(key).get<0>({0,1,1}) == 2.0*vd.getPos(key)[1];
197  ret &= vd.getProp<1>(key).get<0>({0,1,2}) == 2.0*vd.getPos(key)[2];
198 
199  ret &= vd.getProp<1>(key).get<0>({0,2,0}) == 3.0*vd.getPos(key)[0];
200  ret &= vd.getProp<1>(key).get<0>({0,2,1}) == 3.0*vd.getPos(key)[1];
201  ret &= vd.getProp<1>(key).get<0>({0,2,2}) == 3.0*vd.getPos(key)[2];
202 
203  ret &= vd.getProp<1>(key).get<0>({1,0,0}) == 4.0*vd.getPos(key)[0];
204  ret &= vd.getProp<1>(key).get<0>({1,0,1}) == 4.0*vd.getPos(key)[1];
205  ret &= vd.getProp<1>(key).get<0>({1,0,2}) == 4.0*vd.getPos(key)[2];
206 
207  ret &= vd.getProp<1>(key).get<0>({1,1,0}) == 5.0*vd.getPos(key)[0];
208  ret &= vd.getProp<1>(key).get<0>({1,1,1}) == 5.0*vd.getPos(key)[1];
209  ret &= vd.getProp<1>(key).get<0>({1,1,2}) == 5.0*vd.getPos(key)[2];
210 
211  ret &= vd.getProp<1>(key).get<0>({1,2,0}) == 6.0*vd.getPos(key)[0];
212  ret &= vd.getProp<1>(key).get<0>({1,2,1}) == 6.0*vd.getPos(key)[1];
213  ret &= vd.getProp<1>(key).get<0>({1,2,2}) == 6.0*vd.getPos(key)[2];
214 
215  ret &= vd.getProp<1>(key).get<0>({2,0,0}) == 7.0*vd.getPos(key)[0];
216  ret &= vd.getProp<1>(key).get<0>({2,0,1}) == 7.0*vd.getPos(key)[1];
217  ret &= vd.getProp<1>(key).get<0>({2,0,2}) == 7.0*vd.getPos(key)[2];
218 
219  ret &= vd.getProp<1>(key).get<0>({2,1,0}) == 8.0*vd.getPos(key)[0];
220  ret &= vd.getProp<1>(key).get<0>({2,1,1}) == 8.0*vd.getPos(key)[1];
221  ret &= vd.getProp<1>(key).get<0>({2,1,2}) == 8.0*vd.getPos(key)[2];
222 
223  ret &= vd.getProp<1>(key).get<0>({2,2,0}) == 9.0*vd.getPos(key)[0];
224  ret &= vd.getProp<1>(key).get<0>({2,2,1}) == 9.0*vd.getPos(key)[1];
225  ret &= vd.getProp<1>(key).get<0>({2,2,2}) == 9.0*vd.getPos(key)[2];
226 
227  ++it3;
228  }
229 
230  BOOST_REQUIRE_EQUAL(ret,true);
231  }
232 }
233 
234 
235 #endif /* SRC_VECTOR_VECTOR_DIST_COMPLEX_PRP_UNIT_TEST_HPP_ */
void sum(T &num)
Sum the numbers across all processors and get the result.
size_t getProcessUnitID()
Get the process unit id.
void execute()
Execute all the requests.
Definition: Ghost.hpp:37
Implementation of VCluster class.
Definition: VCluster.hpp:36
void enlarge(const Box< dim, T > &gh)
Enlarge the box with ghost margin.
Definition: Box.hpp:700
This class is a trick to indicate the compiler a specific specialization pattern. ...
Definition: memory_c.hpp:201
Distributed vector.
size_t getProcessingUnits()
Get the total number of processors.