modelPartialCDU
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.
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
| Type | Name | Default | Description |
|---|---|---|---|
| Buildings.Fluid.DataCenterEquipment.CDUs.LiquidToLiquid.Data.Generic_epsNTU | dat | Data record for performance characterization | |
| Boolean | addPowerToMedium | true | Set 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.flowParameters | pumpHeadMonotone | Actual head of the pump, corrected to impose a minimum descent of the pump curve | |
| Assumptions | |||
| Boolean | allowFlowReversalPla (from PartialFourPort) | true | = false to simplify equations, assuming, but not enforcing, no flow reversal for plant-side medium |
| Boolean | allowFlowReversalRac (from PartialFourPort) | true | = false to simplify equations, assuming, but not enforcing, no flow reversal for rack-side medium |
| Nominal condition | |||
| Modelica.Units.SI.MassFlowRate | mPla_flow_nominal (from PartialFourPortInterface) | Nominal mass flow rate | |
| Modelica.Units.SI.MassFlowRate | mRac_flow_nominal (from PartialFourPortInterface) | Nominal mass flow rate | |
| Advanced | |||
| MediumPla.MassFlowRate | mPla_flow_small (from PartialFourPortInterface) | 1E-4*abs(mPla_flow_nominal) | Small mass flow rate for regularization of zero flow |
| MediumRac.MassFlowRate | mRac_flow_small (from PartialFourPortInterface) | 1E-4*abs(mRac_flow_nominal) | Small mass flow rate for regularization of zero flow |
| Advanced › Diagnostics | |||
| Boolean | show_T (from PartialFourPortInterface) | false | = true, if actual temperature at port is computed |
| Boolean | checkMedia | true | Set to false to disable media consistency check |
| Flow resistance › Medium 1 | |||
| Boolean | computeFlowResistancePla | true | =true, compute flow resistance. Set to false to assume no friction |
| Boolean | from_dpPla | false | = true, use m_flow = f(dp) else dp = f(m_flow) |
| Boolean | linearizeFlowResistancePla | false | = true, use linear relation between m_flow and dp for any flow rate |
| Flow resistance › Medium 2 | |||
| Boolean | computeFlowResistanceRac | true | =true, compute flow resistance. Set to false to assume no friction |
| Boolean | from_dpRac | false | = true, use m_flow = f(dp) else dp = f(m_flow) |
| Boolean | linearizeFlowResistanceRac | false | = true, use linear relation between m_flow and dp for any flow rate |
| Dynamics › Valve | |||
| Boolean | use_strokeTime | true | Set to true to continuously open and close valve using strokeTime from instance dat |
| Modelica.Blocks.Types.Init | initVal | Modelica.Blocks.Types.Init.InitialOutput | Type of initialization (no init/steady state/initial state/initial output) |
| Real | yVal_start | 1 | Initial position of actuator |
| Dynamics › Pump | |||
| Modelica.Fluid.Types.Dynamics | energyDynamics | Modelica.Fluid.Types.Dynamics.FixedInitial | Type of energy balance: dynamic (3 initialization options) or steady state |
| Modelica.Units.SI.Time | tau | 1 | Time constant of fluid volume for nominal flow, used if energy or mass balance is dynamic |
| Boolean | use_riseTime | true | Set to true to continuously change motor speed using risetime from instance dat |
| Real | yPum_start | 0 | Initial value of speed |
| Valve controller | |||
| Controls.OBC.CDL.Types.SimpleController | controllerTypeVal | Buildings.Controls.OBC.CDL.Types.SimpleController.PI | Type of controller for valve |
| Real | kVal | 1 | Gain of controller for valve |
| Real | TiVal | 120 | Time constant of integrator block of valve controller |
| Real | TdVal | 0.1 | Time constant of derivative block for valve controller |
| Pump controller | |||
| Controls.OBC.CDL.Types.SimpleController | controllerTypePum | Buildings.Controls.OBC.CDL.Types.SimpleController.PI | Type of controller for pump |
| Real | kPum | 1 | Gain of controller for pump |
| Real | TiPum | 120 | Time constant of integrator block of pump controller |
| Real | TdPum | 0.1 | Time constant of derivative block for pump controller |
Connectors
| Type | Name | Default | Description |
|---|---|---|---|
| Modelica.Fluid.Interfaces.FluidPort_a | port_aPla (from PartialFourPort) | Fluid connector aPla (positive design flow direction is from port_aPla to port_bPla) | |
| Modelica.Fluid.Interfaces.FluidPort_b | port_bPla (from PartialFourPort) | Fluid connector bPla (positive design flow direction is from port_aPla to port_bPla) | |
| Modelica.Fluid.Interfaces.FluidPort_a | port_aRac (from PartialFourPort) | Fluid connector aRac (positive design flow direction is from port_aRac to port_bRac) | |
| Modelica.Fluid.Interfaces.FluidPort_b | port_bRac (from PartialFourPort) | Fluid connector bRac (positive design flow direction is from port_aRac to port_bRac) | |
| Buildings.Controls.OBC.CDL.Interfaces.RealInput | TSet | Set point temperature for water leaving to the IT rack | |
| Buildings.Controls.OBC.CDL.Interfaces.RealInput | dpSet | Set point for static pressure provided by CDU | |
| Modelica.Blocks.Interfaces.RealOutput | P | Electrical power consumed by pump |
Components
| Type | Name | Default | Description |
|---|---|---|---|
| MediumPla.MassFlowRate | mPla_flow (from PartialFourPortInterface) | port_aPla.m_flow | Mass flow rate from port_aPla to port_bPla (mPla_flow > 0 is design flow direction) |
| Modelica.Units.SI.PressureDifference | dpPla (from PartialFourPortInterface) | port_aPla.p - port_bPla.p | Pressure difference between port_aPla and port_bPla |
| MediumRac.MassFlowRate | mRac_flow (from PartialFourPortInterface) | port_aRac.m_flow | Mass flow rate from port_aRac to port_bRac (mRac_flow > 0 is design flow direction) |
| Modelica.Units.SI.PressureDifference | dpRac (from PartialFourPortInterface) | port_aRac.p - port_bRac.p | Pressure difference between port_aRac and port_bRac |
| MediumPla.ThermodynamicState | sta_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.ThermodynamicState | sta_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.ThermodynamicState | sta_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.ThermodynamicState | sta_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.PID | conVal | Controller for valve | |
| Controls.OBC.CDL.Reals.PID | conPum | Controller for pump | |
| Buildings.Fluid.Interfaces.PartialFourPortInterface | hex | ||
| Fluid.Actuators.Valves.TwoWayEqualPercentage | val | Control valve on chilled water side | |
| Fluid.Movers.SpeedControlled_y | pum | Pump on IT side | |
| Fluid.FixedResistances.PressureDrop | fil | Filter | |
| Fluid.Storage.ExpansionVessel | exp | Expansion vessel | |
| Fluid.Sensors.RelativePressure | senRelPre | Differential pressure sensor | |
| Fluid.Sensors.TemperatureTwoPort | senTemRacSup | Temperature sensor for medium leaving towards IT racks |
Revisions
-
December 23, 2025, by Michael Wetter:
First implementation.