8 #ifndef SRC_DECOMPOSITION_DISTRIBUTION_SPACEDISTRIBUTION_HPP_
9 #define SRC_DECOMPOSITION_DISTRIBUTION_SPACEDISTRIBUTION_HPP_
11 #include "util/mathutil.hpp"
12 #include "NN/CellList/CellDecomposer.hpp"
13 #include "Grid/grid_key_dx_iterator_hilbert.hpp"
23 template<
unsigned int dim,
typename T>
81 for (
size_t i = 0 ; i < dim ; i++)
90 gp = g_factory_part.template construct<NO_EDGE, nm_v_id, T, dim - 1, 0>(
gr.
getSize(),
domain, bc);
96 gp.
vertex(i).template get<nm_v_x>()[2] = 0.0;
99 gp.
vertex(i).template get<nm_v_global_id>() = i;
122 size_t N_best_each = N_tot / Np;
123 size_t N_rest = N_tot % Np;
126 accu.get(0) = N_best_each + ((0 < N_rest)?1:0);
127 for (
size_t i = 1 ; i < Np ; i++)
128 accu.get(i) = accu.get(i-1) + N_best_each + ((i < N_rest)?1:0);
135 for (
size_t i = 0; i < dim ; i++)
142 size_t order = openfpm::math::log2_64(max);
143 if (1ul << order < max)
146 size_t n = 1 << order;
150 CellDecomposer_sm<dim,T> cd_sm;
161 for (
size_t i = 0 ; i < dim ; i++)
162 spacing[i] = (
domain.getHigh(i) -
domain.getLow(i)) / n;
174 g.template get<0>(key) = -1;
185 auto key = h_it.
get();
190 for (
size_t i = 0 ; i < dim ; i++)
191 p.get(i) = key.get(i) * spacing[i] + spacing[i] / 2;
195 if (g.template get<0>(sp) == -1)
197 g.template get<0>(sp) = proc_d;
200 if (ele_d >= accu.get(proc_d))
213 auto key = it2.
get();
215 gp.template vertex_p<nm_v_proc_id>(
gr.
LinId(key)) = g.template get<0>(key);
230 std::cout << __FILE__ <<
":" << __LINE__ <<
" You are trying to dynamicaly balance a fixed decomposition, this operation has no effect" << std::endl;
252 std::cerr << __FILE__ <<
":" << __LINE__ <<
"Such vertex doesn't exist (id = " <<
id <<
", " <<
"total size = " <<
gp.
getNVertex() <<
")\n";
256 pos[0] =
gp.
vertex(
id).template get<nm_v_x>()[0];
257 pos[1] =
gp.
vertex(
id).template get<nm_v_x>()[1];
259 pos[2] =
gp.
vertex(
id).template get<nm_v_x>()[2];
270 std::cout << __FILE__ <<
":" << __LINE__ <<
" You are trying to set the computation cost on a fixed decomposition, this operation has no effect" << std::endl;
306 size_t N_best_each = N_tot / Np;
307 size_t N_rest = N_tot % Np;
358 void write(
const std::string & file)
This class represent an N-dimensional box.
This class construct a cartesian graph.
Structure that store a graph in CSR format or basically in compressed adjacency matrix format.
auto vertex(size_t id) -> decltype(v.get(id))
Function to access the vertex.
size_t getNChilds(size_t c) const
Return the number of childs of a vertex.
void swap(Graph_CSR< V, E > &g)
swap the memory of g with this graph
size_t getNVertex() const
Return the number of the vertex.
Class that distribute sub-sub-domains across processors using ParMetis Library.
This class implement the point shape in an N-dimensional space.
Class that distribute sub-sub-domains across processors using an hilbert curve to divide the space.
void setComputationCost(size_t id, size_t weight)
Function that set the weight of the vertex.
Graph_CSR< nm_v< dim >, nm_e > & getGraph()
Get the current graph (main)
SpaceDistribution(Vcluster<> &v_cl)
Box< dim, T > domain
rectangular domain to decompose
size_t getProcessorLoad()
Compute the processor load counting the total weights of its vertices.
bool weightsAreUsed()
Checks if weights are used on the vertices.
void decompose()
Create the decomposition.
void write(const std::string &file)
Print the current distribution and save it to VTK file.
void setMigrationCost(size_t id, size_t migration)
Set migration cost of the vertex id.
void refine()
Refine current decomposition.
void createCartGraph(grid_sm< dim, void > &grid, Box< dim, T > dom)
Create the Cartesian graph.
size_t getNSubSubDomainNeighbors(size_t id)
Returns total number of neighbors of the sub-sub-domain id.
Graph_CSR< nm_v< dim >, nm_e > gp
Global sub-sub-domain graph.
size_t getNSubSubDomains()
Returns total number of sub-sub-domains in the distribution graph.
float getUnbalance()
Compute the unbalance of the processor compared to the optimal balance.
grid_sm< dim, void > gr
Structure that store the cartesian grid information.
SpaceDistribution(const ParMetisDistribution< dim, T > &pm)
void getSubSubDomainPosition(size_t id, T(&pos)[dim])
function that return the position of the vertex in the space
SpaceDistribution(SpaceDistribution< dim, T > &&pm)
void setCommunicationCost(size_t v_id, size_t e, size_t communication)
Set communication cost of the edge id.
size_t get_ndec()
It return the decomposition id.
size_t getSubSubDomainComputationCost(size_t id)
function that get the weight of the vertex
size_t getProcessUnitID()
Get the process unit id.
size_t getProcessingUnits()
Get the total number of processors.
Implementation of VCluster class.
const grid_key_dx< dim > & get()
Get the actual key.
bool isNext()
Check if there is the next element.
const grid_key_dx< dim > & get() const
Get the actual key.
bool isNext()
Check if there is the next element.
mem_id LinId(const grid_key_dx< N, ids_type > &gk, const signed char sum_id[N]) const
Linearization of the grid_key_dx with a specified shift.
__device__ __host__ const size_t(& getSize() const)[N]
Return the size of the grid as an array.
__device__ __host__ size_t size() const
Return the size of the grid.
sub-domain edge graph node