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." )
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];
204 id_4_loc =
new LongIdx [ new_ds->lsize() ];
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;
unsigned int size() const
get global size
unsigned int n_sides() const
Returns number of sides aligned with the edge.
Mesh * mesh_
The input mesh.
~Partitioning()
Destructor.
shared_ptr< vector< int > > subdomain_id_field_data()
void make_element_connection_graph()
Edge edge() const
Returns pointer to the edge connected to the side.
static const Input::Type::Record & get_input_type()
Add edge for any pair of neighboring elements.
shared_ptr< vector< int > > seq_part_
Sequential partitioning for output.
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library...
ElementAccessor< 3 > element() const
Returns iterator to the element of the side.
LongIdx * loc_part_
Partition numbers for local elements in original distribution of elements given be init_el_ds_...
bool is_local(unsigned int idx) const
identify local index
Use PETSc interface to various partitioing tools.
static const Input::Type::Selection & get_tool_sel()
Input::Record in_
Input Record accessor.
MPI_Comm get_comm() const
void finalize()
Make sparse graph structures: rows, adj.
virtual void partition(int *loc_part)=0
bool is_valid() const
Returns true if the side has assigned element.
Use direct interface to Metis.
virtual Range< ElementAccessor< 3 > > elements_range() const
Returns range of bulk elements.
unsigned int np() const
get num of processors
Distribution * get_el_ds() const
Distribution * init_el_ds_
Original distribution of elements. Depends on type of partitioner.
unsigned int myp() const
get my processor
Support classes for parallel programing.
void id_maps(int n_ids, LongIdx *id_4_old, Distribution *&new_ds, LongIdx *&id_4_loc, LongIdx *&new_4_id)
int LongIdx
Define type that represents indices of large arrays (elements, nodes, dofs etc.)
virtual unsigned int n_elements(bool boundary=false) const
Returns count of boundary or bulk elements.
Same as before and assign higher weight to cuts of lower dimension in order to make them stick to one...
Distributed sparse graphs, partitioning.
const Distribution * get_init_distr() const
const LongIdx * get_loc_part() const
SparseGraph * graph_
Graph used to partitioning the mesh.
static const Input::Type::Selection & get_graph_type_sel()
Input specification objects.
Add edge for any pair of neighboring elements of same dimension (bad for matrix multiply) ...
Partitioning(Mesh *mesh, Input::Record in)
unsigned int idx() const
Return local idx of element in boundary / bulk part of element vector.
#define THROW(whole_exception_expr)
Wrapper for throw. Saves the throwing point.
SideIter side(const unsigned int i) const
Gets side iterator of the i -th side.
Implementation of range helper class.
void set_edge(const int a, const int b, int weight=1)
unsigned int lsize(int proc) const
get local size