11using namespace boost::math::differentiation;
18template <
typename PressureType,
typename TemperatureType>
20 PressureType p_cap, TemperatureType T,
27template <
typename PressureType,
typename TemperatureType>
28promote<PressureType, TemperatureType>
30 PressureType p_cap, TemperatureType T,
34 (1 - pow(exp((p_cap -
psi_max(T)) / p_cap),
M));
37template <
typename PressureType,
typename TemperatureType>
38promote<PressureType, TemperatureType>
40 PressureType p_cap, TemperatureType T,
43 auto const theta_mean =
47 auto const chi_frac = (
chi(T) + T) / (
chi_r +
Tr);
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);
52 theta_mean * (1 - erf_term) * pow(1 + power_term, ((1 /
N) - 1));
56template <
typename TemperatureType>
63template <
typename TemperatureType>
70template <
typename TemperatureType>
77template <
typename TemperatureType>
80 auto const cos_arg =
A * std::numbers::pi * (
B * T -
T1) / (
T2 -
T1);
81 return 0.5 *
CEC_max * (cos(cos_arg) + 1);
84template <
typename TemperatureType>
88 return A_H(T) / (6 * std::numbers::pi) *
93template <
typename TemperatureType>
96 auto const dielectric_term =
100 auto const prefactor_dielectic =
102 auto const prefactor_RI =
105 return prefactor_dielectic * dielectric_term + prefactor_RI * RI_term;
108template <
typename TemperatureType>
114template <
typename TemperatureType>
118 auto const delta_hr = -0.5151936137548038;
119 return delta_hr * pow((1 -
Tr) / (1 - T), 0.38);
122template <
typename TemperatureType>
126 return 1.0 / psi_aev;
129template <
typename TemperatureType>
131 TemperatureType T)
const
133 auto const r_w =
rho_w(T) / 1000.0;
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)) +
140template <
typename TemperatureType>
146template <
typename TemperatureType>
149 double const pi = 0.0;
150 auto const tau =
ref_T_ / T;
158 std::string
const& material)
161 MaterialLib::Fluid::DimensionLessGibbsFreeEnergyRegion1())
167 nu_mr = 2.752035e-01;
174 n_s = 1.3298392371979677;
182 nu_mr = 7.994125e-02;
189 n_s = 35.435652398543425;
197 nu_mr = 3.374814e-01;
204 n_s = 748.7804881357005;
212 nu_mr = 1.505956e-01;
219 n_s = 2175.885110079861;
228 "Material '{}' not implemented in SaturationLuMcCartney model.",
236 double const dt)
const
241 auto const& medium = *std::get<Medium*>(
scale_);
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));
251 rho_d_and_phi.
density = rho_s * (1.0 - phi);
253 double const p_cut = 1e-10;
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);
261 if (p_cap >= p_cap_max)
271 double const dt)
const
277 "SaturationLuMcCartney::dValue is implemented for derivatives "
278 "with respect to capillary pressure or temperature only.");
284 auto const& medium = *std::get<Medium*>(
scale_);
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));
294 rho_d_and_phi.
density = rho_s * (1.0 - phi);
297 auto const p_cap_max =
psi_max(T);
298 auto const p_cut = 1.0e-10;
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);
305 if (p_cap >= p_cap_max)
311 if (p_cap <= 1.0e-10)
315 return y.derivative(1, 0) / phi;
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);
325 return y_b2.derivative(0, 1) / phi;
327 DS = y.derivative(0, 1);
335 double const t,
double const dt)
const
343 "SaturationLuMcCartney::d2Value is implemented for derivatives "
344 "with respect to capillary pressure only.");
349 auto const& medium = *std::get<Medium*>(
scale_);
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));
359 rho_d_and_phi.
density = rho_s * (1.0 - phi);
362 auto const p_cap_max =
psi_max(T);
363 auto const p_cut = 1e-10;
365 if (p_cap >= p_cap_max)
375 auto const variables = make_ftuple<double, 2, 2>(p_cap, T);
376 auto const& v = std::get<0>(variables);
377 auto const& w = std::get<1>(variables);
380 auto returnVariableTuple = [](
const Variable v1,
381 const Variable v2) -> std::tuple<int, int>
394 auto [i, j] = returnVariableTuple(variable1, variable2);
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);
403 return y_b2.derivative(i, j) / phi;
406 DDS = y.derivative(i, j);
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
double const n_w
diffraction index
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
double eta_alpha
soil related coefficient
std::string const material_
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.
static constexpr double ref_p_
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
double capillary_pressure
constexpr double WaterVapour
Specific gas constant for water vapour.
constexpr double BoltzmannConstant
J/K.
constexpr double PlanckConstant
J s.
constexpr double IdealGasConstant
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