Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses

Package with base classes for enthalpy recovery devices

Information

This package contains base classes that are used to construct the models in Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.

Extends from Modelica.Icons.BasesPackage (Icon for packages containing base classes).

Package Content

Name Description
Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.Effectiveness Effectiveness Model for calculating the heat exchange effectiveness
Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.HeatExchangerWithInputEffectiveness HeatExchangerWithInputEffectiveness Heat and moisture exchanger with varying effectiveness
Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.PartialWheel PartialWheel Partial model for enthalpy recovery wheel
Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.Validation Validation Collection of models that validate the module in the base classes

Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.Effectiveness Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.Effectiveness

Model for calculating the heat exchange effectiveness

Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.Effectiveness

Information

This block calculates the sensible and latent effectiveness of the heat exchanger under heating and cooling modes at different flow rates of the supply air and the exhaust air.

It calculates the ratio of the average operating flow rate to the nominal supply flow rate as

  rat = max(0.5, min(1.3, (mSup_flow + mExh_flow)/(2*mSup_flow_nominal))),

where mSup_flow is the mass flow rate of the supply air, mExh_flow is the mass flow rate of the exhaust air, mSup_flow_nominal is the nominal mass flow rate of the supply air, and rat is the flow ratio.

It then calculates the sensible and latent heat exchanger effectiveness by:

  epsSen = (epsSenPL + (epsSen_nominal - epsSenPL) * (rat - 0.75)/0.25),
  epsLat = (epsLatPL + (epsLat_nominal - epsLatPL) * (rat - 0.75)/0.25),

where epsSen and epsLat are the effectiveness for the sensible and latent heat transfer, respectively, epsSen_nominal and epsSenPL are the effectiveness for the sensible heat transfer when rat is 1 and 0.75, respectively, epsLat_nominal and epsLatPL are the effectiveness for the latent heat transfer when Rat is 1 and 0.75, respectively.

Note: The value of the rat is suggested to be between 0.5 and 1.3 during normal operation to ensure reasonable extrapolation. Likewise, an unbalanced air flow ratio less than 2, i.e., VSup_flow/VExh_flow > 0.5 and VSup_flow/VExh_flow < 2, is recommended.

References

U.S. Department of Energy 2016. "EnergyPlus Engineering Reference".

Extends from Modelica.Blocks.Icons.Block (Basic graphical layout of input/output block).

Parameters

TypeNameDefaultDescription
EfficiencyepsSen_nominal Nominal sensible heat exchanger effectiveness [1]
EfficiencyepsLat_nominal Nominal latent heat exchanger effectiveness [1]
EfficiencyepsSenPL Part load (75% of the nominal supply flow rate) sensible heat exchanger effectiveness [1]
EfficiencyepsLatPL Part load (75% of the nominal supply flow rate) latent heat exchanger effectiveness [1]
MassFlowRatemSup_flow_nominal Nominal supply air mass flow rate [kg/s]

Connectors

TypeNameDescription
input RealInputmSup_flowSupply air mass flow rate [kg/s]
input RealInputmExh_flowExhaust air mass flow rate [kg/s]
output RealOutputepsSenSensible heat exchanger effectiveness [1]
output RealOutputepsLatLatent heat exchanger effectiveness [1]

Modelica definition

