modelAirToWater
Extends from Buildings.Templates.Plants.HeatPumps.Interfaces.PartialHeatPumpPlant (Interface class for heat pump plant).
Information
Description
This template represents an air-to-water heat pump plant with closed-loop
controls. While the heat pump plant configuration can be changed through
parameters, the image below shows a typical configuration with two
reversible air-to-water heat pumps, a primary-secondary distribution system
and a sidestream heat recovery chiller. For a detailed schematic of the
actual plant configuration, refer to the diagram view of the plant
component. In Dymola, for example, you can access this by right-clicking the
component pla in the model
Buildings.Templates.Plants.HeatPumps.Validation.AirToWaterReversibleHeatRecovery
and selecting "Show Component" from the context menu.
Currently, only identical heat pumps are supported. Although the template can accommodate any number of identical units, the graphical feedback for system configuration via the diagram layer is only accurate for up to 6 units.
The supported plant configurations are enumerated in the table below. The
first option displayed in bold characters corresponds to the default
configuration.
| Configuration parameter | Options | Notes |
|---|---|---|
| Function and equipment type |
Heating and cooling with reversible heat pumps Heating-only with non-reversible heat pumps Heating and cooling with reversible heat pumps and heat recovery chiller Heating and cooling with reversible (2-pipe) heat pumps and polyvalent (4-pipe) heat pumps Heating and cooling with polyvalent (4-pipe) heat pumps |
The plant always provides heating hot water. For configurations without polyvalent heat pumps, the heat pumps may be unequally sized, with only a subset of the units participating in lead/lag alternation. For configurations with polyvalent heat pumps, the reversible heat pumps must be equally sized among themselves, and the polyvalent heat pumps must be equally sized among themselves. All units are lead/lag alternated within their own pool. For the configuration with a heat recovery chiller, the template includes a chiller and its associated dedicated primary CHW and CW pumps. The chiller is considered connected in a sidestream configuration to both the CHW return and the HW return. |
| Type of distribution |
Constant primary-variable secondary centralized Variable primary-only |
It is assumed that the HW and the CHW loops have the same type of
distribution, as specified by this parameter. Most AWHPs on the market use a reverse cycle for defrosting. This requires maximum primary flow during defrost cycles. Consequently, variable primary plants commonly adopt a high minimum flow setpoint, typically close to the design flow rate, effectively operating akin to constant primary plants but with variable speed pumps controlling the loop differential pressure. While the flow rate directed towards the loads varies, the bypass valve control loop ensures a constant primary flow for a given number of staged units. "Centralized secondary pumps" refers to configurations with a single group of secondary pumps that is typically integrated into the plant. Distributed secondary pumps with multiple secondary loops served by dedicated secondary pumps are currently not supported. |
| Type of primary pump arrangement |
Dedicated Headered |
It is assumed that the HW and the CHW loops have the same type of
primary pump arrangement, as specified by this parameter. Primary-secondary plants with both reversible and polyvalent heat pumps must have primary dedicated pumps: primary headered pumps are not supported for this configuration. |
| Separate dedicated primary pumps for the CHW and HW circuits |
False True |
This option is only available for reversible heat pumps with dedicated primary pumps. If this option is not selected (default setting), each AWHP uses a common dedicated primary pump for CHW and HW – this pump is then denoted as the primary HW pump. Otherwise, each AWHP relies on a separate dedicated HW pump and a separate dedicated CHW pump. |
| Type of primary pumps |
Variable speed Constant speed |
For constant primary-variable secondary distributions, the variable speed primary pumps are commanded at fixed speeds, determined during the Testing, Adjusting and Balancing phase to provide design AWHP flow in heating and cooling modes. The same intent is achieved with constant speed primary pumps through the use of balancing valves. It is assumed that the HW and the CHW loops have the same type of primary pumps, as specified by this parameter. |
| HW buffer tank |
HW buffer tank in the primary supply HW buffer tank in the primary return No HW buffer tank |
By default, the HW buffer tank is considered integrated into the primary
supply to mitigate the impact of defrost cycles on the temperature of
the HW supplied to the loads. This assumes that the buffer tank is
well-mixed. The default sizing of the tank corresponds to 4 min of the design primary flow rate. This is based on manufacturer recommendations, which account for the fact that defrost cycles can take 3 to 5 min to complete. |
| CHW buffer tank |
CHW buffer tank in the primary return CHW buffer tank in the primary supply No CHW buffer tank |
By default, the CHW buffer tank is considered integrated into the
primary return to mitigate the impact of rapid load variations on the
plant controls. This assumes that the buffer tank is well-mixed. The default sizing of the tank corresponds to 2 min of the design primary flow rate, based on manufacturer recommendations. |
| Controller |
Closed-loop controls with supply temperature and differential
pressure reset |
Most parts of the sequence of operation are similar to that described in
ASHRAE, 2024 for chiller plants. See the documentation of Buildings.Templates.Plants.Controls.HeatPumps.AirToWater for more details. An open loop controller is also available for validation purposes. |
Control points
The control sequence implemented in this template requires the external input points specified in the documentation of the controller Buildings.Templates.Plants.HeatPumps.Components.Controls.AirToWater.
Implementation details
The pressure drops of the heat pump CHW and HW heat exchangers are
calculated within the isolation valve component valIso based on
lumped flow coefficients for the sake of computational efficiency.
The template uses a heat pump model that interpolates capacity and power
from manufacturer data along the CHW/HW temperature, the outdoor air
temperature and the part load ratio. The heat pump performance data are
provided via the subrecords dat.hp.perHeaHp and
dat.hp.perCooHp for the heating mode and the cooling mode,
respectively. The polyvalent heat pump performance data are provided via the
subrecord dat.hp.perPhp. For the required format of the
performance data files, please refer to the documentation of the blocks
Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.BaseClasses.TableData2DLoadDep
and
Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.BaseClasses.TableData2DLoadDepSHC.
References
- ASHRAE, 2024. Guideline 36-2024, High-Performance Sequences of Operation for HVAC Systems. Atlanta, GA.
Parameters
| Type | Name | Default | Description |
|---|---|---|---|
| Boolean | have_hp (from PartialHeatPumpPlant) | typ <> Buildings.Templates.Plants.Controls.Types.PlantHeatPump.Polyvalent | Set to true for plants with non-reversible or reversible heat pumps |
| Boolean | have_hrc (from PartialHeatPumpPlant) | typ == Buildings.Templates.Plants.Controls.Types.PlantHeatPump.ReversibleHeatRecovery | Set to true for plants with sidestream heat recovery chiller |
| Boolean | have_php (from PartialHeatPumpPlant) | typ == Buildings.Templates.Plants.Controls.Types.PlantHeatPump.ReversiblePolyvalent or typ == Buildings.Templates.Plants.Controls.Types.PlantHeatPump.Polyvalent | Set to true for plants with polyvalent heat pumps |
| Buildings.Templates.Plants.Controls.Types.PlantHeatPump | typ (from PartialHeatPumpPlant) | Buildings.Templates.Plants.Controls.Types.PlantHeatPump.Reversible | Type of plant |
| Buildings.Templates.Plants.HeatPumps.Configuration.HeatPumpPlant | cfg (from PartialHeatPumpPlant) | Configuration parameters | |
| Buildings.Templates.Plants.HeatPumps.Data.HeatPumpPlant | dat (from PartialHeatPumpPlant) | Design and operating parameters | |
| Integer | nHp (from PartialHeatPumpPlant) | if have_hp then nHp_select else 0 | Number of heat pumps (excluding polyvalent HPs) |
| Integer | nPhp (from PartialHeatPumpPlant) | if have_php then nPhp_select else 0 | Number of polyvalent heat pumps |
| Boolean | is_rev (from PartialHeatPumpPlant) | typ == Buildings.Templates.Plants.Controls.Types.PlantHeatPump.Reversible or typ == Buildings.Templates.Plants.Controls.Types.PlantHeatPump.ReversibleHeatRecovery or typ == Buildings.Templates.Plants.Controls.Types.PlantHeatPump.ReversiblePolyvalent | Set to true for reversible heat pumps, false for heating only |
| Buildings.Templates.Plants.HeatPumps.Types.Distribution | typDis (from PartialHeatPumpPlant) | if typHp == Buildings.Templates.Components.Types.HeatPump.AirToWater then typDis_select1 else typDis_select2 | Type of distribution system |
| Boolean | have_valHpInlIso (from PartialHeatPumpPlant) | if not have_hp then false elseif not have_chiWat and typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then false else true | Set to true for isolation valves at HP inlet |
| Boolean | have_valHpOutIso (from PartialHeatPumpPlant) | if not have_hp then false elseif not have_chiWat and typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then false elseif nHp == 1 then false elseif have_chiWat and typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated and not have_pumPriDedComHp then false else true | Set to true for isolation valves at HP outlet |
| Boolean | have_valPhpInlIso (from PartialHeatPumpPlant) | if not have_php then false elseif typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then false else true | Set to true for isolation valves at polyvalent HP inlet |
| Boolean | have_valPhpOutIso (from PartialHeatPumpPlant) | false | Set to true for isolation valves at polyvalent HP outlet |
| Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary | typPumPri (from PartialHeatPumpPlant) | if typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Constant1Variable2 then typPumPri_select else Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.Variable | Type of primary CHW/HW pumps |
| Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary | typPumHeaWatPri (from PartialHeatPumpPlant) | if have_heaWat then typPumPri else Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None | Type of primary HW pumps |
| Buildings.Templates.Components.Types.IntegrationPoint | typTanHeaWat (from PartialHeatPumpPlant) | if have_heaWat then typTanHeaWat_select else Buildings.Templates.Components.Types.IntegrationPoint.None | Specify if there is a HW buffer tank and where it is integrated into the system |
| Boolean | have_pumChiWatPriDedHp (from PartialHeatPumpPlant) | have_hp and have_chiWat and typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated and not have_pumPriDedComHp | Set to true for HP with separate dedicated primary pumps for CHW and HW circuits |
| Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary | typPumChiWatPri (from PartialHeatPumpPlant) | if have_chiWat and (typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Headered or have_hp and have_pumChiWatPriDedHp or have_php) then typPumPri else Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None | Type of primary CHW pumps |
| Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary | typPumChiWatPriHp (from PartialHeatPumpPlant) | if have_hp and have_chiWat and (not have_pumPriDedComHp or typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Headered) then typPumPri else Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None | Type of HP primary CHW pumps |
| Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary | typPumChiWatPriPhp (from PartialHeatPumpPlant) | if have_php then typPumPri else Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None | Type of polyvalent HP primary CHW pumps |
| Buildings.Templates.Components.Types.IntegrationPoint | typTanChiWat (from PartialHeatPumpPlant) | if have_chiWat then typTanChiWat_select else Buildings.Templates.Components.Types.IntegrationPoint.None | Specify if there is a CHW buffer tank and where it is integrated into the system |
| Modelica.Units.SI.MassFlowRate | mHeaWatPri_flow_nominal (from PartialHeatPumpPlant) | if have_heaWat then dat.hp.mHeaWatHp_flow_nominal*nHp + dat.hp.mHeaWatPhp_flow_nominal*nPhp else 0 | Primary HW mass flow rate |
| Modelica.Units.SI.MassFlowRate | mHeaWat_flow_nominal (from PartialHeatPumpPlant) | if have_heaWat then (if typPumHeaWatSec == Buildings.Templates.Plants.HeatPumps.Types.PumpsSecondary.None then mHeaWatPri_flow_nominal else sum(dat.pumHeaWatSec.m_flow_nominal)) else 0 | HW mass flow rate (total, distributed to consumers) |
| Modelica.Units.SI.HeatFlowRate | capHea_nominal (from PartialHeatPumpPlant) | if have_heaWat then abs(dat.hp.capHeaHp_nominal)*nHp + abs(dat.hp.capHeaPhp_nominal)*nPhp else 0 | Heating capacity - All units |
| Modelica.Units.SI.HeatFlowRate | QHea_flow_nominal (from PartialHeatPumpPlant) | capHea_nominal | Heating heat flow rate - All units |
| Modelica.Units.SI.Temperature | THeaWatSup_nominal (from PartialHeatPumpPlant) | dat.ctl.THeaWatSup_nominal | Maximum HW supply temperature |
| Modelica.Units.SI.Temperature | THeaWatRet_nominal (from PartialHeatPumpPlant) | THeaWatSup_nominal - QHea_flow_nominal/cpHeaWat_default/mHeaWat_flow_nominal | HW return temperature |
| Modelica.Units.SI.MassFlowRate | mChiWatPri_flow_nominal (from PartialHeatPumpPlant) | if have_chiWat then dat.hp.mChiWatHp_flow_nominal*nHp + dat.hp.mChiWatPhp_flow_nominal*nPhp else 0 | Primary CHW mass flow rate |
| Modelica.Units.SI.MassFlowRate | mChiWat_flow_nominal (from PartialHeatPumpPlant) | if have_chiWat then (if typPumChiWatSec == Buildings.Templates.Plants.HeatPumps.Types.PumpsSecondary.None then mChiWatPri_flow_nominal else sum(dat.pumChiWatSec.m_flow_nominal)) else 0 | CHW mass flow rate - Total, distributed to consumers |
| Modelica.Units.SI.HeatFlowRate | capCoo_nominal (from PartialHeatPumpPlant) | if have_chiWat then abs(dat.hp.capCooHp_nominal)*nHp + abs(dat.hp.capCooPhp_nominal)*nPhp else 0 | Cooling capacity - All units |
| Modelica.Units.SI.HeatFlowRate | QCoo_flow_nominal (from PartialHeatPumpPlant) | -capCoo_nominal | Cooling heat flow rate - All units |
| Modelica.Units.SI.Temperature | TChiWatSup_nominal (from PartialHeatPumpPlant) | dat.ctl.TChiWatSup_nominal | Minimum CHW supply temperature |
| Modelica.Units.SI.Temperature | TSouHea_nominal (from PartialHeatPumpPlant) | if have_hp then dat.hp.TSouHeaHp_nominal else dat.hp.TSouHeaPhp_nominal | OAT or source fluid supply temperature (evaporator entering) in heating mode - Each unit |
| Modelica.Units.SI.Temperature | TSouCoo_nominal (from PartialHeatPumpPlant) | if have_hp then dat.hp.TSouCooHp_nominal else dat.hp.TSouCooPhp_nominal | OAT or source fluid supply temperature (evaporator entering) in cooling mode - Each unit |
| MediumHeaWat.Density | rhoHeaWat_default (from PartialHeatPumpPlant) | MediumHeaWat.density(staHeaWat_default) | HW default density |
| MediumHeaWat.SpecificHeatCapacity | cpHeaWat_default (from PartialHeatPumpPlant) | MediumHeaWat.specificHeatCapacityCp(staHeaWat_default) | HW default specific heat capacity |
| MediumHeaWat.ThermodynamicState | staHeaWat_default (from PartialHeatPumpPlant) | MediumHeaWat.setState_pTX(T = THeaWatSup_nominal, p = MediumHeaWat.p_default, X = MediumHeaWat.X_default) | HW default state |
| MediumChiWat.Density | rhoChiWat_default (from PartialHeatPumpPlant) | MediumChiWat.density(staChiWat_default) | CHW default density |
| MediumChiWat.SpecificHeatCapacity | cpChiWat_default (from PartialHeatPumpPlant) | MediumChiWat.specificHeatCapacityCp(staChiWat_default) | CHW default specific heat capacity |
| MediumChiWat.ThermodynamicState | staChiWat_default (from PartialHeatPumpPlant) | MediumChiWat.setState_pTX(T = TChiWatSup_nominal, p = MediumChiWat.p_default, X = MediumChiWat.X_default) | CHW default state |
| MediumSou.Density | rhoSou_default (from PartialHeatPumpPlant) | MediumSou.density(staSou_default) | Source fluid default density |
| MediumSou.SpecificHeatCapacity | cpSou_default (from PartialHeatPumpPlant) | MediumSou.specificHeatCapacityCp(staSou_default) | Source fluid default specific heat capacity |
| MediumSou.ThermodynamicState | staSou_default (from PartialHeatPumpPlant) | MediumSou.setState_pTX(T = TSouHea_nominal, p = MediumSou.p_default, X = MediumSou.X_default) | Source fluid default state |
| Boolean | is_dpBalCal | is_dpBalYPumSetCal and (typPumPri == Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.Constant or have_hp and have_php and typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1Only) | Set to true to automatically size balancing valves |
| Boolean | is_yPumSetCal | is_dpBalYPumSetCal and typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Constant1Variable2 and typPumPri == Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.Variable | Set to true to automatically evaluate pump speed providing design flow |
| Modelica.Units.SI.PressureDifference | dpValCheHeaWatBalHp_nominal | if have_heaWat and have_hp then (if have_pumPriDedComHp then dat.dpValCheHeaWat_nominal[1]*(hp.mHeaWatHp_flow_nominal/dat.pumHeaWatPri.m_flow_nominal[1])^2 elseif typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.dpValCheHeaWat_nominal[1] else dpValCheHeaWatBalHdr_nominal) else 0 | HP primary (HW or common HW and CHW) pump check valve pressure drop at design HW flow rate |
| Modelica.Units.SI.PressureDifference | dpValCheChiWatBalHp_nominal | if have_chiWat and have_hp then (if have_pumPriDedComHp then dat.dpValCheHeaWat_nominal[1]*(hp.mChiWatHp_flow_nominal/dat.pumHeaWatPri.m_flow_nominal[1])^2 elseif typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.dpValCheChiWat_nominal[1] else dpValCheChiWatBalHdr_nominal) else 0 | HP primary (CHW or common HW and CHW) pump check valve pressure drop at design CHW flow rate |
| Modelica.Units.SI.PressureDifference | dpValCheHeaWatBalPhp_nominal | if have_php then (if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.dpValCheHeaWat_nominal[nPumHeaWatPri] else dpValCheHeaWatBalHdr_nominal) else 0 | Polyvalent HP primary HW pump check valve pressure drop at design HW flow rate |
| Modelica.Units.SI.PressureDifference | dpValCheChiWatBalPhp_nominal | if have_php then (if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.dpValCheChiWat_nominal[nPumChiWatPri] else dpValCheChiWatBalHdr_nominal) else 0 | Polyvalent HP primary CHW pump check valve pressure drop at design CHW flow rate |
| Modelica.Units.SI.VolumeFlowRate | VHeaWatBalHdr_nominal | (nHp*dat.hp.mHeaWatHp_flow_nominal + nPhp*dat.hp.mHeaWatPhp_flow_nominal)/rhoHeaWat_default | Total design HW flow rate for balancing valve and pump speed calculation – Headered pumps |
| Modelica.Units.SI.VolumeFlowRate | VChiWatBalHdr_nominal | (nHp*dat.hp.mChiWatHp_flow_nominal + nPhp*dat.hp.mChiWatPhp_flow_nominal)/rhoChiWat_default | Total design CHW flow rate for balancing valve and pump speed calculation – Headered pumps |
| Modelica.Units.SI.VolumeFlowRate | VHeaWatBalHp_nominal | if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.hp.mHeaWatHp_flow_nominal/rhoHeaWat_default else VHeaWatBalHdr_nominal | Target HW flow rate for HP balancing valve and pump speed calculation |
| Modelica.Units.SI.VolumeFlowRate | VChiWatBalHp_nominal | if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.hp.mChiWatHp_flow_nominal/rhoChiWat_default else VChiWatBalHdr_nominal | Target CHW flow rate for HP balancing valve and pump speed calculation |
| Modelica.Units.SI.VolumeFlowRate | VHeaWatBalPhp_nominal | if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.hp.mHeaWatPhp_flow_nominal/rhoHeaWat_default else VHeaWatBalHdr_nominal | Target HW flow rate for polyvalent HP balancing valve and pump speed calculation |
| Modelica.Units.SI.VolumeFlowRate | VChiWatBalPhp_nominal | if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.hp.mChiWatPhp_flow_nominal/rhoChiWat_default else VChiWatBalHdr_nominal | Target CHW flow rate for polyvalent HP balancing valve and pump speed calculation |
| Modelica.Units.SI.PressureDifference | dpValCheHeaWatBalHdr_nominal | if typPumHeaWatPri == Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None then 0 else max(dat.dpValCheHeaWat_nominal)*(VHeaWatBalHdr_nominal*rhoHeaWat_default/sum(dat.pumHeaWatPri.m_flow_nominal))^2 | Primary HW pump check valve pressure drop at design HW flow rate – Headered pumps |
| Modelica.Units.SI.PressureDifference | dpValCheChiWatBalHdr_nominal | if typPumChiWatPri == Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None then 0 else max(dat.dpValCheChiWat_nominal)*(VChiWatBalHdr_nominal*rhoChiWat_default/sum(dat.pumChiWatPri.m_flow_nominal))^2 | Primary CHW pump check valve pressure drop at design CHW flow rate – Headered pumps |
| Integer | nPoiPrePumHeaWat | size(dat.pumHeaWatPri.per.pressure.V_flow, 2) | Number of points in primary HW pump pressure curve |
| Integer | nPoiPrePumChiWat | size(dat.pumChiWatPri.per.pressure.V_flow, 2) | Number of points in primary CHW pump pressure curve |
| Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParameters | prePumHeaWatBalHdr | Equivalent pressure curve of parallel primary HW pumps – Headered pumps | |
| Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParameters | prePumChiWatBalHdr | Equivalent pressure curve of parallel primary CHW pumps – Headered pumps | |
| Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParameters | prePumHeaWatBalHp | if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParameters(V_flow = if typPumHeaWatPri == Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None then {0, 0, 0} else dat.pumHeaWatPri.per[1].pressure.V_flow, dp = if typPumHeaWatPri == Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None then {0, 0, 0} else dat.pumHeaWatPri.per[1].pressure.dp) else prePumHeaWatBalHdr | Pump pressure curve for HP HW balancing valve and pump speed calculation |
| Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParameters | prePumChiWatBalHp | if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then (if have_pumPriDedComHp then prePumHeaWatBalHp else Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParameters(V_flow = if typPumChiWatPri == Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None then {0, 0, 0} else dat.pumChiWatPri.per[1].pressure.V_flow, dp = if typPumChiWatPri == Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None then {0, 0, 0} else dat.pumChiWatPri.per[1].pressure.dp)) else prePumChiWatBalHdr | Pump pressure curve for HP CHW balancing valve and pump speed calculation |
| Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParameters | prePumHeaWatBalPhp | if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParameters(V_flow = if typPumHeaWatPri == Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None then {0, 0, 0} else dat.pumHeaWatPri.per[nPumHeaWatPri].pressure.V_flow, dp = if typPumHeaWatPri == Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None then {0, 0, 0} else dat.pumHeaWatPri.per[nPumHeaWatPri].pressure.dp) else prePumHeaWatBalHdr | Pump pressure curve for polyvalent HP HW balancing valve and pump speed calculation |
| Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParameters | prePumChiWatBalPhp | if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParameters(V_flow = if typPumChiWatPri == Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None then {0, 0, 0} else dat.pumChiWatPri.per[nPumChiWatPri].pressure.V_flow, dp = if typPumChiWatPri == Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.None then {0, 0, 0} else dat.pumChiWatPri.per[nPumChiWatPri].pressure.dp) else prePumChiWatBalHdr | Pump pressure curve for polyvalent HP CHW balancing valve and pump speed calculation |
| Modelica.Units.SI.PressureDifference | dpHeaWatLooBal_nominal | if typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1Only then (if cfg.typCtl == Buildings.Templates.Plants.HeatPumps.Types.Controller.AirToWater and not cfg.have_senDpHeaWatRemWir then dat.ctl.dpHeaWatLocSet_max else dpHeaWatLoo_nominal) else 0 | HW loop differential pressure at design flow rate used for balancing valve and pump speed calculation |
| Modelica.Units.SI.PressureDifference | dpChiWatLooBal_nominal | if typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1Only then (if cfg.typCtl == Buildings.Templates.Plants.HeatPumps.Types.Controller.AirToWater and not cfg.have_senDpChiWatRemWir then dat.ctl.dpChiWatLocSet_max else dpChiWatLoo_nominal) else 0 | CHW loop differential pressure at design flow rate used for balancing valve and pump speed calculation |
| Modelica.Units.SI.PressureDifference | dpBalHeaWatHp_nominal | if have_hp then (if is_dpBalCal then Buildings.Templates.Utilities.computeBalancingPressureDrop(V_flow_nominal = VHeaWatBalHp_nominal, dp_nominal = hp.dpHeaWatHp_nominal + max(valIso.dpValveHeaWat_nominal[1:nHp])*((if have_valHpInlIso then 1 else 0) + (if have_valHpOutIso then 1 else 0)) + dpValCheHeaWatBalHp_nominal + dpHeaWatLooBal_nominal, prePum = prePumHeaWatBalHp) else dat.dpBalHeaWatHp_nominal) else 0 | HP HW balancing valve pressure drop at design HW flow |
| Modelica.Units.SI.PressureDifference | dpBalChiWatHp_nominal | if have_hp and have_chiWat then (if is_dpBalCal then Buildings.Templates.Utilities.computeBalancingPressureDrop(V_flow_nominal = VChiWatBalHp_nominal, dp_nominal = hp.dpChiWatHp_nominal + max(valIso.dpValveChiWat_nominal[1:nHp])*((if have_valHpInlIso then 1 else 0) + (if have_valHpOutIso then 1 else 0)) + dpValCheChiWatBalHp_nominal + dpChiWatLooBal_nominal, prePum = prePumChiWatBalHp) else dat.dpBalChiWatHp_nominal) else 0 | HP CHW balancing valve pressure drop at design CHW flow |
| Modelica.Units.SI.PressureDifference | dpBalHeaWatPhp_nominal | if have_php then (if is_dpBalCal then Buildings.Templates.Utilities.computeBalancingPressureDrop(V_flow_nominal = VHeaWatBalPhp_nominal, dp_nominal = dat.hp.dpHeaWatPhp_nominal + max(valIso.dpValveHeaWat_nominal[nHp + 1:nHp + nPhp])*((if have_valPhpInlIso then 1 else 0) + (if have_valPhpOutIso then 1 else 0)) + dpValCheHeaWatBalPhp_nominal + dpHeaWatLooBal_nominal, prePum = prePumHeaWatBalPhp) else dat.dpBalHeaWatPhp_nominal) else 0 | Polyvalent unit HW balancing valve pressure drop at design HW flow |
| Modelica.Units.SI.PressureDifference | dpBalChiWatPhp_nominal | if have_php then (if is_dpBalCal then Buildings.Templates.Utilities.computeBalancingPressureDrop(V_flow_nominal = VChiWatBalPhp_nominal, dp_nominal = dat.hp.dpChiWatPhp_nominal + max(valIso.dpValveChiWat_nominal[nHp + 1:nHp + nPhp])*((if have_valPhpInlIso then 1 else 0) + (if have_valPhpOutIso then 1 else 0)) + dpValCheChiWatBalPhp_nominal + dpChiWatLooBal_nominal, prePum = prePumChiWatBalPhp) else dat.dpBalChiWatPhp_nominal) else 0 | Polyvalent unit CHW balancing valve pressure drop at design CHW flow |
| Real | yPumHeaWatPriHdrSet | Primary HW pump speed providing design flow – Headered pumps | |
| Real | yPumChiWatPriHdrSet | Primary CHW pump speed providing design flow – Headered pumps | |
| Real | yPumHeaWatPriDedHpSet | Primary pump speed providing design flow in heating mode – HP dedicated pumps | |
| Real | yPumChiWatPriDedHpSet | Primary pump speed providing design flow in cooling mode – HP dedicated pumps | |
| Real | yPumHeaWatPriDedPhpSet | Primary HW pump speed providing design flow – Polyvalent HP dedicated pumps | |
| Real | yPumChiWatPriDedPhpSet | Primary CHW pump speed providing design flow – HP dedicated pumps | |
| Configuration | |||
| Boolean | have_heaWat (from PartialHeatPumpPlant) | true | Set to true if the plant provides HW |
| Boolean | have_chiWat (from PartialHeatPumpPlant) | typ <> Buildings.Templates.Plants.Controls.Types.PlantHeatPump.HeatingOnly | Set to true if the plant provides CHW |
| Boolean | have_hotWat (from PartialHeatPumpPlant) | false | Set to true if the plant provides DHW |
| Buildings.Templates.Plants.HeatPumps.Types.Distribution | typDis_select1 (from PartialHeatPumpPlant) | Buildings.Templates.Plants.HeatPumps.Types.Distribution.Constant1Variable2 | Type of distribution system |
| Buildings.Templates.Plants.HeatPumps.Types.Distribution | typDis_select2 (from PartialHeatPumpPlant) | Type of distribution system | |
| Heat pumps | |||
| Buildings.Templates.Components.Types.HeatPump | typHp (from PartialHeatPumpPlant) | Type of heat pump | |
| Integer | nHp_select (from PartialHeatPumpPlant) | Number of heat pumps (excluding polyvalent HPs) | |
| polyvalent heat pumps | |||
| Integer | nPhp_select (from PartialHeatPumpPlant) | Number of polyvalent heat pumps | |
| Primary loop | |||
| Buildings.Templates.Components.Types.PumpArrangement | typArrPumPri_select (from PartialHeatPumpPlant) | Buildings.Templates.Components.Types.PumpArrangement.Dedicated | Type of primary pump arrangement |
| Buildings.Templates.Components.Types.PumpArrangement | typArrPumPri (from PartialHeatPumpPlant) | if typ == Buildings.Templates.Plants.Controls.Types.PlantHeatPump.ReversiblePolyvalent and typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Constant1Variable2 then Buildings.Templates.Components.Types.PumpArrangement.Dedicated else typArrPumPri_select | Type of primary pump arrangement |
| Boolean | have_bypHeaWatFix (from PartialHeatPumpPlant) | have_heaWat and (typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Constant1Variable2 or typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1And2) | Set to true if the HW loop has a fixed bypass |
| Boolean | have_valHeaWatMinByp (from PartialHeatPumpPlant) | have_heaWat and typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1Only | Set to true if the HW loop has a minimum flow bypass valve |
| Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary | typPumPri_select (from PartialHeatPumpPlant) | Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.Variable | Type of CHW/HW primary pumps |
| Integer | nPumHeaWatPri_select (from PartialHeatPumpPlant) | nHp + nPhp | Number of primary HW pumps |
| Integer | nPumHeaWatPri (from PartialHeatPumpPlant) | if have_heaWat then (if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Headered then nPumHeaWatPri_select else nHp + nPhp) else 0 | Number of primary HW pumps |
| Buildings.Templates.Components.Types.IntegrationPoint | typTanHeaWat_select (from PartialHeatPumpPlant) | Buildings.Templates.Components.Types.IntegrationPoint.Supply | Specify if there is a HW buffer tank and where it is integrated into the system |
| Boolean | have_pumPriDedComHp_select (from PartialHeatPumpPlant) | true | Set to true for HP with single dedicated primary pump serving both CHW and HW circuits |
| Boolean | have_pumPriDedComHp (from PartialHeatPumpPlant) | if have_hp and have_chiWat and typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then have_pumPriDedComHp_select else false | Set to true for HP with single dedicated primary pump serving both CHW and HW circuits |
| Boolean | have_bypChiWatFix (from PartialHeatPumpPlant) | have_chiWat and (typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Constant1Variable2 or typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1And2) | Set to true if the CHW loop has a fixed bypass |
| Boolean | have_valChiWatMinByp (from PartialHeatPumpPlant) | have_chiWat and typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1Only | Set to true if the CHW loop has a minimum flow bypass valve |
| Integer | nPumChiWatPri_select (from PartialHeatPumpPlant) | nHp + nPhp | Number of primary CHW pumps |
| Integer | nPumChiWatPri (from PartialHeatPumpPlant) | if have_chiWat then (if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Headered then nPumChiWatPri_select elseif not have_pumPriDedComHp then nHp + nPhp else nPhp) else 0 | Number of primary CHW pumps |
| Buildings.Templates.Components.Types.IntegrationPoint | typTanChiWat_select (from PartialHeatPumpPlant) | Buildings.Templates.Components.Types.IntegrationPoint.Return | Specify if there is a CHW buffer tank and where it is integrated into the system |
| Secondary HW loop | |||
| Buildings.Templates.Plants.HeatPumps.Types.PumpsSecondary | typPumHeaWatSec (from PartialHeatPumpPlant) | if have_heaWat and (typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Constant1Variable2 or typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1And2) then Buildings.Templates.Plants.HeatPumps.Types.PumpsSecondary.Centralized else Buildings.Templates.Plants.HeatPumps.Types.PumpsSecondary.None | Type of secondary HW pumps |
| Integer | nPumHeaWatSec_select (from PartialHeatPumpPlant) | Number of secondary HW pumps | |
| Integer | nPumHeaWatSec (from PartialHeatPumpPlant) | if not have_heaWat or typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1Only then 0 else nPumHeaWatSec_select | Number of secondary HW pumps |
| Secondary CHW loop | |||
| Buildings.Templates.Plants.HeatPumps.Types.PumpsSecondary | typPumChiWatSec (from PartialHeatPumpPlant) | if have_chiWat and (typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Constant1Variable2 or typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1And2) then Buildings.Templates.Plants.HeatPumps.Types.PumpsSecondary.Centralized else Buildings.Templates.Plants.HeatPumps.Types.PumpsSecondary.None | Type of secondary CHW pumps |
| Integer | nPumChiWatSec_select (from PartialHeatPumpPlant) | Number of secondary CHW pumps | |
| Integer | nPumChiWatSec (from PartialHeatPumpPlant) | if not have_chiWat or typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1Only then 0 else nPumChiWatSec_select | Number of secondary CHW pumps |
| Nominal condition | |||
| Modelica.Units.SI.Temperature | TChiWatRet_nominal (from PartialHeatPumpPlant) | if is_rev or have_php then TChiWatSup_nominal - QCoo_flow_nominal/cpChiWat_default/mChiWat_flow_nominal else Buildings.Templates.Data.Defaults.TChiWatRet | CHW return temperature - Each heat pump |
| Dynamics › Conservation equations | |||
| Modelica.Fluid.Types.Dynamics | energyDynamics (from PartialHeatPumpPlant) | Modelica.Fluid.Types.Dynamics.FixedInitial | Type of energy balance: dynamic (3 initialization options) or steady state |
| Assumptions | |||
| Boolean | allowFlowReversal (from PartialHeatPumpPlant) | true | = true to allow flow reversal, false restricts to design direction (port_a -> port_b) |
| Advanced | |||
| Boolean | linearized (from PartialHeatPumpPlant) | false | = true, use linear relation between m_flow and dp for all valves |
| Boolean | is_dpBalYPumSetCal | false | Set to true to automatically size balancing valves or evaluate pump speed providing design flow |
| Modelica.Units.SI.PressureDifference | dpHeaWatLoo_nominal | HW loop differential pressure at design flow rate | |
| Modelica.Units.SI.PressureDifference | dpChiWatLoo_nominal | CHW loop differential pressure at design flow rate | |
| Advanced › Diagnostics | |||
| Boolean | show_T (from PartialHeatPumpPlant) | false | = true, if actual temperature at port is computed |
Connectors
| Type | Name | Default | Description |
|---|---|---|---|
| Modelica.Fluid.Interfaces.FluidPort_a | port_aHeaWat (from PartialHeatPumpPlant) | HW return | |
| Modelica.Fluid.Interfaces.FluidPort_b | port_bHeaWat (from PartialHeatPumpPlant) | HW supply | |
| Modelica.Fluid.Interfaces.FluidPort_a | port_aChiWat (from PartialHeatPumpPlant) | CHW return | |
| Modelica.Fluid.Interfaces.FluidPort_b | port_bChiWat (from PartialHeatPumpPlant) | CHW supply | |
| Buildings.Templates.Plants.HeatPumps.Interfaces.Bus | bus (from PartialHeatPumpPlant) | Plant control bus | |
| Buildings.Templates.AirHandlersFans.Interfaces.Bus[cfg.nAirHan] | busAirHan (from PartialHeatPumpPlant) | Air handling unit control bus | |
| Buildings.Templates.ZoneEquipment.Interfaces.Bus[cfg.nEquZon] | busEquZon (from PartialHeatPumpPlant) | Terminal unit control bus | |
| BoundaryConditions.WeatherData.Bus | busWea (from PartialHeatPumpPlant) | Weather bus |
Components
Revisions
-
July 10, 2026, by Antoine Gautier:
Refactored for plants with polyvalent heat pumps.
This is for #4512. -
March 23, 2026, by Antoine Gautier:
Refactored HP and HRC components with two separate connectors for HW and CHW supply temperature setpoints.
This is for #4507. -
August 21, 2025, by Antoine Gautier:
Refactored with load-dependent 2D table data heat pump model.
This is for #4152. -
May 31, 2024, by Antoine Gautier:
Added sidestream heat recovery chiller, primary-only pumping, buffer tanks, failsafe staging conditions and internal computation of pump speed or balancing valve ∆p to meet design flow.
This is for #3808. -
March 29, 2024, by Antoine Gautier:
First implementation.