From 063b665ff878a75afc15d4f7185fb1c7913fe15f Mon Sep 17 00:00:00 2001 From: Pietro Incardona <incardon@mpi-cbg.de> Date: Thu, 20 Aug 2015 03:01:11 +0200 Subject: [PATCH] Fixing CartDecomposition documentation --- src/Decomposition/CartDecomposition.hpp | 121 +++++------------- .../CartDecomposition_unit_test.hpp | 8 +- 2 files changed, 37 insertions(+), 92 deletions(-) diff --git a/src/Decomposition/CartDecomposition.hpp b/src/Decomposition/CartDecomposition.hpp index 1a0e90d8..d33a3eac 100644 --- a/src/Decomposition/CartDecomposition.hpp +++ b/src/Decomposition/CartDecomposition.hpp @@ -33,7 +33,7 @@ * * \tparam dim is the dimensionality of the physical domain we are going to decompose. * \tparam T type of the space we decompose, Real, Integer, Complex ... - * \tparam layout to use + * \tparam device_l layout to use * \tparam Memory Memory factory used to allocate memory * \tparam Domain Structure that contain the information of your physical domain * @@ -46,7 +46,8 @@ * Assuming that VCluster.getProcessUnitID(), equivalent to the MPI processor rank, return the processor local * processor id, we define * - * * local sub-domain: all the sub-domain with id == local processor + * * local processor: processor rank + * * local sub-domain: sub-domain given to the local processor * * external ghost box: (or ghost box) are the boxes that compose the ghost space of the processor, or the * boxes produced expanding every local sub-domain by the ghost extension and intersecting with the sub-domain * of the other processors @@ -63,6 +64,9 @@ * * \see calculateGhostBoxes() for a visualization of internal and external ghost boxes * + * ### Create a Cartesian decomposition object on a Box space, distribute, calculate internal and external ghost boxes + * \snippet CartDecomposition_unit_test.hpp Create CartDecomposition + * */ template<unsigned int dim, typename T, template<typename> class device_l=openfpm::device_cpu, typename Memory=HeapMemory, template<unsigned int, typename> class Domain=Box> @@ -113,9 +117,9 @@ private: CellList<dim,T,FAST> lgeo_cell; - /*! \brief Create internally the decomposition + /*! \brief Constructor, it decompose and distribute the sub-domains across the processors * - * \param v_cl Virtual cluster, used internally to handle or pipeline communication + * \param v_cl Virtual cluster, used internally for communications * */ void CreateDecomposition(Vcluster & v_cl) @@ -270,11 +274,8 @@ private: /*! \brief Create the subspaces that decompose your domain - * - * Create the subspaces that decompose your domain * */ - void CreateSubspaces() { // Create a grid where each point is a space @@ -402,6 +403,9 @@ public: * B8_0 B9_0 B9_1 and B5_0 * * + * + \verbatim + +----------------------------------------------------+ | | | Processor 8 | @@ -427,9 +431,13 @@ public: | | +-----------------------------------+ + \endverbatim + and also G8_0 G9_0 G9_1 G5_0 (External ghost boxes) + \verbatim + +----------------------------------------------------+ | | | Processor 8 | @@ -456,11 +464,15 @@ public: +----------------------------------------+----+------------------------------+ + \endverbatim + * * * * \param ghost margins for each dimensions (p1 negative part) (p2 positive part) * + * + \verbatim ^ p2[1] | | @@ -474,6 +486,8 @@ p1[0]<-----+ +----> p2[0] | v p1[1] + \endverbatim + * * */ @@ -513,12 +527,11 @@ p1[0]<-----+ +----> p2[0] } } - /*! \brief processorID return in which processor the particle should go + /*! \brief Given a point return in which processor the particle should go * * \return processorID * */ - template<typename Mem> size_t inline processorID(encapc<1, Point<dim,T>, Mem> p) { return fine_s.get(cd.getCell(p)); @@ -537,7 +550,7 @@ p1[0]<-----+ +----> p2[0] return ss_box; } - /*! \brief processorID return in which processor the particle should go + /*! \brief Given a point return in which processor the particle should go * * \return processorID * @@ -569,7 +582,7 @@ p1[0]<-----+ +----> p2[0] CreateDecomposition(v_cl); } - /*! \brief Get the number of local local hyper-cubes or sub-domains + /*! \brief Get the number of local sub-domains * * \return the number of sub-domains * @@ -579,61 +592,6 @@ p1[0]<-----+ +----> p2[0] return sub_domains.size(); } - /*! \brief Get the number of one set of hyper-cube enclosing one particular - * subspace, the hyper-cube enclose your space, even if one box is enough - * can be more that one to increase occupancy - * - * In case of Cartesian decomposition it just return 1, each subspace - * has one hyper-cube, and occupancy 1 - * - * \param id of the subspace - * \return the number of hyper-cube enclosing your space - * - */ - size_t getNHyperCube(size_t id) - { - return 1; - } - - /*! \brief Get the hyper-cube margins id_c has to be 0 - * - * Get the hyper-cube margins id_c has to be 0, each subspace - * has one hyper-cube - * - * \param id of the subspace - * \param id_c - * \return The specified hyper-cube space - * - */ - SpaceBox<dim,T> & getHyperCubeMargins(size_t id, size_t id_c) - { -#ifdef DEBUG - // Check if this subspace exist - if (id >= gr.size()) - { - std::cerr << "Error CartDecomposition: id > N_tot"; - } - else if (id_c > 0) - { - // Each subspace is an hyper-cube so return error if id_c > 0 - std::cerr << "Error CartDecomposition: id_c > 0"; - } -#endif - - return sub_domains.get<Object>(id); - } - - /*! \brief Get the total number of sub-domain for the local processor - * - * \return The total number of sub-domains - * - */ - - size_t getNHyperCube() - { - return gr.size(); - } - /*! \brief Get the local sub-domain * * \param i (each local processor can have more than one sub-domain) @@ -663,7 +621,6 @@ p1[0]<-----+ +----> p2[0] * \return the sub-domain * */ - SpaceBox<dim,T> getSubDomainWithGhost(size_t lc) { // Create a space box @@ -676,13 +633,10 @@ p1[0]<-----+ +----> p2[0] } /*! \brief Return the structure that store the physical domain - * - * Return the structure that store the physical domain * * \return The physical domain * */ - Domain<dim,T> & getDomain() { return domain; @@ -714,7 +668,7 @@ p1[0]<-----+ +----> p2[0] ::Box<dim,T> bbox; - /*! \brief Return the bounding box containing the processor box + smallest subdomain spacing + /*! \brief Return the bounding box containing union of all the sub-domains for the local processor * * \return The bounding box * @@ -724,31 +678,18 @@ p1[0]<-----+ +----> p2[0] return bbox; } - /*! \brief if the point fall into the ghost of some near processor it return the processors id's in which - * it fall - * - * \param p Point - * \return iterator of the processors id's - * - */ -/* inline auto labelPoint(Point<dim,T> & p) -> decltype(geo_cell.getIterator(geo_cell.getCell(p))) - { - return geo_cell.getIterator(geo_cell.getCell(p)); - }*/ - - ////////////// Functions to get decomposition information /////////////// /*! \brief Write the decomposition as VTK file * * The function generate several files * - * 1) subdomains_X.vtk domain for the local processor (X) as union of sub-domain - * 2) subdomains_adjacent_X.vtk sub-domains adjacent to the local processor (X) - * 3) internal_ghost_X.vtk Internal ghost boxes for the local processor (X) - * 4) external_ghost_X.vtk External ghost boxes for the local processor (X) - * 5) local_internal_ghost_X.vtk internal local ghost boxes for the local processor (X) - * 6) local_external_ghost_X.vtk external local ghost boxes for the local processor (X) + * * subdomains_X.vtk domain for the local processor (X) as union of sub-domain + * * subdomains_adjacent_X.vtk sub-domains adjacent to the local processor (X) + * * internal_ghost_X.vtk Internal ghost boxes for the local processor (X) + * * external_ghost_X.vtk External ghost boxes for the local processor (X) + * * local_internal_ghost_X.vtk internal local ghost boxes for the local processor (X) + * * local_external_ghost_X.vtk external local ghost boxes for the local processor (X) * * where X is the local processor rank * diff --git a/src/Decomposition/CartDecomposition_unit_test.hpp b/src/Decomposition/CartDecomposition_unit_test.hpp index 490cf438..f6908d0a 100644 --- a/src/Decomposition/CartDecomposition_unit_test.hpp +++ b/src/Decomposition/CartDecomposition_unit_test.hpp @@ -16,6 +16,7 @@ BOOST_AUTO_TEST_CASE( CartDecomposition_test_use) // Initialize the global VCluster init_global_v_cluster(&boost::unit_test::framework::master_test_suite().argc,&boost::unit_test::framework::master_test_suite().argv); + //! [Create CartDecomposition] CartDecomposition<3,float> dec(vcl); // Physical domain @@ -23,14 +24,15 @@ BOOST_AUTO_TEST_CASE( CartDecomposition_test_use) size_t div[3]; // Get the number of processor and calculate the number of sub-domain - // for decomposition + // for each processor (SUB_UNIT_FACTOR=64) size_t n_proc = vcl.getProcessingUnits(); size_t n_sub = n_proc * SUB_UNIT_FACTOR; - // Calculate the number of sub-domain on each dimension + // Set the number of sub-domains on each dimension (in a scalable way) for (int i = 0 ; i < 3 ; i++) {div[i] = openfpm::math::round_big_2(pow(n_sub,1.0/3));} + // Define ghost Ghost<3,float> g(0.01); // Decompose @@ -39,6 +41,8 @@ BOOST_AUTO_TEST_CASE( CartDecomposition_test_use) // create a ghost border dec.calculateGhostBoxes(); + //! [Create CartDecomposition] + // For each calculated ghost box for (size_t i = 0 ; i < dec.getNIGhostBox() ; i++) { -- GitLab