OGS
MaterialPropertyLib::SaturationLuMcCartney Class Referencefinal

Detailed Description

The Lu - Mc Cartney water retention behavior.

This property must be a medium property, it computes the saturation of the wetting phase as function of capillary pressure.

Original source: Lu, Y., McCartney, J.S. Temperature effects on adsorption and capillarity water retention mechanisms in constrained unsaturated soils. Acta Geotech. 19, 6467-6482 (2024). https://doi.org/10.1007/s11440-024-02341-9 and Guo, G., Zheng, L., Lu, Y., Behbehani, F., & McCartney, J. (2026). Coupled THM modeling of bentonite heating and hydration in tank TemperatureTypes with a new temperature-dependent water retention model. Computers and Geotechnics, 190, 107736. https://doi.org/10.1016/j.compgeo.2025.107736 Get rights and content

Definition at line 41 of file SaturationLuMcCartney.h.

#include <SaturationLuMcCartney.h>

Inheritance diagram for MaterialPropertyLib::SaturationLuMcCartney:
[legend]
Collaboration diagram for MaterialPropertyLib::SaturationLuMcCartney:
[legend]

Public Member Functions

 SaturationLuMcCartney (std::string name, std::string const &material)
void checkScale () const override
PropertyDataType value (VariableArray const &variable_array, ParameterLib::SpatialPosition const &, double const, double const) const override
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.
template<typename PressureType, typename TemperatureType>
promote< PressureType, TemperatureType > water_content (PressureType p_cap, TemperatureType T, VariableArray const &variable_array) const
template<typename PressureType, typename TemperatureType>
promote< PressureType, TemperatureType > adsorptive_water_content (PressureType p_cap, TemperatureType T, VariableArray const &variable_array) const
template<typename PressureType, typename TemperatureType>
promote< PressureType, TemperatureType > capillary_water_content (PressureType p_cap, TemperatureType T, VariableArray const &variable_array) const
template<typename TemperatureType>
promote< TemperatureType > theta_a_max (TemperatureType T, VariableArray const &variable_array) const
template<typename TemperatureType>
promote< TemperatureType > psi_max (TemperatureType T) const
template<typename TemperatureType>
promote< TemperatureType > c (TemperatureType T) const
template<typename TemperatureType>
promote< TemperatureType > CEC (TemperatureType T) const
template<typename TemperatureType>
promote< TemperatureType > psi_c (TemperatureType T, VariableArray const &variable_array) const
template<typename TemperatureType>
promote< TemperatureType > A_H (TemperatureType T) const
template<typename TemperatureType>
promote< TemperatureType > chi (TemperatureType T) const
template<typename TemperatureType>
promote< TemperatureType > delta_h (TemperatureType T) const
template<typename TemperatureType>
promote< TemperatureType > alpha (TemperatureType T) const
template<typename TemperatureType>
promote< TemperatureType > epsilon_w (TemperatureType T) const
template<typename TemperatureType>
promote< TemperatureType > zeta_s (TemperatureType T) const
template<typename TemperatureType>
promote< TemperatureType > rho_w (TemperatureType T) const
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 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

template<typename PressureType, typename TemperatureType>
boost::math::differentiation::promote< PressureType, TemperatureType > water_content (PressureType p_cap, TemperatureType T, VariableArray const &variable_array) const
template<typename PressureType, typename TemperatureType>
boost::math::differentiation::promote< PressureType, TemperatureType > adsorptive_water_content (PressureType p_cap, TemperatureType T, VariableArray const &variable_array) const
template<typename PressureType, typename TemperatureType>
boost::math::differentiation::promote< PressureType, TemperatureType > capillary_water_content (PressureType p_cap, TemperatureType T, VariableArray const &variable_array) const
template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > theta_a_max (TemperatureType T, VariableArray const &variable_array) const
template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > psi_max (TemperatureType T) const
template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > c (TemperatureType T) const
template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > CEC (TemperatureType T) const
template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > psi_c (TemperatureType T, VariableArray const &variable_array) const
template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > A_H (TemperatureType T) const
template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > chi (TemperatureType T) const
template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > delta_h (TemperatureType T) const
template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > alpha (TemperatureType T) const
template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > epsilon_w (TemperatureType T) const
template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > zeta_s (TemperatureType T) const
template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > rho_w (TemperatureType T) const

Private Attributes

