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 29 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 458 of file Function.cpp.

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

559{
560#ifdef _OPENMP
561 int const thread_id = omp_get_thread_num();
562#else
563 int const thread_id = 0;
564#endif
565 return std::visit(
566 [&](auto&& impl_ptr)
567 {
568 if (thread_id >=
569 static_cast<int>(impl_ptr->dvalue_expressions.size()))
570 {
571 OGS_FATAL(
572 "In Function-type property '{:s}' evaluation the "
573 "OMP-thread with id {:d} exceeds the number of allocated "
574 "threads {:d}.",
575 name_, thread_id, impl_ptr->value_expressions.size());
576 }
577 auto const it = std::find_if(
578 begin(impl_ptr->dvalue_expressions[thread_id]),
579 end(impl_ptr->dvalue_expressions[thread_id]),
580 [&variable](auto const& v) { return v.first == variable; });
581
582 if (it == end(impl_ptr->dvalue_expressions[thread_id]))
583 {
584 OGS_FATAL(
585 "Requested derivative with respect to the variable {:s} "
586 "not "
587 "provided for Function-type property {:s}.",
588 variable_enum_to_string[static_cast<int>(variable)], name_);
589 }
590
591 return evaluateExpressions(variables_, variable_array, pos, t,
592 it->second,
593 impl_ptr->variable_arrays[thread_id],
594 impl_ptr->spatial_position_is_required);
595 },
597}
#define OGS_FATAL(...)
Definition Error.h:26
std::variant< Function::Implementation< 2 > *, Function::Implementation< 3 > * > getImplementationForDimensionOfVariableArray(VariableArray const &variable_array) const
Definition Function.cpp:509
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:360
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 509 of file Function.cpp.

511{
512 if (variable_array.is2D())
513 {
514 return impl2_.get();
515 }
516 if (variable_array.is3D())
517 {
518 return impl3_.get();
519 }
520
521 OGS_FATAL(
522 "Variable array has vectors for 2 and 3 dimensions simultaneously. "
523 "Mixed dimensions cannot be dealt within Function evaluation.");
524}

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 526 of file Function.cpp.

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

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 58 of file Function.h.

Referenced by Function(), and getImplementationForDimensionOfVariableArray().

◆ impl3_

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

Definition at line 59 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 66 of file Function.h.

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


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