Buildings.Fluid.Chillers.BaseClasses

Package with base classes for Buildings.Fluid.Chillers

Information

This package contains base classes that are used to construct the models in Buildings.Fluid.Chillers.

Extends from Modelica.Icons.BasesPackage (Icon for packages containing base classes).

Package Content

Name Description
Buildings.Fluid.Chillers.BaseClasses.Carnot Carnot  
Buildings.Fluid.Chillers.BaseClasses.PartialCarnot_T PartialCarnot_T Partial model for chiller with performance curve adjusted based on Carnot efficiency
Buildings.Fluid.Chillers.BaseClasses.PartialCarnot_y PartialCarnot_y Partial chiller model with performance curve adjusted based on Carnot efficiency
Buildings.Fluid.Chillers.BaseClasses.PartialElectric PartialElectric Partial model for electric chiller based on the model in DOE-2, CoolTools and EnergyPlus
Buildings.Fluid.Chillers.BaseClasses.warnIfPerformanceOutOfBounds warnIfPerformanceOutOfBounds Function that checks the performance and writes a warning if it is outside of 0.9 to 1.1

Buildings.Fluid.Chillers.BaseClasses.Carnot Buildings.Fluid.Chillers.BaseClasses.Carnot


Buildings.Fluid.Chillers.BaseClasses.Carnot

Information

This is the base class for the Carnot chiller and the Carnot heat pump whose coefficient of performance COP changes with temperatures in the same way as the Carnot efficiency changes.

The model allows to either specify the Carnot effectivness ηCarnot,0, or a COP0 at the nominal conditions, together with the evaporator temperature Teva,0 and the condenser temperature Tcon,0, in which case the model computes the Carnot effectivness as

ηCarnot,0 = COP0 ⁄ (Tuse,0 ⁄ (Tcon,0-Teva,0)),

where Tuse is the temperature of the the useful heat, e.g., the evaporator temperature for a chiller or the condenser temperature for a heat pump.

The COP is computed as the product

COP = ηCarnot,0 COPCarnot ηPL,

where COPCarnot is the Carnot efficiency and ηPL is the part load efficiency, expressed using a polynomial. This polynomial has the form

ηPL = a1 + a2 y + a3 y2 + ...

where y ∈ [0, 1] is either the part load for cooling in case of a chiller, or the part load of heating in case of a heat pump, and the coefficients ai are declared by the parameter a.

Implementation

To make this base class applicable to chiller or heat pumps, it uses the boolean constant COP_is_for_cooling. Depending on its value, the equations for the coefficient of performance and the part load ratio are set up.

Extends from Buildings.Fluid.Interfaces.PartialFourPortInterface (Partial model transporting fluid between two ports without storing mass or energy).

Parameters

