20 std::vector<std::string>
const& variables,
21 std::vector<std::string>
const& expression_strings,
23 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>>
const&
27 auto const spatial_position_is_required =
29 auto const used_curve_names =
33 for (
int thread_id = 0; thread_id < num_threads; ++thread_id)
36 used_curve_names, curves,
42 std::vector<std::string>
const& variables,
43 bool const spatial_position_is_required,
44 std::vector<std::string>
const& used_curve_names,
46 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>>
const&
48 std::map<std::string, CurveWrapper>& curve_wrappers)
53 for (
auto const& v : variables)
57 symbol_table.create_variable(v);
68 std::vector<std::string>
const& variables,
69 bool const spatial_position_is_required,
70 std::vector<std::string>
const& used_curve_names,
72 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>>
const&
74 std::vector<std::string>
const& expression_strings)
85 "Function parameter: The internal PerThreadData is not "
86 "move-constructible.");
90 std::span<double> result)
const
93 int const thread_id = omp_get_thread_num();
95 int const thread_id = 0;
100 OGS_FATAL(
"Thread id {:d} exceeds allocated threads {:d}.", thread_id,
105 auto const& expressions = thread_data.value_expressions;
106 assert(result.size() == expressions.size());
108 auto const& cache = thread_data.symbol_table_cache;
111 cache.setTimeAndPosition(t, pos);
114 for (
unsigned i = 0; i < expressions.size(); ++i)
116 result[i] = expressions[i].value();
121 double const t)
const
123 std::vector<double> result(
std::vector< double > evaluate(SpatialPosition const &pos, double t) const
exprtk::symbol_table< double > SymbolTable
FunctionEvaluation(int num_threads, std::vector< std::string > const &variables, std::vector< std::string > const &expression_strings, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves)
int getNumberOfComponents() const
Number of components (number of compiled value expressions).
std::vector< PerThreadData > per_thread_data_
Per-thread evaluation context; indexed by omp_get_thread_num().
std::vector< exprtk::expression< T > > compileExpressions(exprtk::symbol_table< T > &symbol_table, std::vector< std::string > const &string_expressions)
bool isBuiltinSymbol(std::string_view const name)
static FunctionEvaluation::SymbolTable createSymbolTable(std::vector< std::string > const &variables, bool const spatial_position_is_required, std::vector< std::string > const &used_curve_names, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves, std::map< std::string, CurveWrapper > &curve_wrappers)
exprtk::symbol_table< double > createBaseSymbolTable(bool spatial_position_is_required)
void registerCurveWrappers(exprtk::symbol_table< double > &symbol_table, std::vector< std::string > const &curve_names, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves, std::map< std::string, CurveWrapper > &curve_wrappers)
std::vector< std::string > collectVariables(std::vector< std::string > const &expression_strings)
std::vector< std::string > collectUsedCurveNames(std::vector< std::string > const &expression_symbol_names, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves)
Returns the subset of expression_symbol_names that are keys in curves.
bool hasSpatialVariables(std::vector< std::string > const &variables)
std::map< std::string, CurveWrapper > curve_wrappers
Curve wrappers owned by this thread; must outlive symbol_table.
PerThreadData(std::vector< std::string > const &variables, bool spatial_position_is_required, std::vector< std::string > const &used_curve_names, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves, std::vector< std::string > const &expression_strings)
SymbolTableCache symbol_table_cache
Cached pointers to t, x, y, z inside symbol_table.
std::vector< Expression > value_expressions
Compiled value expressions. Must be destroyed before symbol_table.