OGS
SaturationLuMcCartney.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#ifdef __GNUC__
7#pragma GCC diagnostic push
8#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
9#endif
10#include <boost/math/differentiation/autodiff.hpp>
11#ifdef __GNUC__
12#pragma GCC diagnostic pop
13#endif
14
17
18namespace MaterialPropertyLib
19{
20class Medium;
21class Phase;
22class Component;
41class SaturationLuMcCartney final : public Property
42{
43public:
44 SaturationLuMcCartney(std::string name, std::string const& material);
45
46 void checkScale() const override
47 {
48 if (!std::holds_alternative<Medium*>(scale_))
49 {
51 "The property 'SaturationLuMcCartney' is implemented on the "
52 "'media' scale only.");
53 }
54 }
55
58 PropertyDataType value(VariableArray const& variable_array,
59 ParameterLib::SpatialPosition const& /*pos*/,
60 double const /*t*/,
61 double const /*dt*/) const override;
62 PropertyDataType dValue(VariableArray const& variable_array,
63 Variable const variable,
64 ParameterLib::SpatialPosition const& /*pos*/,
65 double const /*t*/,
66 double const /*dt*/) const override;
67 PropertyDataType d2Value(VariableArray const& variable_array,
68 Variable const variable1, Variable const variable2,
69 ParameterLib::SpatialPosition const& /*pos*/,
70 double const /*t*/,
71 double const /*dt*/) const override;
72
73private:
74 template <typename PressureType, typename TemperatureType>
75 boost::math::differentiation::promote<PressureType, TemperatureType>
76 water_content(PressureType p_cap, TemperatureType T,
77 VariableArray const& variable_array) const;
78 template <typename PressureType, typename TemperatureType>
79 boost::math::differentiation::promote<PressureType, TemperatureType>
80 adsorptive_water_content(PressureType p_cap, TemperatureType T,
81 VariableArray const& variable_array) const;
82 template <typename PressureType, typename TemperatureType>
83 boost::math::differentiation::promote<PressureType, TemperatureType>
84 capillary_water_content(PressureType p_cap, TemperatureType T,
85 VariableArray const& variable_array) const;
86 template <typename TemperatureType>
87 boost::math::differentiation::promote<TemperatureType> theta_a_max(
88 TemperatureType T, VariableArray const& variable_array) const;
89 template <typename TemperatureType>
90 boost::math::differentiation::promote<TemperatureType> psi_max(
91 TemperatureType T) const;
92 template <typename TemperatureType>
93 boost::math::differentiation::promote<TemperatureType> c(
94 TemperatureType T) const;
95 template <typename TemperatureType>
96 boost::math::differentiation::promote<TemperatureType> CEC(
97 TemperatureType T) const;
98 template <typename TemperatureType>
99 boost::math::differentiation::promote<TemperatureType> psi_c(
100 TemperatureType T, VariableArray const& variable_array) const;
101 template <typename TemperatureType>
102 boost::math::differentiation::promote<TemperatureType> A_H(
103 TemperatureType T) const;
104 template <typename TemperatureType>
105 boost::math::differentiation::promote<TemperatureType> chi(
106 TemperatureType T) const;
107 template <typename TemperatureType>
108 boost::math::differentiation::promote<TemperatureType> delta_h(
109 TemperatureType T) const;
110 template <typename TemperatureType>
111 boost::math::differentiation::promote<TemperatureType> alpha(
112 TemperatureType T) const;
113 template <typename TemperatureType>
114 boost::math::differentiation::promote<TemperatureType> epsilon_w(
115 TemperatureType T) const;
116 template <typename TemperatureType>
117 boost::math::differentiation::promote<TemperatureType> zeta_s(
118 TemperatureType T) const;
119 template <typename TemperatureType>
120 boost::math::differentiation::promote<TemperatureType> rho_w(
121 TemperatureType T) const;
122
123 std::string const material_;
124
127 // constants
128 static constexpr double ref_T_ = 1386;
129 static constexpr double ref_p_ = 1.653e7;
130
132 double const nu_w = 1.8e-5;
133 double const A = 0.92;
134 double const B = 0.9;
135 double const T1 = 373.15;
136 double const T2 =
137 1273.15;
138 double const nu_e =
139 2.45e9;
140 double const Tr = 293.15;
141 double const C1 = -0.00151;
142 double const n_w = 1.33;
143
145 double E1_minus_EL;
147 double nu_mr;
149 double CEC_max;
150 double bw;
151 double M;
152
154 double SSA;
155 double epsilon_s;
156 double n_s;
157 double eta_alpha;
158 double
160 double chi_r;
161 double N;
162};
163} // namespace MaterialPropertyLib
#define OGS_FATAL(...)
Definition Error.h:19
This class defines components (substances).
Definition Component.h:18
virtual PropertyDataType value() const
std::variant< Medium *, Phase *, Component * > scale_
boost::math::differentiation::promote< TemperatureType > delta_h(TemperatureType T) const
boost::math::differentiation::promote< TemperatureType > CEC(TemperatureType T) const
double const B
fitting parameter for cation exchange capacity
boost::math::differentiation::promote< TemperatureType > c(TemperatureType T) const
double const T2
parameter for temperature effect of CEC in K
double N
exponent for capillary water content
double const nu_w
<-— Lu and McCartney 2024 parameters ---->
double const A
fitting parameter for cation exchange capacity
SaturationLuMcCartney(std::string name, std::string const &material)
double SSA
material parameters for capillary water content
double n_s
refractive index of soil particles
boost::math::differentiation::promote< TemperatureType > A_H(TemperatureType T) const
boost::math::differentiation::promote< TemperatureType > theta_a_max(TemperatureType T, VariableArray const &variable_array) const
double epsilon_s
dielectic constant of soil particles
const MaterialLib::Fluid::DimensionLessGibbsFreeEnergyRegion1 gibbs_free_energy_
boost::math::differentiation::promote< PressureType, TemperatureType > capillary_water_content(PressureType p_cap, TemperatureType T, VariableArray const &variable_array) const
double const C1
parameter for temperature correction
boost::math::differentiation::promote< PressureType, TemperatureType > water_content(PressureType p_cap, TemperatureType T, VariableArray const &variable_array) const
double const Tr
reference temperature in K
boost::math::differentiation::promote< PressureType, TemperatureType > adsorptive_water_content(PressureType p_cap, TemperatureType T, VariableArray const &variable_array) const
boost::math::differentiation::promote< TemperatureType > chi(TemperatureType T) const
static constexpr double ref_T_
reference temperature in K.
double alpha_0_inv
air entry suction at reference temperature Tr in Pa
double const T1
parameter for temperature effect of CEC in K
PropertyDataType dValue(VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &, double const, double const) const override
double M
exponent for adsorptive water content
double const nu_e
main absorption frequency of UV light in Hz
boost::math::differentiation::promote< TemperatureType > rho_w(TemperatureType T) const
boost::math::differentiation::promote< TemperatureType > psi_c(TemperatureType T, VariableArray const &variable_array) const
boost::math::differentiation::promote< TemperatureType > psi_max(TemperatureType T) const
double CEC_max
maximum cation exchange capacity in meq/g
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.
boost::math::differentiation::promote< TemperatureType > epsilon_w(TemperatureType T) const
double E1_minus_EL
material parameters for adsorptive water content
boost::math::differentiation::promote< TemperatureType > alpha(TemperatureType T) const
boost::math::differentiation::promote< TemperatureType > zeta_s(TemperatureType T) const
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