modelYorkCalc
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_nominalcan 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_nominalcan be set to the fan power at nominal conditions. If a user does not set this parameter, then the fan power will bePFan_nominal = fraPFan_nominal * m_flow_nominal, wherem_flow_nominalis 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
- Not implemented are the basin heater power consumption, and the make-up water usage.
-
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
| Type | Name | Default | Description |
|---|---|---|---|
| Boolean | homotopyInitialization (from TwoPortHeatMassExchanger) | true | = true, use homotopy method |
| Data.YorkCalc.Generic | dat | Performance data | |
| Assumptions | |||
| Boolean | allowFlowReversal (from PartialTwoPort) | true | = false to simplify equations, assuming, but not enforcing, no flow reversal |
| Nominal condition | |||
| Modelica.Units.SI.MassFlowRate | m_flow_nominal (from PartialTwoPortInterface) | Nominal mass flow rate | |
| Modelica.Units.SI.PressureDifference | dp_nominal (from TwoPortFlowResistanceParameters) | Pressure difference | |
| Modelica.Units.SI.TemperatureDifference | TApp_nominal | dat.TCooOut_nominal - dat.TAirInWB_nominal | Design approach temperature (coolant out - air out) |
| Modelica.Units.SI.TemperatureDifference | TRan_nominal | dat.TCooIn_nominal - dat.TCooOut_nominal | Design range temperature (coolant in - coolant out) |
| Advanced | |||
| Modelica.Units.SI.MassFlowRate | m_flow_small (from PartialTwoPortInterface) | 1E-4*abs(m_flow_nominal) | Small mass flow rate for regularization of zero flow |
| Advanced › Diagnostics | |||
| Boolean | show_T (from PartialTwoPortInterface) | false | = true, if actual temperature at port is computed |
| Flow resistance | |||
| Boolean | computeFlowResistance (from TwoPortFlowResistanceParameters) | true | =true, compute flow resistance. Set to false to assume no friction |
| Boolean | from_dp (from TwoPortFlowResistanceParameters) | false | = true, use m_flow = f(dp) else dp = f(m_flow) |
| Real | n (from TwoPortFlowResistanceParameters) | 2 | Flow exponent, n=1 for laminar, n=2 for turbulent |
| Boolean | linearizeFlowResistance (from TwoPortFlowResistanceParameters) | false | = true, use linear relation between m_flow and dp for any flow rate |
| Real | deltaM (from TwoPortFlowResistanceParameters) | 0.1 | Fraction of nominal flow rate where flow transitions to laminar |
| Dynamics › Nominal condition | |||
| Modelica.Units.SI.Time | tau (from TwoPortHeatMassExchanger) | 30 | Time constant at nominal flow (if energyDynamics <> SteadyState) |
| Dynamics › Conservation equations | |||
| Modelica.Fluid.Types.Dynamics | energyDynamics (from TwoPortHeatMassExchanger) | Modelica.Fluid.Types.Dynamics.DynamicFreeInitial | Type of energy balance: dynamic (3 initialization options) or steady state |
| Initialization | |||
| Medium.AbsolutePressure | p_start (from TwoPortHeatMassExchanger) | Medium.p_default | Start value of pressure |
| Medium.Temperature | T_start (from TwoPortHeatMassExchanger) | Medium.T_default | Start value of temperature |
| Medium.MassFraction[Medium.nX] | X_start (from TwoPortHeatMassExchanger) | Medium.X_default | Start 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.Power | PFan_nominal (from CoolingTowerVariableSpeed) | Fan power at full speed | |
| Real | yMin (from CoolingTowerVariableSpeed) | 0.3 | Minimum control signal until fan is switched off (used for smoothing between forced and free convection regime) |
| cha.fan | fanRelPow (from CoolingTowerVariableSpeed) | Fan relative power consumption as a function of control signal, fanRelPow=P(y)/P(y=1) | |
Connectors
| Type | Name | Default | Description |
|---|---|---|---|
| Modelica.Fluid.Interfaces.FluidPort_a | port_a (from PartialTwoPort) | Fluid connector a (positive design flow direction is from port_a to port_b) | |
| Modelica.Fluid.Interfaces.FluidPort_b | port_b (from PartialTwoPort) | Fluid connector b (positive design flow direction is from port_a to port_b) | |
| Modelica.Blocks.Interfaces.RealOutput | TLvg (from CoolingTower) | Leaving water temperature | |
| Modelica.Blocks.Interfaces.RealInput | y (from CoolingTowerVariableSpeed) | Fan control signal | |
| Modelica.Blocks.Interfaces.RealOutput | PFan (from CoolingTowerVariableSpeed) | Electric power consumed by fan | |
| Modelica.Blocks.Interfaces.RealInput | TWetBul | Entering air wet bulb temperature |
Components
| Type | Name | Default | Description |
|---|---|---|---|
| Modelica.Units.SI.MassFlowRate | m_flow (from PartialTwoPortInterface) | port_a.m_flow | Mass flow rate from port_a to port_b (m_flow > 0 is design flow direction) |
| Modelica.Units.SI.PressureDifference | dp (from PartialTwoPortInterface) | port_a.p - port_b.p | Pressure difference between port_a and port_b |
| Medium.ThermodynamicState | sta_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.ThermodynamicState | sta_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.MixingVolume | vol (from TwoPortHeatMassExchanger) | ||
| Buildings.Fluid.FixedResistances.PressureDrop | preDro (from TwoPortHeatMassExchanger) | Flow resistance | |
| Modelica.Units.SI.HeatFlowRate | Q_flow (from CoolingTower) | preHea.Q_flow | Heat input into water circuit |
| Buildings.Fluid.HeatExchangers.CoolingTowers.Correlations.BoundsYorkCalc | bou | Bounds for correlation | |
| Modelica.Units.SI.TemperatureDifference | TRan | T_a - T_b | Range temperature |
| Modelica.Units.SI.TemperatureDifference | TAppAct | Buildings.Utilities.Math.Functions.spliceFunction(pos = TAppCor, neg = TAppFreCon, x = y - yMin + yMin/20, deltax = yMin/20) | Approach temperature difference |
| Modelica.Units.SI.MassFraction | FRWat | m_flow/mWat_flow_nominal | Ratio actual over design water mass flow ratio |
| Modelica.Units.SI.MassFraction | FRAir | y | Ratio actual over design air mass flow ratio |
Contents
| Name | Description |
|---|---|
| Medium package for water |
Revisions
-
April 22, 2026, by Michael Wetter:
Removed parameterfraPFan_nominaland introduced instead the non-dimensional parameterPEle_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 forFRWat0, as this variable can take on values that are bigger than 1.
This is for issue 567. -
January 2, 2015, by Michael Wetter:
ReplacedMedium.temperature()withWater.temperature()in order for the model to work with OpenModelica. Added anassertthat stops the simulation if an incompatible medium is used. -
November 13, 2014, by Michael Wetter:
Added missingeachkeyword forfanRelPowDer. Added regularization in computation ofTAppCor. Removed intermediate states with temperatures. -
May 30, 2014, by Michael Wetter:
Removed undesirable annotationEvaluate=true. -
October 9, 2013, by Michael Wetter:
Simplified the implementation for the situation ifallowReverseFlow=false. Avoided the use of the conditionally enabled variablessta_aandsta_bas 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 forQ_flowandmXi_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 parametermWat_flow_nominalsince it is equal tom_flow_nominal, which is the water flow rate from the chiller condenser loop. -
May 16, 2008, by Michael Wetter:
First implementation.