TypeNameDefaultDescription
replaceable package Medium1PartialMediumMedium 1 in the component
replaceable package Medium2PartialMediumMedium 2 in the component
Nominal condition
MassFlowRatem1_flow_nominalQCon_flow_nominal/cp1_defaul...Nominal mass flow rate [kg/s]
MassFlowRatem2_flow_nominalQEva_flow_nominal/cp2_defaul...Nominal mass flow rate [kg/s]
HeatFlowRateQEva_flow_nominalQEva_flow_nominal( ...Nominal cooling heat flow rate (QEva_flow_nominal < 0) [W]
HeatFlowRateQCon_flow_nominalQCon_flow_nominal( ...Nominal heating flow rate [W]
TemperatureDifferencedTEva_nominal-10Temperature difference evaporator outlet-inlet [K]
TemperatureDifferencedTCon_nominal10Temperature difference condenser outlet-inlet [K]
Pressuredp1_nominaldp1_nominal( ...Pressure difference over condenser [Pa]
Pressuredp2_nominaldp2_nominal( ...Pressure difference over evaporator [Pa]
Efficiency
Booleanuse_eta_Carnot_nominaltrueSet to true to use Carnot effectiveness etaCarnot_nominal rather than COP_nominal
RealetaCarnot_nominalCOP_nominal/(TUseAct_nominal...Carnot effectiveness (=COP/COP_Carnot) used if use_eta_Carnot_nominal = true [1]
RealCOP_nominaletaCarnot_nominal*TUseAct_no...Coefficient of performance at TEva_nominal and TCon_nominal, used if use_eta_Carnot_nominal = false [1]
TemperatureTCon_nominal303.15Condenser temperature used to compute COP_nominal if use_eta_Carnot_nominal=false [K]
TemperatureTEva_nominal278.15Evaporator temperature used to compute COP_nominal if use_eta_Carnot_nominal=false [K]
Reala[:]{1}Coefficients for efficiency curve (need p(a=a, yPL=1)=1)
TemperatureDifferenceTAppCon_nominalif cp1_default < 1500 then 5...Temperature difference between refrigerant and working fluid outlet in condenser [K]
TemperatureDifferenceTAppEva_nominalif cp2_default < 1500 then 5...Temperature difference between refrigerant and working fluid outlet in evaporator [K]
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]
BooleanhomotopyInitializationtrue= true, use homotopy method
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed
Flow resistance
Condenser
Booleanfrom_dp1false= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistance1false= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM10.1Fraction of nominal flow rate where flow transitions to laminar [1]
Evaporator
Booleanfrom_dp2false= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistance2false= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM20.1Fraction of nominal flow rate where flow transitions to laminar [1]
Dynamics
Condenser
Timetau160Time constant at nominal flow rate (used if energyDynamics1 <> Modelica.Fluid.Types.Dynamics.SteadyState) [s]
TemperatureT1_startMedium1.T_defaultInitial or guess value of set point [K]
Evaporator
Timetau260Time constant at nominal flow rate (used if energyDynamics2 <> Modelica.Fluid.Types.Dynamics.SteadyState) [s]
TemperatureT2_startMedium2.T_defaultInitial or guess value of set point [K]
Evaporator and condenser
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state

Connectors

TypeNameDescription
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)
output RealOutputQCon_flowActual heating heat flow rate added to fluid 1 [W]
output RealOutputPElectric power consumed by compressor [W]
output RealOutputQEva_flowActual cooling heat flow rate removed from fluid 2 [W]

Modelica definition

partial model Carnot extends Buildings.Fluid.Interfaces.PartialFourPortInterface( m1_flow_nominal = QCon_flow_nominal/cp1_default/dTCon_nominal, m2_flow_nominal = QEva_flow_nominal/cp2_default/dTEva_nominal); parameter Modelica.SIunits.HeatFlowRate QEva_flow_nominal(max=0) "Nominal cooling heat flow rate (QEva_flow_nominal < 0)"; parameter Modelica.SIunits.HeatFlowRate QCon_flow_nominal(min=0) "Nominal heating flow rate"; parameter Modelica.SIunits.TemperatureDifference dTEva_nominal( final max=0) = -10 "Temperature difference evaporator outlet-inlet"; parameter Modelica.SIunits.TemperatureDifference dTCon_nominal( final min=0) = 10 "Temperature difference condenser outlet-inlet"; // Efficiency parameter Boolean use_eta_Carnot_nominal = true "Set to true to use Carnot effectiveness etaCarnot_nominal rather than COP_nominal"; parameter Real etaCarnot_nominal(unit="1") = COP_nominal/ (TUseAct_nominal/(TCon_nominal+TAppCon_nominal - (TEva_nominal-TAppEva_nominal))) "Carnot effectiveness (=COP/COP_Carnot) used if use_eta_Carnot_nominal = true"; parameter Real COP_nominal(unit="1") = etaCarnot_nominal*TUseAct_nominal/ (TCon_nominal+TAppCon_nominal - (TEva_nominal-TAppEva_nominal)) "Coefficient of performance at TEva_nominal and TCon_nominal, used if use_eta_Carnot_nominal = false"; parameter Modelica.SIunits.Temperature TCon_nominal = 303.15 "Condenser temperature used to compute COP_nominal if use_eta_Carnot_nominal=false"; parameter Modelica.SIunits.Temperature TEva_nominal = 278.15 "Evaporator temperature used to compute COP_nominal if use_eta_Carnot_nominal=false"; parameter Real a[:] = {1} "Coefficients for efficiency curve (need p(a=a, yPL=1)=1)"; parameter Modelica.SIunits.Pressure dp1_nominal(displayUnit="Pa") "Pressure difference over condenser"; parameter Modelica.SIunits.Pressure dp2_nominal(displayUnit="Pa") "Pressure difference over evaporator"; parameter Modelica.SIunits.TemperatureDifference TAppCon_nominal(min=0) = if cp1_default < 1500 then 5 else 2 "Temperature difference between refrigerant and working fluid outlet in condenser"; parameter Modelica.SIunits.TemperatureDifference TAppEva_nominal(min=0) = if cp2_default < 1500 then 5 else 2 "Temperature difference between refrigerant and working fluid outlet in evaporator"; parameter Boolean homotopyInitialization=true "= true, use homotopy method"; parameter Boolean from_dp1=false "= true, use m_flow = f(dp) else dp = f(m_flow)"; parameter Boolean from_dp2=false "= true, use m_flow = f(dp) else dp = f(m_flow)"; parameter Boolean linearizeFlowResistance1=false "= true, use linear relation between m_flow and dp for any flow rate"; parameter Boolean linearizeFlowResistance2=false "= true, use linear relation between m_flow and dp for any flow rate"; parameter Real deltaM1(final unit="1")=0.1 "Fraction of nominal flow rate where flow transitions to laminar"; parameter Real deltaM2(final unit="1")=0.1 "Fraction of nominal flow rate where flow transitions to laminar"; parameter Modelica.SIunits.Time tau1=60 "Time constant at nominal flow rate (used if energyDynamics1 <> Modelica.Fluid.Types.Dynamics.SteadyState)"; parameter Modelica.SIunits.Time tau2=60 "Time constant at nominal flow rate (used if energyDynamics2 <> Modelica.Fluid.Types.Dynamics.SteadyState)"; parameter Modelica.SIunits.Temperature T1_start=Medium1.T_default "Initial or guess value of set point"; parameter Modelica.SIunits.Temperature T2_start=Medium2.T_default "Initial or guess value of set point"; parameter Modelica.Fluid.Types.Dynamics energyDynamics= Modelica.Fluid.Types.Dynamics.SteadyState "Type of energy balance: dynamic (3 initialization options) or steady state"; Modelica.Blocks.Interfaces.RealOutput QCon_flow( final quantity="HeatFlowRate", final unit="W") "Actual heating heat flow rate added to fluid 1"; Modelica.Blocks.Interfaces.RealOutput P( final quantity="Power", final unit="W") "Electric power consumed by compressor"; Modelica.Blocks.Interfaces.RealOutput QEva_flow( final quantity="HeatFlowRate", final unit="W") "Actual cooling heat flow rate removed from fluid 2"; Real yPL(final unit="1", min=0) = if COP_is_for_cooling then QEva_flow/QEva_flow_nominal else QCon_flow/QCon_flow_nominal "Part load ratio"; Real etaPL(final unit = "1")= if evaluate_etaPL then 1 else Buildings.Utilities.Math.Functions.polynomial(a=a, x=yPL) "Efficiency due to part load (etaPL(yPL=1)=1)"; Real COP(min=0, final unit="1") = etaCarnot_nominal_internal * COPCar * etaPL "Coefficient of performance"; Real COPCar(min=0) = TUseAct/Buildings.Utilities.Math.Functions.smoothMax( x1=1, x2=TConAct - TEvaAct, deltaX=0.25) "Carnot efficiency"; Modelica.SIunits.Temperature TConAct(start=TCon_nominal + TAppCon_nominal)= Medium1.temperature(staB1) + QCon_flow/QCon_flow_nominal*TAppCon_nominal "Condenser temperature used to compute efficiency, taking into account pinch temperature between fluid and refrigerant"; Modelica.SIunits.Temperature TEvaAct(start=TEva_nominal - TAppEva_nominal)= Medium2.temperature(staB2) - QEva_flow/QEva_flow_nominal*TAppEva_nominal "Evaporator temperature used to compute efficiency, taking into account pinch temperature between fluid and refrigerant"; protected constant Boolean COP_is_for_cooling "Set to true if the specified COP is for cooling"; parameter Real etaCarnot_nominal_internal(unit="1")= if use_eta_Carnot_nominal then etaCarnot_nominal else COP_nominal/ (TUseAct_nominal / (TCon_nominal + TAppCon_nominal - (TEva_nominal - TAppEva_nominal))) "Carnot effectiveness (=COP/COP_Carnot) used to compute COP"; // For Carnot_y, computing etaPL = f(yPL) introduces a nonlinear equation. // The parameter below avoids this if a = {1}. final parameter Boolean evaluate_etaPL= (size(a, 1) == 1 and abs(a[1] - 1) < Modelica.Constants.eps) "Flag, true if etaPL should be computed as it depends on yPL"; final parameter Modelica.SIunits.Temperature TUseAct_nominal= if COP_is_for_cooling then TEva_nominal - TAppEva_nominal else TCon_nominal + TAppCon_nominal "Nominal evaporator temperature for chiller or condenser temperature for heat pump, taking into account pinch temperature between fluid and refrigerant"; Modelica.SIunits.Temperature TUseAct=if COP_is_for_cooling then TEvaAct else TConAct "Temperature of useful heat (evaporator for chiller, condenser for heat pump), taking into account pinch temperature between fluid and refrigerant"; final parameter Modelica.SIunits.SpecificHeatCapacity cp1_default= Medium1.specificHeatCapacityCp(Medium1.setState_pTX( p = Medium1.p_default, T = Medium1.T_default, X = Medium1.X_default)) "Specific heat capacity of medium 1 at default medium state"; final parameter Modelica.SIunits.SpecificHeatCapacity cp2_default= Medium2.specificHeatCapacityCp(Medium2.setState_pTX( p = Medium2.p_default, T = Medium2.T_default, X = Medium2.X_default)) "Specific heat capacity of medium 2 at default medium state"; Medium1.ThermodynamicState staA1 = Medium1.setState_phX( port_a1.p, inStream(port_a1.h_outflow), inStream(port_a1.Xi_outflow)) "Medium properties in port_a1"; Medium1.ThermodynamicState staB1 = Medium1.setState_phX( port_b1.p, port_b1.h_outflow, port_b1.Xi_outflow) "Medium properties in port_b1"; Medium2.ThermodynamicState staA2 = Medium2.setState_phX( port_a2.p, inStream(port_a2.h_outflow), inStream(port_a2.Xi_outflow)) "Medium properties in port_a2"; Medium2.ThermodynamicState staB2 = Medium2.setState_phX( port_b2.p, port_b2.h_outflow, port_b2.Xi_outflow) "Medium properties in port_b2"; replaceable Interfaces.PartialTwoPortInterface con constrainedby Interfaces.PartialTwoPortInterface( redeclare final package Medium = Medium1, final allowFlowReversal=allowFlowReversal1, final m_flow_nominal=m1_flow_nominal, final m_flow_small=m1_flow_small, final show_T=false) "Condenser"; replaceable Interfaces.PartialTwoPortInterface eva constrainedby Interfaces.PartialTwoPortInterface( redeclare final package Medium = Medium2, final allowFlowReversal=allowFlowReversal2, final m_flow_nominal=m2_flow_nominal, final m_flow_small=m2_flow_small, final show_T=false) "Evaporator"; initial equation assert(dTEva_nominal < 0, "Parameter dTEva_nominal must be negative."); assert(dTCon_nominal > 0, "Parameter dTCon_nominal must be positive."); assert(abs(Buildings.Utilities.Math.Functions.polynomial( a=a, x=1)-1) < 0.01, "Efficiency curve is wrong. Need etaPL(y=1)=1."); assert(etaCarnot_nominal_internal < 1, "Parameters lead to etaCarnot_nominal > 1. Check parameters."); equation connect(port_a2, eva.port_a); connect(eva.port_b, port_b2); connect(port_a1, con.port_a); connect(con.port_b, port_b1); end Carnot;

Buildings.Fluid.Chillers.BaseClasses.PartialCarnot_T Buildings.Fluid.Chillers.BaseClasses.PartialCarnot_T

Partial model for chiller with performance curve adjusted based on Carnot efficiency

Buildings.Fluid.Chillers.BaseClasses.PartialCarnot_T

Information

This is a partial model of a chiller whose coefficient of performance (COP) changes with temperatures in the same way as the Carnot efficiency changes. This base class is used for the Carnot chiller and Carnot heat pump that uses the compressor part load ratio as the control signal.

Extends from Buildings.Fluid.Chillers.BaseClasses.Carnot.

Parameters

TypeNameDefaultDescription
replaceable package Medium1PartialMediumMedium 1 in the component
replaceable package Medium2PartialMediumMedium 2 in the component
Nominal condition
MassFlowRatem1_flow_nominalQCon_flow_nominal/cp1_defaul...Nominal mass flow rate [kg/s]
MassFlowRatem2_flow_nominalQEva_flow_nominal/cp2_defaul...Nominal mass flow rate [kg/s]
HeatFlowRateQEva_flow_nominal Nominal cooling heat flow rate (QEva_flow_nominal < 0) [W]
HeatFlowRateQCon_flow_nominal Nominal heating flow rate [W]
TemperatureDifferencedTEva_nominal-10Temperature difference evaporator outlet-inlet [K]
TemperatureDifferencedTCon_nominal10Temperature difference condenser outlet-inlet [K]
Pressuredp1_nominal Pressure difference over condenser [Pa]
Pressuredp2_nominal Pressure difference over evaporator [Pa]
Efficiency
Booleanuse_eta_Carnot_nominaltrueSet to true to use Carnot effectiveness etaCarnot_nominal rather than COP_nominal
RealetaCarnot_nominalCOP_nominal/(TUseAct_nominal...Carnot effectiveness (=COP/COP_Carnot) used if use_eta_Carnot_nominal = true [1]
RealCOP_nominaletaCarnot_nominal*TUseAct_no...Coefficient of performance at TEva_nominal and TCon_nominal, used if use_eta_Carnot_nominal = false [1]
TemperatureTCon_nominal303.15Condenser temperature used to compute COP_nominal if use_eta_Carnot_nominal=false [K]
TemperatureTEva_nominal278.15Evaporator temperature used to compute COP_nominal if use_eta_Carnot_nominal=false [K]
Reala[:]{1}Coefficients for efficiency curve (need p(a=a, yPL=1)=1)
TemperatureDifferenceTAppCon_nominalif cp1_default < 1500 then 5...Temperature difference between refrigerant and working fluid outlet in condenser [K]
TemperatureDifferenceTAppEva_nominalif cp2_default < 1500 then 5...Temperature difference between refrigerant and working fluid outlet in evaporator [K]
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]
BooleanhomotopyInitializationtrue= true, use homotopy method
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed
Flow resistance
Condenser
Booleanfrom_dp1false= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistance1false= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM10.1Fraction of nominal flow rate where flow transitions to laminar [1]
Evaporator
Booleanfrom_dp2false= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistance2false= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM20.1Fraction of nominal flow rate where flow transitions to laminar [1]
Dynamics
Condenser
Timetau160Time constant at nominal flow rate (used if energyDynamics1 <> Modelica.Fluid.Types.Dynamics.SteadyState) [s]
TemperatureT1_startMedium1.T_defaultInitial or guess value of set point [K]
Evaporator
Timetau260Time constant at nominal flow rate (used if energyDynamics2 <> Modelica.Fluid.Types.Dynamics.SteadyState) [s]
TemperatureT2_startMedium2.T_defaultInitial or guess value of set point [K]
Evaporator and condenser
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state

Connectors

TypeNameDescription
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)
output RealOutputQCon_flowActual heating heat flow rate added to fluid 1 [W]
output RealOutputPElectric power consumed by compressor [W]
output RealOutputQEva_flowActual cooling heat flow rate removed from fluid 2 [W]

Modelica definition

partial model PartialCarnot_T "Partial model for chiller with performance curve adjusted based on Carnot efficiency" extends Buildings.Fluid.Chillers.BaseClasses.Carnot; protected Modelica.Blocks.Sources.RealExpression PEle "Electrical power consumption"; equation connect(PEle.y, P); end PartialCarnot_T;

Buildings.Fluid.Chillers.BaseClasses.PartialCarnot_y Buildings.Fluid.Chillers.BaseClasses.PartialCarnot_y

Partial chiller model with performance curve adjusted based on Carnot efficiency

Buildings.Fluid.Chillers.BaseClasses.PartialCarnot_y

Information

This is a partial model of a chiller whose coefficient of performance (COP) changes with temperatures in the same way as the Carnot efficiency changes. This base class is used for the Carnot chiller and Carnot heat pump that uses the leaving fluid temperature as the control signal.

Extends from Carnot.

Parameters

TypeNameDefaultDescription
replaceable package Medium1PartialMediumMedium 1 in the component
replaceable package Medium2PartialMediumMedium 2 in the component
Nominal condition
MassFlowRatem1_flow_nominalQCon_flow_nominal/cp1_defaul...Nominal mass flow rate [kg/s]
MassFlowRatem2_flow_nominalQEva_flow_nominal/cp2_defaul...Nominal mass flow rate [kg/s]
HeatFlowRateQEva_flow_nominalif COP_is_for_cooling then -...Nominal cooling heat flow rate (QEva_flow_nominal < 0) [W]
HeatFlowRateQCon_flow_nominalP_nominal - QEva_flow_nominalNominal heating flow rate [W]
TemperatureDifferencedTEva_nominal-10Temperature difference evaporator outlet-inlet [K]
TemperatureDifferencedTCon_nominal10Temperature difference condenser outlet-inlet [K]
Pressuredp1_nominal Pressure difference over condenser [Pa]
Pressuredp2_nominal Pressure difference over evaporator [Pa]
PowerP_nominalP_nominal( ...Nominal compressor power (at y=1) [W]
Efficiency
Booleanuse_eta_Carnot_nominaltrueSet to true to use Carnot effectiveness etaCarnot_nominal rather than COP_nominal
RealetaCarnot_nominalCOP_nominal/(TUseAct_nominal...Carnot effectiveness (=COP/COP_Carnot) used if use_eta_Carnot_nominal = true [1]
RealCOP_nominaletaCarnot_nominal*TUseAct_no...Coefficient of performance at TEva_nominal and TCon_nominal, used if use_eta_Carnot_nominal = false [1]
TemperatureTCon_nominal303.15Condenser temperature used to compute COP_nominal if use_eta_Carnot_nominal=false [K]
TemperatureTEva_nominal278.15Evaporator temperature used to compute COP_nominal if use_eta_Carnot_nominal=false [K]
Reala[:]{1}Coefficients for efficiency curve (need p(a=a, yPL=1)=1)
TemperatureDifferenceTAppCon_nominalif cp1_default < 1500 then 5...Temperature difference between refrigerant and working fluid outlet in condenser [K]
TemperatureDifferenceTAppEva_nominalif cp2_default < 1500 then 5...Temperature difference between refrigerant and working fluid outlet in evaporator [K]
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]
BooleanhomotopyInitializationtrue= true, use homotopy method
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed
Flow resistance
Condenser
Booleanfrom_dp1false= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistance1false= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM10.1Fraction of nominal flow rate where flow transitions to laminar [1]
Evaporator
Booleanfrom_dp2false= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistance2false= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM20.1Fraction of nominal flow rate where flow transitions to laminar [1]
Dynamics
Condenser
Timetau160Time constant at nominal flow rate (used if energyDynamics1 <> Modelica.Fluid.Types.Dynamics.SteadyState) [s]
TemperatureT1_startMedium1.T_defaultInitial or guess value of set point [K]
Evaporator
Timetau260Time constant at nominal flow rate (used if energyDynamics2 <> Modelica.Fluid.Types.Dynamics.SteadyState) [s]
TemperatureT2_startMedium2.T_defaultInitial or guess value of set point [K]
Evaporator and condenser
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state

Connectors

TypeNameDescription
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)
output RealOutputQCon_flowActual heating heat flow rate added to fluid 1 [W]
output RealOutputPElectric power consumed by compressor [W]
output RealOutputQEva_flowActual cooling heat flow rate removed from fluid 2 [W]
input RealInputyPart load ratio of compressor [1]

Modelica definition

partial model PartialCarnot_y "Partial chiller model with performance curve adjusted based on Carnot efficiency" extends Carnot( final QCon_flow_nominal= P_nominal - QEva_flow_nominal, final QEva_flow_nominal = if COP_is_for_cooling then -P_nominal * COP_nominal else -P_nominal * (COP_nominal-1), redeclare HeatExchangers.HeaterCooler_u con( final from_dp=from_dp1, final dp_nominal=dp1_nominal, final linearizeFlowResistance=linearizeFlowResistance1, final deltaM=deltaM1, final tau=tau1, final T_start=T1_start, final energyDynamics=energyDynamics, final massDynamics=energyDynamics, final homotopyInitialization=homotopyInitialization, final Q_flow_nominal=QCon_flow_nominal), redeclare HeatExchangers.HeaterCooler_u eva( final from_dp=from_dp2, final dp_nominal=dp2_nominal, final linearizeFlowResistance=linearizeFlowResistance2, final deltaM=deltaM2, final tau=tau2, final T_start=T2_start, final energyDynamics=energyDynamics, final massDynamics=energyDynamics, final homotopyInitialization=homotopyInitialization, final Q_flow_nominal=QEva_flow_nominal)); parameter Modelica.SIunits.Power P_nominal(min=0) "Nominal compressor power (at y=1)"; Modelica.Blocks.Interfaces.RealInput y(min=0, max=1, unit="1") "Part load ratio of compressor"; protected Modelica.SIunits.HeatFlowRate QCon_flow_internal(start=QCon_flow_nominal)= P - QEva_flow_internal "Condenser heat input"; Modelica.SIunits.HeatFlowRate QEva_flow_internal(start=QEva_flow_nominal)= if COP_is_for_cooling then -COP * P else (1-COP)*P "Evaporator heat input"; Modelica.Blocks.Sources.RealExpression yEva_flow_in( y=QEva_flow_internal/QEva_flow_nominal) "Normalized evaporator heat flow rate"; Modelica.Blocks.Sources.RealExpression yCon_flow_in( y=QCon_flow_internal/QCon_flow_nominal) "Normalized condenser heat flow rate"; Modelica.Blocks.Math.Gain PEle(final k=P_nominal) "Electrical power consumption"; equation connect(PEle.y, P); connect(PEle.u, y); connect(yEva_flow_in.y, eva.u); connect(yCon_flow_in.y, con.u); connect(con.Q_flow, QCon_flow); connect(eva.Q_flow, QEva_flow); end PartialCarnot_y;

Buildings.Fluid.Chillers.BaseClasses.PartialElectric Buildings.Fluid.Chillers.BaseClasses.PartialElectric

Partial model for electric chiller based on the model in DOE-2, CoolTools and EnergyPlus

Buildings.Fluid.Chillers.BaseClasses.PartialElectric

Information

Base class for model of an electric chiller, based on the DOE-2.1 chiller model and the CoolTools chiller model that are implemented in EnergyPlus as the models Chiller:Electric:EIR and Chiller:Electric:ReformulatedEIR.

The model takes as an input the set point for the leaving chilled water temperature, which is met if the chiller has sufficient capacity. Thus, the model has a built-in, ideal temperature control. The model has three tests on the part load ratio and the cycling ratio:

  1. The test
      PLR1 =min(QEva_flow_set/QEva_flow_ava, PLRMax);
    
    ensures that the chiller capacity does not exceed the chiller capacity specified by the parameter PLRMax.
  2. The test
      CR = min(PLR1/per.PRLMin, 1.0);
    
    computes a cycling ratio. This ratio expresses the fraction of time that a chiller would run if it were to cycle because its load is smaller than the minimal load at which it can operature. Notice that this model does continuously operature even if the part load ratio is below the minimum part load ratio. Its leaving evaporator and condenser temperature can therefore be considered as an average temperature between the modes where the compressor is off and on.
  3. The test
      PLR2 = max(PLRMinUnl, PLR1);
    
    computes the part load ratio of the compressor. The assumption is that for a part load ratio below PLRMinUnl, the chiller uses hot gas bypass to reduce the capacity, while the compressor power draw does not change.

The electric power only contains the power for the compressor, but not any power for pumps or fans.

Implementation

Models that extend from this base class need to provide three functions to predict capacity and power consumption:

Extends from Buildings.Fluid.Interfaces.FourPortHeatMassExchanger (Model transporting two fluid streams between four ports with storing mass or energy).

Parameters

TypeNameDefaultDescription
replaceable package Medium1PartialMediumMedium 1 in the component
replaceable package Medium2PartialMediumMedium 2 in the component
Nominal condition
MassFlowRatem1_flow_nominalmCon_flow_nominalNominal mass flow rate [kg/s]
MassFlowRatem2_flow_nominalmEva_flow_nominalNominal mass flow rate [kg/s]
PressureDifferencedp1_nominal Pressure difference [Pa]
PressureDifferencedp2_nominal Pressure difference [Pa]
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]
BooleanhomotopyInitializationtrue= true, use homotopy method
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed
Flow resistance
Medium 1
Booleanfrom_dp1false= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistance1false= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM10.1Fraction of nominal flow rate where flow transitions to laminar
Medium 2
Booleanfrom_dp2false= true, use m_flow = f(dp) else dp = f(m_flow)
BooleanlinearizeFlowResistance2false= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM20.1Fraction of nominal flow rate where flow transitions to laminar
Dynamics
Nominal condition
Timetau130Time constant at nominal flow [s]
Timetau230Time constant at nominal flow [s]
Equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
DynamicsmassDynamicsenergyDynamicsType of mass balance: dynamic (3 initialization options) or steady state
Initialization
Medium 1
AbsolutePressurep1_startMedium1.p_defaultStart value of pressure [Pa]
TemperatureT1_start273.15 + 25Start value of temperature [K]
MassFractionX1_start[Medium1.nX]Medium1.X_defaultStart value of mass fractions m_i/m [kg/kg]
ExtraPropertyC1_start[Medium1.nC]fill(0, Medium1.nC)Start value of trace substances
ExtraPropertyC1_nominal[Medium1.nC]fill(1E-2, Medium1.nC)Nominal value of trace substances. (Set to typical order of magnitude.)
Medium 2
AbsolutePressurep2_startMedium2.p_defaultStart value of pressure [Pa]
TemperatureT2_start273.15 + 5Start value of temperature [K]
MassFractionX2_start[Medium2.nX]Medium2.X_defaultStart value of mass fractions m_i/m [kg/kg]
ExtraPropertyC2_start[Medium2.nC]fill(0, Medium2.nC)Start value of trace substances
ExtraPropertyC2_nominal[Medium2.nC]fill(1E-2, Medium2.nC)Nominal value of trace substances. (Set to typical order of magnitude.)

Connectors

TypeNameDescription
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)
input BooleanInputonSet to true to enable compressor, or false to disable compressor
input RealInputTSetSet point for leaving chilled water temperature [K]
output RealOutputPElectric power consumed by compressor [W]

