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  : _function_param(parameters.isParamValid("function") ? "function" : "expression"),
78  _function(parameters.get<std::string>(_function_param))
79 {
80  // get constant vectors
81  _constant_names = parameters.get<std::vector<std::string>>("constant_names");
82  _constant_expressions = parameters.get<std::vector<std::string>>("constant_expressions");
83 
84  // get tolerance vectors
85  _tol_names = parameters.get<std::vector<std::string>>("tol_names");
86  _tol_values = parameters.get<std::vector<Real>>("tol_values");
87 
88  // get functor vectors
89  _functor_names = parameters.get<std::vector<MooseFunctorName>>("functor_names");
90  _functor_symbols = parameters.get<std::vector<std::string>>("functor_symbols");
91 
92  // validate all vector names (constants, tolerances, and functors)
94 }
95 
96 void
97 ParsedMaterialBase::validateVectorNames(const std::set<std::string> & reserved_names)
98 {
99  // helper method to raise an paramError
100  auto raiseErr = [this](std::string param_name, std::string msg)
101  {
102  if (auto derived_object = dynamic_cast<MooseObject *>(this))
103  derived_object->paramError(param_name, msg);
104  else
105  mooseException(msg);
106  };
107 
108  auto hasDuplicates = [](const std::vector<std::string> & values)
109  {
110  std::set<std::string> s(values.begin(), values.end());
111  return values.size() != s.size();
112  };
113 
114  // helper function to check if the name given is one of the constants
115  auto isKnownConstantName = [this](const std::string & name)
116  {
117  return (
118  _constant_names.size() &&
119  (std::find(_constant_names.begin(), _constant_names.end(), name) != _constant_names.end()));
120  };
121 
122  // helper function to check if the name given is one of the reserved_names
123  auto isReservedName = [reserved_names](const std::string & name)
124  { return reserved_names.find(name) != reserved_names.end(); };
125 
126  // check constants
127  if (hasDuplicates(_constant_names))
128  raiseErr("constant_names", "In the constants duplicate names are not permitted.");
129  for (const auto & name : _constant_names)
130  {
131  if (isReservedName(name))
132  raiseErr("constant_names", "In constants, the name '" + name + "' is not permitted.");
133  }
134 
135  // check tolerance vectors
136  if (hasDuplicates(_tol_names))
137  raiseErr("tol_names", "In the tolerances duplicate names are not permitted.");
138 
139  // check functor vectors
140  if (_functor_symbols.empty())
141  {
142  if (!_functor_names.empty())
143  raiseErr("functor_names", "functor_symbols must be the same length as functor_names.");
144  }
145  else
146  {
147  if (_functor_symbols.size() != _functor_names.size())
148  raiseErr("functor_names", "functor_symbols must be the same length as functor_names.");
149  std::vector<std::string> names;
150  if (_functor_symbols.empty())
151  std::copy(_functor_names.begin(), _functor_names.end(), std::back_inserter(names));
152  else
153  std::copy(_functor_symbols.begin(), _functor_symbols.end(), std::back_inserter(names));
154  if (hasDuplicates(names))
155  raiseErr(_functor_symbols.empty() ? "functor_names" : "functor_symbols",
156  "In functors, duplicate names are not permitted.");
157  for (const auto & name : names)
158  {
159  if (isKnownConstantName(name))
160  raiseErr(_functor_symbols.empty() ? "functor_names" : "functor_symbols",
161  "In functors, the name '" + name + "' is already in use as a constant.");
162  if (isReservedName(name))
163  raiseErr(_functor_symbols.empty() ? "functor_names" : "functor_symbols",
164  "In functors, the name '" + name + "' is not permitted.");
165  }
166  }
167 }
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:40
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.
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()
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...
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)
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...
ParsedMaterialBase(const InputParameters &parameters)
std::vector< MooseFunctorName > _functor_names
Functor vectors (names, count, and symbols)
const Elem & get(const ElemType type_in)
std::vector< Real > _tol_values