Skip to content
Snippets Groups Projects
Commit e96ae545 authored by Pietro Incardona's avatar Pietro Incardona
Browse files

metis util tested

parent 8d63cbb3
No related branches found
No related tags found
No related merge requests found
......@@ -9,52 +9,88 @@
#define CARTESIANGRAPHFACTORY_HPP_
#include "map_vector.hpp"
#include "map_graph.hpp"
#include "grid.hpp"
#include "Space/Shape/Box.hpp"
/*! \brief This class construct a cartesian graph
/*! \brief This class work as a functor
*
* This class construct a cartesian graph
* For each number in the boost::mpl::vector (for example 3 6) set the properties of the vertex at the
* specified id (3 6) with pos[d] * spacing[d] with d running from 0 to 1, pos[d] the position id of the vertex
* spacing the grid spacing
*
* Example
*
* if we give a grid_key of dimension 2 4x4 the expression "pos[d] * spacing[d]"
* will assume the value
*
* \param dim dimensionality of the cartesia ngrid
* (0.0 0.0) (0.25 0.0) ...... (1.0 0.0)
* (0.0 0.25)................. (1.0 0.25)
* ....................................
* (0.0 1.0).................. (1.0 1.0)
*
* and the properties 3 6 will be filled with the numbers 0.0 0.0 ....... 1.0 1.0
* progressively
*
* \tparam dim Dimensionality of the cartesian grid
* \tparam dT type of the domain
* \tparam G_v vertex type object
* \tparam v boost::mpl::vector containing all the index to fill
* \tparam is_stub when is true, produce a trivial operator(),
* to use when v is an empty vector to avoid compilation error
*
*/
template<unsigned int dim, typename Graph>
class CartesianGraphFactory
template<unsigned int dim, typename dT, typename G_v, typename v, bool is_stub>
class fill_prop
{
//! Reference to an array containing the spacing
const dT (& szd)[dim];
//! grid_key_dx Reference containing the actual position
grid_key_dx<dim> & gk;
//! Vertex object to fill
G_v & g_v;
public:
/*!
*
* \brief Construct a cartesian graph, with V and E edge properties
*
* Construct a cartesian graph, with V and E edge properties
*
* Each vertex is a subspace (Hyper-cube) of dimension dim, each vertex is
* connected with an edge if two vertex (Hyper-cube) share a element of dimension grater than
* dim_c
*
* \param sz Vector that store the size of the grid on each dimension
* \param dom Box enclosing the physical domain
*
* \tparam se Indicate which properties fill with the element weight. The
* element weight is the point, line , surface, d dimensional object
* in contact (in common between two hyper-cube)
* \tparam T type of the domain like (int real complex ... )
* \tparam dim_c Connectivity dimension
* \tparam Memory class that create new memory
*
*/
template <unsigned int se,typename T, unsigned int dim_c>
//! Fill the object from where to take the properties
fill_prop(G_v & g_v , const dT (& szd)[dim], grid_key_dx<dim> & gk)
:szd(szd),gk(gk),g_v(g_v)
{}
//! It call the function for each property we want to copy
template<typename T>
void operator()(T& t) const
{
typedef typename boost::fusion::result_of::at<v,boost::mpl::int_<T::value>>::type t_val;
g_v.template get<t_val::value>() = gk.get(T::value) * szd[T::value];
}
};
/*! \brief Graph constructor function specialization
*
* On C++ partial function specialization is not allowed, so we need a class to do it
*
* \see CartesianGraphFactory method construct
*
*/
template<unsigned int dim, typename Graph, unsigned int se,typename T, unsigned int dim_c, int... pos>
class Graph_constructor_impl
{
public:
//! Construct cartesian graph
static Graph construct(std::vector<size_t> sz, Box<dim,T> dom)
{
#ifdef DEBUG
//! The size is wrong signal it
if (sz.size() != dim)
{std::cerr << "Error this factory has been specialized for catesian grid of size " << dim << "\n";}
{std::cerr << "Error this factory has been specialized for catesian grid of dimension " << dim << "\n";}
#endif
// Calculate the size of the hyper-cubes on each dimension
......@@ -81,7 +117,8 @@ public:
/******************
*
* Create the edges
* Create the edges and fill spatial
* information properties
*
******************/
......@@ -95,6 +132,16 @@ public:
{
grid_key_dx<dim> key = k_it.get();
// Vertex object
auto obj = gp.vertex(g.LinId(key));
// vertex spatial properties functor
fill_prop<dim,T,decltype(gp.vertex(g.LinId(key))), typename to_boost_mpl<pos...>::type, sizeof...(pos) == 0 > flp(obj,szd,key);
// fill properties
boost::mpl::for_each< boost::mpl::range_c<int,0,sizeof...(pos)> >(flp);
// Get the combinations of dimension d
for (int d = dim-1 ; d >= dim_c ; d--)
......@@ -124,16 +171,222 @@ public:
size_t start_v = g.LinId(key);
size_t end_v = g.template LinId<CheckExistence>(key,c[j].getComb());
// Add an edge and set the se edge property to the size of the face (communication weight)
// Add an edge and set the the edge property to the size of the face (communication weight)
gp.template addEdge<CheckExistence>(start_v,end_v).template get<se>() = ele_sz;
}
}
// Fill vertex properties
++k_it;
}
return gp;
}
};
/*! \brief Graph constructor function specialization
*
* On C++ partial function specialization is not allowed, so we need a class to do it
* This specialization handle the case when we have NO_EDGE option active
*
* \see CartesianGraphFactory method construct
*
*/
template<unsigned int dim, typename Graph,typename T, unsigned int dim_c, int... pos>
class Graph_constructor_impl<dim,Graph,NO_EDGE,T,dim_c,pos...>
{
public:
//! Construct cartesian graph
static Graph construct(std::vector<size_t> sz, Box<dim,T> dom)
{
#ifdef DEBUG
//! The size is wrong signal it
if (sz.size() != dim)
{std::cerr << "Error this factory has been specialized for catesian grid of dimension " << dim << "\n";}
#endif
// Calculate the size of the hyper-cubes on each dimension
T szd[dim];
for (int i = 0 ; i < dim ; i++)
{szd[i] = (dom.getHigh(i) - dom.getLow(i)) / sz[i];}
//! Construct an hyper-cube of dimension dim
HyperCube<dim> hc;
// Construct a grid info
grid<dim,void> g(sz);
// Create a graph with the number of vertices equal to the number of
// grid point
//! Graph to construct
Graph gp(g.size());
/******************
*
* Create the edges and fill spatial
* information properties
*
******************/
//! Construct a key iterator
grid_key_dx_iterator<dim> k_it(g);
//! Iterate through all the elements
while (k_it.isNext())
{
grid_key_dx<dim> key = k_it.get();
// Vertex object
auto obj = gp.vertex(g.LinId(key));
// vertex spatial properties functor
fill_prop<dim,T,decltype(gp.vertex(g.LinId(key))), typename to_boost_mpl<pos...>::type, sizeof...(pos) == 0 > flp(obj,szd,key);
// fill properties
boost::mpl::for_each< boost::mpl::range_c<int,0,sizeof...(pos)> >(flp);
// Get the combinations of dimension d
for (int d = dim-1 ; d >= dim_c ; d--)
{
// create the edges for that dimension
std::vector<comb<dim>> c = hc.getCombinations_R(d);
// for each combination calculate a safe linearization and create an edge
for (int j = 0 ; j < c.size() ; j++)
{
// Calculate the element size
T ele_sz = 0;
// for each dimension multiply and reduce
for (int s = 0 ; s < dim ; s++)
{
ele_sz += szd[s] * abs(c[j][s]);
}
// Calculate the end point vertex id
// Calculate the start point id
size_t start_v = g.LinId(key);
size_t end_v = g.template LinId<CheckExistence>(key,c[j].getComb());
// Add an edge and set the the edge property to the size of the face (communication weight)
gp.template addEdge<CheckExistence>(start_v,end_v);
}
}
// Fill vertex properties
++k_it;
}
return gp;
}
};
/*! \brief This class work as a functor
*
* For each number in the boost::mpl::vector (for example 3 6) set the properties of the vertex at the
* specified id (3 6) with pos[d] * spacing[d] with d running from 0 to 1, pos[d] the position id of the vertex
* spacing the grid spacing
*
* Example
*
* if we give a grid_key of dimension 2 4x4 the expression "pos[d] * spacing[d]"
* will assume the value
*
* (0.0 0.0) (0.25 0.0) ...... (1.0 0.0)
* (0.0 0.25)................. (1.0 0.25)
* ....................................
* (0.0 1.0).................. (1.0 1.0)
*
* and the properties 3 6 will be filled with the numbers 0.0 0.0 ....... 1.0 1.0
* progressively
*
* \tparam dim Dimensionality of the cartesian grid
* \tparam dT type of the domain
* \tparam G_v vertex type object
* \tparam v boost::mpl::vector containing all the index to fill
*
*/
template<unsigned int dim, typename dT, typename G_v, typename v>
class fill_prop<dim,dT,G_v,v,true>
{
public:
//! Fill the object from where to take the properties
fill_prop(G_v & g_v , const dT (& szd)[dim], grid_key_dx<dim> & gk)
{}
//! It call the function for each property we want to copy
template<typename T>
void operator()(T& t) const
{}
};
/*! \brief This class construct a cartesian graph
*
* This class construct a cartesian graph
*
* \param dim dimensionality of the cartesian grid
*
*/
template<unsigned int dim, typename Graph>
class CartesianGraphFactory
{
public:
/*!
*
* \brief Construct a cartesian graph, with V and E edge properties
*
* Construct a cartesian graph, with V and E edge properties
*
* Each vertex is a subspace (Hyper-cube) of dimension dim, each vertex is
* connected with an edge if two vertex (Hyper-cube) share a element of dimension grater than
* dim_c
*
* \param sz Vector that store the size of the grid on each dimension
* \param dom Box enclosing the physical domain
*
* \tparam se Indicate which properties fill with the element weight. The
* element weight is the point, line , surface, d dimensional object
* in contact (in common between two hyper-cube). NO_EDGE indicate
* no property will store this information
* \tparam T type of the domain like (int real complex ... )
* \tparam dim_c Connectivity dimension
* \tparam Memory class that create new memory
* \tparam pos... one or more integer indicating the spatial properties
*
*/
template <unsigned int se,typename T, unsigned int dim_c, int... pos>
static Graph construct(std::vector<size_t> sz, Box<dim,T> dom)
{
return Graph_constructor_impl<dim,Graph,se,T,dim_c,pos...>::construct(sz,dom);
}
};
......
......@@ -189,9 +189,7 @@ public:
{
}
/*! \brief get the object that store the decomposition information
*
* get the object that store the decomposition information
/*! \brief Get the object that store the decomposition information
*
* \return the decomposition object
*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment