8 #define BOOST_TEST_DYN_LINK
9 #include <boost/test/unit_test.hpp>
11 #include "VCluster/VCluster.hpp"
12 #include "Vector/vector_dist.hpp"
13 #include "Vector/vector_dist_subset.hpp"
15 extern void print_test_v(std::string test,
size_t sz);
21 template<
template <
unsigned int>
class VerletList>
22 void test_full_nn_subset(
long int k)
32 std::default_random_engine eg;
33 std::uniform_real_distribution<float> ud(0.0f, 1.0f);
35 long int big_step = k / 4;
36 big_step = (big_step == 0)?1:big_step;
38 print_test_v(
"Testing 3D full NN search k=",k);
39 BOOST_TEST_CHECKPOINT(
"Testing 3D full NN search k=" << k );
44 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
46 for (
double r_cut = 0.1 ; r_cut < 1.0; r_cut += 0.1)
56 auto it = vd.getIterator();
62 vd.getPos(key)[0] = ud(eg);
63 vd.getPos(key)[1] = ud(eg);
64 vd.getPos(key)[2] = ud(eg);
68 vd.getProp<0>(key) = 0.0;
90 list_idx.resize(vd.size_local());
91 list_idx2.resize(vd.size_local());
93 for (
size_t i = 0 ; i < vd.size_local() ; i++)
97 for (
size_t j = 0 ; j < vd.size_local_with_ghost(); j++)
101 if (vd.getSubset(i) == 0 && vd.getSubset(j) == 0)
102 if (p.distance2(q) < r_cut * r_cut)
103 list_idx.get(i).add(j);
106 list_idx.get(i).sort();
109 auto NNv = Particles_subset0.getVerlet(r_cut*1.0001);
111 it = vd.getDomainIterator();
116 auto Np = NNv.getNNIterator(it.get().getKey());
118 list_idx2.get(it.get().getKey()).clear();
127 list_idx2.get(it.get().getKey()).add(q);
132 list_idx2.get(it.get().getKey()).sort();
137 BOOST_REQUIRE_EQUAL(list_idx.
size(),list_idx2.
size());
139 for (
size_t i = 0 ; i < list_idx.
size() ; i++)
141 BOOST_REQUIRE_EQUAL(list_idx.get(i).
size(),list_idx2.get(i).
size());
144 for (
size_t j = 0 ; j < list_idx.get(i).size() ; j++)
145 ret &= list_idx.get(i).get(j) == list_idx2.get(i).get(j);
147 BOOST_REQUIRE_EQUAL(ret,
true);
150 list_idx.clear(); list_idx.resize(vd.size_local());
151 list_idx2.clear(); list_idx2.resize(vd.size_local());
153 for (
size_t i = 0 ; i < vd.size_local() ; i++)
157 for (
size_t j = 0 ; j < vd.size_local_with_ghost(); j++)
161 if (vd.getSubset(i) == 1 && vd.getSubset(j) == 1)
162 if (p.distance2(q) < r_cut * r_cut)
163 list_idx.get(i).add(j);
166 list_idx.get(i).sort();
169 NNv = Particles_subset1.getVerlet(r_cut*1.0001);
171 it = vd.getDomainIterator();
176 auto Np = NNv.getNNIterator(it.get().getKey());
178 list_idx2.get(it.get().getKey()).clear();
187 list_idx2.get(it.get().getKey()).add(q);
192 list_idx2.get(it.get().getKey()).sort();
197 BOOST_REQUIRE_EQUAL(list_idx.
size(),list_idx2.
size());
199 for (
size_t i = 0 ; i < list_idx.
size() ; i++)
201 BOOST_REQUIRE_EQUAL(list_idx.get(i).
size(),list_idx2.get(i).
size());
204 for (
size_t j = 0 ; j < list_idx.get(i).size() ; j++)
205 ret &= list_idx.get(i).get(j) == list_idx2.get(i).get(j);
207 BOOST_REQUIRE_EQUAL(ret,
true);
213 template<
template <
unsigned int>
class VerletList>
214 void test_full_nn(
long int k)
224 std::default_random_engine eg;
225 std::uniform_real_distribution<float> ud(0.0f, 1.0f);
227 long int big_step = k / 4;
228 big_step = (big_step == 0)?1:big_step;
230 print_test_v(
"Testing 3D full NN search k=",k);
231 BOOST_TEST_CHECKPOINT(
"Testing 3D full NN search k=" << k );
236 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
238 for (
double r_cut = 0.1 ; r_cut < 1.0; r_cut += 0.1)
248 auto it = vd.getIterator();
254 vd.getPos(key)[0] = ud(eg);
255 vd.getPos(key)[1] = ud(eg);
256 vd.getPos(key)[2] = ud(eg);
260 vd.getProp<0>(key) = 0.0;
273 list_idx.resize(vd.size_local());
274 list_idx2.resize(vd.size_local());
276 for (
size_t i = 0 ; i < vd.size_local() ; i++)
280 for (
size_t j = 0 ; j < vd.size_local_with_ghost(); j++)
284 if (p.distance2(q) < r_cut * r_cut)
285 list_idx.get(i).add(j);
288 list_idx.get(i).sort();
291 auto NN = vd.getCellList(r_cut);
293 it = vd.getDomainIterator();
298 auto Np = NN.getNNIteratorBox(NN.getCell(xp));
307 list_idx2.get(it.get().getKey()).add(q);
312 list_idx2.get(it.get().getKey()).sort();
317 BOOST_REQUIRE_EQUAL(list_idx.
size(),list_idx2.
size());
320 for (
size_t i = 0 ; i < list_idx.
size() ; i++)
322 BOOST_REQUIRE_EQUAL(list_idx.get(i).
size(),list_idx2.get(i).
size());
325 for (
size_t j = 0 ; j < list_idx.get(i).size() ; j++)
326 ret &= list_idx.get(i).get(j) == list_idx2.get(i).get(j);
328 BOOST_REQUIRE_EQUAL(ret,
true);
333 auto NNv = vd.template getVerlet<VL_NON_SYMMETRIC, VerletList<VL_NON_SYMMETRIC>>(r_cut*1.0001);
335 it = vd.getDomainIterator();
340 auto Np = NNv.getNNIterator(it.get().getKey());
342 list_idx2.get(it.get().getKey()).clear();
351 list_idx2.get(it.get().getKey()).add(q);
356 list_idx2.get(it.get().getKey()).sort();
361 BOOST_REQUIRE_EQUAL(list_idx.
size(),list_idx2.
size());
363 for (
size_t i = 0 ; i < list_idx.
size() ; i++)
365 BOOST_REQUIRE_EQUAL(list_idx.get(i).
size(),list_idx2.get(i).
size());
368 for (
size_t j = 0 ; j < list_idx.get(i).size() ; j++)
369 ret &= list_idx.get(i).get(j) == list_idx2.get(i).get(j);
371 BOOST_REQUIRE_EQUAL(ret,
true);
377 vd.updateVerlet(NNv,r_cut*1.0001);
379 it = vd.getDomainIterator();
384 auto Np = NNv.getNNIterator(it.get().getKey());
386 list_idx2.get(it.get().getKey()).clear();
395 list_idx2.get(it.get().getKey()).add(q);
400 list_idx2.get(it.get().getKey()).sort();
405 BOOST_REQUIRE_EQUAL(list_idx.
size(),list_idx2.
size());
407 for (
size_t i = 0 ; i < list_idx.
size() ; i++)
409 BOOST_REQUIRE_EQUAL(list_idx.get(i).
size(),list_idx2.get(i).
size());
412 for (
size_t j = 0 ; j < list_idx.get(i).size() ; j++)
413 ret &= list_idx.get(i).get(j) == list_idx2.get(i).get(j);
415 BOOST_REQUIRE_EQUAL(ret,
true);
420 template<
template <
unsigned int>
class VerletList>
421 void test_full_nn_adaptive(
long int k)
431 std::default_random_engine eg;
432 std::uniform_real_distribution<float> ud(0.0f, 1.0f);
434 long int big_step = k / 4;
435 big_step = (big_step == 0)?1:big_step;
437 print_test_v(
"Testing 3D full NN search k=",k);
438 BOOST_TEST_CHECKPOINT(
"Testing 3D full NN search k=" << k );
443 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
445 for (
double r_cut = 0.1 ; r_cut < 1.0; r_cut += 0.1)
455 auto it = vd.getIterator();
461 vd.getPos(key)[0] = ud(eg);
462 vd.getPos(key)[1] = ud(eg);
463 vd.getPos(key)[2] = ud(eg);
467 vd.getProp<1>(key) = 0.0;
480 list_idx.resize(vd.size_local());
481 list_idx2.resize(vd.size_local());
483 for (
size_t i = 0 ; i < vd.size_local() ; i++)
487 for (
size_t j = 0 ; j < vd.size_local_with_ghost(); j++)
491 if (p.distance2(q) < r_cut * r_cut)
492 list_idx.get(i).add(j);
495 list_idx.get(i).sort();
498 auto NN = vd.getCellList(r_cut);
500 it = vd.getDomainIterator();
505 auto Np = NN.getNNIteratorBox(NN.getCell(xp));
514 list_idx2.get(it.get().getKey()).add(q);
519 list_idx2.get(it.get().getKey()).sort();
524 BOOST_REQUIRE_EQUAL(list_idx.
size(),list_idx2.
size());
527 for (
size_t i = 0 ; i < list_idx.
size() ; i++)
529 BOOST_REQUIRE_EQUAL(list_idx.get(i).
size(),list_idx2.get(i).
size());
532 for (
size_t j = 0 ; j < list_idx.get(i).size() ; j++)
533 ret &= list_idx.get(i).get(j) == list_idx2.get(i).get(j);
535 BOOST_REQUIRE_EQUAL(ret,
true);
539 for (
int i = 0; i < vd.size_local(); ++i)
542 vd.getProp<0>(i) = r_cut*1.0001;
545 auto NNv = vd.template getVerletAdaptRCut<VerletList<VL_ADAPTIVE_RCUT>>();
547 it = vd.getDomainIterator();
552 auto Np = NNv.getNNIterator(it.get().getKey());
554 list_idx2.get(it.get().getKey()).clear();
563 list_idx2.get(it.get().getKey()).add(q);
568 list_idx2.get(it.get().getKey()).sort();
573 BOOST_REQUIRE_EQUAL(list_idx.
size(),list_idx2.
size());
575 for (
size_t i = 0 ; i < list_idx.
size() ; i++)
577 BOOST_REQUIRE_EQUAL(list_idx.get(i).
size(),list_idx2.get(i).
size());
580 for (
size_t j = 0 ; j < list_idx.get(i).size() ; j++)
581 ret &= list_idx.get(i).get(j) == list_idx2.get(i).get(j);
583 BOOST_REQUIRE_EQUAL(ret,
true);
589 vd.updateVerletAdaptRCut(NNv);
591 it = vd.getDomainIterator();
596 auto Np = NNv.getNNIterator(it.get().getKey());
598 list_idx2.get(it.get().getKey()).clear();
607 list_idx2.get(it.get().getKey()).add(q);
612 list_idx2.get(it.get().getKey()).sort();
617 BOOST_REQUIRE_EQUAL(list_idx.
size(),list_idx2.
size());
619 for (
size_t i = 0 ; i < list_idx.
size() ; i++)
621 BOOST_REQUIRE_EQUAL(list_idx.get(i).
size(),list_idx2.get(i).
size());
624 for (
size_t j = 0 ; j < list_idx.get(i).size() ; j++)
625 ret &= list_idx.get(i).get(j) == list_idx2.get(i).get(j);
627 BOOST_REQUIRE_EQUAL(ret,
true);
632 BOOST_AUTO_TEST_CASE( vector_dist_full_NN )
634 auto & v_cl = create_vcluster();
636 #ifdef TEST_COVERAGE_MODE
642 test_full_nn<VERLET_MEMFAST_OPT>(k);
645 test_full_nn<VERLET_MEMBAL_OPT>(k);
647 test_full_nn<VERLET_MEMMW_OPT>(k);
650 BOOST_AUTO_TEST_CASE( vector_dist_full_NN_subset )
652 auto & v_cl = create_vcluster();
654 #ifdef TEST_COVERAGE_MODE
660 test_full_nn_subset<VERLET_MEMFAST_OPT>(k);
663 test_full_nn_subset<VERLET_MEMBAL_OPT>(k);
665 test_full_nn_subset<VERLET_MEMMW_OPT>(k);
668 BOOST_AUTO_TEST_CASE( vector_dist_full_NN_adaptive )
670 auto & v_cl = create_vcluster();
672 #ifdef TEST_COVERAGE_MODE
678 test_full_nn_adaptive<VERLET_MEMFAST_OPT>(k);
681 test_full_nn_adaptive<VERLET_MEMBAL_OPT>(k);
683 test_full_nn_adaptive<VERLET_MEMMW_OPT>(k);
686 BOOST_AUTO_TEST_CASE( vector_dist_particle_iteration )
696 std::default_random_engine eg;
697 std::uniform_real_distribution<float> ud(0.0f, 1.0f);
701 print_test_v(
"Testing 3D particle cell iterator=",k);
702 BOOST_TEST_CHECKPOINT(
"Testing 3D full NN search k=" << k );
707 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
719 auto it = vd.getIterator();
725 vd.getPos(key)[0] = ud(eg);
726 vd.getPos(key)[1] = ud(eg);
727 vd.getPos(key)[2] = ud(eg);
731 vd.getProp<0>(key) = 0.0;
742 ids.resize(vd.size_local());
744 auto NN = vd.getCellListSym(r_cut);
746 auto it_pcell = vd.getDomainIteratorCells(NN);
749 while (it_pcell.isNext())
753 size_t id = it_pcell.get();
756 BOOST_REQUIRE(
id < vd.size_local());
764 BOOST_REQUIRE_EQUAL((
long int)count,k);
767 BOOST_AUTO_TEST_CASE( vector_dist_particle_NN_update_with_limit )
777 std::default_random_engine eg;
778 std::uniform_real_distribution<float> ud(0.0f, 1.0f);
782 print_test_v(
"Testing 3D particle cell-list with radius at limit= ",k);
783 BOOST_TEST_CHECKPOINT(
"Testing 3D particle cell-list with radius at limit= " << k );
788 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
800 auto it = vd.getIterator();
806 vd.getPos(key)[0] = ud(eg);
807 vd.getPos(key)[1] = ud(eg);
808 vd.getPos(key)[2] = ud(eg);
812 vd.getProp<0>(key) = 0.0;
822 auto NN = vd.getCellListSym(r_cut);
824 auto cell1 = NN.getCellBox();
826 vd.getDecomposition().decompose();
829 vd.updateCellList(NN);
831 auto cell2 = NN.getCellBox();
833 BOOST_REQUIRE_EQUAL(cell1.getHigh(0),cell2.getHigh(0));
834 BOOST_REQUIRE_EQUAL(cell1.getHigh(1),cell2.getHigh(1));
835 BOOST_REQUIRE_EQUAL(cell1.getHigh(2),cell2.getHigh(2));
838 BOOST_AUTO_TEST_CASE( vector_dist_particle_getCellListSym_with_div )
848 std::default_random_engine eg;
849 std::uniform_real_distribution<float> ud(0.0f, 1.0f);
853 print_test_v(
"Testing 3D particle getCellListSym with div =",k);
854 BOOST_TEST_CHECKPOINT(
"Testing 3D particle getCellListSym with div = " << k );
859 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
871 auto it = vd.getIterator();
877 vd.getPos(key)[0] = ud(eg);
878 vd.getPos(key)[1] = ud(eg);
879 vd.getPos(key)[2] = ud(eg);
883 vd.getProp<0>(key) = 0.0;
893 auto NN1 = vd.getCellListSym(r_cut);
895 size_t div_wp[3] = {NN1.getDivWP()[0],NN1.getDivWP()[1],NN1.getDivWP()[2]};
896 size_t pad[3] = {NN1.getPadding()[0],NN1.getPadding()[1],NN1.getPadding()[2]};
898 auto NN2 = vd.getCellListSym(div_wp,pad);
903 size_t div[3] = {NN1.getInternalGrid().getSize()[0],
904 NN1.getInternalGrid().getSize()[1],
905 NN1.getInternalGrid().getSize()[2]};
914 while (g_it.isNext())
916 size_t cell = g_info.LinId(g_it.get());
917 size_t n_ele1 = NN1.getNelements(cell);
918 size_t n_ele2 = NN2.getNelements(cell);
920 match &= n_ele1 == n_ele2;
925 BOOST_REQUIRE_EQUAL(match,
true);