Buildings.Fluid.Storage.Ice

Ice tank model

Information

Package with ice thermal storage models.

Extends from Modelica.Icons.Package (Icon for standard packages).

Package Content

Name Description
Buildings.Fluid.Storage.Ice.ControlledTank ControlledTank Ice tank with performance based on performance curves and built-in control for outlet temperature
Buildings.Fluid.Storage.Ice.Tank Tank Ice tank with performance based on performance curves
Buildings.Fluid.Storage.Ice.Data Data Performance data for ice thermal tank
Buildings.Fluid.Storage.Ice.Validation Validation Package that validates the ice tank model
Buildings.Fluid.Storage.Ice.BaseClasses BaseClasses Base classes for ice tank models

Buildings.Fluid.Storage.Ice.ControlledTank Buildings.Fluid.Storage.Ice.ControlledTank

Ice tank with performance based on performance curves and built-in control for outlet temperature

Buildings.Fluid.Storage.Ice.ControlledTank

Information

This model implements an ice tank model with built-in idealized control that tracks the set point TSet for the temperature of the working fluid that leaves the tank, as shown in the figure below.

Schematics of the controlled tank

The model is identical to Buildings.Fluid.Storage.Ice.Tank, except that it takes as an input the set point for the temperature of the leaving working fluid. This temperature is maintained if the flow rate and temperatures allow sufficient heat flow rate between the tank and the working fluid.

The built-in control is an idealization of a tank that has a controller that bypasses some of the working fluid in order to meet the set point for the temperature of the leaving working fluid. The fluid from port_a to port_b has by default a first order response. If the tank has sufficient capacity for the given inlet temperature and flow rate, then the idealized control has no steady-state error. During transients, the set point may not be met exactly due to the first order response that approximates the dynamics of the heat exchanger.

Note that the setpoint is also tracked during charging mode. If the full flow rate should go through the tank during charging, which is generally desired, then set TSet to a high temperature, such as 20°C.

Usage

This model requires the fluid to flow from port_a to port_b. Otherwise, the simulation stops with an error.

Extends from Buildings.Fluid.Storage.Ice.Tank (Ice tank with performance based on performance curves).

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
Genericperredeclare parameter Building...Performance data
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
PressureDifferencedp_nominal Pressure difference [Pa]
Advanced
MassFlowRatem_flow_small1E-4*abs(m_flow_nominal)Small mass flow rate for regularization of zero flow [kg/s]
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed
Flow resistance
Booleanfrom_dpfalse= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistancefalse= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM0.1Fraction of nominal flow rate where flow transitions to laminar
Initialization
AbsolutePressurep_startMedium.p_defaultStart value of pressure [Pa]
TemperatureT_startMedium.T_defaultStart value of temperature [K]
MassFractionX_start[Medium.nX]Medium.X_defaultStart value of mass fractions m_i/m [kg/kg]
ExtraPropertyC_start[Medium.nC]fill(0, Medium.nC)Start value of trace substances
RealSOC_start Start value for state of charge [1]
Dynamics heat exchanger
Conservation equations
DynamicsenergyDynamicsHexModelica.Fluid.Types.Dynamic...Formulation of energy balance for heat exchanger internal fluid mass
TimetauHex30Time constant of working fluid through the heat exchanger at nominal flow [s]

Connectors

TypeNameDescription
FluidPort_aport_aFluid connector a (positive design flow direction is from port_a to port_b)
FluidPort_bport_bFluid connector b (positive design flow direction is from port_a to port_b)
output RealOutputSOCstate of charge [1]
output RealOutputTTemperature of the fluid leaving at port_b [K]
output RealOutputmIceMass of remaining ice [kg]
output RealOutputQ_flowHeat flow rate, positive during charging, negative when melting the ice [W]
input RealInputTSetOutlet temperature setpoint during discharging [K]

Modelica definition

model ControlledTank "Ice tank with performance based on performance curves and built-in control for outlet temperature" extends Buildings.Fluid.Storage.Ice.Tank( limQ_flow(y=if tanHeaTra.canMelt.y then m_flow*cp*(max(per.TFre, TSet) - TIn.y) elseif tanHeaTra.canFreeze.y then m_flow*cp*(max(TIn.y, min(per.TFre, TSet)) - TIn.y) else m_flow*cp*(per.TFre - TIn.y))); Modelica.Blocks.Interfaces.RealInput TSet( final unit="K", final displayUnit="degC") "Outlet temperature setpoint during discharging"; end ControlledTank;

