diff --git a/configure.ac b/configure.ac index 0431ddd7ca130c594766880e92d1dcbdccbc76bf..df25ebea23e0d33502dfb0823ef8cb4d314ca164 100644 --- a/configure.ac +++ b/configure.ac @@ -4,7 +4,7 @@ ## Take all the options with the exception of --enable-install-req AC_PREREQ(2.59) -AC_INIT(OpenFPM_pdata, 0.8.0, BUG-REPORT-ADDRESS) +AC_INIT(OpenFPM_pdata, 0.9.0, BUG-REPORT-ADDRESS) AC_CANONICAL_SYSTEM AC_CONFIG_SRCDIR([src/main.cpp]) AC_CONFIG_SUBDIRS([openfpm_data openfpm_devices openfpm_vcluster openfpm_io openfpm_numerics]) diff --git a/script/install_Parmetis.sh b/script/install_Parmetis.sh index ba6e9203d2c8e245d43ccc3a804bed05e35342b1..f1b425993efc82b260089ed16a12418b42a9b10e 100755 --- a/script/install_Parmetis.sh +++ b/script/install_Parmetis.sh @@ -10,7 +10,7 @@ fi ## Remove old download rm -rf parmetis-4.0.3 -wget http://ppmcore.mpi-cbg.de/upload/parmetis-4.0.3.tar.gz +wget http://glaros.dtc.umn.edu/gkhome/fetch/sw/parmetis/parmetis-4.0.3.tar.gz tar -xf parmetis-4.0.3.tar.gz cd parmetis-4.0.3 make config prefix=$1/PARMETIS diff --git a/src/Vector/vector_dist.hpp b/src/Vector/vector_dist.hpp index 990af51fcfc09a4ba2a8943c98b8b747b7836726..5812722154d1d35cbbb16d886444011bcc979728 100644 --- a/src/Vector/vector_dist.hpp +++ b/src/Vector/vector_dist.hpp @@ -31,6 +31,7 @@ #include "NN/VerletList/VerletList.hpp" #include "vector_dist_comm.hpp" #include "DLB/LB_Model.hpp" +#include "Vector/vector_map_iterator.hpp" #define VECTOR_DIST_ERROR_OBJECT std::runtime_error("Runtime vector distributed error"); @@ -1800,7 +1801,7 @@ public: * \return Particle iterator * */ - template<typename cli> ParticleItCRS_Cells<dim,cli> getParticleIteratorCRS(cli & NN) + template<typename cli> ParticleItCRS_Cells<dim,cli> getParticleIteratorCRS_Cell(cli & NN) { // Shift grid_key_dx<dim> shift; @@ -1819,6 +1820,20 @@ public: NN.getNNc_sym()); } + /*! \brief Get a special particle iterator able to iterate across particles using + * symmetric crossing scheme + * + * \param NN Verlet list neighborhood + * + * \return Particle iterator + * + */ + template<typename vrl> openfpm::vector_key_iterator_seq<typename vrl::local_index_t> getParticleIteratorCRS(vrl & NN) + { + // First we check that + return openfpm::vector_key_iterator_seq<typename vrl::local_index_t>(NN.getParticleSeq()); + } + /*! \brief Return from which cell we have to start in case of CRS interation * scheme * diff --git a/src/Vector/vector_dist_cell_list_tests.hpp b/src/Vector/vector_dist_cell_list_tests.hpp index 3c4167c7f7b17440b466ce556481cf075e6acf32..31f3e12271b8d44866ac8be2c211805d01009fa4 100644 --- a/src/Vector/vector_dist_cell_list_tests.hpp +++ b/src/Vector/vector_dist_cell_list_tests.hpp @@ -684,7 +684,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_symmetric_crs_cell_list ) // In case of CRS we have to iterate particles within some cells // here we define whichone - auto p_it2 = vd2.getParticleIteratorCRS(NN2); + auto p_it2 = vd2.getParticleIteratorCRS_Cell(NN2); // For each particle while (p_it2.isNext()) @@ -1326,7 +1326,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_symmetric_crs_verlet_list ) auto NN2 = vd2.getVerletCrs(r_cut); // Because iterating across particles in the CSR scheme require a Cell-list - auto p_it2 = vd2.getParticleIteratorCRS(NN2.getInternalCellList()); + auto p_it2 = vd2.getParticleIteratorCRS_Cell(NN2.getInternalCellList()); while (p_it2.isNext()) { @@ -1402,5 +1402,97 @@ BOOST_AUTO_TEST_CASE( vector_dist_symmetric_crs_verlet_list ) BOOST_REQUIRE_EQUAL(ret,true); } +BOOST_AUTO_TEST_CASE( vector_dist_symmetric_crs_verlet_list_partit ) +{ + Vcluster & v_cl = create_vcluster(); + + if (v_cl.getProcessingUnits() > 24) + return; + + float L = 1000.0; + + bool ret = true; + + // set the seed + // create the random generator engine + std::srand(0); + std::default_random_engine eg; + std::uniform_real_distribution<float> ud(-L,L); + + 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({-L,-L,-L},{L,L,L}); + + // Boundary conditions + size_t bc[3]={PERIODIC,PERIODIC,PERIODIC}; + + float r_cut = 100.0; + + // ghost + Ghost<3,float> ghost(r_cut); + Ghost<3,float> ghost2(r_cut); + ghost2.setLow(0,0.0); + ghost2.setLow(1,0.0); + ghost2.setLow(2,0.0); + + + typedef aggregate<size_t> part_prop; + + // Distributed vector + vector_dist<3,float, part_prop > vd(k,box,bc,ghost,BIND_DEC_TO_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; + + ++it; + } + + vd.map(); + + // sync the ghost + vd.ghost_get<0>(); + + // We now try symmetric Verlet-list Crs scheme + + auto NN2 = vd.getVerletCrs(r_cut); + + // Because iterating across particles in the CSR scheme require a Cell-list + auto p_it2 = vd.getParticleIteratorCRS_Cell(NN2.getInternalCellList()); + auto p_it3 = vd.getParticleIteratorCRS(NN2); + + while (p_it2.isNext()) + { + auto p = p_it2.get(); + auto p2 = p_it3.get(); + + ret &= (p == p2); + + if (ret == false) + break; + + ++p_it2; + ++p_it3; + } + + BOOST_REQUIRE_EQUAL(ret,true); +} + #endif /* SRC_VECTOR_VECTOR_DIST_CELL_LIST_TESTS_HPP_ */