OGS
MaterialPropertyLib::Function Class Referencefinal

Detailed Description

A function property defined by mathematical expression. For the evaluation of the expressions the exprtk library is used. In the expressions all variables defined in MaterialPropertyLib::Variable enum, t for time, x,y,z for the spatial position are supported, and curves from the <curves> section can be called using their names. A curve is a single argument function and can be used in an expression like curveA(sin(t)).

The evaluation is thread-safe for OpenMP by using per-thread storage.

Definition at line 24 of file Function.h.

#include <Function.h>

Inheritance diagram for MaterialPropertyLib::Function:
[legend]
Collaboration diagram for MaterialPropertyLib::Function:
[legend]

Classes

class  Implementation

Public Member Functions

 Function (std::string name, std::vector< std::string > const &value_string_expressions, std::vector< std::pair< std::string, std::vector< std::string > > > const &dvalue_string_expressions, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves)
PropertyDataType value (VariableArray const &variable_array, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
PropertyDataType dValue (VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
 ~Function ()
Public Member Functions inherited from MaterialPropertyLib::Property
virtual ~Property ()
virtual PropertyDataType initialValue (ParameterLib::SpatialPosition const &pos, double const t) const
virtual PropertyDataType value () const
virtual PropertyDataType value (VariableArray const &variable_array, VariableArray const &variable_array_prev, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
virtual PropertyDataType dValue (VariableArray const &variable_array, VariableArray const &variable_array_prev, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
virtual PropertyDataType d2Value (VariableArray const &variable_array, Variable const variable1, Variable const variable2, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
 Default implementation: 2nd derivative of any constant property is zero.
virtual void setProperties (std::vector< std::unique_ptr< Phase > > const &phases)
 Default implementation:
void setScale (std::variant< Medium *, Phase *, Component * > scale)
template<typename T>
initialValue (ParameterLib::SpatialPosition const &pos, double const t) const
template<typename T>
value () const
template<typename T>
value (VariableArray const &variable_array, VariableArray const &variable_array_prev, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
template<typename T>
value (VariableArray const &variable_array, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
template<typename T>
dValue (VariableArray const &variable_array, VariableArray const &variable_array_prev, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
template<typename T>
dValue (VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
template<typename T>
d2Value (VariableArray const &variable_array, Variable const &variable1, Variable const &variable2, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const

Private Member Functions

std::variant< Function::Implementation< 2 > *, Function::Implementation< 3 > * > getImplementationForDimensionOfVariableArray (VariableArray const &variable_array) const

Private Attributes

std::unique_ptr< Implementation< 2 > > impl2_
std::unique_ptr< Implementation< 3 > > impl3_
std::vector< Variablevariables_
 Variables used in the exprtk expressions.

Additional Inherited Members

Protected Attributes inherited from MaterialPropertyLib::Property
std::string name_
PropertyDataType value_
 The single value of a property.
PropertyDataType dvalue_
std::variant< Medium *, Phase *, Component * > scale_

Constructor & Destructor Documentation

◆ Function()

MaterialPropertyLib::Function::Function ( std::string name,
std::vector< std::string > const & value_string_expressions,
std::vector< std::pair< std::string, std::vector< std::string > > > const & dvalue_string_expressions,
std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const & curves )

Definition at line 452 of file Function.cpp.

460{
461 name_ = std::move(name);
462
463 auto const variables =
464 collectVariables(value_string_expressions, dvalue_string_expressions);
465
466 // filter the strings unrelated to time or spatial position
467 static std::unordered_set<std::string> filter_not_variables = {"t", "x",
468 "y", "z"};
469 for (auto const& curve : curves)
470 {
471 filter_not_variables.insert(curve.first);
472 }
473
474 variables_ =
475 variables |
476 std::views::filter([](const std::string& s)
477 { return !filter_not_variables.contains(s); }) |
478 std::views::transform([](std::string const& s)
479 { return convertStringToVariable(s); }) |
480 ranges::to<std::vector>;
481
482 auto const get_number_omp_threads = []()
483 {
484#ifdef _OPENMP
485 return omp_get_max_threads();
486#else
487 return 1;
488#endif
489 };
490
491 int const num_threads = std::max(BaseLib::getNumberOfAssemblyThreads(),
492 get_number_omp_threads());
493
494 impl2_ = std::make_unique<Implementation<2>>(
495 num_threads, variables, value_string_expressions,
496 dvalue_string_expressions, curves);
497 impl3_ = std::make_unique<Implementation<3>>(
498 num_threads, variables, value_string_expressions,
499 dvalue_string_expressions, curves);
500}
std::unique_ptr< Implementation< 3 > > impl3_
Definition Function.h:54
std::vector< Variable > variables_
Variables used in the exprtk expressions.
Definition Function.h:61
std::unique_ptr< Implementation< 2 > > impl2_
Definition Function.h:53
int getNumberOfAssemblyThreads()
static std::vector< std::string > collectVariables(std::vector< std::string > const &value_string_expressions, std::vector< std::pair< std::string, std::vector< std::string > > > const &dvalue_string_expressions)
Definition Function.cpp:422
Variable convertStringToVariable(std::string const &string)

References MaterialPropertyLib::collectVariables(), MaterialPropertyLib::convertStringToVariable(), BaseLib::getNumberOfAssemblyThreads(), impl2_, impl3_, MaterialPropertyLib::name, MaterialPropertyLib::Property::name_, and variables_.

◆ ~Function()

MaterialPropertyLib::Function::~Function ( )
default

Member Function Documentation

◆ dValue()

PropertyDataType MaterialPropertyLib::Function::dValue ( VariableArray const & variable_array,
Variable const variable,
ParameterLib::SpatialPosition const & pos,
double const t,
double const dt ) const
overridevirtual

This virtual method will compute the property derivative value based on the variables that are passed as arguments with the default implementation using empty variables array for the previous time step.

The default implementation of this method only returns the property value derivative without altering it.

Reimplemented from MaterialPropertyLib::Property.

Definition at line 549 of file Function.cpp.

553{
554#ifdef _OPENMP
555 int const thread_id = omp_get_thread_num();
556#else
557 int const thread_id = 0;
558#endif
559 return std::visit(
560 [&](auto&& impl_ptr)
561 {
562 if (thread_id >=
563 static_cast<int>(impl_ptr->dvalue_expressions.size()))
564 {
565 OGS_FATAL(
566 "In Function-type property '{:s}' evaluation the "
567 "OMP-thread with id {:d} exceeds the number of allocated "
568 "threads {:d}.",
569 name_, thread_id, impl_ptr->value_expressions.size());
570 }
571 auto const it = std::find_if(
572 begin(impl_ptr->dvalue_expressions[thread_id]),
573 end(impl_ptr->dvalue_expressions[thread_id]),
574 [&variable](auto const& v) { return v.first == variable; });
575
576 if (it == end(impl_ptr->dvalue_expressions[thread_id]))
577 {
578 OGS_FATAL(
579 "Requested derivative with respect to the variable {:s} "
580 "not "
581 "provided for Function-type property {:s}.",
582 variable_enum_to_string[static_cast<int>(variable)], name_);
583 }
584
585 return evaluateExpressions(variables_, variable_array, pos, t,
586 it->second,
587 impl_ptr->variable_arrays[thread_id],
588 impl_ptr->spatial_position_is_required);
589 },
591}
#define OGS_FATAL(...)
Definition Error.h:19
std::variant< Function::Implementation< 2 > *, Function::Implementation< 3 > * > getImplementationForDimensionOfVariableArray(VariableArray const &variable_array) const
Definition Function.cpp:503
static PropertyDataType evaluateExpressions(std::vector< Variable > const &variables, VariableArray const &new_variable_array, ParameterLib::SpatialPosition const &pos, double const t, std::vector< exprtk::expression< double > > const &expressions, VariableArray &variable_array, bool const spatial_position_is_required)
Definition Function.cpp:354
static const std::array< std::string, static_cast< int >(Variable::number_of_variables)> variable_enum_to_string

References MaterialPropertyLib::evaluateExpressions(), getImplementationForDimensionOfVariableArray(), MaterialPropertyLib::Property::name_, OGS_FATAL, MaterialPropertyLib::variable_enum_to_string, and variables_.

◆ getImplementationForDimensionOfVariableArray()

std::variant< Function::Implementation< 2 > *, Function::Implementation< 3 > * > MaterialPropertyLib::Function::getImplementationForDimensionOfVariableArray ( VariableArray const & variable_array) const
private

Definition at line 503 of file Function.cpp.

505{
506 if (variable_array.is2D())
507 {
508 return impl2_.get();
509 }
510 if (variable_array.is3D())
511 {
512 return impl3_.get();
513 }
514
515 OGS_FATAL(
516 "Variable array has vectors for 2 and 3 dimensions simultaneously. "
517 "Mixed dimensions cannot be dealt within Function evaluation.");
518}

References impl2_, impl3_, MaterialPropertyLib::VariableArray::is2D(), MaterialPropertyLib::VariableArray::is3D(), and OGS_FATAL.

Referenced by dValue(), and value().

◆ value()

PropertyDataType MaterialPropertyLib::Function::value ( VariableArray const & variable_array,
ParameterLib::SpatialPosition const & pos,
double const t,
double const dt ) const
overridevirtual

This virtual method will compute the property value based on the variables that are passed as arguments with the default implementation using empty variables array for the previous time step.

Reimplemented from MaterialPropertyLib::Property.

Definition at line 520 of file Function.cpp.

523{
524#ifdef _OPENMP
525 int const thread_id = omp_get_thread_num();
526#else
527 int const thread_id = 0;
528#endif
529 return std::visit(
530 [&](auto&& impl_ptr)
531 {
532 if (thread_id >=
533 static_cast<int>(impl_ptr->value_expressions.size()))
534 {
535 OGS_FATAL(
536 "In Function-type property '{:s}' evaluation the "
537 "OMP-thread with id {:d} exceeds the number of allocated "
538 "threads {:d}.",
539 name_, thread_id, impl_ptr->value_expressions.size());
540 }
541 return evaluateExpressions(variables_, variable_array, pos, t,
542 impl_ptr->value_expressions[thread_id],
543 impl_ptr->variable_arrays[thread_id],
544 impl_ptr->spatial_position_is_required);
545 },
547}

References MaterialPropertyLib::evaluateExpressions(), getImplementationForDimensionOfVariableArray(), MaterialPropertyLib::Property::name_, OGS_FATAL, and variables_.

Referenced by MaterialPropertyLib::Function::Implementation< D >::createSymbolTable().

Member Data Documentation

◆ impl2_

std::unique_ptr<Implementation<2> > MaterialPropertyLib::Function::impl2_
private

Definition at line 53 of file Function.h.

Referenced by Function(), and getImplementationForDimensionOfVariableArray().

◆ impl3_

std::unique_ptr<Implementation<3> > MaterialPropertyLib::Function::impl3_
private

Definition at line 54 of file Function.h.

Referenced by Function(), and getImplementationForDimensionOfVariableArray().

◆ variables_

std::vector<Variable> MaterialPropertyLib::Function::variables_
private

Variables used in the exprtk expressions.

Definition at line 61 of file Function.h.

Referenced by Function(), dValue(), and value().


The documentation for this class was generated from the following files: