Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses

Package with base classes for Buildings.Fluid.HeatExchangers.CoolingTowers

Information

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

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

Package Content

Name Description
Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.CoolingTower CoolingTower Base class for cooling towers
Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.CoolingTowerVariableSpeed CoolingTowerVariableSpeed Base class for cooling towers with variable speed fan
Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.DryCooler DryCooler Model for thermal performance of dry cooling tower
Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.DryCoolerUA DryCoolerUA Block that computes UA, effectiveness, and heat transfer of a dry cooler
Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.Merkel Merkel Model for thermal performance of Merkel cooling tower
Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.Characteristics Characteristics Functions for fan characteristics
Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.Functions Functions  

Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.CoolingTower Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.CoolingTower

Base class for cooling towers

Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.CoolingTower

Information

Base class for a steady-state cooling tower. The variable TAirHT is used to compute the heat transfer with the water side of the cooling tower. For a dry cooling tower, this is equal to the dry-bulb temperature. For a wet cooling tower, this is equal to the wet-bulb temperature.

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
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
PressureDifferencedp_nominal Pressure difference [Pa]
Assumptions
BooleanallowFlowReversaltrue= 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
Timetau30Time constant at nominal flow (if energyDynamics <> SteadyState) [s]
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type 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

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 RealOutputTLvgLeaving water temperature [K]

Modelica definition

partial model CoolingTower "Base class for cooling towers" extends Buildings.Fluid.Interfaces.TwoPortHeatMassExchanger( redeclare final Buildings.Fluid.MixingVolumes.MixingVolume vol); Modelica.Blocks.Interfaces.RealOutput TLvg( final unit="K", displayUnit="degC") "Leaving water temperature"; Modelica.Units.SI.HeatFlowRate Q_flow=preHea.Q_flow "Heat input into water circuit"; protected parameter Modelica.Units.SI.SpecificHeatCapacity cp_default= Medium.specificHeatCapacityCp(sta_default) "Specific heat capacity"; Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHea "Prescribed heat flow"; Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor TVol "Water temperature in volume, leaving at port_b"; equation connect(preHea.port, vol.heatPort); connect(TVol.port, vol.heatPort); connect(TVol.T, TLvg); end CoolingTower;

Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.CoolingTowerVariableSpeed Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.CoolingTowerVariableSpeed

Base class for cooling towers with variable speed fan

Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.CoolingTowerVariableSpeed

Information

Base model for a steady-state or dynamic cooling tower with a variable speed fan. This base model is used for both the Merkel and York calculation.