model Effectiveness "Model for calculating the heat exchange effectiveness" extends Modelica.Blocks.Icons.Block; parameter Modelica.Units.SI.Efficiency epsSen_nominal(final max=1) "Nominal sensible heat exchanger effectiveness"; parameter Modelica.Units.SI.Efficiency epsLat_nominal(final max=1) "Nominal latent heat exchanger effectiveness"; parameter Modelica.Units.SI.Efficiency epsSenPL(final max=1) "Part load (75% of the nominal supply flow rate) sensible heat exchanger effectiveness"; parameter Modelica.Units.SI.Efficiency epsLatPL(final max=1) "Part load (75% of the nominal supply flow rate) latent heat exchanger effectiveness"; parameter Modelica.Units.SI.MassFlowRate mSup_flow_nominal "Nominal supply air mass flow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealInput mSup_flow(final unit="kg/s") "Supply air mass flow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealInput mExh_flow(final unit="kg/s") "Exhaust air mass flow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput epsSen(final unit="1") "Sensible heat exchanger effectiveness"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput epsLat(final unit="1") "Latent heat exchanger effectiveness"; protected Real rat "Ratio of the average operating air flow rate to the nominal supply air flow rate"; Real ratRes "Ratio of the average operating air flow rate to the nominal supply air flow rate, restricted to valid domain"; equation // Calculate the average volumetric air flow and flow rate ratio. rat=(mSup_flow+mExh_flow)/2/mSup_flow_nominal; // Check if the air flows are too unbalanced, unless rat < 0.05, in which case // the system is likely off or transitioning to on or off. assert(rat<0.05 or (mSup_flow-2*mExh_flow<1e-5 and mExh_flow-2*mSup_flow<1e-5), "In " + getInstanceName() + ": The ratio of the supply flow rate to the exhaust flow rate should be in the range of [0.5, 2] when flow rates are non-zero.", level=AssertionLevel.warning); // Calculate effectiveness ratRes=Buildings.Utilities.Math.Functions.smoothLimit(x=rat, l=0.5, u=1.3, deltaX=0.01); epsSen=(epsSenPL+(epsSen_nominal-epsSenPL)*(ratRes-0.75)/0.25); epsLat=(epsLatPL+(epsLat_nominal-epsLatPL)*(ratRes-0.75)/0.25); assert(epsSen>=0 and epsSen<1, "In " + getInstanceName() + ": The sensible heat exchange effectiveness epsSen = " + String(epsSen) + ". It should be in the range of [0, 1]. Check if the part load (75% of the nominal supply flow rate) or nominal sensible heat exchanger effectiveness is too high or too low.", level=AssertionLevel.error); assert(epsLat>=0 and epsLat<1, "In " + getInstanceName() + ": The latent heat exchange effectiveness epsLat = " + String(epsLat) + ". It should be in the range of [0, 1], Check if the part load (75% of the nominal supply flow rate) or nominal latent heat exchanger effectiveness is too high or too low.", level=AssertionLevel.error); end Effectiveness;

Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.HeatExchangerWithInputEffectiveness Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.HeatExchangerWithInputEffectiveness

Heat and moisture exchanger with varying effectiveness

Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.HeatExchangerWithInputEffectiveness

Information

This block is identical to Buildings.Fluid.MassExchangers.ConstantEffectiveness, except that the sensible and latent heat exchanger effectiveness are inputs rather than parameters.

This model transfers heat and moisture in the amount of

  QSen = epsSen * Q_max,
  m    = epsLat * mWat_max,

where epsSen and epsLat are the input effectiveness for the sensible and latent heat transfer, respectively; Q_max is the maximum sensible heat that can be transferred, m is the moisture that is transferred, and mWat_max is the maximum moisture that can be transferred.

This model can only be used with medium models that define the integer constant Water which needs to be equal to the index of the water mass fraction in the species vector.

Extends from Buildings.Fluid.HeatExchangers.BaseClasses.PartialEffectiveness (Partial model to implement heat exchangers based on effectiveness model).

Parameters

