114 const std::vector<std::string> & constant_names,
115 const std::vector<std::string> & constant_expressions,
116 const std::vector<std::string> & mat_prop_expressions,
117 const std::vector<std::string> & tol_names,
118 const std::vector<Real> & tol_values)
120 const std::vector<PostprocessorName> empty_pp_name_vector;
121 functionParse(function_expression,
123 constant_expressions,
124 mat_prop_expressions,
125 empty_pp_name_vector,
133 const std::string & function_expression,
134 const std::vector<std::string> & constant_names,
135 const std::vector<std::string> & constant_expressions,
136 const std::vector<std::string> & mat_prop_expressions,
137 const std::vector<PostprocessorName> & postprocessor_names,
138 const std::vector<std::string> & tol_names,
139 const std::vector<Real> & tol_values)
141 const std::vector<MooseFunctorName> empty_functor_vector;
142 const std::vector<std::string> empty_string_vector;
143 functionParse(function_expression,
145 constant_expressions,
146 mat_prop_expressions,
150 empty_functor_vector,
151 empty_string_vector);
157 const std::string & function_expression,
158 const std::vector<std::string> & constant_names,
159 const std::vector<std::string> & constant_expressions,
160 const std::vector<std::string> & mat_prop_expressions,
161 const std::vector<PostprocessorName> & postprocessor_names,
162 const std::vector<std::string> & tol_names,
163 const std::vector<Real> & tol_values,
164 const std::vector<MooseFunctorName> & functor_names,
165 const std::vector<std::string> & functor_symbols)
168 _func_F = std::make_shared<SymFunction>();
171 setParserFeatureFlags(_func_F);
174 addFParserConstants(_func_F, constant_names, constant_expressions);
177 if (_map_mode == VariableNameMappingMode::USE_PARAM_NAMES)
178 for (
const auto & acd : _arg_constant_defaults)
179 if (!_func_F->AddConstant(acd, this->_pars.defaultCoupledValue(acd)))
180 _params.mooseError(
"Invalid constant name in parsed function object");
185 case VariableNameMappingMode::USE_MOOSE_NAMES:
186 for (
unsigned int i = 0; i < _nargs; ++i)
187 _symbol_names[i] = _arg_names[i];
190 case VariableNameMappingMode::USE_PARAM_NAMES:
191 for (
unsigned i = 0; i < _nargs; ++i)
193 if (_arg_param_numbers[i] < 0)
194 _symbol_names[i] = _arg_param_names[i];
196 _symbol_names[i] = _arg_param_names[i] + std::to_string(_arg_param_numbers[i]);
201 _params.mooseError(
"Unknown variable mapping mode.");
205 if (tol_names.size() != tol_values.size())
206 _params.mooseError(
"The parameter vectors tol_names and tol_values must have equal length.");
210 for (
const auto i : make_range(_nargs))
215 for (
const auto j : index_range(tol_names))
216 if (_symbol_names[i] == tol_names[j])
218 _tol[i] = tol_values[j];
224 unsigned int nmat_props = mat_prop_expressions.size();
225 for (
const auto i : make_range(nmat_props))
228 _mat_prop_descriptors.emplace_back(
229 mat_prop_expressions[i],
this, _error_on_missing_material_properties);
232 _symbol_names.push_back(_mat_prop_descriptors.back().getSymbolName());
236 for (
const auto & pp : postprocessor_names)
238 _postprocessor_values.push_back(&this->getPostprocessorValueByName(pp));
239 _symbol_names.push_back(pp);
243 for (
const auto symbol : _extra_symbols)
246 case ExtraSymbols::x:
247 _symbol_names.push_back(
"x");
249 case ExtraSymbols::y:
250 _symbol_names.push_back(
"y");
252 case ExtraSymbols::z:
253 _symbol_names.push_back(
"z");
255 case ExtraSymbols::t:
256 _symbol_names.push_back(
"t");
258 case ExtraSymbols::dt:
259 _symbol_names.push_back(
"dt");
264 if (!functor_symbols.empty() && functor_symbols.size() != functor_names.size())
266 "The parameter vector functor_symbols must be of same length as functor_names, if "
268 _functors.resize(functor_names.size());
269 for (
const auto i : index_range(functor_names))
271 if (functor_symbols.empty())
273 auto functor_name = functor_names[i];
274 _symbol_names.push_back(functor_name);
275 _functors[i] = &FunctorInterface::getFunctor<Real>(functor_name);
279 auto functor_name = functor_names[i];
280 auto symbol_name = functor_symbols[i];
281 _symbol_names.push_back(symbol_name);
282 _functors[i] = &FunctorInterface::getFunctor<Real>(functor_name);
290 if (_func_F->Parse(function_expression, variables) >= 0)
291 parseError(
"Invalid parsed material function \"" + function_expression +
292 "\" with variables \"" + variables +
"\"; " + _func_F->ErrorMsg());
295 _func_params.resize(_nargs + nmat_props + _postprocessor_values.size() + _extra_symbols.size() +
296 functor_names.size());
301 if (_communicator.rank() != 0)
302 _communicator.barrier();
304 functionsPostParse();
307 if (_communicator.rank() == 0)
308 _communicator.barrier();
342 if (!(this->_compute))
344 for (
const auto i : make_range(_upstream_mat_names.size()))
345 _upstream_mat[i]->computePropertiesAtQp(_qp);
349 for (
const auto i : make_range(_nargs))
352 _func_params[i] = (*_args[i])[_qp];
355 auto a = (*_args[i])[_qp];
356 _func_params[i] = a < _tol[i] ? _tol[i] : (a > 1.0 - _tol[i] ? 1.0 - _tol[i] : a);
359 auto offset = _nargs;
362 for (
const auto i : index_range(_mat_prop_descriptors))
363 _func_params[i + offset] = _mat_prop_descriptors[i].value(_qp);
364 offset += _mat_prop_descriptors.size();
367 auto npps = _postprocessor_values.size();
368 for (MooseIndex(_postprocessor_values) i = 0; i < npps; ++i)
369 _func_params[i + offset] = *_postprocessor_values[i];
370 offset += _postprocessor_values.size();
373 for (
const auto i : index_range(_extra_symbols))
375 const auto j = offset + i;
376 switch (_extra_symbols[i])
378 case ExtraSymbols::x:
379 _func_params[j] = _q_point[_qp](0);
381 case ExtraSymbols::y:
382 _func_params[j] = _q_point[_qp](1);
384 case ExtraSymbols::z:
385 _func_params[j] = _q_point[_qp](2);
387 case ExtraSymbols::t:
388 _func_params[j] = _t;
390 case ExtraSymbols::dt:
391 _func_params[j] = _dt;
395 offset += _extra_symbols.size();
399 const Moose::ElemQpArg qp_arg = {_current_elem, _qp, _qrule, _q_point[_qp]};
400 for (
const auto i : index_range(_functors))
401 _func_params[offset + i] = (*_functors[i])(qp_arg, state);
405 (*_prop_F)[_qp] =
evaluate(_func_F, _name);