https://mooseframework.inl.gov
ParsedSubdomainGeneratorBase.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 "Conversion.h"
12 #include "MooseMeshUtils.h"
13 #include "CastUniquePointer.h"
14 
15 #include "libmesh/fparser_ad.hh"
16 #include "libmesh/elem.h"
17 
20 {
23 
24  params.addRequiredParam<MeshGeneratorName>("input", "The mesh we want to modify");
25  params.addRequiredParam<std::string>(
26  "expression", "Parsed expression to determine the subdomain id of each involved element");
27  params.addParam<std::vector<SubdomainName>>(
28  "excluded_subdomains",
29  "A set of subdomain names that will be immune to change if set. This cannot be used together "
30  "with included_subdomains.");
31  params.addDeprecatedParam<std::vector<subdomain_id_type>>(
32  "excluded_subdomain_ids",
33  "A set of subdomain ids that will not changed even if "
34  "they are inside/outside the combinatorial geometry",
35  "excluded_subdomain_ids is deprecated, use excluded_subdomains (ids or names accepted)");
36  params.addParam<std::vector<SubdomainName>>(
37  "included_subdomains",
38  "A set of subdomain names that will only be subjected to change if set. This cannot be used "
39  "together with excluded_subdomains.");
40  params.addParam<std::vector<std::string>>(
41  "constant_names", {}, "Vector of constants used in the parsed function");
42  params.addParam<std::vector<std::string>>(
43  "constant_expressions",
44  {},
45  "Vector of values for the constants in constant_names (can be an FParser expression)");
46  params.addParam<std::vector<ExtraElementIDName>>(
47  "extra_element_id_names", {}, "Extra element integers used in the parsed expression");
48  params.addClassDescription("A base class for mesh generators that Use a parsed expression to "
49  "assign new subdomain id(s).");
50 
51  return params;
52 }
53 
55  : MeshGenerator(parameters),
56  FunctionParserUtils<false>(parameters),
57  _input(getMesh("input")),
58  _function(parameters.get<std::string>("expression")),
59  _excluded_ids(isParamValid("excluded_subdomain_ids")
60  ? parameters.get<std::vector<subdomain_id_type>>("excluded_subdomain_ids")
61  : std::vector<subdomain_id_type>()),
62  _eeid_names(getParam<std::vector<ExtraElementIDName>>("extra_element_id_names"))
63 {
64  if ((isParamValid("excluded_subdomains") || isParamValid("excluded_subdomain_ids")) &&
65  (isParamValid("included_subdomains")))
66  paramError("excluded_subdomains",
67  "You cannot use both excluded_subdomains and included_subdomains at the same time.");
68 
70 }
71 
72 std::unique_ptr<MeshBase>
74 {
75  std::unique_ptr<MeshBase> mesh = std::move(_input);
76 
77  // Make sure subdomain caches are up to date
78  if (!mesh->preparation().has_cached_elem_data)
79  mesh->cache_elem_data();
80 
81  // the extra element ids would not have existed at construction so we only do this now
82  for (const auto & eeid_name : _eeid_names)
83  _eeid_indices.push_back(mesh->get_elem_integer_index(eeid_name));
84 
85  if (isParamValid("excluded_subdomains"))
86  {
87  auto excluded_subdomains = parameters().get<std::vector<SubdomainName>>("excluded_subdomains");
88 
89  // check that the subdomains exist in the mesh
90  for (const auto & name : excluded_subdomains)
92  paramError("excluded_subdomains", "The block '", name, "' was not found in the mesh");
93 
94  _excluded_ids = MooseMeshUtils::getSubdomainIDs(*mesh, excluded_subdomains);
95  }
96  else if (isParamValid("included_subdomains"))
97  {
98  auto included_subdomains = parameters().get<std::vector<SubdomainName>>("included_subdomains");
99 
100  // check that the subdomains exist in the mesh
101  for (const auto & name : included_subdomains)
103  paramError("included_subdomains", "The block '", name, "' was not found in the mesh");
104 
105  auto included_ids = MooseMeshUtils::getSubdomainIDs(*mesh, included_subdomains);
106 
107  // collect all subdomain ids in the mesh
108  std::set<subdomain_id_type> mesh_sids;
109  mesh->subdomain_ids(mesh_sids);
110 
111  // set excluded ids to all mesh sids that are not in included ids
112  for (const auto & sid : mesh_sids)
113  if (std::find(included_ids.begin(), included_ids.end(), sid) == included_ids.end())
114  _excluded_ids.push_back(sid);
115  }
116 
117  // Loop over the elements
118  for (const auto & elem : mesh->active_element_ptr_range())
119  assignElemSubdomainID(elem);
120 
121  // Assign block name, if applicable
123 
124  mesh->unset_is_prepared();
125  return dynamic_pointer_cast<MeshBase>(mesh);
126 }
127 
128 void
129 ParsedSubdomainGeneratorBase::functionInitialize(const std::string & function_expression)
130 {
131  // add the extra element integers
132  std::string symbol_str = "x,y,z";
133  for (const auto & eeid_name : _eeid_names)
134  symbol_str += "," + eeid_name;
135 
136  // Create parsed function
137  _func_F = std::make_shared<SymFunction>();
139  function_expression,
140  symbol_str,
141  getParam<std::vector<std::string>>("constant_names"),
142  getParam<std::vector<std::string>>("constant_expressions"),
143  comm());
144 
145  _func_params.resize(3 + _eeid_names.size());
146 }
std::vector< unsigned int > _eeid_indices
Indices of the extra element ids used in the parsed expression.
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Find a value in an array.
Definition: KokkosUtils.h:40
const std::vector< ExtraElementIDName > _eeid_names
Names of the extra element ids used in the parsed expression.
void addDeprecatedParam(const std::string &name, const T &value, const std::string &doc_string, const std::string &deprecation_message)
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 ...
Definition: MooseBase.h:467
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
Definition: MooseBase.h:416
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
const InputParameters & parameters() const
Get the parameters of the object.
Definition: MooseBase.h:131
const std::string _function
function expression
MeshBase & mesh
std::vector< subdomain_id_type > _excluded_ids
A list of excluded subdomain ids that will not be changed even if they are in the combinatorial geome...
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
const Parallel::Communicator & comm() const
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
These are reworked from https://stackoverflow.com/a/11003103.
void functionInitialize(const std::string &function_expression)
Initialize the function parser object.
std::vector< subdomain_id_type > getSubdomainIDs(const libMesh::MeshBase &mesh, const std::vector< SubdomainName > &subdomain_name)
Get the associated subdomainIDs for the subdomain names that are passed in.
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...
ParsedSubdomainGeneratorBase(const InputParameters &parameters)
const std::string & name() const
Get the name of the class.
Definition: MooseBase.h:103
virtual void setBlockName(std::unique_ptr< MeshBase > &)
virtual void assignElemSubdomainID(Elem *elem)=0
void parsedFunctionSetup(SymFunctionPtr &function, const std::string &expression, const std::string &variables, const std::vector< std::string > &constant_names, const std::vector< std::string > &constant_expressions, const libMesh::Parallel::Communicator &comm) const
Performs setup steps on a SymFunction.
static InputParameters validParams()
Definition: MeshGenerator.C:23
std::unique_ptr< MeshBase > & _input
mesh to set the subdomains on
SymFunctionPtr _func_F
function parser object describing the combinatorial geometry
bool hasSubdomainName(const MeshBase &input_mesh, const SubdomainName &name)
Whether a particular subdomain name exists in the mesh.
std::vector< GenericReal< is_ad > > _func_params
Array to stage the parameters passed to the functions when calling Eval.
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...
static InputParameters validParams()
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...
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
Definition: MooseBase.h:209
std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
MeshGenerators are objects that can modify or add to an existing mesh.
Definition: MeshGenerator.h:33
const Elem & get(const ElemType type_in)