Modelica definition

partial model PartialElectric "Partial model for electric chiller based on the model in DOE-2, CoolTools and EnergyPlus" extends Buildings.Fluid.Interfaces.FourPortHeatMassExchanger( m1_flow_nominal = mCon_flow_nominal, m2_flow_nominal = mEva_flow_nominal, T1_start = 273.15+25, T2_start = 273.15+5, redeclare final Buildings.Fluid.MixingVolumes.MixingVolume vol2( V=m2_flow_nominal*tau2/rho2_nominal, nPorts=2, final prescribedHeatFlowRate=true), vol1( final prescribedHeatFlowRate=true)); Modelica.Blocks.Interfaces.BooleanInput on "Set to true to enable compressor, or false to disable compressor"; Modelica.Blocks.Interfaces.RealInput TSet(unit="K", displayUnit="degC") "Set point for leaving chilled water temperature"; Modelica.SIunits.Temperature TEvaEnt "Evaporator entering temperature"; Modelica.SIunits.Temperature TEvaLvg "Evaporator leaving temperature"; Modelica.SIunits.Temperature TConEnt "Condenser entering temperature"; Modelica.SIunits.Temperature TConLvg "Condenser leaving temperature"; Modelica.SIunits.Efficiency COP "Coefficient of performance"; Modelica.SIunits.HeatFlowRate QCon_flow "Condenser heat input"; Modelica.SIunits.HeatFlowRate QEva_flow "Evaporator heat input"; Modelica.Blocks.Interfaces.RealOutput P(final quantity="Power", unit="W") "Electric power consumed by compressor"; Real capFunT(min=0, unit="1") "Cooling capacity factor function of temperature curve"; Modelica.SIunits.Efficiency EIRFunT "Power input to cooling capacity ratio function of temperature curve"; Modelica.SIunits.Efficiency EIRFunPLR "Power input to cooling capacity ratio function of part load ratio"; Real PLR1(min=0, unit="1") "Part load ratio"; Real PLR2(min=0, unit="1") "Part load ratio"; Real CR(min=0, unit="1") "Cycling ratio"; protected Modelica.SIunits.HeatFlowRate QEva_flow_ava(nominal=QEva_flow_nominal,start=QEva_flow_nominal) "Cooling capacity available at evaporator"; Modelica.SIunits.HeatFlowRate QEva_flow_set(nominal=QEva_flow_nominal,start=QEva_flow_nominal) "Cooling capacity required to cool to set point temperature"; Modelica.SIunits.SpecificEnthalpy hSet "Enthalpy setpoint for leaving chilled water"; // Performance data parameter Modelica.SIunits.HeatFlowRate QEva_flow_nominal(max=0) "Reference capacity (negative number)"; parameter Modelica.SIunits.Efficiency COP_nominal "Reference coefficient of performance"; parameter Real PLRMax(min=0, unit="1") "Maximum part load ratio"; parameter Real PLRMinUnl(min=0, unit="1") "Minimum part unload ratio"; parameter Real PLRMin(min=0, unit="1") "Minimum part load ratio"; parameter Modelica.SIunits.Efficiency etaMotor(max=1) "Fraction of compressor motor heat entering refrigerant"; parameter Modelica.SIunits.MassFlowRate mEva_flow_nominal "Nominal mass flow at evaporator"; parameter Modelica.SIunits.MassFlowRate mCon_flow_nominal "Nominal mass flow at condenser"; parameter Modelica.SIunits.Temperature TEvaLvg_nominal "Temperature of fluid leaving evaporator at nominal condition"; final parameter Modelica.SIunits.Conversions.NonSIunits.Temperature_degC TEvaLvg_nominal_degC= Modelica.SIunits.Conversions.to_degC(TEvaLvg_nominal) "Temperature of fluid leaving evaporator at nominal condition"; Modelica.SIunits.Conversions.NonSIunits.Temperature_degC TEvaLvg_degC "Temperature of fluid leaving evaporator"; parameter Modelica.SIunits.HeatFlowRate Q_flow_small = QEva_flow_nominal*1E-9 "Small value for heat flow rate or power, used to avoid division by zero"; Buildings.HeatTransfer.Sources.PrescribedHeatFlow preHeaFloEva "Prescribed heat flow rate"; Buildings.HeatTransfer.Sources.PrescribedHeatFlow preHeaFloCon "Prescribed heat flow rate"; Modelica.Blocks.Sources.RealExpression QEva_flow_in(y=QEva_flow) "Evaporator heat flow rate"; Modelica.Blocks.Sources.RealExpression QCon_flow_in(y=QCon_flow) "Condenser heat flow rate"; initial equation assert(QEva_flow_nominal < 0, "Parameter QEva_flow_nominal must be smaller than zero."); assert(Q_flow_small < 0, "Parameter Q_flow_small must be smaller than zero."); assert(PLRMinUnl >= PLRMin, "Parameter PLRMinUnl must be bigger or equal to PLRMin"); assert(PLRMax > PLRMinUnl, "Parameter PLRMax must be bigger than PLRMinUnl"); equation // Condenser temperatures TConEnt = Medium1.temperature(Medium1.setState_phX(port_a1.p, inStream(port_a1.h_outflow))); TConLvg = vol1.heatPort.T; // Evaporator temperatures TEvaEnt = Medium2.temperature(Medium2.setState_phX(port_a2.p, inStream(port_a2.h_outflow))); TEvaLvg = vol2.heatPort.T; TEvaLvg_degC=Modelica.SIunits.Conversions.to_degC(TEvaLvg); // Enthalpy of temperature setpoint hSet = Medium2.specificEnthalpy_pTX( p=port_b2.p, T=TSet, X=cat(1, port_b2.Xi_outflow, {1-sum(port_b2.Xi_outflow)})); if on then // Available cooling capacity QEva_flow_ava = QEva_flow_nominal*capFunT; // Cooling capacity required to chill water to setpoint QEva_flow_set = Buildings.Utilities.Math.Functions.smoothMin( x1 = m2_flow*(hSet-inStream(port_a2.h_outflow)), x2= Q_flow_small, deltaX=-Q_flow_small/100); // Part load ratio PLR1 = Buildings.Utilities.Math.Functions.smoothMin( x1 = QEva_flow_set/(QEva_flow_ava+Q_flow_small), x2 = PLRMax, deltaX=PLRMax/100); // PLR2 is the compressor part load ratio. The lower bound PLRMinUnl is // since for PLR1<PLRMinUnl, the chiller uses hot gas bypass, under which // condition the compressor power is assumed to be the same as if the chiller // were to operate at PLRMinUnl PLR2 = Buildings.Utilities.Math.Functions.smoothMax( x1 = PLRMinUnl, x2 = PLR1, deltaX = PLRMinUnl/100); // Cycling ratio. // Due to smoothing, this can be about deltaX/10 above 1.0 CR = Buildings.Utilities.Math.Functions.smoothMin( x1 = PLR1/PLRMin, x2 = 1, deltaX=0.001); // Compressor power. P = -QEva_flow_ava/COP_nominal*EIRFunT*EIRFunPLR*CR; // Heat flow rates into evaporator and condenser // Q_flow_small is a negative number. QEva_flow = Buildings.Utilities.Math.Functions.smoothMax( x1 = QEva_flow_set, x2 = QEva_flow_ava, deltaX= -Q_flow_small/10); //QEva_flow = max(QEva_flow_set, QEva_flow_ava); QCon_flow = -QEva_flow + P*etaMotor; // Coefficient of performance COP = -QEva_flow/(P-Q_flow_small); else QEva_flow_ava = 0; QEva_flow_set = 0; PLR1 = 0; PLR2 = 0; CR = 0; P = 0; QEva_flow = 0; QCon_flow = 0; COP = 0; end if; connect(QCon_flow_in.y, preHeaFloCon.Q_flow); connect(preHeaFloCon.port, vol1.heatPort); connect(QEva_flow_in.y, preHeaFloEva.Q_flow); connect(preHeaFloEva.port, vol2.heatPort); end PartialElectric;