std::string const material_
const MaterialLib::Fluid::DimensionLessGibbsFreeEnergyRegion1 gibbs_free_energy_
double const nu_w = 1.8e-5
 <-— Lu and McCartney 2024 parameters ---->
double const A = 0.92
 fitting parameter for cation exchange capacity
double const B = 0.9
 fitting parameter for cation exchange capacity
double const T1 = 373.15
 parameter for temperature effect of CEC in K
double const T2
 parameter for temperature effect of CEC in K
double const nu_e
 main absorption frequency of UV light in Hz
double const Tr = 293.15
 reference temperature in K
double const C1 = -0.00151
 parameter for temperature correction
double const n_w = 1.33
 diffraction index
double E1_minus_EL
 material parameters for adsorptive water content
double nu_mr
double CEC_max
 maximum cation exchange capacity in meq/g
double bw
double M
 exponent for adsorptive water content
double SSA
 material parameters for capillary water content
double epsilon_s
 dielectic constant of soil particles
double n_s
 refractive index of soil particles
double eta_alpha
 soil related coefficient
double alpha_0_inv
 air entry suction at reference temperature Tr in Pa
double chi_r
double N
 exponent for capillary water content

Static Private Attributes

static constexpr double ref_T_ = 1386
 reference temperature in K.
static constexpr double ref_p_ = 1.653e7

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

◆ SaturationLuMcCartney()

MaterialPropertyLib::SaturationLuMcCartney::SaturationLuMcCartney ( std::string name,
std::string const & material )

Definition at line 157 of file SaturationLuMcCartney.cpp.

159 : material_(material),
161 MaterialLib::Fluid::DimensionLessGibbsFreeEnergyRegion1())
162{
163 name_ = std::move(name);
164 if (material_ == "MX80")
165 {
166 E1_minus_EL = 7533.930402019812;
167 nu_mr = 2.752035e-01;
168 CEC_max = 0.8004082526701221;
169 bw = 0.18;
170 M = 0.105;
171 N = 1.15;
172 SSA = 700.0e3;
173 epsilon_s = 3.2089251122574;
174 n_s = 1.3298392371979677;
175 eta_alpha = 5.0;
176 alpha_0_inv = 3.3e6;
177 chi_r = delta_h(Tr) / C1;
178 }
179 else if (material_ == "BoomClay")
180 {
181 E1_minus_EL = 6803;
182 nu_mr = 7.994125e-02;
183 CEC_max = 0.2534798545419938;
184 bw = 0.11;
185 M = 0.085;
186 N = 1.29;
187 SSA = 260e3;
188 epsilon_s = 1.3267932723717908;
189 n_s = 35.435652398543425;
190 eta_alpha = 0.6;
191 alpha_0_inv = 36e3;
192 chi_r = delta_h(Tr) / C1;
193 }
194 else if (material_ == "FEBEX")
195 {
196 E1_minus_EL = 7904.547103777231;
197 nu_mr = 3.374814e-01;
198 CEC_max = 1.0108839312584308;
199 bw = 0.18;
200 M = 0.132;
201 N = 1.22;
202 SSA = 860.0e3;
203 epsilon_s = 0.940367803768519;
204 n_s = 748.7804881357005;
205 eta_alpha = 3.5;
206 alpha_0_inv = 330e3;
207 chi_r = delta_h(Tr) / C1;
208 }
209 else if (material_ == "GMZ01")
210 {
211 E1_minus_EL = 8369.804359014617;
212 nu_mr = 1.505956e-01;
213 CEC_max = 0.8004082526701221;
214 bw = 0.25;
215 M = 0.135;
216 N = 1.3;
217 SSA = 700.0e3;
218 epsilon_s = 2.1590265530454893;
219 n_s = 2175.885110079861;
220 eta_alpha = 8.5;
221 alpha_0_inv = 8.0e6;
222 chi_r = delta_h(Tr) / C1;
223 }
224
225 else
226 {
227 OGS_FATAL(
228 "Material '{}' not implemented in SaturationLuMcCartney model.",
229 material_);
230 }
231}
#define OGS_FATAL(...)
Definition Error.h:19
boost::math::differentiation::promote< TemperatureType > delta_h(TemperatureType T) const
double N
exponent for capillary water content
double SSA
material parameters for capillary water content
double n_s
refractive index of soil particles
double epsilon_s
dielectic constant of soil particles
const MaterialLib::Fluid::DimensionLessGibbsFreeEnergyRegion1 gibbs_free_energy_
double const C1
parameter for temperature correction
double const Tr
reference temperature in K
double alpha_0_inv
air entry suction at reference temperature Tr in Pa
double M
exponent for adsorptive water content
double CEC_max
maximum cation exchange capacity in meq/g
double E1_minus_EL
material parameters for adsorptive water content

