28 std::vector<std::unique_ptr<Phase>>
const& phases)
31 for (
auto const& phase : phases)
36 "One of the required phases (AqueousLiquid/FrozenLiquid/Solid) "
40 auto const& density_property =
42 auto const& specific_heat_capacity_property = phase->property(
66 double const dt)
const
68 auto const& medium = *std::get<Medium*>(
scale_);
70 auto const& frozen_liquid_saturation_property =
74 std::get<double>(porosity_property.value(variable_array, pos, t, dt));
75 auto const S_fr = std::get<double>(
76 frozen_liquid_saturation_property.value(variable_array, pos, t, dt));
77 auto const phi_li = phi * (1.0 - S_fr);
78 auto const phi_fr = phi * S_fr;
79 auto const phi_po = 1 - phi;
82 std::get<double>(
densities_.liquid->value(variable_array, pos, t, dt));
84 std::get<double>(
densities_.frozen->value(variable_array, pos, t, dt));
86 std::get<double>(
densities_.porous->value(variable_array, pos, t, dt));
88 auto const c_li = std::get<double>(
90 auto const c_fr = std::get<double>(
92 auto const c_po = std::get<double>(
97 return phi_li * rho_li * c_li + phi_fr * rho_fr * c_fr +
98 phi_po * rho_po * c_po;
104 double const dt)
const
106 auto const& medium = *std::get<Medium*>(
scale_);
109 auto const& frozen_liquid_saturation_property =
112 auto const rho_eff = effective_density_property.template
value<double>(
113 variable_array, pos, t, dt);
115 std::get<double>(
densities_.frozen->value(variable_array, pos, t, dt));
116 auto const dS_fr_dT =
123 std::get<double>(porosity_property.value(variable_array, pos, t, dt));
124 auto const Lvol =
l_ * rho_fr * phi;
125 auto const Cvol_app = Cvol - Lvol * dS_fr_dT;
127 return Cvol_app / rho_eff;
133 double const dt)
const
137 "SpecificHeatCapacityWithLatentHeat::dvalue is implemented for "
138 "derivatives with respect to temperature only.");
140 auto const& medium = *std::get<Medium*>(
scale_);
143 auto const& frozen_liquid_saturation_property =
146 auto const rho_eff = effective_density_property.template
value<double>(
147 variable_array, pos, t, dt);
149 std::get<double>(
densities_.liquid->value(variable_array, pos, t, dt));
151 std::get<double>(
densities_.frozen->value(variable_array, pos, t, dt));
152 auto const c_li = std::get<double>(
154 auto const c_fr = std::get<double>(
156 auto const drho_dT = effective_density_property.template
dValue<double>(
158 auto const dS_fr_dT =
161 auto const d2S_fr_dT2 =
166 std::get<double>(porosity_property.value(variable_array, pos, t, dt));
170 auto const C_app = (Cvol -
l_ * rho_fr * phi * dS_fr_dT) / rho_eff;
171 auto const dCvol_dS_fr = phi * (rho_fr * c_fr - rho_li * c_li);
172 auto const dCvol_app_dT =
173 dCvol_dS_fr * dS_fr_dT -
l_ * rho_fr * phi * d2S_fr_dT2;
175 return (dCvol_app_dT - drho_dT * C_app) / rho_eff;
virtual PropertyDataType d2Value(VariableArray const &variable_array, Variable const variable1, Variable const variable2, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
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