IEA EBC Annex 60 EBC logo

Annex60.Fluid.HeatExchangers.Validation

Collection of models that validate the heat exchanger models

Information

This package contains models that validate the heat exchanger models. The examples plot various outputs, which have been verified against analytical solutions. These model outputs are stored as reference data to allow continuous validation whenever models in the library change.

Extends from Modelica.Icons.ExamplesPackage (Icon for packages containing runnable examples).

Package Content

Name Description
Annex60.Fluid.HeatExchangers.Validation.ConstantEffectiveness ConstantEffectiveness Model that demonstrates use of a heat exchanger with constant effectiveness
Annex60.Fluid.HeatExchangers.Validation.HeaterCooler_T HeaterCooler_T Model that demonstrates the ideal heater/cooler model for a prescribed outlet temperature, configured as steady-state
Annex60.Fluid.HeatExchangers.Validation.HeaterCooler_T_dynamic HeaterCooler_T_dynamic Model that demonstrates the ideal heater/cooler model for a prescribed outlet temperature, configured as dynamic
Annex60.Fluid.HeatExchangers.Validation.HeaterCooler_u HeaterCooler_u Model that demonstrates the ideal heater model

Annex60.Fluid.HeatExchangers.Validation.ConstantEffectiveness Annex60.Fluid.HeatExchangers.Validation.ConstantEffectiveness

Model that demonstrates use of a heat exchanger with constant effectiveness

Annex60.Fluid.HeatExchangers.Validation.ConstantEffectiveness

Information

This model tests Annex60.Fluid.HeatExchangers.ConstantEffectiveness for different inlet conditions.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Modelica definition

model ConstantEffectiveness "Model that demonstrates use of a heat exchanger with constant effectiveness" extends Modelica.Icons.Example; package Medium1 = Annex60.Media.Water; package Medium2 = Annex60.Media.Air; Annex60.Fluid.Sources.Boundary_pT sin_2( redeclare package Medium = Medium2, use_p_in=true, nPorts=1, T=273.15 + 10, X={0.001,0.999}); Modelica.Blocks.Sources.Ramp PIn( height=200, duration=60, offset=101325, startTime=50); Annex60.Fluid.Sources.Boundary_pT sou_2( redeclare package Medium = Medium2, T=273.15 + 5, use_p_in=true, use_T_in=true, nPorts=1); Modelica.Blocks.Sources.Ramp TWat( height=10, duration=60, offset=273.15 + 30, startTime=60) "Water temperature"; Modelica.Blocks.Sources.Constant TDb(k=293.15) "Drybulb temperature"; Modelica.Blocks.Sources.Constant POut(k=101325); Annex60.Fluid.Sources.Boundary_pT sin_1( redeclare package Medium = Medium1, use_p_in=true, nPorts=1, p=300000, T=273.15 + 25); Annex60.Fluid.Sources.Boundary_pT sou_1( redeclare package Medium = Medium1, p=300000 + 5000, T=273.15 + 50, use_T_in=true, nPorts=1); Annex60.Fluid.HeatExchangers.ConstantEffectiveness hex( redeclare package Medium1 = Medium1, redeclare package Medium2 = Medium2, show_T=true, m1_flow_nominal=5, m2_flow_nominal=5, dp1_nominal=500, dp2_nominal=10); Modelica.Blocks.Sources.Trapezoid trapezoid( amplitude=5000, rising=10, width=100, falling=10, period=3600, offset=300000); equation connect(PIn.y,sou_2. p_in); connect(TDb.y, sou_2.T_in); connect(TWat.y, sou_1.T_in); connect(sou_1.ports[1], hex.port_a1); connect(hex.port_a2, sou_2.ports[1]); connect(POut.y, sin_2.p_in); connect(hex.port_b1, sin_1.ports[1]); connect(sin_2.ports[1], hex.port_b2); connect(trapezoid.y, sin_1.p_in); end ConstantEffectiveness;

Annex60.Fluid.HeatExchangers.Validation.HeaterCooler_T Annex60.Fluid.HeatExchangers.Validation.HeaterCooler_T

Model that demonstrates the ideal heater/cooler model for a prescribed outlet temperature, configured as steady-state

Annex60.Fluid.HeatExchangers.Validation.HeaterCooler_T

Information

Model that demonstrates the use of an ideal heater and an ideal cooler.

The heater model has a capacity of Q_flow_max = 1.0e4 Watts and the cooler model has a capacitiy of Q_flow_min = -1000 Watts. Hence, both only track their set point of the outlet temperature during certain times. There is also a heater and cooler with unlimited capacity.

