https://mooseframework.inl.gov
UniqueExtraIDMeshGenerator.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 #include "MooseMeshUtils.h"
12 #include "libmesh/elem.h"
13 
15 
18 {
20  params.addRequiredParam<MeshGeneratorName>(
21  "input", "Name of an existing mesh generator to which we assign extra element IDs");
22  params.addRequiredParam<std::vector<ExtraElementIDName>>(
23  "id_name",
24  "Existing extra integer ID names that is used to generate a new extra integer ID by finding "
25  "unique combinations of their values");
26  params.addRequiredParam<ExtraElementIDName>("new_id_name", "New extra integer ID name");
27  params.addParam<std::vector<unsigned int>>(
28  "new_id_rule",
29  "Vector of unsigned integers to determine new integer ID values by multiplying the provided "
30  "integers to the corresponding existing ID values and then summing the resulting values");
31  params.addParam<std::vector<SubdomainName>>(
32  "restricted_subdomains", "Only set new extra element id for elements in given subdomains");
33  params.addClassDescription("Add a new extra element integer ID by finding unique combinations of "
34  "the existing extra element integer ID values");
35  return params;
36 }
37 
39  : MeshGenerator(params),
40  _input(getMesh("input")),
41  _extra_ids(getParam<std::vector<ExtraElementIDName>>("id_name")),
42  _use_new_id_rule(isParamValid("new_id_rule")),
43  _has_restriction(isParamValid("restricted_subdomains"))
44 {
45  if (_use_new_id_rule &&
46  getParam<std::vector<unsigned int>>("new_id_rule").size() != _extra_ids.size())
47  paramError("new_id_rule",
48  "This parameter, if provided, must have a length equal to length of id_name.");
49 }
50 
51 std::unique_ptr<MeshBase>
53 {
54  std::unique_ptr<MeshBase> mesh = std::move(_input);
55 
56  std::set<SubdomainID> restricted_ids;
57  if (_has_restriction)
58  {
59  auto names = getParam<std::vector<SubdomainName>>("restricted_subdomains");
60  for (auto & name : names)
61  {
62  // check that the subdomain exists in the mesh
64  paramError("restricted_subdomains", "The block '", name, "' was not found in the mesh");
65 
66  restricted_ids.insert(MooseMeshUtils::getSubdomainID(name, *mesh));
67  }
68  }
69 
70  auto parsed_ids =
72 
73  // override the extra ID values from MooseMeshUtils::getExtraIDUniqueCombinationMap by using
74  // new_id_rule
75  if (_use_new_id_rule)
76  {
77  std::vector<unsigned int> new_id_rule = getParam<std::vector<unsigned int>>("new_id_rule");
78  std::vector<unsigned int> existing_extra_id_index;
79  for (const auto & id_name : _extra_ids)
80  existing_extra_id_index.push_back(mesh->get_elem_integer_index(id_name));
81  for (auto & elem : mesh->active_local_element_ptr_range())
82  {
83  dof_id_type new_id_value = 0;
84  for (unsigned int i = 0; i < _extra_ids.size(); ++i)
85  new_id_value += new_id_rule[i] * elem->get_extra_integer(existing_extra_id_index[i]);
86  parsed_ids[elem->id()] = new_id_value;
87  }
88  }
89  auto new_id_name = getParam<ExtraElementIDName>("new_id_name");
90  unsigned int extra_id_index;
91  if (!mesh->has_elem_integer(new_id_name))
92  extra_id_index = mesh->add_elem_integer(new_id_name);
93  else
94  {
95  extra_id_index = mesh->get_elem_integer_index(new_id_name);
97  "new_id_name", "An element integer with the name '", new_id_name, "' already exists");
98  }
99 
100  for (auto & elem : mesh->active_element_ptr_range())
101  {
102  if (_has_restriction && restricted_ids.count(elem->subdomain_id()) == 0)
103  continue;
104  elem->set_extra_integer(extra_id_index, parsed_ids.at(elem->id()));
105  }
106  return mesh;
107 }
const std::vector< ExtraElementIDName > _extra_ids
existing extra ID names to be used for adding a new extra ID
std::unordered_map< dof_id_type, dof_id_type > getExtraIDUniqueCombinationMap(const MeshBase &mesh, const std::set< SubdomainID > &block_ids, std::vector< ExtraElementIDName > extra_ids)
Crate a new set of element-wise IDs by finding unique combinations of existing extra ID values...
std::unique_ptr< MeshBase > & _input
input mesh for adding element IDs
MeshBase & mesh
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
virtual const std::string & name() const
Get the name of the class.
Definition: MooseBase.h:57
void addRequiredParam(const std::string &name, const std::string &doc_string)
This method adds a parameter and documentation string to the InputParameters object that will be extr...
SubdomainID getSubdomainID(const SubdomainName &subdomain_name, const MeshBase &mesh)
Gets the subdomain ID associated with the given SubdomainName.
static InputParameters validParams()
virtual std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
UniqueExtraIDMeshGenerator(const InputParameters &parameters)
const bool _use_new_id_rule
lag to indicate if new_id_rule is defined
const bool _has_restriction
Whether or not we add the new extra ID for elements in certain subdomains.
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
void paramError(const std::string &param, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
static InputParameters validParams()
Definition: MeshGenerator.C:23
bool hasSubdomainName(const MeshBase &input_mesh, const SubdomainName &name)
Whether a particular subdomain name exists in the mesh.
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump...
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object...
registerMooseObject("MooseApp", UniqueExtraIDMeshGenerator)
void paramWarning(const std::string &param, Args... args) const
Emits a warning prefixed with the file and line number of the given param (from the input file) along...
MeshGenerators are objects that can modify or add to an existing mesh.
Definition: MeshGenerator.h:32
Add a new extra ID by finding unique combinations of existing extra ID values.
uint8_t dof_id_type