Buildings.Templates.Plants.HeatPumps.Components

Package with component models

Information

This package contains component models that are used in the templates within Buildings.Templates.Plants.HeatPumps.

Extends from Modelica.Icons.VariantsPackage (Icon for package containing variants).

Package Content

Name Description
Buildings.Templates.Plants.HeatPumps.Components.HeatRecoveryChiller HeatRecoveryChiller Heat recovery chiller for sidestream integration
Buildings.Templates.Plants.HeatPumps.Components.PumpsPrimaryDedicated PumpsPrimaryDedicated Dedicated primary pumps
Buildings.Templates.Plants.HeatPumps.Components.ValvesIsolation ValvesIsolation Heat pump isolation valves
Buildings.Templates.Plants.HeatPumps.Components.Controls Controls Controllers
Buildings.Templates.Plants.HeatPumps.Components.HeatPumpGroups HeatPumpGroups Models for heat pump groups
Buildings.Templates.Plants.HeatPumps.Components.Data Data Records for design and operating parameters
Buildings.Templates.Plants.HeatPumps.Components.Validation Validation Package with validation models
Buildings.Templates.Plants.HeatPumps.Components.Interfaces Interfaces Interface classes

Buildings.Templates.Plants.HeatPumps.Components.HeatRecoveryChiller Buildings.Templates.Plants.HeatPumps.Components.HeatRecoveryChiller

Heat recovery chiller for sidestream integration

Buildings.Templates.Plants.HeatPumps.Components.HeatRecoveryChiller

Information

Model of a heat recovery chiller with constant speed CHW and HW pumps. The model is intended to represent the sidestream integration of a HRC into a heating and cooling plant. In such a configuration, the condenser is connected to the HW return and the evaporator is connected to the CHW return.

Control points

The following input and output points are available.

Extends from Buildings.Fluid.Interfaces.PartialFourPortInterface (Partial model with four ports and declaration of quantities that are used by many models).

Parameters

TypeNameDefaultDescription
replaceable package Medium1PartialMediumMedium 1 in the component
replaceable package Medium2PartialMediumMedium 2 in the component
replaceable package MediumChiWatBuildings.Media.WaterCHW medium
replaceable package MediumHeaWatBuildings.Media.WaterHW medium
PumpSingledatPumChiWat HRC CHW pump parameters
PumpSingledatPumHeaWat HRC HW pump parameters
ChillerdatHrc HRC parameters
HeatFlowRateQCon_flow_nominalhrc.QCon_flow_nominalDesign condenser heat flow rate [W]
TemperatureTConEnt_nominalhrc.TConEnt_nominalDesign condenser entering fluid temperature [K]
TemperatureTConLvg_nominalhrc.TConLvg_nominalDesign condenser leaving fluid temperature [K]
Nominal condition
MassFlowRatem1_flow_nominaldatHrc.mCon_flow_nominalNominal mass flow rate [kg/s]
MassFlowRatem2_flow_nominaldatHrc.mChiWat_flow_nominalNominal mass flow rate [kg/s]
Assumptions
BooleanallowFlowReversal1true= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1
BooleanallowFlowReversal2true= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 2
Advanced
MassFlowRatem1_flow_small1E-4*abs(m1_flow_nominal)Small mass flow rate for regularization of zero flow [kg/s]
MassFlowRatem2_flow_small1E-4*abs(m2_flow_nominal)Small mass flow rate for regularization of zero flow [kg/s]
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed
Dynamics
Nominal condition
TimetauHrc30HRC – Time constant at nominal flow, used if energy or mass balance is dynamic [s]
TimetauPum1Pump – Time constant of fluid volume for nominal flow, used if energy or mass balance is dynamic [s]
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state

Connectors

TypeNameDescription
replaceable package Medium1Medium 1 in the component
replaceable package Medium2Medium 2 in the component
FluidPort_aport_a1Fluid connector a1 (positive design flow direction is from port_a1 to port_b1)
FluidPort_bport_b1Fluid connector b1 (positive design flow direction is from port_a1 to port_b1)
FluidPort_aport_a2Fluid connector a2 (positive design flow direction is from port_a2 to port_b2)
FluidPort_bport_b2Fluid connector b2 (positive design flow direction is from port_a2 to port_b2)
replaceable package MediumChiWatCHW medium
replaceable package MediumHeaWatHW medium
BusbusPlant control bus

Modelica definition

