13 #include "libmesh/linear_partitioner.h" 14 #include "libmesh/centroid_partitioner.h" 15 #include "libmesh/parmetis_partitioner.h" 16 #include "libmesh/metis_partitioner.h" 17 #include "libmesh/hilbert_sfc_partitioner.h" 18 #include "libmesh/morton_sfc_partitioner.h" 19 #include "libmesh/subdomain_partitioner.h" 29 "metis=-2 parmetis=-1 linear=0 centroid hilbert_sfc morton_sfc subdomain_partitioner");
33 "Specifies a mesh partitioner to use when splitting the mesh for a parallel computation.");
37 "Specifies the sort direction if using the centroid partitioner. " 38 "Available options: x, y, z, radial");
39 params.
addParam<std::vector<std::vector<SubdomainName>>>(
40 "blocks", {},
"Block is seperated by ;, and partition mesh block by block. ");
46 _partitioner_name(getParam<
MooseEnum>(
"partitioner")),
47 _subdomain_blocks(getParam<
std::vector<
std::vector<SubdomainName>>>(
"blocks"))
65 "If using the centroid partitioner you _must_ specify centroid_partitioner_direction!");
67 MooseEnum direction = getParam<MooseEnum>(
"centroid_partitioner_direction");
70 _partitioner = std::make_unique<CentroidPartitioner>(CentroidPartitioner::X);
71 else if (direction ==
"y")
72 _partitioner = std::make_unique<CentroidPartitioner>(CentroidPartitioner::Y);
73 else if (direction ==
"z")
74 _partitioner = std::make_unique<CentroidPartitioner>(CentroidPartitioner::Z);
75 else if (direction ==
"radial")
76 _partitioner = std::make_unique<CentroidPartitioner>(CentroidPartitioner::RADIAL);
80 _partitioner = std::make_unique<HilbertSFCPartitioner>();
93 std::unique_ptr<Partitioner>
99 return std::make_unique<MetisPartitioner>();
102 return std::make_unique<ParmetisPartitioner>();
105 return std::make_unique<LinearPartitioner>();
111 "If using the centroid partitioner you _must_ specify centroid_partitioner_direction!");
113 MooseEnum direction = getParam<MooseEnum>(
"centroid_partitioner_direction");
115 if (direction ==
"x")
116 return std::make_unique<CentroidPartitioner>(CentroidPartitioner::X);
117 else if (direction ==
"y")
118 return std::make_unique<CentroidPartitioner>(CentroidPartitioner::Y);
119 else if (direction ==
"z")
120 return std::make_unique<CentroidPartitioner>(CentroidPartitioner::Z);
121 else if (direction ==
"radial")
122 return std::make_unique<CentroidPartitioner>(CentroidPartitioner::RADIAL);
126 return std::make_unique<HilbertSFCPartitioner>();
129 return std::make_unique<MortonSFCPartitioner>();
132 return std::make_unique<LibmeshPartitioner>(
parameters());
136 mooseError(
"Error in LibmeshPartitioner: Supplied partitioner option causes error in clone()");
137 return std::make_unique<MetisPartitioner>();
142 const MeshBase & mesh, SubdomainPartitioner & subdomain_partitioner)
145 std::set<subdomain_id_type> mesh_subdomain_ids;
146 mesh.subdomain_ids(mesh_subdomain_ids);
149 subdomain_partitioner.chunks.clear();
155 for (
const auto id : subdomain_ids)
156 if (!mesh_subdomain_ids.count(
id))
157 paramError(
"blocks",
"The block ",
id,
" was not found on the mesh");
159 std::set<subdomain_id_type> subdomain_ids_set(subdomain_ids.begin(), subdomain_ids.end());
161 subdomain_partitioner.chunks.push_back(subdomain_ids_set);
170 mooseAssert(
_partitioner.get(),
"Partitioner is a NULL object");
172 static_cast<SubdomainPartitioner &>(*
_partitioner.get()));
183 mooseAssert(
_partitioner.get(),
"Partitioner is a NULL object");
185 static_cast<SubdomainPartitioner &>(*
_partitioner.get()));
static InputParameters validParams()
MooseEnum _partitioner_name
static InputParameters validParams()
virtual ~LibmeshPartitioner()
virtual void prepareBlocksForSubdomainPartitioner(const MeshBase &mesh, SubdomainPartitioner &subdomain_partitioner)
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)
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
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.
const InputParameters & parameters() const
Get the parameters of the object.
LibmeshPartitioner(const InputParameters ¶ms)