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);
28 void test_reorder_sfc(reorder_opt opt)
38 std::default_random_engine eg;
39 std::uniform_real_distribution<float> ud(0.0f, 1.0f);
41 #ifdef TEST_COVERAGE_MODE
47 long int big_step = k / 4;
48 big_step = (big_step == 0)?1:big_step;
50 print_test_v(
"Testing 2D vector with sfc curve reordering k<=",k);
53 for ( ; k >= 2 ; k-= decrement(k,big_step) )
55 BOOST_TEST_CHECKPOINT(
"Testing 2D vector with sfc curve reordering k=" << k );
60 size_t bc[2]={NON_PERIODIC,NON_PERIODIC};
64 auto it = vd.getIterator();
70 vd.getPos(key)[0] = ud(eg);
71 vd.getPos(key)[1] = ud(eg);
82 auto NN1 = vd.getCellList(0.01, CL_NON_SYMMETRIC | CL_LINEAR_CELL_KEYS,
true);
91 auto NN2 = vd.getCellList(0.01, CL_NON_SYMMETRIC | CL_LINEAR_CELL_KEYS,
true);
94 for (
size_t i = 0 ; i < NN1.getGrid().size() ; i++)
96 size_t n1 = NN1.getNelements(i);
97 size_t n2 = NN2.getNelements(i);
99 BOOST_REQUIRE_EQUAL(n1,n2);
106 void test_reorder_cl()
116 std::default_random_engine eg;
117 std::uniform_real_distribution<float> ud(0.0f, 1.0f);
119 #ifdef TEST_COVERAGE_MODE
125 long int big_step = k / 4;
126 big_step = (big_step == 0)?1:big_step;
128 print_test_v(
"Testing 2D vector with sfc curve reordering k<=",k);
131 for ( ; k >= 2 ; k-= decrement(k,big_step) )
133 BOOST_TEST_CHECKPOINT(
"Testing 2D vector with sfc curve reordering k=" << k );
138 size_t bc[2]={NON_PERIODIC,NON_PERIODIC};
142 auto it = vd.getIterator();
148 vd.getPos(key)[0] = ud(eg);
149 vd.getPos(key)[1] = ud(eg);
160 auto NN1 = vd.getCellList(0.01, CL_NON_SYMMETRIC | CL_LINEAR_CELL_KEYS,
true);
163 vd.reorder_rcut(0.01);
166 auto NN2 = vd.getCellList(0.01, CL_NON_SYMMETRIC | CL_LINEAR_CELL_KEYS,
true);
169 for (
size_t i = 0 ; i < NN1.getGrid().size() ; i++)
171 size_t n1 = NN1.getNelements(i);
172 size_t n2 = NN2.getNelements(i);
174 BOOST_REQUIRE_EQUAL(n1,n2);
179 BOOST_AUTO_TEST_SUITE( vector_dist_cell_list_test_suite )
181 BOOST_AUTO_TEST_CASE( vector_dist_reorder_2d_test )
183 test_reorder_sfc(reorder_opt::HILBERT);
184 test_reorder_sfc(reorder_opt::LINEAR);
187 BOOST_AUTO_TEST_CASE( vector_dist_reorder_cl_test )
192 BOOST_AUTO_TEST_CASE( vector_dist_cl_random_vs_hilb_forces_test )
202 const size_t dim = 3;
206 size_t cl_k_start = 10000;
208 size_t cl_k_min = 1000;
210 double ghost_part = 0.05;
215 for (
size_t r = 0; r < cl_r_cutoff.size(); r++ )
218 float r_cut = cl_r_cutoff.get(r);
223 std::string str(
"Testing " + std::to_string(dim) +
"D vector's forces (random vs hilb celllist) k<=");
228 for (
size_t k_int = k ; k_int >= cl_k_min ; k_int/=2 )
230 BOOST_TEST_CHECKPOINT(
"Testing " << dim <<
"D vector's forces (random vs hilb celllist) k<=" << k_int );
234 for (
size_t i = 0; i < dim; i++)
243 for (
size_t i = 0; i < dim; i++)
251 vd_initialize_double<dim>(vd, vd2, v_cl, k_int);
258 auto NN = vd.getCellList(r_cut);
262 calc_forces<dim>(NN,vd,r_cut);
266 auto NN_hilb = vd2.getCellList_hilb(r_cut);
269 calc_forces_hilb<dim>(NN_hilb,vd2,r_cut);
274 for (
size_t i = 0 ; i < dim ; i++) {avg.
get(i) = 0.0;}
276 auto it_v2 = vd.getIterator();
277 while (it_v2.isNext())
282 for (
size_t i = 0; i < dim; i++)
283 {avg.
get(i) += fabs(vd.getProp<0>(key)[i]);}
289 for (
size_t i = 0 ; i < dim ; i++) {avg.
get(i) /= count;}
291 auto it_v = vd.getIterator();
292 while (it_v.isNext())
297 for (
size_t i = 0; i < dim; i++)
299 auto a1 = vd.getProp<0>(key)[i];
300 auto a2 = vd2.getProp<0>(key)[i];
305 per = fabs(0.1*avg.
get(i)/a1);
307 BOOST_REQUIRE_CLOSE((
float)a1,(
float)a2,per);
316 BOOST_AUTO_TEST_CASE( vector_dist_cl_random_vs_reorder_forces_test )
326 const size_t dim = 3;
330 size_t cl_k_start = 10000;
332 size_t cl_k_min = 1000;
334 double ghost_part = 0.01;
339 for (
size_t r = 0; r < cl_r_cutoff.size(); r++ )
342 float r_cut = cl_r_cutoff.get(r);
347 std::string str(
"Testing " + std::to_string(dim) +
"D vector's forces (random vs reorder) k<=");
352 for (
size_t k_int = k ; k_int >= cl_k_min ; k_int/=2 )
354 BOOST_TEST_CHECKPOINT(
"Testing " << dim <<
"D vector's forces (random vs reorder) k<=" << k_int );
358 for (
size_t i = 0; i < dim; i++)
367 for (
size_t i = 0; i < dim; i++)
373 vd_initialize<dim,decltype(vd)>(vd, v_cl);
379 auto NN1 = vd.getCellList(r_cut);
383 calc_forces<dim>(NN1,vd,r_cut);
391 auto NN2 = vd.getCellList(r_cut);
394 calc_forces<dim,1>(NN2,vd,r_cut);
399 for (
size_t i = 0 ; i < dim ; i++) {avg.
get(i) = 0.0;}
401 auto it_v2 = vd.getIterator();
402 while (it_v2.isNext())
407 for (
size_t i = 0; i < dim; i++)
408 avg.
get(i) += fabs(vd.getProp<0>(key)[i]);
414 for (
size_t i = 0 ; i < dim ; i++) {avg.
get(i) /= count;}
417 auto it_v = vd.getDomainIterator();
419 while (it_v.isNext())
424 for (
size_t i = 0; i < dim; i++)
426 float a1 = vd.getProp<0>(key)[i];
427 float a2 = vd.getProp<1>(key)[i];
432 per = fabs(0.1*avg.
get(i)/a1);
434 BOOST_REQUIRE_CLOSE(a1,a2,per);
443 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_cell_list )
455 std::default_random_engine eg;
456 std::uniform_real_distribution<float> ud(-L,L);
460 long int big_step = k / 4;
461 big_step = (big_step == 0)?1:big_step;
463 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
464 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list k=" << k );
469 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
484 return (
id < pag.id);
492 size_t start = vd.init_size_accum(k);
494 auto it = vd.getIterator();
500 vd.getPosWrite(key)[0] = ud(eg);
501 vd.getPosWrite(key)[1] = ud(eg);
502 vd.getPosWrite(key)[2] = ud(eg);
506 vd.getPropWrite<0>(key) = 0;
507 vd.getPropWrite<1>(key) = 0;
508 vd.getPropWrite<2>(key) = key.
getKey() + start;
518 auto NN = vd.getCellList(r_cut);
519 auto p_it = vd.getDomainIterator();
521 while (p_it.isNext())
527 auto Np = NN.getNNIteratorBox(NN.getCell(xp));
544 float distance = f.norm();
548 if (distance < r_cut )
550 vd.getPropWrite<0>(p)++;
551 vd.getPropWrite<3>(p).add();
552 vd.getPropWrite<3>(p).last().xq = xq;
553 vd.getPropWrite<3>(p).last().id = vd.getPropWrite<2>(q);
562 auto NN2 = vd.getCellListSym(r_cut);
564 auto p_it2 = vd.getDomainIterator();
566 while (p_it2.isNext())
568 auto p = p_it2.get();
572 auto Np = NN2.getNNIteratorBoxSym(NN2.getCell(xp),p.getKey(),vd.getPosVector());
589 float distance = f.norm();
593 if (distance < r_cut )
595 vd.getPropWrite<1>(p)++;
596 vd.getPropWrite<1>(q)++;
598 vd.getPropWrite<4>(p).add();
599 vd.getPropWrite<4>(q).add();
601 vd.getPropWrite<4>(p).last().xq = xq;
602 vd.getPropWrite<4>(q).last().xq = xp;
603 vd.getPropWrite<4>(p).last().id = vd.getProp<2>(q);
604 vd.getPropWrite<4>(q).last().id = vd.getProp<2>(p);
613 vd.ghost_put<
add_,1>();
616 auto p_it3 = vd.getDomainIterator();
619 while (p_it3.isNext())
621 auto p = p_it3.get();
623 ret &= vd.getPropRead<1>(p) == vd.getPropRead<0>(p);
625 vd.getPropWrite<3>(p).sort();
626 vd.getPropWrite<4>(p).sort();
628 ret &= vd.getPropRead<3>(p).size() == vd.getPropRead<4>(p).size();
630 for (
size_t i = 0 ; i < vd.getPropRead<3>(p).size() ; i++)
631 ret &= vd.getPropRead<3>(p).get(i).id == vd.getPropRead<4>(p).get(i).id;
635 std::cout << vd.getPropRead<3>(p).size() <<
" " << vd.getPropRead<4>(p).size() << std::endl;
637 for (
size_t i = 0 ; i < vd.getPropRead<3>(p).size() ; i++)
638 std::cout << vd.getPropRead<3>(p).get(i).id <<
" " << vd.getPropRead<4>(p).get(i).id << std::endl;
640 std::cout << vd.getPropRead<1>(p) <<
" A " << vd.getPropRead<0>(p) << std::endl;
648 BOOST_REQUIRE_EQUAL(ret,
true);
651 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_local_cell_list )
663 std::default_random_engine eg;
664 std::uniform_real_distribution<float> ud(-L,L);
668 long int big_step = k / 4;
669 big_step = (big_step == 0)?1:big_step;
671 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
672 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list k=" << k );
677 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
692 return (
id < pag.id);
700 size_t start = vd.init_size_accum(k);
702 auto it = vd.getIterator();
708 vd.getPosWrite(key)[0] = ud(eg);
709 vd.getPosWrite(key)[1] = ud(eg);
710 vd.getPosWrite(key)[2] = ud(eg);
714 vd.getPropWrite<0>(key) = 0;
715 vd.getPropWrite<1>(key) = 0;
716 vd.getPropWrite<2>(key) = key.
getKey() + start;
727 auto NN = vd.getCellList(r_cut);
728 auto p_it = vd.getDomainIterator();
730 while (p_it.isNext())
736 auto Np = NN.getNNIteratorBox(NN.getCell(xp));
753 float distance = f.norm();
757 if (distance < r_cut )
759 vd.getPropWrite<0>(p)++;
760 vd.getPropWrite<3>(p).add();
761 vd.getPropWrite<3>(p).last().xq = xq;
762 vd.getPropWrite<3>(p).last().id = vd.getPropWrite<2>(q);
771 auto NN2 = vd.getCellListSymLocal(r_cut);
773 auto p_it2 = vd.getDomainIterator();
775 while (p_it2.isNext())
777 auto p = p_it2.get();
781 auto Np = NN2.getNNIteratorBoxSymLocal(NN2.getCell(xp),p.getKey(),vd.getPosVector());
798 float distance = f.norm();
802 if (distance < r_cut )
804 vd.getPropWrite<1>(p)++;
805 vd.getPropWrite<1>(q)++;
807 vd.getPropWrite<4>(p).add();
808 vd.getPropWrite<4>(q).add();
810 vd.getPropWrite<4>(p).last().xq = xq;
811 vd.getPropWrite<4>(q).last().xq = xp;
812 vd.getPropWrite<4>(p).last().id = vd.getProp<2>(q);
813 vd.getPropWrite<4>(q).last().id = vd.getProp<2>(p);
823 auto p_it3 = vd.getDomainIterator();
826 while (p_it3.isNext())
828 auto p = p_it3.get();
830 ret &= vd.getPropRead<1>(p) == vd.getPropRead<0>(p);
832 vd.getPropWrite<3>(p).sort();
833 vd.getPropWrite<4>(p).sort();
835 ret &= vd.getPropRead<3>(p).size() == vd.getPropRead<4>(p).size();
837 for (
size_t i = 0 ; i < vd.getPropRead<3>(p).size() ; i++)
838 ret &= vd.getPropRead<3>(p).get(i).id == vd.getPropRead<4>(p).get(i).id;
842 std::cout << vd.getPropRead<3>(p).size() <<
" " << vd.getPropRead<4>(p).size() << std::endl;
844 for (
size_t i = 0 ; i < vd.getPropRead<3>(p).size() ; i++)
845 std::cout << vd.getPropRead<3>(p).get(i).id <<
" " << vd.getPropRead<4>(p).get(i).id << std::endl;
847 std::cout << vd.getPropRead<1>(p) <<
" A " << vd.getPropRead<0>(p) << std::endl;
855 BOOST_REQUIRE_EQUAL(ret,
true);
858 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_crs_cell_list )
870 std::uniform_real_distribution<float> ud(-L,L);
874 long int big_step = k / 4;
875 big_step = (big_step == 0)?1:big_step;
877 print_test_v(
"Testing 3D periodic vector symmetric crs cell-list k=",k);
878 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric crs cell-list k=" << k );
883 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
890 ghost2.setLow(0,0.0);
891 ghost2.setLow(1,0.0);
892 ghost2.setLow(2,0.0);
902 return (
id < pag.id);
911 size_t start = vd.init_size_accum(k);
913 auto it = vd.getIterator();
919 vd.getPosWrite(key)[0] = ud(eg);
920 vd.getPosWrite(key)[1] = ud(eg);
921 vd.getPosWrite(key)[2] = ud(eg);
923 vd2.getPosWrite(key)[0] = vd.getPosRead(key)[0];
924 vd2.getPosWrite(key)[1] = vd.getPosRead(key)[1];
925 vd2.getPosWrite(key)[2] = vd.getPosRead(key)[2];
929 vd.getPropWrite<0>(key) = 0;
930 vd.getPropWrite<1>(key) = 0;
931 vd.getPropWrite<2>(key) = key.
getKey() + start;
933 vd2.getPropWrite<0>(key) = 0;
934 vd2.getPropWrite<1>(key) = 0;
935 vd2.getPropWrite<2>(key) = key.
getKey() + start;
945 vd2.ghost_get<0,2>();
947 auto NN = vd.getCellList(r_cut);
948 auto p_it = vd.getDomainIterator();
950 while (p_it.isNext())
956 auto Np = NN.getNNIteratorBox(NN.getCell(xp));
973 float distance = f.norm();
977 if (distance < r_cut )
979 vd.getPropWrite<0>(p)++;
980 vd.getPropWrite<3>(p).add();
981 vd.getPropWrite<3>(p).last().xq = xq;
982 vd.getPropWrite<3>(p).last().id = vd.getPropRead<2>(q);
993 auto NN2 = vd2.getCellListSym(r_cut);
997 auto p_it2 = vd2.getParticleIteratorCRS_Cell(NN2);
1000 while (p_it2.isNext())
1002 auto p = p_it2.get();
1006 auto Np = p_it2.getNNIteratorCSR(vd2.getPosVector());
1023 float distance = f.norm();
1027 if (distance < r_cut )
1029 vd2.getPropWrite<1>(p)++;
1030 vd2.getPropWrite<1>(q)++;
1032 vd2.getPropWrite<4>(p).add();
1033 vd2.getPropWrite<4>(q).add();
1035 vd2.getPropWrite<4>(p).last().xq = xq;
1036 vd2.getPropWrite<4>(q).last().xq = xp;
1037 vd2.getPropWrite<4>(p).last().id = vd2.getPropRead<2>(q);
1038 vd2.getPropWrite<4>(q).last().id = vd2.getPropRead<2>(p);
1047 vd2.ghost_put<
add_,1>(NO_CHANGE_ELEMENTS);
1048 vd2.ghost_put<
merge_,4>();
1051 vd2.getDomainIterator();
1054 auto p_it3 = vd.getDomainIterator();
1057 while (p_it3.isNext())
1059 auto p = p_it3.get();
1061 ret &= vd2.getPropRead<1>(p) == vd.getPropRead<0>(p);
1064 vd.getPropWrite<3>(p).sort();
1065 vd2.getPropWrite<4>(p).sort();
1067 ret &= vd.getPropRead<3>(p).size() == vd2.getPropRead<4>(p).size();
1069 for (
size_t i = 0 ; i < vd.getPropRead<3>(p).size() ; i++)
1070 ret &= vd.getPropRead<3>(p).get(i).id == vd2.getPropRead<4>(p).get(i).id;
1078 BOOST_REQUIRE_EQUAL(ret,
true);
1081 template<
template <
unsigned int>
class VerletList>
1082 void test_vd_symmetric_verlet_list()
1094 std::default_random_engine eg;
1095 std::uniform_real_distribution<float> ud(-L,L);
1099 long int big_step = k / 4;
1100 big_step = (big_step == 0)?1:big_step;
1102 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
1103 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric verlet-list k=" << k );
1108 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
1110 float r_cut = 100.0;
1123 return (
id < pag.id);
1131 size_t start = vd.init_size_accum(k);
1133 auto it = vd.getIterator();
1137 auto key = it.get();
1139 vd.getPosWrite(key)[0] = ud(eg);
1140 vd.getPosWrite(key)[1] = ud(eg);
1141 vd.getPosWrite(key)[2] = ud(eg);
1145 vd.template getPropWrite<0>(key) = 0;
1146 vd.template getPropWrite<1>(key) = 0;
1147 vd.template getPropWrite<2>(key) = key.
getKey() + start;
1155 vd.template ghost_get<0,2>();
1157 auto NN = vd.template getVerlet<VL_NON_SYMMETRIC, VerletList<VL_NON_SYMMETRIC>>(r_cut);
1158 auto p_it = vd.getDomainIterator();
1160 while (p_it.isNext())
1162 auto p = p_it.get();
1166 auto Np = NN.getNNIterator(p.getKey());
1172 if (p.getKey() == q)
1183 float distance = f.norm();
1187 if (distance < r_cut )
1189 vd.template getPropWrite<0>(p)++;
1190 vd.template getPropWrite<3>(p).add();
1191 vd.template getPropWrite<3>(p).last().xq = xq;
1192 vd.template getPropWrite<3>(p).last().id = vd.template getPropRead<2>(q);
1203 auto NN2 = vd.template getVerletSym<VerletList<VL_SYMMETRIC>>(r_cut);
1205 auto p_it2 = vd.getDomainIterator();
1207 while (p_it2.isNext())
1209 auto p = p_it2.get();
1213 auto Np = NN2.getNNIterator(p.getKey());
1219 if (p.getKey() == q)
1230 float distance = f.norm();
1234 if (distance < r_cut )
1236 vd.template getPropWrite<1>(p)++;
1237 vd.template getPropWrite<1>(q)++;
1239 vd.template getPropWrite<4>(p).add();
1240 vd.template getPropWrite<4>(q).add();
1242 vd.template getPropWrite<4>(p).last().xq = xq;
1243 vd.template getPropWrite<4>(q).last().xq = xp;
1244 vd.template getPropWrite<4>(p).last().id = vd.template getPropRead<2>(q);
1245 vd.template getPropWrite<4>(q).last().id = vd.template getPropRead<2>(p);
1254 vd.template ghost_put<add_,1>();
1255 vd.template ghost_put<merge_,4>();
1257 auto p_it3 = vd.getDomainIterator();
1260 while (p_it3.isNext())
1262 auto p = p_it3.get();
1264 ret &= vd.template getPropRead<1>(p) == vd.template getPropRead<0>(p);
1266 vd.template getPropWrite<3>(p).sort();
1267 vd.template getPropWrite<4>(p).sort();
1269 ret &= vd.template getPropRead<3>(p).size() == vd.template getPropRead<4>(p).size();
1271 for (
size_t i = 0 ; i < vd.template getPropRead<3>(p).size() ; i++)
1272 ret &= vd.template getPropRead<3>(p).get(i).id == vd.template getPropRead<4>(p).get(i).id;
1280 BOOST_REQUIRE_EQUAL(ret,
true);
1283 template<
template <
unsigned int>
class VerletList>
1284 void test_vd_adaptive_verlet_list()
1292 float r_cut = 100.0;
1297 std::default_random_engine eg;
1298 std::uniform_real_distribution<float> ud(-L,L);
1299 std::uniform_real_distribution<float> rCutDistr(0,r_cut);
1303 print_test_v(
"Testing 3D periodic vector adaptive verlet-list k=",k);
1304 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector adaptive verlet-list k=" << k );
1309 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
1322 return (
id < pag.id);
1330 size_t start = vd.init_size_accum(k);
1332 auto it = vd.getIterator();
1336 auto key = it.get();
1338 vd.getPosWrite(key)[0] = ud(eg);
1339 vd.getPosWrite(key)[1] = ud(eg);
1340 vd.getPosWrite(key)[2] = ud(eg);
1344 vd.template getPropWrite<1>(key) = 0;
1345 vd.template getPropWrite<2>(key) = 0;
1346 vd.template getPropWrite<3>(key) = key.
getKey() + start;
1348 vd.template getPropWrite<0>(key) = rCutDistr(eg);
1356 vd.template ghost_get<1,3>();
1358 auto NN = vd.getVerletAdaptRCut();
1359 auto p_it = vd.getDomainIterator();
1361 while (p_it.isNext())
1363 auto p = p_it.get();
1367 auto Np = NN.getNNIterator(p.getKey());
1372 float rCutP = vd.template getPropRead<0>(p);
1374 if (p.getKey() == q)
1385 float distance = f.norm();
1389 if (distance < rCutP )
1391 vd.template getPropWrite<1>(p)++;
1392 vd.template getPropWrite<4>(p).add();
1393 vd.template getPropWrite<4>(p).last().xq = xq;
1394 vd.template getPropWrite<4>(p).last().id = vd.template getPropRead<3>(q);
1403 auto p_it2 = vd.getDomainIterator();
1405 while (p_it2.isNext())
1407 auto p = p_it2.get();
1411 auto p_it3 = vd.getDomainAndGhostIterator();
1412 float rCutP = vd.template getPropRead<0>(p);
1414 while (p_it3.isNext())
1416 auto q = p_it3.get().getKey();
1418 if (p.getKey() == q)
1429 float distance = f.norm();
1433 if (distance < rCutP )
1435 vd.template getPropWrite<2>(p)++;
1437 vd.template getPropWrite<5>(p).add();
1439 vd.template getPropWrite<5>(p).last().xq = xq;
1440 vd.template getPropWrite<5>(p).last().id = vd.template getPropRead<3>(q);
1449 vd.template ghost_put<add_,2>();
1450 vd.template ghost_put<merge_,5>();
1452 auto p_it4 = vd.getDomainIterator();
1455 while (p_it4.isNext())
1457 auto p = p_it4.get();
1459 ret &= vd.template getPropRead<2>(p) == vd.template getPropRead<1>(p);
1461 vd.template getPropWrite<4>(p).sort();
1462 vd.template getPropWrite<5>(p).sort();
1464 ret &= vd.template getPropRead<4>(p).size() == vd.template getPropRead<5>(p).size();
1465 ret &= fabs(vd.template getPropRead<0>(p) - NN.getRCuts(p)) < 0.001;
1467 for (
size_t i = 0 ; i < vd.template getPropRead<4>(p).size() ; i++) {
1468 ret &= vd.template getPropRead<4>(p).get(i).id == vd.template getPropRead<5>(p).get(i).id;
1469 auto xq = vd.template getPropRead<4>(p).
get(i).xq;
1478 BOOST_REQUIRE_EQUAL(ret,
true);
1481 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_verlet_list )
1483 test_vd_symmetric_verlet_list<VERLET_MEMFAST_OPT>();
1484 test_vd_symmetric_verlet_list<VERLET_MEMBAL_OPT>();
1485 test_vd_symmetric_verlet_list<VERLET_MEMMW_OPT>();
1488 BOOST_AUTO_TEST_CASE( vector_dist_adaptive_verlet_list )
1490 test_vd_adaptive_verlet_list<VERLET_MEMFAST_OPT>();
1491 test_vd_adaptive_verlet_list<VERLET_MEMBAL_OPT>();
1492 test_vd_adaptive_verlet_list<VERLET_MEMMW_OPT>();
1495 template<
template <
unsigned int>
class VerletList>
1496 void vector_sym_verlet_list_nb()
1508 std::default_random_engine eg;
1509 std::uniform_real_distribution<float> ud(-L,L);
1513 long int big_step = k / 4;
1514 big_step = (big_step == 0)?1:big_step;
1516 print_test_v(
"Testing 3D periodic vector symmetric cell-list no bottom k=",k);
1517 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list no bottom k=" << k );
1522 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
1524 float r_cut = 100.0;
1529 ghost2.setLow(2,0.0);
1539 return (
id < pag.id);
1546 for (
size_t s = 0 ; s < 8 ; s++)
1552 size_t start = vd.init_size_accum(k);
1554 auto it = vd.getIterator();
1558 auto key = it.get();
1560 vd.getPosWrite(key)[0] = ud(eg);
1561 vd.getPosWrite(key)[1] = ud(eg);
1562 vd.getPosWrite(key)[2] = ud(eg);
1564 vd2.getPosWrite(key)[0] = vd.getPosRead(key)[0];
1565 vd2.getPosWrite(key)[1] = vd.getPosRead(key)[1];
1566 vd2.getPosWrite(key)[2] = vd.getPosRead(key)[2];
1570 vd.template getPropWrite<0>(key) = 0;
1571 vd.template getPropWrite<1>(key) = 0;
1572 vd.template getPropWrite<2>(key) = key.
getKey() + start;
1574 vd2.template getPropWrite<0>(key) = 0;
1575 vd2.template getPropWrite<1>(key) = 0;
1576 vd2.template getPropWrite<2>(key) = key.
getKey() + start;
1585 vd.template ghost_get<0,2>();
1586 vd2.template ghost_get<0,2>();
1588 auto NN = vd.template getVerlet<VL_NON_SYMMETRIC, VerletList<VL_NON_SYMMETRIC>>(r_cut);
1589 auto p_it = vd.getDomainIterator();
1591 while (p_it.isNext())
1593 auto p = p_it.get();
1597 auto Np = NN.getNNIterator(p.getKey());
1603 if (p.getKey() == q)
1614 float distance = f.norm();
1618 if (distance < r_cut )
1620 vd.template getPropWrite<0>(p)++;
1621 vd.template getPropWrite<3>(p).add();
1622 vd.template getPropWrite<3>(p).last().xq = xq;
1623 vd.template getPropWrite<3>(p).last().id = vd.template getPropRead<2>(q);
1634 auto NN2 = vd2.template getVerletSym<VerletList<VL_SYMMETRIC>>(r_cut);
1636 auto p_it2 = vd2.getDomainIterator();
1638 while (p_it2.isNext())
1640 auto p = p_it2.get();
1644 auto Np = NN2.getNNIterator(p.getKey());
1650 if (p.getKey() == q)
1661 float distance = f.norm();
1665 if (distance < r_cut )
1667 vd2.template getPropWrite<1>(p)++;
1668 vd2.template getPropWrite<1>(q)++;
1670 vd2.template getPropWrite<4>(p).add();
1671 vd2.template getPropWrite<4>(q).add();
1673 vd2.template getPropWrite<4>(p).last().xq = xq;
1674 vd2.template getPropWrite<4>(q).last().xq = xp;
1675 vd2.template getPropWrite<4>(p).last().id = vd2.template getPropRead<2>(q);
1676 vd2.template getPropWrite<4>(q).last().id = vd2.template getPropRead<2>(p);
1686 vd2.template ghost_put<add_,1>();
1687 vd2.template ghost_put<merge_,4>();
1690 vd2.getDomainIterator();
1693 auto p_it3 = vd.getDomainIterator();
1696 while (p_it3.isNext())
1698 auto p = p_it3.get();
1700 ret &= vd2.template getPropRead<1>(p) == vd.template getPropRead<0>(p);
1702 vd.template getPropWrite<3>(p).sort();
1703 vd2.template getPropWrite<4>(p).sort();
1705 ret &= vd.template getPropRead<3>(p).size() == vd2.template getPropRead<4>(p).size();
1707 for (
size_t i = 0 ; i < vd.template getPropRead<3>(p).size() ; i++)
1708 ret &= vd.template getPropRead<3>(p).get(i).id == vd2.template getPropRead<4>(p).get(i).id;
1716 BOOST_REQUIRE_EQUAL(ret,
true);
1720 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_verlet_list_no_bottom )
1722 vector_sym_verlet_list_nb<VERLET_MEMFAST_OPT>();
1723 vector_sym_verlet_list_nb<VERLET_MEMBAL_OPT>();
1724 vector_sym_verlet_list_nb<VERLET_MEMMW_OPT>();
1726 vector_sym_verlet_list_nb<VERLET_MEMFAST_INT_OPT>();
1727 vector_sym_verlet_list_nb<VERLET_MEMBAL_INT_OPT>();
1728 vector_sym_verlet_list_nb<VERLET_MEMMW_INT_OPT>();
1731 template<
template <
unsigned int>
class VerletList,
typename part_prop>
1735 std::default_random_engine & eg,
1736 std::uniform_real_distribution<float> & ud,
1744 auto key = it.get();
1756 vd.template getPropWrite<0>(key) = 0;
1757 vd.template getPropWrite<1>(key) = 0;
1758 vd.template getPropWrite<2>(key) = key.
getKey() + start;
1760 vd2.template getPropWrite<0>(key) = 0;
1761 vd2.template getPropWrite<1>(key) = 0;
1762 vd2.template getPropWrite<2>(key) = key.
getKey() + start;
1771 vd.template ghost_get<0,2>();
1772 vd2.template ghost_get<0,2>();
1774 auto NN = vd.template getVerlet<VL_NON_SYMMETRIC, VerletList<VL_NON_SYMMETRIC>>(r_cut);
1777 while (p_it.isNext())
1779 auto p = p_it.get();
1783 auto Np = NN.getNNIterator(p.getKey());
1789 if (p.getKey() == q)
1800 float distance = f.norm();
1804 if (distance < r_cut )
1806 vd.template getPropWrite<0>(p)++;
1807 vd.template getPropWrite<3>(p).
add();
1808 vd.template getPropWrite<3>(p).last().xq = xq;
1809 vd.template getPropWrite<3>(p).last().id = vd.template getPropRead<2>(q);
1820 auto NN2 = vd2.template getVerletCrs<VerletList<VL_CRS_SYMMETRIC>>(r_cut);
1825 while (p_it2.isNext())
1827 auto p = p_it2.get();
1831 auto Np = NN2.getNNIterator(p);
1848 float distance = f.norm();
1850 if (distance < r_cut )
1852 vd2.template getPropWrite<1>(p)++;
1853 vd2.template getPropWrite<1>(q)++;
1855 vd2.template getPropWrite<4>(p).
add();
1856 vd2.template getPropWrite<4>(q).
add();
1858 vd2.template getPropWrite<4>(p).last().xq = xq;
1859 vd2.template getPropWrite<4>(q).last().xq = xp;
1860 vd2.template getPropWrite<4>(p).last().id = vd2.template getPropRead<2>(q);
1861 vd2.template getPropWrite<4>(q).last().id = vd2.template getPropRead<2>(p);
1870 vd2.template ghost_put<add_,1>();
1871 vd2.template ghost_put<merge_,4>();
1880 while (p_it3.isNext())
1882 auto p = p_it3.get();
1884 ret &= vd2.template getPropRead<1>(p) == vd.template getPropRead<0>(p);
1889 std::cout <<
"ERROR " << vd2.template getPropWrite<1>(p) <<
" " << vd.template getPropWrite<0>(p) <<
" " << xp.
toString() << std::endl;
1892 vd.template getPropWrite<3>(p).sort();
1893 vd2.template getPropWrite<4>(p).sort();
1895 ret &= vd.template getPropRead<3>(p).size() == vd2.template getPropRead<4>(p).size();
1897 for (
size_t i = 0 ; i < vd.template getPropRead<3>(p).size() ; i++)
1898 ret &= vd.template getPropRead<3>(p).get(i).id == vd2.template getPropRead<4>(p).get(i).id;
1906 BOOST_REQUIRE_EQUAL(ret,
true);
1909 template<
template <
unsigned int>
class VerletList>
1910 void test_csr_verlet_list()
1922 std::default_random_engine eg;
1923 std::uniform_real_distribution<float> ud(-L,L);
1927 long int big_step = k / 4;
1928 big_step = (big_step == 0)?1:big_step;
1930 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
1931 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list k=" << k );
1936 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
1938 float r_cut = 100.0;
1943 ghost2.setLow(0,0.0);
1944 ghost2.setLow(1,0.0);
1945 ghost2.setLow(2,0.0);
1955 return (
id < pag.id);
1966 test_crs_full<VerletList>(vd,vd2,eg,ud,start,r_cut);
1969 template<
template <
unsigned int>
class VerletList>
1970 void test_csr_verlet_list_override()
1982 std::default_random_engine eg;
1983 std::uniform_real_distribution<float> ud(-L,L);
1987 long int big_step = k / 4;
1988 big_step = (big_step == 0)?1:big_step;
1990 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
1991 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list k=" << k );
1996 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
1998 float r_cut = 100.0;
2003 ghost2.setLow(0,0.0);
2004 ghost2.setLow(1,0.0);
2005 ghost2.setLow(2,0.0);
2015 return (
id < pag.id);
2040 test_crs_full<VerletList>(vd,vd2,eg,ud,start,r_cut);
2043 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_crs_verlet_list )
2045 test_csr_verlet_list<VERLET_MEMFAST_OPT>();
2046 test_csr_verlet_list<VERLET_MEMBAL_OPT>();
2047 test_csr_verlet_list<VERLET_MEMMW_OPT>();
2050 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_crs_verlet_list_dec_override )
2052 test_csr_verlet_list_override<VERLET_MEMFAST_OPT>();
2053 test_csr_verlet_list_override<VERLET_MEMBAL_OPT>();
2054 test_csr_verlet_list_override<VERLET_MEMMW_OPT>();
2057 template <
template <
unsigned int>
class VerletList>
2058 void test_vd_symmetric_crs_verlet()
2072 std::default_random_engine eg;
2073 std::uniform_real_distribution<float> ud(-L,L);
2077 long int big_step = k / 4;
2078 big_step = (big_step == 0)?1:big_step;
2080 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
2081 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list k=" << k );
2086 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
2088 float r_cut = 100.0;
2093 ghost2.setLow(0,0.0);
2094 ghost2.setLow(1,0.0);
2095 ghost2.setLow(2,0.0);
2107 auto key = it.get();
2109 vd.
getPos(key)[0] = ud(eg);
2110 vd.
getPos(key)[1] = ud(eg);
2111 vd.
getPos(key)[2] = ud(eg);
2127 auto NN2 = vd.template getVerletCrs<VerletList<VL_CRS_SYMMETRIC>>(r_cut);
2133 while (p_it2.isNext())
2135 auto p = p_it2.get();
2136 auto p2 = p_it3.get();
2147 BOOST_REQUIRE_EQUAL(ret,
true);
2150 BOOST_AUTO_TEST_CASE( vector_dist_symmetric_crs_verlet_list_partit )
2152 test_vd_symmetric_crs_verlet<VERLET_MEMFAST_OPT>();
2153 test_vd_symmetric_crs_verlet<VERLET_MEMBAL_OPT>();
2154 test_vd_symmetric_crs_verlet<VERLET_MEMMW_OPT>();
2157 BOOST_AUTO_TEST_CASE( vector_dist_checking_unloaded_processors )
2169 std::default_random_engine eg;
2170 std::uniform_real_distribution<float> ud(0,L);
2174 long int big_step = k / 4;
2175 big_step = (big_step == 0)?1:big_step;
2177 print_test_v(
"Testing 3D periodic vector symmetric cell-list (unload processors) k=",k);
2178 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list (unload processors) k=" << k );
2183 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
2185 float r_cut = 100.0;
2190 ghost2.setLow(0,0.0);
2191 ghost2.setLow(1,0.0);
2192 ghost2.setLow(2,0.0);
2204 auto key = it.get();
2206 vd.
getPos(key)[0] = ud(eg);
2207 vd.
getPos(key)[1] = ud(eg);
2208 vd.
getPos(key)[2] = ud(eg);
2227 BOOST_REQUIRE_EQUAL(min,0ul);
2242 BOOST_REQUIRE_EQUAL(min,0ul);
2246 BOOST_AUTO_TEST_CASE( vector_dist_cell_list_multi_type )
2258 std::default_random_engine eg;
2259 std::uniform_real_distribution<float> ud(-L,L);
2263 long int big_step = k / 4;
2264 big_step = (big_step == 0)?1:big_step;
2266 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
2267 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list k=" << k );
2272 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
2274 float r_cut = 100.0;
2288 auto key = it.get();
2290 vd.
getPos(key)[0] = ud(eg);
2291 vd.
getPos(key)[1] = ud(eg);
2292 vd.
getPos(key)[2] = ud(eg);
2312 while (p_it.isNext())
2314 auto p = p_it.
get();
2318 auto Np = NN.getNNIteratorBox(NN.getCell(xp));
2319 auto Np2 = NN2.getNNIteratorBox(NN2.getCell(xp));
2320 auto Np3 = NN3.getNNIteratorBox(NN3.getCell(xp));
2326 ret &= (Np.isNext() == Np2.isNext()) && (Np3.isNext() == Np.isNext());
2332 auto q2 = Np2.get();
2333 auto q3 = Np3.get();
2335 ret &= (q == q2) && (q == q3);
2345 ret &= (Np.isNext() == Np2.isNext()) && (Np.isNext() == Np3.isNext());
2353 BOOST_REQUIRE_EQUAL(ret,
true);
2364 return (
id < pag.id);
2368 template<
typename vector_dist_mp>
2369 void test_vector_dist_particle_NN_MP_iteration()
2380 std::default_random_engine eg;
2381 eg.seed(v_cl.
rank()*4533);
2382 std::uniform_real_distribution<float> ud(-L,L);
2386 long int big_step = k / 4;
2387 big_step = (big_step == 0)?1:big_step;
2389 print_test_v(
"Testing 3D periodic vector symmetric cell-list k=",k);
2390 BOOST_TEST_CHECKPOINT(
"Testing 3D periodic vector symmetric cell-list k=" << k );
2395 size_t bc[3]={PERIODIC,PERIODIC,PERIODIC};
2397 float r_cut = 100.0;
2405 vector_dist_mp vd(k,box,bc,ghost,BIND_DEC_TO_GHOST);
2412 auto key = it.get();
2420 vd.template getPropWrite<0>(key) = 0;
2421 vd.template getPropWrite<1>(key) = 0;
2422 vd.template getPropWrite<2>(key) = key.
getKey() + start;
2430 vd.template ghost_get<0,2>();
2435 while (p_it.isNext())
2437 auto p = p_it.
get();
2441 auto Np = NN.getNNIteratorBox(NN.getCell(xp));
2447 if (p.getKey() == q)
2458 float distance = f.norm();
2462 if (distance < r_cut )
2464 vd.template getPropWrite<0>(p)++;
2465 vd.template getPropWrite<3>(p).
add();
2466 vd.template getPropWrite<3>(p).last().xq = xq;
2467 vd.template getPropWrite<3>(p).last().id = vd.template getPropWrite<2>(q);
2480 phases.add( vector_dist_mp(phases.get(0).getDecomposition(),0));
2481 phases.add( vector_dist_mp(phases.get(0).getDecomposition(),0));
2482 phases.add( vector_dist_mp(phases.get(0).getDecomposition(),0));
2486 while (it2.isNext())
2490 if (p.getKey() % 4 == 0)
2492 phases.get(0).add();
2493 phases.get(0).getLastPos()[0] = vd.
getPos(p)[0];
2494 phases.get(0).getLastPos()[1] = vd.
getPos(p)[1];
2495 phases.get(0).getLastPos()[2] = vd.
getPos(p)[2];
2497 phases.get(0).template getLastProp<1>() = 0;
2499 phases.get(0).template getLastProp<2>() = vd.template getProp<2>(p);
2501 else if (p.getKey() % 4 == 1)
2503 phases.get(1).add();
2504 phases.get(1).getLastPos()[0] = vd.
getPos(p)[0];
2505 phases.get(1).getLastPos()[1] = vd.
getPos(p)[1];
2506 phases.get(1).getLastPos()[2] = vd.
getPos(p)[2];
2508 phases.get(1).template getLastProp<1>() = 0;
2510 phases.get(1).template getLastProp<2>() = vd.template getProp<2>(p);
2512 else if (p.getKey() % 4 == 2)
2514 phases.get(2).add();
2515 phases.get(2).getLastPos()[0] = vd.
getPos(p)[0];
2516 phases.get(2).getLastPos()[1] = vd.
getPos(p)[1];
2517 phases.get(2).getLastPos()[2] = vd.
getPos(p)[2];
2519 phases.get(2).template getLastProp<1>() = 0;
2521 phases.get(2).template getLastProp<2>() = vd.template getProp<2>(p);
2525 phases.get(3).add();
2526 phases.get(3).getLastPos()[0] = vd.
getPos(p)[0];
2527 phases.get(3).getLastPos()[1] = vd.
getPos(p)[1];
2528 phases.get(3).getLastPos()[2] = vd.
getPos(p)[2];
2530 phases.get(3).template getLastProp<1>() = 0;
2532 phases.get(3).template getLastProp<2>() = vd.template getProp<2>(p);
2540 for (
size_t i = 0 ; i < phases.
size() ; i++)
2542 phases.get(i).template ghost_get<0,1,2>();
2547 for (
size_t i = 0 ; i < phases.
size() ; i++)
2549 NN_ptr.add(phases.get(i).getCellListSym(r_cut));
2554 for (
size_t i = 0 ; i < phases.
size() ; i++)
2556 for (
size_t j = 0 ; j < phases.
size() ; j++)
2558 auto p_it2 = phases.get(i).getDomainIterator();
2560 while (p_it2.isNext())
2562 auto p = p_it2.get();
2566 auto Np = NN_ptr.get(j).getNNIteratorBoxSymMP(NN_ptr.get(j).getCell(xp),p.getKey(),phases.get(i).getPosVector(),phases.get(j).getPosVector());
2572 if (p.getKey() == q && i == j)
2583 float distance = f.norm();
2587 if (distance < r_cut )
2589 phases.get(i).template getPropWrite<1>(p)++;
2590 phases.get(j).template getPropWrite<1>(q)++;
2592 phases.get(i).template getPropWrite<4>(p).add();
2593 phases.get(j).template getPropWrite<4>(q).add();
2595 phases.get(i).template getPropWrite<4>(p).last().xq = xq;
2596 phases.get(j).template getPropWrite<4>(q).last().xq = xp;
2597 phases.get(i).template getPropWrite<4>(p).last().id = phases.get(j).template getProp<2>(q);
2598 phases.get(j).template getPropWrite<4>(q).last().id = phases.get(i).template getProp<2>(p);
2609 for (
size_t i = 0 ; i < phases.
size() ; i++)
2611 phases.get(i).template ghost_put<add_,1>();
2612 phases.get(i).template ghost_put<merge_,4>();
2618 while (p_it3.isNext())
2620 auto p = p_it3.get();
2624 if (p.getKey() % 4 == 0)
2626 else if (p.getKey() % 4 == 1)
2628 else if (p.getKey() % 4 == 2)
2633 size_t pah = p.getKey()/4;
2634 ret &= phases.get(ph).template getPropRead<1>(pah) == vd.template getPropRead<0>(p);
2636 vd.template getPropWrite<3>(p).sort();
2637 phases.get(ph).template getPropWrite<4>(pah).sort();
2639 ret &= vd.template getPropRead<3>(p).size() == phases.get(ph).template getPropRead<4>(pah).
size();
2641 for (
size_t i = 0 ; i < vd.template getPropRead<3>(p).size() ; i++)
2642 ret &= vd.template getPropRead<3>(p).get(i).id == phases.get(ph).template getPropRead<4>(pah).get(i).id;
2646 std::cout <<
"Error on particle: " << vd.template getPropRead<2>(p) <<
" " << v_cl.
rank() << std::endl;
2648 std::cout << vd.template getPropRead<3>(p).size() <<
" " << phases.get(ph).template getPropRead<4>(pah).
size() <<
" " << v_cl.
rank() << std::endl;
2650 for (
size_t i = 0 ; i < vd.template getPropRead<3>(p).size() ; i++)
2651 std::cout << vd.template getPropRead<3>(p).get(i).id <<
" " << phases.get(ph).template getPropRead<4>(pah).get(i).id <<
" " << v_cl.
rank() << std::endl;
2653 std::cout << phases.get(ph).template getPropRead<1>(pah) <<
" A " << vd.template getPropRead<0>(p) << std::endl;
2661 BOOST_REQUIRE_EQUAL(ret,
true);
2664 BOOST_AUTO_TEST_CASE( vector_dist_particle_NN_MP_iteration )
2668 test_vector_dist_particle_NN_MP_iteration<vector_dist<3,float, part_prop >>();
2671 BOOST_AUTO_TEST_SUITE_END()