33 "Different algorithms to make the sparse graph with weighted edges\n"
34 "from the multidimensional mesh. Main difference is dealing with \n"
35 "neighboring of elements of different dimension.")
37 .
add_value(
any_weight_lower_dim_cuts,
"any_weight_lower_dim_cuts",
"Same as before and assign higher weight to cuts of lower dimension in order to make them stick to one face.")
43 return IT::Selection(
"PartTool",
"Select the partitioning tool to use.")
44 .
add_value(
PETSc,
"PETSc",
"Use PETSc interface to various partitioning tools.")
50 static IT::Record input_type =
IT::Record(
"Partition",
"Setting for various types of mesh partitioning." )
62 : mesh_(mesh), in_(in), graph_(NULL), loc_part_(NULL), init_el_ds_(NULL)
105 if ( !edistr.
is_local( ele.idx() ) )
109 for (
unsigned int si=0; si<ele->n_sides(); si++) {
112 for (
unsigned int li=0; li<edg.
n_sides(); li++) {
117 if ( e_idx != ele.idx() ) {
126 for (i_neigh = 0; i_neigh < ele->n_neighs_vb(); i_neigh++) {
127 n_s = ele->neigh_vb[i_neigh]->edge().n_sides();
128 for (i_s = 0; i_s < n_s; i_s++) {
129 e_idx = ele->neigh_vb[i_neigh]->edge().side(i_s)->element().idx();
158 if (mesh_size < num_of_procs) {
159 THROW( ExcDecomposeMesh() << EI_NElems( mesh_size ) << EI_NProcs( num_of_procs ) );
188 IS part, new_numbering;
189 unsigned int size = old_ds.
size();
190 int new_counts[old_ds.
np()];
196 ISCreateGeneral(PETSC_COMM_WORLD, old_ds.
lsize(), loc_part, PETSC_COPY_VALUES, &part);
197 ISPartitioningCount(part, old_ds.
np(), new_counts);
199 new_ds =
new Distribution((
unsigned int *) new_counts, PETSC_COMM_WORLD);
200 ISPartitioningToNumbering(part, &new_numbering);
203 old_4_new =
new int [size];
205 new_4_id =
new LongIdx [ n_ids + 1 ];
208 AOCreateBasicIS(new_numbering, PETSC_NULL, &new_old_ao);
209 ISDestroy(&new_numbering);
210 for (
unsigned int i = 0; i < size; i++)
212 AOApplicationToPetsc(new_old_ao, size, old_4_new);
213 AODestroy(&(new_old_ao));
218 for (
unsigned int i_new = new_ds->
begin(); i_new < new_ds->end(); i_new++) {
219 id_4_loc[i_loc++] = id_4_old[old_4_new[i_new]];
222 for (i_loc = 0; i_loc <= n_ids; i_loc++)
223 new_4_id[i_loc] = -1;
224 for (
unsigned int i_new = 0; i_new < size; i_new++)
225 new_4_id[id_4_old[old_4_new[i_new]]] = i_new;
#define ASSERT_PERMANENT(expr)
Allow use shorter versions of macro names if these names is not used with external library.
#define ASSERT_PTR(ptr)
Definition of assert macro checking non-null pointer (PTR) only for debug mode.
bool is_local(unsigned int idx) const
identify local index
unsigned int myp() const
get my processor
unsigned int begin(int proc) const
get starting local index
unsigned int lsize(int proc) const
get local size
unsigned int size() const
get global size
unsigned int np() const
get num of processors
unsigned int n_sides() const
Returns number of sides aligned with the edge.
SideIter side(const unsigned int i) const
Gets side iterator of the i -th side.
unsigned int idx() const
We need this method after replacing Region by RegionIdx, and movinf RegionDB instance into particular...
Distribution * get_el_ds() const
unsigned int n_elements() const
Range< ElementAccessor< 3 > > elements_range() const
Returns range of mesh elements.
MPI_Comm get_comm() const
static const Input::Type::Selection & get_tool_sel()
const LongIdx * get_loc_part() const
~Partitioning()
Destructor.
shared_ptr< vector< int > > subdomain_id_field_data()
Mesh * mesh_
The input mesh.
static const Input::Type::Record & get_input_type()
LongIdx * loc_part_
Partition numbers for local elements in original distribution of elements given be init_el_ds_.
static const Input::Type::Selection & get_graph_type_sel()
Input specification objects.
void make_element_connection_graph()
@ any_weight_lower_dim_cuts
Same as before and assign higher weight to cuts of lower dimension in order to make them stick to one...
@ same_dimension_neighboring
Add edge for any pair of neighboring elements of same dimension (bad for matrix multiply)
@ any_neighboring
Add edge for any pair of neighboring elements.
shared_ptr< vector< int > > seq_part_
Sequential partitioning for output.
const Distribution * get_init_distr() const
@ METIS
Use direct interface to Metis.
@ PETSc
Use PETSc interface to various partitioing tools.
Input::Record in_
Input Record accessor.
SparseGraph * graph_
Graph used to partitioning the mesh.
Partitioning(Mesh *mesh, Input::Record in)
Distribution * init_el_ds_
Original distribution of elements. Depends on type of partitioner.
void id_maps(int n_ids, LongIdx *id_4_old, Distribution *&new_ds, LongIdx *&id_4_loc, LongIdx *&new_4_id)
bool is_valid() const
Returns true if the side has assigned element.
ElementAccessor< 3 > element() const
Returns iterator to the element of the side.
Edge edge() const
Returns pointer to the edge connected to the side.
void set_edge(const int a, const int b, int weight=1)
void finalize()
Make sparse graph structures: rows, adj.
virtual void partition(int *loc_part)=0
Support classes for parallel programing.
#define THROW(whole_exception_expr)
Wrapper for throw. Saves the throwing point.
int LongIdx
Define type that represents indices of large arrays (elements, nodes, dofs etc.)
Implementation of range helper class.
Distributed sparse graphs, partitioning.