modelConstantEvaporation

Organic Rankine cycle as a bottoming cycle

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

Information

Model of an organic Rankine cycle (ORC) as a bottoming cycle.

The thermodynamic cycle is steady-state while the evaporator and the condenser can be configured to have first order dynamics. The fluid stream 1 (using Medium1, port_a1, etc.) is the evaporator hot fluid, e.g., waste heat, and the stream 2 is the condenser cold fluid. The working fluid of the cycle is not based on a typical Modelica medium model. See the Thermodynamic Properties section of this document for the rational.

Cycle Architecture and Governing Equations

The implemented ORC is modeled based on the simplified cycle shown in the figure below. The cycle has two variants depending on the shape of the saturation lines of the working fluid and ηexp. For any given working fluid, the cycle is fully determined by providing the working fluid evaporating temperature Tw,eva, the working fluid condensing temperature Tw,con, the expander efficiency ηexp, and the pump efficiency ηpum. The superheating temperature difference ΔTsup is minimized, meaning it is zero whenever possible; otherwise it assumes the smallest value not to cause the expander outlet state to fall under the two-phase region, i.e. the "dome". Subcooling after the condenser is not considered. The Thermodynamic Properties section of this document details how these state points are found.

An important assumption is that all heat is dissipated, i.e., the cycle is not controlled by thermal load.

CycleArchitecture

The cycle processes the heat at a fixed Tw,eva provided by the user. The evaporator heat exchange is governed by

eva = ṁh cp,h (Th,out - Th,in),
eva = ṁw (hpum,out - hexp,in),

where the subscripts are eva for evaporator, exp for expander, h for hot fluid of the evaporator, i.e. the fluid carrying heat, pum for pump, and w for working fluid.

The cycle accommodates the variable flow rate and temperature of the waste heat stream by changing the working fluid mass flow rate w to maintain a constant pinch point (PP) temperature difference at the evaporator ΔTpin,eva. This difference is found from

(Tpin,eva - Th,out) (hexp,in - hpum,out) = (Th,in - Th,out) (heva,pin - hpum,out),
ΔTpin,eva = Tpin,eva - Tw,eva.

The condenser side uses the same equations with the evaporator variables replaced by their condenser counterparts where appropriate. Hence,

con = ṁc cp,c (Tc,out - Tc,in),
con = ṁw (hpum,in - hexp,out),
(Tc,pin - Tc,in) (hexp,out - hpum,in) = (Tc,out - Tc,in) (hcon,pin - hpum,in),
ΔTcon,pin = Tw,con - Tc,pin,

where the subscripts are con for condenser, and c for cold fluid in the condenser.

The electric power output of the expander is

Pexp = ṁw (hexp,in - hexp,out).

The electric power consumption of the pump is

Ppum = ṁw (hpum,out - hpum,in).

The pump work is

Ppum = ṁw  (peva - pcon) / (ρpum,in ηpum).

This takes advantage of the negligible density change of the liquid to avoid a property search in the subcooled liquid region.

In summary, the model has the following information flow:

User-specified parameters Inputs Outputs
Tw,eva - Working fluid evaporating temperature,
ΔTpin,eva - Evaporator pinch point temperature difference,
ΔTpin,con - Condenser pinch point temperature difference,
ηexp - Expander efficiency,
ηpum - Pump efficiency.
Th,in - Evaporator hot fluid incoming temperature,
h - Evaporator hot fluid flow rate,
Tc,in - Condenser cold fluid incoming temperature,
c - Condenser cold fluid flow rate.
w - Working fluid flow rate,
Tw,con - Working fluid condensing temperature,
Th,out - Evaporator hot fluid outgoing temperature,
Tc,out - Condenser cold fluid outgoing temperature,
eva - Evaporator heat flow rate,
con - Condenser heat flow rate,
Pexp - Expander power output,
Ppum - Pump power consumption.

Constraints

