From aae42ca9434da783241837a59a2fc8fc33ffa493 Mon Sep 17 00:00:00 2001 From: Pietro Incardona <i-bird@localhost.localdomain> Date: Thu, 1 Sep 2016 03:51:41 +0200 Subject: [PATCH] Adding missing file --- src/Vector/vector_dist_NN_tests.hpp | 221 ++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 src/Vector/vector_dist_NN_tests.hpp diff --git a/src/Vector/vector_dist_NN_tests.hpp b/src/Vector/vector_dist_NN_tests.hpp new file mode 100644 index 00000000..a750bc95 --- /dev/null +++ b/src/Vector/vector_dist_NN_tests.hpp @@ -0,0 +1,221 @@ +/* + * vector_dist_NN_tests.hpp + * + * Created on: Aug 20, 2016 + * Author: i-bird + */ + +#ifndef SRC_VECTOR_VECTOR_DIST_NN_TESTS_HPP_ +#define SRC_VECTOR_VECTOR_DIST_NN_TESTS_HPP_ + + +BOOST_AUTO_TEST_CASE( vector_dist_full_NN ) +{ + Vcluster & v_cl = create_vcluster(); + + if (v_cl.getProcessingUnits() > 12) + return; + + // set the seed + // create the random generator engine + std::srand(v_cl.getProcessUnitID()); + std::default_random_engine eg; + std::uniform_real_distribution<float> ud(0.0f, 1.0f); + + long int k = 750 * v_cl.getProcessingUnits(); + + long int big_step = k / 4; + big_step = (big_step == 0)?1:big_step; + + print_test("Testing 3D full NN search k=",k); + BOOST_TEST_CHECKPOINT( "Testing 3D full NN search k=" << k ); + + Box<3,float> box({0.0,0.0,0.0},{1.0,1.0,1.0}); + + // Boundary conditions + size_t bc[3]={PERIODIC,PERIODIC,PERIODIC}; + + for (double r_cut = 0.1 ; r_cut < 1.0; r_cut += 0.1) + { + // ghost + Ghost<3,float> ghost(r_cut*1.001); + + typedef aggregate<float> part_prop; + + // Distributed vector + vector_dist<3,float, part_prop > vd(k,box,bc,ghost); + + auto it = vd.getIterator(); + + while (it.isNext()) + { + auto key = it.get(); + + vd.getPos(key)[0] = ud(eg); + vd.getPos(key)[1] = ud(eg); + vd.getPos(key)[2] = ud(eg); + + // Fill some properties randomly + + vd.getProp<0>(key) = 0.0; + + ++it; + } + + vd.map(); + + // sync the ghost + vd.ghost_get<0>(); + + openfpm::vector<openfpm::vector<size_t>> list_idx; + openfpm::vector<openfpm::vector<size_t>> list_idx2; + + list_idx.resize(vd.size_local()); + list_idx2.resize(vd.size_local()); + + for (size_t i = 0 ; i < vd.size_local() ; i++) + { + Point<3,float> p = vd.getPos(i); + + for (size_t j = 0 ; j < vd.size_local_with_ghost(); j++) + { + Point<3,float> q = vd.getPos(j); + + if (p.distance2(q) < r_cut * r_cut) + list_idx.get(i).add(j); + } + + list_idx.get(i).sort(); + } + + auto NN = vd.getCellList(r_cut); + + it = vd.getDomainIterator(); + + while (it.isNext()) + { + Point<3,float> xp = vd.getPos(it.get()); + auto Np = NN.getNNIterator<NO_CHECK>(NN.getCell(xp)); + + while (Np.isNext()) + { + auto q = Np.get(); + + Point<3,float> xq = vd.getPos(q); + + if (xp.distance2(xq) < r_cut * r_cut) + list_idx2.get(it.get().getKey()).add(q); + + ++Np; + } + + list_idx2.get(it.get().getKey()).sort(); + + ++it; + } + + BOOST_REQUIRE_EQUAL(list_idx.size(),list_idx2.size()); + + bool ret; + for (size_t i = 0 ; i < list_idx.size() ; i++) + { + BOOST_REQUIRE_EQUAL(list_idx.get(i).size(),list_idx2.get(i).size()); + + ret = true; + for (size_t j = 0 ; j < list_idx.get(i).size() ; j++) + ret &= list_idx.get(i).get(j) == list_idx2.get(i).get(j); + + BOOST_REQUIRE_EQUAL(ret,true); + } + + /////////////////////////////////// + + auto NNv = vd.getVerlet(r_cut*1.0001); + + it = vd.getDomainIterator(); + + while (it.isNext()) + { + Point<3,float> xp = vd.getPos(it.get()); + auto Np = NNv.getNNIterator<NO_CHECK>(it.get().getKey()); + + list_idx2.get(it.get().getKey()).clear(); + + while (Np.isNext()) + { + auto q = Np.get(); + + Point<3,float> xq = vd.getPos(q); + + if (xp.distance2(xq) < r_cut * r_cut) + list_idx2.get(it.get().getKey()).add(q); + + ++Np; + } + + list_idx2.get(it.get().getKey()).sort(); + + ++it; + } + + BOOST_REQUIRE_EQUAL(list_idx.size(),list_idx2.size()); + + for (size_t i = 0 ; i < list_idx.size() ; i++) + { + BOOST_REQUIRE_EQUAL(list_idx.get(i).size(),list_idx2.get(i).size()); + + ret = true; + for (size_t j = 0 ; j < list_idx.get(i).size() ; j++) + ret &= list_idx.get(i).get(j) == list_idx2.get(i).get(j); + + BOOST_REQUIRE_EQUAL(ret,true); + } + + ////////////////////////////////////////// + + NNv.clear(); + vd.updateVerlet(NNv,r_cut*1.0001); + + it = vd.getDomainIterator(); + + while (it.isNext()) + { + Point<3,float> xp = vd.getPos(it.get()); + auto Np = NNv.getNNIterator<NO_CHECK>(it.get().getKey()); + + list_idx2.get(it.get().getKey()).clear(); + + while (Np.isNext()) + { + auto q = Np.get(); + + Point<3,float> xq = vd.getPos(q); + + if (xp.distance2(xq) < r_cut * r_cut) + list_idx2.get(it.get().getKey()).add(q); + + ++Np; + } + + list_idx2.get(it.get().getKey()).sort(); + + ++it; + } + + BOOST_REQUIRE_EQUAL(list_idx.size(),list_idx2.size()); + + for (size_t i = 0 ; i < list_idx.size() ; i++) + { + BOOST_REQUIRE_EQUAL(list_idx.get(i).size(),list_idx2.get(i).size()); + + ret = true; + for (size_t j = 0 ; j < list_idx.get(i).size() ; j++) + ret &= list_idx.get(i).get(j) == list_idx2.get(i).get(j); + + BOOST_REQUIRE_EQUAL(ret,true); + } + } +} + + +#endif /* SRC_VECTOR_VECTOR_DIST_NN_TESTS_HPP_ */ -- GitLab