modelPartialCDU

Partial model for a CDU

Extends from Buildings.Fluid.DataCenterEquipment.CDUs.BaseClasses.PartialFourPortInterface (Partial model with four ports and declaration of quantities that are used by CDU models).

Information

Model of a coolant distribution unit (CDU) with built in two-way valve on the chilled water side and pump on the IT side as shown in the figure below.

Schematic diagram of the CDU.

The two fluid streams are separated by a heat exchanger.

On the chilled water side is a two-way valve that controls the mass flow rate to track to set point for the leaving fluid temperature that goes to the IT racks. By default, the controller is configured as a PI-controller. The valve has an equal-percentage opening characteristics. By default, the valve pressure drop is set to the same value as the heat exchanger pressure drop, achieving a valve authority of 0.5. The valve is modeled using an instance of Buildings.Fluid.Actuators.Valves.TwoWayEqualPercentage.

On the IT side is a circulation pump that is controlled to track a set point for the head between the two fluid ports. Note that this head is not the pump head, but rather the head between the fluid ports of the CDU, and hence it takes into account the flow resistance of the heat exchanger. The controller for the pump is configured by default as a PI-controller.

Note that the head, specified through the parameter dpPum_nominal, is the head of the CDU. To properly size the pump, set dpPum_nominal to the flow resistance that is external to the CDU, plus the flow resistance of the heat exchanger dpHex_nominal and the filter.

The pump is modeled using an instance of Buildings.Fluid.Movers.Preconfigured.SpeedControlled_y.

On the IT side, there is also an expansion vessel, modeled using an instance of Buildings.Fluid.Storage.ExpansionVessel. This component sets a reference static pressure, and if the medium model computes density as a function of temperature during the simulation, it provides a volume for the medium's thermal expansion. Note however that to improve computing performance, the medium Buildings.Media.Antifreeze.PropyleneGlycolWater assumes density as constant during the simulation.

Parameters

TypeNameDefaultDescription
Buildings.Fluid.DataCenterEquipment.CDUs.LiquidToLiquid.Data.Generic_epsNTUdatData record for performance characterization
BooleanaddPowerToMediumtrueSet to false to avoid any power from the pump (=heat and flow work) being added to medium (may give simpler equations)
Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParameterspumpHeadMonotoneActual head of the pump, corrected to impose a minimum descent of the pump curve
Assumptions
BooleanallowFlowReversalPla (from PartialFourPort)true= false to simplify equations, assuming, but not enforcing, no flow reversal for plant-side medium
BooleanallowFlowReversalRac (from PartialFourPort)true= false to simplify equations, assuming, but not enforcing, no flow reversal for rack-side medium
Nominal condition
Modelica.Units.SI.MassFlowRatemPla_flow_nominal (from PartialFourPortInterface)Nominal mass flow rate
Modelica.Units.SI.MassFlowRatemRac_flow_nominal (from PartialFourPortInterface)Nominal mass flow rate
Advanced
MediumPla.MassFlowRatemPla_flow_small (from PartialFourPortInterface)1E-4*abs(mPla_flow_nominal)Small mass flow rate for regularization of zero flow
MediumRac.MassFlowRatemRac_flow_small (from PartialFourPortInterface)1E-4*abs(mRac_flow_nominal)Small mass flow rate for regularization of zero flow
Advanced › Diagnostics
Booleanshow_T (from PartialFourPortInterface)false= true, if actual temperature at port is computed
BooleancheckMediatrueSet to false to disable media consistency check
Flow resistance › Medium 1
BooleancomputeFlowResistancePlatrue=true, compute flow resistance. Set to false to assume no friction
Booleanfrom_dpPlafalse= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistancePlafalse= true, use linear relation between m_flow and dp for any flow rate
Flow resistance › Medium 2
BooleancomputeFlowResistanceRactrue=true, compute flow resistance. Set to false to assume no friction
Booleanfrom_dpRacfalse= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistanceRacfalse= true, use linear relation between m_flow and dp for any flow rate
Dynamics › Valve
Booleanuse_strokeTimetrueSet to true to continuously open and close valve using strokeTime from instance dat
Modelica.Blocks.Types.InitinitValModelica.Blocks.Types.Init.InitialOutputType of initialization (no init/steady state/initial state/initial output)
RealyVal_start1Initial position of actuator
Dynamics › Pump
Modelica.Fluid.Types.DynamicsenergyDynamicsModelica.Fluid.Types.Dynamics.FixedInitialType of energy balance: dynamic (3 initialization options) or steady state
Modelica.Units.SI.Timetau1Time constant of fluid volume for nominal flow, used if energy or mass balance is dynamic
Booleanuse_riseTimetrueSet to true to continuously change motor speed using risetime from instance dat
RealyPum_start0Initial value of speed
Valve controller
Controls.OBC.CDL.Types.SimpleControllercontrollerTypeValBuildings.Controls.OBC.CDL.Types.SimpleController.PIType of controller for valve
RealkVal1Gain of controller for valve
RealTiVal120Time constant of integrator block of valve controller
RealTdVal0.1Time constant of derivative block for valve controller
Pump controller
Controls.OBC.CDL.Types.SimpleControllercontrollerTypePumBuildings.Controls.OBC.CDL.Types.SimpleController.PIType of controller for pump
RealkPum1Gain of controller for pump
RealTiPum120Time constant of integrator block of pump controller
RealTdPum0.1Time constant of derivative block for pump controller