Extends from Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.CoolingTower (Base class for cooling towers).

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
PressureDifferencedp_nominal Pressure difference [Pa]
Fan
PowerPFan_nominal Fan power at full speed [W]
RealyMin0.3Minimum control signal until fan is switched off (used for smoothing between forced and free convection regime) [1]
fanfanRelPowfanRelPow(r_V={0,0.1,0.3,0.6...Fan relative power consumption as a function of control signal, fanRelPow=P(y)/P(y=1)
Assumptions
BooleanallowFlowReversaltrue= 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
Timetau30Time constant at nominal flow (if energyDynamics <> SteadyState) [s]
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type 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

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 RealOutputTLvgLeaving water temperature [K]
input RealInputyFan control signal [1]
output RealOutputPFanElectric power consumed by fan [W]

Modelica definition

model CoolingTowerVariableSpeed "Base class for cooling towers with variable speed fan" extends Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.CoolingTower; import cha = Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.Characteristics; parameter Modelica.Units.SI.Power PFan_nominal "Fan power at full speed"; parameter Real yMin(min=0.01, max=1, final unit="1") = 0.3 "Minimum control signal until fan is switched off (used for smoothing between forced and free convection regime)"; parameter cha.fan fanRelPow( r_V = {0, 0.1, 0.3, 0.6, 1}, r_P = {0, 0.1^3, 0.3^3, 0.6^3, 1}) "Fan relative power consumption as a function of control signal, fanRelPow=P(y)/P(y=1)"; Modelica.Blocks.Interfaces.RealInput y(unit="1") "Fan control signal"; Modelica.Blocks.Interfaces.RealOutput PFan( final quantity="Power", final unit="W") "Electric power consumed by fan"; protected parameter Real fanRelPowDer[size(fanRelPow.r_V,1)] = Buildings.Utilities.Math.Functions.splineDerivatives( x=fanRelPow.r_V, y=fanRelPow.r_P, ensureMonotonicity=Buildings.Utilities.Math.Functions.isMonotonic( x=fanRelPow.r_P, strict=false)) "Coefficients for fan relative power consumption as a function of control signal"; Modelica.Blocks.Sources.RealExpression PFan_y( y( final quantity="Power", final unit="W") = Buildings.Utilities.Math.Functions.spliceFunction( pos=cha.normalizedPower(per=fanRelPow, r_V=y, d=fanRelPowDer) * PFan_nominal, neg=0, x=y-yMin+yMin/20, deltax=yMin/20)) "Electricity use of fan"; initial equation // Check validity of relative fan power consumption at y=yMin and y=1 assert(cha.normalizedPower(per=fanRelPow, r_V=yMin, d=fanRelPowDer) > -1E-4, "The fan relative power consumption must be non-negative for y=0." + "\n Obtained fanRelPow(0) = " + String(cha.normalizedPower(per=fanRelPow, r_V=yMin, d=fanRelPowDer)) + "\n You need to choose different values for the parameter fanRelPow."); assert(abs(1-cha.normalizedPower(per=fanRelPow, r_V=1, d=fanRelPowDer))<1E-4, "The fan relative power consumption must be one for y=1." + "\n Obtained fanRelPow(1) = " + String(cha.normalizedPower(per=fanRelPow, r_V=1, d=fanRelPowDer)) + "\n You need to choose different values for the parameter fanRelPow."); equation connect(PFan_y.y, PFan); end CoolingTowerVariableSpeed;

Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.DryCooler Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.DryCooler

Model for thermal performance of dry cooling tower

Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.DryCooler

Information

Model for the thermal performance of the dry cooling tower.

The air mass flow rate is computed as

air = y ṁair,nominal

This air flow rate is supplied to both the heat transfer coefficient block Buildings.Fluid.HeatExchangers.BaseClasses.HADryCoil (instance hA) and to Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.DryCoolerUA (instance dryCoolerUA), which computes the overall thermal conductance UA, the effectiveness ε, and the heat flow rate .

For the full documentation, see Buildings.Fluid.HeatExchangers.CoolingTowers.DryCooler.

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

Parameters

TypeNameDefaultDescription
replaceable package MediumModelica.Media.Interfaces.Pa...Medium in the component
Genericdat Performance data record
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate of water [kg/s]
Fan
RealyMin Minimum control signal until fan is switched off (used for smoothing between forced and free convection regime) [1]

Connectors

TypeNameDescription
replaceable package MediumMedium in the component
input RealInputyFan control signal [1]
input RealInputm_flowCooling fluid mass flow rate [kg/s]
input RealInputTCooInInlet water temperature [K]
input RealInputTDryBulEntering air dry bulb temperature [K]
output RealOutputQ_flowHeat removed from water

Modelica definition

block DryCooler "Model for thermal performance of dry cooling tower" extends Modelica.Blocks.Icons.Block; replaceable package Medium = Modelica.Media.Interfaces.PartialMedium "Medium in the component"; parameter Buildings.Fluid.HeatExchangers.CoolingTowers.Data.DryCooler.Generic dat "Performance data record"; parameter Modelica.Units.SI.MassFlowRate m_flow_nominal "Nominal mass flow rate of water"; final parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal= m_flow_nominal/dat.ratCooAir_nominal "Nominal mass flow rate of air"; parameter Real yMin(min=0.01, max=1, final unit="1") "Minimum control signal until fan is switched off (used for smoothing between forced and free convection regime)"; final parameter Modelica.Units.SI.ThermalConductance UA_nominal = UA.UA_nominal "Thermal conductance at nominal flow, used to compute heat capacity"; final parameter Real eps_nominal = UA.eps_nominal "Nominal heat transfer effectiveness"; final parameter Real NTU_nominal(min = 0) = UA.NTU_nominal "Nominal number of transfer units"; Modelica.Blocks.Interfaces.RealInput y(unit="1") "Fan control signal"; Modelica.Blocks.Interfaces.RealInput m_flow(final unit="kg/s") "Cooling fluid mass flow rate"; Modelica.Blocks.Interfaces.RealInput TCooIn( final min=0, final unit="K", displayUnit="degC") "Inlet water temperature"; Modelica.Blocks.Interfaces.RealInput TDryBul( final min=0, final unit="K", displayUnit="degC") "Entering air dry bulb temperature"; Modelica.Blocks.Interfaces.RealOutput Q_flow "Heat removed from water"; protected Buildings.Fluid.HeatExchangers.BaseClasses.HADryCoil hA( final UA_nominal=UA.UA_nominal, final m_flow_nominal_w=m_flow_nominal, final m_flow_nominal_a=mAir_flow_nominal, final r_nominal=dat.UACor.r_nominal, final n_w=dat.UACor.n_w, final n_a=dat.UACor.n_a, final T0_w=dat.TCooIn_nominal, final T0_a=dat.TAirIn_nominal) "Convective heat transfer correction for flow rate and temperatures"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter mAirFlo( final k=mAir_flow_nominal) "Air mass flow rate"; Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.DryCoolerUA UA( redeclare final package Medium = Medium, final dat=dat, final m_flow_nominal=m_flow_nominal, final yMin=yMin) "Block that computes UA, effectiveness, and heat flow rate"; equation connect(hA.m1_flow, m_flow); connect(hA.T_1, TCooIn); connect(hA.T_2, TDryBul); connect(mAirFlo.u, y); connect(hA.m2_flow, mAirFlo.y); connect(UA.mAir_flow, mAirFlo.y); connect(UA.y, y); connect(UA.mCoo_flow, m_flow); connect(UA.TCooIn, TCooIn); connect(UA.TAirIn, TDryBul); connect(UA.hACoo, hA.hA_1); connect(UA.hAAir, hA.hA_2); connect(UA.Q_flow, Q_flow); end DryCooler;

Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.DryCoolerUA Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.DryCoolerUA

Block that computes UA, effectiveness, and heat transfer of a dry cooler

Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.DryCoolerUA

Information

Block that computes the overall thermal conductance UA, the heat exchanger effectiveness ε, and the heat flow rate for a dry cooler.

Main relationships

The overall conductance is computed from the convective heat transfer coefficients on the coolant side hACoo and the air side hAAir as

UA = corUA ⁄ (1 ⁄ hAcoo + 1 ⁄ hAair),

where corUA is a correction factor that reduces UA in the free-convection regime when the fan is off.

The effectiveness–NTU method is used to compute the heat flow rate transferred from water to air.

Assumptions

References

For further documentation, see Buildings.Fluid.HeatExchangers.CoolingTowers.DryCooler.

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

Parameters

TypeNameDefaultDescription
replaceable package MediumModelica.Media.Interfaces.Pa...Medium in the component
Genericdat Performance data record
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate of water [kg/s]
Fan
RealyMin Minimum control signal until fan is switched off (used for smoothing between forced and free convection regime) [1]

Connectors

TypeNameDescription
replaceable package MediumMedium in the component
input RealInputyFan control signal [1]
input RealInputmAir_flowAir mass flow rate [kg/s]
input RealInputmCoo_flowCooling fluid mass flow rate [kg/s]
input RealInputTCooInInlet water temperature [K]
input RealInputTAirInEntering air dry bulb temperature [K]
input RealInputhACooConvective heat transfer coefficient times area on the coolant side [W/K]
input RealInputhAAirConvective heat transfer coefficient times area on the air side [W/K]
output RealOutputQ_flowHeat removed from water

Modelica definition

block DryCoolerUA "Block that computes UA, effectiveness, and heat transfer of a dry cooler" extends Modelica.Blocks.Icons.Block; replaceable package Medium = Modelica.Media.Interfaces.PartialMedium "Medium in the component"; parameter Buildings.Fluid.HeatExchangers.CoolingTowers.Data.DryCooler.Generic dat "Performance data record"; parameter Modelica.Units.SI.MassFlowRate m_flow_nominal "Nominal mass flow rate of water"; final parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal= m_flow_nominal/dat.ratCooAir_nominal "Nominal mass flow rate of air"; parameter Real yMin(min=0.01, max=1, final unit="1") "Minimum control signal until fan is switched off (used for smoothing between forced and free convection regime)"; final parameter Modelica.Units.SI.ThermalConductance UA_nominal= NTU_nominal*CMin_flow_nominal "Thermal conductance at nominal flow, used to compute heat capacity"; final parameter Real eps_nominal= dat.Q_flow_nominal/((dat.TAirIn_nominal - dat.TCooIn_nominal)*CMin_flow_nominal) "Nominal heat transfer effectiveness"; final parameter Real NTU_nominal(min=0)= Buildings.Fluid.HeatExchangers.BaseClasses.ntu_epsilonZ( eps=min(0.99999, max(1E-6, eps_nominal)), Z=Z_nominal, flowRegime=Integer(Buildings.Fluid.Types.HeatExchangerConfiguration.CounterFlow)) "Nominal number of transfer units"; final parameter Real Z_nominal( min=0, max=1) = CMin_flow_nominal/CMax_flow_nominal "Ratio of capacity flow rate at nominal condition"; final parameter Modelica.Units.SI.Temperature TAirOut_nominal= dat.TAirIn_nominal - abs(dat.Q_flow_nominal)/CAir_flow_nominal "Nominal leaving air drybulb temperature"; Modelica.Blocks.Interfaces.RealInput y(unit="1") "Fan control signal"; Modelica.Blocks.Interfaces.RealInput mAir_flow(final unit="kg/s") "Air mass flow rate"; Modelica.Blocks.Interfaces.RealInput mCoo_flow(final unit="kg/s") "Cooling fluid mass flow rate"; Modelica.Blocks.Interfaces.RealInput TCooIn( final min=0, final unit="K", displayUnit="degC") "Inlet water temperature"; Modelica.Blocks.Interfaces.RealInput TAirIn( final min=0, final unit="K", displayUnit="degC") "Entering air dry bulb temperature"; Modelica.Blocks.Interfaces.RealInput hACoo(final unit="W/K") "Convective heat transfer coefficient times area on the coolant side"; Modelica.Blocks.Interfaces.RealInput hAAir(final unit="W/K") "Convective heat transfer coefficient times area on the air side"; Real eps(min=0, max=1, unit="1") "Heat exchanger effectiveness"; Modelica.Units.SI.SpecificHeatCapacity cpCoo "Heat capacity of cooling loop fluid"; Modelica.Units.SI.ThermalConductance CAir_flow "Heat capacity flow rate of air"; Modelica.Units.SI.ThermalConductance CCoo_flow "Heat capacity flow rate of water"; Modelica.Units.SI.ThermalConductance CMin_flow(min=0) "Minimum heat capacity flow rate"; Modelica.Units.SI.HeatFlowRate QMax_flow "Maximum heat flow rate into air"; Modelica.Units.SI.ThermalConductance UA "Thermal conductance"; Modelica.Blocks.Interfaces.RealOutput Q_flow "Heat removed from water"; protected final package Air = Buildings.Media.Air "Package of medium air"; final parameter Air.ThermodynamicState staAir_default=Air.setState_pTX( T=dat.TAirIn_nominal, p=Air.p_default, X=Air.X_default[1:Air.nXi]) "Default state for air"; final parameter Medium.ThermodynamicState staCoo_default=Medium.setState_pTX( T=dat.TCooIn_nominal, p=Medium.p_default, X=Medium.X_default[1:Medium.nXi]) "Default state for water"; parameter Real delta=1E-3 "Parameter used for smoothing"; parameter Modelica.Units.SI.SpecificHeatCapacity cpAir_nominal= Air.specificHeatCapacityCp(staAir_default) "Specific heat capacity of air at nominal condition"; parameter Modelica.Units.SI.SpecificHeatCapacity cpCoo_nominal= Medium.specificHeatCapacityCp(staCoo_default) "Specific heat capacity of water at nominal condition"; parameter Modelica.Units.SI.ThermalConductance CAir_flow_nominal= mAir_flow_nominal*cpAir_nominal "Nominal capacity flow rate of air"; parameter Modelica.Units.SI.ThermalConductance CCoo_flow_nominal= m_flow_nominal*cpCoo_nominal "Nominal capacity flow rate of water"; parameter Modelica.Units.SI.ThermalConductance CMin_flow_nominal= min(CAir_flow_nominal, CCoo_flow_nominal) "Minimal capacity flow rate at nominal condition"; parameter Modelica.Units.SI.ThermalConductance CMax_flow_nominal= max(CAir_flow_nominal, CCoo_flow_nominal) "Maximum capacity flow rate at nominal condition"; Real corUAFreCon "Correction for UA value in free convection regime"; initial equation assert(eps_nominal > 0 and eps_nominal < 1, "eps_nominal out of bounds, eps_nominal = " + String(eps_nominal) + "\n To achieve a heat transfer rate at epsilon=0.8, set |TAirIn_nominal-TCooIn_nominal| = " + String(abs(dat.Q_flow_nominal/0.8*CMin_flow_nominal)) + "\n or increase flow rates. The current parameters result in " + "\n CAir_flow_nominal = " + String(CAir_flow_nominal) + "\n CCoo_flow_nominal = " + String(CCoo_flow_nominal) + "\n TAirOut_nominal = " + String(TAirOut_nominal) + " (" + String(TAirOut_nominal-273.15) + " degC)" + "\n with TAirIn_nominal = " + String(dat.TAirIn_nominal) + " (" + String(dat.TAirIn_nominal-273.15) + " degC)" + "\n TCooIn_nominal = " + String(dat.TCooIn_nominal) + " (" + String(dat.TCooIn_nominal-273.15) + " degC)."); equation // For cp water, we use the inlet temperatures because the effect is small // for actual water temperature differences, and in case of Buildings.Media.Water, // cp is constant. cpCoo = Medium.specificHeatCapacityCp(Medium.setState_pTX( p=Medium.p_default, T=TCooIn, X=Medium.X_default)); // Reduction of UA value in free convection regime corUAFreCon = Buildings.Utilities.Math.Functions.spliceFunction( pos=1, neg=dat.fraFreCon, x=y - yMin + yMin/20, deltax=yMin/20); // UA value, for correction, simplified to be dominated by convection UA =corUAFreCon/(1/hACoo + 1/hAAir); // Capacity for air and water CAir_flow = abs(mAir_flow)*cpAir_nominal; CCoo_flow = abs(mCoo_flow)*cpCoo; CMin_flow = Buildings.Utilities.Math.Functions.smoothMin( CAir_flow, CCoo_flow, delta*CMin_flow_nominal); // Calculate epsilon eps = Buildings.Fluid.HeatExchangers.BaseClasses.epsilon_C( UA=UA, C1_flow=CAir_flow, C2_flow=CCoo_flow, flowRegime=Integer(Buildings.Fluid.Types.HeatExchangerConfiguration.CrossFlowUnmixed), CMin_flow_nominal=CMin_flow_nominal, CMax_flow_nominal=CMax_flow_nominal, delta=delta); // QMax_flow is maximum heat transfer into medium air: positive means heating QMax_flow =CMin_flow*(TCooIn - TAirIn); Q_flow = -eps*QMax_flow; end DryCoolerUA;

Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.Merkel Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.Merkel

Model for thermal performance of Merkel cooling tower

Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.Merkel

Information

Model for the thermal peformance of the Merkel cooling tower.

For the documentation, see Buildings.Fluid.HeatExchangers.CoolingTowers.Merkel.

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

Parameters

TypeNameDefaultDescription
replaceable package MediumModelica.Media.Interfaces.Pa...Medium in the component
Genericdat Performance data
Fan
RealyMin Minimum control signal until fan is switched off (used for smoothing between forced and free convection regime) [1]

Connectors

TypeNameDescription
replaceable package MediumMedium in the component
input RealInputyFan control signal [1]
input RealInputm_flowWater mass flow rate [kg/s]
input RealInputTCooInInlet water temperature [K]
input RealInputTWetBulEntering air wet bulb temperature [K]
output RealOutputQ_flowHeat removed from water

Modelica definition

block Merkel "Model for thermal performance of Merkel cooling tower" extends Modelica.Blocks.Icons.Block; replaceable package Medium = Modelica.Media.Interfaces.PartialMedium "Medium in the component"; parameter Data.Merkel.Generic dat "Performance data"; final parameter Modelica.Units.SI.MassFlowRate mCoo_flow_nominal = abs(dat.Q_flow_nominal / cpCoo_nominal / (dat.TCooOut_nominal - dat.TCooIn_nominal)) "Nominal mass flow rate of cooled fluid"; final parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal= mCoo_flow_nominal/dat.ratCooAir_nominal "Nominal mass flow rate of air"; parameter Real yMin(min=0.01, max=1, final unit="1") "Minimum control signal until fan is switched off (used for smoothing between forced and free convection regime)"; final parameter Modelica.Units.SI.ThermalConductance UA_nominal=NTU_nominal* CMin_flow_nominal * Buildings.Utilities.Psychrometrics.Constants.cpAir/cpEqu_nominal "Thermal conductance at nominal flow, used to compute heat capacity"; final parameter Real eps_nominal= dat.Q_flow_nominal/((dat.TAirInWB_nominal - dat.TCooIn_nominal) * CMin_flow_nominal) "Nominal heat transfer effectiveness"; final parameter Real NTU_nominal(min=0)= Buildings.Fluid.HeatExchangers.BaseClasses.ntu_epsilonZ( eps=min(1, max(0, eps_nominal)), Z=Z_nominal, flowRegime=Integer(Buildings.Fluid.Types.HeatExchangerConfiguration.CounterFlow)) "Nominal number of transfer units"; Modelica.Blocks.Interfaces.RealInput y(unit="1") "Fan control signal"; Modelica.Blocks.Interfaces.RealInput m_flow(final unit="kg/s") "Water mass flow rate"; Modelica.Blocks.Interfaces.RealInput TCooIn( final min=0, final unit="K", displayUnit="degC") "Inlet water temperature"; Modelica.Blocks.Interfaces.RealInput TWetBul( final min=0, final unit="K", displayUnit="degC") "Entering air wet bulb temperature"; Modelica.Units.SI.Temperature TAirOut(displayUnit="degC") "Outlet air temperature"; Modelica.Units.SI.MassFlowRate mAir_flow "Air mass flow rate"; Modelica.Units.SI.MassFraction FRWat "Ratio actual over design water mass flow ratio"; Modelica.Units.SI.MassFraction FRAir "Ratio actual over design air mass flow ratio"; Real eps(min=0, max=1, unit="1") "Heat exchanger effectiveness"; Modelica.Units.SI.SpecificHeatCapacity cpWat "Heat capacity of water"; Modelica.Units.SI.ThermalConductance CAir_flow "Heat capacity flow rate of air"; Modelica.Units.SI.ThermalConductance CCoo_flow "Heat capacity flow rate of cooled fluid"; Modelica.Units.SI.ThermalConductance CMin_flow(min=0) "Minimum heat capacity flow rate"; Modelica.Units.SI.HeatFlowRate QMax_flow "Maximum heat flow rate into air"; Modelica.Units.SI.ThermalConductance UAe(min=0) "Thermal conductance for equivalent fluid"; Modelica.Units.SI.ThermalConductance UA "Thermal conductance"; Modelica.Blocks.Interfaces.RealOutput Q_flow "Heat removed from water"; protected final package Air = Buildings.Media.Air "Package of medium air"; final parameter Air.ThermodynamicState staAir_default=Air.setState_pTX( T=dat.TAirInWB_nominal, p=Air.p_default, X=Air.X_default[1:Air.nXi]) "Default state for air"; final parameter Medium.ThermodynamicState staCoo_default=Medium.setState_pTX( T=dat.TCooIn_nominal, p=Medium.p_default, X=Medium.X_default[1:Medium.nXi]) "Default state for cooled fluid"; parameter Real delta=1E-3 "Parameter used for smoothing"; parameter Modelica.Units.SI.SpecificHeatCapacity cpEqu_nominal= Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.Functions.equivalentHeatCapacity( TIn=dat.TAirInWB_nominal, TOut=TAirOutWB_nominal) "Specific heat capacity of the equivalent medium on the air side at nominal condition"; parameter Modelica.Units.SI.SpecificHeatCapacity cpAir_nominal= Air.specificHeatCapacityCp(staAir_default) "Specific heat capacity of air at nominal condition"; parameter Modelica.Units.SI.SpecificHeatCapacity cpCoo_nominal= Medium.specificHeatCapacityCp(staCoo_default) "Specific heat capacity of water at nominal condition"; parameter Modelica.Units.SI.ThermalConductance CAir_flow_nominal= mAir_flow_nominal*cpEqu_nominal "Nominal capacity flow rate of air"; parameter Modelica.Units.SI.ThermalConductance CCoo_flow_nominal= mCoo_flow_nominal*cpCoo_nominal "Nominal capacity flow rate of water"; parameter Modelica.Units.SI.ThermalConductance CMin_flow_nominal=min( CAir_flow_nominal, CCoo_flow_nominal) "Minimal capacity flow rate at nominal condition"; parameter Modelica.Units.SI.ThermalConductance CMax_flow_nominal=max( CAir_flow_nominal, CCoo_flow_nominal) "Maximum capacity flow rate at nominal condition"; parameter Real Z_nominal( min=0, max=1) = CMin_flow_nominal/CMax_flow_nominal "Ratio of capacity flow rate at nominal condition"; parameter Modelica.Units.SI.Temperature TAirOutWB_nominal(fixed=false) "Nominal leaving air wetbulb temperature"; Real UA_FAir "UA correction factor as function of air flow ratio"; Real UA_FWat "UA correction factor as function of water flow ratio"; Real UA_DifWB "UA correction factor as function of differential wetbulb temperature"; Real corFac_FAir "Smooth factor as function of air flow ratio"; Real corFac_FWat "Smooth factor as function of water flow ratio"; Modelica.Units.SI.SpecificHeatCapacity cpEqu "Specific heat capacity of the equivalent fluid"; initial equation // Heat transferred from air to water at nominal condition dat.Q_flow_nominal = mAir_flow_nominal*cpEqu_nominal*(dat.TAirInWB_nominal - TAirOutWB_nominal); assert(eps_nominal > 0 and eps_nominal < 1, "eps_nominal out of bounds, eps_nominal = " + String(eps_nominal) + "\n To achieve a heat transfer rate at epsilon=0.8, set |TAirInWB_nominal-TCooIn_nominal| = " + String(abs(dat.Q_flow_nominal/0.8*CMin_flow_nominal)) + "\n or increase flow rates. The current parameters result in " + "\n CAir_flow_nominal = " + String(CAir_flow_nominal) + "\n CCoo_flow_nominal = " + String(CCoo_flow_nominal) + "\n TAirOutWB_nominal = " + String(TAirOutWB_nominal) + " (" + String(TAirOutWB_nominal-273.15) + " degC)" + "\n with TAirInWB_nominal = " + String(dat.TAirInWB_nominal) + " (" + String(dat.TAirInWB_nominal-273.15) + " degC)" + "\n TCooIn_nominal = " + String(dat.TCooIn_nominal) + " (" + String(dat.TCooIn_nominal-273.15) + " degC)."); equation // For cp water, we use the inlet temperatures because the effect is small // for actual water temperature differences, and in case of Buildings.Media.Water, // cp is constant. cpWat = Medium.specificHeatCapacityCp(Medium.setState_pTX( p=Medium.p_default, T=TCooIn, X=Medium.X_default)); // Determine the airflow based on fan speed signal mAir_flow = Buildings.Utilities.Math.Functions.spliceFunction( pos=y*mAir_flow_nominal, neg=dat.fraFreCon*mAir_flow_nominal, x=y - yMin + yMin/20, deltax=yMin/20); FRAir = mAir_flow/mAir_flow_nominal; FRWat = m_flow/mCoo_flow_nominal; // UA for equivalent fluid // Adjust UA UA_FAir =Buildings.Fluid.Utilities.extendedPolynomial( x=FRAir, c=dat.UACor.cAirFra, xMin=dat.UACor.FRAirMin, xMax=dat.UACor.FRAirMax) "UA correction factor as function of air flow fraction"; UA_FWat =Buildings.Fluid.Utilities.extendedPolynomial( x=FRWat, c=dat.UACor.cWatFra, xMin=dat.UACor.FRWatMin, xMax=dat.UACor.FRWatMax) "UA correction factor as function of water flow fraction"; UA_DifWB =Buildings.Fluid.Utilities.extendedPolynomial( x=dat.TAirInWB_nominal - TWetBul, c=dat.UACor.cDifWB, xMin=dat.UACor.TDiffWBMin, xMax=dat.UACor.TDiffWBMax) "UA correction factor as function of differential wet bulb temperature"; corFac_FAir =Buildings.Utilities.Math.Functions.smoothHeaviside( x=FRAir - dat.UACor.FRAirMin/4, delta=dat.UACor.FRAirMin/4); corFac_FWat =Buildings.Utilities.Math.Functions.smoothHeaviside( x=FRWat - dat.UACor.FRWatMin/4, delta=dat.UACor.FRWatMin/4); UA = UA_nominal*UA_FAir*UA_FWat*UA_DifWB*corFac_FAir*corFac_FWat; UAe = UA*cpEqu/Buildings.Utilities.Psychrometrics.Constants.cpAir; // Capacity for air and water CAir_flow =abs(mAir_flow)*cpEqu; CCoo_flow =abs(m_flow)*cpWat; CMin_flow =Buildings.Utilities.Math.Functions.smoothMin( CAir_flow, CCoo_flow, delta*CMin_flow_nominal); // Calculate epsilon eps = Buildings.Fluid.HeatExchangers.BaseClasses.epsilon_C( UA=UAe, C1_flow=CAir_flow, C2_flow=CCoo_flow, flowRegime=Integer(Buildings.Fluid.Types.HeatExchangerConfiguration.CounterFlow), CMin_flow_nominal=CMin_flow_nominal, CMax_flow_nominal=CMax_flow_nominal, delta=delta); // QMax_flow is maximum heat transfer into medium air: positive means heating QMax_flow =CMin_flow*(TCooIn - TWetBul); eps*QMax_flow =CAir_flow*(TAirOut - TWetBul); cpEqu = Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.Functions.equivalentHeatCapacity( TIn=TWetBul, TOut=TAirOut); Q_flow = -eps * QMax_flow; end Merkel;