Buildings.Applications.DataCenters.LiquidCooled.Examples

Collection of models that illustrate model use and test models

Information

This package contains examples for the use of models that can be found in Buildings.Fluid.DataCenters.CDUs.

Extends from Modelica.Icons.ExamplesPackage (Icon for packages containing runnable examples).

Package Content

Name Description
Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSE ChillerWSE Example model of a simple liquid-cooled data center with chiller and water-side economizer
Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSEDynamicPipes ChillerWSEDynamicPipes Example model of a simple liquid cooled data center with chiller and water-side economizer
Buildings.Applications.DataCenters.LiquidCooled.Examples.BaseClasses BaseClasses Package with base classes for Buildings.Applications.DataCenters.LiquidCooled.Examples

Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSE Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSE

Example model of a simple liquid-cooled data center with chiller and water-side economizer

Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSE

Information

Example model of liquid cooled data center that is cooled with an economizer and a chiller.

The figure below shows the schematic diagram.

Schematic diagram of cooling system.

The IT load is cooled by a propylene glycol loop, which exchanges heat through the CDU with a chilled water supply. A PI controller regulates the chilled water flow rate through the control valve in the CDU in order to track the propylene glycol temperature that is sent to the IT rack. The chilled water is cooled by an economizer -- if the temperatures permit -- and if the water temperature after the economizer is higher than a temperature set point, the chiller is enabled. The chiller tracks a leaving water set point temperature. Note that the control is quite simple, and multiple parallel units, as is common in data centers, are simplified here to one component.

The model has a parameter dTOffSet which can be used to shift the design temperatures up or down. This allows one to push the model into temperature regimes that need no chiller. For example, if dTOffSet=0, the chiller never operates, and all cooling is done through the economizer.

For more detailed chilled water plant controls, see, for example,

References