References alpha_0_inv, bw, C1, CEC_max, chi_r, delta_h(), E1_minus_EL, epsilon_s, eta_alpha, gibbs_free_energy_, M, material_, N, n_s, MaterialPropertyLib::name, MaterialPropertyLib::Property::name_, nu_mr, OGS_FATAL, SSA, and Tr.

Member Function Documentation

◆ A_H() [1/2]

template<typename TemperatureType>
promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::A_H ( TemperatureType T) const

Definition at line 94 of file SaturationLuMcCartney.cpp.

95{
96 auto const dielectric_term =
97 pow((epsilon_s - epsilon_w(T)) / (epsilon_s + epsilon_w(T)), 2);
98 auto const RI_term =
99 pow(n_s * n_s - n_w * n_w, 2) / pow(n_s * n_s + n_w * n_w, 3. / 2.);
100 auto const prefactor_dielectic =
102 auto const prefactor_RI =
104 (16 * sqrt(2));
105 return prefactor_dielectic * dielectric_term + prefactor_RI * RI_term;
106}
double const nu_e
main absorption frequency of UV light in Hz
boost::math::differentiation::promote< TemperatureType > epsilon_w(TemperatureType T) const
constexpr double BoltzmannConstant
J/K.
constexpr double PlanckConstant
J s.

References MaterialLib::PhysicalConstant::BoltzmannConstant, epsilon_s, epsilon_w(), n_s, n_w, nu_e, and MaterialLib::PhysicalConstant::PlanckConstant.

◆ A_H() [2/2]

template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::A_H ( TemperatureType T) const
private

Referenced by psi_c().

◆ adsorptive_water_content() [1/2]

template<typename PressureType, typename TemperatureType>
promote< PressureType, TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::adsorptive_water_content ( PressureType p_cap,
TemperatureType T,
VariableArray const & variable_array ) const

Definition at line 29 of file SaturationLuMcCartney.cpp.

32{
33 return theta_a_max(T, variable_array) *
34 (1 - pow(exp((p_cap - psi_max(T)) / p_cap), M));
35}
boost::math::differentiation::promote< TemperatureType > theta_a_max(TemperatureType T, VariableArray const &variable_array) const
boost::math::differentiation::promote< TemperatureType > psi_max(TemperatureType T) const

References M, psi_max(), and theta_a_max().

◆ adsorptive_water_content() [2/2]

template<typename PressureType, typename TemperatureType>
boost::math::differentiation::promote< PressureType, TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::adsorptive_water_content ( PressureType p_cap,
TemperatureType T,
VariableArray const & variable_array ) const
private

◆ alpha() [1/2]

template<typename TemperatureType>
promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::alpha ( TemperatureType T) const

Definition at line 123 of file SaturationLuMcCartney.cpp.

124{
125 auto const psi_aev = alpha_0_inv * exp(eta_alpha * (Tr / T - 1));
126 return 1.0 / psi_aev;
127}

References alpha_0_inv, eta_alpha, and Tr.

◆ alpha() [2/2]

template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::alpha ( TemperatureType T) const
private

◆ c() [1/2]

template<typename TemperatureType>
promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::c ( TemperatureType T) const

◆ c() [2/2]

template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::c ( TemperatureType T) const
private

◆ capillary_water_content() [1/2]

template<typename PressureType, typename TemperatureType>
promote< PressureType, TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::capillary_water_content ( PressureType p_cap,
TemperatureType T,
VariableArray const & variable_array ) const

Definition at line 39 of file SaturationLuMcCartney.cpp.

42{
43 auto const theta_mean =
44 (variable_array.porosity -
45 adsorptive_water_content(p_cap, T, variable_array)) /
46 2.0;
47 auto const chi_frac = (chi(T) + T) / (chi_r + Tr);
48 auto const erf_term =
49 erf(sqrt(2) * (p_cap / psi_c(T, variable_array) * chi_frac - 1));
50 auto const power_term = pow(alpha(T) * p_cap * chi_frac, N);
51 auto const cap_term =
52 theta_mean * (1 - erf_term) * pow(1 + power_term, ((1 / N) - 1));
53 return cap_term;
54}
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
boost::math::differentiation::promote< TemperatureType > psi_c(TemperatureType T, VariableArray const &variable_array) const

