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_fraction_property =
74 std::get<double>(porosity_property.value(variable_array, pos, t, dt));
75 auto const phi_fr = std::get<double>(
76 frozen_fraction_property.value(variable_array, pos, t, dt));
77 auto const phi_li = phi - phi_fr;
78 auto const phi_po = 1 - phi;
81 std::get<double>(
densities_.liquid->value(variable_array, pos, t, dt));
83 std::get<double>(
densities_.frozen->value(variable_array, pos, t, dt));
85 std::get<double>(
densities_.porous->value(variable_array, pos, t, dt));
87 auto const c_li = std::get<double>(
89 auto const c_fr = std::get<double>(
91 auto const c_po = std::get<double>(
96 return phi_li * rho_li * c_li + phi_fr * rho_fr * c_fr +
97 phi_po * rho_po * c_po;
103 double const dt)
const
105 auto const& medium = *std::get<Medium*>(
scale_);
107 auto const& frozen_fraction_property =
110 auto const rho_eff = effective_density_property.template
value<double>(
111 variable_array, pos, t, dt);
113 std::get<double>(
densities_.frozen->value(variable_array, pos, t, dt));
114 auto const dphi_fr_dT = frozen_fraction_property.template
dValue<double>(
119 auto const Lvol =
l_ * rho_fr;
120 auto const Cvol_app = Cvol - Lvol * dphi_fr_dT;
122 return Cvol_app / rho_eff;
128 double const dt)
const
132 "SpecificHeatCapacityWithLatentHeat::dvalue is implemented for "
133 "derivatives with respect to temperature only.");
135 auto const& medium = *std::get<Medium*>(
scale_);
137 auto const& frozen_fraction_property =
140 auto const rho_eff = effective_density_property.template
value<double>(
141 variable_array, pos, t, dt);
143 std::get<double>(
densities_.liquid->value(variable_array, pos, t, dt));
145 std::get<double>(
densities_.frozen->value(variable_array, pos, t, dt));
146 auto const c_li = std::get<double>(
148 auto const c_fr = std::get<double>(
150 auto const drho_dT = effective_density_property.template
dValue<double>(
152 auto const dphi_fr_dT = frozen_fraction_property.template
dValue<double>(
154 auto const d2phi_fr_dT2 = frozen_fraction_property.template
d2Value<double>(
160 auto const C_app = (Cvol -
l_ * rho_eff * dphi_fr_dT) / rho_eff;
161 auto const dCvol_dphi_fr = rho_fr * c_fr - rho_li * c_li;
162 auto const dCvol_app_dT =
163 dCvol_dphi_fr * dphi_fr_dT -
l_ * rho_eff * d2phi_fr_dT2;
165 return (dCvol_app_dT - drho_dT / rho_eff * 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