diff --git a/images/vector.cpp b/images/vector.cpp index 7b9e3361a137e05c2d546d1f5ccb87f160a7f11b..b6c4b981a99ca14547aa6cd35907201af29d8918 100644 --- a/images/vector.cpp +++ b/images/vector.cpp @@ -58,7 +58,7 @@ int main(int argc, char* argv[]) size_t bc[2]={PERIODIC,PERIODIC}; Ghost<2,float> g(0.01); - vector_dist<2,float, Particle, CartDecomposition<2,float> > vd(4096,domain,bc,g); + vector_dist<2,float, Particle > vd(4096,domain,bc,g); auto it = vd.getIterator(); diff --git a/src/Decomposition/CartDecomposition.hpp b/src/Decomposition/CartDecomposition.hpp index 8b91795fab6c39f9fd97465a915150c2d3b94e95..ba84aebaf159e84eecee28bc66fe8c046c42e302 100755 --- a/src/Decomposition/CartDecomposition.hpp +++ b/src/Decomposition/CartDecomposition.hpp @@ -798,6 +798,9 @@ public: cart.box_nn_processor = box_nn_processor; cart.fine_s = fine_s; cart.gr = gr; + cart.gr_dist = gr_dist; + cart.dist = dist; + cart.commCostSet = commCostSet; cart.cd = cd; cart.domain = domain; for (size_t i = 0 ; i < dim ; i++) @@ -830,11 +833,17 @@ public: box_nn_processor = cart.box_nn_processor; fine_s = cart.fine_s; gr = cart.gr; + gr_dist = cart.gr_dist; + dist = cart.dist; + commCostSet = cart.commCostSet; cd = cart.cd; domain = cart.domain; for (size_t i = 0 ; i < dim ; i++) - {spacing[i] = cart.spacing[i];}; + { + spacing[i] = cart.spacing[i]; + magn[i] = cart.magn[i]; + }; ghost = cart.ghost; @@ -863,10 +872,16 @@ public: box_nn_processor.swap(cart.box_nn_processor); fine_s.swap(cart.fine_s); gr = cart.gr; + gr_dist = cart.gr_dist; + dist = cart.dist; + commCostSet = cart.commCostSet; cd = cart.cd; domain = cart.domain; for (size_t i = 0 ; i < dim ; i++) - {spacing[i] = cart.spacing[i];}; + { + spacing[i] = cart.spacing[i]; + magn[i] = cart.magn[i]; + }; ghost = cart.ghost; @@ -1096,7 +1111,7 @@ public: reset(); if (commCostSet == false) - computeCommunicationAndMigrationCosts(1); + {computeCommunicationAndMigrationCosts(1);} dist.decompose(); @@ -1118,7 +1133,7 @@ public: reset(); if (commCostSet == false) - computeCommunicationAndMigrationCosts(ts); + {computeCommunicationAndMigrationCosts(ts);} dist.refine(); @@ -1140,7 +1155,7 @@ public: reset(); if (commCostSet == false) - computeCommunicationAndMigrationCosts(ts); + {computeCommunicationAndMigrationCosts(ts);} dist.redecompose(); diff --git a/src/Decomposition/Distribution/ParMetisDistribution.hpp b/src/Decomposition/Distribution/ParMetisDistribution.hpp index 9ee2435da83384ec736f57779d4e21ea8bd5b9c9..3b8411228ff9723fbcf98a2e30ff34b25ca1c910 100644 --- a/src/Decomposition/Distribution/ParMetisDistribution.hpp +++ b/src/Decomposition/Distribution/ParMetisDistribution.hpp @@ -638,6 +638,7 @@ public: verticesGotWeights = dist.verticesGotWeights; sub_sub_owner = dist.sub_sub_owner; m2g = dist.m2g; + parmetis_graph = dist.parmetis_graph; return *this; } @@ -655,6 +656,7 @@ public: verticesGotWeights = dist.verticesGotWeights; sub_sub_owner.swap(dist.sub_sub_owner); m2g.swap(dist.m2g); + parmetis_graph = dist.parmetis_graph; return *this; } diff --git a/src/Decomposition/Distribution/parmetis_util.hpp b/src/Decomposition/Distribution/parmetis_util.hpp index c555326f4a20ef04b67f0e57b04b8bf93696df91..c34bc34a5e65797b548e1b2cd22073deecf6ee36 100755 --- a/src/Decomposition/Distribution/parmetis_util.hpp +++ b/src/Decomposition/Distribution/parmetis_util.hpp @@ -526,10 +526,11 @@ public: */ const Parmetis & operator=(const Parmetis & pm) { - comm = pm.comm; - v_cl = pm.v_cl; + MPI_Comm_dup(pm.comm, &comm); p_id = pm.p_id; nc = pm.nc; + n_dec = pm.n_dec; + dist_tol = pm.dist_tol; setDefaultParameters(pm.Mg.wgtflag[0] == 3); @@ -545,10 +546,12 @@ public: */ const Parmetis & operator=(Parmetis && pm) { - comm = pm.comm; - v_cl = pm.v_cl; + // TODO Move into VCluster + MPI_Comm_dup(pm.comm, &comm); p_id = pm.p_id; nc = pm.nc; + n_dec = pm.n_dec; + dist_tol = pm.dist_tol; setDefaultParameters(pm.Mg.wgtflag[0] == 3); diff --git a/src/Vector/vector_dist.hpp b/src/Vector/vector_dist.hpp index 1626a91e955660f933a3926184aeaa6cf4d6870c..46f3cbc2762b987cdf24596b1b9eacb3f02e32fe 100644 --- a/src/Vector/vector_dist.hpp +++ b/src/Vector/vector_dist.hpp @@ -140,7 +140,7 @@ template class layout_base = memory_traits_lin, typename Decomposition = CartDecomposition, typename Memory = HeapMemory> -class vector_dist : public vector_dist_comm +class vector_dist : public vector_dist_comm { public: @@ -161,7 +161,7 @@ private: //! Particle properties vector, (It has 2 elements) the first has real particles assigned to a processor //! the second element contain unassigned particles - openfpm::vector v_prp; + openfpm::vector v_prp; //! Virtual cluster Vcluster & v_cl; @@ -255,7 +255,7 @@ public: */ vector_dist & operator=(const vector_dist & v) { - static_cast *>(this)->operator=(static_cast>(v)); + static_cast *>(this)->operator=(static_cast>(v)); g_m = v.g_m; v_pos = v.v_pos; @@ -279,7 +279,7 @@ public: */ vector_dist & operator=(vector_dist && v) { - static_cast *>(this)->operator=(static_cast >(v)); + static_cast *>(this)->operator=(static_cast >(v)); g_m = v.g_m; v_pos.swap(v.v_pos); @@ -301,7 +301,7 @@ public: * */ vector_dist(const vector_dist & v) - :vector_dist_comm(v.getDecomposition()),v_cl(v.v_cl) SE_CLASS3_VDIST_CONSTRUCTOR + :vector_dist_comm(v.getDecomposition()),v_cl(v.v_cl) SE_CLASS3_VDIST_CONSTRUCTOR { #ifdef SE_CLASS2 check_new(this,8,VECTOR_DIST_EVENT,4); @@ -336,7 +336,7 @@ public: * */ vector_dist(const Decomposition & dec, size_t np) : - vector_dist_comm(dec), v_cl(create_vcluster()) SE_CLASS3_VDIST_CONSTRUCTOR + vector_dist_comm(dec), v_cl(create_vcluster()) SE_CLASS3_VDIST_CONSTRUCTOR { #ifdef SE_CLASS2 check_new(this,8,VECTOR_DIST_EVENT,4); @@ -1620,7 +1620,7 @@ public: */ inline Decomposition & getDecomposition() { - return vector_dist_comm::getDecomposition(); + return vector_dist_comm::getDecomposition(); } /*! \brief Get the decomposition @@ -1630,7 +1630,7 @@ public: */ inline const Decomposition & getDecomposition() const { - return vector_dist_comm::getDecomposition(); + return vector_dist_comm::getDecomposition(); } /*! \brief It move all the particles that does not belong to the local processor to the respective processor diff --git a/src/Vector/vector_dist_HDF5_chckpnt_restart_test.hpp b/src/Vector/vector_dist_HDF5_chckpnt_restart_test.hpp index 66ece4bd4d9292da3fbf4f1a34da868dbb08597b..f7fd9e49d400df999e69fd7907e3f756a6a889cd 100644 --- a/src/Vector/vector_dist_HDF5_chckpnt_restart_test.hpp +++ b/src/Vector/vector_dist_HDF5_chckpnt_restart_test.hpp @@ -46,7 +46,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_hdf5_save_test ) // ghost Ghost ghost(1.0/(Ng-2)); - vector_dist, CartDecomposition > vd(0,box,bc,ghost); + vector_dist > vd(0,box,bc,ghost); // Put particles @@ -85,7 +85,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_hdf5_save_test ) // Save the vector vd.save("vector_dist.h5"); - vector_dist, CartDecomposition > vd2(0,box,bc,ghost); + vector_dist > vd2(0,box,bc,ghost); vd2.load("vector_dist.h5"); @@ -143,7 +143,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_hdf5_load_test ) // ghost Ghost ghost(1.0/(Ng-2)); - vector_dist, CartDecomposition > vd(0,box,bc,ghost); + vector_dist > vd(0,box,bc,ghost); // Load the vector vd.load("test_data/vector_dist_24.h5"); diff --git a/src/Vector/vector_dist_cell_list_tests.hpp b/src/Vector/vector_dist_cell_list_tests.hpp index 0962a3cd5f2439fb252c01aceefe21eaeeb195a8..389660c11f7af3bd4bdd290350c243b825101ac1 100644 --- a/src/Vector/vector_dist_cell_list_tests.hpp +++ b/src/Vector/vector_dist_cell_list_tests.hpp @@ -47,7 +47,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_reorder_2d_test ) // Boundary conditions size_t bc[2]={NON_PERIODIC,NON_PERIODIC}; - vector_dist<2,float, Point_test, CartDecomposition<2,float> > vd(k,box,bc,Ghost<2,float>(0.01)); + vector_dist<2,float, Point_test > vd(k,box,bc,Ghost<2,float>(0.01)); auto it = vd.getIterator(); @@ -143,9 +143,9 @@ BOOST_AUTO_TEST_CASE( vector_dist_cl_random_vs_hilb_forces_test ) for (size_t i = 0; i < dim; i++) bc[i] = PERIODIC; - vector_dist, CartDecomposition > vd(k_int,box,bc,Ghost(ghost_part)); + vector_dist > vd(k_int,box,bc,Ghost(ghost_part)); - vector_dist, CartDecomposition > vd2(k_int,box,bc,Ghost(ghost_part)); + vector_dist > vd2(k_int,box,bc,Ghost(ghost_part)); // Initialize dist vectors vd_initialize_double(vd, vd2, v_cl, k_int); @@ -180,7 +180,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_cl_random_vs_hilb_forces_test ) vect_dist_key_dx key = it_v2.get(); for (size_t i = 0; i < dim; i++) - avg.get(i) += fabs(vd.getProp<0>(key)[i]); + {avg.get(i) += fabs(vd.getProp<0>(key)[i]);} ++count; ++it_v2; @@ -267,7 +267,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_cl_random_vs_reorder_forces_test ) for (size_t i = 0; i < dim; i++) bc[i] = PERIODIC; - vector_dist, CartDecomposition > vd(k_int,box,bc,Ghost(ghost_part)); + vector_dist > vd(k_int,box,bc,Ghost(ghost_part)); // Initialize vd vd_initialize(vd, v_cl, k_int); diff --git a/src/Vector/vector_dist_comm.hpp b/src/Vector/vector_dist_comm.hpp index 758f51c070f79820ee183fc4cc42f760f0df9d34..3b5e58ddf0f47b1f6bcb9ceeb700d39ae812636e 100644 --- a/src/Vector/vector_dist_comm.hpp +++ b/src/Vector/vector_dist_comm.hpp @@ -42,7 +42,13 @@ inline static size_t compute_options(size_t opt) * */ -template, typename Memory = HeapMemory> +template class layout_base, + typename Decomposition = CartDecomposition, + typename Memory = HeapMemory> class vector_dist_comm { //! Number of units for each sub-domain @@ -784,7 +790,7 @@ class vector_dist_comm static void * message_alloc_map(size_t msg_i, size_t total_msg, size_t total_p, size_t i, size_t ri, void * ptr) { // cast the pointer - vector_dist_comm * vd = static_cast *>(ptr); + vector_dist_comm * vd = static_cast *>(ptr); vd->recv_mem_gm.resize(vd->v_cl.getProcessingUnits()); vd->recv_mem_gm.get(i).resize(msg_i); @@ -799,7 +805,7 @@ public: * \param v vector to copy * */ - vector_dist_comm(const vector_dist_comm & v) + vector_dist_comm(const vector_dist_comm & v) :v_cl(create_vcluster()),dec(create_vcluster()),lg_m(0) { this->operator=(v); @@ -1166,7 +1172,7 @@ public: * \return iteself * */ - vector_dist_comm & operator=(const vector_dist_comm & vc) + vector_dist_comm & operator=(const vector_dist_comm & vc) { dec = vc.dec; @@ -1180,7 +1186,7 @@ public: * \return itself * */ - vector_dist_comm & operator=(vector_dist_comm && vc) + vector_dist_comm & operator=(vector_dist_comm && vc) { dec = vc.dec; diff --git a/src/Vector/vector_dist_dlb_test.hpp b/src/Vector/vector_dist_dlb_test.hpp index e7d5817d46a118159c074b89456a800abe6a21c1..a86f3d02c0a566013d9564b54a513dc90aab2db0 100644 --- a/src/Vector/vector_dist_dlb_test.hpp +++ b/src/Vector/vector_dist_dlb_test.hpp @@ -332,7 +332,12 @@ BOOST_AUTO_TEST_CASE( vector_dist_dlb_multi_phase_test_part ) BOOST_AUTO_TEST_CASE( vector_dist_dlb_metis_test_part ) { - test_dlb_vector,CartDecomposition<3,float,HeapMemory,MetisDistribution<3,float>>>>(); + test_dlb_vector, + memory_traits_lin>::type, + memory_traits_lin, + CartDecomposition<3,float,HeapMemory,MetisDistribution<3,float>>>>(); } BOOST_AUTO_TEST_SUITE_END() diff --git a/src/Vector/vector_dist_unit_test.hpp b/src/Vector/vector_dist_unit_test.hpp index 6c154e19025930bcc4ec187766115a0e6fdd7622..887364d557fb4ae9bdc7381b3553538eae2f0e8a 100644 --- a/src/Vector/vector_dist_unit_test.hpp +++ b/src/Vector/vector_dist_unit_test.hpp @@ -21,7 +21,7 @@ * \param bc boundary conditions * */ -template size_t total_n_part_lc(vector_dist, CartDecomposition > & vd, size_t (& bc)[dim]) +template class layout> size_t total_n_part_lc(vector_dist,typename layout>::type, layout, CartDecomposition > & vd, size_t (& bc)[dim]) { Vcluster & v_cl = vd.getVC(); auto it2 = vd.getDomainIterator(); @@ -775,7 +775,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_periodic_test_random_walk ) Ghost<3,float> ghost(0.01 / factor); // Distributed vector - vector_dist<3,float, Point_test, CartDecomposition<3,float> > vd(k,box,bc,ghost); + vector_dist<3,float, Point_test > vd(k,box,bc,ghost); auto it = vd.getIterator(); @@ -835,7 +835,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_periodic_map ) Ghost<3,float> ghost(0.05 / factor); // Distributed vector - vector_dist<3,float, Point_test, CartDecomposition<3,float> > vd(1,box,bc,ghost); + vector_dist<3,float, Point_test > vd(1,box,bc,ghost); // put particles al 1.0, check that they go to 0.0 @@ -886,7 +886,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_not_periodic_map ) Ghost<3,float> ghost(0.05 / factor); // Distributed vector - vector_dist<3,float, Point_test, CartDecomposition<3,float> > vd(1,box,bc,ghost); + vector_dist<3,float, Point_test > vd(1,box,bc,ghost); // put particles al 1.0, check that they go to 0.0 @@ -941,7 +941,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_out_of_bound_policy ) Ghost<3,float> ghost(0.05 / factor); // Distributed vector - vector_dist<3,float, Point_test, CartDecomposition<3,float> > vd(100,box,bc,ghost); + vector_dist<3,float, Point_test > vd(100,box,bc,ghost); // put particles at out of the boundary, they must be detected and and killed @@ -1025,7 +1025,7 @@ void Test_interacting(Box<3,float> & box) Ghost<3,float> ghost(r_cut); // Distributed vector - vector_dist<3,float, Point_test, CartDecomposition<3,float> > vd(k,box,bc,ghost); + vector_dist<3,float, Point_test > vd(k,box,bc,ghost); auto it = vd.getIterator(); @@ -1165,7 +1165,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_grid_iterator ) Ghost<3,float> ghost(1.0/(Ng-2)); // Distributed vector - vector_dist<3,float, Point_test, CartDecomposition<3,float> > vd(0,box,bc,ghost); + vector_dist<3,float, Point_test > vd(0,box,bc,ghost); // Put particles on a grid creating a Grid iterator auto it = vd.getGridIterator(sz); @@ -1239,7 +1239,7 @@ BOOST_AUTO_TEST_CASE( vector_dist_cell_verlet_test ) Ghost<3,float> ghost(third_dist*1.1); // Distributed vector - vector_dist<3,float, Point_test, CartDecomposition<3,float> > vd(0,box,bc,ghost); + vector_dist<3,float, Point_test > vd(0,box,bc,ghost); // Put particles on a grid creating a Grid iterator auto it = vd.getGridIterator(sz);