References adsorptive_water_content(), MaterialPropertyLib::alpha, chi(), chi_r, N, MaterialPropertyLib::VariableArray::porosity, psi_c(), and Tr.

◆ capillary_water_content() [2/2]

template<typename PressureType, typename TemperatureType>
boost::math::differentiation::promote< PressureType, TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::capillary_water_content ( PressureType p_cap,
TemperatureType T,
VariableArray const & variable_array ) const
private

Referenced by water_content().

◆ CEC() [1/2]

template<typename TemperatureType>
promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::CEC ( TemperatureType T) const

Definition at line 78 of file SaturationLuMcCartney.cpp.

79{
80 auto const cos_arg = A * std::numbers::pi * (B * T - T1) / (T2 - T1);
81 return 0.5 * CEC_max * (cos(cos_arg) + 1);
82}
double const B
fitting parameter for cation exchange capacity
double const T2
parameter for temperature effect of CEC in K
double const A
fitting parameter for cation exchange capacity
double const T1
parameter for temperature effect of CEC in K

References A, B, CEC_max, T1, and T2.

◆ CEC() [2/2]

template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::CEC ( TemperatureType T) const
private

Referenced by theta_a_max(), and zeta_s().

◆ checkScale()

void MaterialPropertyLib::SaturationLuMcCartney::checkScale ( ) const
inlineoverridevirtual

Reimplemented from MaterialPropertyLib::Property.

Definition at line 46 of file SaturationLuMcCartney.h.

47 {
48 if (!std::holds_alternative<Medium*>(scale_))
49 {
51 "The property 'SaturationLuMcCartney' is implemented on the "
52 "'media' scale only.");
53 }
54 }
std::variant< Medium *, Phase *, Component * > scale_

References OGS_FATAL, and MaterialPropertyLib::Property::scale_.

◆ chi() [1/2]

template<typename TemperatureType>
promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::chi ( TemperatureType T) const

Definition at line 109 of file SaturationLuMcCartney.cpp.

110{
111 return delta_h(T) / C1;
112}

References C1, and delta_h().

◆ chi() [2/2]

template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::chi ( TemperatureType T) const
private

Referenced by capillary_water_content().

◆ d2Value()

PropertyDataType MaterialPropertyLib::SaturationLuMcCartney::d2Value ( VariableArray const & variable_array,
Variable const variable1,
Variable const variable2,
ParameterLib::SpatialPosition const & pos,
double const t,
double const dt ) const
overridevirtual

Default implementation: 2nd derivative of any constant property is zero.

This virtual method will compute the second derivative of a property with respect to the given variables pv1 and pv2.

Reimplemented from MaterialPropertyLib::Property.

Definition at line 332 of file SaturationLuMcCartney.cpp.

336{
337 (void)variable1;
338 (void)variable2;
339 assert(((variable1 == Variable::capillary_pressure) ||
340 (variable1 == Variable::temperature)) &&
341 ((variable2 == Variable::capillary_pressure) ||
342 (variable2 == Variable::temperature)) &&
343 "SaturationLuMcCartney::d2Value is implemented for derivatives "
344 "with respect to capillary pressure only.");
345
346 const double p_cap = variable_array.capillary_pressure;
347 const double T = variable_array.temperature;
348
349 auto const& medium = *std::get<Medium*>(scale_);
350 auto const& solid_phase = medium.phase(PhaseName::Solid);
351 auto const& porosity_property = medium[PropertyType::porosity];
352 auto const& solid_denisty_property = solid_phase[PropertyType::density];
353
354 auto const phi =
355 std::get<double>(porosity_property.value(variable_array, pos, t, dt));
356 auto const rho_s = std::get<double>(
357 solid_denisty_property.value(variable_array, pos, t, dt));
358 VariableArray rho_d_and_phi;
359 rho_d_and_phi.density = rho_s * (1.0 - phi);
360 rho_d_and_phi.porosity = phi;
361
362 auto const p_cap_max = psi_max(T);
363 auto const p_cut = 1e-10;
364
365 if (p_cap >= p_cap_max)
366 {
367 return 0.;
368 }
369 if (p_cap <= p_cut && (variable1 == Variable::capillary_pressure ||
370 variable2 == Variable::capillary_pressure))
371 {
372 return 0.;
373 }
374
375 auto const variables = make_ftuple<double, 2, 2>(p_cap, T);
376 auto const& v = std::get<0>(variables); // Up to Nw derivatives at w=11
377 auto const& w = std::get<1>(variables);
378 auto const y = water_content(v, w, rho_d_and_phi);
379 double DDS = 0.0;
380 auto returnVariableTuple = [](const Variable v1,
381 const Variable v2) -> std::tuple<int, int>
382 {
385 {
386 return {2, 0};
387 }
389 {
390 return {0, 2};
391 }
392 return {1, 1};
393 };
394 auto [i, j] = returnVariableTuple(variable1, variable2);
395 if (j > 0)
396 {
397 if (p_cap <= p_cut)
398 {
399 auto const variables_b2 = make_ftuple<double, 2, 2>(p_cut, T);
400 auto const& v_b2 = std::get<0>(variables_b2);
401 auto const& w_b2 = std::get<1>(variables_b2);
402 auto const y_b2 = water_content(v_b2, w_b2, rho_d_and_phi);
403 return y_b2.derivative(i, j) / phi;
404 }
405 }
406 DDS = y.derivative(i, j);
407 return DDS / phi;
408}
boost::math::differentiation::promote< PressureType, TemperatureType > water_content(PressureType p_cap, TemperatureType T, VariableArray const &variable_array) const

