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

129{
130 (void)variable;
131 assert((variable == Variable::temperature) &&
132 "SpecificHeatCapacityWithLatentHeat::dvalue is implemented for "
133 "derivatives with respect to temperature only.");
134
135 auto const& medium = *std::get<Medium*>(scale_);
136 auto const& effective_density_property = medium[PropertyType::density];
137 auto const& frozen_fraction_property =
139
140 auto const rho_eff = effective_density_property.template value<double>(
141 variable_array, pos, t, dt);
142 auto const rho_li =
143 std::get<double>(densities_.liquid->value(variable_array, pos, t, dt));
144 auto const rho_fr =
145 std::get<double>(densities_.frozen->value(variable_array, pos, t, dt));
146 auto const c_li = std::get<double>(
147 spec_heat_capacities_.liquid->value(variable_array, pos, t, dt));
148 auto const c_fr = std::get<double>(
149 spec_heat_capacities_.frozen->value(variable_array, pos, t, dt));
150 auto const drho_dT = effective_density_property.template dValue<double>(
151 variable_array, Variable::temperature, pos, t, dt);
152 auto const dphi_fr_dT = frozen_fraction_property.template dValue<double>(
153 variable_array, Variable::temperature, pos, t, dt);
154 auto const d2phi_fr_dT2 = frozen_fraction_property.template d2Value<double>(
155 variable_array, Variable::temperature, Variable::temperature, pos, t,
156 dt);
157 auto const Cvol =
158 effectiveVolumetricHeatCapacity(variable_array, pos, t, dt);
159 // TODO: avoid duplicate code, call value()?
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;
164
165 return (dCvol_app_dT - drho_dT / rho_eff * C_app) / rho_eff;
166}
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 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_fraction_property =
72
73 auto const phi =
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;
79
80 auto const rho_li =
81 std::get<double>(densities_.liquid->value(variable_array, pos, t, dt));
82 auto const rho_fr =
83 std::get<double>(densities_.frozen->value(variable_array, pos, t, dt));
84 auto const rho_po =
85 std::get<double>(densities_.porous->value(variable_array, pos, t, dt));
86
87 auto const c_li = std::get<double>(
88 spec_heat_capacities_.liquid->value(variable_array, pos, t, dt));
89 auto const c_fr = std::get<double>(
90 spec_heat_capacities_.frozen->value(variable_array, pos, t, dt));
91 auto const c_po = std::get<double>(
92 spec_heat_capacities_.porous->value(variable_array, pos, t, dt));
93
94 // rule of mixtures for resulting volumetric heat capacity
95 // (mass fraction average of specific heat capacities!)
96 return phi_li * rho_li * c_li + phi_fr * rho_fr * c_fr +
97 phi_po * rho_po * c_po;
98}

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

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

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: