https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
72std::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())
120
121 // Assign block name, if applicable
123
124 mesh->unset_is_prepared();
125 return dynamic_pointer_cast<MeshBase>(mesh);
126}
127
128void
129ParsedSubdomainGeneratorBase::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< GenericReal< is_ad > > _func_params
Array to stage the parameters passed to the functions when calling Eval.
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()
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
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.
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...
void addDeprecatedParam(const std::string &name, const T &value, const std::string &doc_string, const std::string &deprecation_message)
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.
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.
MeshGenerators are objects that can modify or add to an existing mesh.
static InputParameters validParams()
const InputParameters & parameters() const
Get the parameters of the object.
Definition MooseBase.h:131
const std::string & name() const
Get the name of the class.
Definition MooseBase.h:103
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:457
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
Definition MooseBase.h:406
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
Definition MooseBase.h:199
std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
std::unique_ptr< MeshBase > & _input
mesh to set the subdomains on
const std::string _function
function expression
virtual void setBlockName(std::unique_ptr< MeshBase > &)
ParsedSubdomainGeneratorBase(const InputParameters &parameters)
std::vector< unsigned int > _eeid_indices
Indices of the extra element ids used in the parsed expression.
const std::vector< ExtraElementIDName > _eeid_names
Names of the extra element ids used in the parsed expression.
void functionInitialize(const std::string &function_expression)
Initialize the function parser object.
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...
virtual void assignElemSubdomainID(Elem *elem)=0
SymFunctionPtr _func_F
function parser object describing the combinatorial geometry
const Parallel::Communicator & comm() const
MeshBase & mesh
bool hasSubdomainName(const MeshBase &input_mesh, const SubdomainName &name)
Whether a particular subdomain name exists in the mesh.
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.