Buildings.Fluid.Chillers.BaseClasses.warnIfPerformanceOutOfBounds

Function that checks the performance and writes a warning if it is outside of 0.9 to 1.1

Information

This function checks if the numeric argument is outside of the interval 0.9 to 1.1. If this is the case, the function writes a warning.

Inputs

TypeNameDefaultDescription
Realx Argument to be checked
Stringmsg String to be added to warning message
StringcurveName Name of the curve that was tested

Outputs

TypeNameDescription
IntegerretVal0 if x is inside bounds, -1 if it is below bounds, or +1 if it is above bounds

Modelica definition

function warnIfPerformanceOutOfBounds "Function that checks the performance and writes a warning if it is outside of 0.9 to 1.1" input Real x "Argument to be checked"; input String msg "String to be added to warning message"; input String curveName "Name of the curve that was tested"; output Integer retVal "0 if x is inside bounds, -1 if it is below bounds, or +1 if it is above bounds"; algorithm if (x > 1.1) then retVal :=1; elseif ( x < 0.9) then retVal :=-1; else retVal :=0; end if; if (retVal <> 0) then Modelica.Utilities.Streams.print( "*** Warning: Chiller performance curves at nominal conditions are outside of bounds. " + msg + " is outside of bounds 0.9 to 1.1. The value of the curve fit is " + String(x) + " Check the coefficients of the function " + curveName + "."); end if; end warnIfPerformanceOutOfBounds;