diff --git a/openfpm_data b/openfpm_data index fdf6629cc30bb52c73b703e2f66146439aebb7bc..a7cce19305d224ab9195683295a42a509fac0787 160000 --- a/openfpm_data +++ b/openfpm_data @@ -1 +1 @@ -Subproject commit fdf6629cc30bb52c73b703e2f66146439aebb7bc +Subproject commit a7cce19305d224ab9195683295a42a509fac0787 diff --git a/src/Vector/vector_dist.hpp b/src/Vector/vector_dist.hpp index 493fd115e3e3da5d8836b6cf9e76d94a63bf13d1..2b8bb26a35b1960df413d3acc0d621a7dae6fd49 100644 --- a/src/Vector/vector_dist.hpp +++ b/src/Vector/vector_dist.hpp @@ -381,10 +381,12 @@ public: cd_sm.setDimensions(getDecomposition().getDomain(),div,pad); - // get the processor bounding box + // Processor bounding box Box<dim, St> pbox = getDecomposition().getProcessorBounds(); - cell_list.setDimensions(cd_sm, pbox); + // Ghost padding extension + Ghost<dim,size_t> g_ext(0); + cell_list.Initialize(cd_sm,pbox,pad); updateCellList(cell_list); @@ -1115,6 +1117,16 @@ public: #endif return v_cl; } + + /*! \brief return the position vector of all the particles + * + * \return the particle position vector + * + */ + const openfpm::vector<Point<dim,St>> & getPosVector() const + { + return v_pos; + } }; diff --git a/src/Vector/vector_dist_cell_list_tests.hpp b/src/Vector/vector_dist_cell_list_tests.hpp index 0b747f83b14c439fb5afbadb3525a6e40c0ba1a4..abbd0e5c799577e4b1e933260328a39dd9004524 100644 --- a/src/Vector/vector_dist_cell_list_tests.hpp +++ b/src/Vector/vector_dist_cell_list_tests.hpp @@ -332,7 +332,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_cl_random_vs_reorder_forces_test ) } } - +/* BOOST_AUTO_TEST_CASE( vector_dist_sym_cell_list_test ) { long int k = 4096*create_vcluster().getProcessingUnits(); @@ -495,8 +495,141 @@ BOOST_AUTO_TEST_CASE( vector_dist_sym_cell_list_test ) ++it; } } -} +}*/ + +BOOST_AUTO_TEST_CASE( vector_dist_symmetric_cell_list ) +{ + Vcluster & v_cl = create_vcluster(); + + if (v_cl.getProcessingUnits() > 24) + 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 = 4096 * v_cl.getProcessingUnits(); + + long int big_step = k / 4; + big_step = (big_step == 0)?1:big_step; + + print_test("Testing 3D periodic vector symmetric cell-list k=",k); + BOOST_TEST_CHECKPOINT( "Testing 3D periodic vector symmetric cell-list 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}; + + float r_cut = 0.1; + + // ghost + Ghost<3,float> ghost(r_cut); + + typedef aggregate<size_t,size_t> 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>(); + + auto NN = vd.getCellList(0.1); + + auto p_it = vd.getDomainIterator(); + while (p_it.isNext()) + { + auto p = p_it.get(); + + Point<3,float> xp = vd.getPos(p); + + auto Np = NN.getNNIterator(NN.getCell(vd.getPos(p))); + + while (Np.isNext()) + { + auto q = Np.get(); + + // repulsive + + Point<3,float> xq = vd.getPos(q); + Point<3,float> f = (xp - xq); + + float distance = f.norm(); + + // Particle should be inside 2 * r_cut range + + if (distance < r_cut ) + vd.getProp<0>(p)++; + + ++Np; + } + + ++p_it; + } + + // We now try symmetric Cell-list + + auto NN2 = vd.getCellListSym(0.1); + + auto p_it2 = vd.getDomainIterator(); + + while (p_it2.isNext()) + { + auto p = p_it2.get(); + + Point<3,float> xp = vd.getPos(p); + + auto Np = NN2.template getNNIteratorSym<NO_CHECK>(NN2.getCell(vd.getPos(p)),p.getKey(),vd.getPosVector()); + + while (Np.isNext()) + { + auto q = Np.get(); + + // repulsive + + Point<3,float> xq = vd.getPos(q); + Point<3,float> f = (xp - xq); + + float distance = f.norm(); + + // Particle should be inside r_cut range + + if (distance < r_cut ) + { + vd.getProp<1>(p)++; + vd.getProp<1>(q)++; + } + + ++Np; + } + + ++p_it2; + } + + vd.ghost_put<add_,1>(); +} BOOST_AUTO_TEST_CASE( vector_dist_sym_verlet_list_test ) { diff --git a/src/Vector/vector_dist_comm.hpp b/src/Vector/vector_dist_comm.hpp index 00baad340d0631944fba8356b72f859aa317274e..94fc330687efa0478e590eeb898371f1626d289e 100644 --- a/src/Vector/vector_dist_comm.hpp +++ b/src/Vector/vector_dist_comm.hpp @@ -749,7 +749,7 @@ public: * */ vector_dist_comm(const vector_dist_comm<dim,St,prop,Decomposition,Memory> & v) - :v_cl(create_vcluster()),dec(create_vcluster()) + :v_cl(create_vcluster()),dec(create_vcluster()),lg_m(0) { this->operator=(v); } @@ -761,7 +761,7 @@ public: * */ vector_dist_comm(const Decomposition & dec) - :v_cl(create_vcluster()),dec(dec) + :v_cl(create_vcluster()),dec(dec),lg_m(0) { } @@ -781,7 +781,7 @@ public: * */ vector_dist_comm() - :v_cl(create_vcluster()),dec(create_vcluster()) + :v_cl(create_vcluster()),dec(create_vcluster()),lg_m(0) { } diff --git a/src/Vector/vector_dist_unit_test.hpp b/src/Vector/vector_dist_unit_test.hpp index 454ba22e54e4971ab37604cc0cc084928373452a..e76667dd2c3acc117614d672e5e70c75e1325eac 100644 --- a/src/Vector/vector_dist_unit_test.hpp +++ b/src/Vector/vector_dist_unit_test.hpp @@ -1817,139 +1817,6 @@ BOOST_AUTO_TEST_CASE( vector_of_vector_dist ) BOOST_REQUIRE_EQUAL(cnt,4*4096ul); } -BOOST_AUTO_TEST_CASE( vector_dist_symmetric_cell_list ) -{ - Vcluster & v_cl = create_vcluster(); - - if (v_cl.getProcessingUnits() > 24) - 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 = 524288 * v_cl.getProcessingUnits(); - - long int big_step = k / 4; - big_step = (big_step == 0)?1:big_step; - - print_test("Testing 3D periodic vector symmetric cell-list k=",k); - BOOST_TEST_CHECKPOINT( "Testing 3D periodic vector symmetric cell-list 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}; - - float r_cut = 0.1; - - // ghost - Ghost<3,float> ghost(r_cut); - - typedef aggregate<size_t,size_t> 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>(); - - auto NN = vd.getCellList(0.1); - - auto p_it = vd.getDomainIterator(); - - while (p_it.isNext()) - { - auto p = p_it.get(); - - Point<3,float> xp = vd.getPos(p); - - auto Np = NN.getIterator(NN.getCell(vd.getPos(p))); - - while (Np.isNext()) - { - auto q = Np.get(); - - // repulsive - - Point<3,float> xq = vd.getPos(q); - Point<3,float> f = (xp - xq); - - float distance = f.norm(); - - // Particle should be inside 2 * r_cut range - - if (distance < r_cut ) - vd.getProp<0>(p)++; - - ++Np; - } - - ++p_it; - } - - // We now try symmetric Cell-list - - auto NN2 = vd.getCellListSym(0.1); - - auto p_it2 = vd.getDomainIterator(); - - while (p_it2.isNext()) - { - auto p = p_it2.get(); - - Point<3,float> xp = vd.getPos(p); - - auto Np = NN2.getIterator(NN2.getCell(vd.getPos(p))); - - while (Np.isNext()) - { - auto q = Np.get(); - - // repulsive - - Point<3,float> xq = vd.getPos(q); - Point<3,float> f = (xp - xq); - - float distance = f.norm(); - - // Particle should be inside r_cut range - - if (distance < r_cut ) - { - vd.getProp<1>(p)++; - vd.getProp<1>(q)++; - } - - ++Np; - } - - ++p_it; - } - - vd.ghost_put<add_,1>(); -} #include "vector_dist_cell_list_tests.hpp" #include "vector_dist_NN_tests.hpp"