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 |
CoolingTower
|
Base class for cooling towers |
CoolingTowerVariableSpeed
|
Base class for cooling towers with variable speed fan |
DryCooler
|
Model for thermal performance of dry cooling tower |
DryCoolerUA
|
Block that computes UA, effectiveness, and heat transfer of a dry cooler |
Merkel
|
Model for thermal performance of Merkel cooling tower |
Characteristics
|
Functions for fan characteristics |
Functions
|
|
Base class for cooling towers
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
| Type | Name | Default | Description |
| replaceable package Medium | PartialMedium | Medium in the component |
| Nominal condition |
| MassFlowRate | m_flow_nominal | | Nominal mass flow rate [kg/s] |
| PressureDifference | dp_nominal | | Pressure difference [Pa] |
| Assumptions |
| Boolean | allowFlowReversal | true | = false to simplify equations, assuming, but not enforcing, no flow reversal |
| Advanced |
| MassFlowRate | m_flow_small | 1E-4*abs(m_flow_nominal) | Small mass flow rate for regularization of zero flow [kg/s] |
| Diagnostics |
| Boolean | show_T | false | = true, if actual temperature at port is computed |
| Flow resistance |
| Boolean | from_dp | false | = true, use m_flow = f(dp) else dp = f(m_flow) |
| Boolean | linearizeFlowResistance | false | = true, use linear relation between m_flow and dp for any flow rate |
| Real | deltaM | 0.1 | Fraction of nominal flow rate where flow transitions to laminar |
| Dynamics |
| Nominal condition |
| Time | tau | 30 | Time constant at nominal flow (if energyDynamics <> SteadyState) [s] |
| Conservation equations |
| Dynamics | energyDynamics | Modelica.Fluid.Types.Dynamic... | Type of energy balance: dynamic (3 initialization options) or steady state |
| Initialization |
| AbsolutePressure | p_start | Medium.p_default | Start value of pressure [Pa] |
| Temperature | T_start | Medium.T_default | Start value of temperature [K] |
| MassFraction | X_start[Medium.nX] | Medium.X_default | Start value of mass fractions m_i/m [kg/kg] |
| ExtraProperty | C_start[Medium.nC] | fill(0, Medium.nC) | Start value of trace substances |
Connectors
| Type | Name | Description |
| FluidPort_a | port_a | Fluid connector a (positive design flow direction is from port_a to port_b) |
| FluidPort_b | port_b | Fluid connector b (positive design flow direction is from port_a to port_b) |
| output RealOutput | TLvg | Leaving water temperature [K] |
Modelica definition
Base class for cooling towers with variable speed fan
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
| Type | Name | Default | Description |
| replaceable package Medium | PartialMedium | Medium in the component |
| Nominal condition |
| MassFlowRate | m_flow_nominal | | Nominal mass flow rate [kg/s] |
| PressureDifference | dp_nominal | | Pressure difference [Pa] |
| Fan |
| Power | PFan_nominal | | Fan power at full speed [W] |
| Real | yMin | 0.3 | Minimum control signal until fan is switched off (used for smoothing
between forced and free convection regime) [1] |
| fan | fanRelPow | fanRelPow(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 |
| Boolean | allowFlowReversal | true | = false to simplify equations, assuming, but not enforcing, no flow reversal |
| Advanced |
| MassFlowRate | m_flow_small | 1E-4*abs(m_flow_nominal) | Small mass flow rate for regularization of zero flow [kg/s] |
| Diagnostics |
| Boolean | show_T | false | = true, if actual temperature at port is computed |
| Flow resistance |
| Boolean | from_dp | false | = true, use m_flow = f(dp) else dp = f(m_flow) |
| Boolean | linearizeFlowResistance | false | = true, use linear relation between m_flow and dp for any flow rate |
| Real | deltaM | 0.1 | Fraction of nominal flow rate where flow transitions to laminar |
| Dynamics |
| Nominal condition |
| Time | tau | 30 | Time constant at nominal flow (if energyDynamics <> SteadyState) [s] |
| Conservation equations |
| Dynamics | energyDynamics | Modelica.Fluid.Types.Dynamic... | Type of energy balance: dynamic (3 initialization options) or steady state |
| Initialization |
| AbsolutePressure | p_start | Medium.p_default | Start value of pressure [Pa] |
| Temperature | T_start | Medium.T_default | Start value of temperature [K] |
| MassFraction | X_start[Medium.nX] | Medium.X_default | Start value of mass fractions m_i/m [kg/kg] |
| ExtraProperty | C_start[Medium.nC] | fill(0, Medium.nC) | Start value of trace substances |
Connectors
| Type | Name | Description |
| FluidPort_a | port_a | Fluid connector a (positive design flow direction is from port_a to port_b) |
| FluidPort_b | port_b | Fluid connector b (positive design flow direction is from port_a to port_b) |
| output RealOutput | TLvg | Leaving water temperature [K] |
| input RealInput | y | Fan control signal [1] |
| output RealOutput | PFan | Electric power consumed by fan [W] |
Modelica definition
model CoolingTowerVariableSpeed
extends Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.CoolingTower;
import cha =
Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.Characteristics;
parameter Modelica.Units.SI.Power PFan_nominal
;
parameter Real yMin(min=0.01, max=1,
final unit="1") = 0.3
;
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})
;
Modelica.Blocks.Interfaces.RealInput y(unit="1") ;
Modelica.Blocks.Interfaces.RealOutput PFan(
final quantity="Power",
final unit="W")
;
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))
;
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))
;
initial equation
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;
Model for thermal performance of dry cooling tower
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 Q̇.
For the full documentation, see
Buildings.Fluid.HeatExchangers.CoolingTowers.DryCooler.
Extends from Modelica.Blocks.Icons.Block (Basic graphical layout of input/output block).
Parameters
| Type | Name | Default | Description |
| replaceable package Medium | Modelica.Media.Interfaces.Pa... | Medium in the component |
| Generic | dat | | Performance data record |
| Nominal condition |
| MassFlowRate | m_flow_nominal | | Nominal mass flow rate of water [kg/s] |
| Fan |
| Real | yMin | | Minimum control signal until fan is switched off (used for smoothing
between forced and free convection regime) [1] |
Connectors
| Type | Name | Description |
| replaceable package Medium | Medium in the component |
| input RealInput | y | Fan control signal [1] |
| input RealInput | m_flow | Cooling fluid mass flow rate [kg/s] |
| input RealInput | TCooIn | Inlet water temperature [K] |
| input RealInput | TDryBul | Entering air dry bulb temperature [K] |
| output RealOutput | Q_flow | Heat removed from water |
Modelica definition
block DryCooler
extends Modelica.Blocks.Icons.Block;
replaceable package Medium =
Modelica.Media.Interfaces.PartialMedium ;
parameter Buildings.Fluid.HeatExchangers.CoolingTowers.Data.DryCooler.Generic
dat ;
parameter Modelica.Units.SI.MassFlowRate m_flow_nominal
;
final parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=
m_flow_nominal/dat.ratCooAir_nominal ;
parameter Real yMin(min=0.01, max=1,
final unit="1")
;
final parameter Modelica.Units.SI.ThermalConductance UA_nominal = UA.UA_nominal
;
final parameter Real eps_nominal = UA.eps_nominal ;
final parameter Real NTU_nominal(min = 0) = UA.NTU_nominal ;
Modelica.Blocks.Interfaces.RealInput y(unit="1") ;
Modelica.Blocks.Interfaces.RealInput m_flow(
final unit="kg/s")
;
Modelica.Blocks.Interfaces.RealInput TCooIn(
final min=0,
final unit="K",
displayUnit="degC")
;
Modelica.Blocks.Interfaces.RealInput TDryBul(
final min=0,
final unit="K",
displayUnit="degC") ;
Modelica.Blocks.Interfaces.RealOutput Q_flow ;
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)
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter mAirFlo(
final k=mAir_flow_nominal)
;
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)
;
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;
Block that computes UA, effectiveness, and heat transfer of a dry cooler
Information
Block that computes the overall thermal conductance UA,
the heat exchanger effectiveness ε,
and the heat flow rate Q̇
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
-
The heat exchanger flow configuration is treated as cross-flow with both streams unmixed.
-
The specific heat capacity of air is evaluated at nominal conditions.
-
The specific heat capacity of the cooling fluid is evaluated at the
inlet temperature.
References
For further documentation, see
Buildings.Fluid.HeatExchangers.CoolingTowers.DryCooler.
Extends from Modelica.Blocks.Icons.Block (Basic graphical layout of input/output block).
Parameters
| Type | Name | Default | Description |
| replaceable package Medium | Modelica.Media.Interfaces.Pa... | Medium in the component |
| Generic | dat | | Performance data record |
| Nominal condition |
| MassFlowRate | m_flow_nominal | | Nominal mass flow rate of water [kg/s] |
| Fan |
| Real | yMin | | Minimum control signal until fan is switched off (used for smoothing
between forced and free convection regime) [1] |
Connectors
| Type | Name | Description |
| replaceable package Medium | Medium in the component |
| input RealInput | y | Fan control signal [1] |
| input RealInput | mAir_flow | Air mass flow rate [kg/s] |
| input RealInput | mCoo_flow | Cooling fluid mass flow rate [kg/s] |
| input RealInput | TCooIn | Inlet water temperature [K] |
| input RealInput | TAirIn | Entering air dry bulb temperature [K] |
| input RealInput | hACoo | Convective heat transfer coefficient times area on the coolant side [W/K] |
| input RealInput | hAAir | Convective heat transfer coefficient times area on the air side [W/K] |
| output RealOutput | Q_flow | Heat removed from water |
Modelica definition
block DryCoolerUA
extends Modelica.Blocks.Icons.Block;
replaceable package Medium =
Modelica.Media.Interfaces.PartialMedium
;
parameter Buildings.Fluid.HeatExchangers.CoolingTowers.Data.DryCooler.Generic
dat
;
parameter Modelica.Units.SI.MassFlowRate m_flow_nominal
;
final parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=
m_flow_nominal/dat.ratCooAir_nominal
;
parameter Real yMin(min=0.01, max=1,
final unit="1")
;
final parameter Modelica.Units.SI.ThermalConductance UA_nominal=
NTU_nominal*CMin_flow_nominal
;
final parameter Real eps_nominal=
dat.Q_flow_nominal/((dat.TAirIn_nominal - dat.TCooIn_nominal)*CMin_flow_nominal)
;
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))
;
final parameter Real Z_nominal(
min=0,
max=1) = CMin_flow_nominal/CMax_flow_nominal
;
final parameter Modelica.Units.SI.Temperature TAirOut_nominal=
dat.TAirIn_nominal -
abs(dat.Q_flow_nominal)/CAir_flow_nominal
;
Modelica.Blocks.Interfaces.RealInput y(unit="1")
;
Modelica.Blocks.Interfaces.RealInput mAir_flow(
final unit="kg/s")
;
Modelica.Blocks.Interfaces.RealInput mCoo_flow(
final unit="kg/s")
;
Modelica.Blocks.Interfaces.RealInput TCooIn(
final min=0,
final unit="K",
displayUnit="degC")
;
Modelica.Blocks.Interfaces.RealInput TAirIn(
final min=0,
final unit="K",
displayUnit="degC") ;
Modelica.Blocks.Interfaces.RealInput hACoo(
final unit="W/K")
;
Modelica.Blocks.Interfaces.RealInput hAAir(
final unit="W/K")
;
Real eps(min=0, max=1, unit="1") ;
Modelica.Units.SI.SpecificHeatCapacity cpCoo
;
Modelica.Units.SI.ThermalConductance CAir_flow
;
Modelica.Units.SI.ThermalConductance CCoo_flow
;
Modelica.Units.SI.ThermalConductance CMin_flow(min=0)
;
Modelica.Units.SI.HeatFlowRate QMax_flow
;
Modelica.Units.SI.ThermalConductance UA ;
Modelica.Blocks.Interfaces.RealOutput Q_flow
;
protected
final package Air =
Buildings.Media.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])
;
final parameter Medium.ThermodynamicState staCoo_default=
Medium.setState_pTX(
T=dat.TCooIn_nominal,
p=Medium.p_default,
X=Medium.X_default[1:Medium.nXi])
;
parameter Real delta=1E-3 ;
parameter Modelica.Units.SI.SpecificHeatCapacity cpAir_nominal=
Air.specificHeatCapacityCp(staAir_default)
;
parameter Modelica.Units.SI.SpecificHeatCapacity cpCoo_nominal=
Medium.specificHeatCapacityCp(staCoo_default)
;
parameter Modelica.Units.SI.ThermalConductance CAir_flow_nominal=
mAir_flow_nominal*cpAir_nominal
;
parameter Modelica.Units.SI.ThermalConductance CCoo_flow_nominal=
m_flow_nominal*cpCoo_nominal
;
parameter Modelica.Units.SI.ThermalConductance CMin_flow_nominal=
min(CAir_flow_nominal, CCoo_flow_nominal)
;
parameter Modelica.Units.SI.ThermalConductance CMax_flow_nominal=
max(CAir_flow_nominal, CCoo_flow_nominal)
;
Real corUAFreCon ;
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
cpCoo =
Medium.specificHeatCapacityCp(
Medium.setState_pTX(
p=Medium.p_default,
T=TCooIn,
X=Medium.X_default));
corUAFreCon =
Buildings.Utilities.Math.Functions.spliceFunction(
pos=1,
neg=dat.fraFreCon,
x=y - yMin + yMin/20,
deltax=yMin/20);
UA =corUAFreCon/(1/hACoo + 1/hAAir);
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);
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 =CMin_flow*(TCooIn - TAirIn);
Q_flow = -eps*QMax_flow;
end DryCoolerUA;
Model for thermal performance of Merkel cooling tower
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
| Type | Name | Default | Description |
| replaceable package Medium | Modelica.Media.Interfaces.Pa... | Medium in the component |
| Generic | dat | | Performance data |
| Fan |
| Real | yMin | | Minimum control signal until fan is switched off (used for smoothing
between forced and free convection regime) [1] |
Connectors
| Type | Name | Description |
| replaceable package Medium | Medium in the component |
| input RealInput | y | Fan control signal [1] |
| input RealInput | m_flow | Water mass flow rate [kg/s] |
| input RealInput | TCooIn | Inlet water temperature [K] |
| input RealInput | TWetBul | Entering air wet bulb temperature [K] |
| output RealOutput | Q_flow | Heat removed from water |
Modelica definition
block Merkel
extends Modelica.Blocks.Icons.Block;
replaceable package Medium =
Modelica.Media.Interfaces.PartialMedium ;
parameter Data.Merkel.Generic dat ;
final parameter Modelica.Units.SI.MassFlowRate mCoo_flow_nominal =
abs(dat.Q_flow_nominal / cpCoo_nominal / (dat.TCooOut_nominal - dat.TCooIn_nominal))
;
final parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=
mCoo_flow_nominal/dat.ratCooAir_nominal ;
parameter Real yMin(min=0.01, max=1,
final unit="1")
;
final parameter Modelica.Units.SI.ThermalConductance UA_nominal=NTU_nominal*
CMin_flow_nominal * Buildings.Utilities.Psychrometrics.Constants.cpAir/cpEqu_nominal
;
final parameter Real eps_nominal=
dat.Q_flow_nominal/((dat.TAirInWB_nominal - dat.TCooIn_nominal) * CMin_flow_nominal)
;
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))
;
Modelica.Blocks.Interfaces.RealInput y(unit="1") ;
Modelica.Blocks.Interfaces.RealInput m_flow(
final unit="kg/s")
;
Modelica.Blocks.Interfaces.RealInput TCooIn(
final min=0,
final unit="K",
displayUnit="degC")
;
Modelica.Blocks.Interfaces.RealInput TWetBul(
final min=0,
final unit="K",
displayUnit="degC") ;
Modelica.Units.SI.Temperature TAirOut(displayUnit="degC")
;
Modelica.Units.SI.MassFlowRate mAir_flow ;
Modelica.Units.SI.MassFraction FRWat
;
Modelica.Units.SI.MassFraction FRAir
;
Real eps(min=0, max=1, unit="1") ;
Modelica.Units.SI.SpecificHeatCapacity cpWat ;
Modelica.Units.SI.ThermalConductance CAir_flow
;
Modelica.Units.SI.ThermalConductance CCoo_flow
;
Modelica.Units.SI.ThermalConductance CMin_flow(min=0)
;
Modelica.Units.SI.HeatFlowRate QMax_flow ;
Modelica.Units.SI.ThermalConductance UAe(min=0)
;
Modelica.Units.SI.ThermalConductance UA ;
Modelica.Blocks.Interfaces.RealOutput Q_flow ;
protected
final package Air =
Buildings.Media.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]) ;
final parameter Medium.ThermodynamicState
staCoo_default=
Medium.setState_pTX(
T=dat.TCooIn_nominal,
p=Medium.p_default,
X=Medium.X_default[1:Medium.nXi]) ;
parameter Real delta=1E-3 ;
parameter Modelica.Units.SI.SpecificHeatCapacity cpEqu_nominal=
Buildings.Fluid.HeatExchangers.CoolingTowers.BaseClasses.Functions.equivalentHeatCapacity(
TIn=dat.TAirInWB_nominal,
TOut=TAirOutWB_nominal)
;
parameter Modelica.Units.SI.SpecificHeatCapacity cpAir_nominal=
Air.specificHeatCapacityCp(staAir_default)
;
parameter Modelica.Units.SI.SpecificHeatCapacity cpCoo_nominal=
Medium.specificHeatCapacityCp(staCoo_default)
;
parameter Modelica.Units.SI.ThermalConductance CAir_flow_nominal=
mAir_flow_nominal*cpEqu_nominal ;
parameter Modelica.Units.SI.ThermalConductance CCoo_flow_nominal=
mCoo_flow_nominal*cpCoo_nominal ;
parameter Modelica.Units.SI.ThermalConductance CMin_flow_nominal=
min(
CAir_flow_nominal, CCoo_flow_nominal)
;
parameter Modelica.Units.SI.ThermalConductance CMax_flow_nominal=
max(
CAir_flow_nominal, CCoo_flow_nominal)
;
parameter Real Z_nominal(
min=0,
max=1) = CMin_flow_nominal/CMax_flow_nominal
;
parameter Modelica.Units.SI.Temperature TAirOutWB_nominal(fixed=false)
;
Real UA_FAir ;
Real UA_FWat ;
Real UA_DifWB
;
Real corFac_FAir ;
Real corFac_FWat ;
Modelica.Units.SI.SpecificHeatCapacity cpEqu
;
initial equation
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
cpWat =
Medium.specificHeatCapacityCp(
Medium.setState_pTX(
p=Medium.p_default,
T=TCooIn,
X=Medium.X_default));
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_FAir =
Buildings.Fluid.Utilities.extendedPolynomial(
x=FRAir,
c=dat.UACor.cAirFra,
xMin=dat.UACor.FRAirMin,
xMax=dat.UACor.FRAirMax)
;
UA_FWat =
Buildings.Fluid.Utilities.extendedPolynomial(
x=FRWat,
c=dat.UACor.cWatFra,
xMin=dat.UACor.FRWatMin,
xMax=dat.UACor.FRWatMax)
;
UA_DifWB =
Buildings.Fluid.Utilities.extendedPolynomial(
x=dat.TAirInWB_nominal - TWetBul,
c=dat.UACor.cDifWB,
xMin=dat.UACor.TDiffWBMin,
xMax=dat.UACor.TDiffWBMax)
;
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;
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);
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 =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;