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 return 1.;
23
24 return std::max(residual_liquid_saturation_,
25 1. - parameter_a_ * std::pow(p_cap, parameter_b_));
26}
27
29 VariableArray const& variable_array, Variable const variable,
30 ParameterLib::SpatialPosition const& /*pos*/, double const /*t*/,
31 double const /*dt*/) const
32{
33 if (variable != Variable::capillary_pressure)
34 {
36 "SaturationLiakopoulos::dValue is implemented for derivatives with "
37 "respect to capillary pressure only.");
38 }
39
40 const double p_cap = variable_array.capillary_pressure;
41 if (p_cap <= 0.)
42 {
43 return 0.;
44 }
45 const double p_cap_restricted = std::min(p_cap, p_cap_max_);
46
47 return -parameter_a_ * parameter_b_ *
48 std::pow(p_cap_restricted, parameter_b_ - 1.);
49}
50
52 VariableArray const& variable_array, Variable const variable1,
53 Variable const variable2, ParameterLib::SpatialPosition const& /*pos*/,
54 double const /*t*/, double const /*dt*/) const
55{
56 if ((variable1 != Variable::capillary_pressure) &&
57 (variable2 != Variable::capillary_pressure))
58 {
60 "SaturationLiakopoulos::d2Value is implemented for derivatives "
61 "with respect to capillary pressure only.");
62 }
63
64 const double p_cap = variable_array.capillary_pressure;
65
66 if (p_cap < 0.)
67 {
68 return 0.;
69 }
70 const double p_cap_restricted = std::min(p_cap, p_cap_max_);
71 return -parameter_a_ * (parameter_b_ - 1.) * parameter_b_ *
72 std::pow(p_cap_restricted, parameter_b_ - 2.);
73}
74
75} // 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