modelYorkCalc

Cooling tower with variable speed using the York calculation for the approach temperature

Extends from Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.CoolingTowerVariableSpeed (Base class for cooling towers with variable speed fan).

Information

Model for a steady-state or dynamic cooling tower with variable speed fan using the York calculation for the approach temperature at off-design conditions.

Thermal performance

To compute the thermal performance, this model takes as parameters the inlet and outlet temperatures of the cooling loop and the inlet air wet bulb temperature, and the rejected heat at the design condition. The design mass flow rate (of the chiller condenser loop) is then calculated based on these parameters.

For off-design conditions, the model uses the actual range temperature and a polynomial to compute the approach temperature for free convection and for forced convection, i.e., with the fan operating. The polynomial is valid for a York cooling tower. If the fan input signal y is below the minimum fan revolution yMin, then the cooling tower operates in free convection mode, otherwise it operates in the forced convection mode. For numerical reasons, this transition occurs in the range of y ∈ [0.9*yMin, yMin].

Fan power consumption

The fan power consumption at the design condition can be specified as follows:

  • The parameter fraPFan_nominal can be used to specify at the nominal conditions the fan power divided by the water flow rate. The default value is 275 Watts for a water flow rate of 0.15 kg/s.
  • The parameter PFan_nominal can be set to the fan power at nominal conditions. If a user does not set this parameter, then the fan power will be PFan_nominal = fraPFan_nominal * m_flow_nominal, where m_flow_nominal is the nominal water flow rate.

In the forced convection mode, the actual fan power is computed as PFan=fanRelPow(y) * PFan_nominal, where the default value for the fan relative power consumption at part load is fanRelPow(y)=y3. In the free convection mode, the fan power consumption is zero. For numerical reasons, the transition of fan power from the part load mode to zero power consumption in the free convection mode occurs in the range y ∈ [0.9*yMin, yMin].
To change the fan relative power consumption at part load in the forced convection mode, points of fan controls signal and associated relative power consumption can be specified. In between these points, the values are interpolated using cubic splines.

Comparison the cooling tower model of EnergyPlus

This model is similar to the model Cooling Tower:Variable Speed that is implemented in the EnergyPlus building energy simulation program version 6.0. The main differences are

  1. Not implemented are the basin heater power consumption, and the make-up water usage.
  2. The model has no built-in control to switch individual cells of the tower on or off. To switch cells on or off, use multiple instances of this model, and use your own control law to compute the input signal y.

Assumptions and limitations

This model requires a medium that has the same computation of the enthalpy as Buildings.Media.Water, which computes

h = cp (T-T0),

where h is the enthalpy, cp = 4184 J/(kg K) is the specific heat capacity, T is the temperature in Kelvin and T0 = 273.15 Kelvin. If this is not the case, the simulation will stop with an error message. The reason for this limitation is that as of January 2015, OpenModelica failed to translate the model if Medium.temperature() is used instead of Water.temperature().

References

EnergyPlus 2.0.0 Engineering Reference, April 9, 2007.

Parameters

