Commit 063b665f authored by incardon's avatar incardon

Fixing CartDecomposition documentation

parent 4955afa4
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
* *
* \tparam dim is the dimensionality of the physical domain we are going to decompose. * \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 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 Memory Memory factory used to allocate memory
* \tparam Domain Structure that contain the information of your physical domain * \tparam Domain Structure that contain the information of your physical domain
* *
...@@ -46,7 +46,8 @@ ...@@ -46,7 +46,8 @@
* Assuming that VCluster.getProcessUnitID(), equivalent to the MPI processor rank, return the processor local * Assuming that VCluster.getProcessUnitID(), equivalent to the MPI processor rank, return the processor local
* processor id, we define * 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 * * 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 * boxes produced expanding every local sub-domain by the ghost extension and intersecting with the sub-domain
* of the other processors * of the other processors
...@@ -63,6 +64,9 @@ ...@@ -63,6 +64,9 @@
* *
* \see calculateGhostBoxes() for a visualization of internal and external ghost boxes * \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> 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: ...@@ -113,9 +117,9 @@ private:
CellList<dim,T,FAST> lgeo_cell; 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) void CreateDecomposition(Vcluster & v_cl)
...@@ -270,11 +274,8 @@ private: ...@@ -270,11 +274,8 @@ private:
/*! \brief Create the subspaces that decompose your domain /*! \brief Create the subspaces that decompose your domain
*
* Create the subspaces that decompose your domain
* *
*/ */
void CreateSubspaces() void CreateSubspaces()
{ {
// Create a grid where each point is a space // Create a grid where each point is a space
...@@ -402,6 +403,9 @@ public: ...@@ -402,6 +403,9 @@ public:
* B8_0 B9_0 B9_1 and B5_0 * B8_0 B9_0 B9_1 and B5_0
* *
* *
*
\verbatim
+----------------------------------------------------+ +----------------------------------------------------+
| | | |
| Processor 8 | | Processor 8 |
...@@ -427,9 +431,13 @@ public: ...@@ -427,9 +431,13 @@ public:
| | | |
+-----------------------------------+ +-----------------------------------+
\endverbatim
and also and also
G8_0 G9_0 G9_1 G5_0 (External ghost boxes) G8_0 G9_0 G9_1 G5_0 (External ghost boxes)
\verbatim
+----------------------------------------------------+ +----------------------------------------------------+
| | | |
| Processor 8 | | Processor 8 |
...@@ -456,11 +464,15 @@ public: ...@@ -456,11 +464,15 @@ public:
+----------------------------------------+----+------------------------------+ +----------------------------------------+----+------------------------------+
\endverbatim
* *
* *
* *
* \param ghost margins for each dimensions (p1 negative part) (p2 positive part) * \param ghost margins for each dimensions (p1 negative part) (p2 positive part)
* *
*
\verbatim
^ p2[1] ^ p2[1]
| |
| |
...@@ -474,6 +486,8 @@ p1[0]<-----+ +----> p2[0] ...@@ -474,6 +486,8 @@ p1[0]<-----+ +----> p2[0]
| |
v p1[1] v p1[1]
\endverbatim
* *
* *
*/ */
...@@ -513,12 +527,11 @@ p1[0]<-----+ +----> p2[0] ...@@ -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 * \return processorID
* *
*/ */
template<typename Mem> size_t inline processorID(encapc<1, Point<dim,T>, Mem> p) template<typename Mem> size_t inline processorID(encapc<1, Point<dim,T>, Mem> p)
{ {
return fine_s.get(cd.getCell(p)); return fine_s.get(cd.getCell(p));
...@@ -537,7 +550,7 @@ p1[0]<-----+ +----> p2[0] ...@@ -537,7 +550,7 @@ p1[0]<-----+ +----> p2[0]
return ss_box; 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 * \return processorID
* *
...@@ -569,7 +582,7 @@ p1[0]<-----+ +----> p2[0] ...@@ -569,7 +582,7 @@ p1[0]<-----+ +----> p2[0]
CreateDecomposition(v_cl); 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 * \return the number of sub-domains
* *
...@@ -579,61 +592,6 @@ p1[0]<-----+ +----> p2[0] ...@@ -579,61 +592,6 @@ p1[0]<-----+ +----> p2[0]
return sub_domains.size(); 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 /*! \brief Get the local sub-domain
* *
* \param i (each local processor can have more than one sub-domain) * \param i (each local processor can have more than one sub-domain)
...@@ -663,7 +621,6 @@ p1[0]<-----+ +----> p2[0] ...@@ -663,7 +621,6 @@ p1[0]<-----+ +----> p2[0]
* \return the sub-domain * \return the sub-domain
* *
*/ */
SpaceBox<dim,T> getSubDomainWithGhost(size_t lc) SpaceBox<dim,T> getSubDomainWithGhost(size_t lc)
{ {
// Create a space box // Create a space box
...@@ -676,13 +633,10 @@ p1[0]<-----+ +----> p2[0] ...@@ -676,13 +633,10 @@ p1[0]<-----+ +----> p2[0]
} }
/*! \brief Return the structure that store the physical domain /*! \brief Return the structure that store the physical domain
*
* Return the structure that store the physical domain
* *
* \return The physical domain * \return The physical domain
* *
*/ */
Domain<dim,T> & getDomain() Domain<dim,T> & getDomain()
{ {
return domain; return domain;
...@@ -714,7 +668,7 @@ p1[0]<-----+ +----> p2[0] ...@@ -714,7 +668,7 @@ p1[0]<-----+ +----> p2[0]
::Box<dim,T> bbox; ::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 * \return The bounding box
* *
...@@ -724,31 +678,18 @@ p1[0]<-----+ +----> p2[0] ...@@ -724,31 +678,18 @@ p1[0]<-----+ +----> p2[0]
return bbox; 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 /////////////// ////////////// Functions to get decomposition information ///////////////
/*! \brief Write the decomposition as VTK file /*! \brief Write the decomposition as VTK file
* *
* The function generate several files * The function generate several files
* *
* 1) subdomains_X.vtk domain for the local processor (X) as union of sub-domain * * 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) * * 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) * * 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) * * 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) * * 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) * * local_external_ghost_X.vtk external local ghost boxes for the local processor (X)
* *
* where X is the local processor rank * where X is the local processor rank
* *
......
...@@ -16,6 +16,7 @@ BOOST_AUTO_TEST_CASE( CartDecomposition_test_use) ...@@ -16,6 +16,7 @@ BOOST_AUTO_TEST_CASE( CartDecomposition_test_use)
// Initialize the global VCluster // Initialize the global VCluster
init_global_v_cluster(&boost::unit_test::framework::master_test_suite().argc,&boost::unit_test::framework::master_test_suite().argv); 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); CartDecomposition<3,float> dec(vcl);
// Physical domain // Physical domain
...@@ -23,14 +24,15 @@ BOOST_AUTO_TEST_CASE( CartDecomposition_test_use) ...@@ -23,14 +24,15 @@ BOOST_AUTO_TEST_CASE( CartDecomposition_test_use)
size_t div[3]; size_t div[3];
// Get the number of processor and calculate the number of sub-domain // 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_proc = vcl.getProcessingUnits();
size_t n_sub = n_proc * SUB_UNIT_FACTOR; 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++) for (int i = 0 ; i < 3 ; i++)
{div[i] = openfpm::math::round_big_2(pow(n_sub,1.0/3));} {div[i] = openfpm::math::round_big_2(pow(n_sub,1.0/3));}
// Define ghost
Ghost<3,float> g(0.01); Ghost<3,float> g(0.01);
// Decompose // Decompose
...@@ -39,6 +41,8 @@ BOOST_AUTO_TEST_CASE( CartDecomposition_test_use) ...@@ -39,6 +41,8 @@ BOOST_AUTO_TEST_CASE( CartDecomposition_test_use)
// create a ghost border // create a ghost border
dec.calculateGhostBoxes(); dec.calculateGhostBoxes();
//! [Create CartDecomposition]
// For each calculated ghost box // For each calculated ghost box
for (size_t i = 0 ; i < dec.getNIGhostBox() ; i++) for (size_t i = 0 ; i < dec.getNIGhostBox() ; i++)
{ {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment