Loading [MathJax]/extensions/tex2jax.js
https://mooseframework.inl.gov
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
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.addClassDescription("Add a new extra element integer ID by finding unique combinations of "
32  "the existing extra element integer ID values");
33  return params;
34 }
35 
37  : MeshGenerator(params),
38  _input(getMesh("input")),
39  _extra_ids(getParam<std::vector<ExtraElementIDName>>("id_name")),
40  _use_new_id_rule(isParamValid("new_id_rule"))
41 {
42  if (_use_new_id_rule &&
43  getParam<std::vector<unsigned int>>("new_id_rule").size() != _extra_ids.size())
44  paramError("new_id_rule",
45  "This parameter, if provided, must have a length equal to length of id_name.");
46 }
47 
48 std::unique_ptr<MeshBase>
50 {
51  std::unique_ptr<MeshBase> mesh = std::move(_input);
53 
54  // override the extra ID values from MooseMeshUtils::getExtraIDUniqueCombinationMap by using
55  // new_id_rule
56  if (_use_new_id_rule)
57  {
58  std::vector<unsigned int> new_id_rule = getParam<std::vector<unsigned int>>("new_id_rule");
59  std::vector<unsigned int> existing_extra_id_index;
60  for (const auto & id_name : _extra_ids)
61  existing_extra_id_index.push_back(mesh->get_elem_integer_index(id_name));
62  for (auto & elem : mesh->active_local_element_ptr_range())
63  {
64  dof_id_type new_id_value = 0;
65  for (unsigned int i = 0; i < _extra_ids.size(); ++i)
66  new_id_value += new_id_rule[i] * elem->get_extra_integer(existing_extra_id_index[i]);
67  parsed_ids[elem->id()] = new_id_value;
68  }
69  }
70  auto new_id_name = getParam<ExtraElementIDName>("new_id_name");
71  unsigned int extra_id_index;
72  if (!mesh->has_elem_integer(new_id_name))
73  extra_id_index = mesh->add_elem_integer(new_id_name);
74  else
75  {
76  extra_id_index = mesh->get_elem_integer_index(new_id_name);
78  "new_id_name", "An element integer with the name '", new_id_name, "' already exists");
79  }
80  for (auto & elem : mesh->active_element_ptr_range())
81  elem->set_extra_integer(extra_id_index, parsed_ids.at(elem->id()));
82  return mesh;
83 }
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...
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...
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 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
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