Buildings.Applications.DataCenters.ChillerCooled.Examples.BaseClasses
Base classes for examples
Information
This package contains base models for the examples in Buildings.Applications.DataCenters.ChillerCooled.Examples.
Extends from Modelica.Icons.BasesPackage (Icon for packages containing base classes).
Package Content
| Name | Description | 
|---|---|
|  PartialDataCenter | Partial model that impliments cooling system for data centers | 
|  PostProcess | Post-processing | 
 Buildings.Applications.DataCenters.ChillerCooled.Examples.BaseClasses.PartialDataCenter
Buildings.Applications.DataCenters.ChillerCooled.Examples.BaseClasses.PartialDataCenter
Partial model that impliments cooling system for data centers
 
Information
This is a partial model that describes the chilled water cooling system in a data center. The sizing data are collected from the reference.
Reference
- Taylor, S. T. (2014). How to design & control waterside economizers. ASHRAE Journal, 56(6), 30-36.
Parameters
| Type | Name | Default | Description | 
|---|---|---|---|
| replaceable package MediumA | Buildings.Media.Air | Medium model | |
| replaceable package MediumW | Buildings.Media.Water | Medium model | |
| Integer | numChi | 2 | Number of chillers | 
| MassFlowRate | m1_flow_chi_nominal | 34.7 | Nominal mass flow rate at condenser water in the chillers [kg/s] | 
| MassFlowRate | m2_flow_chi_nominal | 18.3 | Nominal mass flow rate at evaporator water in the chillers [kg/s] | 
| PressureDifference | dp1_chi_nominal | 46.2*1000 | Nominal pressure [Pa] | 
| PressureDifference | dp2_chi_nominal | 44.8*1000 | Nominal pressure [Pa] | 
| Power | QEva_nominal | m2_flow_chi_nominal*4200*(6.... | Nominal cooling capaciaty(Negative means cooling) [W] | 
| MassFlowRate | m1_flow_wse_nominal | 34.7 | Nominal mass flow rate at condenser water in the chillers [kg/s] | 
| MassFlowRate | m2_flow_wse_nominal | 35.3 | Nominal mass flow rate at condenser water in the chillers [kg/s] | 
| PressureDifference | dp1_wse_nominal | 33.1*1000 | Nominal pressure [Pa] | 
| PressureDifference | dp2_wse_nominal | 34.5*1000 | Nominal pressure [Pa] | 
| Generic | perPumCW[numChi] | perPumCW(each pressure=Build... | Performance data for condenser water pumps | 
| Time | tWai | 1200 | Waiting time [s] | 
| ThermalConductance | UA_nominal | numChi*QEva_nominal/Building... | Thermal conductance at nominal flow for sensible heat, used to compute time constant [W/K] | 
| MassFlowRate | mAir_flow_nominal | 161.35 | Nominal air mass flowrate [kg/s] | 
| Real | yValMinAHU | 0.1 | Minimum valve openning position [1] | 
| Temperature | TCHWSet | 273.15 + 8 | Chilled water temperature setpoint [K] | 
| Temperature | TSupAirSet | TCHWSet + 10 | Supply air temperature setpoint [K] | 
| Temperature | TRetAirSet | 273.15 + 25 | Supply air temperature setpoint [K] | 
| Pressure | dpSetPoi | 80000 | Differential pressure setpoint [Pa] | 
| PartialChillerWSE | chiWSE | chiWSE(redeclare replaceable... | Chillers and waterside economizer | 
Connectors
| Type | Name | Description | 
|---|---|---|
| replaceable package MediumA | Medium model | |
| replaceable package MediumW | Medium model | |
| Bus | weaBus | Weather data bus | 
Modelica definition
partial model PartialDataCenter
  "Partial model that impliments cooling system for data centers"
  replaceable package MediumA = Buildings.Media.Air "Medium model";
  replaceable package MediumW = Buildings.Media.Water "Medium model";
  // Chiller parameters
  parameter Integer numChi=2 "Number of chillers";
  parameter Modelica.Units.SI.MassFlowRate m1_flow_chi_nominal=34.7
    "Nominal mass flow rate at condenser water in the chillers";
  parameter Modelica.Units.SI.MassFlowRate m2_flow_chi_nominal=18.3
    "Nominal mass flow rate at evaporator water in the chillers";
  parameter Modelica.Units.SI.PressureDifference dp1_chi_nominal=46.2*1000
    "Nominal pressure";
  parameter Modelica.Units.SI.PressureDifference dp2_chi_nominal=44.8*1000
    "Nominal pressure";
  parameter Modelica.Units.SI.Power QEva_nominal=m2_flow_chi_nominal*4200*(6.67
       - 18.56) "Nominal cooling capaciaty(Negative means cooling)";
 // WSE parameters
  parameter Modelica.Units.SI.MassFlowRate m1_flow_wse_nominal=34.7
    "Nominal mass flow rate at condenser water in the chillers";
  parameter Modelica.Units.SI.MassFlowRate m2_flow_wse_nominal=35.3
    "Nominal mass flow rate at condenser water in the chillers";
  parameter Modelica.Units.SI.PressureDifference dp1_wse_nominal=33.1*1000
    "Nominal pressure";
  parameter Modelica.Units.SI.PressureDifference dp2_wse_nominal=34.5*1000
    "Nominal pressure";
  parameter Buildings.Fluid.Movers.Data.Generic[numChi] perPumCW(
    each pressure=
          Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParameters(
          V_flow=m1_flow_chi_nominal/1000*{0.2,0.6,1.0,1.2},
          dp=(dp1_chi_nominal+60000+6000)*{1.2,1.1,1.0,0.6}))
    "Performance data for condenser water pumps";
  parameter Modelica.Units.SI.Time tWai=1200 "Waiting time";
  // AHU
  parameter Modelica.Units.SI.ThermalConductance UA_nominal=numChi*QEva_nominal
      /Buildings.Fluid.HeatExchangers.BaseClasses.lmtd(
      6.67,
      11.56,
      12,
      25)
    "Thermal conductance at nominal flow for sensible heat, used to compute time constant";
  parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=161.35
    "Nominal air mass flowrate";
  parameter Real yValMinAHU(min=0,max=1,unit="1")=0.1
    "Minimum valve openning position";
  // Set point
  parameter Modelica.Units.SI.Temperature TCHWSet=273.15 + 8
    "Chilled water temperature setpoint";
  parameter Modelica.Units.SI.Temperature TSupAirSet=TCHWSet + 10
    "Supply air temperature setpoint";
  parameter Modelica.Units.SI.Temperature TRetAirSet=273.15 + 25
    "Supply air temperature setpoint";
  parameter Modelica.Units.SI.Pressure dpSetPoi=80000
    "Differential pressure setpoint";
  replaceable Buildings.Applications.DataCenters.ChillerCooled.Equipment.BaseClasses.PartialChillerWSE
    chiWSE(
    redeclare replaceable package Medium1 = MediumW,
    redeclare replaceable package Medium2 = MediumW,
    numChi=numChi,
    m1_flow_chi_nominal=m1_flow_chi_nominal,
    m2_flow_chi_nominal=m2_flow_chi_nominal,
    m1_flow_wse_nominal=m1_flow_wse_nominal,
    m2_flow_wse_nominal=m2_flow_wse_nominal,
    dp1_chi_nominal=dp1_chi_nominal,
    dp1_wse_nominal=dp1_wse_nominal,
    dp2_chi_nominal=dp2_chi_nominal,
    dp2_wse_nominal=dp2_wse_nominal,
    redeclare each Buildings.Fluid.Chillers.Data.ElectricEIR.ElectricEIRChiller_York_YT_1055kW_5_96COP_Vanes
      perChi,
    use_strokeTime=false,
    energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
    use_controller=false) "Chillers and waterside economizer";
  Buildings.Fluid.Sources.Boundary_pT expVesCW(
    redeclare replaceable package Medium = MediumW,
    nPorts=1)
    "Expansion tank";
  Buildings.Fluid.HeatExchangers.CoolingTowers.YorkCalc cooTow[numChi](
    redeclare each replaceable package Medium = MediumW,
    each TAirInWB_nominal(displayUnit="degC") = 283.15,
    each TApp_nominal=6,
    each energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyStateInitial,
    each dp_nominal=30000,
    each m_flow_nominal=0.785*m1_flow_chi_nominal,
    each PFan_nominal=18000)
    "Cooling tower";
  Buildings.Fluid.Sensors.TemperatureTwoPort TCHWSup(
    redeclare replaceable package Medium = MediumW,
    m_flow_nominal=numChi*m2_flow_chi_nominal)
    "Chilled water supply temperature";
  Buildings.BoundaryConditions.WeatherData.ReaderTMY3  weaData(filNam=
    Modelica.Utilities.Files.loadResource("modelica://Buildings/Resources/weatherdata/USA_CA_San.Francisco.Intl.AP.724940_TMY3.mos"));
  Buildings.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus";
  Buildings.Fluid.Sensors.TemperatureTwoPort TCWSup(
    redeclare replaceable package Medium = MediumW,
    m_flow_nominal=numChi*m1_flow_chi_nominal)
    "Condenser water supply temperature";
  Buildings.Fluid.Sensors.TemperatureTwoPort TCWRet(
    redeclare replaceable package Medium = MediumW,
    m_flow_nominal=numChi*m1_flow_chi_nominal)
    "Condenser water return temperature";
  Buildings.Fluid.Movers.FlowControlled_m_flow pumCW[numChi](
    redeclare each replaceable package Medium = MediumW,
    each m_flow_nominal=m1_flow_chi_nominal,
    each addPowerToMedium=false,
    per=perPumCW,
    each energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
    each use_riseTime=false) "Condenser water pump";
  Buildings.Applications.DataCenters.ChillerCooled.Equipment.CoolingCoilHumidifyingHeating
                                                                                           ahu(
    redeclare replaceable package Medium1 = MediumW,
    redeclare replaceable package Medium2 = MediumA,
    m1_flow_nominal=numChi*m2_flow_chi_nominal,
    m2_flow_nominal=mAir_flow_nominal,
    dpValve_nominal=6000,
    dp2_nominal=600,
    mWatMax_flow=0.01,
    UA_nominal=UA_nominal,
    addPowerToMedium=false,
    perFan(
      pressure(dp=800*{1.2,1.12,1},
         V_flow=mAir_flow_nominal/1.29*{0,0.5,1}),
         motorCooledByFluid=false),
    yValSwi=yValMinAHU + 0.1,
    yValDeaBan=0.05,
    QHeaMax_flow=30000,
    energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
    dp1_nominal=30000)
    "Air handling unit";
  Buildings.Fluid.Sensors.TemperatureTwoPort TCHWRet(
    redeclare replaceable package Medium = MediumW,
    m_flow_nominal=numChi*m2_flow_chi_nominal)
    "Chilled water return temperature";
  Buildings.Fluid.Sources.Boundary_pT expVesChi(
    redeclare replaceable package Medium = MediumW,
    nPorts=1)
    "Expansion tank";
  Buildings.Fluid.Sensors.RelativePressure senRelPre(
    redeclare replaceable package Medium =MediumW)
    "Differential pressure";
  Buildings.Fluid.Sensors.TemperatureTwoPort TAirSup(
    redeclare replaceable package Medium = MediumA,
    m_flow_nominal=mAir_flow_nominal)
    "Supply air temperature";
  Buildings.Examples.ChillerPlant.BaseClasses.SimplifiedRoom roo(
    redeclare replaceable package Medium = MediumA,
    rooLen=50,
    rooWid=30,
    rooHei=3,
    m_flow_nominal=mAir_flow_nominal,
    QRoo_flow=500000,
    nPorts=2)
    "Room model";
  Buildings.Fluid.Actuators.Valves.TwoWayLinear val[numChi](
    redeclare each package Medium = MediumW,
    each m_flow_nominal=m1_flow_chi_nominal,
    each dpValve_nominal=6000,
    each use_strokeTime=false)
    "Shutoff valves";
  Modelica.Blocks.Sources.Constant TCHWSupSet(k=TCHWSet)
    "Chilled water supply temperature setpoint";
  Buildings.Applications.DataCenters.ChillerCooled.Controls.ChillerStage chiStaCon(
    QEva_nominal=QEva_nominal, tWai=0,
    criPoiTem=TCHWSet + 1.5)
    "Chiller staging control";
  Modelica.Blocks.Math.RealToBoolean chiOn[numChi]
    "Real value to boolean value";
  Modelica.Blocks.Math.IntegerToBoolean intToBoo(
    threshold=Integer(Buildings.Applications.DataCenters.Types.CoolingModes.FullMechanical))
    "Inverse on/off signal for the WSE";
  Modelica.Blocks.Logical.Not wseOn
    "True: WSE is on; False: WSE is off ";
  Buildings.Applications.DataCenters.ChillerCooled.Controls.ConstantSpeedPumpStage
                                                                                   CWPumCon(
    tWai=0)
    "Condenser water pump controller";
  Modelica.Blocks.Sources.IntegerExpression chiNumOn(
    y=integer(sum(chiStaCon.y)))
    "The number of running chillers";
  Modelica.Blocks.Math.Gain gai[numChi](
    each k=m1_flow_chi_nominal) "Gain effect";
  Buildings.Applications.DataCenters.ChillerCooled.Controls.CoolingTowerSpeed cooTowSpeCon(
    yMin=0,
    Ti=60,
    k=0.1)
    "Cooling tower speed control";
  Modelica.Blocks.Sources.RealExpression TCWSupSet(
    y=min(29.44 + 273.15, max(273.15 + 15.56, cooTow[1].TAir + 3)))
    "Condenser water supply temperature setpoint";
  Modelica.Blocks.Sources.Constant TAirSupSet(k=TSupAirSet)
    "Supply air temperature setpoint";
  Buildings.Applications.BaseClasses.Controls.VariableSpeedPumpStage varSpeCon(
    tWai=tWai,
    m_flow_nominal=m2_flow_chi_nominal,
    deaBanSpe=0.45)
    "Speed controller";
  Modelica.Blocks.Sources.RealExpression mPum_flow(
    y=chiWSE.port_b2.m_flow)
    "Mass flowrate of variable speed pumps";
  Buildings.Controls.Continuous.LimPID pumSpe(
    Ti=40,
    yMin=0.2,
    k=0.1)
    "Pump speed controller";
  Modelica.Blocks.Sources.Constant dpSetSca(k=1)
    "Scaled differential pressure setpoint";
  Modelica.Blocks.Math.Product pumSpeSig[numChi]
    "Pump speed signal";
  Buildings.Controls.Continuous.LimPID ahuValSig(
        Ti=40,
    reverseActing=false,
    yMin=yValMinAHU,
    k=0.01)          "Valve position signal for the AHU";
  Modelica.Blocks.Math.Product cooTowSpe[numChi]
    "Cooling tower speed";
  Buildings.Controls.Continuous.LimPID ahuFanSpeCon(
        k=0.1,
    reverseActing=false,
    yMin=0.2,
    Ti=240)   "Fan speed controller ";
  Modelica.Blocks.Sources.Constant TAirRetSet(k=TRetAirSet)
    "Return air temperature setpoint";
  Utilities.Psychrometrics.X_pTphi XAirSupSet(use_p_in=false)
    "Mass fraction setpoint of supply air ";
  Modelica.Blocks.Sources.Constant phiAirRetSet(k=0.5)
    "Return air relative humidity setpoint";
  Modelica.Blocks.Math.Gain gai1(k=1/dpSetPoi) "Gain effect";
  Buildings.Controls.OBC.CDL.Reals.Switch swi[numChi]
    "Switch to assign pump signal if plant is on";
  Buildings.Controls.OBC.CDL.Logical.Or plaOn "Output true if plant is on";
  Buildings.Controls.OBC.CDL.Reals.Sources.Constant zer[numChi](each final 
            k=0) "Outputs zero";
  Modelica.Blocks.MathBoolean.Or chiOnSta(nu=numChi)
    "Output true if at least one chiller is on";
equation 
  connect(chiWSE.port_b2, TCHWSup.port_a);
  connect(chiWSE.port_b1, TCWRet.port_a);
  for i in 1:numChi loop
    connect(TCWSup.port_a, cooTow[i].port_b);
    connect(pumCW[i].port_a, TCWSup.port_b);
    connect(TCWRet.port_b, val[i].port_a);
  connect(weaBus.TWetBul, cooTow[i].TAir);
  end for;
  connect(senRelPre.port_b, ahu.port_b1);
  connect(cooTow.port_a, val.port_b);
  connect(TCWRet.port_b, expVesCW.ports[1]);
  connect(ahu.port_b1, expVesChi.ports[1]);
  connect(chiWSE.port_b2, TCHWSup.port_a);
  connect(chiWSE.port_b1, TCWRet.port_a);
   for i in 1:numChi loop
    connect(TCWSup.port_a, cooTow[i].port_b);
    connect(pumCW[i].port_b, chiWSE.port_a1);
    connect(chiOn[i].y, chiWSE.on[i]);
   connect(cooTowSpeCon.y, cooTowSpe[i].u1);
   end for;
  connect(chiStaCon.y, chiOn.u);
  connect(intToBoo.y, wseOn.u);
  connect(wseOn.y, chiWSE.on[numChi + 1]);
  connect(CWPumCon.y, gai.u);
  connect(TCWSupSet.y, cooTowSpeCon.TCWSupSet);
  connect(TCHWSupSet.y, cooTowSpeCon.TCHWSupSet);
  connect(TCWSup.T, cooTowSpeCon.TCWSup);
  connect(TCHWSup.T, cooTowSpeCon.TCHWSup);
  connect(chiWSE.TSet, TCHWSupSet.y);
  connect(mPum_flow.y, varSpeCon.masFloPum);
  connect(senRelPre.port_a, ahu.port_a1);
  connect(pumSpe.y, varSpeCon.speSig);
  connect(dpSetSca.y, pumSpe.u_s);
  connect(pumSpe.y, pumSpeSig[1].u2);
  connect(pumSpe.y, pumSpeSig[2].u2);
  connect(varSpeCon.y, pumSpeSig.u1);
  connect(TAirSupSet.y, ahuValSig.u_s);
  connect(TAirSup.port_a, ahu.port_b2);
  connect(TAirSup.T, ahuValSig.u_m);
  connect(ahuValSig.y, ahu.uVal);
  connect(TAirSupSet.y, ahu.TSet);
  connect(CWPumCon.y, val.y);
  connect(CWPumCon.y, cooTowSpe.u2);
  connect(cooTowSpe.y, cooTow.y);
  connect(TCHWRet.port_a, ahu.port_b1);
  connect(chiNumOn.y, CWPumCon.numOnChi);
  connect(ahu.port_a2, roo.airPorts[1]);
  connect(roo.airPorts[2], TAirSup.port_b);
  connect(roo.TRooAir, ahuFanSpeCon.u_m);
  connect(TAirRetSet.y, ahuFanSpeCon.u_s);
  connect(phiAirRetSet.y, XAirSupSet.phi);
  connect(XAirSupSet.X[1], ahu.XSet_w);
  connect(TAirRetSet.y, XAirSupSet.T);
  connect(ahuFanSpeCon.y, ahu.uFan);
  connect(gai1.y, pumSpe.u_m);
  connect(gai1.u, senRelPre.p_rel);
  connect(weaData.weaBus, weaBus);
  connect(chiOnSta.u, chiOn.y);
  connect(chiOnSta.y, plaOn.u1);
  connect(wseOn.y, plaOn.u2);
  connect(zer.y, swi.u3);
  for i in 1:numChi loop
    connect(plaOn.y, swi[i].u2);
  end for;
  connect(swi.y, pumCW.m_flow_in);
  connect(gai.y, swi.u1);
  connect(plaOn.y, varSpeCon.on);
  connect(plaOn.y, CWPumCon.on);
end PartialDataCenter;
Buildings.Applications.DataCenters.ChillerCooled.Examples.BaseClasses.PostProcess
Post-processing
 
Information
This partial model calculate performance metrics for a data center system. The performance metrics include cooling mode signal switch times, economizing hours, and total energy consumption.
Modelica definition
partial model PostProcess "Post-processing"
  Buildings.Utilities.Math.IntegratorWithReset FCTim "Free cooling time";
  Modelica.Blocks.Sources.RealExpression freCooSig "Free cooling signal";
  Modelica.Blocks.Sources.RealExpression parMecCooSig
    "Partial mechanic cooling signal";
  Buildings.Utilities.Math.IntegratorWithReset PMCTim
    "Partial mechanic cooling time";
  Buildings.Utilities.Math.IntegratorWithReset FMCHou
    "Full mechanic cooling time";
  Modelica.Blocks.Sources.RealExpression fulMecCooSig
    "Full mechanic cooling signal";
  Modelica.Blocks.Sources.RealExpression PHVAC
   "Power consumed by HVAC system";
  Modelica.Blocks.Sources.RealExpression PIT
    "Power consumed by IT";
  Modelica.Blocks.Continuous.Integrator EHVAC(
    initType=Modelica.Blocks.Types.Init.InitialState,
    y_start=0)
    "Energy consumed by HVAC";
  Modelica.Blocks.Continuous.Integrator EIT(
    initType=Modelica.Blocks.Types.Init.InitialState,
    y_start=0)
    "Energy consumed by IT";
  Modelica.Blocks.Math.IntegerChange sigCha(
    u(start=0, fixed=true))
    "Signal changes";
  Modelica.Blocks.MathInteger.TriggeredAdd swiTim "Triggered addition";
  Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt(k=1)
    "Unit signal";
equation 
  connect(freCooSig.y,FCTim. u);
  connect(parMecCooSig.y,PMCTim. u);
  connect(fulMecCooSig.y, FMCHou.u);
  connect(PHVAC.y,EHVAC. u);
  connect(PIT.y,EIT. u);
  connect(sigCha.y, swiTim.trigger);
  connect(conInt.y, swiTim.u);
end PostProcess;
