Buildings.Fluid.MassExchangers

Package with mass exchanger models

Information

This package contains models for mass exchangers. For heat exchanger models without humidity transfer, see the package Buildings.Fluid.HeatExchangers.

Extends from Modelica.Icons.VariantsPackage (Icon for package containing variants).

Package Content

Name Description
Buildings.Fluid.MassExchangers.ConstantEffectiveness ConstantEffectiveness Heat and moisture exchanger with constant effectiveness
Buildings.Fluid.MassExchangers.Examples Examples Collection of models that illustrate model use and test models
Buildings.Fluid.MassExchangers.Validation Validation Validation examples

Buildings.Fluid.MassExchangers.ConstantEffectiveness Buildings.Fluid.MassExchangers.ConstantEffectiveness

Heat and moisture exchanger with constant effectiveness

Buildings.Fluid.MassExchangers.ConstantEffectiveness

Information

Model for a heat and moisture exchanger with constant effectiveness.

This model transfers heat and moisture in the amount of

  QSen = epsS * Q_max,
  m    = epsL * mWat_max,

where epsS and epsL are constant effectiveness for the sensible and latent heat transfer, Q_max is the maximum sensible heat that can be transferred and mWat_max is the maximum moisture that can be transferred.

For a sensible heat exchanger, use Buildings.Fluid.HeatExchangers.ConstantEffectiveness instead of this model.

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
BooleansensibleOnly1falseSet to true if sensible exchange only for medium 1
BooleansensibleOnly2falseSet to true if sensible exchange only for medium 2
EfficiencyepsS0.8Sensible heat exchanger effectiveness [1]
EfficiencyepsL0.8Latent heat exchanger effectiveness [1]
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]
Custom Parameters
HeatFlowRateQ1_flowepsS*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]
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]
BooleanhomotopyInitializationtrue= true, use homotopy method
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)

Modelica definition

model ConstantEffectiveness "Heat and moisture exchanger with constant 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 = epsS * QMax_flow + QLat_flow, Q2_flow = -Q1_flow, mWat1_flow = +mWat_flow, mWat2_flow = -mWat_flow); parameter Modelica.SIunits.Efficiency epsS(max=1) = 0.8 "Sensible heat exchanger effectiveness"; parameter Modelica.SIunits.Efficiency epsL(max=1) = 0.8 "Latent heat exchanger effectiveness"; Modelica.SIunits.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.SIunits.MassFlowRate mWat_flow "Water flow rate from medium 2 to medium 1"; Modelica.SIunits.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 = epsL * mMax_flow; // As enthalpyOfCondensingGas is dominated by the latent heat of phase change, // we simplify and use Medium1.enthalpyOfVaporization for the // latent heat that is exchanged among the fluid streams. // This is simply 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 ConstantEffectiveness;