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:10
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 130 of file SpecificHeatCapacityWithLatentHeat.cpp.

134{
135 (void)variable;
136 assert((variable == Variable::temperature) &&
137 "SpecificHeatCapacityWithLatentHeat::dvalue is implemented for "
138 "derivatives with respect to temperature only.");
139
140 auto const& medium = *std::get<Medium*>(scale_);
141 auto const& effective_density_property = medium[PropertyType::density];
142 auto const& porosity_property = medium[PropertyType::porosity];
143 auto const& frozen_liquid_saturation_property =
145
146 auto const rho_eff = effective_density_property.template value<double>(
147 variable_array, pos, t, dt);
148 auto const rho_li =
149 std::get<double>(densities_.liquid->value(variable_array, pos, t, dt));
150 auto const rho_fr =
151 std::get<double>(densities_.frozen->value(variable_array, pos, t, dt));
152 auto const c_li = std::get<double>(
153 spec_heat_capacities_.liquid->value(variable_array, pos, t, dt));
154 auto const c_fr = std::get<double>(
155 spec_heat_capacities_.frozen->value(variable_array, pos, t, dt));
156 auto const drho_dT = effective_density_property.template dValue<double>(
157 variable_array, Variable::temperature, pos, t, dt);
158 auto const dS_fr_dT =
159 frozen_liquid_saturation_property.template dValue<double>(
160 variable_array, Variable::temperature, pos, t, dt);
161 auto const d2S_fr_dT2 =
162 frozen_liquid_saturation_property.template d2Value<double>(
163 variable_array, Variable::temperature, Variable::temperature, pos,
164 t, dt);
165 auto const phi =
166 std::get<double>(porosity_property.value(variable_array, pos, t, dt));
167 auto const Cvol =
168 effectiveVolumetricHeatCapacity(variable_array, pos, t, dt);
169 // TODO: avoid duplicate code, call value()?
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;
174
175 return (dCvol_app_dT - drho_dT * C_app) / rho_eff;
176}
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(), MaterialPropertyLib::frozen_liquid_saturation, l_, MaterialPropertyLib::porosity, MaterialPropertyLib::Property::scale_, spec_heat_capacities_, MaterialPropertyLib::temperature, and MaterialPropertyLib::Property::value().

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 63 of file SpecificHeatCapacityWithLatentHeat.cpp.

67{
68 auto const& medium = *std::get<Medium*>(scale_);
69 auto const& porosity_property = medium[PropertyType::porosity];
70 auto const& frozen_liquid_saturation_property =
72
73 auto const phi =
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;
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::frozen_liquid_saturation, MaterialPropertyLib::porosity, MaterialPropertyLib::Property::scale_, and spec_heat_capacities_.

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
40 auto const& density_property =
42 auto const& specific_heat_capacity_property = phase->property(
44
45 if (phase->phaseName == PhaseName::AqueousLiquid)
46 {
47 densities_.liquid = &density_property;
48 spec_heat_capacities_.liquid = &specific_heat_capacity_property;
49 }
50 else if (phase->phaseName == PhaseName::FrozenLiquid)
51 {
52 densities_.frozen = &density_property;
53 spec_heat_capacities_.frozen = &specific_heat_capacity_property;
54 }
55 else if (phase->phaseName == PhaseName::Solid)
56 {
57 densities_.porous = &density_property;
58 spec_heat_capacities_.porous = &specific_heat_capacity_property;
59 }
60 }
61}

References MaterialPropertyLib::AqueousLiquid, densities_, MaterialPropertyLib::density, MaterialPropertyLib::FrozenLiquid, OGS_FATAL, MaterialPropertyLib::Solid, 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& porosity_property = medium[PropertyType::porosity];
109 auto const& frozen_liquid_saturation_property =
111
112 auto const rho_eff = effective_density_property.template value<double>(
113 variable_array, pos, t, dt);
114 auto const rho_fr =
115 std::get<double>(densities_.frozen->value(variable_array, pos, t, dt));
116 auto const dS_fr_dT =
117 frozen_liquid_saturation_property.template dValue<double>(
118 variable_array, Variable::temperature, pos, t, dt);
119
120 auto const Cvol =
121 effectiveVolumetricHeatCapacity(variable_array, pos, t, dt);
122 auto const phi =
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;
126 // divide volumetric quantity by density in order to obtain specific value
127 return Cvol_app / rho_eff;
128}

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

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: