modelAirToWater

Air-to-water heat pump plant

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.

Image of heat pump plant

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

TypeNameDefaultDescription
Booleanhave_hp (from PartialHeatPumpPlant)typ <> Buildings.Templates.Plants.Controls.Types.PlantHeatPump.PolyvalentSet to true for plants with non-reversible or reversible heat pumps
Booleanhave_hrc (from PartialHeatPumpPlant)typ == Buildings.Templates.Plants.Controls.Types.PlantHeatPump.ReversibleHeatRecoverySet to true for plants with sidestream heat recovery chiller
Booleanhave_php (from PartialHeatPumpPlant)typ == Buildings.Templates.Plants.Controls.Types.PlantHeatPump.ReversiblePolyvalent or typ == Buildings.Templates.Plants.Controls.Types.PlantHeatPump.PolyvalentSet to true for plants with polyvalent heat pumps
Buildings.Templates.Plants.Controls.Types.PlantHeatPumptyp (from PartialHeatPumpPlant)Buildings.Templates.Plants.Controls.Types.PlantHeatPump.ReversibleType of plant
Buildings.Templates.Plants.HeatPumps.Configuration.HeatPumpPlantcfg (from PartialHeatPumpPlant)Configuration parameters
Buildings.Templates.Plants.HeatPumps.Data.HeatPumpPlantdat (from PartialHeatPumpPlant)Design and operating parameters
IntegernHp (from PartialHeatPumpPlant)if have_hp then nHp_select else 0Number of heat pumps (excluding polyvalent HPs)
IntegernPhp (from PartialHeatPumpPlant)if have_php then nPhp_select else 0Number of polyvalent heat pumps
Booleanis_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.ReversiblePolyvalentSet to true for reversible heat pumps, false for heating only
Buildings.Templates.Plants.HeatPumps.Types.DistributiontypDis (from PartialHeatPumpPlant)if typHp == Buildings.Templates.Components.Types.HeatPump.AirToWater then typDis_select1 else typDis_select2Type of distribution system
Booleanhave_valHpInlIso (from PartialHeatPumpPlant)if not have_hp then false elseif not have_chiWat and typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then false else trueSet to true for isolation valves at HP inlet
Booleanhave_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 trueSet to true for isolation valves at HP outlet
Booleanhave_valPhpInlIso (from PartialHeatPumpPlant)if not have_php then false elseif typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then false else trueSet to true for isolation valves at polyvalent HP inlet
Booleanhave_valPhpOutIso (from PartialHeatPumpPlant)falseSet to true for isolation valves at polyvalent HP outlet
Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimarytypPumPri (from PartialHeatPumpPlant)if typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Constant1Variable2 then typPumPri_select else Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.VariableType of primary CHW/HW pumps
Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimarytypPumHeaWatPri (from PartialHeatPumpPlant)if have_heaWat then typPumPri else Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.NoneType of primary HW pumps
Buildings.Templates.Components.Types.IntegrationPointtypTanHeaWat (from PartialHeatPumpPlant)if have_heaWat then typTanHeaWat_select else Buildings.Templates.Components.Types.IntegrationPoint.NoneSpecify if there is a HW buffer tank and where it is integrated into the system
Booleanhave_pumChiWatPriDedHp (from PartialHeatPumpPlant)have_hp and have_chiWat and typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated and not have_pumPriDedComHpSet to true for HP with separate dedicated primary pumps for CHW and HW circuits
Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimarytypPumChiWatPri (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.NoneType of primary CHW pumps
Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimarytypPumChiWatPriHp (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.NoneType of HP primary CHW pumps
Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimarytypPumChiWatPriPhp (from PartialHeatPumpPlant)if have_php then typPumPri else Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.NoneType of polyvalent HP primary CHW pumps
Buildings.Templates.Components.Types.IntegrationPointtypTanChiWat (from PartialHeatPumpPlant)if have_chiWat then typTanChiWat_select else Buildings.Templates.Components.Types.IntegrationPoint.NoneSpecify if there is a CHW buffer tank and where it is integrated into the system
Modelica.Units.SI.MassFlowRatemHeaWatPri_flow_nominal (from PartialHeatPumpPlant)if have_heaWat then dat.hp.mHeaWatHp_flow_nominal*nHp + dat.hp.mHeaWatPhp_flow_nominal*nPhp else 0Primary HW mass flow rate
Modelica.Units.SI.MassFlowRatemHeaWat_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 0HW mass flow rate (total, distributed to consumers)
Modelica.Units.SI.HeatFlowRatecapHea_nominal (from PartialHeatPumpPlant)if have_heaWat then abs(dat.hp.capHeaHp_nominal)*nHp + abs(dat.hp.capHeaPhp_nominal)*nPhp else 0Heating capacity - All units
Modelica.Units.SI.HeatFlowRateQHea_flow_nominal (from PartialHeatPumpPlant)capHea_nominalHeating heat flow rate - All units
Modelica.Units.SI.TemperatureTHeaWatSup_nominal (from PartialHeatPumpPlant)dat.ctl.THeaWatSup_nominalMaximum HW supply temperature
Modelica.Units.SI.TemperatureTHeaWatRet_nominal (from PartialHeatPumpPlant)THeaWatSup_nominal - QHea_flow_nominal/cpHeaWat_default/mHeaWat_flow_nominalHW return temperature
Modelica.Units.SI.MassFlowRatemChiWatPri_flow_nominal (from PartialHeatPumpPlant)if have_chiWat then dat.hp.mChiWatHp_flow_nominal*nHp + dat.hp.mChiWatPhp_flow_nominal*nPhp else 0Primary CHW mass flow rate
Modelica.Units.SI.MassFlowRatemChiWat_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 0CHW mass flow rate - Total, distributed to consumers
Modelica.Units.SI.HeatFlowRatecapCoo_nominal (from PartialHeatPumpPlant)if have_chiWat then abs(dat.hp.capCooHp_nominal)*nHp + abs(dat.hp.capCooPhp_nominal)*nPhp else 0Cooling capacity - All units
Modelica.Units.SI.HeatFlowRateQCoo_flow_nominal (from PartialHeatPumpPlant)-capCoo_nominalCooling heat flow rate - All units
Modelica.Units.SI.TemperatureTChiWatSup_nominal (from PartialHeatPumpPlant)dat.ctl.TChiWatSup_nominalMinimum CHW supply temperature
Modelica.Units.SI.TemperatureTSouHea_nominal (from PartialHeatPumpPlant)if have_hp then dat.hp.TSouHeaHp_nominal else dat.hp.TSouHeaPhp_nominalOAT or source fluid supply temperature (evaporator entering) in heating mode - Each unit
Modelica.Units.SI.TemperatureTSouCoo_nominal (from PartialHeatPumpPlant)if have_hp then dat.hp.TSouCooHp_nominal else dat.hp.TSouCooPhp_nominalOAT or source fluid supply temperature (evaporator entering) in cooling mode - Each unit
MediumHeaWat.DensityrhoHeaWat_default (from PartialHeatPumpPlant)MediumHeaWat.density(staHeaWat_default)HW default density
MediumHeaWat.SpecificHeatCapacitycpHeaWat_default (from PartialHeatPumpPlant)MediumHeaWat.specificHeatCapacityCp(staHeaWat_default)HW default specific heat capacity
MediumHeaWat.ThermodynamicStatestaHeaWat_default (from PartialHeatPumpPlant)MediumHeaWat.setState_pTX(T = THeaWatSup_nominal, p = MediumHeaWat.p_default, X = MediumHeaWat.X_default)HW default state
MediumChiWat.DensityrhoChiWat_default (from PartialHeatPumpPlant)MediumChiWat.density(staChiWat_default)CHW default density
MediumChiWat.SpecificHeatCapacitycpChiWat_default (from PartialHeatPumpPlant)MediumChiWat.specificHeatCapacityCp(staChiWat_default)CHW default specific heat capacity
MediumChiWat.ThermodynamicStatestaChiWat_default (from PartialHeatPumpPlant)MediumChiWat.setState_pTX(T = TChiWatSup_nominal, p = MediumChiWat.p_default, X = MediumChiWat.X_default)CHW default state
MediumSou.DensityrhoSou_default (from PartialHeatPumpPlant)MediumSou.density(staSou_default)Source fluid default density
MediumSou.SpecificHeatCapacitycpSou_default (from PartialHeatPumpPlant)MediumSou.specificHeatCapacityCp(staSou_default)Source fluid default specific heat capacity
MediumSou.ThermodynamicStatestaSou_default (from PartialHeatPumpPlant)MediumSou.setState_pTX(T = TSouHea_nominal, p = MediumSou.p_default, X = MediumSou.X_default)Source fluid default state
Booleanis_dpBalCalis_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
Booleanis_yPumSetCalis_dpBalYPumSetCal and typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Constant1Variable2 and typPumPri == Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.VariableSet to true to automatically evaluate pump speed providing design flow
Modelica.Units.SI.PressureDifferencedpValCheHeaWatBalHp_nominalif 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 0HP primary (HW or common HW and CHW) pump check valve pressure drop at design HW flow rate
Modelica.Units.SI.PressureDifferencedpValCheChiWatBalHp_nominalif 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 0HP primary (CHW or common HW and CHW) pump check valve pressure drop at design CHW flow rate
Modelica.Units.SI.PressureDifferencedpValCheHeaWatBalPhp_nominalif have_php then (if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.dpValCheHeaWat_nominal[nPumHeaWatPri] else dpValCheHeaWatBalHdr_nominal) else 0Polyvalent HP primary HW pump check valve pressure drop at design HW flow rate
Modelica.Units.SI.PressureDifferencedpValCheChiWatBalPhp_nominalif have_php then (if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.dpValCheChiWat_nominal[nPumChiWatPri] else dpValCheChiWatBalHdr_nominal) else 0Polyvalent HP primary CHW pump check valve pressure drop at design CHW flow rate
Modelica.Units.SI.VolumeFlowRateVHeaWatBalHdr_nominal(nHp*dat.hp.mHeaWatHp_flow_nominal + nPhp*dat.hp.mHeaWatPhp_flow_nominal)/rhoHeaWat_defaultTotal design HW flow rate for balancing valve and pump speed calculation – Headered pumps
Modelica.Units.SI.VolumeFlowRateVChiWatBalHdr_nominal(nHp*dat.hp.mChiWatHp_flow_nominal + nPhp*dat.hp.mChiWatPhp_flow_nominal)/rhoChiWat_defaultTotal design CHW flow rate for balancing valve and pump speed calculation – Headered pumps
Modelica.Units.SI.VolumeFlowRateVHeaWatBalHp_nominalif typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.hp.mHeaWatHp_flow_nominal/rhoHeaWat_default else VHeaWatBalHdr_nominalTarget HW flow rate for HP balancing valve and pump speed calculation
Modelica.Units.SI.VolumeFlowRateVChiWatBalHp_nominalif typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.hp.mChiWatHp_flow_nominal/rhoChiWat_default else VChiWatBalHdr_nominalTarget CHW flow rate for HP balancing valve and pump speed calculation
Modelica.Units.SI.VolumeFlowRateVHeaWatBalPhp_nominalif typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.hp.mHeaWatPhp_flow_nominal/rhoHeaWat_default else VHeaWatBalHdr_nominalTarget HW flow rate for polyvalent HP balancing valve and pump speed calculation
Modelica.Units.SI.VolumeFlowRateVChiWatBalPhp_nominalif typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then dat.hp.mChiWatPhp_flow_nominal/rhoChiWat_default else VChiWatBalHdr_nominalTarget CHW flow rate for polyvalent HP balancing valve and pump speed calculation
Modelica.Units.SI.PressureDifferencedpValCheHeaWatBalHdr_nominalif 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))^2Primary HW pump check valve pressure drop at design HW flow rate – Headered pumps
Modelica.Units.SI.PressureDifferencedpValCheChiWatBalHdr_nominalif 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))^2Primary CHW pump check valve pressure drop at design CHW flow rate – Headered pumps
IntegernPoiPrePumHeaWatsize(dat.pumHeaWatPri.per.pressure.V_flow, 2)Number of points in primary HW pump pressure curve
IntegernPoiPrePumChiWatsize(dat.pumChiWatPri.per.pressure.V_flow, 2)Number of points in primary CHW pump pressure curve
Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParametersprePumHeaWatBalHdrEquivalent pressure curve of parallel primary HW pumps – Headered pumps
Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParametersprePumChiWatBalHdrEquivalent pressure curve of parallel primary CHW pumps – Headered pumps
Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParametersprePumHeaWatBalHpif 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 prePumHeaWatBalHdrPump pressure curve for HP HW balancing valve and pump speed calculation
Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParametersprePumChiWatBalHpif 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 prePumChiWatBalHdrPump pressure curve for HP CHW balancing valve and pump speed calculation
Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParametersprePumHeaWatBalPhpif 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 prePumHeaWatBalHdrPump pressure curve for polyvalent HP HW balancing valve and pump speed calculation
Buildings.Fluid.Movers.BaseClasses.Characteristics.flowParametersprePumChiWatBalPhpif 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 prePumChiWatBalHdrPump pressure curve for polyvalent HP CHW balancing valve and pump speed calculation
Modelica.Units.SI.PressureDifferencedpHeaWatLooBal_nominalif 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 0HW loop differential pressure at design flow rate used for balancing valve and pump speed calculation
Modelica.Units.SI.PressureDifferencedpChiWatLooBal_nominalif 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 0CHW loop differential pressure at design flow rate used for balancing valve and pump speed calculation
Modelica.Units.SI.PressureDifferencedpBalHeaWatHp_nominalif 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 0HP HW balancing valve pressure drop at design HW flow
Modelica.Units.SI.PressureDifferencedpBalChiWatHp_nominalif 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 0HP CHW balancing valve pressure drop at design CHW flow
Modelica.Units.SI.PressureDifferencedpBalHeaWatPhp_nominalif 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 0Polyvalent unit HW balancing valve pressure drop at design HW flow
Modelica.Units.SI.PressureDifferencedpBalChiWatPhp_nominalif 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 0Polyvalent unit CHW balancing valve pressure drop at design CHW flow
RealyPumHeaWatPriHdrSetPrimary HW pump speed providing design flow – Headered pumps
RealyPumChiWatPriHdrSetPrimary CHW pump speed providing design flow – Headered pumps
RealyPumHeaWatPriDedHpSetPrimary pump speed providing design flow in heating mode – HP dedicated pumps
RealyPumChiWatPriDedHpSetPrimary pump speed providing design flow in cooling mode – HP dedicated pumps
RealyPumHeaWatPriDedPhpSetPrimary HW pump speed providing design flow – Polyvalent HP dedicated pumps
RealyPumChiWatPriDedPhpSetPrimary CHW pump speed providing design flow – HP dedicated pumps
Configuration
Booleanhave_heaWat (from PartialHeatPumpPlant)trueSet to true if the plant provides HW
Booleanhave_chiWat (from PartialHeatPumpPlant)typ <> Buildings.Templates.Plants.Controls.Types.PlantHeatPump.HeatingOnlySet to true if the plant provides CHW
Booleanhave_hotWat (from PartialHeatPumpPlant)falseSet to true if the plant provides DHW
Buildings.Templates.Plants.HeatPumps.Types.DistributiontypDis_select1 (from PartialHeatPumpPlant)Buildings.Templates.Plants.HeatPumps.Types.Distribution.Constant1Variable2Type of distribution system
Buildings.Templates.Plants.HeatPumps.Types.DistributiontypDis_select2 (from PartialHeatPumpPlant)Type of distribution system
Heat pumps
Buildings.Templates.Components.Types.HeatPumptypHp (from PartialHeatPumpPlant)Type of heat pump
IntegernHp_select (from PartialHeatPumpPlant)Number of heat pumps (excluding polyvalent HPs)
polyvalent heat pumps
IntegernPhp_select (from PartialHeatPumpPlant)Number of polyvalent heat pumps
Primary loop
Buildings.Templates.Components.Types.PumpArrangementtypArrPumPri_select (from PartialHeatPumpPlant)Buildings.Templates.Components.Types.PumpArrangement.DedicatedType of primary pump arrangement
Buildings.Templates.Components.Types.PumpArrangementtypArrPumPri (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_selectType of primary pump arrangement
Booleanhave_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
Booleanhave_valHeaWatMinByp (from PartialHeatPumpPlant)have_heaWat and typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1OnlySet to true if the HW loop has a minimum flow bypass valve
Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimarytypPumPri_select (from PartialHeatPumpPlant)Buildings.Templates.Plants.HeatPumps.Types.PumpsPrimary.VariableType of CHW/HW primary pumps
IntegernPumHeaWatPri_select (from PartialHeatPumpPlant)nHp + nPhpNumber of primary HW pumps
IntegernPumHeaWatPri (from PartialHeatPumpPlant)if have_heaWat then (if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Headered then nPumHeaWatPri_select else nHp + nPhp) else 0Number of primary HW pumps
Buildings.Templates.Components.Types.IntegrationPointtypTanHeaWat_select (from PartialHeatPumpPlant)Buildings.Templates.Components.Types.IntegrationPoint.SupplySpecify if there is a HW buffer tank and where it is integrated into the system
Booleanhave_pumPriDedComHp_select (from PartialHeatPumpPlant)trueSet to true for HP with single dedicated primary pump serving both CHW and HW circuits
Booleanhave_pumPriDedComHp (from PartialHeatPumpPlant)if have_hp and have_chiWat and typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then have_pumPriDedComHp_select else falseSet to true for HP with single dedicated primary pump serving both CHW and HW circuits
Booleanhave_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
Booleanhave_valChiWatMinByp (from PartialHeatPumpPlant)have_chiWat and typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1OnlySet to true if the CHW loop has a minimum flow bypass valve
IntegernPumChiWatPri_select (from PartialHeatPumpPlant)nHp + nPhpNumber of primary CHW pumps
IntegernPumChiWatPri (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 0Number of primary CHW pumps
Buildings.Templates.Components.Types.IntegrationPointtypTanChiWat_select (from PartialHeatPumpPlant)Buildings.Templates.Components.Types.IntegrationPoint.ReturnSpecify if there is a CHW buffer tank and where it is integrated into the system
Secondary HW loop
Buildings.Templates.Plants.HeatPumps.Types.PumpsSecondarytypPumHeaWatSec (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.NoneType of secondary HW pumps
IntegernPumHeaWatSec_select (from PartialHeatPumpPlant)Number of secondary HW pumps
IntegernPumHeaWatSec (from PartialHeatPumpPlant)if not have_heaWat or typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1Only then 0 else nPumHeaWatSec_selectNumber of secondary HW pumps
Secondary CHW loop
Buildings.Templates.Plants.HeatPumps.Types.PumpsSecondarytypPumChiWatSec (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.NoneType of secondary CHW pumps
IntegernPumChiWatSec_select (from PartialHeatPumpPlant)Number of secondary CHW pumps
IntegernPumChiWatSec (from PartialHeatPumpPlant)if not have_chiWat or typDis == Buildings.Templates.Plants.HeatPumps.Types.Distribution.Variable1Only then 0 else nPumChiWatSec_selectNumber of secondary CHW pumps
Nominal condition
Modelica.Units.SI.TemperatureTChiWatRet_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.TChiWatRetCHW return temperature - Each heat pump
Dynamics › Conservation equations
Modelica.Fluid.Types.DynamicsenergyDynamics (from PartialHeatPumpPlant)Modelica.Fluid.Types.Dynamics.FixedInitialType of energy balance: dynamic (3 initialization options) or steady state
Assumptions
BooleanallowFlowReversal (from PartialHeatPumpPlant)true= true to allow flow reversal, false restricts to design direction (port_a -> port_b)
Advanced
Booleanlinearized (from PartialHeatPumpPlant)false= true, use linear relation between m_flow and dp for all valves
Booleanis_dpBalYPumSetCalfalseSet to true to automatically size balancing valves or evaluate pump speed providing design flow
Modelica.Units.SI.PressureDifferencedpHeaWatLoo_nominalHW loop differential pressure at design flow rate
Modelica.Units.SI.PressureDifferencedpChiWatLoo_nominalCHW loop differential pressure at design flow rate
Advanced › Diagnostics
Booleanshow_T (from PartialHeatPumpPlant)false= true, if actual temperature at port is computed

Connectors

TypeNameDefaultDescription
Modelica.Fluid.Interfaces.FluidPort_aport_aHeaWat (from PartialHeatPumpPlant)HW return
Modelica.Fluid.Interfaces.FluidPort_bport_bHeaWat (from PartialHeatPumpPlant)HW supply
Modelica.Fluid.Interfaces.FluidPort_aport_aChiWat (from PartialHeatPumpPlant)CHW return
Modelica.Fluid.Interfaces.FluidPort_bport_bChiWat (from PartialHeatPumpPlant)CHW supply
Buildings.Templates.Plants.HeatPumps.Interfaces.Busbus (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.BusbusWea (from PartialHeatPumpPlant)Weather bus

Components

TypeNameDefaultDescription
Buildings.Templates.Plants.HeatPumps.Components.Interfaces.PartialControllerctl (from PartialHeatPumpPlant)
Buildings.Fluid.Sources.Outsideout (from PartialHeatPumpPlant)Outdoor air conditions
Buildings.Fluid.Sensors.TemperatureTOut (from PartialHeatPumpPlant)OA temperature
Buildings.Templates.Plants.HeatPumps.Components.HeatPumpGroups.AirToWaterhpHeat pump group
Components.PumpsPrimaryDedicatedpumPriDedicated primary pumps
Components.ValvesIsolationvalIsoHeat pump isolation valves
Buildings.Templates.Components.Pumps.MultiplepumChiWatPriHeadered primary CHW pumps
Buildings.Templates.Components.Routing.SingleToMultipleinlPumChiWatPriPrimary CHW pumps inlet manifold
Buildings.Templates.Components.Routing.MultipleToSingleoutPumChiWatPriPrimary CHW pumps outlet manifold
Buildings.Templates.Components.Routing.PassThroughFluidsupChiWatPriPrimary CHW supply pipe - Plant with dedicated primary CHW pumps
Buildings.Templates.Components.Sensors.VolumeFlowRateVChiWatPri_flowPrimary CHW volume flow rate
Buildings.Templates.Components.Routing.JunctionjunChiWatBypSupFluid junction
Buildings.Templates.Components.Sensors.TemperatureTChiWatPriSupPrimary CHW supply temperature
Buildings.Templates.Components.Routing.JunctionjunChiWatBypRetFluid junction
Buildings.Templates.Components.Sensors.TemperatureTChiWatPriRetPrimary CHW return temperature
Buildings.Templates.Components.Actuators.ValvevalChiWatMinBypCHW minimum flow bypass valve or fixed bypass depending on type of distribution
Buildings.Templates.Components.Tanks.BuffertanChiWatSupCHW buffer tank
Buildings.Templates.Components.Tanks.BuffertanChiWatRetCHW buffer tank
Buildings.Templates.Components.Pumps.MultiplepumChiWatSecSecondary CHW pumps
Buildings.Templates.Components.Routing.SingleToMultipleinlPumChiWatSecSecondary CHW pumps inlet manifold
Buildings.Templates.Components.Routing.MultipleToSingleoutPumChiWatSecSecondary CHW pumps outlet manifold
Buildings.Templates.Components.Routing.PassThroughFluidsupChiWatSecSecondary CHW supply pipe - Plant without secondary CHW pumps
Buildings.Templates.Components.Sensors.VolumeFlowRateVChiWatLooOrSec_flowCHW loop (primary-only) or secondary (primary-secondary) volume flow rate
Buildings.Templates.Components.Sensors.TemperatureTChiWatSecSupSecondary CHW supply temperature
Buildings.Templates.Components.Sensors.TemperatureTChiWatLooOrSecRetCHW loop (primary-only) or secondary (primary-secondary) return temperature
Buildings.Templates.Components.Sensors.DifferentialPressuredpChiWatLocLocal CHW ∆p sensor
Buildings.Templates.Components.Routing.SingleToMultipleinlPumHeaWatPriPrimary HW pumps inlet manifold
Buildings.Templates.Components.Pumps.MultiplepumHeaWatPriHeadered primary HW pumps
Buildings.Templates.Components.Routing.MultipleToSingleoutPumHeaWatPriPrimary HW pumps outlet manifold
Buildings.Templates.Components.Routing.PassThroughFluidsupHeaWatPriPrimary HW supply pipe - Plant with dedicated primary HW pumps
Buildings.Templates.Components.Sensors.VolumeFlowRateVHeaWatPri_flowPrimary HW volume flow rate
Buildings.Templates.Components.Routing.JunctionjunHeaWatBypSupFluid junction
Buildings.Templates.Components.Sensors.TemperatureTHeaWatPriSupPrimary HW supply temperature
Buildings.Templates.Components.Sensors.TemperatureTHeaWatPriRetPrimary HW return temperature
Buildings.Templates.Components.Routing.JunctionjunHeaWatBypRetFluid junction
Buildings.Templates.Components.Actuators.ValvevalHeaWatMinBypHW minimum flow bypass valve or fixed bypass depending on type of distribution
Buildings.Templates.Components.Tanks.BuffertanHeaWatSupHW buffer tank
Buildings.Templates.Components.Tanks.BuffertanHeaWatRetHW buffer tank
Buildings.Templates.Components.Pumps.MultiplepumHeaWatSecSecondary HW pumps
Buildings.Templates.Components.Routing.SingleToMultipleinlPumHeaWatSecSecondary HW pumps inlet manifold
Buildings.Templates.Components.Routing.MultipleToSingleoutPumHeaWatSecSecondary HW pumps outlet manifold
Buildings.Templates.Components.Routing.PassThroughFluidsupHeaWatSecSecondary HW supply pipe - Plant without secondary HW pumps
Buildings.Templates.Components.Sensors.VolumeFlowRateVHeaWatLooOrSec_flowHW loop (primary-only) or secondary (primary-secondary) volume flow rate
Buildings.Templates.Components.Sensors.TemperatureTHeaWatSecSupSecondary HW supply temperature
Buildings.Templates.Components.Sensors.TemperatureTHeaWatLooOrSecRetHW loop (primary-only) or secondary (primary-secondary) return temperature
Buildings.Templates.Components.Sensors.DifferentialPressuredpHeaWatLocLocal HW ∆p sensor
Components.HeatRecoveryChillerhrcSidestream heat recovery chiller
Buildings.Templates.Components.Routing.JunctionjunHeaWatHrcEntFluid junction
Buildings.Templates.Components.Routing.JunctionjunHeaWatHrcLvgFluid junction
Buildings.Templates.Components.Routing.JunctionjunChiWatHrcEntFluid junction
Buildings.Templates.Components.Routing.JunctionjunChiWatHrcLvgFluid junction
Buildings.Templates.Components.Sensors.TemperatureTChiWatRetUpsHrcCHW return temperature upstream of HRC
Buildings.Templates.Components.Sensors.TemperatureTHeaWatRetUpsHrcHW return temperature upstream of HRC
Fluid.Sources.Boundary_pTbouHeaWatPressure boundary condition mimicking expansion tank
Fluid.Sources.Boundary_pTbouChiWatPressure boundary condition mimicking expansion tank

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.