https://mooseframework.inl.gov
ParsedMaterialBase.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 "ParsedMaterialBase.h"
11 #include "ParsedAux.h"
12 #include "MooseObject.h"
13 
16 {
18  params.addCoupledVar("coupled_variables", "Vector of variables used in the parsed function");
19 
20  // Constants and their values
21  params.addParam<std::vector<std::string>>(
22  "constant_names",
23  std::vector<std::string>(),
24  "Vector of constants used in the parsed function (use this for kB etc.)");
25  params.addParam<std::vector<std::string>>(
26  "constant_expressions",
27  std::vector<std::string>(),
28  "Vector of values for the constants in constant_names (can be an FParser expression)");
29 
30  // Variables with applied tolerances and their tolerance values
31  params.addParam<std::vector<std::string>>("tol_names",
32  std::vector<std::string>(),
33  "Vector of variable names to be protected from "
34  "being 0 or 1 within a tolerance (needed for log(c) "
35  "and log(1-c) terms)");
36  params.addParam<std::vector<Real>>("tol_values",
37  std::vector<Real>(),
38  "Vector of tolerance values for the variables in tol_names");
39 
40  // Functors and their symbols
41  params.addParam<std::vector<MooseFunctorName>>(
42  "functor_names", {}, "Functors to use in the parsed expression");
43  params.addParam<std::vector<std::string>>(
44  "functor_symbols",
45  {},
46  "Symbolic name to use for each functor in 'functor_names' in the parsed expression. If not "
47  "provided, then the actual functor names will be used in the parsed expression.");
48 
49  // Material properties
50  params.addParam<std::vector<std::string>>(
51  "material_property_names",
52  std::vector<std::string>(),
53  "Vector of material properties used in the parsed function");
54 
55  // Postprocessors
56  params.addParam<std::vector<PostprocessorName>>(
57  "postprocessor_names",
58  std::vector<PostprocessorName>(),
59  "Vector of postprocessor names used in the parsed function");
60 
61  // Function expression
62  params.addDeprecatedCustomTypeParam<std::string>(
63  "function",
64  "FunctionExpression",
65  "Parsed function (see FParser) expression for the parsed material",
66  "'function' is deprecated, use 'expression' instead");
67  // TODO Make required once deprecation is handled, see #19119
68  params.addCustomTypeParam<std::string>(
69  "expression",
70  "FunctionExpression",
71  "Parsed function (see FParser) expression for the parsed material");
72 
73  return params;
74 }
75 
77  : _derived_object(obj),
78  _function_param(parameters.isParamValid("function") ? "function" : "expression"),
79  _function(parameters.get<std::string>(_function_param))
80 {
81  // get constant vectors
82  _constant_names = parameters.get<std::vector<std::string>>("constant_names");
83  _constant_expressions = parameters.get<std::vector<std::string>>("constant_expressions");
84 
85  // get tolerance vectors
86  _tol_names = parameters.get<std::vector<std::string>>("tol_names");
87  _tol_values = parameters.get<std::vector<Real>>("tol_values");
88 
89  // get functor vectors
90  _functor_names = parameters.get<std::vector<MooseFunctorName>>("functor_names");
91  _functor_symbols = parameters.get<std::vector<std::string>>("functor_symbols");
92 
93  // validate all vector names (constants, tolerances, and functors)
95 }
96 
97 void
98 ParsedMaterialBase::validateVectorNames(const std::set<std::string> & reserved_names)
99 {
100  // helper method to raise an paramError
101  auto raiseErr = [this](std::string param_name, std::string msg)
102  {
103  if (_derived_object != nullptr)
104  _derived_object->paramError(param_name, msg);
105  else
106  mooseException(msg);
107  };
108 
109  auto hasDuplicates = [](const std::vector<std::string> & values)
110  {
111  std::set<std::string> s(values.begin(), values.end());
112  return values.size() != s.size();
113  };
114 
115  // helper function to check if the name given is one of the constants
116  auto isKnownConstantName = [this](const std::string & name)
117  {
118  return (
119  _constant_names.size() &&
120  (std::find(_constant_names.begin(), _constant_names.end(), name) != _constant_names.end()));
121  };
122 
123  // helper function to check if the name given is one of the reserved_names
124  auto isReservedName = [reserved_names](const std::string & name)
125  { return reserved_names.find(name) != reserved_names.end(); };
126 
127  // check constants
128  if (hasDuplicates(_constant_names))
129  raiseErr("constant_names", "In the constants duplicate names are not permitted.");
130  for (const auto & name : _constant_names)
131  {
132  if (isReservedName(name))
133  raiseErr("constant_names", "In constants, the name '" + name + "' is not permitted.");
134  }
135 
136  // check tolerance vectors
137  if (hasDuplicates(_tol_names))
138  raiseErr("tol_names", "In the tolerances duplicate names are not permitted.");
139 
140  // check functor vectors
141  if (_functor_symbols.empty())
142  {
143  if (!_functor_names.empty())
144  raiseErr("functor_names", "functor_symbols must be the same length as functor_names.");
145  }
146  else
147  {
148  if (_functor_symbols.size() != _functor_names.size())
149  raiseErr("functor_names", "functor_symbols must be the same length as functor_names.");
150  std::vector<std::string> names;
151  if (_functor_symbols.empty())
152  std::copy(_functor_names.begin(), _functor_names.end(), std::back_inserter(names));
153  else
154  std::copy(_functor_symbols.begin(), _functor_symbols.end(), std::back_inserter(names));
155  if (hasDuplicates(names))
156  raiseErr(_functor_symbols.empty() ? "functor_names" : "functor_symbols",
157  "In functors, duplicate names are not permitted.");
158  for (const auto & name : names)
159  {
160  if (isKnownConstantName(name))
161  raiseErr(_functor_symbols.empty() ? "functor_names" : "functor_symbols",
162  "In functors, the name '" + name + "' is already in use as a constant.");
163  if (isReservedName(name))
164  raiseErr(_functor_symbols.empty() ? "functor_names" : "functor_symbols",
165  "In functors, the name '" + name + "' is not permitted.");
166  }
167  }
168 }
std::vector< std::string > _constant_expressions
std::string name(const ElemQuality q)
std::vector< std::string > _constant_names
constant vectors
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:30
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:439
static InputParameters validParams()
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.
T * get(const std::unique_ptr< T > &u)
The MooseUtils::get() specializations are used to support making forwards-compatible code changes fro...
Definition: MooseUtils.h:1135
void addCustomTypeParam(const std::string &name, const T &value, const std::string &custom_type, const std::string &doc_string)
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
InputParameters emptyInputParameters()
ParsedMaterialBase(const InputParameters &parameters, const MooseObject *obj)
std::vector< std::string > _tol_names
tolerance vectors
void validateVectorNames(const std::set< std::string > &reserved_names={})
Function to ensure that the names of constants, tolerances, and functors do not overlap with each oth...
Every object that can be built by the factory should be derived from this class.
Definition: MooseObject.h:28
std::vector< std::string > _functor_symbols
void addCoupledVar(const std::string &name, const std::string &doc_string)
This method adds a coupled variable name pair.
void addDeprecatedCustomTypeParam(const std::string &name, const std::string &custom_type, const std::string &doc_string, const std::string &deprecation_msg)
const MooseObject *const _derived_object
Pointer to the MooseObject (to call paramError)
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...
std::vector< MooseFunctorName > _functor_names
Functor vectors (names, count, and symbols)
std::vector< Real > _tol_values