OGS
MaterialPropertyLib::SpecificHeatCapacityWithLatentHeat Class Referencefinal

Detailed Description

Model for the apparent specific heat capacity including latent heat \(\ell\)

This model is for media with a phase change. This property must be a medium property, it computes the apparent specific heat capacity based on a phase transition spread over a temperature interval:

\[ C_{\mathrm{app}} = \left[C - \varrho_\mathrm{fR} \ell \frac{\partial \phi_\mathrm{f}}{\partial T} \right] \quad\rightarrow\quad c_{\mathrm{app}} = \frac{C_{\mathrm{app}}}{\varrho} \]

with \(\ell\) as specific enthalpy of melting, \(C\) as effective volumetric heat capacity and \(\varrho\) as the effective density of the mixture, \(\varrho_\mathrm{fR}\) as the real density of the frozen phase as well as \(\phi_\mathrm{f}\) as the temperature-dependent frozen liquid volume fraction.

Definition at line 30 of file SpecificHeatCapacityWithLatentHeat.h.

#include <SpecificHeatCapacityWithLatentHeat.h>

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

Classes

struct  PhaseProperties

Public Member Functions

 SpecificHeatCapacityWithLatentHeat (std::string name, double const l)
void checkScale () const override
void setProperties (std::vector< std::unique_ptr< Phase > > const &phases) override
 Default implementation:
