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 |
ConstantEffectiveness
|
Model that demonstrates use of a heat exchanger with constant effectiveness |
DryCoilEffectivenessNTU
|
Model that demonstrates use of a heat exchanger without condensation that uses the epsilon-NTU relation |
EvaporatorCondenser
|
Test model for the evaporator or condenser model |
HeaterCooler_u
|
Model that demonstrates the ideal heater model |
PrescribedOutlet
|
Model that demonstrates the ideal heater/cooler model for a prescribed outlet temperature, configured as steady-state |
PrescribedOutlet_dynamic
|
Model that demonstrates the ideal heater/cooler model for a prescribed outlet temperature, configured as dynamic |
WetCoilDiscretizedInitialization
|
Model that demonstrates use of a finite volume model of a heat exchanger with condensation |
WetCoilDiscretizedInitializationPerfectGases
|
Model that demonstrates use of a finite volume model of a heat exchanger with condensation |
WetCoilEffectivenessNTU
|
Model that validates the wet coil effectiveness-NTU model |
WetCoilEffectivenessNTUHeating
|
Model that validates the wet coil effectiveness-NTU model in heating conditions |
Model that demonstrates use of a heat exchanger with constant effectiveness
Information
This model tests
Buildings.Fluid.HeatExchangers.ConstantEffectiveness
for different inlet conditions.
Extends from Modelica.Icons.Example (Icon for runnable examples).
Modelica definition
model ConstantEffectiveness
extends Modelica.Icons.Example;
package Medium1 =
Buildings.Media.Water ;
package Medium2 =
Buildings.Media.Air ;
Buildings.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)
;
Buildings.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) ;
Modelica.Blocks.Sources.Constant TDb(k=293.15) ;
Modelica.Blocks.Sources.Constant POut(k=101325) ;
Buildings.Fluid.Sources.Boundary_pT sin_1(
redeclare package Medium = Medium1,
use_p_in=true,
nPorts=1,
p=300000,
T=273.15 + 25)
;
Buildings.Fluid.Sources.Boundary_pT sou_1(
redeclare package Medium = Medium1,
p=300000 + 5000,
T=273.15 + 50,
use_T_in=true,
nPorts=1)
;
Buildings.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;
Model that demonstrates use of a heat exchanger without condensation that uses the epsilon-NTU relation
Information
This model tests
Buildings.Fluid.HeatExchangers.DryCoilEffectivenessNTU
for different inlet conditions.
Extends from Modelica.Icons.Example (Icon for runnable examples).
Parameters
Type | Name | Default | Description |
SpecificHeatCapacity | cp1 | Medium1.specificHeatCapacity... | Specific heat capacity of medium 2 [J/(kg.K)] |
SpecificHeatCapacity | cp2 | Medium2.specificHeatCapacity... | Specific heat capacity of medium 2 [J/(kg.K)] |
MassFlowRate | m1_flow | 5 | Nominal mass flow rate medium 1 [kg/s] |
MassFlowRate | m2_flow | m1_flow*cp1/cp2 | Nominal mass flow rate medium 2 [kg/s] |
Modelica definition
model DryCoilEffectivenessNTU
extends Modelica.Icons.Example;
package Medium1 =
Buildings.Media.Water;
package Medium2 =
Buildings.Media.Air;
parameter Modelica.SIunits.SpecificHeatCapacity cp1=
Medium1.specificHeatCapacityCp(
Medium1.setState_pTX(Medium1.p_default, Medium1.T_default, Medium1.X_default))
;
parameter Modelica.SIunits.SpecificHeatCapacity cp2=
Medium2.specificHeatCapacityCp(
Medium2.setState_pTX(Medium2.p_default, Medium2.T_default, Medium2.X_default))
;
parameter Modelica.SIunits.MassFlowRate m1_flow = 5
;
parameter Modelica.SIunits.MassFlowRate m2_flow = m1_flow*cp1/
cp2 ;
Buildings.Fluid.Sources.Boundary_pT sin_2(
redeclare package Medium = Medium2,
use_p_in=true,
nPorts=5,
T=273.15 + 10) ;
Modelica.Blocks.Sources.Ramp PIn(
height=200,
duration=60,
offset=101325,
startTime=100) ;
Buildings.Fluid.Sources.Boundary_pT sou_2(
redeclare package Medium = Medium2,
T=273.15 + 5,
use_p_in=true,
use_T_in=true,
nPorts=5) ;
Modelica.Blocks.Sources.Ramp TWat(
height=10,
duration=60,
offset=273.15 + 30,
startTime=60) ;
Modelica.Blocks.Sources.Constant TDb(k=293.15) ;
Modelica.Blocks.Sources.Constant POut(k=101325);
Buildings.Fluid.Sources.Boundary_pT sin_1(
redeclare package Medium = Medium1,
use_p_in=true,
nPorts=5,
p=300000,
T=273.15 + 25)
;
Buildings.Fluid.Sources.Boundary_pT sou_1(
redeclare package Medium = Medium1,
p=300000 + 5000,
T=273.15 + 50,
use_T_in=true,
nPorts=5)
;
Buildings.Fluid.HeatExchangers.DryCoilEffectivenessNTU hexPar(
redeclare package Medium1 = Medium1,
redeclare package Medium2 = Medium2,
dp1_nominal=500,
dp2_nominal=10,
m1_flow_nominal=m1_flow,
m2_flow_nominal=m2_flow,
Q_flow_nominal=m2_flow*cp2*(24 - 20),
configuration=Buildings.Fluid.Types.HeatExchangerConfiguration.ParallelFlow,
show_T=true,
T_a1_nominal=303.15,
T_a2_nominal=293.15)
;
Buildings.Fluid.HeatExchangers.DryCoilEffectivenessNTU hexCou(
redeclare package Medium1 = Medium1,
redeclare package Medium2 = Medium2,
dp1_nominal=500,
dp2_nominal=10,
m1_flow_nominal=m1_flow,
m2_flow_nominal=m2_flow,
Q_flow_nominal=m2_flow*cp2*(24 - 20),
configuration=Buildings.Fluid.Types.HeatExchangerConfiguration.CounterFlow,
show_T=true,
T_a1_nominal=303.15,
T_a2_nominal=293.15)
;
Buildings.Fluid.HeatExchangers.DryCoilEffectivenessNTU hexCroC1Mix(
redeclare package Medium1 = Medium1,
redeclare package Medium2 = Medium2,
dp1_nominal=500,
dp2_nominal=10,
m1_flow_nominal=m1_flow,
m2_flow_nominal=m2_flow,
Q_flow_nominal=m2_flow*cp2*(24 - 20),
configuration=Buildings.Fluid.Types.HeatExchangerConfiguration.CrossFlowStream1MixedStream2Unmixed,
show_T=true,
T_a1_nominal=303.15,
T_a2_nominal=293.15)
;
Buildings.Fluid.HeatExchangers.DryCoilEffectivenessNTU hexCroC1Unm(
redeclare package Medium1 = Medium1,
redeclare package Medium2 = Medium2,
dp1_nominal=500,
dp2_nominal=10,
m1_flow_nominal=m1_flow,
m2_flow_nominal=m2_flow,
Q_flow_nominal=m2_flow*cp2*(24 - 20),
configuration=Buildings.Fluid.Types.HeatExchangerConfiguration.CrossFlowStream1UnmixedStream2Mixed,
show_T=true,
T_a1_nominal=303.15,
T_a2_nominal=293.15)
;
Buildings.Fluid.HeatExchangers.DryCoilEffectivenessNTU hexCroUnm(
redeclare package Medium1 = Medium1,
redeclare package Medium2 = Medium2,
dp1_nominal=500,
dp2_nominal=10,
m1_flow_nominal=m1_flow,
m2_flow_nominal=m2_flow,
Q_flow_nominal=m2_flow*cp2*(24 - 20),
configuration=Buildings.Fluid.Types.HeatExchangerConfiguration.CrossFlowUnmixed,
show_T=true,
T_a1_nominal=303.15,
T_a2_nominal=293.15)
;
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], hexPar.port_a1);
connect(hexPar.port_a2, sou_2.ports[1]);
connect(POut.y, sin_2.p_in);
connect(hexPar.port_b1, sin_1.ports[1]);
connect(sin_2.ports[1], hexPar.port_b2);
connect(hexCou.port_a1, sou_1.ports[2]);
connect(hexCroC1Mix.port_a1, sou_1.ports[3]);
connect(hexCroC1Unm.port_a1, sou_1.ports[4]);
connect(hexCou.port_b2, sin_2.ports[2]);
connect(hexCroC1Mix.port_b2, sin_2.ports[3]);
connect(hexCroC1Unm.port_b2, sin_2.ports[4]);
connect(hexCou.port_b1, sin_1.ports[2]);
connect(hexCroC1Mix.port_b1, sin_1.ports[3]);
connect(hexCroC1Unm.port_b1, sin_1.ports[4]);
connect(hexCou.port_a2, sou_2.ports[2]);
connect(hexCroC1Mix.port_a2, sou_2.ports[3]);
connect(hexCroC1Unm.port_a2, sou_2.ports[4]);
connect(hexCroUnm.port_a1, sou_1.ports[5]);
connect(hexCroUnm.port_b2, sin_2.ports[5]);
connect(hexCroUnm.port_b1, sin_1.ports[5]);
connect(hexCroUnm.port_a2, sou_2.ports[5]);
connect(trapezoid.y, sin_1.p_in);
end DryCoilEffectivenessNTU;
Test model for the evaporator or condenser model
Information
Model that demonstrates the use of the
Buildings.Fluid.HeatExchangers.EvaporatorCondenser model.
The fluid flow rate is increased from ṁ = 0.01 kg/s to
ṁ = 0.10 kg/s over 100 seconds. As a result, the heat exchanger
effectiveness and the fluid temperature difference in the heat exchanger
decrease.
Extends from Modelica.Icons.Example (Icon for runnable examples).
Parameters
Type | Name | Default | Description |
MassFlowRate | m_flow_nominal | 0.01 | Nominal mass flow rate [kg/s] |
Modelica definition
model EvaporatorCondenser
extends Modelica.Icons.Example;
package Medium =
Buildings.Media.Water ;
parameter Modelica.SIunits.MassFlowRate m_flow_nominal = 0.01
;
Buildings.HeatTransfer.Sources.FixedTemperature ref(T=283.15)
;
Modelica.Thermal.HeatTransfer.Sensors.HeatFlowSensor heaFlo
;
Modelica.Fluid.Sources.MassFlowSource_T sou(
nPorts=1,
redeclare package Medium = Medium,
m_flow=0.1,
use_m_flow_in=true,
T=323.15) ;
Modelica.Fluid.Sources.FixedBoundary sin(
redeclare package Medium = Medium,
p=0,
nPorts=1) ;
Buildings.Fluid.HeatExchangers.EvaporatorCondenser eva(
redeclare package Medium = Medium,
m_flow(start=0.1),
dp(start=10),
UA=100,
massDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
dp_nominal=0,
tau=5,
energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
m_flow_nominal=m_flow_nominal) ;
Modelica.Blocks.Sources.Ramp m_flow(
duration=100,
height=9*m_flow_nominal,
offset=m_flow_nominal) ;
Buildings.Fluid.Sensors.TemperatureTwoPort senTem(
m_flow_nominal=m_flow_nominal,
redeclare package Medium = Medium,
tau=0.01,
initType=Modelica.Blocks.Types.Init.SteadyState) ;
equation
connect(ref.port, heaFlo.port_a);
connect(heaFlo.port_b, eva.port_ref);
connect(sou.ports[1], eva.port_a);
connect(m_flow.y, sou.m_flow_in);
connect(eva.port_b, senTem.port_a);
connect(senTem.port_b, sin.ports[1]);
end EvaporatorCondenser;
Model that demonstrates the ideal heater model
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
Type | Name | Default | Description |
MassFlowRate | m_flow_nominal | 3000/1000/20 | Nominal mass flow rate [kg/s] |
Modelica definition
model HeaterCooler_u
extends Modelica.Icons.Example;
package Medium =
Buildings.Media.Air;
parameter Modelica.SIunits.MassFlowRate
m_flow_nominal=3000/1000/20 ;
Buildings.Fluid.Sources.Boundary_pT sin(
redeclare package Medium = Medium,
use_T_in=false,
p(displayUnit="Pa"),
T=293.15,
nPorts=2)
;
Buildings.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)
;
Buildings.Fluid.Sensors.TemperatureTwoPort senTem1(
redeclare package Medium = Medium,
m_flow_nominal=m_flow_nominal) ;
Modelica.Blocks.Sources.TimeTable TSet(table=[0, 273.15 + 20; 120, 273.15
+20; 120, 273.15 + 30; 1200, 273.15 + 30])
;
Buildings.Controls.Continuous.LimPID con1(
Td=1,
k=1,
Ti=10)
;
Buildings.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)
;
Buildings.Fluid.Sensors.TemperatureTwoPort senTem2(
redeclare package Medium = Medium,
m_flow_nominal=m_flow_nominal) ;
Buildings.Controls.Continuous.LimPID con2(
Td=1,
Ti=10,
k=0.1)
;
Buildings.Fluid.Sources.MassFlowSource_T sou(
redeclare package Medium = Medium,
use_T_in=false,
nPorts=2,
m_flow=2*m_flow_nominal,
T=293.15) ;
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;
Model that demonstrates the ideal heater/cooler model for a prescribed outlet temperature, configured as steady-state
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
Type | Name | Default | Description |
MassFlowRate | m_flow_nominal | 0.1 | Nominal mass flow rate [kg/s] |
Modelica definition
model PrescribedOutlet
extends Modelica.Icons.Example;
package Medium =
Buildings.Media.Water;
parameter Modelica.SIunits.MassFlowRate m_flow_nominal=0.1
;
Buildings.Fluid.Sources.Boundary_pT sin(
redeclare package Medium = Medium,
use_T_in=false,
p(displayUnit="Pa"),
T=293.15,
nPorts=3) ;
Buildings.Fluid.HeatExchangers.PrescribedOutlet heaHigPow(
redeclare package Medium = Medium,
m_flow_nominal=m_flow_nominal,
dp_nominal=6000,
QMax_flow=1e4,
use_X_wSet=false)
;
Buildings.Fluid.Sensors.TemperatureTwoPort heaHigPowOut(
redeclare package Medium = Medium,
m_flow_nominal=m_flow_nominal) ;
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])
;
Buildings.Fluid.Sensors.TemperatureTwoPort cooLimPowOut(
redeclare package Medium = Medium,
m_flow_nominal=m_flow_nominal) ;
Buildings.Fluid.HeatExchangers.PrescribedOutlet cooLimPow(
redeclare package Medium = Medium,
m_flow_nominal=m_flow_nominal,
dp_nominal=6000,
QMin_flow=-1000,
use_X_wSet=false)
;
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])
;
Buildings.Fluid.HeatExchangers.PrescribedOutlet heaCooUnl(
redeclare package Medium = Medium,
m_flow_nominal=m_flow_nominal,
dp_nominal=6000,
use_X_wSet=false)
;
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]) ;
Buildings.Fluid.Sensors.TemperatureTwoPort heaCooUnlOut(
redeclare package Medium = Medium,
m_flow_nominal=m_flow_nominal) ;
Modelica.Blocks.Sources.Ramp m_flow(
height=-2*m_flow_nominal,
duration=100,
offset=m_flow_nominal,
startTime=1000) ;
Buildings.Fluid.Sensors.TemperatureTwoPort heaHigPowIn(
redeclare package Medium = Medium,
m_flow_nominal=m_flow_nominal) ;
Buildings.Fluid.Sensors.TemperatureTwoPort cooLimPowIn(
redeclare package Medium = Medium,
m_flow_nominal=m_flow_nominal) ;
Buildings.Fluid.Sensors.TemperatureTwoPort heaCooUnlIn(
redeclare package Medium = Medium,
m_flow_nominal=m_flow_nominal) ;
Sources.MassFlowSource_T sou1(
redeclare package Medium = Medium,
use_m_flow_in=true,
nPorts=1,
T=293.15) ;
Sources.MassFlowSource_T sou2(
redeclare package Medium = Medium,
use_m_flow_in=true,
nPorts=1,
T=293.15) ;
Sources.MassFlowSource_T sou3(
redeclare package Medium = Medium,
use_m_flow_in=true,
nPorts=1,
T=293.15) ;
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 PrescribedOutlet;
Model that demonstrates the ideal heater/cooler model for a prescribed outlet temperature, configured as dynamic
Information
Model that demonstrates the use of an ideal heater and an ideal cooler, configured as dynamic models.
This example is identical to
Buildings.Fluid.HeatExchangers.Validation.PrescribedOutlet
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 Buildings.Fluid.HeatExchangers.Validation.PrescribedOutlet (Model that demonstrates the ideal heater/cooler model for a prescribed outlet temperature, configured as steady-state).
Parameters
Type | Name | Default | Description |
MassFlowRate | m_flow_nominal | 0.1 | Nominal mass flow rate [kg/s] |
Modelica definition
model PrescribedOutlet_dynamic
extends Buildings.Fluid.HeatExchangers.Validation.PrescribedOutlet(
heaHigPow(energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial),
cooLimPow(energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial),
heaCooUnl(energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial));
end PrescribedOutlet_dynamic;
Model that demonstrates use of a finite volume model of a heat exchanger with condensation
Information
This model is used to test the initialization of the coil model.
There are three instances of the coil model, each having different settings
for the initial conditions.
Each of the coil uses for the medium
Buildings.Media.Air.
Extends from Buildings.Fluid.HeatExchangers.Examples.BaseClasses.WetCoilDiscretized (Model that demonstrates use of a finite volume model of a heat exchanger with condensation), Modelica.Icons.Example (Icon for runnable examples).
Parameters
Type | Name | Default | Description |
replaceable package Medium2 | PartialMedium | Medium for air-side |
Temperature | T_a1_nominal | 5 + 273.15 | Water inlet temperature [K] |
Temperature | T_b1_nominal | 10 + 273.15 | Water outlet temperature [K] |
Temperature | T_a2_nominal | 30 + 273.15 | Air inlet temperature [K] |
Temperature | T_b2_nominal | 10 + 273.15 | Air inlet temperature [K] |
MassFlowRate | m1_flow_nominal | 5 | Nominal mass flow rate water-side [kg/s] |
MassFlowRate | m2_flow_nominal | m1_flow_nominal*4200/1000*(T... | Nominal mass flow rate air-side [kg/s] |
Connectors
Type | Name | Description |
replaceable package Medium2 | Medium for air-side |
Modelica definition
Model that demonstrates use of a finite volume model of a heat exchanger with condensation
Information
This model is used to test the initialization of the coil model.
There are three instances of the coil model, each having different settings
for the initial conditions.
Each of the coil uses for the medium
Buildings.Media.Air.
Extends from Buildings.Fluid.HeatExchangers.Examples.BaseClasses.WetCoilDiscretized (Model that demonstrates use of a finite volume model of a heat exchanger with condensation), Modelica.Icons.Example (Icon for runnable examples).
Parameters
Type | Name | Default | Description |
replaceable package Medium2 | PartialMedium | Medium for air-side |
Temperature | T_a1_nominal | 5 + 273.15 | Water inlet temperature [K] |
Temperature | T_b1_nominal | 10 + 273.15 | Water outlet temperature [K] |
Temperature | T_a2_nominal | 30 + 273.15 | Air inlet temperature [K] |
Temperature | T_b2_nominal | 10 + 273.15 | Air inlet temperature [K] |
MassFlowRate | m1_flow_nominal | 5 | Nominal mass flow rate water-side [kg/s] |
MassFlowRate | m2_flow_nominal | m1_flow_nominal*4200/1000*(T... | Nominal mass flow rate air-side [kg/s] |
Connectors
Type | Name | Description |
replaceable package Medium2 | Medium for air-side |
Modelica definition
Model that validates the wet coil effectiveness-NTU model
Information
This model duplicates an example from Mitchell and Braun 2012, example SM-2-1
(Mitchell and Braun 2012) to validate a single case for the
Buildings.Fluid.HeatExchangers.WetCoilEffectivenessNTU
model.
Validation
The example simulates a wet coil with constant air
and water inlet temperature and mass flow rate, and an increasing air inlet
humidity which triggers the transition from a fully-dry to a fully-wet regime.
The reference used for validation is the published experimental data.
A discretized wet coil model is also simulated for comparison.
To provide an accurate reference, the latter model is configured with 30 elements.
Under steady-state modeling assumptions, this creates a large system of
non-linear equations. To alleviate this effect, dynamics are considered but
the simulation time is increased to 1000 s to reproduce quasi steady-state
conditions.
Note that the outlet air relative humidity may slightly exceed 100% when using
the epsilon-NTU model.
References
Mitchell, John W., and James E. Braun. 2012.
"Supplementary Material Chapter 2: Heat Exchangers for Cooling Applications".
Excerpt from Principles of heating, ventilation, and air conditioning in buildings.
Hoboken, N.J.: Wiley. Available online:
http://bcs.wiley.com/he-bcs/Books?action=index&itemId=0470624574&bcsId=7185
Extends from Modelica.Icons.Example (Icon for runnable examples).
Parameters
Type | Name | Default | Description |
Temperature | T_a1_nominal | Modelica.SIunits.Conversions... | Inlet water temperature [K] |
Temperature | T_a2_nominal | Modelica.SIunits.Conversions... | Inlet air temperature [K] |
Temperature | T_b1_nominal | 273.15 + 11.0678 | Outlet water temperature in fully wet conditions [K] |
Temperature | T_b2_nominal | 273.15 + 13.5805 | Outlet air temperature in fully wet conditions [K] |
Real | X_w_a2_nominal | 0.0173 | Inlet water mass fraction in fully wet conditions |
ThermalConductance | UA_nominal | 4748 | Total thermal conductance at nominal flow, from textbook [W/K] |
MassFlowRate | m1_flow_nominal | 3.78 | Nominal mass flow rate of water [kg/s] |
MassFlowRate | m2_flow_nominal | 2.646 | Nominal mass flow rate of air [kg/s] |
HeatExchangerConfiguration | hexCon | Types.HeatExchangerConfigura... | Heat exchanger configuration |
Modelica definition
model WetCoilEffectivenessNTU
extends Modelica.Icons.Example;
package Medium_W =
Buildings.Media.Water;
package Medium_A =
Buildings.Media.Air;
constant Modelica.SIunits.AbsolutePressure pAtm = 101325
;
parameter Modelica.SIunits.Temperature T_a1_nominal=
Modelica.SIunits.Conversions.from_degF(42)
;
parameter Modelica.SIunits.Temperature T_a2_nominal=
Modelica.SIunits.Conversions.from_degF(80)
;
parameter Modelica.SIunits.Temperature T_b1_nominal=
273.15+11.0678
;
parameter Modelica.SIunits.Temperature T_b2_nominal=
273.15+13.5805
;
final parameter Modelica.SIunits.HeatFlowRate Q_flow_nominal=
m1_flow_nominal * 4186 * (T_a1_nominal - T_b1_nominal);
parameter Real X_w_a2_nominal = 0.0173
;
parameter Modelica.SIunits.ThermalConductance UA_nominal = 4748
;
parameter Modelica.SIunits.MassFlowRate m1_flow_nominal = 3.78
;
parameter Modelica.SIunits.MassFlowRate m2_flow_nominal = 2.646
;
parameter Types.HeatExchangerConfiguration hexCon=
Types.HeatExchangerConfiguration.CounterFlow
;
Buildings.Fluid.Sources.Boundary_pT sinAir(
redeclare package Medium = Medium_A,
use_p_in=false,
nPorts=3)
;
Sources.MassFlowSource_T souAir(
redeclare package Medium = Medium_A,
m_flow=m2_flow_nominal,
T=T_a2_nominal,
use_Xi_in=true,
nPorts=1)
;
Buildings.Fluid.Sources.Boundary_pT sinWat(
redeclare package Medium = Medium_W,
nPorts=3)
;
Buildings.Utilities.Psychrometrics.ToTotalAir conversion;
Sensors.RelativeHumidityTwoPort relHumIn(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Sensors.TemperatureTwoPort TDryBulIn(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Modelica.Blocks.Sources.RealExpression pAir(y=pAtm) ;
Buildings.Utilities.Psychrometrics.TWetBul_TDryBulXi wetBulIn(
redeclare
package Medium = Medium_A) ;
Sensors.MassFractionTwoPort senMasFraIn(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Sensors.MassFractionTwoPort senMasFraOut(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Sensors.TemperatureTwoPort TDryBulOut(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Buildings.Utilities.Psychrometrics.TWetBul_TDryBulXi wetBulOut(
redeclare
package Medium = Medium_A) ;
Modelica.Blocks.Sources.RealExpression pAir1(y=pAtm) ;
Buildings.Fluid.HeatExchangers.WetCoilEffectivenessNTU hexWetNTU(
redeclare package Medium1 = Medium_W,
redeclare package Medium2 = Medium_A,
UA_nominal=UA_nominal,
m1_flow_nominal=m1_flow_nominal,
m2_flow_nominal=m2_flow_nominal,
dp2_nominal=0,
dp1_nominal=0,
configuration=hexCon,
show_T=true) ;
Sources.MassFlowSource_T souWat1(
redeclare package Medium = Medium_W,
m_flow=m1_flow_nominal,
T=T_a1_nominal,
nPorts=1)
;
WetCoilCounterFlow hexDis(
redeclare package Medium1 = Medium_W,
redeclare package Medium2 = Medium_A,
m1_flow_nominal=m1_flow_nominal,
m2_flow_nominal=m2_flow_nominal,
dp2_nominal=0,
allowFlowReversal1=false,
allowFlowReversal2=false,
dp1_nominal=0,
UA_nominal=UA_nominal,
show_T=true,
nEle=30,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
tau1=0.1,
tau2=0.1,
tau_m=0.1)
;
Sources.MassFlowSource_T souWat(
redeclare package Medium = Medium_W,
m_flow=m1_flow_nominal,
T=T_a1_nominal,
nPorts=1) ;
Sources.MassFlowSource_T souAir2(
redeclare package Medium = Medium_A,
m_flow=m2_flow_nominal,
T=T_a2_nominal,
use_Xi_in=true,
nPorts=1)
;
Sensors.MassFractionTwoPort senMasFraOut1(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Sensors.TemperatureTwoPort TDryBulOut1(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Sensors.RelativeHumidityTwoPort relHumOut_eps(
redeclare package Medium =
Medium_A, m_flow_nominal=m2_flow_nominal) ;
Sensors.RelativeHumidityTwoPort relHumOut_dis(
redeclare package Medium =
Medium_A, m_flow_nominal=m2_flow_nominal) ;
Buildings.Fluid.HeatExchangers.WetCoilEffectivenessNTU hexWetNTU_TX(
redeclare package Medium1 = Medium_W,
redeclare package Medium2 = Medium_A,
use_Q_flow_nominal=true,
Q_flow_nominal=Q_flow_nominal,
T_a2_nominal=T_a2_nominal,
w_a2_nominal=X_w_a2_nominal/(1 - X_w_a2_nominal),
T_a1_nominal=T_a1_nominal,
m1_flow_nominal=m1_flow_nominal,
m2_flow_nominal=m2_flow_nominal,
dp2_nominal=0,
dp1_nominal=0,
configuration=hexCon,
show_T=true)
;
Sources.MassFlowSource_T souAir1(
redeclare package Medium = Medium_A,
m_flow=m2_flow_nominal,
T=T_a2_nominal,
use_Xi_in=true,
nPorts=1)
;
Sources.MassFlowSource_T souWat2(
redeclare package Medium = Medium_W,
m_flow=m1_flow_nominal,
T=T_a1_nominal,
nPorts=1)
;
Modelica.Blocks.Sources.CombiTimeTable w_a2(table=[0,0.0035383; 1,0.01765],
timeScale=1000)
;
equation
connect(pAir.y, wetBulIn.p);
connect(pAir1.y, wetBulOut.p);
connect(senMasFraOut.port_b, sinAir.ports[1]);
connect(TDryBulOut.T, wetBulOut.TDryBul);
connect(senMasFraOut.X, wetBulOut.Xi[1]);
connect(souAir.ports[1], senMasFraIn.port_a);
connect(senMasFraIn.port_b, TDryBulIn.port_a);
connect(senMasFraIn.X, wetBulIn.Xi[1]);
connect(TDryBulIn.T, wetBulIn.TDryBul);
connect(TDryBulIn.port_b, relHumIn.port_a);
connect(souWat1.ports[1], hexWetNTU.port_a1);
connect(hexWetNTU.port_b1, sinWat.ports[1]);
connect(souWat.ports[1], hexDis.port_a1);
connect(hexDis.port_b1, sinWat.ports[2]);
connect(souAir2.ports[1], hexDis.port_a2);
connect(hexWetNTU.port_b2, TDryBulOut.port_a);
connect(hexWetNTU.port_a2, relHumIn.port_b);
connect(hexDis.port_b2, TDryBulOut1.port_a);
connect(senMasFraOut1.port_b, sinAir.ports[2]);
connect(TDryBulOut.port_b, relHumOut_eps.port_a);
connect(relHumOut_eps.port_b, senMasFraOut.port_a);
connect(TDryBulOut1.port_b, relHumOut_dis.port_a);
connect(relHumOut_dis.port_b, senMasFraOut1.port_a);
connect(hexWetNTU_TX.port_b1, sinWat.ports[3]);
connect(souAir1.ports[1], hexWetNTU_TX.port_a2);
connect(sinAir.ports[3], hexWetNTU_TX.port_b2);
connect(souWat2.ports[1], hexWetNTU_TX.port_a1);
connect(w_a2.y[1], conversion.XiDry);
connect(conversion.XiTotalAir, souAir.Xi_in[1]);
connect(conversion.XiTotalAir, souAir1.Xi_in[1]);
connect(conversion.XiTotalAir, souAir2.Xi_in[1]);
end WetCoilEffectivenessNTU;
Model that validates the wet coil effectiveness-NTU model in heating conditions
Information
This model simulates various coil models in heating conditions, with
-
on the water-side: constant inlet temperature and mass flow rate,
-
on the air-side: constant inlet humidity ratio and mass flow rate, and
an increasing inlet temperature.
To provide an accurate reference, the instance of
Buildings.Fluid.HeatExchangers.DryCoilCounterFlow
is configured with 30 elements.
Under steady-state modeling assumptions, this creates a large system of
non-linear equations. To alleviate this effect, dynamics are considered but
the simulation time is increased to 1000 s to reproduce quasi steady-state
conditions.
Extends from Modelica.Icons.Example (Icon for runnable examples).
Parameters
Type | Name | Default | Description |
Temperature | T_a1_nominal | 50 + 273.15 | Inlet water temperature [K] |
Temperature | T_b1_nominal | 45 + 273.15 | Outlet water temperature [K] |
Temperature | T_a2_nominal | 273.15 | Inlet air temperature [K] |
ThermalConductance | UA_nominal | Buildings.Fluid.HeatExchange... | Total thermal conductance at nominal flow [W/K] |
MassFlowRate | m1_flow_nominal | 3.78 | Nominal mass flow rate of water [kg/s] |
MassFlowRate | m2_flow_nominal | 2.646 | Nominal mass flow rate of air [kg/s] |
HeatExchangerConfiguration | hexCon | Types.HeatExchangerConfigura... | Heat exchanger configuration |
Modelica definition
model WetCoilEffectivenessNTUHeating
extends Modelica.Icons.Example;
package Medium_W =
Buildings.Media.Water;
package Medium_A =
Buildings.Media.Air;
constant Modelica.SIunits.AbsolutePressure pAtm = 101325
;
parameter Modelica.SIunits.Temperature T_a1_nominal=50+273.15
;
parameter Modelica.SIunits.Temperature T_b1_nominal=45+273.15
;
parameter Modelica.SIunits.Temperature T_a2_nominal=273.15
;
final parameter Modelica.SIunits.Temperature T_b2_nominal=
T_a2_nominal + Q_flow_nominal / m2_flow_nominal / 1010
;
final parameter Modelica.SIunits.ThermalConductance CMin_flow_nominal=
min(m1_flow_nominal * 4186, m2_flow_nominal * 1010)
;
final parameter Modelica.SIunits.ThermalConductance CMax_flow_nominal=
max(m1_flow_nominal * 4186, m2_flow_nominal * 1010)
;
final parameter Modelica.SIunits.HeatFlowRate Q_flow_nominal=
m1_flow_nominal * 4186 * (T_a1_nominal - T_b1_nominal);
final parameter Real eps_nominal=
abs(Q_flow_nominal/((T_a1_nominal - T_a2_nominal) * CMin_flow_nominal))
;
parameter Modelica.SIunits.ThermalConductance UA_nominal=
Buildings.Fluid.HeatExchangers.BaseClasses.ntu_epsilonZ(
eps=eps_nominal,
Z=CMin_flow_nominal/CMax_flow_nominal,
flowRegime=
Integer(hexCon)) * CMin_flow_nominal
;
parameter Modelica.SIunits.MassFlowRate m1_flow_nominal = 3.78
;
parameter Modelica.SIunits.MassFlowRate m2_flow_nominal = 2.646
;
parameter Types.HeatExchangerConfiguration hexCon=
Types.HeatExchangerConfiguration.CounterFlow
;
Buildings.Fluid.Sources.Boundary_pT sinAir(
redeclare package Medium = Medium_A,
use_p_in=false,
nPorts=3)
;
Sources.MassFlowSource_T souAir(
redeclare package Medium = Medium_A,
m_flow=m2_flow_nominal,
use_T_in=true,
T=T_a2_nominal,
nPorts=1)
;
Buildings.Fluid.Sources.Boundary_pT sinWat(
redeclare package Medium = Medium_W,
nPorts=3)
;
Sensors.RelativeHumidityTwoPort relHumIn(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Sensors.TemperatureTwoPort TDryBulIn(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Sensors.MassFractionTwoPort senMasFraIn(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Sensors.MassFractionTwoPort senMasFraOut(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Sensors.TemperatureTwoPort TDryBulOut(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Sources.MassFlowSource_T souWat1(
redeclare package Medium = Medium_W,
m_flow=m1_flow_nominal,
T=T_a1_nominal,
nPorts=1)
;
DryCoilCounterFlow hexDis(
redeclare package Medium1 = Medium_W,
redeclare package Medium2 = Medium_A,
m1_flow_nominal=m1_flow_nominal,
m2_flow_nominal=m2_flow_nominal,
dp2_nominal=0,
allowFlowReversal1=false,
allowFlowReversal2=false,
dp1_nominal=0,
UA_nominal=UA_nominal,
show_T=true,
nEle=30,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
tau1=0.1,
tau2=0.1,
tau_m=0.1)
;
Sources.MassFlowSource_T souWat(
redeclare package Medium = Medium_W,
m_flow=m1_flow_nominal,
T=T_a1_nominal,
nPorts=1) ;
Sources.MassFlowSource_T souAir2(
redeclare package Medium = Medium_A,
m_flow=m2_flow_nominal,
use_T_in=true,
T=T_a2_nominal,
nPorts=1)
;
Sensors.MassFractionTwoPort senMasFraOut1(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Sensors.TemperatureTwoPort TDryBulOut1(
redeclare package Medium = Medium_A,
m_flow_nominal=m2_flow_nominal) ;
Sensors.RelativeHumidityTwoPort relHumOut_eps(
redeclare package Medium =
Medium_A, m_flow_nominal=m2_flow_nominal) ;
Sensors.RelativeHumidityTwoPort relHumOut_dis(
redeclare package Medium =
Medium_A, m_flow_nominal=m2_flow_nominal) ;
Buildings.Fluid.HeatExchangers.DryCoilEffectivenessNTU hexDryNTU_T(
redeclare package Medium1 = Medium_W,
redeclare package Medium2 = Medium_A,
Q_flow_nominal=Q_flow_nominal,
T_a2_nominal=T_a2_nominal,
T_a1_nominal=T_a1_nominal,
m1_flow_nominal=m1_flow_nominal,
m2_flow_nominal=m2_flow_nominal,
dp2_nominal=0,
dp1_nominal=0,
configuration=hexCon,
show_T=true)
;
Sources.MassFlowSource_T souAir1(
redeclare package Medium = Medium_A,
m_flow=m2_flow_nominal,
use_T_in=true,
T=T_a2_nominal,
nPorts=1)
;
Sources.MassFlowSource_T souWat2(
redeclare package Medium = Medium_W,
m_flow=m1_flow_nominal,
T=T_a1_nominal,
nPorts=1)
;
Controls.OBC.CDL.Continuous.Sources.Ramp T_a2(
height=15,
duration=1000,
offset=273.15) ;
Buildings.Fluid.HeatExchangers.WetCoilEffectivenessNTU hexWetNTU_TX(
redeclare package Medium1 = Medium_W,
redeclare package Medium2 = Medium_A,
use_Q_flow_nominal=true,
Q_flow_nominal=Q_flow_nominal,
T_a2_nominal=T_a2_nominal,
w_a2_nominal=0.001,
T_a1_nominal=T_a1_nominal,
m1_flow_nominal=m1_flow_nominal,
m2_flow_nominal=m2_flow_nominal,
dp2_nominal=0,
dp1_nominal=0,
configuration=hexCon,
show_T=true)
;
equation
connect(senMasFraOut.port_b, sinAir.ports[1]);
connect(souAir.ports[1], senMasFraIn.port_a);
connect(senMasFraIn.port_b, TDryBulIn.port_a);
connect(TDryBulIn.port_b, relHumIn.port_a);
connect(souWat.ports[1], hexDis.port_a1);
connect(hexDis.port_b1, sinWat.ports[1]);
connect(souAir2.ports[1], hexDis.port_a2);
connect(hexDis.port_b2, TDryBulOut1.port_a);
connect(senMasFraOut1.port_b, sinAir.ports[2]);
connect(TDryBulOut.port_b, relHumOut_eps.port_a);
connect(relHumOut_eps.port_b, senMasFraOut.port_a);
connect(TDryBulOut1.port_b, relHumOut_dis.port_a);
connect(relHumOut_dis.port_b, senMasFraOut1.port_a);
connect(hexDryNTU_T.port_b1, sinWat.ports[2]);
connect(souAir1.ports[1], hexDryNTU_T.port_a2);
connect(sinAir.ports[3], hexDryNTU_T.port_b2);
connect(souWat2.ports[1], hexDryNTU_T.port_a1);
connect(T_a2.y, souAir2.T_in);
connect(T_a2.y, souAir.T_in);
connect(T_a2.y, souAir1.T_in);
connect(souWat1.ports[1], hexWetNTU_TX.port_a1);
connect(hexWetNTU_TX.port_b1, sinWat.ports[3]);
connect(relHumIn.port_b, hexWetNTU_TX.port_a2);
connect(hexWetNTU_TX.port_b2, TDryBulOut.port_a);
end WetCoilEffectivenessNTUHeating;