libMesh
|
Partitions the Mesh based on the locations of element centroids. More...
#include <centroid_partitioner.h>
Public Types | |
enum | CentroidSortMethod { X =0, Y, Z, RADIAL, INVALID_METHOD } |
A typedef which controls the sorting method used for ordering the centroids. More... | |
Public Member Functions | |
CentroidPartitioner (const CentroidSortMethod sm=X) | |
Constructor. More... | |
CentroidPartitioner (const CentroidPartitioner &)=default | |
Copy/move ctor, copy/move assignment operator, and destructor are all explicitly defaulted for this class. More... | |
CentroidPartitioner (CentroidPartitioner &&)=default | |
CentroidPartitioner & | operator= (const CentroidPartitioner &)=default |
CentroidPartitioner & | operator= (CentroidPartitioner &&)=default |
virtual | ~CentroidPartitioner ()=default |
virtual std::unique_ptr< Partitioner > | clone () const override |
CentroidSortMethod | sort_method () const |
Getter for the current sorting method. More... | |
void | set_sort_method (const CentroidSortMethod sm) |
Setter for the current sorting method. More... | |
virtual void | partition_range (MeshBase &mesh, MeshBase::element_iterator it, MeshBase::element_iterator end, const unsigned int n) override |
Called by the SubdomainPartitioner to partition elements in the range (it, end). More... | |
virtual void | partition (MeshBase &mesh, const unsigned int n) |
Partitions the MeshBase into n parts by setting processor_id() on Nodes and Elems. More... | |
virtual void | partition (MeshBase &mesh) |
Partitions the MeshBase into mesh.n_processors() by setting processor_id() on Nodes and Elems. More... | |
void | repartition (MeshBase &mesh, const unsigned int n) |
Repartitions the MeshBase into n parts. More... | |
void | repartition (MeshBase &mesh) |
Repartitions the MeshBase into mesh.n_processors() parts. More... | |
virtual void | attach_weights (ErrorVector *) |
Attach weights that can be used for partitioning. More... | |
Static Public Member Functions | |
static void | partition_unpartitioned_elements (MeshBase &mesh) |
These functions assign processor IDs to newly-created elements (in parallel) which are currently assigned to processor 0. More... | |
static void | partition_unpartitioned_elements (MeshBase &mesh, const unsigned int n) |
static void | set_parent_processor_ids (MeshBase &mesh) |
This function is called after partitioning to set the processor IDs for the inactive parent elements. More... | |
static void | set_node_processor_ids (MeshBase &mesh) |
This function is called after partitioning to set the processor IDs for the nodes. More... | |
static void | processor_pairs_to_interface_nodes (MeshBase &mesh, std::map< std::pair< processor_id_type, processor_id_type >, std::set< dof_id_type >> &processor_pair_to_nodes) |
On the partitioning interface, a surface is shared by two and only two processors. More... | |
static void | set_interface_node_processor_ids_linear (MeshBase &mesh) |
Nodes on the partitioning interface is linearly assigned to each pair of processors. More... | |
static void | set_interface_node_processor_ids_BFS (MeshBase &mesh) |
Nodes on the partitioning interface is clustered into two groups BFS (Breadth First Search)scheme for per pair of processors. More... | |
static void | set_interface_node_processor_ids_petscpartitioner (MeshBase &mesh) |
Nodes on the partitioning interface is partitioned into two groups using a PETSc partitioner for each pair of processors. More... | |
Protected Member Functions | |
virtual void | _do_partition (MeshBase &mesh, const unsigned int n) override |
Partitions the mesh into n subdomains. More... | |
void | single_partition (MeshBase &mesh) |
Trivially "partitions" the mesh for one processor. More... | |
void | single_partition_range (MeshBase::element_iterator it, MeshBase::element_iterator end) |
Slightly generalized version of single_partition which acts on a range of elements defined by the pair of iterators (it, end). More... | |
virtual void | _do_repartition (MeshBase &mesh, const unsigned int n) |
This is the actual re-partitioning method which can be overridden in derived classes. More... | |
virtual void | _find_global_index_by_pid_map (const MeshBase &mesh) |
Construct contiguous global indices for the current partitioning. More... | |
virtual void | build_graph (const MeshBase &mesh) |
Build a dual graph for partitioner. More... | |
void | assign_partitioning (const MeshBase &mesh, const std::vector< dof_id_type > &parts) |
Assign the computed partitioning to the mesh. More... | |
Protected Attributes | |
ErrorVector * | _weights |
The weights that might be used for partitioning. More... | |
std::unordered_map< dof_id_type, dof_id_type > | _global_index_by_pid_map |
Maps active element ids into a contiguous range, as needed by parallel partitioner. More... | |
std::vector< dof_id_type > | _n_active_elem_on_proc |
The number of active elements on each processor. More... | |
std::vector< std::vector< dof_id_type > > | _dual_graph |
A dual graph corresponds to the mesh, and it is typically used in paritioner. More... | |
std::vector< Elem * > | _local_id_to_elem |
Static Protected Attributes | |
static const dof_id_type | communication_blocksize |
The blocksize to use when doing blocked parallel communication. More... | |
Private Member Functions | |
void | compute_centroids (MeshBase::element_iterator it, MeshBase::element_iterator end) |
Computes a list of element centroids for the mesh. More... | |
Static Private Member Functions | |
static bool | sort_x (const std::pair< Point, Elem * > &lhs, const std::pair< Point, Elem * > &rhs) |
Helper function which sorts by the centroid's x-coordinate in the internal std::sort call. More... | |
static bool | sort_y (const std::pair< Point, Elem * > &lhs, const std::pair< Point, Elem * > &rhs) |
Helper function which sorts by the centroid's y-coordinate in the internal std::sort call. More... | |
static bool | sort_z (const std::pair< Point, Elem * > &lhs, const std::pair< Point, Elem * > &rhs) |
Helper function which sorts by the centroid's z-coordinate in the internal std::sort call. More... | |
static bool | sort_radial (const std::pair< Point, Elem * > &lhs, const std::pair< Point, Elem * > &rhs) |
Helper function which sorts by the centroid's distance from the origin in the internal std::sort call. More... | |
Private Attributes | |
CentroidSortMethod | _sort_method |
Flag indicating the type of sort method we are using. More... | |
std::vector< std::pair< Point, Elem * > > | _elem_centroids |
Vector which holds pairs of centroids and their respective element pointers. More... | |
Partitions the Mesh based on the locations of element centroids.
You must define what you mean by "less than" for the list of element centroids, e.g. if you only care about distance in the z-direction, you would define "less than" differently than if you cared about radial distance.
Definition at line 48 of file centroid_partitioner.h.
A typedef which controls the sorting method used for ordering the centroids.
If e.g. X
is chosen, then the centroids will be sorted according to their x-coordinate.
Enumerator | |
---|---|
X | |
Y | |
Z | |
RADIAL | |
INVALID_METHOD |
Definition at line 57 of file centroid_partitioner.h.
|
inlineexplicit |
Constructor.
Takes the CentroidSortMethod
to use, which defaults to X
ordering.
Definition at line 68 of file centroid_partitioner.h.
|
default |
Copy/move ctor, copy/move assignment operator, and destructor are all explicitly defaulted for this class.
|
default |
|
virtualdefault |
|
overrideprotectedvirtual |
Partitions the mesh into n subdomains.
Implements libMesh::Partitioner.
Definition at line 122 of file centroid_partitioner.C.
References mesh, and partition_range().
|
inlineprotectedvirtualinherited |
This is the actual re-partitioning method which can be overridden in derived classes.
Reimplemented in libMesh::ParmetisPartitioner.
Definition at line 237 of file partitioner.h.
References libMesh::Partitioner::_do_partition().
Referenced by libMesh::Partitioner::repartition().
|
protectedvirtualinherited |
Construct contiguous global indices for the current partitioning.
The global indices are ordered part-by-part
Definition at line 917 of file partitioner.C.
References libMesh::Partitioner::_global_index_by_pid_map, libMesh::Partitioner::_n_active_elem_on_proc, libMesh::as_range(), libMesh::MeshTools::create_bounding_box(), libMesh::MeshCommunication::find_local_indices(), mesh, and libMesh::Parallel::sync_dofobject_data_by_id().
Referenced by libMesh::Partitioner::build_graph().
|
protectedinherited |
Assign the computed partitioning to the mesh.
Definition at line 1120 of file partitioner.C.
References libMesh::Partitioner::_global_index_by_pid_map, libMesh::Partitioner::_n_active_elem_on_proc, data, libMesh::libmesh_assert(), and mesh.
|
inlinevirtualinherited |
Attach weights that can be used for partitioning.
This ErrorVector should be exactly the same on every processor and should have mesh->max_elem_id() entries.
Reimplemented in libMesh::MetisPartitioner.
Definition at line 203 of file partitioner.h.
|
protectedvirtualinherited |
Build a dual graph for partitioner.
Reimplemented in libMesh::ParmetisPartitioner.
Definition at line 960 of file partitioner.C.
References libMesh::Partitioner::_dual_graph, libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::Partitioner::_global_index_by_pid_map, libMesh::Partitioner::_local_id_to_elem, libMesh::Partitioner::_n_active_elem_on_proc, libMesh::as_range(), libMesh::DofObject::id(), libMesh::libmesh_assert(), and mesh.
|
inlineoverridevirtual |
Implements libMesh::Partitioner.
Definition at line 83 of file centroid_partitioner.h.
|
private |
Computes a list of element centroids for the mesh.
Definition at line 133 of file centroid_partitioner.C.
References _elem_centroids, libMesh::as_range(), and end.
Referenced by partition_range().
|
default |
|
default |
|
virtualinherited |
Partitions the MeshBase
into mesh.n_processors()
by setting processor_id() on Nodes and Elems.
Definition at line 57 of file partitioner.C.
References mesh, and libMesh::Partitioner::partition().
Partitions the MeshBase
into n
parts by setting processor_id() on Nodes and Elems.
Definition at line 64 of file partitioner.C.
References libMesh::Partitioner::_do_partition(), libMesh::MeshTools::libmesh_assert_valid_remote_elems(), mesh, libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::Partitioner::set_node_processor_ids(), libMesh::Partitioner::set_parent_processor_ids(), and libMesh::Partitioner::single_partition().
Referenced by libMesh::ParmetisPartitioner::_do_repartition(), and libMesh::Partitioner::partition().
|
overridevirtual |
Called by the SubdomainPartitioner to partition elements in the range (it, end).
Reimplemented from libMesh::Partitioner.
Definition at line 30 of file centroid_partitioner.C.
References _elem_centroids, compute_centroids(), end, libMesh::index_range(), mesh, libMesh::DofObject::processor_id(), RADIAL, libMesh::Partitioner::single_partition_range(), sort_method(), sort_radial(), sort_x(), sort_y(), sort_z(), X, Y, and Z.
Referenced by _do_partition().
|
staticinherited |
These functions assign processor IDs to newly-created elements (in parallel) which are currently assigned to processor 0.
Definition at line 194 of file partitioner.C.
References mesh.
Referenced by libMesh::Partitioner::partition(), and libMesh::Partitioner::repartition().
|
staticinherited |
Definition at line 201 of file partitioner.C.
References libMesh::as_range(), libMesh::MeshTools::create_bounding_box(), distance(), end, libMesh::MeshCommunication::find_global_indices(), mesh, and libMesh::MeshTools::n_elem().
|
staticinherited |
On the partitioning interface, a surface is shared by two and only two processors.
Try to find which pair of processors corresponds to which surfaces, and store their nodes.
Definition at line 428 of file partitioner.C.
References libMesh::DofObject::invalid_processor_id, libMesh::libmesh_assert(), mesh, and n_nodes.
Referenced by libMesh::Partitioner::set_interface_node_processor_ids_BFS(), libMesh::Partitioner::set_interface_node_processor_ids_linear(), and libMesh::Partitioner::set_interface_node_processor_ids_petscpartitioner().
|
inherited |
Repartitions the MeshBase
into mesh.n_processors()
parts.
This is required since some partitioning algorithms can repartition more efficiently than computing a new partitioning from scratch.
Definition at line 124 of file partitioner.C.
References mesh, and libMesh::Partitioner::repartition().
Repartitions the MeshBase
into n
parts.
(Some partitioning algorithms can repartition more efficiently than computing a new partitioning from scratch.) The default behavior is to simply call this->partition(mesh,n).
Definition at line 131 of file partitioner.C.
References libMesh::Partitioner::_do_repartition(), mesh, libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::Partitioner::set_node_processor_ids(), libMesh::Partitioner::set_parent_processor_ids(), and libMesh::Partitioner::single_partition().
Referenced by libMesh::Partitioner::repartition().
|
staticinherited |
Nodes on the partitioning interface is clustered into two groups BFS (Breadth First Search)scheme for per pair of processors.
Definition at line 506 of file partitioner.C.
References libMesh::MeshTools::build_nodes_to_elem_map(), libMesh::MeshTools::find_nodal_neighbors(), mesh, and libMesh::Partitioner::processor_pairs_to_interface_nodes().
Referenced by libMesh::Partitioner::set_node_processor_ids().
|
staticinherited |
Nodes on the partitioning interface is linearly assigned to each pair of processors.
Definition at line 481 of file partitioner.C.
References mesh, and libMesh::Partitioner::processor_pairs_to_interface_nodes().
Referenced by libMesh::Partitioner::set_node_processor_ids().
|
staticinherited |
Nodes on the partitioning interface is partitioned into two groups using a PETSc partitioner for each pair of processors.
Definition at line 583 of file partitioner.C.
References libMesh::MeshTools::build_nodes_to_elem_map(), libMesh::MeshTools::find_nodal_neighbors(), libMesh::is, libMesh::libmesh_ignore(), mesh, and libMesh::Partitioner::processor_pairs_to_interface_nodes().
Referenced by libMesh::Partitioner::set_node_processor_ids().
|
staticinherited |
This function is called after partitioning to set the processor IDs for the nodes.
By definition, a Node's processor ID is the minimum processor ID for all of the elements which share the node.
Definition at line 691 of file partitioner.C.
References libMesh::as_range(), libMesh::DofObject::invalid_processor_id, libMesh::libmesh_assert(), mesh, libMesh::MeshTools::n_elem(), libMesh::on_command_line(), libMesh::DofObject::processor_id(), libMesh::Partitioner::set_interface_node_processor_ids_BFS(), libMesh::Partitioner::set_interface_node_processor_ids_linear(), and libMesh::Partitioner::set_interface_node_processor_ids_petscpartitioner().
Referenced by libMesh::MeshRefinement::_refine_elements(), libMesh::UnstructuredMesh::all_first_order(), libMesh::Partitioner::partition(), libMesh::XdrIO::read(), libMesh::Partitioner::repartition(), and libMesh::BoundaryInfo::sync().
|
staticinherited |
This function is called after partitioning to set the processor IDs for the inactive parent elements.
A parent's processor ID is the same as its first child.
Definition at line 275 of file partitioner.C.
References libMesh::as_range(), libMesh::Elem::child_ref_range(), libMesh::Partitioner::communication_blocksize, libMesh::DofObject::invalid_processor_id, libMesh::DofObject::invalidate_processor_id(), libMesh::libmesh_assert(), libMesh::libmesh_ignore(), mesh, libMesh::MeshTools::n_elem(), libMesh::Elem::parent(), libMesh::DofObject::processor_id(), and libMesh::Elem::total_family_tree().
Referenced by libMesh::Partitioner::partition(), and libMesh::Partitioner::repartition().
|
inline |
Setter for the current sorting method.
Definition at line 96 of file centroid_partitioner.h.
References _sort_method.
|
protectedinherited |
Trivially "partitions" the mesh for one processor.
Simply loops through the elements and assigns all of them to processor 0. Is is provided as a separate function so that derived classes may use it without reimplementing it.
Definition at line 166 of file partitioner.C.
References libMesh::MeshBase::elements_begin(), mesh, and libMesh::Partitioner::single_partition_range().
Referenced by libMesh::SubdomainPartitioner::_do_partition(), libMesh::Partitioner::partition(), and libMesh::Partitioner::repartition().
|
protectedinherited |
Slightly generalized version of single_partition which acts on a range of elements defined by the pair of iterators (it, end).
Definition at line 179 of file partitioner.C.
References libMesh::as_range(), and end.
Referenced by libMesh::LinearPartitioner::partition_range(), libMesh::MetisPartitioner::partition_range(), libMesh::MappedSubdomainPartitioner::partition_range(), libMesh::SFCPartitioner::partition_range(), partition_range(), and libMesh::Partitioner::single_partition().
|
inline |
Getter for the current sorting method.
Definition at line 91 of file centroid_partitioner.h.
References _sort_method.
Referenced by partition_range().
|
staticprivate |
Helper function which sorts by the centroid's distance from the origin in the internal std::sort call.
Definition at line 172 of file centroid_partitioner.C.
Referenced by partition_range().
|
staticprivate |
Helper function which sorts by the centroid's x-coordinate in the internal std::sort call.
Definition at line 145 of file centroid_partitioner.C.
Referenced by partition_range().
|
staticprivate |
Helper function which sorts by the centroid's y-coordinate in the internal std::sort call.
Definition at line 154 of file centroid_partitioner.C.
Referenced by partition_range().
|
staticprivate |
Helper function which sorts by the centroid's z-coordinate in the internal std::sort call.
Definition at line 164 of file centroid_partitioner.C.
Referenced by partition_range().
|
protectedinherited |
A dual graph corresponds to the mesh, and it is typically used in paritioner.
A vertex represents an element, and its neighbors are the element neighbors.
Definition at line 288 of file partitioner.h.
Referenced by libMesh::Partitioner::build_graph().
Vector which holds pairs of centroids and their respective element pointers.
Definition at line 159 of file centroid_partitioner.h.
Referenced by compute_centroids(), and partition_range().
|
protectedinherited |
Maps active element ids into a contiguous range, as needed by parallel partitioner.
Definition at line 272 of file partitioner.h.
Referenced by libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::Partitioner::assign_partitioning(), and libMesh::Partitioner::build_graph().
|
protectedinherited |
Definition at line 291 of file partitioner.h.
Referenced by libMesh::Partitioner::build_graph().
|
protectedinherited |
The number of active elements on each processor.
Definition at line 281 of file partitioner.h.
Referenced by libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::Partitioner::assign_partitioning(), and libMesh::Partitioner::build_graph().
|
private |
Flag indicating the type of sort method we are using.
Definition at line 153 of file centroid_partitioner.h.
Referenced by set_sort_method(), and sort_method().
|
protectedinherited |
The weights that might be used for partitioning.
Definition at line 267 of file partitioner.h.
Referenced by libMesh::MetisPartitioner::attach_weights(), and libMesh::MetisPartitioner::partition_range().
|
staticprotectedinherited |
The blocksize to use when doing blocked parallel communication.
This limits the maximum vector size which can be used in a single communication step.
Definition at line 244 of file partitioner.h.
Referenced by libMesh::Partitioner::set_parent_processor_ids().