double effectiveVolumetricHeatCapacity (VariableArray const &variable_array, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const
PropertyDataType value (VariableArray const &variable_array, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
PropertyDataType dValue (VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
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 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.
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 Attributes

double const l_
PhaseProperties densities_
 Pointers to the properties in each phase.
PhaseProperties spec_heat_capacities_
 Pointers to the properties in each phase.

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

◆ SpecificHeatCapacityWithLatentHeat()

MaterialPropertyLib::SpecificHeatCapacityWithLatentHeat::SpecificHeatCapacityWithLatentHeat ( std::string name,
double const l )

Member Function Documentation

◆ checkScale()

void MaterialPropertyLib::SpecificHeatCapacityWithLatentHeat::checkScale ( ) const
overridevirtual

Reimplemented from MaterialPropertyLib::Property.

Definition at line 17 of file SpecificHeatCapacityWithLatentHeat.cpp.

18{
19 if (!std::holds_alternative<Medium*>(scale_))
20 {
22 "The property 'SpecificHeatCapacityWithLatentHeat' is "
23 "implemented on the 'medium' scale only.");
24 }
25}
#define OGS_FATAL(...)
Definition Error.h:19
std::variant< Medium *, Phase *, Component * > scale_

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

◆ dValue()

PropertyDataType MaterialPropertyLib::SpecificHeatCapacityWithLatentHeat::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 126 of file SpecificHeatCapacityWithLatentHeat.cpp.

130{
131 (void)variable;
132 assert((variable == Variable::temperature) &&
133 "SpecificHeatCapacityWithLatentHeat::dvalue is implemented for "
134 "derivatives with respect to temperature only.");
135
136 auto const& medium = *std::get<Medium*>(scale_);
137 auto const& effective_density_property = medium[PropertyType::density];
138 auto const& frozen_fraction_property =
140
141 auto const rho_eff = effective_density_property.template value<double>(
142 variable_array, pos, t, dt);
143 auto const rho_li =
144 std::get<double>(densities_.liquid->value(variable_array, pos, t, dt));
145 auto const rho_fr =
146 std::get<double>(densities_.frozen->value(variable_array, pos, t, dt));
147 auto const c_li = std::get<double>(
148 spec_heat_capacities_.liquid->value(variable_array, pos, t, dt));
149 auto const c_fr = std::get<double>(
150 spec_heat_capacities_.frozen->value(variable_array, pos, t, dt));
151 auto const drho_dT = effective_density_property.template dValue<double>(
152 variable_array, Variable::temperature, pos, t, dt);
153 auto const dphi_fr_dT = frozen_fraction_property.template dValue<double>(
154 variable_array, Variable::temperature, pos, t, dt);
155 auto const d2phi_fr_dT2 = frozen_fraction_property.template d2Value<double>(
156 variable_array, Variable::temperature, Variable::temperature, pos, t,
157 dt);
158 auto const Cvol =
159 effectiveVolumetricHeatCapacity(variable_array, pos, t, dt);
160 // TODO: avoid duplicate code, call value()?
161 auto const C_app = (Cvol - l_ * rho_eff * dphi_fr_dT) / rho_eff;
162 auto const dCvol_dphi_fr = rho_fr * c_fr - rho_li * c_li;
163 auto const dCvol_app_dT =
164 dCvol_dphi_fr * dphi_fr_dT - l_ * rho_eff * d2phi_fr_dT2;
165
166 return (dCvol_app_dT - drho_dT / rho_eff * C_app) / rho_eff;
167}
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.
virtual PropertyDataType value() const
PhaseProperties spec_heat_capacities_
Pointers to the properties in each phase.
PhaseProperties densities_
Pointers to the properties in each phase.
PropertyDataType dValue(VariableArray const &variable_array, Variable const variable, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const override
double effectiveVolumetricHeatCapacity(VariableArray const &variable_array, ParameterLib::SpatialPosition const &pos, double const t, double const dt) const

References MaterialPropertyLib::Property::d2Value(), densities_, MaterialPropertyLib::density, dValue(), effectiveVolumetricHeatCapacity(), l_, MaterialPropertyLib::Property::scale_, spec_heat_capacities_, MaterialPropertyLib::temperature, MaterialPropertyLib::Property::value(), and MaterialPropertyLib::volume_fraction.

Referenced by dValue(), and value().

◆ effectiveVolumetricHeatCapacity()

double MaterialPropertyLib::SpecificHeatCapacityWithLatentHeat::effectiveVolumetricHeatCapacity ( VariableArray const & variable_array,
ParameterLib::SpatialPosition const & pos,
double const t,
double const dt ) const

Definition at line 64 of file SpecificHeatCapacityWithLatentHeat.cpp.

68{
69 auto const& medium = *std::get<Medium*>(scale_);
70 auto const& porosity_property = medium[PropertyType::porosity];
71 auto const& frozen_fraction_property =
73
74 auto const phi =
75 std::get<double>(porosity_property.value(variable_array, pos, t, dt));
76 auto const phi_fr = std::get<double>(
77 frozen_fraction_property.value(variable_array, pos, t, dt));
78 auto const phi_li = phi - phi_fr;
79 auto const phi_po = 1 - phi;
80
81 auto const rho_li =
82 std::get<double>(densities_.liquid->value(variable_array, pos, t, dt));
83 auto const rho_fr =
84 std::get<double>(densities_.frozen->value(variable_array, pos, t, dt));
85 auto const rho_po =
86 std::get<double>(densities_.porous->value(variable_array, pos, t, dt));
87
88 auto const c_li = std::get<double>(
89 spec_heat_capacities_.liquid->value(variable_array, pos, t, dt));
90 auto const c_fr = std::get<double>(
91 spec_heat_capacities_.frozen->value(variable_array, pos, t, dt));
92 auto const c_po = std::get<double>(
93 spec_heat_capacities_.porous->value(variable_array, pos, t, dt));
94
95 // rule of mixtures for resulting volumetric heat capacity
96 // (mass fraction average of specific heat capacities!)
97 return phi_li * rho_li * c_li + phi_fr * rho_fr * c_fr +
98 phi_po * rho_po * c_po;
99}

References densities_, MaterialPropertyLib::porosity, MaterialPropertyLib::Property::scale_, spec_heat_capacities_, and MaterialPropertyLib::volume_fraction.

Referenced by dValue(), and value().

◆ setProperties()

void MaterialPropertyLib::SpecificHeatCapacityWithLatentHeat::setProperties ( std::vector< std::unique_ptr< Phase > > const & phases)
overridevirtual

Default implementation:

This virtual method will collect the properties of the phases in order to access them from the medium property level.

Reimplemented from MaterialPropertyLib::Property.

Definition at line 27 of file SpecificHeatCapacityWithLatentHeat.cpp.

29{
30 // run over phases, identify them and get properties
31 for (auto const& phase : phases)
32 {
33 if (phase == nullptr)
34 {
36 "One of the required phases (AqueousLiquid/FrozenLiquid/Solid) "
37 "does not exist!");
38 }
39 std::string const& phase_name = phase->name;
40
41 auto const& density_property =
43 auto const& specific_heat_capacity_property = phase->property(
45
46 if (phase_name == "AqueousLiquid")
47 {
48 densities_.liquid = &density_property;
49 spec_heat_capacities_.liquid = &specific_heat_capacity_property;
50 }
51 else if (phase_name == "FrozenLiquid")
52 {
53 densities_.frozen = &density_property;
54 spec_heat_capacities_.frozen = &specific_heat_capacity_property;
55 }
56 else if (phase_name == "Solid")
57 {
58 densities_.porous = &density_property;
59 spec_heat_capacities_.porous = &specific_heat_capacity_property;
60 }
61 }
62}

References densities_, MaterialPropertyLib::density, OGS_FATAL, spec_heat_capacities_, and MaterialPropertyLib::specific_heat_capacity.

◆ value()

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

This virtual method will compute the property value based on the variables that are passed as arguments with the default implementation using empty variables array for the previous time step.

Reimplemented from MaterialPropertyLib::Property.

Definition at line 101 of file SpecificHeatCapacityWithLatentHeat.cpp.

105{
106 auto const& medium = *std::get<Medium*>(scale_);
107 auto const& effective_density_property = medium[PropertyType::density];
108 auto const& frozen_fraction_property =
110
111 auto const rho_eff = effective_density_property.template value<double>(
112 variable_array, pos, t, dt);
113 auto const rho_fr =
114 std::get<double>(densities_.frozen->value(variable_array, pos, t, dt));
115 auto const dphi_fr_dT = frozen_fraction_property.template dValue<double>(
116 variable_array, Variable::temperature, pos, t, dt);
117
118 auto const Cvol =
119 effectiveVolumetricHeatCapacity(variable_array, pos, t, dt);
120 auto const Lvol = l_ * rho_fr;
121 auto const Cvol_app = Cvol - Lvol * dphi_fr_dT;
122 // divide volumetric quantity by density in order to obtain specific value
123 return Cvol_app / rho_eff;
124}

References densities_, MaterialPropertyLib::density, dValue(), effectiveVolumetricHeatCapacity(), l_, MaterialPropertyLib::Property::scale_, MaterialPropertyLib::temperature, MaterialPropertyLib::Property::value(), and MaterialPropertyLib::volume_fraction.

Member Data Documentation

◆ densities_

PhaseProperties MaterialPropertyLib::SpecificHeatCapacityWithLatentHeat::densities_
private

Pointers to the properties in each phase.

Definition at line 69 of file SpecificHeatCapacityWithLatentHeat.h.

Referenced by dValue(), effectiveVolumetricHeatCapacity(), setProperties(), and value().

◆ l_

double const MaterialPropertyLib::SpecificHeatCapacityWithLatentHeat::l_
private

◆ spec_heat_capacities_

PhaseProperties MaterialPropertyLib::SpecificHeatCapacityWithLatentHeat::spec_heat_capacities_
private

Pointers to the properties in each phase.

Definition at line 71 of file SpecificHeatCapacityWithLatentHeat.h.

Referenced by dValue(), effectiveVolumetricHeatCapacity(), and setProperties().


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