Line data Source code
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 "KokkosParsedFunction.h" 11 : 12 : #include "FEProblemBase.h" 13 : 14 : registerKokkosFunction("MooseApp", KokkosParsedFunction); 15 : 16 : InputParameters 17 3570 : KokkosParsedFunction::validParams() 18 : { 19 3570 : InputParameters params = FunctionBase::validParams(); 20 3570 : params += MooseParsedFunctionBase::validParams(); 21 21420 : params.addCustomTypeParam<std::string>( 22 : "expression", "FunctionExpression", "The user defined function."); 23 11416 : params.addParam<bool>( 24 5728 : "print_rpn", false, "Print parsed Reverse Polish Notation (RPN) for debugging."); 25 : 26 3570 : params.addClassDescription("Function created by parsing a string"); 27 : 28 3570 : return params; 29 0 : } 30 : 31 2482 : KokkosParsedFunction::KokkosParsedFunction(const InputParameters & parameters) 32 : : FunctionBase(parameters), 33 : MooseParsedFunctionBase(parameters), 34 370 : _expression(verifyFunction(getParam<std::string>("expression"))), 35 370 : _builder(std::make_unique<Moose::Kokkos::RPNBuilder>(_expression, &_console)), 36 1850 : _problem(*parameters.getCheckedPointerParam<FEProblemBase *>("_fe_problem_base")) 37 : { 38 722 : _builder->addDefaultVariables(); 39 : 40 722 : std::vector<std::string> symbol_names; 41 : 42 2166 : if (isParamValid("symbol_names")) 43 51 : symbol_names = getParam<std::vector<std::string>>("symbol_names"); 44 : 45 756 : for (const auto & name : symbol_names) 46 34 : _builder->addVariable(name); 47 : 48 722 : _builder->build(); 49 : 50 2166 : if (getParam<bool>("print_rpn")) 51 : { 52 17 : _console << std::endl 53 9 : << "Reverse Polish Notation (RPN) of KokkosParsedFunction " << name() << ":" 54 9 : << std::endl; 55 17 : _builder->printRPN(_console); 56 : } 57 722 : } 58 : 59 15368 : KokkosParsedFunction::KokkosParsedFunction(const KokkosParsedFunction & function) 60 : : FunctionBase(function), 61 : MooseParsedFunctionBase(function.parameters()), 62 12314 : _expression(function._expression), 63 12314 : _evaluator(function._evaluator), 64 24628 : _problem(function._problem) 65 : { 66 15368 : } 67 : 68 : void 69 722 : KokkosParsedFunction::initialSetup() 70 : { 71 722 : std::vector<std::string> symbol_names; 72 722 : std::vector<std::string> symbol_values; 73 : 74 2166 : if (isParamValid("symbol_names")) 75 51 : symbol_names = getParam<std::vector<std::string>>("symbol_names"); 76 2166 : if (isParamValid("symbol_values")) 77 51 : symbol_values = getParam<std::vector<std::string>>("symbol_values"); 78 : 79 722 : _symbol_values.reserve(symbol_values.size()); 80 722 : _symbol_functions.reserve(symbol_values.size()); 81 : 82 756 : for (const auto i : make_range(symbol_names.size())) 83 : { 84 34 : if (hasPostprocessorByName(symbol_values[i])) 85 17 : _builder->associateScalar(symbol_names[i], &getPostprocessorValueByName(symbol_values[i])); 86 17 : else if (_problem.hasKokkosFunction(symbol_values[i])) 87 : { 88 0 : _symbol_functions.push_back(_problem.getKokkosFunction(symbol_values[i])); 89 0 : _builder->associateFunction(symbol_names[i], &_symbol_functions.back()); 90 : } 91 17 : else if (MooseUtils::parsesToReal(symbol_values[i])) 92 : { 93 17 : _symbol_values.push_back(MooseUtils::convert<Real>(symbol_values[i])); 94 17 : _builder->associateScalar(symbol_names[i], &_symbol_values.back()); 95 : } 96 : else 97 0 : paramError("symbol_values", "Symbols cannot be scalar variables for now."); 98 : } 99 : 100 722 : _builder->finalize(); 101 : 102 : // Should be called after finalization 103 722 : _evaluator.init(*_builder); 104 722 : }