Go to the documentation of this file.
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;
void set_edge(const int a, const int b, int weight=1)
Edge edge() const
Returns pointer to the edge connected to the side.
unsigned int np() const
get num of processors
Partitioning(Mesh *mesh, Input::Record in)
Distributed sparse graphs, partitioning.
Input::Record in_
Input Record accessor.
unsigned int lsize(int proc) const
get local size
@ METIS
Use direct interface to Metis.
unsigned int myp() const
get my processor
Distribution * get_el_ds() const
Support classes for parallel programing.
unsigned int n_sides() const
Returns number of sides aligned with the edge.
shared_ptr< vector< int > > subdomain_id_field_data()
Mesh * mesh_
The input mesh.
~Partitioning()
Destructor.
LongIdx * loc_part_
Partition numbers for local elements in original distribution of elements given be init_el_ds_.
#define THROW(whole_exception_expr)
Wrapper for throw. Saves the throwing point.
unsigned int size() const
get global size
const LongIdx * get_loc_part() const
Range< ElementAccessor< 3 > > elements_range() const
Returns range of mesh elements.
static const Input::Type::Selection & get_graph_type_sel()
Input specification objects.
SparseGraph * graph_
Graph used to partitioning the mesh.
Distribution * init_el_ds_
Original distribution of elements. Depends on type of partitioner.
static const Input::Type::Selection & get_tool_sel()
#define ASSERT_PERMANENT(expr)
Allow use shorter versions of macro names if these names is not used with external library.
SideIter side(const unsigned int i) const
Gets side iterator of the i -th side.
@ any_neighboring
Add edge for any pair of neighboring elements.
void finalize()
Make sparse graph structures: rows, adj.
virtual void partition(int *loc_part)=0
ElementAccessor< 3 > element() const
Returns iterator to the element of the side.
@ same_dimension_neighboring
Add edge for any pair of neighboring elements of same dimension (bad for matrix multiply)
MPI_Comm get_comm() const
static const Input::Type::Record & get_input_type()
int LongIdx
Define type that represents indices of large arrays (elements, nodes, dofs etc.)
const Distribution * get_init_distr() const
unsigned int idx() const
We need this method after replacing Region by RegionIdx, and movinf RegionDB instance into particular...
shared_ptr< vector< int > > seq_part_
Sequential partitioning for output.
void id_maps(int n_ids, LongIdx *id_4_old, Distribution *&new_ds, LongIdx *&id_4_loc, LongIdx *&new_4_id)
void make_element_connection_graph()
bool is_valid() const
Returns true if the side has assigned element.
unsigned int n_elements() const
@ PETSc
Use PETSc interface to various partitioing tools.
@ 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...
#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
Implementation of range helper class.
unsigned int begin(int proc) const
get starting local index