TypeNameDefaultDescription
replaceable package Medium1PartialMediumMedium 1 in the component
replaceable package Medium2PartialMediumMedium 2 in the component
HeatFlowRateQ1_flowepsSen*QMax_flow + QLat_flowHeat transferred into the medium 1 [W]
MassFlowRatemWat1_flow+mWat_flowMoisture mass flow rate added to the medium 1 [kg/s]
HeatFlowRateQ2_flow-Q1_flowHeat transferred into the medium 2 [W]
MassFlowRatemWat2_flow-mWat_flowMoisture mass flow rate added to the medium 2 [kg/s]
BooleansensibleOnly1falseSet to true if sensible exchange only for medium 1
BooleansensibleOnly2falseSet to true if sensible exchange only for medium 2
Nominal condition
MassFlowRatem1_flow_nominal Nominal mass flow rate [kg/s]
MassFlowRatem2_flow_nominal Nominal mass flow rate [kg/s]
PressureDifferencedp1_nominal Pressure difference [Pa]
PressureDifferencedp2_nominal Pressure difference [Pa]
Assumptions
BooleanallowFlowReversal1true= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1
BooleanallowFlowReversal2true= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 2
Advanced
MassFlowRatem1_flow_small1E-4*abs(m1_flow_nominal)Small mass flow rate for regularization of zero flow [kg/s]
MassFlowRatem2_flow_small1E-4*abs(m2_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
Medium 1
Booleanfrom_dp1false= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistance1false= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM10.1Fraction of nominal flow rate where flow transitions to laminar
Medium 2
Booleanfrom_dp2false= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistance2false= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM20.1Fraction of nominal flow rate where flow transitions to laminar

Connectors

TypeNameDescription
replaceable package Medium1Medium 1 in the component
replaceable package Medium2Medium 2 in the component
FluidPort_aport_a1Fluid connector a1 (positive design flow direction is from port_a1 to port_b1)
FluidPort_bport_b1Fluid connector b1 (positive design flow direction is from port_a1 to port_b1)
FluidPort_aport_a2Fluid connector a2 (positive design flow direction is from port_a2 to port_b2)
FluidPort_bport_b2Fluid connector b2 (positive design flow direction is from port_a2 to port_b2)
input RealInputepsSenSensible heat exchanger effectiveness [1]
input RealInputepsLatLatent heat exchanger effectiveness [1]

Modelica definition

model HeatExchangerWithInputEffectiveness "Heat and moisture exchanger with varying effectiveness" extends Buildings.Fluid.HeatExchangers.BaseClasses.PartialEffectiveness( redeclare replaceable package Medium1 = Modelica.Media.Interfaces.PartialCondensingGases, redeclare replaceable package Medium2 = Modelica.Media.Interfaces.PartialCondensingGases, sensibleOnly1=false, sensibleOnly2=false, final prescribedHeatFlowRate1=true, final prescribedHeatFlowRate2=true, Q1_flow = epsSen * QMax_flow + QLat_flow, Q2_flow = -Q1_flow, mWat1_flow = +mWat_flow, mWat2_flow = -mWat_flow); Buildings.Controls.OBC.CDL.Interfaces.RealInput epsSen(unit="1") "Sensible heat exchanger effectiveness"; Buildings.Controls.OBC.CDL.Interfaces.RealInput epsLat(unit="1") "Latent heat exchanger effectiveness"; Modelica.Units.SI.HeatFlowRate QLat_flow "Latent heat exchange from medium 2 to medium 1"; Medium1.MassFraction X_w_in1 "Inlet water mass fraction of medium 1"; Medium2.MassFraction X_w_in2 "Inlet water mass fraction of medium 2"; Modelica.Units.SI.MassFlowRate mWat_flow "Water flow rate from medium 2 to medium 1"; Modelica.Units.SI.MassFlowRate mMax_flow "Maximum water flow rate from medium 2 to medium 1"; protected parameter Integer i1_w(min=1, fixed=false) "Index for water substance"; parameter Integer i2_w(min=1, fixed=false) "Index for water substance"; Real gai1(min=0, max=1) "Auxiliary variable for smoothing at zero flow"; Real gai2(min=0, max=1) "Auxiliary variable for smoothing at zero flow"; initial algorithm i1_w:= -1; i2_w:= -1; for i in 1:Medium1.nXi loop if Modelica.Utilities.Strings.isEqual(string1=Medium1.substanceNames[i], string2="Water", caseSensitive=false) then i1_w := i; end if; end for; for i in 1:Medium2.nXi loop if Modelica.Utilities.Strings.isEqual(string1=Medium2.substanceNames[i], string2="Water", caseSensitive=false) then i2_w := i; end if; end for; assert(i1_w > 0, "Substance 'water' is not present in Medium1 '" + Medium1.mediumName + "'.\n" + "Check medium model."); assert(i2_w > 0, "Substance 'water' is not present in Medium2 '" + Medium2.mediumName + "'.\n" + "Check medium model."); equation // Definitions for effectiveness model X_w_in1 = Modelica.Fluid.Utilities.regStep(m1_flow, state_a1_inflow.X[i1_w], state_b1_inflow.X[i1_w], m1_flow_small); X_w_in2 = Modelica.Fluid.Utilities.regStep(m2_flow, state_a2_inflow.X[i2_w], state_b2_inflow.X[i2_w], m2_flow_small); // Mass exchange // Compute a gain that goes to zero near zero flow rate // This is required to smoothen the heat transfer at very small flow rates. // Note that gaiK = 1 for abs(mK_flow) > mK_flow_small gai1 = Modelica.Fluid.Utilities.regStep(abs(m1_flow) - 0.75*m1_flow_small, 1, 0, 0.25*m1_flow_small); gai2 = Modelica.Fluid.Utilities.regStep(abs(m2_flow) - 0.75*m2_flow_small, 1, 0, 0.25*m2_flow_small); mMax_flow = smooth(1, min(smooth(1, gai1 * abs(m1_flow)), smooth(1, gai2 * abs(m2_flow)))) * (X_w_in2 - X_w_in1); mWat_flow = epsLat * mMax_flow; // As enthalpyOfCondensingGas is dominated by the latent heat of phase change, // we use Medium1.enthalpyOfVaporization for the // latent heat that is exchanged among the fluid streams. // This is added to QSen_flow, while mass is conserved because // of the assignment of mWat1_flow and mWat2_flow. QLat_flow = mWat_flow * Medium1.enthalpyOfVaporization(Medium1.T_default); end HeatExchangerWithInputEffectiveness;

Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.PartialWheel Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.PartialWheel

Partial model for enthalpy recovery wheel

Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.PartialWheel

Information

Partial model of an enthalpy recovery wheel.

Extends from Modelica.Blocks.Icons.Block (Basic graphical layout of input/output block).

Parameters

TypeNameDefaultDescription
replaceable package MediumModelica.Media.Interfaces.Pa...Air
Genericperper(final have_latHEX=true)Record with performance data
Assumptions
BooleanallowFlowReversal1true= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1
BooleanallowFlowReversal2true= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 2
Flow resistance
Medium 1
Booleanfrom_dp1false= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistance1false= true, use linear relation between m_flow and dp for any flow rate
Medium 2
Booleanfrom_dp2false= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistance2false= true, use linear relation between m_flow and dp for any flow rate

Connectors

TypeNameDescription
replaceable package MediumAir
output RealOutputPElectric power consumption [W]
output RealOutputepsSenSensible heat exchanger effectiveness [1]
output RealOutputepsLatLatent heat exchanger effectiveness [1]
FluidPort_aport_a1Fluid connector a1 of the supply air (positive design flow direction is from port_a1 to port_b1)
FluidPort_bport_b2Fluid connector b2 of the exhaust air (positive design flow direction is from port_a2 to port_b2)
FluidPort_bport_b1Fluid connector b1 of the supply air (positive design flow direction is from port_a1 to port_b1)
FluidPort_aport_a2Fluid connector a2 of the exhaust air (positive design flow direction is from port_a2 to port_b2)

Modelica definition

partial model PartialWheel "Partial model for enthalpy recovery wheel" extends Modelica.Blocks.Icons.Block; replaceable package Medium = Modelica.Media.Interfaces.PartialCondensingGases "Air"; parameter Buildings.Fluid.HeatExchangers.ThermalWheels.Data.Generic per( final have_latHEX=true) "Record with performance data"; parameter Boolean allowFlowReversal1 = true "= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1"; parameter Boolean allowFlowReversal2 = true "= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 2"; parameter Boolean from_dp1 = false "= true, use m_flow = f(dp) else dp = f(m_flow)"; parameter Boolean linearizeFlowResistance1 = false "= true, use linear relation between m_flow and dp for any flow rate"; parameter Boolean from_dp2 = false "= true, use m_flow = f(dp) else dp = f(m_flow)"; parameter Boolean linearizeFlowResistance2 = false "= true, use linear relation between m_flow and dp for any flow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput P( final unit="W") "Electric power consumption"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput epsSen(final unit="1") "Sensible heat exchanger effectiveness"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput epsLat(final unit="1") "Latent heat exchanger effectiveness"; Buildings.Fluid.Sensors.MassFlowRate senSupMasFlo( redeclare package Medium = Medium) "Supply air mass flow rate"; Buildings.Fluid.Sensors.MassFlowRate senExhMasFlo( redeclare package Medium = Medium) "Exhaust air mass flow rate"; Modelica.Fluid.Interfaces.FluidPort_a port_a1( redeclare final package Medium = Medium) "Fluid connector a1 of the supply air (positive design flow direction is from port_a1 to port_b1)"; Modelica.Fluid.Interfaces.FluidPort_b port_b2( redeclare final package Medium = Medium) "Fluid connector b2 of the exhaust air (positive design flow direction is from port_a2 to port_b2)"; Modelica.Fluid.Interfaces.FluidPort_b port_b1( redeclare final package Medium = Medium) "Fluid connector b1 of the supply air (positive design flow direction is from port_a1 to port_b1)"; Modelica.Fluid.Interfaces.FluidPort_a port_a2( redeclare final package Medium = Medium) "Fluid connector a2 of the exhaust air (positive design flow direction is from port_a2 to port_b2)"; protected Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.Effectiveness effCal( final epsSen_nominal=per.epsSen_nominal, final epsLat_nominal=per.epsLat_nominal, final epsSenPL=per.epsSenPL, final epsLatPL=per.epsLatPL, final mSup_flow_nominal=per.mSup_flow_nominal) "Calculate the effectiveness of heat exchanger"; Buildings.Fluid.HeatExchangers.ThermalWheels.Latent.BaseClasses.HeatExchangerWithInputEffectiveness hex( redeclare package Medium1 = Medium, redeclare package Medium2 = Medium, final m1_flow_nominal=per.mSup_flow_nominal, final m2_flow_nominal=per.mExh_flow_nominal, final allowFlowReversal1=allowFlowReversal1, final allowFlowReversal2=allowFlowReversal2, final from_dp1=from_dp1, final from_dp2=from_dp2, final linearizeFlowResistance1=linearizeFlowResistance1, final linearizeFlowResistance2=linearizeFlowResistance2) "Heat exchanger"; equation connect(senSupMasFlo.m_flow, effCal.mSup_flow); connect(senExhMasFlo.m_flow, effCal.mExh_flow); connect(hex.port_b1, senSupMasFlo.port_a); connect(senSupMasFlo.port_b, port_b1); connect(senExhMasFlo.port_a, hex.port_b2); connect(senExhMasFlo.port_b, port_b2); end PartialWheel;