At t=1000 second, the flow reverses its direction.

Each flow leg has the same mass flow rate. There are three mass flow sources as using one source only would yield a nonlinear system of equations that needs to be solved to determine the mass flow rate distribution.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
MassFlowRatem_flow_nominal0.1Nominal mass flow rate [kg/s]

Modelica definition

model HeaterCooler_T "Model that demonstrates the ideal heater/cooler model for a prescribed outlet temperature, configured as steady-state" extends Modelica.Icons.Example; package Medium = Annex60.Media.Water; parameter Modelica.SIunits.MassFlowRate m_flow_nominal=0.1 "Nominal mass flow rate"; Annex60.Fluid.Sources.Boundary_pT sin( redeclare package Medium = Medium, use_T_in=false, p(displayUnit="Pa"), T=293.15, nPorts=3) "Sink"; Annex60.Fluid.HeatExchangers.HeaterCooler_T heaHigPow( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=6000, Q_flow_maxHeat=1e4) "Steady-state model of the heater with high capacity"; Annex60.Fluid.Sensors.TemperatureTwoPort heaHigPowOut(redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal) "Temperature sensor"; Modelica.Blocks.Sources.TimeTable TSetHeat(table=[0,273.15 + 20.0; 120,273.15 + 20.0; 120,273.15 + 60.0; 500,273.15 + 60.0; 500,273.15 + 30.0; 1200,273.15 + 30.0]) "Setpoint heating"; Annex60.Fluid.Sensors.TemperatureTwoPort cooLimPowOut(redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal) "Temperature sensor"; Annex60.Fluid.HeatExchangers.HeaterCooler_T cooLimPow( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=6000, Q_flow_maxCool=-1000) "Steady-state model of the cooler with limited capacity"; Modelica.Blocks.Sources.TimeTable TSetCool(table=[0,273.15 + 20.0; 120,273.15 + 20.0; 120,273.15 + 15.0; 500,273.15 + 15.0; 500,273.15 + 10.0; 1200,273.15 + 10.0]) "Setpoint cooling"; Annex60.Fluid.HeatExchangers.HeaterCooler_T heaCooUnl( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=6000) "Steady-state model of the heater or cooler with unlimited capacity"; Modelica.Blocks.Sources.TimeTable TSetCoolHeat(table=[0,273.15 + 20.0; 120,273.15 + 20.0; 120,273.15 + 15.0; 500,273.15 + 15.0; 500,273.15 + 30.0; 1200,273.15 + 30.0]) "Setpoint cooling"; Annex60.Fluid.Sensors.TemperatureTwoPort heaCooUnlOut(redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal) "Temperature sensor"; Modelica.Blocks.Sources.Ramp m_flow( height=-2*m_flow_nominal, duration=100, offset=m_flow_nominal, startTime=1000) "Mass flow rate"; Annex60.Fluid.Sensors.TemperatureTwoPort heaHigPowIn(redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal) "Temperature sensor"; Annex60.Fluid.Sensors.TemperatureTwoPort cooLimPowIn(redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal) "Temperature sensor"; Annex60.Fluid.Sensors.TemperatureTwoPort heaCooUnlIn(redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal) "Temperature sensor"; Sources.MassFlowSource_T sou1( redeclare package Medium = Medium, use_m_flow_in=true, nPorts=1, T=293.15) "Flow source"; Sources.MassFlowSource_T sou2( redeclare package Medium = Medium, use_m_flow_in=true, nPorts=1, T=293.15) "Flow source"; Sources.MassFlowSource_T sou3( redeclare package Medium = Medium, use_m_flow_in=true, nPorts=1, T=293.15) "Flow source"; equation connect(heaHigPow.port_b, heaHigPowOut.port_a); connect(TSetHeat.y, heaHigPow.TSet); connect(cooLimPow.port_b, cooLimPowOut.port_a); connect(TSetCool.y, cooLimPow.TSet); connect(heaCooUnl.port_b, heaCooUnlOut.port_a); connect(TSetCoolHeat.y, heaCooUnl.TSet); connect(heaHigPowIn.port_b, heaHigPow.port_a); connect(cooLimPowIn.port_b, cooLimPow.port_a); connect(heaCooUnlIn.port_b, heaCooUnl.port_a); connect(heaCooUnlOut.port_b, sin.ports[1]); connect(cooLimPowOut.port_b, sin.ports[2]); connect(heaHigPowOut.port_b, sin.ports[3]); connect(m_flow.y, sou1.m_flow_in); connect(sou1.ports[1], heaHigPowIn.port_a); connect(m_flow.y, sou2.m_flow_in); connect(m_flow.y, sou3.m_flow_in); connect(sou2.ports[1], cooLimPowIn.port_a); connect(sou3.ports[1], heaCooUnlIn.port_a); end HeaterCooler_T;