Connectors

TypeNameDefaultDescription
Modelica.Fluid.Interfaces.FluidPort_aport_aPla (from PartialFourPort)Fluid connector aPla (positive design flow direction is from port_aPla to port_bPla)
Modelica.Fluid.Interfaces.FluidPort_bport_bPla (from PartialFourPort)Fluid connector bPla (positive design flow direction is from port_aPla to port_bPla)
Modelica.Fluid.Interfaces.FluidPort_aport_aRac (from PartialFourPort)Fluid connector aRac (positive design flow direction is from port_aRac to port_bRac)
Modelica.Fluid.Interfaces.FluidPort_bport_bRac (from PartialFourPort)Fluid connector bRac (positive design flow direction is from port_aRac to port_bRac)
Buildings.Controls.OBC.CDL.Interfaces.RealInputTSetSet point temperature for water leaving to the IT rack
Buildings.Controls.OBC.CDL.Interfaces.RealInputdpSetSet point for static pressure provided by CDU
Modelica.Blocks.Interfaces.RealOutputPElectrical power consumed by pump

Components

TypeNameDefaultDescription
MediumPla.MassFlowRatemPla_flow (from PartialFourPortInterface)port_aPla.m_flowMass flow rate from port_aPla to port_bPla (mPla_flow > 0 is design flow direction)
Modelica.Units.SI.PressureDifferencedpPla (from PartialFourPortInterface)port_aPla.p - port_bPla.pPressure difference between port_aPla and port_bPla
MediumRac.MassFlowRatemRac_flow (from PartialFourPortInterface)port_aRac.m_flowMass flow rate from port_aRac to port_bRac (mRac_flow > 0 is design flow direction)
Modelica.Units.SI.PressureDifferencedpRac (from PartialFourPortInterface)port_aRac.p - port_bRac.pPressure difference between port_aRac and port_bRac
MediumPla.ThermodynamicStatesta_aPla (from PartialFourPortInterface)if allowFlowReversalPla then MediumPla.setState_phX(port_aPla.p, noEvent(actualStream(port_aPla.h_outflow)), noEvent(actualStream(port_aPla.Xi_outflow))) else MediumPla.setState_phX(port_aPla.p, inStream(port_aPla.h_outflow), inStream(port_aPla.Xi_outflow))Medium properties in port_aPla
MediumPla.ThermodynamicStatesta_bPla (from PartialFourPortInterface)if allowFlowReversalPla then MediumPla.setState_phX(port_bPla.p, noEvent(actualStream(port_bPla.h_outflow)), noEvent(actualStream(port_bPla.Xi_outflow))) else MediumPla.setState_phX(port_bPla.p, port_bPla.h_outflow, port_bPla.Xi_outflow)Medium properties in port_bPla
MediumRac.ThermodynamicStatesta_aRac (from PartialFourPortInterface)if allowFlowReversalRac then MediumRac.setState_phX(port_aRac.p, noEvent(actualStream(port_aRac.h_outflow)), noEvent(actualStream(port_aRac.Xi_outflow))) else MediumRac.setState_phX(port_aRac.p, inStream(port_aRac.h_outflow), inStream(port_aRac.Xi_outflow))Medium properties in port_aRac
MediumRac.ThermodynamicStatesta_bRac (from PartialFourPortInterface)if allowFlowReversalRac then MediumRac.setState_phX(port_bRac.p, noEvent(actualStream(port_bRac.h_outflow)), noEvent(actualStream(port_bRac.Xi_outflow))) else MediumRac.setState_phX(port_bRac.p, port_bRac.h_outflow, port_bRac.Xi_outflow)Medium properties in port_bRac
Controls.OBC.CDL.Reals.PIDconValController for valve
Controls.OBC.CDL.Reals.PIDconPumController for pump
Buildings.Fluid.Interfaces.PartialFourPortInterfacehex
Fluid.Actuators.Valves.TwoWayEqualPercentagevalControl valve on chilled water side
Fluid.Movers.SpeedControlled_ypumPump on IT side
Fluid.FixedResistances.PressureDropfilFilter
Fluid.Storage.ExpansionVesselexpExpansion vessel
Fluid.Sensors.RelativePressuresenRelPreDifferential pressure sensor
Fluid.Sensors.TemperatureTwoPortsenTemRacSupTemperature sensor for medium leaving towards IT racks

Revisions

  • December 23, 2025, by Michael Wetter:
    First implementation.