Buildings.Fluid.Storage.Ice.Tank Buildings.Fluid.Storage.Ice.Tank

Ice tank with performance based on performance curves

Buildings.Fluid.Storage.Ice.Tank

Information

This model implements an ice tank model whose performance is computed based on performance curves.

The model is based on the implementation of Guowen et al., 2020 and similar to the detailed EnergyPlus ice tank model ThermalStorage:Ice:Detailed.

The governing equations are as follows:

The mass of ice in the storage mice is calculated as

d SOC/dt = Q̇/(Hf   mice,max)

mice = SOC   mice,max

where SOC is state of charge, is the heat transfer rate of the ice tank, positive for charging and negative for discharging, Hf is the fusion of heat of ice and mice,max is the nominal mass of ice in the storage tank.

The heat transfer rate of the ice tank is computed using

Q̇ = Qsto,nom   q*,

where Qsto,nom is the storage capacity and q* is a normalized heat flow rate. The storage capacity is

Qsto,nom = Hf   mice,max,

where Hf is the latent heat of fusion of ice and mice,max is the maximum ice storage capacity.

The normalized heat flow rate is computed using performance curves for charging (freezing) or discharging (melting). For charging, the heat transfer rate q* between the chilled water and the ice in the thermal storage tank is calculated using

q* Δt = C1 + C2x + C3 x2 + [C4 + C5x + C6 x2]ΔTlmtd*

where Δt is the time step of the data samples used for the curve fitting, C1-6 are the curve fit coefficients, x is the fraction of charging, also known as the state-of-charge, and Tlmtd* is the normalized LMTD calculated using Buildings.Fluid.Storage.Ice.BaseClasses.calculateLMTDStar. Similarly, for discharging, the heat transfer rate q* between the chilled water and the ice in the thermal storage tank is

- q* Δt = D1 + D2(1-x) + D3 (1-x)2 + [D4 + D5(1-x) + D6 (1-x)2]ΔTlmtd*

where Δt is the time step of the data samples used for the curve fitting, D1-6 are the curve fit coefficients.

The normalized LMTD ΔTlmtd* uses a nominal temperature difference of 10 Kelvin. This value must be used when obtaining the curve fit coefficients.

The log mean temperature difference is calculated using

ΔTlmtd* = ΔTlmtd/Tnom

ΔTlmtd = (Tin - Tout)/ln((Tin - Tfre)/(Tout - Tfre))

where Tin is the inlet temperature, Tout is the outlet temperature, Tfre is the freezing temperature and Tnom is a nominal temperature difference of 10 Kelvin.

Usage

This model requires the fluid to flow from port_a to port_b. Otherwise, the simulation stops with an error.

Reference

Strand, R.K. 1992. “Indirect Ice Storage System Simulation,” M.S. Thesis, Department of Mechanical and Industrial Engineering, University of Illinois at Urbana-Champaign.

Guowen Li, Yangyang Fu, Amanda Pertzborn, Jin Wen and Zheng O'Neill. An Ice Storage Tank Modelica Model: Implementation and Validation. Modelica Conferences. 2021. doi:10.3384/ecp21181177.

Extends from Buildings.Fluid.Interfaces.TwoPortHeatMassExchanger (Partial model transporting one fluid stream with storing mass or energy).

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
Genericperredeclare parameter Building...Performance data
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
PressureDifferencedp_nominal Pressure difference [Pa]
Assumptions
BooleanallowFlowReversalfalse= false to simplify equations, assuming, but not enforcing, no flow reversal
Advanced
MassFlowRatem_flow_small1E-4*abs(m_flow_nominal)Small mass flow rate for regularization of zero flow [kg/s]
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed
Flow resistance
Booleanfrom_dpfalse= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistancefalse= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM0.1Fraction of nominal flow rate where flow transitions to laminar
Dynamics
Nominal condition
TimetautauHexTime constant at nominal flow (if energyDynamics <> SteadyState) [s]
Conservation equations
DynamicsenergyDynamicsenergyDynamicsHexType of energy balance: dynamic (3 initialization options) or steady state
Initialization
AbsolutePressurep_startMedium.p_defaultStart value of pressure [Pa]
TemperatureT_startMedium.T_defaultStart value of temperature [K]
MassFractionX_start[Medium.nX]Medium.X_defaultStart value of mass fractions m_i/m [kg/kg]
ExtraPropertyC_start[Medium.nC]fill(0, Medium.nC)Start value of trace substances
RealSOC_start Start value for state of charge [1]
Dynamics heat exchanger
Conservation equations
DynamicsenergyDynamicsHexModelica.Fluid.Types.Dynamic...Formulation of energy balance for heat exchanger internal fluid mass
TimetauHex30Time constant of working fluid through the heat exchanger at nominal flow [s]