TypeNameDefaultDescription
BooleanhomotopyInitialization (from TwoPortHeatMassExchanger)true= true, use homotopy method
Data.YorkCalc.GenericdatPerformance data
Assumptions
BooleanallowFlowReversal (from PartialTwoPort)true= false to simplify equations, assuming, but not enforcing, no flow reversal
Nominal condition
Modelica.Units.SI.MassFlowRatem_flow_nominal (from PartialTwoPortInterface)Nominal mass flow rate
Modelica.Units.SI.PressureDifferencedp_nominal (from TwoPortFlowResistanceParameters)Pressure difference
Modelica.Units.SI.TemperatureDifferenceTApp_nominaldat.TCooOut_nominal - dat.TAirInWB_nominalDesign approach temperature (coolant out - air out)
Modelica.Units.SI.TemperatureDifferenceTRan_nominaldat.TCooIn_nominal - dat.TCooOut_nominalDesign range temperature (coolant in - coolant out)
Advanced
Modelica.Units.SI.MassFlowRatem_flow_small (from PartialTwoPortInterface)1E-4*abs(m_flow_nominal)Small mass flow rate for regularization of zero flow
Advanced › Diagnostics
Booleanshow_T (from PartialTwoPortInterface)false= true, if actual temperature at port is computed
Flow resistance
BooleancomputeFlowResistance (from TwoPortFlowResistanceParameters)true=true, compute flow resistance. Set to false to assume no friction
Booleanfrom_dp (from TwoPortFlowResistanceParameters)false= true, use m_flow = f(dp) else dp = f(m_flow)
Realn (from TwoPortFlowResistanceParameters)2Flow exponent, n=1 for laminar, n=2 for turbulent
BooleanlinearizeFlowResistance (from TwoPortFlowResistanceParameters)false= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM (from TwoPortFlowResistanceParameters)0.1Fraction of nominal flow rate where flow transitions to laminar
Dynamics › Nominal condition
Modelica.Units.SI.Timetau (from TwoPortHeatMassExchanger)30Time constant at nominal flow (if energyDynamics <> SteadyState)
Dynamics › Conservation equations
Modelica.Fluid.Types.DynamicsenergyDynamics (from TwoPortHeatMassExchanger)Modelica.Fluid.Types.Dynamics.DynamicFreeInitialType of energy balance: dynamic (3 initialization options) or steady state
Initialization
Medium.AbsolutePressurep_start (from TwoPortHeatMassExchanger)Medium.p_defaultStart value of pressure
Medium.TemperatureT_start (from TwoPortHeatMassExchanger)Medium.T_defaultStart value of temperature
Medium.MassFraction[Medium.nX]X_start (from TwoPortHeatMassExchanger)Medium.X_defaultStart value of mass fractions m_i/m
Medium.ExtraProperty[Medium.nC]C_start (from TwoPortHeatMassExchanger)fill(0, Medium.nC)Start value of trace substances
Fan
Modelica.Units.SI.PowerPFan_nominal (from CoolingTowerVariableSpeed)Fan power at full speed
RealyMin (from CoolingTowerVariableSpeed)0.3Minimum control signal until fan is switched off (used for smoothing between forced and free convection regime)
cha.fanfanRelPow (from CoolingTowerVariableSpeed)Fan relative power consumption as a function of control signal, fanRelPow=P(y)/P(y=1)

Connectors

TypeNameDefaultDescription
Modelica.Fluid.Interfaces.FluidPort_aport_a (from PartialTwoPort)Fluid connector a (positive design flow direction is from port_a to port_b)
Modelica.Fluid.Interfaces.FluidPort_bport_b (from PartialTwoPort)Fluid connector b (positive design flow direction is from port_a to port_b)
Modelica.Blocks.Interfaces.RealOutputTLvg (from CoolingTower)Leaving water temperature
Modelica.Blocks.Interfaces.RealInputy (from CoolingTowerVariableSpeed)Fan control signal
Modelica.Blocks.Interfaces.RealOutputPFan (from CoolingTowerVariableSpeed)Electric power consumed by fan
Modelica.Blocks.Interfaces.RealInputTWetBulEntering air wet bulb temperature

Components

