15 #include "libmesh/fparser_ad.hh" 16 #include "libmesh/elem.h" 26 params.
addRequiredParam<MeshGeneratorName>(
"input",
"The mesh we want to modify");
28 "Function expression encoding a combinatorial geometry");
30 "Subdomain id to set for inside of the combinatorial");
31 params.
addParam<SubdomainName>(
"block_name",
32 "Subdomain name to set for inside of the combinatorial");
33 params.
addParam<std::vector<SubdomainName>>(
34 "excluded_subdomains",
35 "A set of subdomain names that will not changed even if " 36 "they are inside/outside the combinatorial geometry");
38 "excluded_subdomain_ids",
39 "A set of subdomain ids that will not changed even if " 40 "they are inside/outside the combinatorial geometry",
41 "excluded_subdomain_ids is deprecated, use excluded_subdomains (ids or names accepted)");
42 params.
addParam<std::vector<std::string>>(
43 "constant_names", {},
"Vector of constants used in the parsed function");
44 params.
addParam<std::vector<std::string>>(
45 "constant_expressions",
47 "Vector of values for the constants in constant_names (can be an FParser expression)");
48 params.
addParam<std::vector<ExtraElementIDName>>(
49 "extra_element_id_names", {},
"Extra element integers used in the parsed expression");
51 "Uses a parsed expression (`combinatorial_geometry`) to determine if an " 52 "element (via its centroid) is inside the region defined by the expression and " 53 "assigns a new block ID.");
61 _input(getMesh(
"input")),
62 _function(parameters.
get<
std::string>(
"combinatorial_geometry")),
64 _excluded_ids(isParamValid(
"excluded_subdomain_ids")
67 _eeid_names(getParam<
std::vector<ExtraElementIDName>>(
"extra_element_id_names"))
70 _func_F = std::make_shared<SymFunction>();
77 getParam<std::vector<std::string>>(
"constant_names"),
78 getParam<std::vector<std::string>>(
"constant_expressions"));
81 std::string symbol_str =
"x,y,z";
83 symbol_str +=
"," + eeid_name;
89 "\nin ParsedSubdomainMeshGenerator ",
97 std::unique_ptr<MeshBase>
100 std::unique_ptr<MeshBase>
mesh = std::move(
_input);
108 auto excluded_subdomains =
parameters().
get<std::vector<SubdomainName>>(
"excluded_subdomains");
111 for (
const auto &
name : excluded_subdomains)
113 paramError(
"excluded_subdomains",
"The block '",
name,
"' was not found in the mesh");
119 for (
const auto & elem :
mesh->active_element_ptr_range())
135 mesh->subdomain_name(
_block_id) = getParam<SubdomainName>(
"block_name");
137 mesh->set_isnt_prepared();
GenericReal< is_ad > evaluate(SymFunctionPtr &, const std::string &object_name="")
Evaluate FParser object and check EvalError.
std::unique_ptr< MeshBase > & _input
mesh to add the subdomain to
std::unique_ptr< MeshBase > generate() override
Generate / modify the mesh.
std::vector< unsigned int > _eeid_indices
Indices of the extra element ids used in the parsed expression.
registerMooseObject("MooseApp", ParsedSubdomainMeshGenerator)
T * get(const std::unique_ptr< T > &u)
The MooseUtils::get() specializations are used to support making forwards-compatible code changes fro...
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.
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.
static InputParameters validParams()
void addFParserConstants(SymFunctionPtr &parser, const std::vector< std::string > &constant_names, const std::vector< std::string > &constant_expressions)
add constants (which can be complex expressions) to the parser object
virtual const std::string & name() const
Get the name of the class.
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
const std::vector< ExtraElementIDName > _eeid_names
Names of the extra element ids used in the parsed expression.
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...
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
bool hasSubdomainName(MeshBase &input_mesh, const SubdomainName &name)
Whether a particular subdomain name exists in the mesh.
void paramError(const std::string ¶m, 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()
const std::string _function
function expression
ParsedSubdomainMeshGenerator(const InputParameters ¶meters)
std::vector< GenericReal< is_ad > > _func_params
Array to stage the parameters passed to the functions when calling Eval.
MeshGenerator for defining a Subdomain inside or outside of combinatorial geometry.
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
const InputParameters & parameters() const
Get the parameters of the object.
static InputParameters validParams()
const subdomain_id_type _block_id
Block ID to assign to the region.
SymFunctionPtr _func_F
function parser object describing the combinatorial geometry
MeshGenerators are objects that can modify or add to an existing mesh.
auto index_range(const T &sizable)
void setParserFeatureFlags(SymFunctionPtr &)
apply input paramters to internal feature flags of the parser object