OGS
TemperatureDependentFraction.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
5
7
9{
11 double const k,
12 double const T_c,
13 double const S_r)
14 : phase_change_shape_(k, T_c, S_r)
15{
16 name_ = std::move(name);
17}
18
20{
21 if (!std::holds_alternative<Medium*>(scale_))
22 {
24 "The property 'TemperatureDependantFraction' is "
25 "implemented on the 'medium' scale only.");
26 }
27}
28
30 VariableArray const& variable_array,
31 ParameterLib::SpatialPosition const& pos, double const t,
32 double const dt) const
33{
34 auto const T = variable_array.temperature;
35
36 auto const& medium = *std::get<Medium*>(scale_);
37 auto const& porosity = medium[PropertyType::porosity];
38
39 auto const phi =
40 std::get<double>(porosity.value(variable_array, pos, t, dt));
41
42 return phi * phase_change_shape_.value(T);
43}
44
46 VariableArray const& variable_array, Variable const variable,
47 ParameterLib::SpatialPosition const& pos, double const t,
48 double const dt) const
49{
50 (void)variable;
51 assert((variable == Variable::temperature) &&
52 "TemperatureDependantFraction::dvalue is implemented for "
53 "derivatives with respect to temperature only.");
54
55 auto const T = variable_array.temperature;
56
57 auto const& medium = *std::get<Medium*>(scale_);
58 auto const& porosity = medium[PropertyType::porosity];
59
60 auto const phi =
61 std::get<double>(porosity.value(variable_array, pos, t, dt));
62
63 return phi * phase_change_shape_.dValue(T);
64}
65
67 VariableArray const& variable_array, Variable const variable1,
68 Variable const variable2, ParameterLib::SpatialPosition const& pos,
69 double const t, double const dt) const
70{
71 (void)variable1;
72 assert((variable1 == Variable::temperature) &&
73 "TemperatureDependantFraction::d2value is implemented for "
74 "derivatives with respect to temperature only.");
75
76 (void)variable2;
77 assert((variable2 == Variable::temperature) &&
78 "TemperatureDependantFraction::d2value is implemented for "
79 "derivatives with respect to temperature only.");
80
81 auto const T = variable_array.temperature;
82
83 auto const& medium = *std::get<Medium*>(scale_);
84 auto const& porosity = medium[PropertyType::porosity];
85
86 auto const phi =
87 std::get<double>(porosity.value(variable_array, pos, t, dt));
88
89 return phi * phase_change_shape_.d2Value(T);
90}
91} // namespace MaterialPropertyLib
#define OGS_FATAL(...)
Definition Error.h:19
virtual PropertyDataType value() const
std::variant< Medium *, Phase *, Component * > scale_
PropertyDataType d2Value(VariableArray const &variable_array, Variable const variable1, Variable const variable2, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
Default implementation: 2nd derivative of any constant property is zero.
PropertyDataType dValue(VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
TemperatureDependentFraction(std::string name, double const k, double const T_c, double const S_r)
constexpr double T_c
Critical temperature.
std::variant< double, Eigen::Matrix< double, 2, 1 >, Eigen::Matrix< double, 3, 1 >, Eigen::Matrix< double, 2, 2 >, Eigen::Matrix< double, 3, 3 >, Eigen::Matrix< double, 4, 1 >, Eigen::Matrix< double, 6, 1 >, Eigen::MatrixXd > PropertyDataType