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"))
46 paramError(
"subdomains",
"Empty subdomain vector provided!");
49 std::unique_ptr<MeshBase>
52 std::unique_ptr<MeshBase>
mesh = std::move(
_input);
60 paramError(
"subdomains",
"Subdomain " +
name +
" does not exist in the mesh");
63 std::set<SubdomainID> unique_subdomain_ids;
64 for (
const auto &
id : subdomain_ids)
65 if (unique_subdomain_ids.count(
id) > 0)
66 paramError(
"subdomains",
"Cannot have subdomain with ID ",
id,
" listed more than once!");
68 unique_subdomain_ids.insert(
id);
70 std::map<SubdomainID, unsigned int> subdomains;
72 subdomains[subdomain_ids[i]] = i;
74 auto & element_id_names = getParam<std::vector<std::string>>(
"extra_element_id_names");
75 auto & element_ids = getParam<std::vector<std::vector<dof_id_type>>>(
"extra_element_ids");
77 if (element_id_names.size() != element_ids.size())
78 paramError(
"extra_element_ids",
"Inconsistent vector size for element IDs");
79 for (
auto & element_id : element_ids)
82 paramError(
"extra_element_ids",
"Inconsistent vector size for element IDs");
86 std::vector<unsigned int> extra_id_indices;
87 for (
auto & element_id_name : element_id_names)
89 if (!
mesh->has_elem_integer(element_id_name))
90 extra_id_indices.push_back(
mesh->add_elem_integer(element_id_name));
92 extra_id_indices.push_back(
mesh->get_elem_integer_index(element_id_name));
97 auto & default_ids = getParam<std::vector<dof_id_type>>(
"default_extra_element_ids");
98 if (default_ids.size() != element_id_names.size())
99 paramError(
"default_extra_element_ids",
"Inconsistent vector size for default element IDs");
101 for (
auto & elem :
mesh->element_ptr_range())
102 for (
unsigned int i = 0; i < element_ids.size(); ++i)
103 elem->set_extra_integer(extra_id_indices[i], default_ids[i]);
106 for (
auto & elem :
mesh->element_ptr_range())
109 auto it = subdomains.find(
id);
110 if (it == subdomains.end())
113 for (
unsigned int i = 0; i < element_ids.size(); ++i)
114 elem->set_extra_integer(extra_id_indices[i], element_ids[i][it->second]);
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 const std::string & name() const
virtual std::unique_ptr< MeshBase > generate() override
bool isParamValid(const std::string &name) const
const std::vector< SubdomainName > & _subdomain_names
subdomains that are to be assigned with element IDs
registerMooseObject("ReactorApp", SubdomainExtraElementIDGenerator)
std::unique_ptr< MeshBase > & _input
input mesh for adding element IDs
void paramError(const std::string ¶m, Args... args) const
static InputParameters validParams()
bool hasSubdomainName(const MeshBase &input_mesh, const SubdomainName &name)