References MaterialPropertyLib::capillary_pressure, MaterialPropertyLib::VariableArray::capillary_pressure, MaterialPropertyLib::density, MaterialPropertyLib::VariableArray::density, MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, psi_max(), MaterialPropertyLib::Property::scale_, MaterialPropertyLib::Solid, MaterialPropertyLib::temperature, MaterialPropertyLib::VariableArray::temperature, and water_content().

◆ delta_h() [1/2]

template<typename TemperatureType>
promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::delta_h ( TemperatureType T) const

Definition at line 115 of file SaturationLuMcCartney.cpp.

116{
117 // delta_hr = -0.516; //J / m ^ 2 high plasticity clay
118 auto const delta_hr = -0.5151936137548038;
119 return delta_hr * pow((1 - Tr) / (1 - T), 0.38);
120}

References Tr.

◆ delta_h() [2/2]

template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::delta_h ( TemperatureType T) const
private

Referenced by SaturationLuMcCartney(), and chi().

◆ dValue()

PropertyDataType MaterialPropertyLib::SaturationLuMcCartney::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 268 of file SaturationLuMcCartney.cpp.

272{
273 if (variable != Variable::capillary_pressure &&
274 variable != Variable::temperature)
275 {
276 OGS_FATAL(
277 "SaturationLuMcCartney::dValue is implemented for derivatives "
278 "with respect to capillary pressure or temperature only.");
279 }
280
281 const double p_cap = variable_array.capillary_pressure;
282 const double T = variable_array.temperature;
283
284 auto const& medium = *std::get<Medium*>(scale_);
285 auto const& solid_phase = medium.phase(PhaseName::Solid);
286 auto const& porosity_property = medium[PropertyType::porosity];
287 auto const& solid_denisty_property = solid_phase[PropertyType::density];
288
289 auto const phi =
290 std::get<double>(porosity_property.value(variable_array, pos, t, dt));
291 auto const rho_s = std::get<double>(
292 solid_denisty_property.value(variable_array, pos, t, dt));
293 VariableArray rho_d_and_phi;
294 rho_d_and_phi.density = rho_s * (1.0 - phi);
295 rho_d_and_phi.porosity = phi;
296
297 auto const p_cap_max = psi_max(T);
298 auto const p_cut = 1.0e-10;
299
300 auto const variables = make_ftuple<double, 1, 1>(p_cap, T);
301 auto const& v = std::get<0>(variables);
302 auto const& w = std::get<1>(variables);
303 auto const y = water_content(v, w, rho_d_and_phi);
304 double DS = 0.0;
305 if (p_cap >= p_cap_max)
306 {
307 return 0.0;
308 }
309 if (variable == Variable::capillary_pressure)
310 {
311 if (p_cap <= 1.0e-10)
312 {
313 return 0.;
314 }
315 return y.derivative(1, 0) / phi;
316 }
317 if (variable == Variable::temperature)
318 {
319 if (p_cap <= p_cut)
320 {
321 auto const variables_b2 = make_ftuple<double, 1, 1>(p_cut, T);
322 auto const& v_b2 = std::get<0>(variables_b2);
323 auto const& w_b2 = std::get<1>(variables_b2);
324 auto const y_b2 = water_content(v_b2, w_b2, rho_d_and_phi);
325 return y_b2.derivative(0, 1) / phi;
326 }
327 DS = y.derivative(0, 1);
328 }
329 return DS / phi;
330}

