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
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 ...
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
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.
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 and optionally a file path to the top-level block p...
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
std::unique_ptr< T > clone(const T &object)
Clones the object object.
LibmeshPartitioner(const InputParameters ¶ms)