https://mooseframework.inl.gov
KokkosParsedObjectBase.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 #pragma once
11 
12 #include "KokkosFunctionParser.h"
13 
14 #include "MooseObject.h"
15 
16 namespace Moose::Kokkos
17 {
18 
20 {
21 public:
23 
24  ParsedObjectBase(const MooseObject * object);
25 
26 protected:
32  template <typename T>
33  void checkDuplicateSymbols(const std::vector<T> & symbols, const std::string & param);
34 
40  void addConstant(const std::string & name, const Real constant);
46  void addScalar(const std::string & name, const Real & scalar);
52  void addField(const std::string & name, const VariableValue & field);
58  void addProperty(const std::string & name, const MaterialProperty<Real> & property);
64  void addFunction(const std::string & name, const Function & function);
65 
70  template <typename T>
71  void initParsed(T * obj, const std::vector<VariableName> & variable_names);
72 
76  const std::string & _expression;
80  std::shared_ptr<RPNBuilder> _builder;
88  std::unordered_map<std::string, Real> _constants;
92  std::unordered_map<std::string, std::reference_wrapper<const Real>> _scalars;
96  std::unordered_map<std::string, VariableValue> _fields;
100  std::unordered_map<std::string, MaterialProperty<Real>> _properties;
104  std::unordered_map<std::string, Function> _functions;
105 
106 private:
110  void finalize();
111 
119  std::unordered_set<std::string> _all_symbols;
120 };
121 
122 template <typename T>
123 void
124 ParsedObjectBase::checkDuplicateSymbols(const std::vector<T> & symbols, const std::string & param)
125 {
126  for (const auto & symbol : symbols)
127  {
128  if (_all_symbols.count(symbol))
129  _parsed_object->paramError(param, "Symbol '", symbol, "' was added multiple times.");
130 
131  _all_symbols.insert(symbol);
132  }
133 }
134 
135 template <typename T>
136 void
137 ParsedObjectBase::initParsed(T * obj, const std::vector<VariableName> & variable_names)
138 {
139  const auto & constant_names = obj->template getParam<std::vector<std::string>>("constant_names");
140  const auto & postprocessor_names =
141  obj->template getParam<std::vector<PostprocessorName>>("postprocessor_names");
142  const auto & property_names =
143  obj->template getParam<std::vector<MaterialPropertyName>>("material_property_names");
144  const auto & function_names = obj->template getParam<std::vector<FunctionName>>("function_names");
145  const auto & constant_expressions =
146  obj->template getParam<std::vector<Real>>("constant_expressions");
147 
148  for (const auto i : make_range(constant_names.size()))
149  addConstant(constant_names[i], constant_expressions[i]);
150 
151  for (const auto & pp : postprocessor_names)
152  addScalar(pp, obj->getPostprocessorValueByName(pp));
153 
154  for (const auto i : make_range(variable_names.size()))
155  addField(variable_names[i], obj->kokkosCoupledValue("coupled_variables", i));
156 
157  for (const auto & prop : property_names)
158  addProperty(prop, obj->template getKokkosMaterialPropertyByName<Real>(prop));
159 
160  for (const auto & func : function_names)
161  addFunction(func, obj->getKokkosFunctionByName(func));
162 
163  finalize();
164 }
165 
166 } // namespace Moose::Kokkos
std::string name(const ElemQuality q)
ParsedObjectBase(const MooseObject *object)
static InputParameters validParams()
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:467
std::unordered_map< std::string, VariableValue > _fields
Field variables used in the parsed expression.
std::unordered_map< std::string, std::reference_wrapper< const Real > > _scalars
Scalar variables used in the parsed expression.
const MooseObject * _parsed_object
Parsed object.
void addField(const std::string &name, const VariableValue &field)
Add a field variable.
void addProperty(const std::string &name, const MaterialProperty< Real > &property)
Add a material property.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
std::unordered_map< std::string, Function > _functions
Functions used in the parsed expression.
void addConstant(const std::string &name, const Real constant)
Add a constant.
void checkDuplicateSymbols(const std::vector< T > &symbols, const std::string &param)
Check if duplicate symbols were added.
The abstract class that provides polymorphic interfaces for a function.
std::unordered_set< std::string > _all_symbols
All symbols added to the parsed function.
Every object that can be built by the factory should be derived from this class.
Definition: MooseObject.h:28
void addScalar(const std::string &name, const Real &scalar)
Add a scalar variable.
The Kokkos wrapper classes for MOOSE-like variable value access.
Reverse Polish Notation (RPN) evaluator.
void initParsed(T *obj, const std::vector< VariableName > &variable_names)
Initialize symbols from parsed parameters.
RPNEvaluator _evaluator
Parsed function evaluator.
void addFunction(const std::string &name, const Function &function)
Add a function.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::unordered_map< std::string, MaterialProperty< Real > > _properties
Material properties used in the parsed expression.
std::shared_ptr< RPNBuilder > _builder
Parsed function builder.
IntRange< T > make_range(T beg, T end)
std::unordered_map< std::string, Real > _constants
Constants used in the parsed expression.
void finalize()
Finalize parsed function.
const std::string & _expression
Parsed expression.