8 #define BOOST_TEST_DYN_LINK
9 #include <boost/test/unit_test.hpp>
11 #include "Vector/vector_dist_multiphase_functions.hpp"
12 #include "VCluster/VCluster.hpp"
13 #include "Vector/vector_dist.hpp"
15 BOOST_AUTO_TEST_SUITE( vector_dist_multiphase_test )
17 BOOST_AUTO_TEST_CASE( vector_dist_multiphase_cell_list_test )
19 if (create_vcluster().getProcessingUnits() > 24)
22 size_t sz[3] = {60,60,40};
25 Box<3,float> box({-1000.0,-1000.0,-1000.0},{2000.0,2000.0,1000.0});
28 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
47 auto g_it = phases.get(0).getGridIterator(sz);
51 auto key = g_it.get();
59 phases.get(0).getLastPos()[0] =
key.get(0) * g_it.getSpacing(0) + box.getLow(0);
60 phases.get(0).getLastPos()[1] =
key.get(1) * g_it.getSpacing(1) + box.getLow(1);
61 phases.get(0).getLastPos()[2] =
key.get(2) * g_it.getSpacing(2) + box.getLow(2);
63 phases.get(1).getLastPos()[0] =
key.get(0) * g_it.getSpacing(0) + box.getLow(0);
64 phases.get(1).getLastPos()[1] =
key.get(1) * g_it.getSpacing(1) + box.getLow(1);
65 phases.get(1).getLastPos()[2] =
key.get(2) * g_it.getSpacing(2) + box.getLow(2);
67 phases.get(2).getLastPos()[0] =
key.get(0) * g_it.getSpacing(0) + box.getLow(0);
68 phases.get(2).getLastPos()[1] =
key.get(1) * g_it.getSpacing(1) + box.getLow(1);
69 phases.get(2).getLastPos()[2] =
key.get(2) * g_it.getSpacing(2) + box.getLow(2);
71 phases.get(3).getLastPos()[0] =
key.get(0) * g_it.getSpacing(0) + box.getLow(0);
72 phases.get(3).getLastPos()[1] =
key.get(1) * g_it.getSpacing(1) + box.getLow(1);
73 phases.get(3).getLastPos()[2] =
key.get(2) * g_it.getSpacing(2) + box.getLow(2);
79 for (
size_t i = 0 ; i < 4 ; i++)
86 for (
size_t p = 0 ; p < phases.
size() ; p++)
90 for (
size_t j = 0 ; j < phases.get(p).size_local() ; j++)
92 vt.add(phases.get(p).getPos((j + p*133) % phases.get(p).size_local()));
94 phases.get(p).getPosVector().swap(vt);
98 for (
size_t i = 0 ; i < 4 ; i++)
100 phases.get(i).ghost_get<>();
104 auto CL_phase0 = phases.get(0).getCellList(r_cut);
105 auto CL_phase1 = phases.get(1).getCellList(r_cut);
108 auto NN_ver01 = createVerlet(phases.get(0),phases.get(1),CL_phase1,r_cut);
113 auto it = phases.get(0).getDomainIterator();
118 auto Np = NN_ver01.getNNIterator<NO_CHECK>(p.getKey());
131 ret &= nn_count == 7ul;
136 BOOST_REQUIRE_EQUAL(ret,
true);
139 for (
size_t i = 0 ; i < 4 ; i++)
142 phases.get(i).ghost_get<>();
148 auto CL_all = createCellListM<2>(phases,r_cut);
151 auto NNver0_all = createVerletM<2>(0,phases.get(0),phases,CL_all,r_cut);
153 it = phases.get(0).getDomainIterator();
158 auto Np = NNver0_all.getNNIterator<NO_CHECK>(p.getKey());
160 size_t nn_cout[4] = {0,0,0,0};
166 auto ph_q = Np.getV();
173 ret &= nn_cout[0] == 7;
174 ret &= nn_cout[1] == 7;
175 ret &= nn_cout[2] == 7;
176 ret &= nn_cout[3] == 7;
181 BOOST_REQUIRE_EQUAL(ret,
true);
185 BOOST_AUTO_TEST_CASE( vector_dist_multiphase_cell_list_sym_test )
187 if (create_vcluster().getProcessingUnits() > 24)
190 size_t sz[3] = {60,60,40};
193 Box<3,float> box({-1000.0,-1000.0,-1000.0},{2000.0,2000.0,1000.0});
196 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
215 auto g_it = phases.get(0).getGridIterator(sz);
217 while (g_it.isNext())
219 auto key = g_it.get();
227 phases.get(0).getLastPosWrite()[0] =
key.get(0) * g_it.getSpacing(0) + box.getLow(0);
228 phases.get(0).getLastPosWrite()[1] =
key.get(1) * g_it.getSpacing(1) + box.getLow(1);
229 phases.get(0).getLastPosWrite()[2] =
key.get(2) * g_it.getSpacing(2) + box.getLow(2);
231 phases.get(1).getLastPosWrite()[0] =
key.get(0) * g_it.getSpacing(0) + box.getLow(0);
232 phases.get(1).getLastPosWrite()[1] =
key.get(1) * g_it.getSpacing(1) + box.getLow(1);
233 phases.get(1).getLastPosWrite()[2] =
key.get(2) * g_it.getSpacing(2) + box.getLow(2);
235 phases.get(2).getLastPosWrite()[0] =
key.get(0) * g_it.getSpacing(0) + box.getLow(0);
236 phases.get(2).getLastPosWrite()[1] =
key.get(1) * g_it.getSpacing(1) + box.getLow(1);
237 phases.get(2).getLastPosWrite()[2] =
key.get(2) * g_it.getSpacing(2) + box.getLow(2);
239 phases.get(3).getLastPosWrite()[0] =
key.get(0) * g_it.getSpacing(0) + box.getLow(0);
240 phases.get(3).getLastPosWrite()[1] =
key.get(1) * g_it.getSpacing(1) + box.getLow(1);
241 phases.get(3).getLastPosWrite()[2] =
key.get(2) * g_it.getSpacing(2) + box.getLow(2);
247 for (
size_t i = 0 ; i < 4 ; i++)
254 for (
size_t p = 0 ; p < phases.
size() ; p++)
258 for (
size_t j = 0 ; j < phases.get(p).size_local() ; j++)
260 vt.add(phases.get(p).getPos((j + p*133) % phases.get(p).size_local()));
262 phases.get(p).getPosVector().swap(vt);
266 for (
size_t i = 0 ; i < 4 ; i++)
268 phases.get(i).ghost_get<>();
272 auto CL_phase0 = phases.get(0).getCellListSym(r_cut);
273 auto CL_phase1 = phases.get(1).getCellListSym(r_cut);
276 auto NN_ver01 = createVerletSym(phases.get(0),phases.get(1),CL_phase1,r_cut);
281 auto it = phases.get(0).getDomainIterator();
286 auto Np = NN_ver01.getNNIterator<NO_CHECK>(p.getKey());
294 phases.get(0).getPropWrite<0>(p)++;
295 phases.get(1).getPropWrite<0>(q)++;
303 phases.get(0).ghost_put<
add_,0>();
304 phases.get(1).ghost_put<
add_,0>();
308 phases.get(1).getDomainIterator();
312 it = phases.get(0).getDomainIterator();
317 ret &= phases.get(0).getPropRead<0>(p) == 7;
318 ret &= phases.get(1).getPropRead<0>(p) == 7;
323 BOOST_REQUIRE_EQUAL(ret,
true);
326 for (
size_t i = 0 ; i < 4 ; i++)
329 phases.get(i).ghost_get<>();
334 for (
size_t i = 0 ; i < phases.
size() ; i++)
336 it = phases.get(i).getDomainAndGhostIterator();
341 phases.get(i).getPropWrite<0>(p) = 0;
350 auto CL_all = createCellListSymM<2>(phases,r_cut);
352 typedef decltype(createVerletSymM<2>(0,phases.get(0),phases,CL_all,r_cut)) verlet_type;
354 verlet_type NNver_all[4];
357 NNver_all[0] = createVerletSymM<2>(0,phases.get(0),phases,CL_all,r_cut);
358 NNver_all[1] = createVerletSymM<2>(1,phases.get(1),phases,CL_all,r_cut);
359 NNver_all[2] = createVerletSymM<2>(2,phases.get(2),phases,CL_all,r_cut);
360 NNver_all[3] = createVerletSymM<2>(3,phases.get(3),phases,CL_all,r_cut);
364 for (
size_t i = 0 ; i < phases.size() ; i++)
366 it = phases.get(i).getDomainIterator();
371 auto Np = NNver_all[i].getNNIterator<NO_CHECK>(p.getKey());
380 auto ph_q = Np.getV();
382 phases.get(i).getPropWrite<0>(p)++;
383 phases.get(ph_q).getPropWrite<0>(q)++;
392 phases.get(0).ghost_put<
add_,0>();
393 phases.get(1).ghost_put<
add_,0>();
394 phases.get(2).ghost_put<
add_,0>();
395 phases.get(3).ghost_put<
add_,0>();
399 it = phases.get(1).getDomainIterator();
400 it = phases.get(2).getDomainIterator();
401 it = phases.get(3).getDomainIterator();
405 it = phases.get(0).getDomainIterator();
410 ret &= phases.get(0).getPropRead<0>(p) == 32;
411 ret &= phases.get(1).getPropRead<0>(p) == 32;
412 ret &= phases.get(2).getPropRead<0>(p) == 32;
413 ret &= phases.get(3).getPropRead<0>(p) == 32;
417 std::cout << phases.get(0).getPropRead<0>(p) << std::endl;
418 std::cout << phases.get(1).getPropRead<0>(p) << std::endl;
419 std::cout << phases.get(2).getPropRead<0>(p) << std::endl;
420 std::cout << phases.get(3).getPropRead<0>(p) << std::endl;
426 BOOST_REQUIRE_EQUAL(ret,
true);
429 BOOST_AUTO_TEST_SUITE_END()
This structure define the operation add to use with copy general.
This class is a trick to indicate the compiler a specific specialization pattern. ...
aggregate of properties, from a list of object if create a struct that follow the OPENFPM native stru...
Implementation of 1-D std::vector like structure.