https://mooseframework.inl.gov
SubdomainExtraElementIDGenerator.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
11 
13 
14 #include "MooseMeshUtils.h"
15 
16 #include "libmesh/elem.h"
17 
20 {
22  params.addRequiredParam<MeshGeneratorName>(
23  "input", "Name of an existing mesh generator to which we assign element IDs");
24  params.addRequiredParam<std::vector<SubdomainName>>("subdomains",
25  "Subdomain names present in the input mesh");
26  params.addRequiredParam<std::vector<std::string>>("extra_element_id_names",
27  "List of user-defined extra element ID names");
28  params.addRequiredParam<std::vector<std::vector<dof_id_type>>>(
29  "extra_element_ids",
30  "User-defined extra element IDs corresponding to 'subdomains' in the same order");
31 
32  params.addParam<std::vector<dof_id_type>>(
33  "default_extra_element_ids", "Default extra element IDs for elements not in 'subdomains'");
34 
35  params.addClassDescription(
36  "Assign extra element IDs for elements on a mesh based on mesh subdomains.");
37  return params;
38 }
39 
41  : MeshGenerator(params),
42  _input(getMesh("input")),
43  _subdomain_names(getParam<std::vector<SubdomainName>>("subdomains"))
44 {
45  if (_subdomain_names.size() == 0)
46  paramError("subdomains", "Empty subdomain vector provided!");
47 }
48 
49 std::unique_ptr<MeshBase>
51 {
52  std::unique_ptr<MeshBase> mesh = std::move(_input);
53 
54  // construct a map from the subdomain ID to the index in 'subdomains'
56 
57  // check that all subdomains are present
58  for (const auto & name : _subdomain_names)
60  paramError("subdomains", "Subdomain " + name + " does not exist in the mesh");
61 
62  // check to make sure no duplicated subdomain ids
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!");
67  else
68  unique_subdomain_ids.insert(id);
69 
70  std::map<SubdomainID, unsigned int> subdomains;
71  for (unsigned int i = 0; i < _subdomain_names.size(); ++i)
72  subdomains[subdomain_ids[i]] = i;
73 
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");
76 
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)
80  {
81  if (_subdomain_names.size() != element_id.size())
82  paramError("extra_element_ids", "Inconsistent vector size for element IDs");
83  }
84 
85  // get indices for all extra element integers
86  std::vector<unsigned int> extra_id_indices;
87  for (auto & element_id_name : element_id_names)
88  {
89  if (!mesh->has_elem_integer(element_id_name))
90  extra_id_indices.push_back(mesh->add_elem_integer(element_id_name));
91  else
92  extra_id_indices.push_back(mesh->get_elem_integer_index(element_id_name));
93  }
94 
95  if (isParamValid("default_extra_element_ids"))
96  {
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");
100 
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]);
104  }
105 
106  for (auto & elem : mesh->element_ptr_range())
107  {
108  SubdomainID id = elem->subdomain_id();
109  auto it = subdomains.find(id);
110  if (it == subdomains.end())
111  continue;
112 
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]);
115  }
116 
117  return mesh;
118 }
T & getMesh(MooseMesh &mesh)
function to cast mesh
Definition: SCM.h:35
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
SubdomainExtraElementIDGenerator(const InputParameters &parameters)
MeshBase & mesh
std::vector< subdomain_id_type > getSubdomainIDs(const libMesh::MeshBase &mesh, const std::vector< SubdomainName > &subdomain_name)
virtual const std::string & name() const
void addRequiredParam(const std::string &name, const std::string &doc_string)
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 &param, Args... args) const
static InputParameters validParams()
bool hasSubdomainName(const MeshBase &input_mesh, const SubdomainName &name)
void addClassDescription(const std::string &doc_string)