OGS
SaturationLiakopoulos.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
6#include <algorithm>
7#include <cmath>
8
10#include "MathLib/MathTools.h"
11
12namespace MaterialPropertyLib
13{
15 VariableArray const& variable_array,
16 ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/,
17 double const /*dt*/) const
18{
19 const double p_cap = variable_array.capillary_pressure;
20
21 if (p_cap < 0.)
22 {
23 return 1.;
24 }
25
26 return std::max(residual_liquid_saturation_,
27 1. - parameter_a_ * std::pow(p_cap, parameter_b_));
28}
29
31 VariableArray const& variable_array, Variable const variable,
32 ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/,
33 double const /*dt*/) const
34{
35 if (variable != Variable::capillary_pressure)
36 {
38 "SaturationLiakopoulos::dValue is implemented for derivatives with "
39 "respect to capillary pressure only.");
40 }
41
42 const double p_cap = variable_array.capillary_pressure;
43 if (p_cap <= 0.)
44 {
45 return 0.;
46 }
47 const double p_cap_restricted = std::min(p_cap, p_cap_max_);
48
49 return -parameter_a_ * parameter_b_ *
50 std::pow(p_cap_restricted, parameter_b_ - 1.);
51}
52
54 VariableArray const& variable_array, Variable const variable1,
55 Variable const variable2, ParameterLib::SpatialPosition const& /*pos*/,
56 double const /*t*/, double const /*dt*/) const
57{
58 if ((variable1 != Variable::capillary_pressure) &&
59 (variable2 != Variable::capillary_pressure))
60 {
62 "SaturationLiakopoulos::d2Value is implemented for derivatives "
63 "with respect to capillary pressure only.");
64 }
65
66 const double p_cap = variable_array.capillary_pressure;
67
68 if (p_cap < 0.)
69 {
70 return 0.;
71 }
72 const double p_cap_restricted = std::min(p_cap, p_cap_max_);
73 return -parameter_a_ * (parameter_b_ - 1.) * parameter_b_ *
74 std::pow(p_cap_restricted, parameter_b_ - 2.);
75}
76
77} // namespace MaterialPropertyLib
#define OGS_FATAL(...)
Definition Error.h:19
virtual PropertyDataType value() const
PropertyDataType dValue(VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &, double const, double const) const override
PropertyDataType d2Value(VariableArray const &variable_array, Variable const variable1, Variable const variable2, ParameterLib::SpatialPosition const &, double const, double const) const override
Default implementation: 2nd derivative of any constant property is zero.
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