Annex60.Fluid.HeatExchangers.Validation.HeaterCooler_T_dynamic Annex60.Fluid.HeatExchangers.Validation.HeaterCooler_T_dynamic

Model that demonstrates the ideal heater/cooler model for a prescribed outlet temperature, configured as dynamic

Annex60.Fluid.HeatExchangers.Validation.HeaterCooler_T_dynamic

Information

Model that demonstrates the use of an ideal heater and an ideal cooler, configured as dynamic models.

This example is identical to Annex60.Fluid.HeatExchangers.Validation.HeaterCooler_T except that the heater and cooler models are configured to have a time constant of 60 seconds at nominal flow rate. At lower flow rate, the time constant increases proportional to the mass flow rate.

Extends from HeaterCooler_T (Model that demonstrates the ideal heater/cooler model for a prescribed outlet temperature, configured as steady-state).

Parameters

TypeNameDefaultDescription
MassFlowRatem_flow_nominal0.1Nominal mass flow rate [kg/s]

Modelica definition

model HeaterCooler_T_dynamic "Model that demonstrates the ideal heater/cooler model for a prescribed outlet temperature, configured as dynamic" extends HeaterCooler_T( heaHigPow(energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial), cooLimPow(energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial), heaCooUnl(energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial)); end HeaterCooler_T_dynamic;

Annex60.Fluid.HeatExchangers.Validation.HeaterCooler_u Annex60.Fluid.HeatExchangers.Validation.HeaterCooler_u

Model that demonstrates the ideal heater model

Annex60.Fluid.HeatExchangers.Validation.HeaterCooler_u

Information

Model that demonstrates the use of an ideal heater. Both heater models are identical, except that one model is configured as a steady-state model, whereas the other is configured as a dynamic model. Both heaters add heat to the medium to track a set-point for the outlet temperature.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
MassFlowRatem_flow_nominal3000/1000/20Nominal mass flow rate [kg/s]

Modelica definition

model HeaterCooler_u "Model that demonstrates the ideal heater model" extends Modelica.Icons.Example; package Medium = Annex60.Media.Air; parameter Modelica.SIunits.MassFlowRate m_flow_nominal=3000/1000/20 "Nominal mass flow rate"; Annex60.Fluid.Sources.Boundary_pT sin( redeclare package Medium = Medium, use_T_in=false, p(displayUnit="Pa"), T=293.15, nPorts=2) "Sink"; Annex60.Fluid.HeatExchangers.HeaterCooler_u heaSte( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=6000, Q_flow_nominal=3000, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState) "Steady-state model of the heater"; Annex60.Fluid.Sensors.TemperatureTwoPort senTem1( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal) "Temperature sensor"; Modelica.Blocks.Sources.TimeTable TSet(table=[0, 273.15 + 20; 120, 273.15 +20; 120, 273.15 + 30; 1200, 273.15 + 30]) "Setpoint"; Annex60.Controls.Continuous.LimPID con1( controllerType=Modelica.Blocks.Types.SimpleController.PI, Td=1, k=1, Ti=10) "Controller"; Annex60.Fluid.HeatExchangers.HeaterCooler_u heaDyn( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=6000, Q_flow_nominal=3000, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyStateInitial) "Dynamic model of the heater"; Annex60.Fluid.Sensors.TemperatureTwoPort senTem2( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal) "Temperature sensor"; Annex60.Controls.Continuous.LimPID con2( controllerType=Modelica.Blocks.Types.SimpleController.PI, Td=1, Ti=10, k=0.1) "Controller"; Annex60.Fluid.Sources.MassFlowSource_T sou( redeclare package Medium = Medium, use_T_in=false, nPorts=2, m_flow=2*m_flow_nominal, T=293.15) "Source"; equation connect(senTem1.T, con1.u_m); connect(TSet.y, con1.u_s); connect(con1.y, heaSte.u); connect(heaSte.port_b, senTem1.port_a); connect(senTem2.T, con2.u_m); connect(TSet.y, con2.u_s); connect(con2.y, heaDyn.u); connect(heaDyn.port_b, senTem2.port_a); connect(heaSte.port_a, sou.ports[1]); connect(sou.ports[2], heaDyn.port_a); connect(senTem2.port_b, sin.ports[1]); connect(senTem1.port_b, sin.ports[2]); end HeaterCooler_u;

http://iea-annex60.org