9 #define BOOST_TEST_DYN_LINK
10 #include <boost/test/unit_test.hpp>
11 #include "Point_test.hpp"
12 #include "Vector/performance/vector_dist_performance_common.hpp"
13 #include "Vector/vector_dist.hpp"
15 extern void print_test_v(std::string test,
size_t sz);
16 extern long int decrement(
long int k,
long int step);
20 void test_reorder_sfc(reorder_opt opt)
30 std::default_random_engine eg;
31 std::uniform_real_distribution<float> ud(0.0f, 1.0f);
33 #ifdef TEST_COVERAGE_MODE
39 long int big_step = k / 4;
40 big_step = (big_step == 0)?1:big_step;
42 print_test_v(
"Testing 2D vector with sfc curve reordering k<=",k);
45 for ( ; k >= 2 ; k-= decrement(k,big_step) )
47 BOOST_TEST_CHECKPOINT(
"Testing 2D vector with sfc curve reordering k=" << k );
52 size_t bc[2]={NON_PERIODIC,NON_PERIODIC};
56 auto it = vd.getIterator();
62 vd.getPos(
key)[0] = ud(eg);
63 vd.getPos(
key)[1] = ud(eg);
74 auto NN1 = vd.getCellList(0.01,
true);
83 auto NN2 = vd.getCellList(0.01,
true);
86 for (
size_t i = 0 ; i < NN1.getGrid().size() ; i++)
88 size_t n1 = NN1.getNelements(i);
89 size_t n2 = NN2.getNelements(i);
91 BOOST_REQUIRE_EQUAL(n1,n2);
96 BOOST_AUTO_TEST_CASE( vector_dist_reorder_2d_test )
98 test_reorder_sfc(reorder_opt::HILBERT);
99 test_reorder_sfc(reorder_opt::LINEAR);
102 BOOST_AUTO_TEST_CASE( vector_dist_cl_random_vs_hilb_forces_test )
104 Vcluster & v_cl = create_vcluster();
112 const size_t dim = 3;
116 size_t cl_k_start = 10000;
118 size_t cl_k_min = 1000;
120 double ghost_part = 0.05;
125 for (
size_t r = 0; r < cl_r_cutoff.size(); r++ )
128 float r_cut = cl_r_cutoff.get(r);
133 std::string str(
"Testing " + std::to_string(dim) +
"D vector's forces (random vs hilb celllist) k<=");
138 for (
size_t k_int = k ; k_int >= cl_k_min ; k_int/=2 )
140 BOOST_TEST_CHECKPOINT(
"Testing " << dim <<
"D vector's forces (random vs hilb celllist) k<=" << k_int );
144 for (
size_t i = 0; i < dim; i++)
153 for (
size_t i = 0; i < dim; i++)
161 vd_initialize_double<dim>(vd, vd2, v_cl, k_int);
168 auto NN = vd.getCellList(r_cut);
172 calc_forces<dim>(NN,vd,r_cut);
176 auto NN_hilb = vd2.getCellList_hilb(r_cut);
179 calc_forces_hilb<dim>(NN_hilb,vd2,r_cut);
184 for (
size_t i = 0 ; i < dim ; i++) {avg.
get(i) = 0.0;}
186 auto it_v2 = vd.getIterator();
187 while (it_v2.isNext())
192 for (
size_t i = 0; i < dim; i++)
193 {avg.
get(i) += fabs(vd.getProp<0>(key)[i]);}
199 for (
size_t i = 0 ; i < dim ; i++) {avg.
get(i) /= count;}
201 auto it_v = vd.getIterator();
202 while (it_v.isNext())
207 for (
size_t i = 0; i < dim; i++)
209 auto a1 = vd.getProp<0>(key)[i];
210 auto a2 = vd2.getProp<0>(key)[i];
215 per = fabs(0.1*avg.
get(i)/a1);
217 BOOST_REQUIRE_CLOSE((
float)a1,(
float)a2,per);
226 BOOST_AUTO_TEST_CASE( vector_dist_cl_random_vs_reorder_forces_test )
228 Vcluster & v_cl = create_vcluster();
236 const size_t dim = 3;
240 size_t cl_k_start = 10000;
242 size_t cl_k_min = 1000;
244 double ghost_part = 0.01;
249 for (
size_t r = 0; r < cl_r_cutoff.size(); r++ )
252 float r_cut = cl_r_cutoff.get(r);
257 std::string str(
"Testing " + std::to_string(dim) +
"D vector's forces (random vs reorder) k<=");
262 for (
size_t k_int = k ; k_int >= cl_k_min ; k_int/=2 )
264 BOOST_TEST_CHECKPOINT(
"Testing " << dim <<
"D vector's forces (random vs reorder) k<=" << k_int );
268 for (
size_t i = 0; i < dim; i++)
277 for (
size_t i = 0; i < dim; i++)
283 vd_initialize<dim,decltype(vd)>(vd, v_cl, k_int);
289 auto NN1 = vd.getCellList(r_cut);
293 calc_forces<dim>(NN1,vd,r_cut);
301 auto NN2 = vd.getCellList(r_cut);
304 calc_forces<dim,1>(NN2,vd,r_cut);
309 for (
size_t i = 0 ; i < dim ; i++) {avg.
get(i) = 0.0;}
311 auto it_v2 = vd.getIterator();
312 while (it_v2.isNext())
317 for (
size_t i = 0; i < dim; i++)
318 avg.
get(i) += fabs(vd.getProp<0>(key)[i]);
324 for (
size_t i = 0 ; i < dim ; i++) {avg.
get(i) /= count;}
327 auto it_v = vd.getDomainIterator();
329 while (it_v.isNext())
334 for (
size_t i = 0; i < dim; i++)
336 float a1 = vd.getProp<0>(key)[i];
337 float a2 = vd.getProp<1>(key)[i];
342 per = fabs(0.1*avg.
get(i)/a1);
344 BOOST_REQUIRE_CLOSE(a1,a2,per);
353 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_cell_list )
355 Vcluster & v_cl = create_vcluster();
365 std::default_random_engine eg;
366 std::uniform_real_distribution<float> ud(-L,L);
370 long int big_step = k / 4;
371 big_step = (big_step == 0)?1:big_step;
373 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
374 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list k=" << k );
379 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
392 bool operator<(
const struct point_and_gid & pag)
const
394 return (
id < pag.id);
402 size_t start = vd.init_size_accum(k);
404 auto it = vd.getIterator();
410 vd.getPosWrite(key)[0] = ud(eg);
411 vd.getPosWrite(key)[1] = ud(eg);
412 vd.getPosWrite(key)[2] = ud(eg);
416 vd.getPropWrite<0>(key) = 0;
417 vd.getPropWrite<1>(key) = 0;
418 vd.getPropWrite<2>(key) = key.
getKey() + start;
428 auto NN = vd.getCellList(r_cut);
429 auto p_it = vd.getDomainIterator();
431 while (p_it.isNext())
437 auto Np = NN.getNNIterator(NN.getCell(xp));
454 float distance = f.
norm();
458 if (distance < r_cut )
460 vd.getPropWrite<0>(p)++;
461 vd.getPropWrite<3>(p).add();
462 vd.getPropWrite<3>(p).last().xq = xq;
463 vd.getPropWrite<3>(p).last().id = vd.getPropWrite<2>(q);
474 auto NN2 = vd.getCellListSym(r_cut);
476 auto p_it2 = vd.getDomainIterator();
478 while (p_it2.isNext())
480 auto p = p_it2.
get();
484 auto Np = NN2.getNNIteratorSym<NO_CHECK>(NN2.getCell(xp),p.getKey(),vd.getPosVector());
501 float distance = f.
norm();
505 if (distance < r_cut )
507 vd.getPropWrite<1>(p)++;
508 vd.getPropWrite<1>(q)++;
510 vd.getPropWrite<4>(p).add();
511 vd.getPropWrite<4>(q).add();
513 vd.getPropWrite<4>(p).last().xq = xq;
514 vd.getPropWrite<4>(q).last().xq = xp;
515 vd.getPropWrite<4>(p).last().id = vd.getProp<2>(q);
516 vd.getPropWrite<4>(q).last().id = vd.getProp<2>(p);
525 vd.ghost_put<
add_,1>();
528 auto p_it3 = vd.getDomainIterator();
531 while (p_it3.isNext())
533 auto p = p_it3.get();
535 ret &= vd.getPropRead<1>(p) == vd.getPropRead<0>(p);
537 vd.getPropRead<3>(p).sort();
538 vd.getPropRead<4>(p).sort();
540 ret &= vd.getPropRead<3>(p).size() == vd.getPropRead<4>(p).size();
542 for (
size_t i = 0 ; i < vd.getPropRead<3>(p).size() ; i++)
543 ret &= vd.getPropRead<3>(p).get(i).id == vd.getPropRead<4>(p).
get(i).id;
547 std::cout << vd.getPropRead<3>(p).size() <<
" " << vd.getPropRead<4>(p).size() << std::endl;
549 for (
size_t i = 0 ; i < vd.getPropRead<3>(p).size() ; i++)
550 std::cout << vd.getPropRead<3>(p).get(i).id <<
" " << vd.getPropRead<4>(p).
get(i).id << std::endl;
552 std::cout << vd.getPropRead<1>(p) <<
" A " << vd.getPropRead<0>(p) << std::endl;
560 BOOST_REQUIRE_EQUAL(ret,
true);
563 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_crs_cell_list )
565 Vcluster & v_cl = create_vcluster();
575 std::uniform_real_distribution<float> ud(-L,L);
579 long int big_step = k / 4;
580 big_step = (big_step == 0)?1:big_step;
582 print_test_v(
"Testing 3D periodic vector symmetric crs cell-list k=",k);
583 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric crs cell-list k=" << k );
588 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
595 ghost2.setLow(0,0.0);
596 ghost2.setLow(1,0.0);
597 ghost2.setLow(2,0.0);
605 bool operator<(
const struct point_and_gid & pag)
const
607 return (
id < pag.id);
616 size_t start = vd.init_size_accum(k);
618 auto it = vd.getIterator();
624 vd.getPosWrite(key)[0] = ud(eg);
625 vd.getPosWrite(key)[1] = ud(eg);
626 vd.getPosWrite(key)[2] = ud(eg);
628 vd2.getPosWrite(key)[0] = vd.getPosRead(key)[0];
629 vd2.getPosWrite(key)[1] = vd.getPosRead(key)[1];
630 vd2.getPosWrite(key)[2] = vd.getPosRead(key)[2];
634 vd.getPropWrite<0>(key) = 0;
635 vd.getPropWrite<1>(key) = 0;
636 vd.getPropWrite<2>(key) = key.
getKey() + start;
638 vd2.getPropWrite<0>(key) = 0;
639 vd2.getPropWrite<1>(key) = 0;
640 vd2.getPropWrite<2>(key) = key.
getKey() + start;
650 vd2.ghost_get<0,2>();
652 vd2.write(
"CRS_output");
653 vd2.getDecomposition().write(
"CRS_output_dec");
655 auto NN = vd.getCellList(r_cut);
656 auto p_it = vd.getDomainIterator();
658 while (p_it.isNext())
664 auto Np = NN.getNNIterator(NN.getCell(xp));
681 float distance = f.
norm();
685 if (distance < r_cut )
687 vd.getPropWrite<0>(p)++;
688 vd.getPropWrite<3>(p).add();
689 vd.getPropWrite<3>(p).last().xq = xq;
690 vd.getPropWrite<3>(p).last().id = vd.getPropRead<2>(q);
701 auto NN2 = vd2.getCellListSym(r_cut);
705 auto p_it2 = vd2.getParticleIteratorCRS_Cell(NN2);
708 while (p_it2.isNext())
710 auto p = p_it2.
get();
714 auto Np = p_it2.getNNIteratorCSR(vd2.getPosVector());
731 float distance = f.
norm();
735 if (distance < r_cut )
737 vd2.getPropWrite<1>(p)++;
738 vd2.getPropWrite<1>(q)++;
740 vd2.getPropWrite<4>(p).add();
741 vd2.getPropWrite<4>(q).add();
743 vd2.getPropWrite<4>(p).last().xq = xq;
744 vd2.getPropWrite<4>(q).last().xq = xp;
745 vd2.getPropWrite<4>(p).last().id = vd2.getPropRead<2>(q);
746 vd2.getPropWrite<4>(q).last().id = vd2.getPropRead<2>(p);
755 vd2.ghost_put<
add_,1>(NO_CHANGE_ELEMENTS);
756 vd2.ghost_put<
merge_,4>();
759 vd2.getDomainIterator();
762 auto p_it3 = vd.getDomainIterator();
765 while (p_it3.isNext())
767 auto p = p_it3.get();
769 ret &= vd2.getPropRead<1>(p) == vd.getPropRead<0>(p);
772 vd.getPropWrite<3>(p).sort();
773 vd2.getPropWrite<4>(p).sort();
775 ret &= vd.getPropRead<3>(p).size() == vd2.getPropRead<4>(p).size();
777 for (
size_t i = 0 ; i < vd.getPropRead<3>(p).size() ; i++)
778 ret &= vd.getPropRead<3>(p).get(i).id == vd2.getPropRead<4>(p).
get(i).id;
786 BOOST_REQUIRE_EQUAL(ret,
true);
789 template<
typename VerletList>
790 void test_vd_symmetric_verlet_list()
792 Vcluster & v_cl = create_vcluster();
802 std::default_random_engine eg;
803 std::uniform_real_distribution<float> ud(-L,L);
807 long int big_step = k / 4;
808 big_step = (big_step == 0)?1:big_step;
810 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
811 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric verlet-list k=" << k );
816 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
829 bool operator<(
const struct point_and_gid & pag)
const
831 return (
id < pag.id);
839 size_t start = vd.init_size_accum(k);
841 auto it = vd.getIterator();
847 vd.getPosWrite(key)[0] = ud(eg);
848 vd.getPosWrite(key)[1] = ud(eg);
849 vd.getPosWrite(key)[2] = ud(eg);
853 vd.template getPropWrite<0>(key) = 0;
854 vd.template getPropWrite<1>(key) = 0;
855 vd.template getPropWrite<2>(key) = key.
getKey() + start;
863 vd.template ghost_get<0,2>();
865 auto NN = vd.template getVerlet<VerletList>(r_cut);
866 auto p_it = vd.getDomainIterator();
868 while (p_it.isNext())
874 auto Np = NN.getNNIterator(p.getKey());
891 float distance = f.
norm();
895 if (distance < r_cut )
897 vd.template getPropWrite<0>(p)++;
898 vd.template getPropWrite<3>(p).add();
899 vd.template getPropWrite<3>(p).last().xq = xq;
900 vd.template getPropWrite<3>(p).last().id = vd.template getPropRead<2>(q);
911 auto NN2 = vd.template getVerletSym<VerletList>(r_cut);
913 auto p_it2 = vd.getDomainIterator();
915 while (p_it2.isNext())
917 auto p = p_it2.
get();
921 auto Np = NN2.template getNNIterator<NO_CHECK>(p.getKey());
938 float distance = f.
norm();
942 if (distance < r_cut )
944 vd.template getPropWrite<1>(p)++;
945 vd.template getPropWrite<1>(q)++;
947 vd.template getPropWrite<4>(p).add();
948 vd.template getPropWrite<4>(q).add();
950 vd.template getPropWrite<4>(p).last().xq = xq;
951 vd.template getPropWrite<4>(q).last().xq = xp;
952 vd.template getPropWrite<4>(p).last().id = vd.template getPropRead<2>(q);
953 vd.template getPropWrite<4>(q).last().id = vd.template getPropRead<2>(p);
962 vd.template ghost_put<add_,1>();
963 vd.template ghost_put<merge_,4>();
965 auto p_it3 = vd.getDomainIterator();
968 while (p_it3.isNext())
970 auto p = p_it3.get();
972 ret &= vd.template getPropRead<1>(p) == vd.template getPropRead<0>(p);
974 vd.template getPropWrite<3>(p).sort();
975 vd.template getPropWrite<4>(p).sort();
977 ret &= vd.template getPropRead<3>(p).size() == vd.template getPropRead<4>(p).size();
979 for (
size_t i = 0 ; i < vd.template getPropRead<3>(p).size() ; i++)
980 ret &= vd.template getPropRead<3>(p).get(i).id == vd.template getPropRead<4>(p).
get(i).id;
988 BOOST_REQUIRE_EQUAL(ret,
true);
991 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_verlet_list )
993 test_vd_symmetric_verlet_list<VERLET_MEMFAST(3,float)>();
994 test_vd_symmetric_verlet_list<VERLET_MEMBAL(3,float)>();
995 test_vd_symmetric_verlet_list<VERLET_MEMMW(3,float)>();
998 template<
typename VerletList>
999 void vector_sym_verlet_list_nb()
1001 Vcluster & v_cl = create_vcluster();
1011 std::default_random_engine eg;
1012 std::uniform_real_distribution<float> ud(-L,L);
1016 long int big_step = k / 4;
1017 big_step = (big_step == 0)?1:big_step;
1019 print_test_v(
"Testing 3D periodic vector symmetric cell-list no bottom k=",k);
1020 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list no bottom k=" << k );
1025 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
1027 float r_cut = 100.0;
1032 ghost2.setLow(2,0.0);
1035 struct point_and_gid
1040 bool operator<(
const struct point_and_gid & pag)
const
1042 return (
id < pag.id);
1049 for (
size_t s = 0 ; s < 8 ; s++)
1055 size_t start = vd.init_size_accum(k);
1057 auto it = vd.getIterator();
1061 auto key = it.get();
1063 vd.getPosWrite(key)[0] = ud(eg);
1064 vd.getPosWrite(key)[1] = ud(eg);
1065 vd.getPosWrite(key)[2] = ud(eg);
1067 vd2.getPosWrite(key)[0] = vd.getPosRead(key)[0];
1068 vd2.getPosWrite(key)[1] = vd.getPosRead(key)[1];
1069 vd2.getPosWrite(key)[2] = vd.getPosRead(key)[2];
1073 vd.template getPropWrite<0>(key) = 0;
1074 vd.template getPropWrite<1>(key) = 0;
1075 vd.template getPropWrite<2>(key) = key.
getKey() + start;
1077 vd2.template getPropWrite<0>(key) = 0;
1078 vd2.template getPropWrite<1>(key) = 0;
1079 vd2.template getPropWrite<2>(key) = key.
getKey() + start;
1088 vd.template ghost_get<0,2>();
1089 vd2.template ghost_get<0,2>();
1091 auto NN = vd.template getVerlet<VerletList>(r_cut);
1092 auto p_it = vd.getDomainIterator();
1094 while (p_it.isNext())
1096 auto p = p_it.get();
1100 auto Np = NN.getNNIterator(p.getKey());
1106 if (p.getKey() == q)
1117 float distance = f.
norm();
1121 if (distance < r_cut )
1123 vd.template getPropWrite<0>(p)++;
1124 vd.template getPropWrite<3>(p).add();
1125 vd.template getPropWrite<3>(p).last().xq = xq;
1126 vd.template getPropWrite<3>(p).last().id = vd.template getPropRead<2>(q);
1137 auto NN2 = vd2.template getVerletSym<VerletList>(r_cut);
1139 auto p_it2 = vd2.getDomainIterator();
1141 while (p_it2.isNext())
1143 auto p = p_it2.
get();
1147 auto Np = NN2.template getNNIterator<NO_CHECK>(p.getKey());
1153 if (p.getKey() == q)
1164 float distance = f.
norm();
1168 if (distance < r_cut )
1170 vd2.template getPropWrite<1>(p)++;
1171 vd2.template getPropWrite<1>(q)++;
1173 vd2.template getPropWrite<4>(p).add();
1174 vd2.template getPropWrite<4>(q).add();
1176 vd2.template getPropWrite<4>(p).last().xq = xq;
1177 vd2.template getPropWrite<4>(q).last().xq = xp;
1178 vd2.template getPropWrite<4>(p).last().id = vd2.template getPropRead<2>(q);
1179 vd2.template getPropWrite<4>(q).last().id = vd2.template getPropRead<2>(p);
1189 vd2.template ghost_put<add_,1>();
1190 vd2.template ghost_put<merge_,4>();
1193 vd2.getDomainIterator();
1196 auto p_it3 = vd.getDomainIterator();
1199 while (p_it3.isNext())
1201 auto p = p_it3.
get();
1203 ret &= vd2.template getPropRead<1>(p) == vd.template getPropRead<0>(p);
1205 vd.template getPropWrite<3>(p).sort();
1206 vd2.template getPropWrite<4>(p).sort();
1208 ret &= vd.template getPropRead<3>(p).size() == vd2.template getPropRead<4>(p).size();
1210 for (
size_t i = 0 ; i < vd.template getPropRead<3>(p).size() ; i++)
1211 ret &= vd.template getPropRead<3>(p).get(i).id == vd2.template getPropRead<4>(p).
get(i).id;
1219 BOOST_REQUIRE_EQUAL(ret,
true);
1223 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_verlet_list_no_bottom )
1225 vector_sym_verlet_list_nb<VERLET_MEMFAST(3,float)>();
1226 vector_sym_verlet_list_nb<VERLET_MEMBAL(3,float)>();
1227 vector_sym_verlet_list_nb<VERLET_MEMMW(3,float)>();
1229 vector_sym_verlet_list_nb<VERLET_MEMFAST_INT(3,float)>();
1230 vector_sym_verlet_list_nb<VERLET_MEMBAL_INT(3,float)>();
1231 vector_sym_verlet_list_nb<VERLET_MEMMW_INT(3,float)>();
1236 std::default_random_engine & eg,
1237 std::uniform_real_distribution<float> & ud,
1245 auto key = it.get();
1257 vd.template getPropWrite<0>(key) = 0;
1258 vd.template getPropWrite<1>(key) = 0;
1259 vd.template getPropWrite<2>(key) = key.
getKey() + start;
1261 vd2.template getPropWrite<0>(key) = 0;
1262 vd2.template getPropWrite<1>(key) = 0;
1263 vd2.template getPropWrite<2>(key) = key.
getKey() + start;
1272 vd.template ghost_get<0,2>();
1273 vd2.template ghost_get<0,2>();
1275 auto NN = vd.template getVerlet<VerletList>(r_cut);
1278 while (p_it.isNext())
1280 auto p = p_it.
get();
1284 auto Np = NN.getNNIterator(p.getKey());
1290 if (p.getKey() == q)
1301 float distance = f.
norm();
1305 if (distance < r_cut )
1307 vd.template getPropWrite<0>(p)++;
1308 vd.template getPropWrite<3>(p).add();
1309 vd.template getPropWrite<3>(p).last().xq = xq;
1310 vd.template getPropWrite<3>(p).last().id = vd.template getPropRead<2>(q);
1321 auto NN2 = vd2.template getVerletCrs<VerletList>(r_cut);
1326 while (p_it2.isNext())
1328 auto p = p_it2.get();
1332 auto Np = NN2.template getNNIterator<NO_CHECK>(p);
1349 float distance = f.
norm();
1351 if (distance < r_cut )
1353 vd2.template getPropWrite<1>(p)++;
1354 vd2.template getPropWrite<1>(q)++;
1356 vd2.template getPropWrite<4>(p).add();
1357 vd2.template getPropWrite<4>(q).add();
1359 vd2.template getPropWrite<4>(p).last().xq = xq;
1360 vd2.template getPropWrite<4>(q).last().xq = xp;
1361 vd2.template getPropWrite<4>(p).last().id = vd2.template getPropRead<2>(q);
1362 vd2.template getPropWrite<4>(q).last().id = vd2.template getPropRead<2>(p);
1371 vd2.template ghost_put<add_,1>();
1372 vd2.template ghost_put<merge_,4>();
1381 while (p_it3.isNext())
1383 auto p = p_it3.
get();
1385 ret &= vd2.template getPropRead<1>(p) == vd.template getPropRead<0>(p);
1390 std::cout <<
"ERROR " << vd2.template getPropWrite<1>(p) <<
" " << vd.template getPropWrite<0>(p) <<
" " << xp.
toString() << std::endl;
1393 vd.template getPropWrite<3>(p).sort();
1394 vd2.template getPropWrite<4>(p).sort();
1396 ret &= vd.template getPropRead<3>(p).size() == vd2.template getPropRead<4>(p).size();
1398 for (
size_t i = 0 ; i < vd.template getPropRead<3>(p).size() ; i++)
1399 ret &= vd.template getPropRead<3>(p).get(i).id == vd2.template getPropRead<4>(p).
get(i).id;
1407 BOOST_REQUIRE_EQUAL(ret,
true);
1410 template<
typename VerletList>
1411 void test_csr_verlet_list()
1413 Vcluster & v_cl = create_vcluster();
1423 std::default_random_engine eg;
1424 std::uniform_real_distribution<float> ud(-L,L);
1428 long int big_step = k / 4;
1429 big_step = (big_step == 0)?1:big_step;
1431 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
1432 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list k=" << k );
1437 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
1439 float r_cut = 100.0;
1444 ghost2.setLow(0,0.0);
1445 ghost2.setLow(1,0.0);
1446 ghost2.setLow(2,0.0);
1449 struct point_and_gid
1454 bool operator<(
const struct point_and_gid & pag)
const
1456 return (
id < pag.id);
1467 test_crs_full<VerletList>(vd,vd2,eg,ud,start,r_cut);
1470 template<
typename VerletList>
1471 void test_csr_verlet_list_override()
1473 Vcluster & v_cl = create_vcluster();
1483 std::default_random_engine eg;
1484 std::uniform_real_distribution<float> ud(-L,L);
1488 long int big_step = k / 4;
1489 big_step = (big_step == 0)?1:big_step;
1491 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
1492 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list k=" << k );
1497 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
1499 float r_cut = 100.0;
1504 ghost2.setLow(0,0.0);
1505 ghost2.setLow(1,0.0);
1506 ghost2.setLow(2,0.0);
1509 struct point_and_gid
1514 bool operator<(
const struct point_and_gid & pag)
const
1516 return (
id < pag.id);
1541 test_crs_full<VerletList>(vd,vd2,eg,ud,start,r_cut);
1544 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_crs_verlet_list )
1546 test_csr_verlet_list<VERLET_MEMFAST(3,float)>();
1547 test_csr_verlet_list<VERLET_MEMBAL(3,float)>();
1548 test_csr_verlet_list<VERLET_MEMMW(3,float)>();
1551 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_crs_verlet_list_dec_override )
1553 test_csr_verlet_list_override<VERLET_MEMFAST(3,float)>();
1554 test_csr_verlet_list_override<VERLET_MEMBAL(3,float)>();
1555 test_csr_verlet_list_override<VERLET_MEMMW(3,float)>();
1558 template <
typename VerletList>
1559 void test_vd_symmetric_crs_verlet()
1561 Vcluster & v_cl = create_vcluster();
1573 std::default_random_engine eg;
1574 std::uniform_real_distribution<float> ud(-L,L);
1578 long int big_step = k / 4;
1579 big_step = (big_step == 0)?1:big_step;
1581 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
1582 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list k=" << k );
1587 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
1589 float r_cut = 100.0;
1594 ghost2.setLow(0,0.0);
1595 ghost2.setLow(1,0.0);
1596 ghost2.setLow(2,0.0);
1608 auto key = it.get();
1610 vd.
getPos(key)[0] = ud(eg);
1611 vd.
getPos(key)[1] = ud(eg);
1612 vd.
getPos(key)[2] = ud(eg);
1628 auto NN2 = vd.template getVerletCrs<VerletList>(r_cut);
1634 while (p_it2.isNext())
1636 auto p = p_it2.get();
1637 auto p2 = p_it3.get();
1648 BOOST_REQUIRE_EQUAL(ret,
true);
1651 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_crs_verlet_list_partit )
1653 test_vd_symmetric_crs_verlet<VERLET_MEMFAST(3,float)>();
1654 test_vd_symmetric_crs_verlet<VERLET_MEMBAL(3,float)>();
1655 test_vd_symmetric_crs_verlet<VERLET_MEMMW(3,float)>();
1658 BOOST_AUTO_TEST_CASE( vector_dist_checking_unloaded_processors )
1660 Vcluster & v_cl = create_vcluster();
1670 std::default_random_engine eg;
1671 std::uniform_real_distribution<float> ud(0,L);
1675 long int big_step = k / 4;
1676 big_step = (big_step == 0)?1:big_step;
1678 print_test_v(
"Testing 3D periodic vector symmetric cell-list (unload processors) k=",k);
1679 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list (unload processors) k=" << k );
1684 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
1686 float r_cut = 100.0;
1691 ghost2.setLow(0,0.0);
1692 ghost2.setLow(1,0.0);
1693 ghost2.setLow(2,0.0);
1705 auto key = it.get();
1707 vd.
getPos(key)[0] = ud(eg);
1708 vd.
getPos(key)[1] = ud(eg);
1709 vd.
getPos(key)[2] = ud(eg);
1728 BOOST_REQUIRE_EQUAL(min,0ul);
1743 BOOST_REQUIRE_EQUAL(min,0ul);
1747 BOOST_AUTO_TEST_CASE( vector_dist_cell_list_multi_type )
1749 Vcluster & v_cl = create_vcluster();
1759 std::default_random_engine eg;
1760 std::uniform_real_distribution<float> ud(-L,L);
1764 long int big_step = k / 4;
1765 big_step = (big_step == 0)?1:big_step;
1767 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
1768 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list k=" << k );
1773 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
1775 float r_cut = 100.0;
1789 auto key = it.get();
1791 vd.
getPos(key)[0] = ud(eg);
1792 vd.
getPos(key)[1] = ud(eg);
1793 vd.
getPos(key)[2] = ud(eg);
1807 auto NN = vd.
getCellList<CELL_MEMFAST(3,
float)>(r_cut);
1808 auto NN2 = vd.
getCellList<CELL_MEMBAL(3,
float)>(r_cut);
1809 auto NN3 = vd.
getCellList<CELL_MEMMW(3,
float)>(r_cut);
1813 while (p_it.isNext())
1815 auto p = p_it.
get();
1819 auto Np = NN.getNNIterator(NN.getCell(xp));
1820 auto Np2 = NN2.getNNIterator(NN2.getCell(xp));
1821 auto Np3 = NN3.getNNIterator(NN3.getCell(xp));
1827 ret &= (Np.isNext() == Np2.isNext()) && (Np3.isNext() == Np.isNext());
1833 auto q2 = Np2.get();
1834 auto q3 = Np3.get();
1836 ret &= (q == q2) && (q == q3);
1846 ret &= (Np.isNext() == Np2.isNext()) && (Np.isNext() == Np3.isNext());
1854 BOOST_REQUIRE_EQUAL(ret,
true);
1859 BOOST_AUTO_TEST_CASE( vector_dist_particle_NN_MP_iteration )
1861 Vcluster & v_cl = create_vcluster();
1870 std::default_random_engine eg;
1871 eg.seed(v_cl.
rank()*4533);
1872 std::uniform_real_distribution<float> ud(-L,L);
1876 long int big_step = k / 4;
1877 big_step = (big_step == 0)?1:big_step;
1879 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
1880 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list k=" << k );
1885 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
1887 float r_cut = 100.0;
1893 struct point_and_gid
1898 bool operator<(
const struct point_and_gid & pag)
const
1900 return (
id < pag.id);
1914 auto key = it.get();
1937 while (p_it.isNext())
1939 auto p = p_it.
get();
1943 auto Np = NN.getNNIterator(NN.getCell(xp));
1949 if (p.getKey() == q)
1960 float distance = f.
norm();
1964 if (distance < r_cut )
1988 while (it2.isNext())
1992 if (p.getKey() % 4 == 0)
1994 phases.get(0).add();
1995 phases.get(0).getLastPos()[0] = vd.
getPos(p)[0];
1996 phases.get(0).getLastPos()[1] = vd.
getPos(p)[1];
1997 phases.get(0).getLastPos()[2] = vd.
getPos(p)[2];
1999 phases.get(0).template getLastProp<2>() = vd.template getProp<2>(p);
2001 else if (p.getKey() % 4 == 1)
2003 phases.get(1).add();
2004 phases.get(1).getLastPos()[0] = vd.
getPos(p)[0];
2005 phases.get(1).getLastPos()[1] = vd.
getPos(p)[1];
2006 phases.get(1).getLastPos()[2] = vd.
getPos(p)[2];
2008 phases.get(1).template getLastProp<2>() = vd.template getProp<2>(p);
2010 else if (p.getKey() % 4 == 2)
2012 phases.get(2).add();
2013 phases.get(2).getLastPos()[0] = vd.
getPos(p)[0];
2014 phases.get(2).getLastPos()[1] = vd.
getPos(p)[1];
2015 phases.get(2).getLastPos()[2] = vd.
getPos(p)[2];
2017 phases.get(2).template getLastProp<2>() = vd.template getProp<2>(p);
2021 phases.get(3).add();
2022 phases.get(3).getLastPos()[0] = vd.
getPos(p)[0];
2023 phases.get(3).getLastPos()[1] = vd.
getPos(p)[1];
2024 phases.get(3).getLastPos()[2] = vd.
getPos(p)[2];
2026 phases.get(3).template getLastProp<2>() = vd.template getProp<2>(p);
2034 for (
size_t i = 0 ; i < phases.
size() ; i++)
2036 phases.get(i).ghost_get<0,2>();
2041 for (
size_t i = 0 ; i < phases.
size() ; i++)
2043 NN_ptr.add(phases.get(i).getCellListSym(r_cut));
2048 for (
size_t i = 0 ; i < phases.
size() ; i++)
2050 for (
size_t j = 0 ; j < phases.
size() ; j++)
2052 auto p_it2 = phases.get(i).getDomainIterator();
2054 while (p_it2.isNext())
2056 auto p = p_it2.get();
2060 auto Np = NN_ptr.get(j).getNNIteratorSymMP<NO_CHECK>(NN_ptr.get(j).getCell(xp),p.getKey(),phases.get(i).getPosVector(),phases.get(j).getPosVector());
2066 if (p.getKey() == q && i == j)
2077 float distance = f.
norm();
2081 if (distance < r_cut )
2083 phases.get(i).getPropWrite<1>(p)++;
2084 phases.get(j).getPropWrite<1>(q)++;
2086 phases.get(i).getPropWrite<4>(p).add();
2087 phases.get(j).getPropWrite<4>(q).add();
2089 phases.get(i).getPropWrite<4>(p).last().xq = xq;
2090 phases.get(j).getPropWrite<4>(q).last().xq = xp;
2091 phases.get(i).getPropWrite<4>(p).last().id = phases.get(j).getProp<2>(q);
2092 phases.get(j).getPropWrite<4>(q).last().id = phases.get(i).getProp<2>(p);
2103 for (
size_t i = 0 ; i < phases.
size() ; i++)
2105 phases.get(i).ghost_put<
add_,1>();
2106 phases.get(i).ghost_put<
merge_,4>();
2112 while (p_it3.isNext())
2114 auto p = p_it3.
get();
2118 if (p.getKey() % 4 == 0)
2120 else if (p.getKey() % 4 == 1)
2122 else if (p.getKey() % 4 == 2)
2127 size_t pah = p.
getKey()/4;
2128 ret &= phases.get(ph).getPropRead<1>(pah) == vd.
getPropRead<0>(p);
2131 phases.get(ph).getPropRead<4>(pah).sort();
2133 ret &= vd.
getPropRead<3>(p).size() == phases.get(ph).getPropRead<4>(pah).size();
2135 for (
size_t i = 0 ; i < vd.
getPropRead<3>(p).size() ; i++)
2136 ret &= vd.
getPropRead<3>(p).get(i).id == phases.get(ph).getPropRead<4>(pah).
get(i).id;
2140 std::cout <<
"Error on particle: " << vd.
getPropRead<2>(p) <<
" " << v_cl.
rank() << std::endl;
2142 std::cout << vd.
getPropRead<3>(p).size() <<
" " << phases.get(ph).getPropRead<4>(pah).size() <<
" " << v_cl.
rank() << std::endl;
2144 for (
size_t i = 0 ; i < vd.
getPropRead<3>(p).size() ; i++)
2145 std::cout << vd.
getPropRead<3>(p).get(i).id <<
" " << phases.get(ph).getPropRead<4>(pah).
get(i).id <<
" " << v_cl.
rank() << std::endl;
2147 std::cout << phases.get(ph).getPropRead<1>(pah) <<
" A " << vd.
getPropRead<0>(p) << std::endl;
2155 BOOST_REQUIRE_EQUAL(ret,
true);
auto getProp(vect_dist_key_dx vec_key) -> decltype(v_prp.template get< id >(vec_key.getKey()))
Get the property of an element.
auto getPosRead(vect_dist_key_dx vec_key) const -> decltype(v_pos.template get< 0 >(vec_key.getKey()))
Get the position of an element.
openfpm::vector_key_iterator_seq< typename vrl::Mem_type_type::loc_index > getParticleIteratorCRS(vrl &NN)
Get a special particle iterator able to iterate across particles using symmetric crossing scheme...
size_t getProcessUnitID()
Get the process unit id.
void execute()
Execute all the requests.
std::string toString() const
Return the string with the point coordinate.
This structure define the operation add to use with copy general.
auto getPos(vect_dist_key_dx vec_key) -> decltype(v_pos.template get< 0 >(vec_key.getKey()))
Get the position of an element.
size_t rank()
Get the process unit id.
size_t size_local_with_ghost() const
return the local size of the vector
CellL getCellList(St r_cut, bool no_se3=false)
Construct a cell list starting from the stored particles.
void setHigh(int i, T val)
set the high interval of the box
This structure define the operation add to use with copy general.
Decomposition & getDecomposition()
Get the decomposition.
This class implement the point shape in an N-dimensional space.
Grid key for a distributed grid.
Implementation of VCluster class.
auto getPropRead(vect_dist_key_dx vec_key) const -> decltype(v_prp.template get< id >(vec_key.getKey()))
Get the property of an element.
size_t init_size_accum(size_t np)
It return the number of particles contained by the previous processors.
size_t size_local() const
return the local size of the vector
const T & get(size_t i) const
Get coordinate.
void setLow(int i, T val)
set the low interval of the box
void map(size_t opt=NONE)
It move all the particles that does not belong to the local processor to the respective processor...
void ghost_get(size_t opt=WITH_POSITION)
It synchronize the properties and position of the ghost particles.
size_t getKey() const
Get the key.
This class represent an N-dimensional box.
auto getPosWrite(vect_dist_key_dx vec_key) -> decltype(v_pos.template get< 0 >(vec_key.getKey()))
Get the position of an element.
T norm()
norm of the vector
This class is a trick to indicate the compiler a specific specialization pattern. ...
ParticleItCRS_Cells< dim, cli > getParticleIteratorCRS_Cell(cli &NN)
Get a special particle iterator able to iterate across particles using symmetric crossing scheme...
vector_dist_iterator getIterator()
Get an iterator that traverse domain and ghost particles.
vector_dist_iterator getDomainIterator() const
Get an iterator that traverse the particles in the domain.
void min(T &num)
Get the minimum number across all processors (or reduction with insinity norm)
vect_dist_key_dx get()
Get the actual key.
aggregate of properties, from a list of object if create a struct that follow the OPENFPM native stru...
auto getPropWrite(vect_dist_key_dx vec_key) -> decltype(v_prp.template get< id >(vec_key.getKey()))
Get the property of an element.
Implementation of 1-D std::vector like structure.
size_t getProcessingUnits()
Get the total number of processors.