Extends from Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
replaceable package MediumTowBuildings.Media.Antifreeze.P...Medium for tower loop
replaceable package MediumRacBuildings.Media.Antifreeze.P...Medium for rack
PowerPRac1E6Total rack design power [W]
RealfraWSE0.6Fraction of peak load covered by water side economizer
RealfraChi1 - fraWSEFraction of peak load covered by chiller
MassFlowRatemRac_flow_nominalPRac/(TRacRet_nominal - TRac...Rack mass flow rate at design conditions [kg/s]
MassFlowRatemPla_flow_nominalPRac/(TPlaRet_nominal - TPla...Cooling loop water mass flow rate at design conditions [kg/s]
PressureDifferencedpVal_nominal20000Valve design pressure drop [Pa]
PressureDifferencedpHexChi_nominal80000Heat exchanger design pressure drop on chiller side [Pa]
PressureDifferencedPRac_nominal60000Rack design pressure drop [Pa]
OCP_1kW_OAM_PG25datRacdatRac(PIT_nominal=PRac, m_f...Performance data for IT rack
RealCOPc_nominal5Chiller COP
RealepsWSE_nominalQWSE_flow_nominal/(min(mWSEP...Effectiveness of water side economizer
Generic_2MWdatCDUdatCDU(TApp_nominal=TApp_nom...Data record for CDU
GenericdatCooTowdatCooTow(Q_flow_nominal=-PR...Performance data for cooling tower
replaceable model PipeFluid.FixedResistances.Hydra...Pipe model

Connectors

TypeNameDescription
replaceable package MediumTowMedium for tower loop
replaceable package MediumRacMedium for rack
BusweaBusWeather data bus
replaceable model PipePipe model

Modelica definition

model ChillerWSE "Example model of a simple liquid-cooled data center with chiller and water-side economizer" extends Modelica.Icons.Example; package MediumAir = Buildings.Media.Air(T_default=TDryBul_nominal) "Medium for air"; package MediumChi = Buildings.Media.Water "Medium for chilled water loop"; replaceable package MediumTow = Buildings.Media.Antifreeze.PropyleneGlycolWater( property_T=TTowSup_nominal, X_a=Buildings.Media.Antifreeze.Functions.PropyleneGlycolWater.volumeToMassFraction( phi=0.4, T=293.15)) constrainedby Modelica.Media.Interfaces.PartialSimpleMedium(T_default=TTowSup_nominal) "Medium for tower loop"; replaceable package MediumRac = Buildings.Media.Antifreeze.PropyleneGlycolWater( property_T=TRacSup_nominal, X_a=Buildings.Media.Antifreeze.Functions.PropyleneGlycolWater.volumeToMassFraction( phi=0.25, T=293.15)) constrainedby Modelica.Media.Interfaces.PartialSimpleMedium(T_default=TRacSup_nominal) "Medium for rack"; parameter Modelica.Units.SI.Power PRac = 1E6 "Total rack design power"; parameter Real fraWSE = 0.6 "Fraction of peak load covered by water side economizer"; parameter Real fraChi = 1-fraWSE "Fraction of peak load covered by chiller"; constant Modelica.Units.SI.TemperatureDifference dTRac_nominal(max=0) = -5 "Temperature difference rack loop"; constant Modelica.Units.SI.TemperatureDifference dTPla_nominal(max=0) = -5 "Temperature difference cooling plant loop"; constant Modelica.Units.SI.TemperatureDifference dTTow_nominal(max=0) = dTPla_nominal "Temperature difference tower water loop"; constant Modelica.Units.SI.Temperature TRacSup_nominal=273.15 + 45 "Supply coolant temperature to rack at design conditions"; constant Modelica.Units.SI.Temperature TRacRet_nominal=TRacSup_nominal-dTRac_nominal "Return coolant temperature from rack at design conditions"; constant Modelica.Units.SI.TemperatureDifference TApp_nominal = 3 "Approach temperature at heat exchangers"; constant Modelica.Units.SI.Temperature TPlaSup_nominal=TRacSup_nominal - TApp_nominal "Temperature from cooling plant to CDU at design conditions"; constant Modelica.Units.SI.Temperature TPlaRet_nominal=TPlaSup_nominal - dTPla_nominal "Temperature from CDU to cooling plant at design conditions"; constant Modelica.Units.SI.Temperature TTowRet_nominal=TPlaSup_nominal - TApp_nominal "Return temperature from cooling tower"; constant Modelica.Units.SI.Temperature TTowSup_nominal=TTowRet_nominal - dTTow_nominal "Supply temperature to cooling tower"; constant Modelica.Units.SI.Temperature TDryBul_nominal=273.15 + 36 "Design dry bulb temperature if WSE is used exclusively (with fraWSE=0.9999)"; parameter Modelica.Units.SI.MassFlowRate mRac_flow_nominal=PRac/( TRacRet_nominal - TRacSup_nominal)/MediumRac.cp_const "Rack mass flow rate at design conditions"; parameter Modelica.Units.SI.MassFlowRate mPla_flow_nominal=PRac/( TPlaRet_nominal -TPlaSup_nominal) /cpChi_default "Cooling loop water mass flow rate at design conditions"; parameter Modelica.Units.SI.PressureDifference dpVal_nominal( displayUnit="Pa")=20000 "Valve design pressure drop"; parameter Modelica.Units.SI.PressureDifference dpHexChi_nominal=80000 "Heat exchanger design pressure drop on chiller side"; parameter Modelica.Units.SI.PressureDifference dPRac_nominal = 60000 "Rack design pressure drop"; parameter Buildings.Fluid.DataCenters.Racks.Liquid.Data.OCP_1kW_OAM_PG25 datRac(PIT_nominal=PRac, m_flow_nominal=mRac_flow_nominal) "Performance data for IT rack"; parameter Real COPc_nominal=5 "Chiller COP"; parameter Real epsWSE_nominal(min=0.5, max=0.95) = QWSE_flow_nominal / (min(mWSEPla_flow_nominal*cpChi_default, mWSETow_flow_nominal*cpTow_default)*(TPlaRet_nominal-TTowRet_nominal)) "Effectiveness of water side economizer"; final parameter Modelica.Units.SI.HeatFlowRate QCon_flow_nominal = (1-fraWSE) * PRac * (1/COPc_nominal+1) "Design heat flow rate of condenser"; final parameter Modelica.Units.SI.HeatFlowRate QWSE_flow_nominal = fraWSE*PRac "Design heat flow rate of economizer"; final parameter Modelica.Units.SI.MassFlowRate mEva_flow_nominal(min=0)=mPla_flow_nominal "Nominal mass flow rate at condenser water, sized to circulate all water through it to meet set point when trim chiller is needed"; final parameter Modelica.Units.SI.MassFlowRate mCon_flow_nominal(min=0)=-QCon_flow_nominal/dTTow_nominal/cpTow_default "Nominal mass flow rate at condenser water"; final parameter Modelica.Units.SI.MassFlowRate mWSETow_flow_nominal(min=0)=-QWSE_flow_nominal/dTTow_nominal/cpTow_default "Nominal mass flow rate at WSE on tower side"; final parameter Modelica.Units.SI.MassFlowRate mWSEPla_flow_nominal(min=0)=-QWSE_flow_nominal/dTPla_nominal/cpChi_default "Nominal mass flow rate at WSE on chilled water side"; parameter Fluid.DataCenters.CDUs.LiquidToLiquid.Data.Generic_2MW datCDU( TApp_nominal=TApp_nominal, TRacOut_nominal=TRacSup_nominal, medPla=Buildings.Fluid.DataCenters.CDUs.Types.Media.Water, phiGlyPla=0, medRac=Buildings.Fluid.DataCenters.CDUs.Types.Media.PropyleneGlycol, phiGlyRac=0.25, Q_flow_nominal=-PRac, mPla_flow_nominal=mPla_flow_nominal, mRac_flow_nominal=mRac_flow_nominal, dpHexPla_nominal=dpHexChi_nominal, dpPumpExt_nominal=datRac.dp_nominal + valRac.dp_nominal + pipRacIn.dp_nominal + pipRacOut.dp_nominal) "Data record for CDU"; parameter Fluid.HeatExchangers.CoolingTowers.Data.DryCooler.Generic datCooTow( Q_flow_nominal=-PRac, TCooIn_nominal=TTowSup_nominal, TCooOut_nominal=TTowRet_nominal, dp_nominal=80000, ratCooAir_nominal=cpAir_default/cpTow_default, TAirIn_nominal=TDryBul_nominal) "Performance data for cooling tower"; Controls.OBC.CDL.Reals.Sources.Constant uti(k=0.6) "Utilization of hardware"; Buildings.Fluid.DataCenters.Racks.Liquid.ColdPlateR_P rac( redeclare package Medium = MediumRac, allowFlowReversal=false, dat=datRac, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial) "Rack with cold plate heat exchangers, modeled for simplicity as one large rack"; Buildings.Fluid.Sources.Boundary_pT bou( redeclare package Medium = MediumChi, p(displayUnit="Pa") = 300000, nPorts=1) "Pressure boundary condition"; Buildings.Fluid.Sensors.TemperatureTwoPort senTCDU_a( redeclare package Medium = MediumChi, allowFlowReversal=false, m_flow_nominal=mPla_flow_nominal, tau=0) "Chilled water supply temperature"; Buildings.Fluid.DataCenters.CDUs.LiquidToLiquid.CDU_epsNTU cdu( redeclare package MediumPla = MediumChi, redeclare package MediumRac = MediumRac, show_T=true, final dat=datCDU, allowFlowReversalPla=false, allowFlowReversalRac=false, yPum_start=1) "CDU, modeled for simplicity as one large CDU"; Fluid.Sensors.TemperatureTwoPort senTCDU_b( redeclare package Medium = MediumChi, allowFlowReversal=false, m_flow_nominal=mPla_flow_nominal, tau=0) "Outlet temperature"; Fluid.Sensors.TemperatureTwoPort senTRac_a( redeclare package Medium = MediumRac, allowFlowReversal=false, m_flow_nominal=mRac_flow_nominal, tau=0) "Rack inlet temperature"; Fluid.Sensors.TemperatureTwoPort senTRac_b( redeclare package Medium = MediumRac, allowFlowReversal=false, m_flow_nominal=mRac_flow_nominal, tau=0) "Rack outlet temperature"; Controls.OBC.CDL.Reals.Sources.Constant dpSet(k=datCDU.dpPumpExt_nominal) "Set point for head"; Controls.OBC.CDL.Reals.Sources.Constant TSetRacIn(y(final unit="K", displayUnit="degC"), k( final unit="K", displayUnit="degC") = TRacSup_nominal) "Set point for rack inlet temperature"; Fluid.HeatExchangers.ConstantEffectiveness wse( redeclare package Medium1 = MediumTow, redeclare package Medium2 = MediumChi, m1_flow_nominal=mWSETow_flow_nominal, m2_flow_nominal=mWSEPla_flow_nominal, show_T=true, eps=epsWSE_nominal, dp2_nominal=dpHexChi_nominal, dp1_nominal=dpHexChi_nominal) "Water side economizer (Heat exchanger)"; Fluid.Chillers.Carnot_TEva chi( redeclare package Medium1 = MediumTow, redeclare package Medium2 = MediumChi, m1_flow_nominal=mCon_flow_nominal, m2_flow_nominal=mEva_flow_nominal, show_T=true, QEva_flow_nominal=-(1-fraWSE)*PRac, dTEva_nominal=TPlaSup_nominal -TPlaRet_nominal, dTCon_nominal=-dTTow_nominal, dp2_nominal=dpHexChi_nominal, dp1_nominal=dpHexChi_nominal, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial) "Chiller"; Fluid.HeatExchangers.CoolingTowers.DryCooler cooTow( redeclare package Medium = MediumTow, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, dat=datCooTow) "Cooling tower"; BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= ModelicaServices.ExternalReferences.loadResource("modelica://Buildings/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos"), computeWetBulbTemperature=false) "Weather data reader"; BoundaryConditions.WeatherData.Bus weaBus "Weather data bus"; Buildings.Fluid.Movers.Preconfigured.SpeedControlled_y pumEva( redeclare package Medium = MediumChi, addPowerToMedium=false, m_flow_nominal=mEva_flow_nominal, dp_nominal=dpHexChi_nominal) "Pump chiller evaporator"; Buildings.Fluid.Movers.Preconfigured.SpeedControlled_y pumWSEChi( redeclare package Medium = MediumChi, addPowerToMedium=false, m_flow_nominal=mWSEPla_flow_nominal, dp_nominal=dpHexChi_nominal) "Pump for water-side economizer"; Buildings.Fluid.Movers.Preconfigured.SpeedControlled_y pumTow( redeclare package Medium = MediumTow, allowFlowReversal=false, addPowerToMedium=false, riseTime=5, m_flow_nominal=mWSETow_flow_nominal, dp_nominal=dpHexChi_nominal + pipTowIn.dp_nominal + pipTowOut.dp_nominal) "Pump for tower loop"; Fluid.Sensors.TemperatureTwoPort senTWSE_b2( redeclare package Medium = MediumChi, m_flow_nominal=mWSEPla_flow_nominal, tau=0) "Chilled water outlet temperature of water side economizer"; Fluid.Movers.Preconfigured.SpeedControlled_y pumCon( redeclare package Medium = MediumTow, addPowerToMedium=false, m_flow_nominal=mCon_flow_nominal, dp_nominal=dpHexChi_nominal) "Pump for chiller condenser"; Fluid.Sensors.TemperatureTwoPort senTTow_b( redeclare package Medium = MediumTow, allowFlowReversal=false, m_flow_nominal=mWSETow_flow_nominal, tau=0) "Outlet water temperature of tower"; Fluid.FixedResistances.Junction jun1( redeclare package Medium = MediumTow, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, m_flow_nominal=mWSETow_flow_nominal*{1,1,1}, dp_nominal={0,0,0}); Fluid.FixedResistances.Junction jun2(redeclare package Medium = MediumChi, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, m_flow_nominal=mPla_flow_nominal*{1,1,fraWSE}, dp_nominal={0,0,0}); Fluid.FixedResistances.Junction jun3(redeclare package Medium = MediumChi, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, m_flow_nominal=mPla_flow_nominal*{1,1,fraWSE}, dp_nominal={0,0,0}); Fluid.Sensors.TemperatureTwoPort senTEvaIn( redeclare package Medium = MediumChi, allowFlowReversal=false, m_flow_nominal=mPla_flow_nominal, tau=0) "Chiller inlet temperature to evaporator"; Fluid.FixedResistances.Junction jun4(redeclare package Medium = MediumChi, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, m_flow_nominal=mPla_flow_nominal*{1,1,fraChi}, dp_nominal={0,0,0}); Fluid.FixedResistances.Junction jun5(redeclare package Medium = MediumChi, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, m_flow_nominal=mPla_flow_nominal*{1,1,fraChi}, dp_nominal={0,0,0}); Fluid.Sensors.TemperatureTwoPort senTEvaOut( redeclare package Medium = MediumChi, m_flow_nominal=mEva_flow_nominal, tau=0) "Chilled water outlet temperature of chiller"; Fluid.Sensors.TemperatureTwoPort senTChi_b1( redeclare package Medium = MediumTow, m_flow_nominal=mCon_flow_nominal, tau=0) "Cooling tower water outlet temperature of chiller"; Fluid.Sensors.TemperatureTwoPort senTWSE_b1( redeclare package Medium = MediumTow, m_flow_nominal=mWSETow_flow_nominal, tau=0) "Cooling tower water outlet temperature of water side economizer"; Buildings.Fluid.Movers.Preconfigured.SpeedControlled_y pumWSECW( redeclare package Medium = MediumTow, addPowerToMedium=false, m_flow_nominal=mWSETow_flow_nominal, dp_nominal=dpHexChi_nominal) "Pump for water side economizer on cooling tower side"; Fluid.Movers.Preconfigured.FlowControlled_dp pumCDU( redeclare package Medium = MediumChi, allowFlowReversal=false, addPowerToMedium=false, use_riseTime=false, m_flow_nominal=mPla_flow_nominal, dp_nominal=dpHexChi_nominal + datCDU.dpValve_nominal + pipCDUIn.dp_nominal + pipCDUOut.dp_nominal) "Pump chilled water circuit"; Fluid.FixedResistances.Junction jun6( redeclare package Medium = MediumTow, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, m_flow_nominal=mWSETow_flow_nominal*{1,1,1}, dp_nominal={0,0,0}); Fluid.FixedResistances.Junction jun7( redeclare package Medium = MediumTow, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, m_flow_nominal=mWSETow_flow_nominal*{1,1,1}, dp_nominal={0,0,0}); Fluid.FixedResistances.Junction jun8( redeclare package Medium = MediumTow, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, m_flow_nominal=mWSETow_flow_nominal*{1,1,1}, dp_nominal={0,0,0}); Controls.OBC.CDL.Reals.PID conTow( k=1, yMax=1, yMin=0.1, u_s(final unit="K", displayUnit="degC"), u_m(final unit="K", displayUnit="degC"), controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.PI, Ti=120, r=1, xi_start=1, reverseActing=false) "Controller for tower fan and pump"; Controls.OBC.CDL.Reals.Sources.Constant TSetEva(y(final unit="K", displayUnit ="degC"), k( final unit="K", displayUnit="degC") =TPlaSup_nominal) "Set point temperature for evaporator outlet temperature"; Controls.OBC.CDL.Reals.Sources.Constant pSetChiWatPum( y(final unit="Pa"), k(final unit="Pa") = pumCDU.dp_nominal) "Pressure setpoint for chilled water pump"; Controls.OBC.CDL.Reals.Hysteresis hysChi( uLow=0, uHigh=1, u(final unit="K")) "Hysteresis for chiller staging"; Controls.OBC.CDL.Conversions.BooleanToReal yPumChi(y(final unit="1"), realTrue(final unit="1")) "Control signal for chiller circulation pumps"; Fluid.Sources.Boundary_pT bou1( redeclare package Medium = MediumTow, p(displayUnit="Pa") = 300000, nPorts=1) "Pressure boundary condition"; Controls.OBC.CDL.Reals.AddParameter TOffSet( p=-1, y(final unit="K", displayUnit="degC")) "Offset for set point"; Modelica.Blocks.Sources.RealExpression PFan(y(final unit="W") = cooTow.PFan) "Power consumption of tower fans"; Modelica.Blocks.Sources.RealExpression PPum(y(final unit="W") = cdu.P + pumWSEChi.P + pumWSECW.P + pumEva.P + pumCon.P + pumTow.P) "Power consumption of pumps"; Modelica.Blocks.Sources.RealExpression PChi(y(final unit="W") = chi.P) "Power consumption of chiller"; Modelica.Blocks.Sources.RealExpression PIT(y(final unit="W") = rac.P) "Power consumption of IT"; BaseClasses.ElectricalEnergyMeter EFan "Energy meter"; BaseClasses.ElectricalEnergyMeter EPum "Energy meter"; BaseClasses.ElectricalEnergyMeter EChi "Energy meter"; BaseClasses.ElectricalEnergyMeter EPIT(y_start=1E-10) "Energy meter"; Modelica.Blocks.Math.MultiSum EFac(nu=4) "Electricity for facility"; Modelica.Blocks.Math.Division PUE "Power use effectiveness (not taking into account electrical losses)"; Fluid.Sensors.TemperatureTwoPort senTWSEMix( redeclare package Medium = MediumTow, allowFlowReversal=false, m_flow_nominal=mWSETow_flow_nominal, tau=0) "Water temperature cooling tower loop after WSE"; Fluid.Actuators.Valves.TwoWayLinear valByp( redeclare package Medium = MediumTow, m_flow_nominal=mCon_flow_nominal, final dpValve_nominal=dpVal_nominal, strokeTime=30) "Valve for condenser loop bypass"; Fluid.Actuators.Valves.TwoWayLinear valThr( redeclare package Medium = MediumTow, m_flow_nominal=mCon_flow_nominal, final dpValve_nominal=dpVal_nominal, strokeTime=30, y_start=0) "Valve for condenser loop from cooling tower"; Fluid.FixedResistances.Junction jun9( redeclare package Medium = MediumTow, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, m_flow_nominal=mCon_flow_nominal*{1,1,1}, dp_nominal={0,0,0}) "Junction at condenser loop"; Fluid.FixedResistances.Junction jun10( redeclare package Medium = MediumTow, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, m_flow_nominal=mCon_flow_nominal*{1,1,1}, dp_nominal={0,0,0}) "Junction at condenser loop["; Buildings.Fluid.Sensors.TemperatureTwoPort senTChi_a1( redeclare package Medium = MediumTow, m_flow_nominal=mCon_flow_nominal, tau=0) "Cooling tower water inlet temperature of chiller"; Controls.OBC.CDL.Reals.PIDWithReset conPIDCon( Ti=60, r=1, reverseActing=false, u_s( final unit="K", displayUnit="degC"), u_m( final unit="K", displayUnit="degC")) "Controller for minimum chiller lift"; Controls.OBC.CDL.Reals.AddParameter TLifMin(p( unit="K", displayUnit="K") = 10, u(final unit="K", displayUnit="degC"), y(final unit="K", displayUnit="degC")) "Minimum lift of chiller"; Controls.OBC.CDL.Reals.MultiplyByParameter invValSig(k=-1) "Invert valve signal"; Controls.OBC.CDL.Reals.AddParameter invValSig2(p=1) "Invert valve control signal"; Fluid.Sensors.TemperatureTwoPort senTTow_a( redeclare package Medium = MediumTow, allowFlowReversal=false, m_flow_nominal=mWSETow_flow_nominal, tau=0) "Inlet water temperature of tower"; Controls.OBC.CDL.Reals.AddParameter TOffSetWSE(p=-1) "Offset for set point for WSE control"; Fluid.Sensors.MassFlowRate senMasFloByEco(redeclare package Medium = MediumChi) "Mass flow rate sensor in economizer bypass"; Controls.OBC.CDL.Reals.PID conEcoPla( k=1, yMin=0.1, u_s(final unit="kg/s"), u_m(final unit="kg/s"), controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.PI, Ti=60, r=mWSEPla_flow_nominal, xi_start=1, reverseActing=false) "Controller for economizer pump on facility level"; Controls.OBC.CDL.Reals.Sources.Constant zer( k = 0) "Zero as a set point"; Fluid.Sensors.MassFlowRate senMasFlo3(redeclare package Medium = MediumTow) "Mass flow rate sensor"; Controls.OBC.CDL.Reals.Limiter yPumTow(uMax=1, uMin=0.1) "Pump control signal"; Controls.OBC.CDL.Reals.Sources.Constant zer1(k=0) "Zero as a set point"; Controls.OBC.CDL.Reals.PID conEcoTow( k=1, yMin=0.1, u_s(final unit="kg/s"), u_m(final unit="kg/s"), controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.PI, Ti=60, r=mWSETow_flow_nominal, xi_start=1, reverseActing=false) "Controller for economizer pump on tower loop"; Controls.OBC.CDL.Reals.Sources.Constant TSetTowRet(y(final unit="K", displayUnit="degC"), k( final unit="K", displayUnit="degC") = TTowRet_nominal) "Set point temperature for tower return temperature"; Controls.OBC.CDL.Reals.PID conPumTow( k=1, yMax=2, yMin=0, u_s(final unit="K", displayUnit="degC"), u_m(final unit="K", displayUnit="degC"), controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.PI, Ti=120, r=1, xi_start=1, reverseActing=false) "Controller for tower pump"; Controls.OBC.CDL.Reals.Subtract errTFre( u1(final unit="K", displayUnit="degC"), u2(final unit="K", displayUnit="degC")) "Temperature error after free cooling"; protected final parameter MediumAir.ThermodynamicState staAir_default=MediumAir.setState_pTX( T=MediumAir.T_default, p=MediumAir.p_default, X=MediumAir.X_default[1:MediumAir.nXi]) "Default state for air"; final parameter MediumTow.ThermodynamicState staTow_default=MediumTow.setState_pTX( T=MediumTow.T_default, p=MediumTow.p_default, X=MediumTow.X_default[1:MediumTow.nXi]) "Default state for tower loop fluid"; final parameter MediumChi.ThermodynamicState staChi_default=MediumChi.setState_pTX( T=MediumChi.T_default, p=MediumChi.p_default, X=MediumChi.X_default[1:MediumChi.nXi]) "Default state for chiller loop fluid"; public Controls.OBC.CDL.Reals.Limiter yFanTow(uMax=1, uMin=0.1) "Tower fan control signal based on economizer leaving temperature"; Controls.OBC.CDL.Reals.Max yTowFan "Fan control signal"; Fluid.Actuators.Valves.TwoWayLinear valRac( redeclare package Medium = MediumRac, m_flow_nominal=mRac_flow_nominal, final dpValve_nominal=dpVal_nominal, strokeTime=30, y_start=0) "Valve for rack flow control"; Controls.OBC.CDL.Reals.Sources.Constant TSetRacOut(y(final unit="K", displayUnit="degC"), k( final unit="K", displayUnit="degC") = TRacRet_nominal) "Set point for rack outlet temperature"; Controls.OBC.CDL.Reals.PID conVal( Ti=60, yMin=0.05, u_s(final unit="K", displayUnit="degC"), u_m(final unit="K", displayUnit="degC"), final controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.PI, final reverseActing=false) "Controller for valve"; Modelica.Blocks.Math.Gain PITIn( k(final unit="W", min=0) = datRac.PIT_nominal, u(final unit="1"), y(final unit="W")) "Power consumption by the IT equipment"; replaceable model Pipe = Fluid.FixedResistances.HydraulicDiameter constrainedby Fluid.FixedResistances.HydraulicDiameter ( show_T=true, v_nominal=5, roughness=0.015E-3, length=20, fac=2) "Pipe model"; Pipe pipTowIn( redeclare package Medium = MediumTow, m_flow_nominal=mWSETow_flow_nominal) "Pipe at tower inlet"; Pipe pipTowOut( redeclare package Medium = MediumTow, m_flow_nominal=mWSETow_flow_nominal) "Pipe at tower outlet"; Pipe pipCDUIn( redeclare package Medium = MediumChi, allowFlowReversal=false, m_flow_nominal=mPla_flow_nominal) "Pipe at CDU inlet"; Pipe pipCDUOut( redeclare package Medium = MediumChi, allowFlowReversal=false, m_flow_nominal=mPla_flow_nominal) "Pipe at CDU outlet"; Pipe pipRacIn( redeclare package Medium = MediumRac, allowFlowReversal=false, m_flow_nominal=mRac_flow_nominal) "Pipe at rack inlet"; Pipe pipRacOut( redeclare package Medium = MediumRac, allowFlowReversal=false, m_flow_nominal=mRac_flow_nominal) "Pipe at rack outlet"; protected parameter Modelica.Units.SI.SpecificHeatCapacity cpAir_default= MediumAir.specificHeatCapacityCp(staAir_default) "Specific heat capacity of air at nominal condition"; parameter Modelica.Units.SI.SpecificHeatCapacity cpTow_default= MediumTow.specificHeatCapacityCp(staTow_default) "Specific heat capacity of tower loop fluid at nominal condition"; parameter Modelica.Units.SI.SpecificHeatCapacity cpChi_default= MediumChi.specificHeatCapacityCp(staChi_default) "Specific heat capacity of chiller loop fluid at nominal condition"; equation connect(senTCDU_a.port_b, cdu.port_aPla); connect(cdu.port_bPla, senTCDU_b.port_a); connect(rac.port_b, senTRac_b.port_a); connect(pumCDU.port_b, jun3.port_1); connect(jun2.port_2, senTEvaIn.port_a); connect(senTEvaIn.port_b, jun4.port_1); connect(jun4.port_2, jun5.port_1); connect(jun4.port_3,pumEva. port_a); connect(pumEva.port_b, chi.port_a2); connect(chi.port_b2,senTEvaOut. port_a); connect(senTEvaOut.port_b, jun5.port_3); connect(jun3.port_3, pumWSEChi.port_a); connect(pumWSEChi.port_b, wse.port_a2); connect(wse.port_b2, senTWSE_b2.port_a); connect(senTWSE_b2.port_b, jun2.port_3); connect(wse.port_b1, senTWSE_b1.port_a); connect(wse.port_a1, pumWSECW.port_b); connect(chi.port_b1, senTChi_b1.port_a); connect(jun1.port_3, pumWSECW.port_a); connect(jun8.port_1, jun7.port_2); connect(cooTow.port_b, senTTow_b.port_a); connect(weaBus, weaDat.weaBus); connect(pSetChiWatPum.y, pumCDU.dp_in); connect(hysChi.y,yPumChi. u); connect(TOffSet.u, TSetEva.y); connect(PFan.y, EFan.u); connect(PPum.y, EPum.u); connect(PChi.y, EChi.u); connect(PIT.y, EPIT.u); connect(EChi.y, EFac.u[1]); connect(EPum.y, EFac.u[2]); connect(EFan.y, EFac.u[3]); connect(EFac.y, PUE.u1); connect(EPIT.y, PUE.u2); connect(EPIT.y, EFac.u[4]); connect(jun7.port_1,senTWSEMix. port_b); connect(senTWSEMix.port_a, jun6.port_2); connect(jun7.port_3, valThr.port_a); connect(jun8.port_3, jun10.port_1); connect(jun10.port_3, valByp.port_a); connect(valThr.port_b, jun9.port_1); connect(jun9.port_2, pumCon.port_a); connect(valByp.port_b, jun9.port_3); connect(chi.port_a1, senTChi_a1.port_b); connect(senTChi_a1.port_a, pumCon.port_b); connect(senTChi_a1.T, conPIDCon.u_m); connect(senTEvaIn.T, TLifMin.u); connect(hysChi.y, conPIDCon.trigger); connect(TLifMin.y, conPIDCon.u_s); connect(conPIDCon.y, valThr.y); connect(invValSig2.u, invValSig.y); connect(invValSig2.y, valByp.y); connect(invValSig.u, conPIDCon.y); connect(pumEva.y, yPumChi.y); connect(pumCon.y, yPumChi.y); connect(cooTow.port_a, senTTow_a.port_b); connect(cooTow.TDryBul, weaBus.TDryBul); connect(jun3.port_2, senMasFloByEco.port_a); connect(senMasFloByEco.port_b, jun2.port_1); connect(senMasFloByEco.m_flow, conEcoPla.u_m); connect(zer.y, conEcoPla.u_s); connect(conEcoPla.y, pumWSEChi.y); connect(yPumTow.y, pumTow.y); connect(jun6.port_1, senMasFlo3.port_b); connect(senMasFlo3.port_a, jun1.port_2); connect(zer1.y, conEcoTow.u_s); connect(conEcoTow.y, pumWSECW.y); connect(conEcoTow.u_m, senMasFlo3.m_flow); connect(jun8.port_2, pumTow.port_a); connect(jun6.port_3, senTWSE_b1.port_b); connect(jun10.port_2, senTChi_b1.port_b); connect(TOffSetWSE.y, conTow.u_s); connect(conTow.u_m, senTTow_b.T); connect(TSetTowRet.y, TOffSetWSE.u); connect(conPumTow.u_s, TOffSet.y); connect(conPumTow.u_m, senTEvaIn.T); connect(conPumTow.y, yPumTow.u); connect(dpSet.y, cdu.dpSet); connect(TSetRacIn.y, cdu.TSet); connect(senTEvaIn.T, errTFre.u1); connect(errTFre.u2, TOffSet.y); connect(errTFre.y, hysChi.u); connect(TSetEva.y, chi.TSet); connect(conTow.y, yTowFan.u1); connect(yTowFan.y, cooTow.y); connect(errTFre.y, yFanTow.u); connect(conTow.y, yTowFan.u2); connect(rac.port_a, valRac.port_b); connect(valRac.port_a, senTRac_a.port_b); connect(TSetRacOut.y, conVal.u_s); connect(conVal.y, valRac.y); connect(senTRac_b.T, conVal.u_m); connect(uti.y, PITIn.u); connect(PITIn.y, rac.P); connect(pumCDU.port_a, bou.ports[1]); connect(jun1.port_1, bou1.ports[1]); connect(senTTow_a.port_a, pipTowIn.port_b); connect(pipTowIn.port_a, pumTow.port_b); connect(senTTow_b.port_b, pipTowOut.port_a); connect(pipTowOut.port_b, jun1.port_1); connect(senTCDU_a.port_a, pipCDUIn.port_b); connect(pipCDUIn.port_a, jun5.port_2); connect(senTCDU_b.port_b, pipCDUOut.port_a); connect(pipCDUOut.port_b, pumCDU.port_a); connect(cdu.port_bRac, pipRacIn.port_a); connect(pipRacIn.port_b, senTRac_a.port_a); connect(senTRac_b.port_b, pipRacOut.port_a); connect(pipRacOut.port_b, cdu.port_aRac); end ChillerWSE;

Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSEDynamicPipes Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSEDynamicPipes

Example model of a simple liquid cooled data center with chiller and water-side economizer

Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSEDynamicPipes

Information

This model is identical to Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSE except that the supply and return pipes in each of the three fluid loops are modeled using a pipe model that has transport delay. Moreover, the IT power consumed is here modelled using a time table that alternates the load every 2 minutes between 50% and 70% of the design thermal power.

Extends from ChillerWSE (Example model of a simple liquid-cooled data center with chiller and water-side economizer).

Parameters

TypeNameDefaultDescription
replaceable package MediumTowBuildings.Media.Antifreeze.P...Medium for tower loop
replaceable package MediumRacBuildings.Media.Antifreeze.P...Medium for rack
PowerPRac1E6Total rack design power [W]
RealfraWSE0.6Fraction of peak load covered by water side economizer
RealfraChi1 - fraWSEFraction of peak load covered by chiller
MassFlowRatemRac_flow_nominalPRac/(TRacRet_nominal - TRac...Rack mass flow rate at design conditions [kg/s]
MassFlowRatemPla_flow_nominalPRac/(TPlaRet_nominal - TPla...Cooling loop water mass flow rate at design conditions [kg/s]
PressureDifferencedpVal_nominal20000Valve design pressure drop [Pa]
PressureDifferencedpHexChi_nominal80000Heat exchanger design pressure drop on chiller side [Pa]
PressureDifferencedPRac_nominal60000Rack design pressure drop [Pa]
OCP_1kW_OAM_PG25datRac Performance data for IT rack
RealCOPc_nominal5Chiller COP
RealepsWSE_nominalQWSE_flow_nominal/(min(mWSEP...Effectiveness of water side economizer
GenericdatCooTow Performance data for cooling tower
replaceable model PipeHydraulicDiameterPipe model

Connectors

TypeNameDescription
BusweaBusWeather data bus
replaceable model PipePipe model

Modelica definition

model ChillerWSEDynamicPipes "Example model of a simple liquid cooled data center with chiller and water-side economizer" extends ChillerWSE( break uti, redeclare model Pipe = MyPlugFlowPipe, datCDU(strokeTime=5), cdu( kVal=1, TiVal=30, kPum=0.5, TiPum=30)); Controls.OBC.CDL.Reals.Sources.TimeTable utiLiq( table=[ 0, 0.5; 120,0.5; 120,0.7; 240,0.7], extrapolation=Buildings.Controls.OBC.CDL.Types.Extrapolation.Periodic) "Utilization of liquid-cooled hardware"; model MyPlugFlowPipe extends Buildings.Fluid.FixedResistances.PlugFlowPipe( show_T=true, have_pipCap=true, v_nominal=5, dIns=0.01, kIns=0.04, cPip=500, rhoPip=800); // Introduce dp_nominal as this is used in the base class to size the pumps, // but the model Buildings.Fluid.FixedResistances.PlugFlowPipe // has no such top-level parameter final parameter Modelica.Units.SI.PressureDifference dp_nominal = res.dp_nominal "Design pressure drop"; final parameter Modelica.Units.SI.MassFlowRate m_flow_turbulent = res.m_flow_turbulent "Mass flow rate where transition to turbulent flow occurs"; final parameter Real deltaM = res.deltaM "Normmalized mass flow rate where transition to turbulent flow occurs"; final parameter Real k = res.k "Flow coefficient, k=m_flow/dp^(1/n)"; final parameter Modelica.Units.SI.PressureDifference dpStraightPipe_nominal = res.dpStraightPipe_nominal "Pressure loss of a round cross section pipe at m_flow_nominal"; end MyPlugFlowPipe; equation connect(utiLiq.y[1], PITIn.u); end ChillerWSEDynamicPipes;

Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSE.Pipe Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSE.Pipe

Pipe model

Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSE.Pipe

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
Lengthdhsqrt(4*m_flow_nominal/rho_de...Hydraulic diameter (assuming a round cross section area) [m]
Lengthlength Length of the pipe [m]
RealReC4000Reynolds number where transition to turbulence starts
Lengthroughness2.5e-5Absolute roughness of pipe, with a default for a smooth steel pipe (dummy if use_roughness = false) [m]
Realfac2Factor to take into account resistance of bends etc., fac=dp_nominal/dpStraightPipe_nominal
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
Velocityv_nominalif rho_default < 500 then 1....Velocity at m_flow_nominal (used to compute default value for hydraulic diameter dh) [m/s]
Assumptions
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal
Advanced
Booleanfrom_dpfalse= true, use m_flow = f(dp) else dp = f(m_flow)
Realn2Flow exponent, n=1 for laminar, n=2 for turbulent
Booleanlinearizedfalse= true, use linear relation between m_flow and dp for any flow rate
BooleandisableComputeFlowResistancefalse=false to disable computation of flow resistance
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed

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)

Modelica definition

replaceable model Pipe = Fluid.FixedResistances.HydraulicDiameter constrainedby Fluid.FixedResistances.HydraulicDiameter ( show_T=true, v_nominal=5, roughness=0.015E-3, length=20, fac=2) "Pipe model";

Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSEDynamicPipes.MyPlugFlowPipe Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSEDynamicPipes.MyPlugFlowPipe


Buildings.Applications.DataCenters.LiquidCooled.Examples.ChillerWSEDynamicPipes.MyPlugFlowPipe

Information

Extends from Buildings.Fluid.FixedResistances.PlugFlowPipe (Pipe model using spatialDistribution for temperature delay).

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
RealReC4000Reynolds number where transition to turbulence starts
Realfac1Factor to take into account flow resistance of bends etc., fac=dp_nominal/dpStraightPipe_nominal
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
Velocityv_nominal5Velocity at m_flow_nominal (used to compute default value for hydraulic diameter dh) [m/s]
Material
Lengthdhsqrt(4*m_flow_nominal/rho_de...Hydraulic diameter (assuming a round cross section area) [m]
Heightroughness2.5e-5Average height of surface asperities (default: smooth steel pipe) [m]
Lengthlength Pipe length [m]
SpecificHeatCapacitycPip500Specific heat of pipe wall material. 2300 for PE, 500 for steel [J/(kg.K)]
DensityrhoPip800Density of pipe wall material. 930 for PE, 8000 for steel [kg/m3]
Lengththickness0.0035Pipe wall thickness [m]
Thermal resistance
LengthdIns0.01Thickness of pipe insulation, used to compute R [m]
ThermalConductivitykIns0.04Heat conductivity of pipe insulation, used to compute R [W/(m.K)]
RealR1/(kIns*2*Modelica.Constants...Thermal resistance per unit length from fluid to boundary temperature [(m.K)/W]
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]
Booleanfrom_dpfalse= true, use m_flow = f(dp) else dp = f(m_flow)
Realn2Flow exponent, n=1 for laminar, n=2 for turbulent
Booleanhave_pipCaptrue= true, a mixing volume is added that corresponds to the heat capacity of the pipe wall
Booleanhave_symmetrytrue= false, the mixing volume is only on port_b, which improve performances, but reduces dynamic accuracy.
Booleanlinearizedfalse= true, use linear relation between m_flow and dp for any flow rate
BooleandisableComputeFlowResistancefalse=false to disable computation of flow resistance
Diagnostics
Booleanshow_Ttrue= true, if actual temperature at port is computed
Initialization
TemperatureT_start_inMedium.T_defaultInitialization temperature at pipe inlet [K]
TemperatureT_start_outT_start_inInitialization temperature at pipe outlet [K]
BooleaninitDelayfalseInitialize delay for a constant mass flow rate if true, otherwise start from 0
MassFlowRatem_flow_start0Initial value of mass flow rate through pipe [kg/s]

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)
HeatPort_aheatPortHeat transfer to or from surroundings (positive if pipe is colder than surrounding)

Modelica definition

model MyPlugFlowPipe extends Buildings.Fluid.FixedResistances.PlugFlowPipe( show_T=true, have_pipCap=true, v_nominal=5, dIns=0.01, kIns=0.04, cPip=500, rhoPip=800); // Introduce dp_nominal as this is used in the base class to size the pumps, // but the model Buildings.Fluid.FixedResistances.PlugFlowPipe // has no such top-level parameter final parameter Modelica.Units.SI.PressureDifference dp_nominal = res.dp_nominal "Design pressure drop"; final parameter Modelica.Units.SI.MassFlowRate m_flow_turbulent = res.m_flow_turbulent "Mass flow rate where transition to turbulent flow occurs"; final parameter Real deltaM = res.deltaM "Normmalized mass flow rate where transition to turbulent flow occurs"; final parameter Real k = res.k "Flow coefficient, k=m_flow/dp^(1/n)"; final parameter Modelica.Units.SI.PressureDifference dpStraightPipe_nominal = res.dpStraightPipe_nominal "Pressure loss of a round cross section pipe at m_flow_nominal"; end MyPlugFlowPipe;