References MaterialPropertyLib::capillary_pressure, MaterialPropertyLib::VariableArray::capillary_pressure, MaterialPropertyLib::density, MaterialPropertyLib::VariableArray::density, OGS_FATAL, MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, psi_max(), MaterialPropertyLib::Property::scale_, MaterialPropertyLib::Solid, MaterialPropertyLib::temperature, MaterialPropertyLib::VariableArray::temperature, and water_content().

◆ epsilon_w() [1/2]

template<typename TemperatureType>
promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::epsilon_w ( TemperatureType T) const

Definition at line 130 of file SaturationLuMcCartney.cpp.

132{
133 auto const r_w = rho_w(T) / 1000.0;
134 return pow(
135 10, (0.7017 + 642.0 / T - 1.167e5 / pow(T, 2) + 9.190e6 / pow(T, 3) +
136 (1.667 - 11.41 / T - 3.526e4 / pow(T, 2)) * log(r_w) / log(10)) +
137 1);
138}
boost::math::differentiation::promote< TemperatureType > rho_w(TemperatureType T) const

References rho_w().

◆ epsilon_w() [2/2]

template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::epsilon_w ( TemperatureType T) const
private

Referenced by A_H().

◆ psi_c() [1/2]

template<typename TemperatureType>
promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::psi_c ( TemperatureType T,
VariableArray const & variable_array ) const

Definition at line 85 of file SaturationLuMcCartney.cpp.

87{
88 return A_H(T) / (6 * std::numbers::pi) *
89 pow(theta_a_max(T, variable_array) / (SSA * variable_array.density),
90 -3.0);
91}
boost::math::differentiation::promote< TemperatureType > A_H(TemperatureType T) const

References A_H(), MaterialPropertyLib::VariableArray::density, SSA, and theta_a_max().

◆ psi_c() [2/2]

template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::psi_c ( TemperatureType T,
VariableArray const & variable_array ) const
private

Referenced by capillary_water_content().

◆ psi_max() [1/2]

template<typename TemperatureType>
promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::psi_max ( TemperatureType T) const

Definition at line 64 of file SaturationLuMcCartney.cpp.

65{
67 (3.0 * nu_w);
68}
double const nu_w
<-— Lu and McCartney 2024 parameters ---->

References MaterialPropertyLib::c, MaterialLib::PhysicalConstant::IdealGasConstant, and nu_w.

◆ psi_max() [2/2]

template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::psi_max ( TemperatureType T) const
private

◆ rho_w() [1/2]

template<typename TemperatureType>
promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::rho_w ( TemperatureType T) const

Definition at line 147 of file SaturationLuMcCartney.cpp.

148{
149 double const pi = 0.0;
150 auto const tau = ref_T_ / T;
151
152 return ref_p_ /
154 T * gibbs_free_energy_.get_dgamma_dpi(tau, pi));
155}
static constexpr double ref_T_
reference temperature in K.
constexpr double WaterVapour
Specific gas constant for water vapour.

References gibbs_free_energy_, ref_p_, ref_T_, and MaterialLib::PhysicalConstant::SpecificGasConstant::WaterVapour.

◆ rho_w() [2/2]

template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::rho_w ( TemperatureType T) const
private

Referenced by epsilon_w().

◆ theta_a_max() [1/2]

template<typename TemperatureType>
promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::theta_a_max ( TemperatureType T,
VariableArray const & variable_array ) const

Definition at line 57 of file SaturationLuMcCartney.cpp.

59{
60 return (1 - variable_array.porosity) * (CEC(T) / zeta_s(T) + bw);
61}
boost::math::differentiation::promote< TemperatureType > CEC(TemperatureType T) const
boost::math::differentiation::promote< TemperatureType > zeta_s(TemperatureType T) const

References bw, CEC(), MaterialPropertyLib::VariableArray::porosity, and zeta_s().

◆ theta_a_max() [2/2]

template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::theta_a_max ( TemperatureType T,
VariableArray const & variable_array ) const
private

