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"
23template<
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.
__device__ __host__ const T & get(unsigned int i) const
Get coordinate.
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.
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.
Graph_CSR< nm_v< dim >, nm_e > & getGraph()
Get the current graph (main)
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.
grid_key_dx is the key to access any element in the grid
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.
Implementation of 1-D std::vector like structure.
sub-domain edge graph node