model HeatRecoveryChiller "Heat recovery chiller for sidestream integration" extends Buildings.Fluid.Interfaces.PartialFourPortInterface( redeclare final package Medium1=MediumHeaWat, redeclare final package Medium2=MediumChiWat, final m1_flow_nominal=datHrc.mCon_flow_nominal, final m2_flow_nominal=datHrc.mChiWat_flow_nominal); /* RFE(AntoineGautier): IconMap is used above until the following PR is completed: https://github.com/ibpsa/modelica-ibpsa/issues/1781 Note that the extent annotation results in flipping the icon vertically (port_*2 at the top), which allows better integration into the HP plant diagram. Ideally, with PR#1781, port_a1 and port_b1 should be moved to be vertically aligned with port_a2 and port_b2, respectively. */ replaceable package MediumChiWat=Buildings.Media.Water constrainedby Modelica.Media.Interfaces.PartialMedium "CHW medium"; replaceable package MediumHeaWat=Buildings.Media.Water constrainedby Modelica.Media.Interfaces.PartialMedium "HW medium"; parameter Buildings.Templates.Components.Data.PumpSingle datPumChiWat "HRC CHW pump parameters"; parameter Buildings.Templates.Components.Data.PumpSingle datPumHeaWat "HRC HW pump parameters"; parameter Buildings.Templates.Components.Data.Chiller datHrc "HRC parameters"; final parameter Modelica.Units.SI.MassFlowRate mChiWat_flow_nominal=hrc.mChiWat_flow_nominal "Design CHW mass flow rate"; final parameter Modelica.Units.SI.MassFlowRate mCon_flow_nominal=hrc.mCon_flow_nominal "Design condenser cooling fluid mass flow rate"; final parameter Modelica.Units.SI.HeatFlowRate QChiWat_flow_nominal=hrc.QChiWat_flow_nominal "Design cooling heat flow rate"; final parameter Modelica.Units.SI.PressureDifference dpChiWat_nominal=hrc.dpChiWat_nominal "Design CHW pressure drop"; final parameter Modelica.Units.SI.PressureDifference dpCon_nominal=hrc.dpCon_nominal "Design condenser cooling fluid pressure drop"; final parameter Modelica.Units.SI.Temperature TChiWatSup_nominal=hrc.TChiWatSup_nominal "Design CHW supply temperature"; final parameter Modelica.Units.SI.Temperature TChiWatRet_nominal=hrc.TChiWatRet_nominal "Design CHW return temperature"; parameter Modelica.Units.SI.HeatFlowRate QCon_flow_nominal=hrc.QCon_flow_nominal "Design condenser heat flow rate"; parameter Modelica.Units.SI.Temperature TConEnt_nominal=hrc.TConEnt_nominal "Design condenser entering fluid temperature"; parameter Modelica.Units.SI.Temperature TConLvg_nominal=hrc.TConLvg_nominal "Design condenser leaving fluid temperature"; parameter Modelica.Units.SI.Time tauHrc=30 "HRC – Time constant at nominal flow, used if energy or mass balance is dynamic"; parameter Modelica.Units.SI.Time tauPum=1 "Pump – Time constant of fluid volume for nominal flow, used if energy or mass balance is dynamic"; parameter Modelica.Fluid.Types.Dynamics energyDynamics=Modelica.Fluid.Types.Dynamics.DynamicFreeInitial "Type of energy balance: dynamic (3 initialization options) or steady state"; Buildings.Templates.Plants.HeatPumps.Interfaces.Bus bus "Plant control bus"; Buildings.Templates.Components.Chillers.Compression hrc( redeclare final package MediumChiWat=MediumChiWat, redeclare final package MediumCon=MediumHeaWat, final dat=datHrc, final typ=Buildings.Templates.Components.Types.Chiller.WaterCooled, final have_switchover=true, final energyDynamics=energyDynamics, final tau=tauHrc, final allowFlowReversal1=allowFlowReversal1, final allowFlowReversal2=allowFlowReversal2, final show_T=show_T) "Heat recovery chiller"; Buildings.Templates.Components.Pumps.Single pumChiWat( have_var=false, have_valChe=false, redeclare final package Medium=MediumChiWat, final dat=datPumChiWat, final energyDynamics=energyDynamics, final tau=tauPum, final allowFlowReversal=allowFlowReversal2, final show_T=show_T) "HRC CHW pump"; Buildings.Templates.Components.Pumps.Single pumHeaWat( have_var=false, have_valChe=false, redeclare final package Medium=MediumHeaWat, final dat=datPumHeaWat, final energyDynamics=energyDynamics, final tau=tauPum, final allowFlowReversal=allowFlowReversal1, final show_T=show_T) "HRC HW pump"; equation connect(port_a1, pumHeaWat.port_a); connect(port_a2, pumChiWat.port_a); connect(pumChiWat.port_b, hrc.port_a2); connect(hrc.port_b2, port_b2); connect(pumHeaWat.port_b, hrc.port_a1); connect(hrc.port_b1, port_b1); connect(bus.hrc, hrc.bus); connect(bus.pumHeaWatHrc, pumHeaWat.bus); connect(bus.pumChiWatHrc, pumChiWat.bus); end HeatRecoveryChiller;

Buildings.Templates.Plants.HeatPumps.Components.PumpsPrimaryDedicated Buildings.Templates.Plants.HeatPumps.Components.PumpsPrimaryDedicated

Dedicated primary pumps

Buildings.Templates.Plants.HeatPumps.Components.PumpsPrimaryDedicated

Information

This model represents dedicated primary HW pumps and, optionally, separate dedicated primary CHW pumps if the parameter have_pumChiWatDedHp is set to true. The pump components are connected to the heat pump outlet, in a "pump away" configuration. Variable speed or constant speed pumps can be modeled by setting the parameters have_pumHeaWatPriVar and have_pumChiWatPriVar. If headered pumps are modeled (typArrPumPri=Buildings.Templates.Components.Types.PumpArrangement.Headered), this component resolves to a direct fluid pass-through.

Parameters