Referenced by adsorptive_water_content(), and psi_c().

◆ value()

PropertyDataType MaterialPropertyLib::SaturationLuMcCartney::value ( VariableArray const & variable_array,
ParameterLib::SpatialPosition const & pos,
double const t,
double const dt ) const
overridevirtual

Those methods override the base class implementations and actually compute and set the property values_ and dValues_.

Reimplemented from MaterialPropertyLib::Property.

Definition at line 233 of file SaturationLuMcCartney.cpp.

237{
238 const double p_cap = variable_array.capillary_pressure;
239 const double T = variable_array.temperature;
240
241 auto const& medium = *std::get<Medium*>(scale_);
242 auto const& solid_phase = medium.phase(PhaseName::Solid);
243 auto const& porosity_property = medium[PropertyType::porosity];
244 auto const& solid_denisty_property = solid_phase[PropertyType::density];
245
246 auto const phi =
247 std::get<double>(porosity_property.value(variable_array, pos, t, dt));
248 auto const rho_s = std::get<double>(
249 solid_denisty_property.value(variable_array, pos, t, dt));
250 VariableArray rho_d_and_phi;
251 rho_d_and_phi.density = rho_s * (1.0 - phi);
252 rho_d_and_phi.porosity = phi;
253 double const p_cut = 1e-10;
254
255 auto const S_L_max = water_content(p_cut, T, rho_d_and_phi) / phi;
256 auto const p_cap_max = psi_max(T);
257 if (p_cap <= p_cut)
258 {
259 return S_L_max;
260 }
261 if (p_cap >= p_cap_max)
262 {
263 return 0.0;
264 }
265 return water_content(p_cap, T, rho_d_and_phi) / phi;
266}

References MaterialPropertyLib::VariableArray::capillary_pressure, MaterialPropertyLib::density, MaterialPropertyLib::VariableArray::density, MaterialPropertyLib::porosity, MaterialPropertyLib::VariableArray::porosity, psi_max(), MaterialPropertyLib::Property::scale_, MaterialPropertyLib::Solid, MaterialPropertyLib::VariableArray::temperature, and water_content().

◆ water_content() [1/2]

template<typename PressureType, typename TemperatureType>
promote< PressureType, TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::water_content ( PressureType p_cap,
TemperatureType T,
VariableArray const & variable_array ) const

Definition at line 19 of file SaturationLuMcCartney.cpp.

22{
23 return adsorptive_water_content(p_cap, T, variable_array) +
24 capillary_water_content(p_cap, T, variable_array);
25}
boost::math::differentiation::promote< PressureType, TemperatureType > capillary_water_content(PressureType p_cap, TemperatureType T, VariableArray const &variable_array) const

References adsorptive_water_content(), and capillary_water_content().

◆ water_content() [2/2]

template<typename PressureType, typename TemperatureType>
boost::math::differentiation::promote< PressureType, TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::water_content ( PressureType p_cap,
TemperatureType T,
VariableArray const & variable_array ) const
private

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

◆ zeta_s() [1/2]

template<typename TemperatureType>
promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::zeta_s ( TemperatureType T) const

Definition at line 141 of file SaturationLuMcCartney.cpp.

142{
143 return (c(T) - 1) / c(T) * CEC(T) / nu_mr;
144}

References MaterialPropertyLib::c, CEC(), and nu_mr.

◆ zeta_s() [2/2]

template<typename TemperatureType>
boost::math::differentiation::promote< TemperatureType > MaterialPropertyLib::SaturationLuMcCartney::zeta_s ( TemperatureType T) const
private

Referenced by theta_a_max().

Member Data Documentation

◆ A

double const MaterialPropertyLib::SaturationLuMcCartney::A = 0.92
private

fitting parameter for cation exchange capacity

Definition at line 133 of file SaturationLuMcCartney.h.

Referenced by CEC().

◆ alpha_0_inv

double MaterialPropertyLib::SaturationLuMcCartney::alpha_0_inv
private

air entry suction at reference temperature Tr in Pa

Definition at line 159 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and alpha().

◆ B

double const MaterialPropertyLib::SaturationLuMcCartney::B = 0.9
private

fitting parameter for cation exchange capacity

Definition at line 134 of file SaturationLuMcCartney.h.

Referenced by CEC().

◆ bw

double MaterialPropertyLib::SaturationLuMcCartney::bw
private

