15 #include "libmesh/linear_partitioner.h" 16 #include "libmesh/centroid_partitioner.h" 17 #include "libmesh/parmetis_partitioner.h" 18 #include "libmesh/metis_partitioner.h" 19 #include "libmesh/hilbert_sfc_partitioner.h" 20 #include "libmesh/morton_sfc_partitioner.h" 21 #include "libmesh/subdomain_partitioner.h" 31 "metis=-2 parmetis=-1 linear=0 centroid hilbert_sfc morton_sfc subdomain_partitioner");
35 "Specifies a mesh partitioner to use when splitting the mesh for a parallel computation.");
39 "Specifies the sort direction if using the centroid partitioner. " 40 "Available options: x, y, z, radial");
41 params.
addParam<std::vector<std::vector<SubdomainName>>>(
42 "blocks", {},
"Block is seperated by ;, and partition mesh block by block. ");
48 _partitioner_name(getParam<
MooseEnum>(
"partitioner")),
49 _subdomain_blocks(getParam<
std::vector<
std::vector<SubdomainName>>>(
"blocks"))
54 _partitioner = std::make_unique<libMesh::MetisPartitioner>();
57 _partitioner = std::make_unique<libMesh::ParmetisPartitioner>();
61 _partitioner = std::make_unique<libMesh::LinearPartitioner>();
67 "If using the centroid partitioner you _must_ specify centroid_partitioner_direction!");
69 MooseEnum direction = getParam<MooseEnum>(
"centroid_partitioner_direction");
74 else if (direction ==
"y")
77 else if (direction ==
"z")
80 else if (direction ==
"radial")
86 _partitioner = std::make_unique<libMesh::HilbertSFCPartitioner>();
89 _partitioner = std::make_unique<libMesh::MortonSFCPartitioner>();
92 _partitioner = std::make_unique<libMesh::SubdomainPartitioner>();
99 std::unique_ptr<Partitioner>
105 return std::make_unique<libMesh::MetisPartitioner>();
108 return std::make_unique<libMesh::ParmetisPartitioner>();
111 return std::make_unique<libMesh::LinearPartitioner>();
117 "If using the centroid partitioner you _must_ specify centroid_partitioner_direction!");
119 MooseEnum direction = getParam<MooseEnum>(
"centroid_partitioner_direction");
121 if (direction ==
"x")
123 else if (direction ==
"y")
125 else if (direction ==
"z")
127 else if (direction ==
"radial")
132 return std::make_unique<libMesh::HilbertSFCPartitioner>();
135 return std::make_unique<libMesh::MortonSFCPartitioner>();
142 mooseError(
"Error in LibmeshPartitioner: Supplied partitioner option causes error in clone()");
143 return std::make_unique<libMesh::MetisPartitioner>();
151 std::set<subdomain_id_type> mesh_subdomain_ids;
152 mesh.subdomain_ids(mesh_subdomain_ids);
155 subdomain_partitioner.
chunks.clear();
161 for (
const auto id : subdomain_ids)
162 if (!mesh_subdomain_ids.count(
id))
163 paramError(
"blocks",
"The block ",
id,
" was not found on the mesh");
165 std::set<subdomain_id_type> subdomain_ids_set(subdomain_ids.begin(), subdomain_ids.end());
167 subdomain_partitioner.
chunks.push_back(subdomain_ids_set);
176 mooseAssert(
_partitioner.get(),
"Partitioner is a NULL object");
189 mooseAssert(
_partitioner.get(),
"Partitioner is a NULL object");
static InputParameters validParams()
MooseEnum _partitioner_name
virtual void prepareBlocksForSubdomainPartitioner(const MeshBase &mesh, libMesh::SubdomainPartitioner &subdomain_partitioner)
static InputParameters validParams()
virtual ~LibmeshPartitioner()
std::vector< std::set< subdomain_id_type > > chunks
std::vector< subdomain_id_type > getSubdomainIDs(const libMesh::MeshBase &mesh, const std::vector< SubdomainName > &subdomain_name)
Get the associated subdomainIDs for the subdomain names that are passed in.
registerMooseObject("MooseApp", LibmeshPartitioner)
std::unique_ptr< Partitioner > _partitioner
virtual void partition(MeshBase &mesh, const unsigned int n)
Factory & getFactory()
Retrieve a writable reference to the Factory associated with this App.
const std::vector< std::vector< SubdomainName > > & _subdomain_blocks
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
virtual std::unique_ptr< Partitioner > clone() const
MooseApp & _app
The MOOSE application this is associated with.
void paramError(const std::string ¶m, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
Base class for MOOSE partitioner.
virtual void _do_partition(MeshBase &mesh, const unsigned int n)
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
std::unique_ptr< T > clone(const T &object)
Clones the object object.
LibmeshPartitioner(const InputParameters ¶ms)