https://mooseframework.inl.gov
DepletionIDGenerator.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 
10 #include "DepletionIDGenerator.h"
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 element IDs");
22  params.addParam<std::vector<ExtraElementIDName>>("id_name", "Extra integer id names");
23  params.addParam<ExtraElementIDName>("material_id_name", "material_id", "Material id name");
24  params.addParam<std::vector<dof_id_type>>(
25  "exclude_material_id",
26  "Define a list of material IDs to be excluded in the depletion ID generation");
27  params.addParam<std::vector<ExtraElementIDName>>(
28  "exclude_id_name", "Extra ID names that need to be excluded in the depletion ID generation");
29  params.addParam<std::vector<std::vector<dof_id_type>>>(
30  "exclude_id_value", "Extra ID values corresponding to names defined in `exclude_id_name`");
31  params.addParam<ExtraElementIDName>(
32  "generated_id_name", "depletion_id", "The generated extra element integer name");
33  params.addClassDescription(
34  "This DepletionIDGenerator source code is to assign an extra element integer for "
35  "elements on a mesh based on material and other extra element IDs that is typically used for "
36  "depletion.");
37  return params;
38 }
40  : MeshGenerator(params),
41  _input(getMesh("input")),
42  _material_id_name(getParam<ExtraElementIDName>("material_id_name"))
43 {
44 }
45 
46 std::unique_ptr<MeshBase>
48 {
49  std::unique_ptr<MeshBase> mesh = std::move(_input);
50  // parsing the extra ids
51  std::vector<ExtraElementIDName> id_names;
52  id_names = getParam<std::vector<ExtraElementIDName>>("id_name");
53  if (!mesh->has_elem_integer(_material_id_name))
54  paramError("material_id_name",
55  "Material ID name '",
57  "'is not defined in input mesh!");
58  id_names.push_back(_material_id_name);
59  auto parsed_ids = MooseMeshUtils::getExtraIDUniqueCombinationMap(*mesh, {}, id_names);
60  // re-numbering if exclude_id_name is used
61  if (isParamValid("exclude_id_name") && isParamValid("exclude_id_value"))
62  {
63  const auto exclude_id_name = getParam<std::vector<ExtraElementIDName>>("exclude_id_name");
64  const auto & exclude_id_value =
65  getParam<std::vector<std::vector<dof_id_type>>>("exclude_id_value");
66  std::vector<unsigned int> id_index;
67  std::vector<std::set<dof_id_type>> id_value_set;
68  id_index.resize(exclude_id_name.size());
69  id_value_set.resize(exclude_id_name.size());
70  for (unsigned int i = 0; i < exclude_id_name.size(); ++i)
71  {
72  id_index[i] = mesh->get_elem_integer_index(exclude_id_name[i]);
73  std::copy(exclude_id_value[i].begin(),
74  exclude_id_value[i].end(),
75  std::inserter(id_value_set[i], id_value_set[i].end()));
76  }
77  // list of unique IDs not removed by "exclude_id_name" and "exclude_id_value" option
78  std::set<dof_id_type> ids;
79  for (const auto & elem : mesh->active_element_ptr_range())
80  {
81  // don't need to check if this unique parsed ID corresponding to this element is already in
82  // the "ids"
83  if (ids.count(parsed_ids[elem->id()]))
84  continue;
85  // check extra IDs of this element is defined in "exclude_id_name" and "exclude_id_value"
86  bool is_exclude_elem = false;
87  for (unsigned int i = 0; i < id_index.size(); ++i)
88  {
89  const auto id = elem->get_extra_integer(id_index[i]);
90  if (id_value_set[i].count(id))
91  {
92  is_exclude_elem = true;
93  break;
94  }
95  }
96  // if this element does not need to be excluded, having unique ID, add to "ids"
97  if (!is_exclude_elem)
98  ids.insert(parsed_ids[elem->id()]);
99  }
100  comm().set_union(ids);
101 
102  std::map<dof_id_type, dof_id_type> map_ids;
103  for (auto id : parsed_ids)
104  {
105  dof_id_type new_id = std::distance(ids.begin(), ids.find(id.second)) + 1;
106  map_ids[id.second] = new_id;
107  }
108 
109  // reassign parsed (depletion) ids
110  for (const auto & elem : mesh->active_element_ptr_range())
111  {
112  dof_id_type id = parsed_ids[elem->id()];
113  dof_id_type new_id = 0;
114  if (ids.count(id))
115  new_id = map_ids[id];
116  parsed_ids[elem->id()] = new_id;
117  }
118  }
119  // assign depletion id to mesh
120  const auto depletion_id =
121  mesh->add_elem_integer(getParam<ExtraElementIDName>("generated_id_name"));
122  for (Elem * const elem : mesh->active_element_ptr_range())
123  elem->set_extra_integer(depletion_id, parsed_ids.at(elem->id()));
124  return mesh;
125 }
std::unordered_map< dof_id_type, dof_id_type > getExtraIDUniqueCombinationMap(const MeshBase &mesh, const std::set< SubdomainID > &block_ids, std::vector< ExtraElementIDName > extra_ids)
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)
ExtraElementIDName _material_id_name
material id name
static InputParameters validParams()
MeshBase & mesh
const Parallel::Communicator & comm() const
DepletionIDGenerator(const InputParameters &parameters)
void addRequiredParam(const std::string &name, const std::string &doc_string)
bool isParamValid(const std::string &name) const
virtual std::unique_ptr< MeshBase > generate() override
void paramError(const std::string &param, Args... args) const
static InputParameters validParams()
Assigns depletion IDs to elements based on reporting and material IDs.
std::unique_ptr< MeshBase > & _input
input mesh for adding element IDs
registerMooseObject("ReactorApp", DepletionIDGenerator)
void addClassDescription(const std::string &doc_string)
uint8_t dof_id_type
void set_union(T &data, const unsigned int root_id) const