16 #include "libmesh/elem.h" 23 "input",
"Name of an existing mesh generator to which we assign element IDs");
25 "Subdomain names present in the input mesh");
27 "List of user-defined extra element ID names");
30 "User-defined extra element IDs corresponding to 'subdomains' in the same order");
32 params.
addParam<std::vector<dof_id_type>>(
33 "default_extra_element_ids",
"Default extra element IDs for elements not in 'subdomains'");
36 "Assign extra element IDs for elements on a mesh based on mesh subdomains.");
43 _subdomain_names(getParam<
std::vector<SubdomainName>>(
"subdomains")),
44 _id_names(getParam<
std::vector<
std::string>>(
"extra_element_id_names")),
46 _defaults(queryParam<
std::vector<
dof_id_type>>(
"default_extra_element_ids"))
49 paramError(
"subdomains",
"Empty subdomain vector provided!");
52 "Inconsistent vector size for element IDs (must have same size as " 53 "'extra_element_id_names')");
57 "Inconsistent vector size for element IDs at index " + std::to_string(i) +
58 " (must have same size as 'subdomains')");
61 "Inconsistent vector size for default element IDs (must have same size as " 62 "'extra_element_id_names')");
65 std::unique_ptr<MeshBase>
68 std::unique_ptr<MeshBase>
mesh = std::move(
_input);
76 paramError(
"subdomains",
"Subdomain " +
name +
" does not exist in the mesh");
79 std::set<SubdomainID> unique_subdomain_ids;
80 for (
const auto &
id : subdomain_ids)
81 if (unique_subdomain_ids.count(
id) > 0)
82 paramError(
"subdomains",
"Cannot have subdomain with ID ",
id,
" listed more than once!");
84 unique_subdomain_ids.insert(
id);
86 std::map<SubdomainID, unsigned int> subdomains;
88 subdomains[subdomain_ids[i]] = i;
91 std::vector<unsigned int> extra_id_indices;
94 if (!
mesh->has_elem_integer(id_name))
95 extra_id_indices.push_back(
mesh->add_elem_integer(id_name));
97 extra_id_indices.push_back(
mesh->get_elem_integer_index(id_name));
100 for (
auto & elem :
mesh->element_ptr_range())
102 if (
const auto it = subdomains.find(elem->subdomain_id()); it != subdomains.end())
105 elem->set_extra_integer(extra_id_indices[i],
_ids[i][it->second]);
110 elem->set_extra_integer(extra_id_indices[i], (*
_defaults)[i]);
void paramError(const std::string ¶m, Args... args) const
T & getMesh(MooseMesh &mesh)
function to cast mesh
SubdomainExtraElementIDGenerator(const InputParameters ¶meters)
std::vector< subdomain_id_type > getSubdomainIDs(const libMesh::MeshBase &mesh, const std::vector< SubdomainName > &subdomain_name)
static InputParameters validParams()
virtual std::unique_ptr< MeshBase > generate() override
const std::vector< SubdomainName > & _subdomain_names
subdomains that are to be assigned with element IDs
const std::string & name() const
registerMooseObject("ReactorApp", SubdomainExtraElementIDGenerator)
const std::vector< std::string > & _id_names
The names for each ID from input.
std::unique_ptr< MeshBase > & _input
input mesh for adding element IDs
static InputParameters validParams()
const std::vector< dof_id_type > *const _defaults
The default IDs from input, if any.
bool hasSubdomainName(const MeshBase &input_mesh, const SubdomainName &name)
const std::vector< std::vector< dof_id_type > > & _ids
The IDs from input.
auto index_range(const T &sizable)