TypeNameDefaultDescription
replaceable package MediumBuildings.Media.WaterMedium model
IntegernPumHeaWat Number of primary HW pumps
IntegernPumChiWat Number of primary CHW pumps
PumpMultipledatPumHeaWatdatPumHeaWat(typ=if nPumHeaW...HW pump parameters
PumpMultipledatPumChiWatdatPumChiWat(typ=if nPumChiW...CHW pump parameters
Configuration
Booleanhave_hptrueSet to true for plants with non-reversible or reversible heat pumps
Booleanhave_phpfalseSet to true for plants with polyvalent heat pumps
IntegernHp Number of heat pumps (excluding polyvalent HPs)
IntegernPhp0Number of polyvalent heat pumps
PumpArrangementtypArrPumPri Type of primary pump arrangement
Booleanhave_pumPriComHp Set to true for HP with single dedicated primary pump serving both CHW and HW circuits
Booleanhave_pumHeaWatPriVar Set to true for variable speed primary HW pumps
Booleanhave_pumChiWatPriVar Set to true for variable speed primary CHW pumps
Nominal condition
PressureDifferencedpValCheHeaWat_nominal[nPumHeaWat]fill(if typArrPumPri == Buil...HW pump check valve pressure drop at design pump flow rate (selection conditions) [Pa]
PressureDifferencedpValCheChiWat_nominal[nPumChiWat]fill(if typArrPumPri == Buil...CHW pump check valve pressure drop at design pump flow rate (selection conditions) [Pa]
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
Nominal condition
Timetau1Time constant at nominal flow [s]
Assumptions
BooleanallowFlowReversaltrueSet to false to simplify equations, assuming, but not enforcing, no flow reversal

Connectors

TypeNameDescription
replaceable package MediumMedium model
FluidPorts_bports_bChiHeaWat[nHp]CHW/HW supply (to primary loop)
FluidPorts_aports_aChiHeaWat[nHp]CHW/HW return (from primary loop)
FluidPorts_bports_bChiHeaWatHp[nHp]CHW/HW return – HP entering
FluidPorts_bports_bHeaWat[nHp]HW supply (to primary loop) – HP with dedicated pumps and (heating-only or separate CHW and HW pumps)
FluidPorts_bports_bChiWat[nHp]CHW supply (to primary loop)
FluidPorts_aports_aChiHeaWatHp[nHp]CHW/HW supply (HP leaving)
BusbusPlant control bus
FluidPorts_aports_aHeaWat[nPhp]HW return (from primary loop) to polyvalent HP
FluidPorts_aports_aChiWat[nPhp]CHW return (from primary loop) to polyvalent HP
FluidPorts_bports_bHeaWatRetShc[nPhp]HW return – Polyvalent heat pump entering
FluidPorts_bports_bChiWatRetShc[nPhp]CHW return – Polyvalent heat pump entering
FluidPorts_aports_aHeaWatPhp[nPhp]HW supply – Polyvalent heat pump leaving
FluidPorts_aports_aChiWatPhp[nPhp]CHW supply – Polyvalent heat pump leaving
FluidPorts_bports_bChiWatSupShc[nPhp]CHW supply – Polyvalent heat pump leaving
FluidPorts_bports_bHeaWatSupShc[nPhp]HW supply – Polyvalent heat pump leaving

Modelica definition

model PumpsPrimaryDedicated "Dedicated primary pumps" replaceable package Medium = Buildings.Media.Water constrainedby Modelica.Media.Interfaces.PartialMedium "Medium model"; parameter Integer nPumHeaWat "Number of primary HW pumps"; parameter Integer nPumChiWat "Number of primary CHW pumps"; final parameter Integer idxConPumChiWat = if have_pumChiWatDedHp then nHp + 1 else 1 "Lowest index to connect polyvalent HP ports to primary CHW pump ports"; parameter Boolean have_hp = true "Set to true for plants with non-reversible or reversible heat pumps"; parameter Boolean have_php = false "Set to true for plants with polyvalent heat pumps"; parameter Integer nHp "Number of heat pumps (excluding polyvalent HPs)"; parameter Integer nPhp = 0 "Number of polyvalent heat pumps"; parameter Buildings.Templates.Components.Types.PumpArrangement typArrPumPri "Type of primary pump arrangement"; parameter Boolean have_pumPriComHp(start=false) "Set to true for HP with single dedicated primary pump serving both CHW and HW circuits"; final parameter Boolean have_pumChiWatDedHp = have_hp and nPumChiWat > 0 and typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated and not have_pumPriComHp "Set to true for HP with separate dedicated primary CHW pumps"; final parameter Boolean is_heaOnlHp = have_hp and nPumHeaWat > 0 and nPumChiWat == 0 and typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated and not have_pumPriComHp "Set to true for heating-only (non-reversible) HP with dedicated primary HW pumps"; parameter Boolean have_pumHeaWatPriVar(start=false) "Set to true for variable speed primary HW pumps"; parameter Boolean have_pumChiWatPriVar(start=false) "Set to true for variable speed primary CHW pumps"; parameter Buildings.Templates.Components.Data.PumpMultiple datPumHeaWat( typ=if nPumHeaWat > 0 then Buildings.Templates.Components.Types.Pump.Multiple else Buildings.Templates.Components.Types.Pump.None, nPum=nPumHeaWat) "HW pump parameters"; parameter Buildings.Templates.Components.Data.PumpMultiple datPumChiWat( typ=if nPumChiWat > 0 then Buildings.Templates.Components.Types.Pump.Multiple else Buildings.Templates.Components.Types.Pump.None, nPum=nPumChiWat) "CHW pump parameters"; parameter Modelica.Units.SI.PressureDifference dpValCheHeaWat_nominal[nPumHeaWat]( final min=fill(0, nPumHeaWat), start=fill( if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then Buildings.Templates.Data.Defaults.dpValChe else 0, nPumHeaWat)) = fill( if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated then Buildings.Templates.Data.Defaults.dpValChe else 0, nPumHeaWat) "HW pump check valve pressure drop at design pump flow rate (selection conditions)"; parameter Modelica.Units.SI.PressureDifference dpValCheChiWat_nominal[nPumChiWat]( final min=fill(0, nPumChiWat), start=fill( if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated and (have_pumChiWatDedHp or have_php) then Buildings.Templates.Data.Defaults.dpValChe else 0, nPumChiWat)) = fill( if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated and (have_pumChiWatDedHp or have_php) then Buildings.Templates.Data.Defaults.dpValChe else 0, nPumChiWat) "CHW pump check valve pressure drop at design pump flow rate (selection conditions)"; parameter Modelica.Fluid.Types.Dynamics energyDynamics = Modelica.Fluid.Types.Dynamics.DynamicFreeInitial "Type of energy balance: dynamic (3 initialization options) or steady state"; parameter Modelica.Units.SI.Time tau = 1 "Time constant at nominal flow"; parameter Boolean allowFlowReversal = true "Set to false to simplify equations, assuming, but not enforcing, no flow reversal"; Modelica.Fluid.Interfaces.FluidPorts_b ports_bChiHeaWat[nHp]( redeclare each final package Medium=Medium, each m_flow(max=if allowFlowReversal then +Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_hp and not have_pumChiWatDedHp "CHW/HW supply (to primary loop)"; Modelica.Fluid.Interfaces.FluidPorts_a ports_aChiHeaWat[nHp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_hp "CHW/HW return (from primary loop)"; Modelica.Fluid.Interfaces.FluidPorts_b ports_bChiHeaWatHp[nHp]( redeclare each final package Medium=Medium, each m_flow(max=if allowFlowReversal then +Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_hp "CHW/HW return – HP entering"; Modelica.Fluid.Interfaces.FluidPorts_b ports_bHeaWat[nHp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_pumChiWatDedHp or is_heaOnlHp "HW supply (to primary loop) – HP with dedicated pumps and (heating-only or separate CHW and HW pumps)"; Modelica.Fluid.Interfaces.FluidPorts_b ports_bChiWat[nHp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_pumChiWatDedHp "CHW supply (to primary loop)"; Modelica.Fluid.Interfaces.FluidPorts_a ports_aChiHeaWatHp[nHp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_hp "CHW/HW supply (HP leaving)"; Buildings.Templates.Plants.HeatPumps.Interfaces.Bus bus "Plant control bus"; Buildings.Templates.Components.Pumps.Multiple pumHeaWat( redeclare final package Medium=Medium, final have_var=have_pumHeaWatPriVar, final have_varCom=false, final nPum=nPumHeaWat, final dat=datPumHeaWat, final dpValChe_nominal=dpValCheHeaWat_nominal, final allowFlowReversal=allowFlowReversal, final tau=tau, final energyDynamics=energyDynamics) if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated and nPumHeaWat > 0 "Dedicated primary (HW) Pumps"; Buildings.Templates.Components.Pumps.Multiple pumChiWat( redeclare final package Medium=Medium, final have_var=have_pumChiWatPriVar, final have_varCom=false, final nPum=nPumChiWat, final dat=datPumChiWat, final dpValChe_nominal=dpValCheChiWat_nominal, final allowFlowReversal=allowFlowReversal, final tau=tau, final energyDynamics=energyDynamics) if typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Dedicated and nPumChiWat > 0 "Dedicated primary CHW pumps - Optional"; Buildings.Templates.Components.Routing.PassThroughFluid pasHdr[nHp]( redeclare each final package Medium=Medium) if have_hp and typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Headered "Direct fluid pass-through for headered primary pumps"; Fluid.FixedResistances.Junction junDedSep[nHp]( redeclare each final package Medium=Medium, final m_flow_nominal={{max( datPumHeaWat.m_flow_nominal[i], datPumChiWat.m_flow_nominal[i]), -datPumHeaWat.m_flow_nominal[i], -datPumChiWat.m_flow_nominal[i]} for i in 1:nHp}, dp_nominal=fill(fill(0, 3), nHp), each final energyDynamics=energyDynamics, each final portFlowDirection_1=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, each final portFlowDirection_2=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, each final portFlowDirection_3=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving) if have_pumChiWatDedHp "Fluid junction for separate dedicated primary pumps"; Buildings.Templates.Components.Routing.PassThroughFluid pasDedCom[nHp]( redeclare each final package Medium=Medium) if have_pumPriComHp or is_heaOnlHp "Direct fluid pass-through for dedicated pumps and (heating-only HP or common CHW/HW pump)"; Modelica.Fluid.Interfaces.FluidPorts_a ports_aHeaWat[nPhp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_php "HW return (from primary loop) to polyvalent HP"; Modelica.Fluid.Interfaces.FluidPorts_a ports_aChiWat[nPhp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_php "CHW return (from primary loop) to polyvalent HP"; Modelica.Fluid.Interfaces.FluidPorts_b ports_bHeaWatRetShc[nPhp]( redeclare each final package Medium=Medium, each m_flow(max=if allowFlowReversal then +Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_php "HW return – Polyvalent heat pump entering"; Modelica.Fluid.Interfaces.FluidPorts_b ports_bChiWatRetShc[nPhp]( redeclare each final package Medium=Medium, each m_flow(max=if allowFlowReversal then +Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_php "CHW return – Polyvalent heat pump entering"; Modelica.Fluid.Interfaces.FluidPorts_a ports_aHeaWatPhp[nPhp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_php "HW supply – Polyvalent heat pump leaving"; Modelica.Fluid.Interfaces.FluidPorts_a ports_aChiWatPhp[nPhp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_php "CHW supply – Polyvalent heat pump leaving"; Modelica.Fluid.Interfaces.FluidPorts_b ports_bChiWatSupShc[nPhp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_php "CHW supply – Polyvalent heat pump leaving"; Modelica.Fluid.Interfaces.FluidPorts_b ports_bHeaWatSupShc[nPhp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_php "HW supply – Polyvalent heat pump leaving"; Buildings.Templates.Components.Routing.PassThroughFluid pasHdrHeaWatShc[nPhp]( redeclare each final package Medium=Medium) if have_php and typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Headered "Direct fluid pass-through for headered primary pumps"; Buildings.Templates.Components.Routing.PassThroughFluid pasHdrChiWatShc[nPhp]( redeclare each final package Medium=Medium) if have_php and typArrPumPri == Buildings.Templates.Components.Types.PumpArrangement.Headered "Direct fluid pass-through for headered primary pumps"; protected Buildings.Templates.Components.Interfaces.Bus busPumHeaWatPri "Primary HW pump control bus"; Buildings.Templates.Components.Interfaces.Bus busPumChiWatPri "Primary CHW pump control bus"; equation connect(bus.pumHeaWatPri, busPumHeaWatPri); connect(bus.pumChiWatPri, busPumChiWatPri); connect(busPumHeaWatPri, pumHeaWat.bus); connect(busPumChiWatPri, pumChiWat.bus); connect(ports_aChiHeaWat, ports_bChiHeaWatHp); connect(pasHdr.port_b, ports_bChiHeaWat); connect(ports_aChiHeaWatHp, junDedSep.port_1); connect(ports_aHeaWat, ports_bHeaWatRetShc); connect(ports_aChiWat, ports_bChiWatRetShc); connect(ports_aHeaWatPhp, pumHeaWat.ports_a[nHp + 1:nHp + nPhp]); connect(ports_aChiWatPhp, pumChiWat.ports_a[idxConPumChiWat:idxConPumChiWat + nPhp - 1]); connect(pumHeaWat.ports_b[nHp + 1:nHp + nPhp], ports_bHeaWatSupShc); connect(pumChiWat.ports_b[idxConPumChiWat:idxConPumChiWat + nPhp - 1], ports_bChiWatSupShc); connect(junDedSep.port_2, pumHeaWat.ports_a[1:nHp]); connect(junDedSep.port_3, pumChiWat.ports_a[1:nHp]); connect(pasDedCom.port_b, pumHeaWat.ports_a[1:nHp]); connect(ports_aChiWatPhp, pasHdrChiWatShc.port_a); connect(pasHdrChiWatShc.port_b, ports_bChiWatSupShc); connect(ports_aHeaWatPhp, pasHdrHeaWatShc.port_a); connect(pasHdrHeaWatShc.port_b, ports_bHeaWatSupShc); connect(pumHeaWat.ports_b[1:nHp], ports_bHeaWat); connect(pumChiWat.ports_b[1:nHp], ports_bChiWat); connect(ports_aChiHeaWatHp, pasHdr.port_a); connect(ports_aChiHeaWatHp, pasDedCom.port_a); connect(pumHeaWat.ports_b[1:nHp], ports_bChiHeaWat); end PumpsPrimaryDedicated;

Buildings.Templates.Plants.HeatPumps.Components.ValvesIsolation Buildings.Templates.Plants.HeatPumps.Components.ValvesIsolation

Heat pump isolation valves

Buildings.Templates.Plants.HeatPumps.Components.ValvesIsolation

Information

This model represents the heat pump isolation valves. The isolation valves are modeled as two-way two-position valves, which can be located at the heat pump inlet and/or outlet depending on the settings of the parameters have_valHpInlIso and have_valHpOutIso. It is assumed that the heat pumps always provide heating hot water. Optionally, chilled water return and supply and the associated isolation valves can be modeled by setting the parameter have_chiWat to true.

Parameters

TypeNameDefaultDescription
replaceable package MediumBuildings.Media.WaterMedium model
Configuration
Booleanhave_chiWattrueSet to true if the plant provides CHW
Booleanhave_hptrueSet to true for plants with non-reversible or reversible heat pumps
Booleanhave_phpfalseSet to true for plants with polyvalent heat pumps
IntegernHp Number of heat pumps (excluding polyvalent HPs)
IntegernPhp0Number of polyvalent heat pumps
Booleanhave_valHpInlIsofalseSet to true for isolation valves at HP inlet
Booleanhave_valHpOutIsofalseSet to true for isolation valves at HP outlet
Booleanhave_valPhpInlIsofalseSet to true for isolation valves at polyvalent HP inlet
Booleanhave_valPhpOutIsofalseSet to true for isolation valves at polyvalent HP outlet
Booleanhave_pumChiWatDedHpfalseSet to true for HP with separate dedicated primary CHW pumps
Nominal condition
MassFlowRatemHeaWatUni_flow_nominal[nHp + nPhp] HW mass flow rate - Each unit [kg/s]
PressureDifferencedpHeaWatUni_nominal[nHp + nPhp] Pressure drop at design HW mass flow rate - Each unit [Pa]
PressureDifferencedpBalHeaWatUni_nominal[nHp + nPhp]fill(0, nHp + nPhp)Balancing valve pressure drop at design HW mass flow rate - Each unit [Pa]
MassFlowRatemChiWatUni_flow_nominal[nHp + nPhp] CHW mass flow rate - Each unit [kg/s]
PressureDifferencedpChiWatPhp_nominal[nPhp] Pressure drop at design CHW mass flow rate - Each polyvalent HP [Pa]
PressureDifferencedpBalChiWatUni_nominal[nHp + nPhp]fill(0, nHp + nPhp)Balancing valve pressure drop at design CHW mass flow rate - Each unit [Pa]
PressureDifferencedpValveHeaWat_nominal[nHp + nPhp]fill(Buildings.Templates.Dat...HW isolation valve pressure drop (identical for inlet and outlet valves) [Pa]
PressureDifferencedpValveChiWat_nominal[nHp + nPhp]if have_chiWat then fill(Bui...Isolation valve CHW pressure drop (identical for inlet and outlet valves) [Pa]
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
Nominal condition
Timetau10Time constant at nominal flow [s]
Time needed to open or close valve
Booleanuse_strokeTimeenergyDynamics <> Modelica.F...Set to true to continuously open and close valve
TimestrokeTime120Time needed to open or close valve [s]
InitinitModelica.Blocks.Types.Init.I...Type of initialization (no init/steady state/initial state/initial output)
Realy_start1Initial position of actuator
Assumptions
BooleanallowFlowReversaltrueSet to false to simplify equations, assuming, but not enforcing, no flow reversal
Advanced
Booleanfrom_dptrue= true, use m_flow = f(dp) else dp = f(m_flow)
Booleanlinearizedfalse= true, use linear relation between m_flow and dp for any flow rate

Connectors

TypeNameDescription
replaceable package MediumMedium model
FluidPort_bport_bChiWatCHW supply (to primary loop)
FluidPort_aport_aChiWatCHW return (from primary loop)
FluidPort_bport_bHeaWatHW supply (to primary loop)
FluidPort_aport_aHeaWatHW return (from primary loop)
FluidPorts_bports_bChiHeaWatHp[nHp]CHW/HW return – HP entering
FluidPorts_aports_aChiHeaWatHp[nHp]CHW/HW supply – HP leaving
FluidPorts_aports_aHeaWatHp[nHp]HW supply – HP leaving
FluidPorts_aports_aChiWatHp[nHp]CHW supply – HP leaving
BusbusPlant control bus
FluidPorts_bports_bChiWatPhp[nPhp]CHW return – Polyvalent heat pump entering
FluidPorts_bports_bHeaWatPhp[nPhp]HW return – Polyvalent heat pump entering
FluidPorts_aports_aHeaWatPhp[nPhp]HW supply – Polyvalent heat pump leaving
FluidPorts_aports_aChiWatPhp[nPhp]CHW supply – Polyvalent heat pump leaving

Modelica definition

model ValvesIsolation "Heat pump isolation valves" replaceable package Medium = Buildings.Media.Water constrainedby Modelica.Media.Interfaces.PartialMedium "Medium model"; final parameter Buildings.Templates.Components.Types.Valve typValHpInlIso = if have_valHpInlIso then Buildings.Templates.Components.Types.Valve.TwoWayTwoPosition else Buildings.Templates.Components.Types.Valve.None "Valve type at HP inlet"; final parameter Buildings.Templates.Components.Types.Valve typValHpOutIso = if have_valHpOutIso then Buildings.Templates.Components.Types.Valve.TwoWayTwoPosition else Buildings.Templates.Components.Types.Valve.None "Valve type at HP outlet"; final parameter Buildings.Templates.Components.Types.Valve typValPhpInlIso = if have_valPhpInlIso then Buildings.Templates.Components.Types.Valve.TwoWayTwoPosition else Buildings.Templates.Components.Types.Valve.None "Valve type at polyvalent HP inlet"; final parameter Buildings.Templates.Components.Types.Valve typValPhpOutIso = if have_valPhpOutIso then Buildings.Templates.Components.Types.Valve.TwoWayTwoPosition else Buildings.Templates.Components.Types.Valve.None "Valve type at polyvalent HP outlet"; parameter Boolean have_chiWat = true "Set to true if the plant provides CHW"; parameter Boolean have_hp = true "Set to true for plants with non-reversible or reversible heat pumps"; parameter Boolean have_php = false "Set to true for plants with polyvalent heat pumps"; parameter Integer nHp "Number of heat pumps (excluding polyvalent HPs)"; parameter Integer nPhp = 0 "Number of polyvalent heat pumps"; parameter Boolean have_valHpInlIso = false "Set to true for isolation valves at HP inlet"; parameter Boolean have_valHpOutIso = false "Set to true for isolation valves at HP outlet"; parameter Boolean have_valPhpInlIso = false "Set to true for isolation valves at polyvalent HP inlet"; parameter Boolean have_valPhpOutIso = false "Set to true for isolation valves at polyvalent HP outlet"; parameter Boolean have_pumChiWatDedHp = false "Set to true for HP with separate dedicated primary CHW pumps"; parameter Modelica.Units.SI.MassFlowRate mHeaWatUni_flow_nominal[nHp + nPhp]( each final min=0) "HW mass flow rate - Each unit "; parameter Modelica.Units.SI.PressureDifference dpHeaWatUni_nominal[nHp + nPhp]( each final min=0, each start=Buildings.Templates.Data.Defaults.dpHeaWatHp) "Pressure drop at design HW mass flow rate - Each unit"; parameter Modelica.Units.SI.PressureDifference dpBalHeaWatUni_nominal[nHp + nPhp](each final min=0) = fill(0, nHp + nPhp) "Balancing valve pressure drop at design HW mass flow rate - Each unit"; parameter Modelica.Units.SI.MassFlowRate mChiWatUni_flow_nominal[nHp + nPhp]( each final min=0, each start=0) "CHW mass flow rate - Each unit"; parameter Modelica.Units.SI.PressureDifference dpChiWatPhp_nominal[nPhp]( each final min=0, each start=0) "Pressure drop at design CHW mass flow rate - Each polyvalent HP"; final parameter Modelica.Units.SI.PressureDifference dpChiWatUni_nominal[nHp + nPhp] = if have_hp and have_php then cat( 1, dpHeaWatUni_nominal[1:nHp] .* (mChiWatUni_flow_nominal[1:nHp] ./ mHeaWatUni_flow_nominal[1:nHp]) .^ 2, dpChiWatPhp_nominal) elseif have_hp then dpHeaWatUni_nominal[1:nHp] .* (mChiWatUni_flow_nominal[1:nHp] ./ mHeaWatUni_flow_nominal[1:nHp]) .^ 2 else dpChiWatPhp_nominal "Pressure drop at design CHW mass flow rate - Each unit"; parameter Modelica.Units.SI.PressureDifference dpBalChiWatUni_nominal[nHp + nPhp](each final min=0, each start=0) = fill(0, nHp + nPhp) "Balancing valve pressure drop at design CHW mass flow rate - Each unit"; parameter Modelica.Units.SI.PressureDifference dpValveHeaWat_nominal[nHp + nPhp](each final min=0) = fill( Buildings.Templates.Data.Defaults.dpValIso, nHp + nPhp) "HW isolation valve pressure drop (identical for inlet and outlet valves)"; final parameter Modelica.Units.SI.PressureDifference dpFixedHeaWat_nominal[nHp + nPhp] = dpHeaWatUni_nominal + dpBalHeaWatUni_nominal "Fixed HW pressure drop: HP + balancing valve"; // The following two parameters are intended for external use. /* * HACK(AntoineGautier) * The annotation 'Evaluate=true' below is required to avoid a compilation * error in the validation model with OCT 1.66. */ final parameter Modelica.Units.SI.PressureDifference dpHeaWatVal_nominal[nHp + nPhp] = if have_hp and have_php then cat( 1, dpValveHeaWat_nominal[1:nHp] * ((if have_valHpInlIso then 1 else 0) + (if have_valHpOutIso then 1 else 0)), dpValveHeaWat_nominal[nHp + 1:nHp + nPhp] * ((if have_valPhpInlIso then 1 else 0) + (if have_valPhpOutIso then 1 else 0))) elseif have_hp then dpValveHeaWat_nominal[1:nHp] * ((if have_valHpInlIso then 1 else 0) + (if have_valHpOutIso then 1 else 0)) else dpValveHeaWat_nominal[nHp + 1:nHp + nPhp] * ((if have_valPhpInlIso then 1 else 0) + (if have_valPhpOutIso then 1 else 0)) "Total HW pressure drop for inlet and outlet valves"; final parameter Modelica.Units.SI.PressureDifference dpHeaWat_nominal[nHp + nPhp] = dpFixedHeaWat_nominal .+ dpHeaWatVal_nominal "Total HW pressure drop: fixed + valves"; parameter Modelica.Units.SI.PressureDifference dpValveChiWat_nominal[nHp + nPhp](each final min=0, each start=0) = if have_chiWat then fill(Buildings.Templates.Data.Defaults.dpValIso, nHp + nPhp) else fill(0, nHp + nPhp) "Isolation valve CHW pressure drop (identical for inlet and outlet valves)"; final parameter Modelica.Units.SI.PressureDifference dpFixedChiWat_nominal[nHp + nPhp] = if have_chiWat then dpBalChiWatUni_nominal + dpChiWatUni_nominal else fill(0, nHp + nPhp) "Total fixed CHW pressure drop"; // The following two parameters are intended for external use. final parameter Modelica.Units.SI.PressureDifference dpChiWatVal_nominal[nHp + nPhp] = if have_hp and have_php then cat( 1, dpValveChiWat_nominal[1:nHp] * ((if have_valHpInlIso then 1 else 0) + (if have_valHpOutIso then 1 else 0)), dpValveChiWat_nominal[nHp + 1:nHp + nPhp] * ((if have_valPhpInlIso then 1 else 0) + (if have_valPhpOutIso then 1 else 0))) elseif have_hp then dpValveChiWat_nominal[1:nHp] * ((if have_valHpInlIso then 1 else 0) + (if have_valHpOutIso then 1 else 0)) else dpValveChiWat_nominal[nHp + 1:nHp + nPhp] * ((if have_valPhpInlIso then 1 else 0) + (if have_valPhpOutIso then 1 else 0)) "Total CHW pressure drop for inlet and outlet valves"; final parameter Modelica.Units.SI.PressureDifference dpChiWat_nominal[nHp + nPhp] = if have_chiWat then dpFixedChiWat_nominal .+ dpChiWatVal_nominal else fill(0, nHp + nPhp) "Total CHW pressure drop: fixed + valves"; // We include the fixed resistance prioritarily where isolation valves are used. // If no isolation valves are used, the fixed resistance is included at outlet. final parameter Buildings.Templates.Components.Data.Valve datValHeaWatUniOutIso[nHp + nPhp]( typ=cat(1, fill(typValHpOutIso, nHp), fill(typValPhpOutIso, nPhp)), m_flow_nominal=mHeaWatUni_flow_nominal, dpValve_nominal=dpValveHeaWat_nominal, dpFixed_nominal=dpFixedHeaWat_nominal .* cat( 1, fill( if have_hp and (have_valHpOutIso or not have_valHpOutIso and not have_valHpInlIso) then 1 else 0, nHp), fill( if have_php and (have_valPhpOutIso or not have_valPhpOutIso and not have_valPhpInlIso) then 1 else 0, nPhp))) "Unit outlet HW isolation valve parameters"; final parameter Buildings.Templates.Components.Data.Valve datValHeaWatUniInlIso[nHp + nPhp]( typ=cat(1, fill(typValHpInlIso, nHp), fill(typValPhpInlIso, nPhp)), m_flow_nominal=mHeaWatUni_flow_nominal, dpValve_nominal=dpValveHeaWat_nominal, dpFixed_nominal=dpFixedHeaWat_nominal .* cat( 1, fill( if have_hp and not have_valHpOutIso and have_valHpInlIso then 1 else 0, nHp), fill( if have_php and not have_valPhpOutIso and have_valPhpInlIso then 1 else 0, nPhp))) "Unit inlet HW isolation valve parameters"; final parameter Buildings.Templates.Components.Data.Valve datValChiWatUniOutIso[nHp + nPhp]( typ=cat(1, fill(typValHpOutIso, nHp), fill(typValPhpOutIso, nPhp)), m_flow_nominal=mChiWatUni_flow_nominal, dpValve_nominal=dpValveChiWat_nominal, dpFixed_nominal=dpFixedChiWat_nominal .* cat( 1, fill( if have_hp and (have_valHpOutIso or not have_valHpOutIso and not have_valHpInlIso) then 1 else 0, nHp), fill( if have_php and (have_valPhpOutIso or not have_valPhpOutIso and not have_valPhpInlIso) then 1 else 0, nPhp))) "Unit outlet CHW isolation valve parameters"; final parameter Buildings.Templates.Components.Data.Valve datValChiWatUniInlIso[nHp + nPhp]( typ=cat(1, fill(typValHpInlIso, nHp), fill(typValPhpInlIso, nPhp)), m_flow_nominal=mChiWatUni_flow_nominal, dpValve_nominal=dpValveChiWat_nominal, dpFixed_nominal=dpFixedChiWat_nominal .* cat( 1, fill( if have_hp and not have_valHpOutIso and have_valHpInlIso then 1 else 0, nHp), fill( if have_php and not have_valPhpOutIso and have_valPhpInlIso then 1 else 0, nPhp))) "Heat pump inlet CHW isolation valve parameters"; parameter Modelica.Fluid.Types.Dynamics energyDynamics = Modelica.Fluid.Types.Dynamics.DynamicFreeInitial "Type of energy balance: dynamic (3 initialization options) or steady state"; parameter Modelica.Units.SI.Time tau = 10 "Time constant at nominal flow"; parameter Boolean allowFlowReversal = true "Set to false to simplify equations, assuming, but not enforcing, no flow reversal"; parameter Boolean use_strokeTime = energyDynamics <> Modelica.Fluid.Types.Dynamics.SteadyState "Set to true to continuously open and close valve"; parameter Modelica.Units.SI.Time strokeTime = 120 "Time needed to open or close valve"; parameter Modelica.Blocks.Types.Init init = Modelica.Blocks.Types.Init.InitialOutput "Type of initialization (no init/steady state/initial state/initial output)"; parameter Real y_start = 1 "Initial position of actuator"; parameter Boolean from_dp = true "= true, use m_flow = f(dp) else dp = f(m_flow)"; parameter Boolean linearized = false "= true, use linear relation between m_flow and dp for any flow rate"; Modelica.Fluid.Interfaces.FluidPort_b port_bChiWat( redeclare final package Medium=Medium, m_flow(max=if allowFlowReversal then +Modelica.Constants.inf else 0), h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_chiWat "CHW supply (to primary loop)"; Modelica.Fluid.Interfaces.FluidPort_a port_aChiWat( redeclare final package Medium=Medium, m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_chiWat "CHW return (from primary loop)"; Modelica.Fluid.Interfaces.FluidPort_b port_bHeaWat( redeclare final package Medium=Medium, m_flow(max=if allowFlowReversal then +Modelica.Constants.inf else 0), h_outflow(start=Medium.h_default, nominal=Medium.h_default)) "HW supply (to primary loop)"; Modelica.Fluid.Interfaces.FluidPort_a port_aHeaWat( redeclare final package Medium=Medium, m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), h_outflow(start=Medium.h_default, nominal=Medium.h_default)) "HW return (from primary loop)"; Modelica.Fluid.Interfaces.FluidPorts_b ports_bChiHeaWatHp[nHp]( redeclare each final package Medium=Medium, each m_flow(max=if allowFlowReversal then +Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_hp "CHW/HW return – HP entering"; Modelica.Fluid.Interfaces.FluidPorts_a ports_aChiHeaWatHp[nHp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_hp and not have_pumChiWatDedHp "CHW/HW supply – HP leaving"; Modelica.Fluid.Interfaces.FluidPorts_a ports_aHeaWatHp[nHp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_hp and have_pumChiWatDedHp "HW supply – HP leaving"; Modelica.Fluid.Interfaces.FluidPorts_a ports_aChiWatHp[nHp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_hp and have_chiWat and have_pumChiWatDedHp "CHW supply – HP leaving"; Buildings.Templates.Plants.HeatPumps.Interfaces.Bus bus "Plant control bus"; Buildings.Templates.Components.Actuators.Valve valHeaWatUniOutIso[nHp + nPhp]( redeclare each final package Medium=Medium, each chaTwo=Buildings.Templates.Components.Types.ValveCharacteristicTwoWay.Linear, final dat=datValHeaWatUniOutIso, final typ=cat(1, fill(typValHpOutIso, nHp), fill(typValPhpOutIso, nPhp)), each final use_strokeTime=use_strokeTime, each final strokeTime=strokeTime, each final init=init, each final y_start=y_start, each final from_dp=from_dp, each final linearized=linearized) "Unit outlet HW isolation valve"; Buildings.Templates.Components.Actuators.Valve valChiWatUniOutIso[nHp + nPhp]( redeclare each final package Medium=Medium, each chaTwo=Buildings.Templates.Components.Types.ValveCharacteristicTwoWay.Linear, final dat=datValChiWatUniOutIso, final typ=cat(1, fill(typValHpOutIso, nHp), fill(typValPhpOutIso, nPhp)), each final use_strokeTime=use_strokeTime, each final strokeTime=strokeTime, each final init=init, each final y_start=y_start, each final from_dp=from_dp, each final linearized=linearized) if have_chiWat "Unit outlet CHW isolation valve"; Buildings.Templates.Components.Actuators.Valve valHeaWatUniInlIso[nHp + nPhp]( redeclare each final package Medium=Medium, each chaTwo=Buildings.Templates.Components.Types.ValveCharacteristicTwoWay.Linear, final dat=datValHeaWatUniInlIso, final typ=cat(1, fill(typValHpInlIso, nHp), fill(typValPhpInlIso, nPhp)), each final use_strokeTime=use_strokeTime, each final strokeTime=strokeTime, each final init=init, each final y_start=y_start, each final from_dp=from_dp, each final linearized=linearized) "Unit inlet HW isolation valve"; Buildings.Templates.Components.Actuators.Valve valChiWatUniInlIso[nHp + nPhp]( redeclare each final package Medium=Medium, each chaTwo=Buildings.Templates.Components.Types.ValveCharacteristicTwoWay.Linear, final dat=datValChiWatUniInlIso, final typ=cat(1, fill(typValHpInlIso, nHp), fill(typValPhpInlIso, nPhp)), each final use_strokeTime=use_strokeTime, each final strokeTime=strokeTime, each final init=init, each final y_start=y_start, each final from_dp=from_dp, each final linearized=linearized) if have_chiWat "Unit inlet CHW isolation valve"; Fluid.Delays.DelayFirstOrder junHeaWatSup( redeclare final package Medium=Medium, final tau=tau, final m_flow_nominal=sum(mHeaWatUni_flow_nominal), final energyDynamics=energyDynamics, final allowFlowReversal=allowFlowReversal, final prescribedHeatFlowRate=false, final nPorts=nHp + 1 + (if have_php then nPhp else 0)) "Fluid volume at junction"; Fluid.Delays.DelayFirstOrder junChiWatSup( redeclare final package Medium=Medium, final tau=tau, final m_flow_nominal=sum(mChiWatUni_flow_nominal), final energyDynamics=energyDynamics, final allowFlowReversal=allowFlowReversal, final prescribedHeatFlowRate=false, final nPorts=nHp + 1 + (if have_php then nPhp else 0)) if have_chiWat "Fluid volume at junction"; Fluid.Delays.DelayFirstOrder junHeaWatRet( redeclare final package Medium=Medium, final tau=tau, final m_flow_nominal=sum(mHeaWatUni_flow_nominal), final energyDynamics=energyDynamics, final allowFlowReversal=allowFlowReversal, final prescribedHeatFlowRate=false, final nPorts=nHp + 1 + (if have_php then nPhp else 0)) "Fluid volume at junction"; Fluid.Delays.DelayFirstOrder junChiWatRet( redeclare final package Medium=Medium, final tau=tau, final m_flow_nominal=sum(mChiWatUni_flow_nominal), final energyDynamics=energyDynamics, final allowFlowReversal=allowFlowReversal, final prescribedHeatFlowRate=false, final nPorts=nHp + 1 + (if have_php then nPhp else 0)) if have_chiWat "Fluid volume at junction"; Modelica.Fluid.Interfaces.FluidPorts_b ports_bChiWatPhp[nPhp]( redeclare each final package Medium=Medium, each m_flow(max=if allowFlowReversal then +Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_php "CHW return – Polyvalent heat pump entering"; Modelica.Fluid.Interfaces.FluidPorts_b ports_bHeaWatPhp[nPhp]( redeclare each final package Medium=Medium, each m_flow(max=if allowFlowReversal then +Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_php "HW return – Polyvalent heat pump entering"; Modelica.Fluid.Interfaces.FluidPorts_a ports_aHeaWatPhp[nPhp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_php "HW supply – Polyvalent heat pump leaving"; Modelica.Fluid.Interfaces.FluidPorts_a ports_aChiWatPhp[nPhp]( redeclare each final package Medium=Medium, each m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow(start=Medium.h_default, nominal=Medium.h_default)) if have_php "CHW supply – Polyvalent heat pump leaving"; protected Buildings.Templates.Components.Interfaces.Bus busValHeaWatHpInlIso[nHp] if have_valHpInlIso "HP inlet HW isolation valve control bus"; Buildings.Templates.Components.Interfaces.Bus busValHeaWatHpOutIso[nHp] if have_valHpOutIso "HP outlet HW isolation valve control bus"; Buildings.Templates.Components.Interfaces.Bus busValChiWatHpInlIso[nHp] if have_chiWat and have_valHpInlIso "Heat pump inlet CHW isolation valve control bus"; Buildings.Templates.Components.Interfaces.Bus busValChiWatHpOutIso[nHp] if have_chiWat and have_valHpOutIso "Heat pump outlet CHW isolation valve control bus"; Buildings.Templates.Components.Interfaces.Bus busValHeaWatPhpOutIso[nPhp] if have_php and have_valPhpOutIso "Polyvalent HP outlet HW isolation valve control bus"; Buildings.Templates.Components.Interfaces.Bus busValChiWatPhpOutIso[nPhp] if have_php and have_valPhpOutIso "Polyvalent HP outlet CHW isolation valve control bus"; protected Buildings.Templates.Components.Interfaces.Bus busValHeaWatPhpInlIso[nPhp] if have_php and have_valPhpInlIso "Polyvalent HP inlet HW isolation valve control bus"; Buildings.Templates.Components.Interfaces.Bus busValChiWatPhpInlIso[nPhp] if have_php and have_valPhpInlIso "Polyvalent HP inlet CHW isolation valve control bus"; equation /* * HACK(AntoineGautier) * Array slice expansion with potential heterogeneous conditionality * is not supported in connect statements: a for loop is required. */ if have_hp then for i in 1:nHp loop connect(busValHeaWatHpInlIso[i], valHeaWatUniInlIso[i].bus); connect(busValChiWatHpInlIso[i], valChiWatUniInlIso[i].bus); connect(busValHeaWatHpOutIso[i], valHeaWatUniOutIso[i].bus); connect(busValChiWatHpOutIso[i], valChiWatUniOutIso[i].bus); end for; end if; if have_php then for i in 1:nPhp loop connect(busValChiWatPhpOutIso[i], valChiWatUniOutIso[nHp + i].bus); connect(busValChiWatPhpInlIso[i], valChiWatUniInlIso[nHp + i].bus); connect(busValHeaWatPhpInlIso[i], valHeaWatUniInlIso[nHp + i].bus); connect(busValHeaWatPhpOutIso[i], valHeaWatUniOutIso[nHp + i].bus); end for; end if; connect(bus.valHeaWatHpInlIso, busValHeaWatHpInlIso); connect(bus.valHeaWatHpOutIso, busValHeaWatHpOutIso); connect(bus.valChiWatHpInlIso, busValChiWatHpInlIso); connect(bus.valChiWatHpOutIso, busValChiWatHpOutIso); connect(valHeaWatUniOutIso.port_b, junHeaWatSup.ports[1:nHp + nPhp]); connect(junHeaWatSup.ports[nHp + nPhp + 1], port_bHeaWat); connect(valChiWatUniOutIso.port_b, junChiWatSup.ports[1:nHp + nPhp]); connect(port_bChiWat, junChiWatSup.ports[nHp + nPhp + 1]); connect(port_aHeaWat, junHeaWatRet.ports[nHp + nPhp + 1]); connect(port_aChiWat, junChiWatRet.ports[nHp + nPhp + 1]); connect(junHeaWatRet.ports[1:nHp + nPhp], valHeaWatUniInlIso.port_a); connect(valChiWatUniInlIso.port_a, junChiWatRet.ports[1:nHp + nPhp]); connect(valChiWatUniInlIso[nHp + 1:nHp + nPhp].port_b, ports_bChiWatPhp); connect(valHeaWatUniInlIso[nHp + 1:nHp + nPhp].port_b, ports_bHeaWatPhp); connect(bus.valHeaWatPhpOutIso, busValHeaWatPhpOutIso); connect(bus.valHeaWatPhpInlIso, busValHeaWatPhpInlIso); connect(bus.valChiWatPhpOutIso, busValChiWatPhpOutIso); connect(bus.valChiWatPhpInlIso, busValChiWatPhpInlIso); connect(ports_aChiWatHp, valChiWatUniOutIso[1:nHp].port_a); connect(ports_aHeaWatHp, valHeaWatUniOutIso[1:nHp].port_a); connect(ports_aChiWatPhp, valChiWatUniOutIso[nHp + 1:nHp + nPhp].port_a); connect(ports_aHeaWatPhp, valHeaWatUniOutIso[nHp + 1:nHp + nPhp].port_a); connect(ports_aChiHeaWatHp, valChiWatUniOutIso[1:nHp].port_a); connect(ports_aChiHeaWatHp, valHeaWatUniOutIso[1:nHp].port_a); connect(valHeaWatUniInlIso[1:nHp].port_b, ports_bChiHeaWatHp); connect(valChiWatUniInlIso[1:nHp].port_b, ports_bChiHeaWatHp); end ValvesIsolation;