The ORC system controls w to maintain the prescribed evaporator PP temperature difference set point. Although the model does not implement this as a control loop, an upper limit and a lower limit are imposed on w to reflect the capacity constraints of a sized cycle.

  • The working fluid mass flow rate w will not go higher than a prescribed upper limit. Rather, w stays at the user-specified upper limit and ΔTpin,eva increases beyond its set point. This may happen when the incoming hot fluid has a high flow rate or a high incoming temperature, i.e., it carries more energy than the cycle is sized to process.
  • When the working fluid mass flow rate w needs to go below a prescribed lower limit, w is set to zero and the cycle is switched off. This may happen when the incoming waste heat fluid has a low flow rate or a low incoming temperature, i.e., it carries too little energy.

How these constraints affect the cycle's behavior reacting to a variable waste heat fluid stream is demonstrated in Buildings.Fluid.CHPs.OrganicRankine.Validation.VariableSource.

Thermodynamic Properties

The thermodynamic properties of the working fluid are not computed by a typical Modelica medium model, but by interpolating data records in Buildings.Fluid.CHPs.OrganicRankine.Data. Specific enthalpy and specific entropy values are provided as support points on the saturated liquid line, the saturated vapor line, and a superheated vapor line (called the reference line). The values of these support points were obtained using CoolProp (https://www.coolprop.org; Bell et al., 2014) through its Python wrapper and stored as Modelica records. An example Python file is provided in Buildings/Resources/Python-Sources/MakeORCFluidRecord.py, but note that this file is not maintained. The records included in this library have ten data points for each line. It is recommended to have at least four points to take full advantage of the cubit Hermite spline interpolation that is set up in this model.

Thermodynamic state points in the cycle are determined by various schemes of interpolation and extrapolation.

SupportCurves

  • On the saturation line, the specific enthalpy, specific entropy or density, here labeled as yA, are obtained using cubic Hermite spline interpolation as

    yA = s(uA,d)

    where s(·,·) is a cubic Hermite spline, uA is the input property, and d are the support points. For the saturation curves, the user can configure the model to use either the saturation pressure or the saturation temperature for uA. For the reference line uA is the pressure.
  • If the fluid is wet, the isentropic expander outlet point is in between the saturation lines. In this case, its enthalpy hB is obtained from

    (hB - h1) / (sB - s1) = (h2 - h1) / (s2 - s1)

    where sB is known because it equals the expander inlet entropy, and all other points are on the saturation line and therefore can be found as point A.
  • C is a point in the superheated vapor region. This is the case for the expander inlet or outlet depending on the shape of the cycle. The isobaric lines are not straight in this section, but they are assumed linear so that the method for B can be applied using the saturated vapor line and the reference line, albeit with less accuracy.

The cycle can be completely defined by providing the following quantities: evaporating temperature Teva or pressure peva, condensing temperature Tcon or pressure pcon, expander efficiency ηexp, and pump efficiency ηpum. Most of the important state points can be found via the interpolation schemes described above. The only exceptions are the expander inlet, expander outlet, and the pump outlet.

ComputationPaths

  • A dry cycle is a cycle where the expansion starts from the saturated vapor line and ends in the superheated vapor region. For either a dry fluid (a) or a wet fluid (b) undergoing such a cycle,

    hexp,out - hexp,in = (hexp,out,ise - hexp,in) ηexp

    where hexp,out is solved and hexp,in is known.
  • A wet cycle is a cycle where the expansion starts from the superheated vapor region and ends on the saturated vapor line. In this scenario,

    hexp,out - hexp,in = (hexp,out - hexp,inl,ise) ηexp

    where hexp,out is known and hexp,in is solved. For this fluid and this ηexp, if the expansion started from the saturated vapor line, the outlet point would end up under the dome.

Implementation

The user can parameterise the evaporating condition by providing either the evaporating temperature TWorEva or the evaporating pressure pWorEva. To support this, a default parameter assignment is provided to both. Otherwise there would be unassigned parameters even though they are not needed.

References

Bell IH, Wronski J, Quoilin S, Lemort V. Pure and pseudo-pure fluid thermophysical property evaluation and the open-source thermophysical property library CoolProp. Industrial & engineering chemistry research. 2014 Feb 12;53(6):2498-508. https://doi.org/10.1021/ie4033999

Parameters

TypeNameDefaultDescription
BooleanhomotopyInitialization (from FourPortHeatMassExchanger)true= true, use homotopy method
Buildings.Fluid.CHPs.OrganicRankine.Data.Genericpro
Assumptions
BooleanallowFlowReversal1 (from PartialFourPort)true= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1
BooleanallowFlowReversal2 (from PartialFourPort)true= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 2
Nominal condition
Modelica.Units.SI.MassFlowRatem1_flow_nominal (from PartialFourPortInterface)Nominal mass flow rate
Modelica.Units.SI.MassFlowRatem2_flow_nominal (from PartialFourPortInterface)Nominal mass flow rate
Modelica.Units.SI.PressureDifferencedp1_nominal (from FourPortFlowResistanceParameters)Pressure difference
Modelica.Units.SI.PressureDifferencedp2_nominal (from FourPortFlowResistanceParameters)Pressure difference
Advanced
Medium1.MassFlowRatem1_flow_small (from PartialFourPortInterface)1E-4*abs(m1_flow_nominal)Small mass flow rate for regularization of zero flow
Medium2.MassFlowRatem2_flow_small (from PartialFourPortInterface)1E-4*abs(m2_flow_nominal)Small mass flow rate for regularization of zero flow
Advanced › Diagnostics
Booleanshow_T (from PartialFourPortInterface)false= true, if actual temperature at port is computed
Flow resistance › Medium 1
BooleancomputeFlowResistance1 (from FourPortFlowResistanceParameters)true=true, compute flow resistance. Set to false to assume no friction
Booleanfrom_dp1 (from FourPortFlowResistanceParameters)false= true, use m_flow = f(dp) else dp = f(m_flow)
Realn1 (from FourPortFlowResistanceParameters)2Flow exponent for side 1, n=1 for laminar, n=2 for turbulent
BooleanlinearizeFlowResistance1 (from FourPortFlowResistanceParameters)false= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM1 (from FourPortFlowResistanceParameters)0.1Fraction of nominal flow rate where flow transitions to laminar
Flow resistance › Medium 2
BooleancomputeFlowResistance2 (from FourPortFlowResistanceParameters)true=true, compute flow resistance. Set to false to assume no friction
Booleanfrom_dp2 (from FourPortFlowResistanceParameters)false= true, use m_flow = f(dp) else dp = f(m_flow)
Realn2 (from FourPortFlowResistanceParameters)2Flow exponent for side 2, n=1 for laminar, n=2 for turbulent
BooleanlinearizeFlowResistance2 (from FourPortFlowResistanceParameters)false= true, use linear relation between m_flow and dp for any flow rate
RealdeltaM2 (from FourPortFlowResistanceParameters)0.1Fraction of nominal flow rate where flow transitions to laminar
Dynamics › Nominal condition
Modelica.Units.SI.Timetau1 (from FourPortHeatMassExchanger)30Time constant at nominal flow
Modelica.Units.SI.Timetau2 (from FourPortHeatMassExchanger)30Time constant at nominal flow
Dynamics › Conservation equations
Modelica.Fluid.Types.DynamicsenergyDynamics (from FourPortHeatMassExchanger)Modelica.Fluid.Types.Dynamics.DynamicFreeInitialType of energy balance: dynamic (3 initialization options) or steady state
Initialization › Medium 1
Medium1.AbsolutePressurep1_start (from FourPortHeatMassExchanger)Medium1.p_defaultStart value of pressure
Medium1.TemperatureT1_start (from FourPortHeatMassExchanger)Medium1.T_defaultStart value of temperature
Medium1.MassFraction[Medium1.nX]X1_start (from FourPortHeatMassExchanger)Medium1.X_defaultStart value of mass fractions m_i/m
Medium1.ExtraProperty[Medium1.nC]C1_start (from FourPortHeatMassExchanger)fill(0, Medium1.nC)Start value of trace substances
Medium1.ExtraProperty[Medium1.nC]C1_nominal (from FourPortHeatMassExchanger)fill(1E-2, Medium1.nC)Nominal value of trace substances. (Set to typical order of magnitude.)
Initialization › Medium 2
Medium2.AbsolutePressurep2_start (from FourPortHeatMassExchanger)Medium2.p_defaultStart value of pressure
Medium2.TemperatureT2_start (from FourPortHeatMassExchanger)Medium2.T_defaultStart value of temperature
Medium2.MassFraction[Medium2.nX]X2_start (from FourPortHeatMassExchanger)Medium2.X_defaultStart value of mass fractions m_i/m
Medium2.ExtraProperty[Medium2.nC]C2_start (from FourPortHeatMassExchanger)fill(0, Medium2.nC)Start value of trace substances
Medium2.ExtraProperty[Medium2.nC]C2_nominal (from FourPortHeatMassExchanger)fill(1E-2, Medium2.nC)Nominal value of trace substances. (Set to typical order of magnitude.)
Evaporator
Modelica.Units.SI.MassFlowRatemHot_flow_nominalNominal mass flow rate of the evaporator fluid
Modelica.Units.SI.PressureDifferencedpHot_nominalNominal pressure drop of the hot fluid in evaporator
Modelica.Units.SI.TemperatureDifferencedTPinEva_set5Set evaporator pinch point temperature difference
BooleanuseEvaporatingPressurefalseSet true to specify working fluid evaporating pressure instead of temperature
Modelica.Units.SI.ThermodynamicTemperatureTWorEvamax(pro.T)*2/3 + min(pro.T)*1/3Evaporating temperature of the working fluid
Modelica.Units.SI.PressurepWorEvamax(pro.p)*2/3 + min(pro.p)*1/3Evaporating pressure of the working fluid
Condenser
Modelica.Units.SI.MassFlowRatemCol_flow_nominalNominal mass flow rate of the condenser fluid
Modelica.Units.SI.PressureDifferencedpCol_nominalNominal pressure drop of the cold fluid in condenser
Modelica.Units.SI.TemperatureDifferencedTPinCon10Condenser pinch point temperature difference
BooleanuseLowCondenserPressureWarningtrueIf true, issues warning if pCon < 101325 Pa
Cycle
Modelica.Units.SI.MassFlowRatemWor_flow_maxUpper bound of working fluid flow rate
Modelica.Units.SI.MassFlowRatemWor_flow_minLower bound of working fluid flow rate
Modelica.Units.SI.MassFlowRatemWor_flow_hysteresismWor_flow_min + (mWor_flow_max - mWor_flow_min)*0.1Hysteresis for turning off the cycle when flow too low
Modelica.Units.SI.EfficiencyetaExpExpander efficiency
Modelica.Units.SI.EfficiencyetaPumPump efficiency

Connectors

TypeNameDefaultDescription
Modelica.Fluid.Interfaces.FluidPort_aport_a1 (from PartialFourPort)Fluid connector a1 (positive design flow direction is from port_a1 to port_b1)
Modelica.Fluid.Interfaces.FluidPort_bport_b1 (from PartialFourPort)Fluid connector b1 (positive design flow direction is from port_a1 to port_b1)
Modelica.Fluid.Interfaces.FluidPort_aport_a2 (from PartialFourPort)Fluid connector a2 (positive design flow direction is from port_a2 to port_b2)
Modelica.Fluid.Interfaces.FluidPort_bport_b2 (from PartialFourPort)Fluid connector b2 (positive design flow direction is from port_a2 to port_b2)
Modelica.Blocks.Interfaces.BooleanInputenaEnable cycle; set false to force working fluid flow to zero
Modelica.Blocks.Interfaces.RealOutputPExpExpander power generation
Modelica.Blocks.Interfaces.RealOutputQEva_flowEvaporator heat flow rate into the cycle
Modelica.Blocks.Interfaces.RealOutputQCon_flowCondenser heat flow rate out of the cycle
Modelica.Blocks.Interfaces.BooleanOutputon_actualActual on off status of the cycle
Modelica.Blocks.Interfaces.RealOutputPPumElectrical power consumption of the pump

Components

TypeNameDefaultDescription
Medium1.MassFlowRatem1_flow (from PartialFourPortInterface)port_a1.m_flowMass flow rate from port_a1 to port_b1 (m1_flow > 0 is design flow direction)
Modelica.Units.SI.PressureDifferencedp1 (from PartialFourPortInterface)port_a1.p - port_b1.pPressure difference between port_a1 and port_b1
Medium2.MassFlowRatem2_flow (from PartialFourPortInterface)port_a2.m_flowMass flow rate from port_a2 to port_b2 (m2_flow > 0 is design flow direction)
Modelica.Units.SI.PressureDifferencedp2 (from PartialFourPortInterface)port_a2.p - port_b2.pPressure difference between port_a2 and port_b2
Medium1.ThermodynamicStatesta_a1 (from PartialFourPortInterface)if allowFlowReversal1 then Medium1.setState_phX(port_a1.p, noEvent(actualStream(port_a1.h_outflow)), noEvent(actualStream(port_a1.Xi_outflow))) else Medium1.setState_phX(port_a1.p, inStream(port_a1.h_outflow), inStream(port_a1.Xi_outflow))Medium properties in port_a1
Medium1.ThermodynamicStatesta_b1 (from PartialFourPortInterface)if allowFlowReversal1 then Medium1.setState_phX(port_b1.p, noEvent(actualStream(port_b1.h_outflow)), noEvent(actualStream(port_b1.Xi_outflow))) else Medium1.setState_phX(port_b1.p, port_b1.h_outflow, port_b1.Xi_outflow)Medium properties in port_b1
Medium2.ThermodynamicStatesta_a2 (from PartialFourPortInterface)if allowFlowReversal2 then Medium2.setState_phX(port_a2.p, noEvent(actualStream(port_a2.h_outflow)), noEvent(actualStream(port_a2.Xi_outflow))) else Medium2.setState_phX(port_a2.p, inStream(port_a2.h_outflow), inStream(port_a2.Xi_outflow))Medium properties in port_a2
Medium2.ThermodynamicStatesta_b2 (from PartialFourPortInterface)if allowFlowReversal2 then Medium2.setState_phX(port_b2.p, noEvent(actualStream(port_b2.h_outflow)), noEvent(actualStream(port_b2.Xi_outflow))) else Medium2.setState_phX(port_b2.p, port_b2.h_outflow, port_b2.Xi_outflow)Medium properties in port_b2
Modelica.Units.SI.HeatFlowRateQ1_flow (from FourPortHeatMassExchanger)vol1.heatPort.Q_flowHeat flow rate into medium 1
Modelica.Units.SI.HeatFlowRateQ2_flow (from FourPortHeatMassExchanger)vol2.heatPort.Q_flowHeat flow rate into medium 2
Buildings.Fluid.MixingVolumes.BaseClasses.MixingVolumeHeatPortvol1 (from FourPortHeatMassExchanger)
Buildings.Fluid.MixingVolumes.MixingVolumevol2 (from FourPortHeatMassExchanger)
Buildings.Fluid.FixedResistances.PressureDroppreDro1 (from FourPortHeatMassExchanger)Flow resistance of fluid 1
Buildings.Fluid.FixedResistances.PressureDroppreDro2 (from FourPortHeatMassExchanger)Flow resistance of fluid 2
Buildings.Fluid.CHPs.OrganicRankine.BaseClasses.FixedEvaporatingcycThermodynamic computations of the organic Rankine cycle

Revisions

  • January 29, 2024, by Hongxiang Fu:
    First implementation. This is for #3433.