TypeNameDefaultDescription
Modelica.Units.SI.MassFlowRatem_flow (from PartialTwoPortInterface)port_a.m_flowMass flow rate from port_a to port_b (m_flow > 0 is design flow direction)
Modelica.Units.SI.PressureDifferencedp (from PartialTwoPortInterface)port_a.p - port_b.pPressure difference between port_a and port_b
Medium.ThermodynamicStatesta_a (from PartialTwoPortInterface)if allowFlowReversal then Medium.setState_phX(port_a.p, noEvent(actualStream(port_a.h_outflow)), noEvent(actualStream(port_a.Xi_outflow))) else Medium.setState_phX(port_a.p, noEvent(inStream(port_a.h_outflow)), noEvent(inStream(port_a.Xi_outflow)))Medium properties in port_a
Medium.ThermodynamicStatesta_b (from PartialTwoPortInterface)if allowFlowReversal then Medium.setState_phX(port_b.p, noEvent(actualStream(port_b.h_outflow)), noEvent(actualStream(port_b.Xi_outflow))) else Medium.setState_phX(port_b.p, noEvent(port_b.h_outflow), noEvent(port_b.Xi_outflow))Medium properties in port_b
Buildings.Fluid.MixingVolumes.MixingVolumevol (from TwoPortHeatMassExchanger)
Buildings.Fluid.FixedResistances.PressureDroppreDro (from TwoPortHeatMassExchanger)Flow resistance
Modelica.Units.SI.HeatFlowRateQ_flow (from CoolingTower)preHea.Q_flowHeat input into water circuit
Buildings.Fluid.HeatExchangers.CoolingTowers.Correlations.BoundsYorkCalcbouBounds for correlation
Modelica.Units.SI.TemperatureDifferenceTRanT_a - T_bRange temperature
Modelica.Units.SI.TemperatureDifferenceTAppActBuildings.Utilities.Math.Functions.spliceFunction(pos = TAppCor, neg = TAppFreCon, x = y - yMin + yMin/20, deltax = yMin/20)Approach temperature difference
Modelica.Units.SI.MassFractionFRWatm_flow/mWat_flow_nominalRatio actual over design water mass flow ratio
Modelica.Units.SI.MassFractionFRAiryRatio actual over design air mass flow ratio

Contents

NameDescription
WaterprotectedMedium package for water

Revisions

  • April 22, 2026, by Michael Wetter:
    Removed parameter fraPFan_nominal and introduced instead the non-dimensional parameter PEle_Q_flow_nominal.
    This is for #4443.
  • August 26, 2021, by Baptiste Ravache:
    Renamed parameter TWatIn0 to TWatIn_nominal.
  • January 16, 2020, by Michael Wetter:
    Refactored model to avoid mixing textual equations and connect statements.
  • December, 22, 2019, by Kathryn Hinkelman:
    Corrected fan power consumption.
    This is for issue 1691.
  • November 3, 2016, by Michael Wetter:
    Corrected wrong type for FRWat0, as this variable can take on values that are bigger than 1.
    This is for issue 567.
  • January 2, 2015, by Michael Wetter:
    Replaced Medium.temperature() with Water.temperature() in order for the model to work with OpenModelica. Added an assert that stops the simulation if an incompatible medium is used.
  • November 13, 2014, by Michael Wetter:
    Added missing each keyword for fanRelPowDer. Added regularization in computation of TAppCor. Removed intermediate states with temperatures.
  • May 30, 2014, by Michael Wetter:
    Removed undesirable annotation Evaluate=true.
  • October 9, 2013, by Michael Wetter:
    Simplified the implementation for the situation if allowReverseFlow=false. Avoided the use of the conditionally enabled variables sta_a and sta_b as this was not proper use of the Modelica syntax.
  • September 29, 2011, by Michael Wetter:
    Revised model to use cubic spline interpolation instead of a polynomial.
  • July 12, 2011, by Michael Wetter:
    Introduced common base class for Buildings.Fluid.HeatExchangers.CoolingTowers.YorkCalc and Buildings.Fluid.HeatExchangers.CoolingTowers.FixedApproach so that they can be used as replaceable models.
  • May 12, 2011, by Michael Wetter:
    Added binding equations for Q_flow and mXi_flow.
  • March 8, 2011, by Michael Wetter:
    Removed base class and unused variables.
  • February 25, 2011, by Michael Wetter:
    Revised implementation to facilitate scaling the model to different nominal sizes. Removed parameter mWat_flow_nominal since it is equal to m_flow_nominal, which is the water flow rate from the chiller condenser loop.
  • May 16, 2008, by Michael Wetter:
    First implementation.