Connectors

TypeNameDescription
FluidPort_aport_aFluid connector a (positive design flow direction is from port_a to port_b)
FluidPort_bport_bFluid connector b (positive design flow direction is from port_a to port_b)
output RealOutputSOCstate of charge [1]
output RealOutputTTemperature of the fluid leaving at port_b [K]
output RealOutputmIceMass of remaining ice [kg]
output RealOutputQ_flowHeat flow rate, positive during charging, negative when melting the ice [W]

Modelica definition

model Tank "Ice tank with performance based on performance curves" extends Buildings.Fluid.Interfaces.TwoPortHeatMassExchanger( final allowFlowReversal = false, final tau=tauHex, final energyDynamics=energyDynamicsHex, redeclare final Buildings.Fluid.MixingVolumes.MixingVolume vol); parameter Real SOC_start(min=0, max=1, final unit="1") "Start value for state of charge"; replaceable parameter Buildings.Fluid.Storage.Ice.Data.Tank.Generic per "Performance data"; parameter Modelica.Fluid.Types.Dynamics energyDynamicsHex= Modelica.Fluid.Types.Dynamics.DynamicFreeInitial "Formulation of energy balance for heat exchanger internal fluid mass"; parameter Modelica.Units.SI.Time tauHex(min=1) = 30 "Time constant of working fluid through the heat exchanger at nominal flow"; // Initialization parameter Medium.AbsolutePressure p_start = Medium.p_default "Start value of pressure"; parameter Medium.Temperature T_start = Medium.T_default "Start value of temperature"; parameter Medium.MassFraction X_start[Medium.nX]( final quantity=Medium.substanceNames) = Medium.X_default "Start value of mass fractions m_i/m"; parameter Medium.ExtraProperty C_start[Medium.nC]( final quantity=Medium.extraPropertiesNames)=fill(0, Medium.nC) "Start value of trace substances"; final parameter Modelica.Units.SI.SpecificHeatCapacity cp= Medium.specificHeatCapacityCp( Medium.setState_pTX( p=Medium.p_default, T=273.15, X=Medium.X_default)) "Specific heat capacity of working fluid"; Modelica.Blocks.Interfaces.RealOutput SOC( final unit = "1") "state of charge"; Modelica.Blocks.Interfaces.RealOutput T( final quantity="ThermodynamicTemperature", final unit = "K", displayUnit = "degC", min=0) "Temperature of the fluid leaving at port_b"; Modelica.Blocks.Interfaces.RealOutput mIce( quantity="Mass", unit="kg") "Mass of remaining ice"; Modelica.Blocks.Interfaces.RealOutput Q_flow(final unit="W") "Heat flow rate, positive during charging, negative when melting the ice"; protected Buildings.Fluid.Storage.Ice.BaseClasses.Tank tanHeaTra( final SOC_start=SOC_start, final per=per, final cp=cp) "Model for tank heat transfer between working fluid and ice"; Buildings.HeatTransfer.Sources.PrescribedHeatFlow preHeaFlo "Prescribed heat flow"; Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor temSen "Temperature of fluid"; Modelica.Blocks.Sources.RealExpression TIn( final y=Medium.temperature(state= Medium.setState_phX( p=port_a.p, h=inStream(port_a.h_outflow), X=inStream(port_a.Xi_outflow)))) "Inlet temperature into tank"; Modelica.Blocks.Sources.RealExpression limQ_flow(y=m_flow*cp*(per.TFre - TIn.y)) "Upper/Lower limit for charging/discharging rate"; equation connect(tanHeaTra.TIn, TIn.y); connect(preHeaFlo.port, vol.heatPort); connect(tanHeaTra.SOC, SOC); connect(tanHeaTra.mIce, mIce); connect(limQ_flow.y, tanHeaTra.QLim_flow); connect(tanHeaTra.Q_flow, Q_flow); connect(tanHeaTra.Q_flow, preHeaFlo.Q_flow); connect(temSen.T, T); connect(temSen.T, tanHeaTra.TOut); connect(vol.heatPort, temSen.port); end Tank;