Definition at line 150 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and theta_a_max().

◆ C1

double const MaterialPropertyLib::SaturationLuMcCartney::C1 = -0.00151
private

parameter for temperature correction

Definition at line 141 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and chi().

◆ CEC_max

double MaterialPropertyLib::SaturationLuMcCartney::CEC_max
private

maximum cation exchange capacity in meq/g

Definition at line 149 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and CEC().

◆ chi_r

double MaterialPropertyLib::SaturationLuMcCartney::chi_r
private

Definition at line 160 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and capillary_water_content().

◆ E1_minus_EL

double MaterialPropertyLib::SaturationLuMcCartney::E1_minus_EL
private

material parameters for adsorptive water content

energy difference between heat of adorption of first and second layer in J/mol

Definition at line 145 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and c().

◆ epsilon_s

double MaterialPropertyLib::SaturationLuMcCartney::epsilon_s
private

dielectic constant of soil particles

Definition at line 155 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and A_H().

◆ eta_alpha

double MaterialPropertyLib::SaturationLuMcCartney::eta_alpha
private

soil related coefficient

Definition at line 157 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and alpha().

◆ gibbs_free_energy_

const MaterialLib::Fluid::DimensionLessGibbsFreeEnergyRegion1 MaterialPropertyLib::SaturationLuMcCartney::gibbs_free_energy_
private

Definition at line 126 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and rho_w().

◆ M

double MaterialPropertyLib::SaturationLuMcCartney::M
private

exponent for adsorptive water content

Definition at line 151 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and adsorptive_water_content().

◆ material_

std::string const MaterialPropertyLib::SaturationLuMcCartney::material_
private

Definition at line 123 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney().

◆ N

double MaterialPropertyLib::SaturationLuMcCartney::N
private

exponent for capillary water content

Definition at line 161 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and capillary_water_content().

◆ n_s

double MaterialPropertyLib::SaturationLuMcCartney::n_s
private

refractive index of soil particles

Definition at line 156 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and A_H().

◆ n_w

double const MaterialPropertyLib::SaturationLuMcCartney::n_w = 1.33
private

diffraction index

Definition at line 142 of file SaturationLuMcCartney.h.

Referenced by A_H().

◆ nu_e

double const MaterialPropertyLib::SaturationLuMcCartney::nu_e
private
Initial value:
=
2.45e9

main absorption frequency of UV light in Hz

Definition at line 138 of file SaturationLuMcCartney.h.

Referenced by A_H().

◆ nu_mr

double MaterialPropertyLib::SaturationLuMcCartney::nu_mr
private

gravimetric moisture content when first layer is fully saturated

Definition at line 147 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and zeta_s().

◆ nu_w

double const MaterialPropertyLib::SaturationLuMcCartney::nu_w = 1.8e-5
private

<-— Lu and McCartney 2024 parameters ---->

molar volume of water in m^3/mol

Definition at line 132 of file SaturationLuMcCartney.h.

Referenced by psi_max().

◆ ref_p_

double MaterialPropertyLib::SaturationLuMcCartney::ref_p_ = 1.653e7
staticconstexprprivate

Definition at line 129 of file SaturationLuMcCartney.h.

Referenced by rho_w().

◆ ref_T_

double MaterialPropertyLib::SaturationLuMcCartney::ref_T_ = 1386
staticconstexprprivate

reference temperature in K.

Definition at line 128 of file SaturationLuMcCartney.h.

Referenced by rho_w().

◆ SSA

double MaterialPropertyLib::SaturationLuMcCartney::SSA
private

material parameters for capillary water content

specific surface area in m^2/g

Definition at line 154 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), and psi_c().

◆ T1

double const MaterialPropertyLib::SaturationLuMcCartney::T1 = 373.15
private

parameter for temperature effect of CEC in K

Definition at line 135 of file SaturationLuMcCartney.h.

Referenced by CEC().

◆ T2

double const MaterialPropertyLib::SaturationLuMcCartney::T2
private
Initial value:
=
1273.15

parameter for temperature effect of CEC in K

Definition at line 136 of file SaturationLuMcCartney.h.

Referenced by CEC().

◆ Tr

double const MaterialPropertyLib::SaturationLuMcCartney::Tr = 293.15
private

reference temperature in K

Definition at line 140 of file SaturationLuMcCartney.h.

Referenced by SaturationLuMcCartney(), alpha(), capillary_water_content(), and delta_h().


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