diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/FixedEvaporating.mo b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/FixedEvaporating.mo new file mode 100644 index 0000000000..106bbf2479 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/FixedEvaporating.mo @@ -0,0 +1,212 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.BaseClasses; +model FixedEvaporating + "Thermodynamic computations of the ORC with fixed evaporating temperature" + extends IBPSA.Fluid.CHPs.OrganicRankine.BaseClasses.InterpolateStates( + TEva=TWorEva, + TCon=TWorCon); + + parameter Modelica.Units.SI.TemperatureDifference dTPinEva_set( + final min = 0) + "Set evaporator pinch point temperature difference" + annotation(Dialog(group="Evaporator")); + parameter Modelica.Units.SI.SpecificHeatCapacity cpHot + "Constant specific heat capacity" + annotation(Dialog(group="Evaporator")); + parameter Modelica.Units.SI.ThermodynamicTemperature TWorEva + "Working fluid evaporator temperature" + annotation(Dialog(group="Evaporator")); + parameter Modelica.Units.SI.TemperatureDifference dTPinCon + "Pinch point temperature difference of condenser" + annotation(Dialog(group="Condenser")); + parameter Modelica.Units.SI.SpecificHeatCapacity cpCol + "Constant specific heat capacity" + annotation(Dialog(group="Condenser")); + parameter Boolean useLowCondenserPressureWarning = true + "If true, issues warning if pCon < 101325 Pa"; + parameter Modelica.Units.SI.MassFlowRate mWor_flow_max( + final min = 0) + "Upper bound of working fluid flow rate" + annotation(Dialog(group="Cycle")); + parameter Modelica.Units.SI.MassFlowRate mWor_flow_min( + final min = 0) + "Lower bound of working fluid flow rate" + annotation(Dialog(group="Cycle")); + parameter Modelica.Units.SI.MassFlowRate mWor_flow_hysteresis( + final min = 0) + "Hysteresis for turning off the cycle when flow too low" + annotation(Dialog(group="Cycle")); + + Modelica.Blocks.Interfaces.RealInput THotIn( + final quantity="ThermodynamicTemperature", + final unit="K", + displayUnit="degC") "Incoming temperature of hot fluid in evaporator" + annotation (Placement( + transformation(extent={{-140,60},{-100,100}}), iconTransformation( + extent={{-120,70},{-100,90}}))); + Modelica.Blocks.Interfaces.RealInput mHot_flow( + final quantity="MassFlowRate", + final unit="kg/s") "Evaporator hot fluid flow rate" + annotation (Placement(transformation(extent={{-140,20},{-100,60}}), + iconTransformation(extent={{-120,30},{-100,50}}))); + Modelica.Blocks.Interfaces.RealInput TColIn( + final quantity="ThermodynamicTemperature", + final unit="K", + displayUnit="degC") "Incoming temperature of cold fluid in condenser" + annotation (Placement(transformation(extent={{-140,-60},{-100,-20}}), + iconTransformation(extent={{-120,-50},{-100,-30}}))); + Modelica.Blocks.Interfaces.RealInput mCol_flow( + final quantity="MassFlowRate", + final unit="kg/s") "Condenser cold fluid flow rate" annotation (Placement( + transformation(extent={{-140,-100},{-100,-60}}), iconTransformation( + extent={{-120,-90},{-100,-70}}))); + Modelica.Blocks.Interfaces.BooleanInput ena + "Enable cycle; set false to force working fluid flow to zero" + annotation (Placement(transformation(extent={{-140,-20},{-100,20}}), + iconTransformation(extent={{-120,-10},{-100,10}}))); + + Modelica.Blocks.Interfaces.RealOutput QEva_flow( + final quantity="HeatFlowRate", + final unit="W") "Evaporator heat flow rate into the cycle" + annotation (Placement(transformation(extent={{100,60},{140,100}}), + iconTransformation(extent={{100,70},{120,90}}))); + Modelica.Blocks.Interfaces.RealOutput QCon_flow( + final quantity="HeatFlowRate", + final unit="W") "Condenser heat flow rate out of the cycle" + annotation (Placement( + transformation(extent={{100,-100},{140,-60}}),iconTransformation(extent={{100,-90}, + {120,-70}}))); + Modelica.Blocks.Interfaces.RealOutput PExp( + final quantity="Power", + final unit="W") "Expander power generation" annotation (Placement( + transformation(extent={{100,20},{140,60}}), iconTransformation(extent={{100,30}, + {120,50}}))); + Modelica.Blocks.Interfaces.RealOutput PPum( + final quantity="Power", + final unit="W") + "Electrical power consumption of the pump" annotation (Placement( + transformation(extent={{100,-60},{140,-20}}),iconTransformation(extent={ + {100,-50},{120,-30}}))); + Modelica.Blocks.Interfaces.BooleanOutput on_actual = ena and hys.y + "Actual on off status of the cycle" annotation (Placement(transformation( + extent={{100,-20},{140,20}}), iconTransformation(extent={{100,-10},{120, + 10}}))); + + Modelica.Units.SI.ThermodynamicTemperature THotOut( + start = TWorEva + dTPinEva_set) + "Outgoing temperature of the evaporator hot fluid"; + Modelica.Units.SI.ThermodynamicTemperature THotPin( + start = TWorEva + dTPinEva_set) + "Hot fluid temperature at pinch point"; + Modelica.Units.SI.TemperatureDifference dTPinEva(start = dTPinEva_set) + "Pinch point temperature difference of evaporator"; + Modelica.Units.SI.ThermodynamicTemperature TWorCon + "Working fluid condensing temperature"; + Modelica.Units.SI.ThermodynamicTemperature TColOut + "Fluid temperature out of the condenser"; + Modelica.Units.SI.ThermodynamicTemperature TColPin( + start = 300) + "Cold fluid temperature at pinch point"; + Modelica.Units.SI.MassFlowRate mWor_flow + "Mass flow rate of the working fluid" + annotation (Dialog(group="Cycle")); + Modelica.Blocks.Logical.Hysteresis hys( + uLow = mWor_flow_min, + uHigh = mWor_flow_min + mWor_flow_hysteresis, + u = mWor_flow_internal) + "Hysteresis for turning off cycle when working fluid flow too low"; + +protected + Modelica.Units.SI.MassFlowRate mWor_flow_internal( + start = (mWor_flow_max + mWor_flow_min) / 2) + "Working fluid flow rate, intermediate variable"; + Modelica.Units.SI.ThermodynamicTemperature THotPin_internal + "Hot fluid temperature at pinch point, intermedaite variable"; + Modelica.Units.SI.ThermodynamicTemperature THotOut_internal + "Hot fluid outgoing temperature, intermediate variable"; + Modelica.Units.SI.HeatFlowRate QEva_flow_internal + "Evaporator heat flow rate, intermediate variable"; + +equation + + assert(not (TWorCon > TWorEva - 1 and ena), +"*** In " + getInstanceName() + +": Working fluid condensing temperature is too high and close to evaporating temperature. +This is likely caused by the flow rate of cold fluid in the condenser being too low +when the ORC is on."); + + assert(not (pCon < 101325 - 1 and ena and useLowCondenserPressureWarning), +"*** In " + getInstanceName() + +": Working fluid condensing pressure is lower than 101325 Pa. +If this is intended, set useLowCondenserPressureWarning = false to turn off this warning.", +level=AssertionLevel.warning); + + if ena then + // Evaporator + QEva_flow = mHot_flow * cpHot * (THotOut - THotIn); + QEva_flow = mWor_flow * (hPumOut - hExpInl); + (THotPin - THotOut) * (hExpInl - hPumOut) + = (hPinEva - hPumOut) * (THotIn - THotOut); + // Condenser + QCon_flow = mCol_flow * cpCol * (TColOut - TColIn); + QCon_flow = mWor_flow * (hExpOut - hPumInl); + (TColPin - TColIn) * (hExpOut - hPumInl) + = (hPinCon - hPumInl) * (TColOut - TColIn); + else + // Evaporator + QEva_flow = 0; + THotOut = THotIn; + THotPin = THotOut; + // Condenser + QCon_flow = 0; + TColOut = TColIn; + TColPin = TColIn; + end if; + dTPinEva = THotPin - TWorEva; // Evaporator + dTPinCon = TWorCon - TColPin; // Condenser + + // Evaporator internal computation + QEva_flow_internal = mHot_flow * cpHot * (THotOut_internal - THotIn); + QEva_flow_internal = mWor_flow_internal * (hPumOut - hExpInl); + (THotPin_internal - THotOut_internal) * (hExpInl - hPumOut) + = (hPinEva - hPumOut) * (THotIn - THotOut_internal); + dTPinEva_set = THotPin_internal - TWorEva; + + // Other components + PExp = mWor_flow * (hExpOut - hExpInl); + PPum = mWor_flow * (hPumOut - hPumInl); + mWor_flow = + if on_actual + then + IBPSA.Utilities.Math.Functions.smoothMin( + x1=mWor_flow_internal, + x2=mWor_flow_max, + deltaX=mWor_flow_min*1E-2) + else 0; + + annotation(defaultComponentName="cyc", + Documentation(info=" +

+This model computes the pinch points and the energy exchange, +and interfaces with the input and output variables. +The evaporating temperature is fixed as a parameter. +See the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +for more details. +", revisions=" +

+"), + Icon(graphics={Line( + points={{-28,20},{66,50}}, + color={238,46,47}, + thickness=1), Line( + points={{-30,-54},{64,-24}}, + color={28,108,200}, + thickness=1)})); +end FixedEvaporating; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/InterpolateStates.mo b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/InterpolateStates.mo new file mode 100644 index 0000000000..23f6e68c15 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/InterpolateStates.mo @@ -0,0 +1,322 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.BaseClasses; +model InterpolateStates "Interpolate states of a working fluid" + + // Input properties + replaceable parameter IBPSA.Fluid.CHPs.OrganicRankine.Data.Generic pro + "Property records of the working fluid" + annotation(Dialog(group="ORC inputs"), choicesAllMatching = true); + parameter Modelica.Units.SI.SpecificEnthalpy h_small = + (max(pro.hSatVap) - min(pro.hSatLiq)) * 1E-4 + "A small value for specific enthalpy regularisation" + annotation(Dialog(tab="Advanced")); + + input Modelica.Units.SI.ThermodynamicTemperature TEva + "Evaporating temperature"; + input Modelica.Units.SI.ThermodynamicTemperature TCon + "Condensing temperature"; + input Modelica.Units.SI.Efficiency etaExp + "Expander efficiency"; + input Modelica.Units.SI.Efficiency etaPum + "Pump efficiency"; + + // Once-interpolated properties + Modelica.Units.SI.AbsolutePressure pEva( + displayUnit = "kPa") = + IBPSA.Utilities.Math.Functions.interpolate( + u = TEva, + xd = pro.T, + yd = pro.p, + d = pDer_T) + "Evaporating pressure"; + Modelica.Units.SI.AbsolutePressure pCon( + displayUnit = "kPa") = + IBPSA.Utilities.Math.Functions.interpolate( + u = TCon, + xd = pro.T, + yd = pro.p, + d = pDer_T) + "Condensing pressure"; + Modelica.Units.SI.Density rhoLiq = + IBPSA.Utilities.Math.Functions.interpolate( + u = TCon, + xd = pro.T, + yd = pro.rhoLiq, + d = rhoLiqDer_T) + "Saturated liquid density"; + Modelica.Units.SI.SpecificEntropy sPumInl = + IBPSA.Utilities.Math.Functions.interpolate( + u = TCon, + xd = pro.T, + yd = pro.sSatLiq, + d = sSatLiqDer_T) + "Specific entropy at pump inlet"; + Modelica.Units.SI.SpecificEnthalpy hPumInl( + displayUnit = "kJ/kg") = + IBPSA.Utilities.Math.Functions.interpolate( + u = TCon, + xd = pro.T, + yd = pro.hSatLiq, + d = hSatLiqDer_T) + "Specific enthalpy at pump inlet"; + Modelica.Units.SI.SpecificEnthalpy hPinEva( + displayUnit = "kJ/kg") = + IBPSA.Utilities.Math.Functions.interpolate( + u = TEva, + xd = pro.T, + yd = pro.hSatLiq, + d = hSatLiqDer_T) + "Specific enthalpy at evaporator-side pinch point"; + Modelica.Units.SI.SpecificEnthalpy hPinCon( + displayUnit = "kJ/kg") = + IBPSA.Utilities.Math.Functions.interpolate( + u = TCon, + xd = pro.T, + yd = pro.hSatVap, + d = hSatVapDer_T) + "Specific enthalpy at condenser-side pinch point"; + Modelica.Units.SI.SpecificEntropy sSatVapCon( + start = max(pro.sSatVap) * 0.1 + min(pro.sSatVap) * 0.9) = + IBPSA.Utilities.Math.Functions.interpolate( + u = TCon, + xd = pro.T, + yd = pro.sSatVap, + d = sSatVapDer_T) + "Specific entropy of saturated vapor at the condenser"; + Modelica.Units.SI.SpecificEntropy sRefCon = + IBPSA.Utilities.Math.Functions.interpolate( + u = pCon, + xd = pro.p, + yd = pro.sRef, + d = sRefDer_p) + "Specific entropy on reference line at condensing pressure"; + Modelica.Units.SI.SpecificEntropy sSatVapEva = + IBPSA.Utilities.Math.Functions.interpolate( + u = TEva, + xd = pro.T, + yd = pro.sSatVap, + d = sSatVapDer_T) + "Specific entropy of saturated vapor at evaporating temperature"; + Modelica.Units.SI.SpecificEnthalpy hSatVapEva( + displayUnit = "kJ/kg") = + IBPSA.Utilities.Math.Functions.interpolate( + u = TEva, + xd = pro.T, + yd = pro.hSatVap, + d = hSatVapDer_T) + "Specific enthalpy of saturated vapor at evaporating temperature"; + Modelica.Units.SI.SpecificEntropy sRefEva = + IBPSA.Utilities.Math.Functions.interpolate( + u = pEva, + xd = pro.p, + yd = pro.sRef, + d = sRefDer_p) + "Specific entropy on reference line at evaporating pressure"; + Modelica.Units.SI.SpecificEnthalpy hSatVapCon( + displayUnit = "kJ/kg") = + IBPSA.Utilities.Math.Functions.interpolate( + u = TCon, + xd = pro.T, + yd = pro.hSatVap, + d = hSatVapDer_T) + "Specific enthalpy of saturated vapor at the condensing temperature"; + Modelica.Units.SI.SpecificEnthalpy hRefCon( + displayUnit = "kJ/kg") = + IBPSA.Utilities.Math.Functions.interpolate( + u = pCon, + xd = pro.p, + yd = pro.hRef, + d = hRefDer_p) + "Specific enthalpy on reference line at condensing pressure"; + Modelica.Units.SI.SpecificEnthalpy hRefEva( + displayUnit = "kJ/kg") = + IBPSA.Utilities.Math.Functions.interpolate( + u = pEva, + xd = pro.p, + yd = pro.hRef, + d = hRefDer_p) + "Specific enthalpy on reference line at evaporating pressure"; + + // Computed properties not interpolated + Modelica.Units.SI.SpecificEnthalpy hPumOut(displayUnit = "kJ/kg") = + hPumInl + wPum + "Specific enthalpy at pump outlet"; + Modelica.Units.SI.SpecificEnthalpy hExpInl(displayUnit = "kJ/kg") = + IBPSA.Utilities.Math.Functions.regStep( + x = h_reg, + y1 = hSatVapEva, + y2 = hExpInlWet, + x_small = h_small) + "Specific enthalpy at expander inlet"; + Modelica.Units.SI.SpecificEnthalpy hExpOut(displayUnit = "kJ/kg") = + IBPSA.Utilities.Math.Functions.regStep( + x = h_reg, + y1 = hExpOutDry, + y2 = hSatVapCon, + x_small = h_small) + "Specific enthalpy at expander inlet"; + Modelica.Units.SI.TemperatureDifference dTSup = max(0, dTSupWet) + "Superheating temperature differential"; + + // Energy transfer + Modelica.Units.SI.SpecificEnergy qEva = hPumOut - hExpInl + "Evaporator specific energy transfer into the cycle"; + Modelica.Units.SI.SpecificEnergy qCon = hExpOut - hPumInl + "Condenser specific energy transfer out of the cycle"; + Modelica.Units.SI.SpecificEnergy wExp = hExpOut - hExpInl + "Expander specific work"; + Modelica.Units.SI.SpecificEnergy wPum = (pEva - pCon) / (rhoLiq * etaPum) + "Pump specific work"; + Modelica.Units.SI.Efficiency etaThe(min=0) = + (wExp + wPum) / qEva "Thermal efficiency"; + +protected + Modelica.Units.SI.SpecificEnthalpy h_reg = hExpOutDry - hSatVapCon + "For regularisation; if > 0, dry cycle"; + + // Intermediate property computation + // 1. Dry cycle + // expander inlet = saturated vapor at evaporating pressure (known), + // expander outlet = superheated vapor at condensing pressure (solved). + Modelica.Units.SI.SpecificEntropy sExpOutDryIse = sSatVapEva + "Specific entropy at isentropic expander outlet, assuming dry cycle"; + Modelica.Units.SI.SpecificEnthalpy hExpOutDryIse( + displayUnit = "kJ/kg") = + if sExpOutDryIse > sSatVapCon + then (hRefCon - hSatVapCon) * (sExpOutDryIse - sSatVapCon) + / (sRefCon - sSatVapCon) + hSatVapCon + else (hSatVapCon - hPumInl) * (sExpOutDryIse - sPumInl) + / (sSatVapCon - sPumInl) + hPumInl + "Specific enthalpy at expander outlet, assuming dry cycle"; + Modelica.Units.SI.SpecificEnthalpy hExpOutDry( + displayUnit = "kJ/kg") = + hSatVapEva - (hSatVapEva - hExpOutDryIse) * etaExp + "Specific enthalpy at expander outlet, assuming dry cycle"; + // 2. Wet cycle + // expander inlet = superheated vapor at evaporating pressure (solved), + // expander outlet = saturated vapor at condensing pressure (known). + Modelica.Units.SI.SpecificEntropy sExpInlWetIse = sSatVapCon + "Specific entropy at isentropic expander inlet, assuming wet cycle"; + Modelica.Units.SI.SpecificEnthalpy hExpInlWetIse( + displayUnit = "kJ/kg") = + (hRefEva - hSatVapEva) * (sExpInlWetIse - sSatVapEva) + / (sRefEva - sSatVapEva) + hSatVapEva + "Specific enthalpy at expander inlet, assuming wet cycle"; + Modelica.Units.SI.SpecificEnthalpy hExpInlWet( + displayUnit = "kJ/kg") = + (hExpInlWetIse - hSatVapCon) * etaExp + hSatVapCon + "Specific enthalpy at expander inlet, assuming wet cycle"; + Modelica.Units.SI.TemperatureDifference dTSupWet( + displayUnit = "K") = + (hExpInlWet - hSatVapEva) * pro.dTRef / (hRefEva - hSatVapEva) + "Superheating temperature differential, assuming wet cycle"; + + // Derivatives + final parameter Real pDer_T[pro.n]= + IBPSA.Utilities.Math.Functions.splineDerivatives( + x = pro.T, + y = pro.p, + ensureMonotonicity = true) + "Derivative of saturation pressure vs. saturation temperature for cubic spline"; + final parameter Real rhoLiqDer_T[pro.n]= + IBPSA.Utilities.Math.Functions.splineDerivatives( + x = pro.T, + y = pro.rhoLiq, + ensureMonotonicity = true) + "Derivative of saturated liquid density vs. temperature for cubic spline"; + final parameter Real sSatLiqDer_T[pro.n]= + IBPSA.Utilities.Math.Functions.splineDerivatives( + x = pro.T, + y = pro.sSatLiq, + ensureMonotonicity = true) + "Derivative of saturated liquid entropy vs. temperature for cubic spline"; + final parameter Real sSatVapDer_T[pro.n]= + IBPSA.Utilities.Math.Functions.splineDerivatives( + x = pro.T, + y = pro.sSatVap, + ensureMonotonicity = false) + "Derivative of saturated vapor entropy vs. temperature for cubic spline"; + final parameter Real sRefDer_p[pro.n]= + IBPSA.Utilities.Math.Functions.splineDerivatives( + x = pro.p, + y = pro.sRef, + ensureMonotonicity = false) + "Derivative of reference entropy vs. pressure for cubic spline"; + final parameter Real hSatLiqDer_T[pro.n]= + IBPSA.Utilities.Math.Functions.splineDerivatives( + x = pro.T, + y = pro.hSatLiq, + ensureMonotonicity = true) + "Derivative of saturated liquid enthalpy vs. temperature for cubic spline"; + final parameter Real hSatVapDer_T[pro.n]= + IBPSA.Utilities.Math.Functions.splineDerivatives( + x = pro.T, + y = pro.hSatVap, + ensureMonotonicity = false) + "Derivative of saturated vapor enthalpy vs. temperature for cubic spline"; + final parameter Real hRefDer_p[pro.n]= + IBPSA.Utilities.Math.Functions.splineDerivatives( + x = pro.p, + y = pro.hRef, + ensureMonotonicity = false) + "Derivative of reference enthaly vs. pressure for cubic spline"; + + annotation (defaultComponentName="cyc", + Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle( + extent={{-100,100},{100,-100}}, + fillColor={135,135,135}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Line( + points={{-60,-60},{-28,-20},{16,32},{40,60},{52,60},{54,30},{48,2},{52, + -38},{58,-58}}, + color={255,255,255}, + smooth=Smooth.Bezier, + thickness=0.5), + Line( + points={{6,20},{52,20},{66,-6},{50,-18},{-26,-18},{-24,-6},{6,20}}, + color={255,255,255}, + thickness=0.5, + pattern=LinePattern.Dash), + Line(points={{-66,61},{-66,-78}}, color={255,255,255}), + Polygon( + points={{-66,73},{-74,51},{-58,51},{-66,73}}, + lineColor={255,255,255}, + fillColor={255,255,255}, + fillPattern=FillPattern.Solid), + Polygon( + points={{63,-67},{41,-59},{41,-75},{63,-67}}, + lineColor={255,255,255}, + fillColor={255,255,255}, + fillPattern=FillPattern.Solid), + Line(points={{-80,-67},{57,-67}}, color={255,255,255}), + Text( + extent={{-100,100},{-64,58}}, + textColor={255,255,255}, + textString="T"), + Text( + extent={{64,-58},{100,-100}}, + textColor={255,255,255}, + textString="s"), + Text( + extent={{-151,-100},{149,-140}}, + textColor={0,0,255}, + textString="%name")}), Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +

+This model performs the property interpolations of a given working fluid. +See the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +for more details. +", revisions=" +

+")); +end InterpolateStates; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/DryFluid.mo b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/DryFluid.mo new file mode 100644 index 0000000000..e4bdda432e --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/DryFluid.mo @@ -0,0 +1,47 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.BaseClasses.Validation; +model DryFluid + "Organic Rankine cycle with a dry working fluid" + extends Modelica.Icons.Example; + + parameter Modelica.Units.SI.ThermodynamicTemperature TEva = 450 + "Evaporating temperature"; + parameter Modelica.Units.SI.ThermodynamicTemperature TCon = 310 + "Condensing temperature"; + parameter Modelica.Units.SI.Efficiency etaExp = 0.85 + "Expander efficiency"; + parameter Modelica.Units.SI.Efficiency etaPum = 0.7 + "Pump efficiency"; + + IBPSA.Fluid.CHPs.OrganicRankine.BaseClasses.InterpolateStates cyc( + final pro = pro, + final TEva = TEva, + final TCon = TCon, + final etaExp = etaExp, + final etaPum = etaPum) "Interpolate working fluid states in the cycle" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); + replaceable parameter + IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids.Toluene pro + constrainedby IBPSA.Fluid.CHPs.OrganicRankine.Data.Generic + "Property record of the working fluid" + annotation (Placement(transformation(extent={{60,60},{80,80}})), + choicesAllMatching=true); + +annotation(experiment(StopTime=1, Tolerance=1e-6), + __Dymola_Commands(file="modelica://IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/DryFluid.mos" + "Simulate and plot"), + Documentation(info=" +

+This model validates the basic use of + +IBPSA.Fluid.CHPs.OrganicRankine.BaseClasses.InterpolateStates. +

+",revisions=" + +")); +end DryFluid; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/WetFluid.mo b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/WetFluid.mo new file mode 100644 index 0000000000..b30755ddbf --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/WetFluid.mo @@ -0,0 +1,33 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.BaseClasses.Validation; +model WetFluid + "Organic Rankine cycle with a wet working fluid" + extends + IBPSA.Fluid.CHPs.OrganicRankine.BaseClasses.Validation.DryFluid( + TEva = 350, + redeclare parameter + IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids.R134a pro); +annotation (experiment(StopTime=1, Tolerance=1e-6), + __Dymola_Commands(file="modelica://IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/WetFluid.mos" + "Simulate and plot"), + Documentation(info=" +

+This model is largely the same as + +IBPSA.Fluid.CHPs.OrganicRankine.BaseClasses.Validation.DryFluid, +except that it validates the handling of wet working fluids. +As a result, a superheating temperature is computed that ensures +the expansion does not land under the dome. +How this superheating temperature is found is explained in the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation. +

+",revisions=" + +")); +end WetFluid; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/package.mo b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/package.mo new file mode 100644 index 0000000000..9eb6745516 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/package.mo @@ -0,0 +1,9 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.BaseClasses; +package Validation "Package for validation models" + extends Modelica.Icons.ExamplesPackage; + annotation (Documentation(info=" +

+Package for validation models for the base classes. +

+")); +end Validation; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/package.order b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/package.order new file mode 100644 index 0000000000..bfd2d4d207 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/package.order @@ -0,0 +1,2 @@ +DryFluid +WetFluid diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/package.mo b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/package.mo new file mode 100644 index 0000000000..9395391a20 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/package.mo @@ -0,0 +1,9 @@ +within IBPSA.Fluid.CHPs.OrganicRankine; +package BaseClasses "Package with base classes" + extends Modelica.Icons.BasesPackage; + annotation (Documentation(info=" +

+Package for base classes. +

+")); +end BaseClasses; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/package.order b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/package.order new file mode 100644 index 0000000000..52d5e32f17 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/BaseClasses/package.order @@ -0,0 +1,3 @@ +FixedEvaporating +InterpolateStates +Validation diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/ConstantEvaporation.mo b/IBPSA/Fluid/CHPs/OrganicRankine/ConstantEvaporation.mo new file mode 100644 index 0000000000..d533ece187 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/ConstantEvaporation.mo @@ -0,0 +1,501 @@ +within IBPSA.Fluid.CHPs.OrganicRankine; +model ConstantEvaporation "Organic Rankine cycle as a bottoming cycle" + + extends IBPSA.Fluid.Interfaces.FourPortHeatMassExchanger( + final m1_flow_nominal = mHot_flow_nominal, + final dp1_nominal = dpHot_nominal, + final m2_flow_nominal = mCol_flow_nominal, + final dp2_nominal = dpCol_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + T1_start = max(pro.T)*2/3 + min(pro.T)*1/3, + T2_start = max(pro.T)*1/10 + min(pro.T)*9/10, + redeclare final IBPSA.Fluid.MixingVolumes.MixingVolume vol2( + V=m2_flow_nominal*tau2/rho2_nominal, + nPorts=2, + final prescribedHeatFlowRate=true), + final vol1( + final prescribedHeatFlowRate=true)); + + replaceable parameter IBPSA.Fluid.CHPs.OrganicRankine.Data.Generic pro + constrainedby IBPSA.Fluid.CHPs.OrganicRankine.Data.Generic + "Property records of the working fluid" + annotation(choicesAllMatching = true,Dialog(group="Cycle")); + parameter Modelica.Units.SI.MassFlowRate mHot_flow_nominal + "Nominal mass flow rate of the evaporator fluid" + annotation(Dialog(group="Evaporator")); + parameter Modelica.Units.SI.PressureDifference dpHot_nominal( + displayUnit="Pa") + "Nominal pressure drop of the hot fluid in evaporator" + annotation(Dialog(group="Evaporator")); + parameter Modelica.Units.SI.TemperatureDifference dTPinEva_set( + final min = 0) = 5 + "Set evaporator pinch point temperature difference" + annotation(Dialog(group="Evaporator")); + parameter Boolean useEvaporatingPressure = false + "Set true to specify working fluid evaporating pressure instead of temperature" + annotation(Dialog(group="Evaporator")); + parameter Modelica.Units.SI.ThermodynamicTemperature TWorEva = + max(pro.T)*2/3 + min(pro.T)*1/3 + "Evaporating temperature of the working fluid" + annotation(Dialog(group="Evaporator", enable = not useEvaporatingPressure)); + parameter Modelica.Units.SI.Pressure pWorEva(displayUnit="kPa") = + max(pro.p)*2/3 + min(pro.p)*1/3 + "Evaporating pressure of the working fluid" + annotation(Dialog(group="Evaporator", enable = useEvaporatingPressure)); + parameter Modelica.Units.SI.MassFlowRate mCol_flow_nominal + "Nominal mass flow rate of the condenser fluid" + annotation(Dialog(group="Condenser")); + parameter Modelica.Units.SI.PressureDifference dpCol_nominal( + displayUnit="Pa") + "Nominal pressure drop of the cold fluid in condenser" + annotation(Dialog(group="Condenser")); + parameter Modelica.Units.SI.TemperatureDifference dTPinCon( + final min = 0) = 10 + "Condenser pinch point temperature difference" + annotation(Dialog(group="Condenser")); + parameter Boolean useLowCondenserPressureWarning = true + "If true, issues warning if pCon < 101325 Pa" + annotation(Dialog(group="Condenser")); + parameter Modelica.Units.SI.MassFlowRate mWor_flow_max( + final min = 0) + "Upper bound of working fluid flow rate" + annotation(Dialog(group="Cycle")); + parameter Modelica.Units.SI.MassFlowRate mWor_flow_min( + final min = 0) + "Lower bound of working fluid flow rate" + annotation(Dialog(group="Cycle")); + parameter Modelica.Units.SI.MassFlowRate mWor_flow_hysteresis + = mWor_flow_min + (mWor_flow_max - mWor_flow_min) * 0.1 + "Hysteresis for turning off the cycle when flow too low" + annotation(Dialog(group="Cycle")); + parameter Modelica.Units.SI.Efficiency etaExp + "Expander efficiency" + annotation(Dialog(group="Cycle")); + parameter Modelica.Units.SI.Efficiency etaPum + "Pump efficiency" + annotation(Dialog(group="Cycle")); + + Modelica.Blocks.Interfaces.BooleanInput ena + "Enable cycle; set false to force working fluid flow to zero" annotation ( + Placement(transformation(extent={{-140,-20},{-100,20}}), + iconTransformation(extent={{-120,-10},{-100,10}}))); + + Modelica.Blocks.Interfaces.RealOutput PExp( + final quantity="Power", + final unit="W") "Expander power generation" + annotation (Placement( + transformation(extent={{100,10},{140,50}}), iconTransformation(extent={{100,20}, + {120,40}}))); + Modelica.Blocks.Interfaces.RealOutput QEva_flow( + final quantity="HeatFlowRate", + final unit="W") "Evaporator heat flow rate into the cycle" annotation ( + Placement(transformation(extent={{100,70},{140,110}}),iconTransformation( + extent={{-10,-10},{10,10}}, + rotation=0, + origin={110,90}))); + Modelica.Blocks.Interfaces.RealOutput QCon_flow( + final quantity="HeatFlowRate", + final unit="W") "Condenser heat flow rate out of the cycle" annotation ( + Placement(transformation(extent={{100,-110},{140,-70}}), + iconTransformation(extent={{-10,-10},{10,10}}, + rotation=0, + origin={110,-90}))); + Modelica.Blocks.Interfaces.BooleanOutput on_actual + "Actual on off status of the cycle" annotation (Placement(transformation( + extent={{100,-20},{140,20}}), iconTransformation(extent={{100,-10},{ + 120,10}}))); + Modelica.Blocks.Interfaces.RealOutput PPum( + final quantity="Power", + final unit="W") + "Electrical power consumption of the pump" annotation (Placement( + transformation(extent={{100,-50},{140,-10}}),iconTransformation(extent={{100,-40}, + {120,-20}}))); + + IBPSA.Fluid.CHPs.OrganicRankine.BaseClasses.FixedEvaporating cyc( + final pro=pro, + final mWor_flow_max=mWor_flow_max, + final mWor_flow_min=mWor_flow_min, + final mWor_flow_hysteresis=mWor_flow_hysteresis, + final TWorEva = + if useEvaporatingPressure + then IBPSA.Utilities.Math.Functions.smoothInterpolation( + x = pWorEva, + xSup = pro.p, + ySup = pro.T) + else TWorEva, + final dTPinEva_set=dTPinEva_set, + final dTPinCon=dTPinCon, + final cpHot=Medium1.specificHeatCapacityCp(sta1_nominal), + final cpCol=Medium2.specificHeatCapacityCp(sta2_nominal), + final etaExp=etaExp, + final etaPum=etaPum, + final useLowCondenserPressureWarning=useLowCondenserPressureWarning) + "Thermodynamic computations of the organic Rankine cycle" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); + +protected + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHeaFloEva + "Prescribed heat flow rate" + annotation (Placement(transformation(extent={{39,30},{19,50}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow preHeaFloCon + "Prescribed heat flow rate" + annotation (Placement(transformation(extent={{41,-70},{21,-50}}))); + Modelica.Blocks.Sources.RealExpression expTHotIn(y=Medium1.temperature( + state=Medium1.setState_phX( + p=port_a1.p, + h=inStream(port_a1.h_outflow), + X=inStream(port_a1.Xi_outflow)))) + "Expression for evaporator hot fluid incoming temperature" + annotation (Placement(transformation(extent={{-60,20},{-40,40}}))); + Modelica.Blocks.Sources.RealExpression expMHot_flow(y=m1_flow) + "Expression for evaporator hot fluid flow rate" + annotation (Placement(transformation(extent={{-60,0},{-40,20}}))); + Modelica.Blocks.Sources.RealExpression expTColIn(y=Medium2.temperature( + state=Medium2.setState_phX( + p=port_a2.p, + h=inStream(port_a2.h_outflow), + X=inStream(port_a2.Xi_outflow)))) + "Expression for condenser cold fluid incoming temperature" + annotation (Placement(transformation(extent={{-60,-20},{-40,0}}))); + Modelica.Blocks.Sources.RealExpression expMCol_flow(y=m2_flow) + "Expression for condenser cold fluid flow rate" + annotation (Placement(transformation(extent={{-60,-40},{-40,-20}}))); +equation + connect(preHeaFloEva.port, vol1.heatPort) annotation (Line(points={{19,40},{-16, + 40},{-16,60},{-10,60}}, color={191,0,0})); + connect(preHeaFloCon.port, vol2.heatPort) annotation (Line(points={{21,-60},{12, + -60}}, color={191,0,0})); + connect(expTHotIn.y, cyc.THotIn) annotation (Line(points={{-39,30},{-20,30},{-20, + 8},{-11,8}}, color={0,0,127})); + connect(expMHot_flow.y, cyc.mHot_flow) annotation (Line(points={{-39,10},{-30, + 10},{-30,4},{-11,4}}, color={0,0,127})); + connect(expTColIn.y, cyc.TColIn) annotation (Line(points={{-39,-10},{-30,-10}, + {-30,-4},{-11,-4}}, color={0,0,127})); + connect(expMCol_flow.y, cyc.mCol_flow) annotation (Line(points={{-39,-30},{-20, + -30},{-20,-8},{-11,-8}}, color={0,0,127})); + connect(cyc.PExp,PExp) annotation (Line(points={{11,4},{84,4},{84,30},{120,30}}, + color={0,0,127})); + connect(ena, cyc.ena) + annotation (Line(points={{-120,0},{-11,0}}, color={255,0,255})); + connect(cyc.QEva_flow, QEva_flow) annotation (Line(points={{11,8},{80,8},{80,90}, + {120,90}}, color={0,0,127})); + connect(cyc.QCon_flow, QCon_flow) annotation (Line(points={{11,-8},{80,-8},{ + 80,-70},{96,-70},{96,-90},{120,-90}}, + color={0,0,127})); + connect(cyc.on_actual, on_actual) annotation (Line(points={{11,0},{120,0}}, + color={255,0,255})); + connect(cyc.PPum, PPum) annotation (Line(points={{11,-4},{84,-4},{84,-30},{120, + -30}}, color={0,0,127})); + connect(cyc.QEva_flow, preHeaFloEva.Q_flow) + annotation (Line(points={{11,8},{80,8},{80,40},{39,40}}, color={0,0,127})); + connect(cyc.QCon_flow, preHeaFloCon.Q_flow) annotation (Line(points={{11,-8}, + {80,-8},{80,-60},{41,-60}}, color={0,0,127})); + annotation (defaultComponentName = "orc", + Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Line( + points={{-60,-60},{-28,-20},{16,32},{40,60},{52,60},{54,30},{48,2},{ + 52,-38},{58,-58}}, + color={255,255,255}, + smooth=Smooth.Bezier, + thickness=0.5), + Line( + points={{6,20},{52,20},{66,-6},{50,-18},{-26,-18}}, + color={255,255,255}, + thickness=0.5, + pattern=LinePattern.Dash)}), Diagram( + coordinateSystem(preserveAspectRatio=false)), +Documentation(info=" +

+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. +

+

+

+

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

+

+Q̇eva = ṁh cp,h (Th,out - Th,in),
+Q̇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, +

+

+Q̇con = ṁc cp,c (Tc,out - Tc,in),
+Q̇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 parametersInputsOutputs
+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. +

+ +

+How these constraints affect the cycle's behavior reacting to +a variable waste heat fluid stream is demonstrated in + +IBPSA.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 + +IBPSA.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. +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. +

+

+

+ +

+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. +

+

+

+ +

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 +

+", revisions=" + +")); +end ConstantEvaporation; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/Generic.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Data/Generic.mo new file mode 100644 index 0000000000..3c06937ad1 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/Generic.mo @@ -0,0 +1,40 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Data; +record Generic "Generic data record for working fluid properties" + extends Modelica.Icons.Record; + + parameter Modelica.Units.SI.ThermodynamicTemperature T[:] + "Thermodynamic temperature"; + parameter Modelica.Units.SI.AbsolutePressure p[n] + "Saturation pressure"; + parameter Modelica.Units.SI.Density rhoLiq[n] + "Density of saturated liquid"; + parameter Modelica.Units.SI.TemperatureDifference dTRef + "Superheating temperature difference"; + parameter Modelica.Units.SI.SpecificEntropy sSatLiq[n] + "Specific entropy of saturated liquid"; + parameter Modelica.Units.SI.SpecificEntropy sSatVap[n] + "Specific entropy of saturated vapor"; + parameter Modelica.Units.SI.SpecificEntropy sRef[n] + "Specific entropy of superheated vapor reference line"; + parameter Modelica.Units.SI.SpecificEnthalpy hSatLiq[n] + "Specific enthalpy of saturated liquid"; + parameter Modelica.Units.SI.SpecificEnthalpy hSatVap[n] + "Specific enthalpy of saturated vapor"; + parameter Modelica.Units.SI.SpecificEnthalpy hRef[n] + "Specific enthalpy of superheated vapor reference line"; + + final parameter Integer n = size(T,1) + "Array length"; +annotation ( + defaultComponentPrefixes = "parameter", + defaultComponentName = "pro", + Documentation(info=" +

+Record containing parameters for working fluid properties. +A figure in the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +shows which lines these arrays represent. +

+")); +end Generic; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Acetone.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Acetone.mo new file mode 100644 index 0000000000..fb4f3c0a26 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Acetone.mo @@ -0,0 +1,58 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids; +record Acetone "Data record for acetone" + extends Generic( + T = { + 263.15 ,289.255555556,315.361111111,341.466666667, + 367.572222222,393.677777778,419.783333333,445.888888889, + 471.994444444,498.1 }, + p = { + 5344.990110825, 20650.833566074, 61555.897854858, + 151351.563616118, 321797.046994737, 612178.548912226, + 1068684.448400072,1745219.888869215,2707418.650799205, + 4046245.515470347}, + rhoLiq = { + 822.882971808,794.503127301,765.124111199,734.248636529, + 701.245557689,665.234774298,624.858127478,577.729019236, + 518.607501298,426.621585717}, + dTRef = 30, + sSatLiq = { + -479.028530758,-280.940806531, -94.928726727, 81.991049561, + 252.145020847, 417.505066333, 580.003385303, 742.022980174, + 907.767378748,1092.563132257}, + sSatVap = { + 1681.191059012,1596.661258221,1542.5487283 ,1510.043720587, + 1492.612391749,1484.868192175,1481.705802931,1477.167997198, + 1461.519799448,1404.254266854}, + sRef = { + 1817.036318829,1731.286422698,1677.739234558,1647.046003462, + 1632.468103167,1628.870285847,1632.074409953,1638.412725056, + 1644.396794592,1646.431943962}, + hSatLiq = { + -141608.840175549, -86907.602970965, -30644.702178538, + 27561.220566805, 88109.595870881, 151467.211307906, + 218265.291981649, 289522.609167944, 367363.173547648, + 459910.837559632}, + hSatVap = { + 426852.944874144,456199.225381078,485752.007459114, + 515193.605967011,544070.943987246,571664.354771464, + 596784.938528286,617315.603980879,628731.239715757, + 615164.191702174}, + hRef = { + 464617.330003106,497136.67139577 ,530386.531973482, + 563997.6626978 ,597536.243125905,630465.696202391, + 662097.963586358,691534.659141209,717607.015924844, + 738837.945805182}); + annotation ( + defaultComponentPrefixes = "parameter", + defaultComponentName = "pro", + Documentation(info=" +

+Record containing properties of acetone. +Its name in CoolProp is \"Acetone\". +A figure in the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +shows which lines these arrays represent. +

+")); +end Acetone; \ No newline at end of file diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Ethanol.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Ethanol.mo new file mode 100644 index 0000000000..61427d8ba1 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Ethanol.mo @@ -0,0 +1,56 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids; +record Ethanol "Data record for ethanol" + extends Generic( + T = { + 263.15,289.99,316.83,343.67,370.51,397.35,424.19,451.03,477.87, + 504.71}, + p = { + 7.689358061e+02,4.849943515e+03,2.156311297e+04,7.357097999e+04, + 2.046081847e+05,4.845344677e+05,1.008761409e+06,1.891911004e+06, + 3.263511383e+06,5.282165193e+06}, + rhoLiq = { + 814.799753232,792.036393251,768.756136609,744.093991385, + 716.886637425,685.51349857 ,647.811686098,601.669643931, + 543.369863156,438.527983321}, + dTRef = 30, + sSatLiq = { + -726.973851775,-505.583513991,-286.35608663 , -65.626950104, + 159.007283346, 389.527126652, 627.103332946, 869.931756177, + 1118.157181986,1411.006366334}, + sSatVap = { + 2902.952478464,2699.032398467,2551.227443872,2442.903267896, + 2361.504494341,2297.490986936,2243.294159242,2191.508999328, + 2129.791721023,2005.324094606}, + sRef = { + 3048.947765906,2841.665343912,2692.531793967,2585.157296558, + 2507.385719926,2450.24466807 ,2407.200424972,2373.310666428, + 2343.951307193,2312.828603679}, + hSatLiq = { + -223584.403049121,-162359.292050491, -95822.158648172, + -22850.994379185, 57554.398921637, 146473.200208431, + 244865.515469934, 352554.405086509, 470265.911621738, + 618471.162521627}, + hSatVap = { + 731630.710753397,766947.276403163,803209.431320732, + 839255.585640969,873601.64056746 ,904602.640092255, + 930437.502076461,948625.389064672,953695.708791375, + 918429.263157366}, + hRef = { + 772225.371527353, 810437.156029444, 850086.320725499, + 890262.545389702, 929818.501889787, 967557.529390266, + 1002370.800231913,1033259.201313757,1059056.681099724, + 1077479.396060467}); + annotation ( + defaultComponentPrefixes = "parameter", + defaultComponentName = "pro", + Documentation(info=" +

+Record containing properties of ethanol. +Its name in CoolProp is \"Ethanol\". +A figure in the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +shows which lines these arrays represent. +

+")); +end Ethanol; \ No newline at end of file diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Heptane.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Heptane.mo new file mode 100644 index 0000000000..3e56924888 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Heptane.mo @@ -0,0 +1,57 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids; +record Heptane "Data record for n-heptane" + extends Generic( + T = { + 263.15 ,292.814444444,322.478888889,352.143333333, + 381.807777778,411.472222222,441.136666667,470.801111111, + 500.465555556,530.13 }, + p = { + 7.989173434e+02,4.640431854e+03,1.836462559e+04,5.521023193e+04, + 1.357341530e+05,2.872627666e+05,5.428996069e+05,9.414295237e+05, + 1.530128640e+06,2.375428955e+06}, + rhoLiq = { + 708.744161335,684.005361466,658.664692095,632.281562559, + 604.301119943,573.933259524,539.893343103,499.714554172, + 447.233450033,353.248453405}, + dTRef = 30, + sSatLiq = { + -796.989852616,-565.365137693,-345.670277761,-134.519732505, + 70.367270161, 270.657778517, 467.830116908, 663.725205376, + 861.998498724,1078.641393707}, + sSatVap = { + 672.954567605, 692.831668803, 739.301918155, 803.885808983, + 880.494448383, 964.465721538,1051.759799165,1137.935524319, + 1215.655239687,1260.938470215}, + sRef = { + 841.855369762, 858.118161463, 902.502690963, 966.060882441, + 1042.44988716 ,1127.000908946,1216.047379616,1306.364617459, + 1394.627619853,1477.085968924}, + hSatLiq = { + -251949.774148952,-187591.55369971 ,-120007.324894362, + -48744.573432347, 26561.273589323, 106252.748227298, + 190762.393341302, 280852.494718802, 378399.475308805, + 492237.654496714}, + hSatVap = { + 134866.100032261,180826.645196058,229873.303319793, + 281708.681968285,335874.131225473,391735.444337536, + 448355.186941404,504111.239777487,555392.492651129, + 588878.803666001}, + hRef = { + 181833.569133815,231695.382441082,284942.600720626, + 341242.380998298,400129.988352552,461040.039711463, + 523275.529594887,585905.759075288,647581.728725064, + 706410.769546266}); + annotation ( + defaultComponentPrefixes = "parameter", + defaultComponentName = "pro", + Documentation(info=" +

+Record containing properties of n-heptane. +Its name in CoolProp is \"n-Heptane\". +A figure in the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +shows which lines these arrays represent. +

+")); +end Heptane; \ No newline at end of file diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Pentane.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Pentane.mo new file mode 100644 index 0000000000..487640a3b1 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Pentane.mo @@ -0,0 +1,58 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids; +record Pentane "Data record for n-pentane (R601)" + extends Generic( + T = { + 263.15 ,284.988888889,306.827777778,328.666666667, + 350.505555556,372.344444444,394.183333333,416.022222222, + 437.861111111,459.7 }, + p = { + 15196.961880746, 40847.01461526 , 93347.760875795, + 188229.761547615, 344161.604577882, 582381.684493329, + 926479.361144566,1402869.463375476,2042636.912945348, + 2888164.842888385}, + rhoLiq = { + 654.994012423,634.140752869,612.406165595,589.474257693, + 564.920053506,538.129125681,508.125336463,473.116841092, + 428.954697374,359.39054261 }, + dTRef = 30, + sSatLiq = { + -364.770358607,-188.383459065, -18.245572622, 147.200487718, + 309.214016986, 468.928951023, 627.576629898, 786.91058507 , + 950.457609042,1131.212144756}, + sSatVap = { + 1124.757616955,1132.064676189,1153.78271919 ,1185.735649416, + 1224.628540081,1267.744136879,1312.410414419,1355.214297416, + 1390.117806445,1397.022012012}, + sRef = { + 1296.158077524,1301.28713228 ,1321.950521732,1353.859341364, + 1393.796088528,1439.208143314,1487.913190685,1537.898827489, + 1587.138246557,1633.295767519}, + hSatLiq = { + -104421.898943934, -56052.79734228 , -5633.016486273, + 47087.837000979, 102370.736056908, 160525.092863763, + 221987.014134065, 287509.248703003, 358766.967642045, + 442086.536306975}, + hSatVap = { + 287547.387825234,320260.24955903 ,353977.819783112, + 388419.726812333,423228.612037831,457959.489455307, + 491937.078095822,523936.222010323,551277.070188378, + 564279.332284564}, + hRef = { + 335209.266682762,371013.610228284,408087.525730008, + 446185.930365794,485045.348695265,524354.800753776, + 563719.721538978,602626.895309489,640395.197254024, + 676083.07721731 }); + annotation ( + defaultComponentPrefixes = "parameter", + defaultComponentName = "pro", + Documentation(info=" +

+Record containing properties of n-pentane (R601). +Its name in CoolProp is \"n-Pentane\". +A figure in the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +shows which lines these arrays represent. +

+")); +end Pentane; \ No newline at end of file diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Propane.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Propane.mo new file mode 100644 index 0000000000..e092686f71 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Propane.mo @@ -0,0 +1,58 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids; +record Propane "Data record for propane (R290)" + extends Generic( + T = { + 263.15 ,273.898888889,284.647777778,295.396666667, + 306.145555556,316.894444444,327.643333333,338.392222222, + 349.141111111,359.89 }, + p = { + 345279.941449901, 485400.605038304, 664016.115440719, + 887052.541165123,1160724.363224234,1491611.619687285, + 1886825.956981318,2354347.829390035,2903681.060029375, + 3547408.027345188}, + rhoLiq = { + 541.798297226,527.579836833,512.585365108,496.632038772, + 479.466931165,460.721062294,439.816371148,415.748472388, + 386.451358179,346.106437325}, + dTRef = 30, + sSatLiq = { + 908.965062614,1006.779440037,1103.648845716,1200.001618811, + 1296.323530695,1393.220337369,1491.541227233,1592.663453966, + 1699.311221116,1819.013862619}, + sSatVap = { + 2384.567612711,2371.574136657,2361.266030228,2352.732953327, + 2345.022612092,2337.032274329,2327.310860571,2313.560971451, + 2291.337848494,2249.306043938}, + sRef = { + 2566.79611772 ,2555.493081644,2547.750842968,2542.843699325, + 2540.115085679,2538.952119832,2538.763840737,2538.951963132, + 2538.886989404,2537.853328788}, + hSatLiq = { + 175348.350832337,201875.066749143,229271.052773913, + 257657.444992465,287189.506335636,318079.809438811, + 350645.399680575,385417.4820846 ,423455.88738496 , + 467665.980896495}, + hSatVap = { + 563653.161890421,575690.817715341,587248.989642776, + 598170.43877048 ,608244.069220794,617168.568861843, + 624479.74824603 ,629363.595020986,630156.721875167, + 622523.83403136 }, + hRef = { + 614311.232841951,628792.518193016,643090.993507643, + 657134.020145737,670838.112039704,684105.52633736 , + 696821.020909884,708845.675908959,720012.482475496, + 730115.169718242}); + annotation ( + defaultComponentPrefixes = "parameter", + defaultComponentName = "pro", + Documentation(info=" +

+Record containing properties of propane (R290). +Its name in CoolProp is \"Propane\". +A figure in the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +shows which lines these arrays represent. +

+")); +end Propane; \ No newline at end of file diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/R123.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/R123.mo new file mode 100644 index 0000000000..423a9d7632 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/R123.mo @@ -0,0 +1,57 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids; +record R123 "Data record for R123" + extends Generic( + T = { + 263.15 ,283.559,303.968,324.377,344.786,365.195,385.604,406.013, + 426.422,446.831}, + p = { + 20246.950661932, 51440.14631405 , 112811.739858567, + 220592.87790875 , 394048.867245572, 654989.103061425, + 1027610.766894902,1539001.458950504,2221087.046991277, + 3117580.036383462}, + rhoLiq = { + 1550.145747115,1500.60589786 ,1448.898149661,1394.435970728, + 1336.357791907,1273.304710472,1202.9813059 ,1121.108147556, + 1018.10852222 , 859.35313126 }, + dTRef = 30, + sSatLiq = { + 963.291211716,1037.235356603,1107.652872739,1175.077198776, + 1240.006769354,1302.97149577 ,1364.616830223,1425.874631908, + 1488.488045482,1558.197778977}, + sSatVap = { + 1667.453790836,1662.601605167,1663.373652146,1667.947333911, + 1674.895925087,1683.00895072 ,1691.101277177,1697.69913848 , + 1700.178917251,1689.912023319}, + sRef = { + 1737.810016884,1731.404036564,1730.991249439,1734.765535334, + 1741.355559816,1749.682490995,1758.849314222,1768.045202032, + 1776.452208741,1783.116337598}, + hSatLiq = { + 190149.271365683,210376.227418011,231098.48911094 , + 252352.625193384,274200.267099774,296749.550182631, + 320190.923599748,344878.267191074,371581.94622093 , + 402995.865537189}, + hSatVap = { + 375449.654061047,387704.455494463,400019.822985702, + 412228.361018181,424143.959548608,435537.32854304 , + 446084.632282771,455242.550578245,461851.591142172, + 461849.873050608}, + hRef = { + 395009.975047329,408236.58362893 ,421577.684105208, + 434894.002641602,448042.779209191,460871.335148106, + 473205.248708475,484829.998039268,495465.443515065, + 504727.638630622}); + annotation ( + defaultComponentPrefixes = "parameter", + defaultComponentName = "pro", + Documentation(info=" +

+Record containing properties of R123. +Its name in CoolProp is \"R123\". +A figure in the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +shows which lines these arrays represent. +

+")); +end R123; \ No newline at end of file diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/R134a.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/R134a.mo new file mode 100644 index 0000000000..0265b1f00c --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/R134a.mo @@ -0,0 +1,58 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids; +record R134a "Data record for R134a" + extends Generic( + T = { + 263.15 ,274.378888889,285.607777778,296.836666667, + 308.065555556,319.294444444,330.523333333,341.752222222, + 352.981111111,364.21 }, + p = { + 200603.307472702, 306065.144055732, 449719.915074148, + 639730.094514731, 884904.588817354,1194757.011967908, + 1579685.738808544,2051381.787343061,2623740.847778454, + 3315235.242079038}, + rhoLiq = { + 1327.126163441,1290.706177259,1252.384215745,1211.660788636, + 1167.846607299,1119.946901702,1066.43367865 ,1004.714189346, + 929.529223158, 825.767527903}, + dTRef = 30, + sSatLiq = { + 950.647690901,1006.000704972,1060.270839535,1113.712093542, + 1166.611338723,1219.319709948,1272.312300214,1326.324896806, + 1382.758644761,1445.49325885 }, + sSatVap = { + 1733.350797261,1726.412875563,1721.041565618,1716.692460392, + 1712.816408039,1708.79575006 ,1703.835616881,1696.731056518, + 1685.221329816,1663.254186971}, + sRef = { + 1825.651782765,1819.26336679 ,1814.857399221,1811.970391363, + 1810.194406344,1809.157628299,1808.50662669 ,1807.888965926, + 1806.93261727 ,1805.200478092}, + hSatLiq = { + 186696.59112921 ,201653.015599322,216960.445937552, + 232677.402848669,248882.679090854,265687.289291076, + 283257.907432927,301870.718852068,322069.176904733, + 345362.177321903}, + hSatVap = { + 392664.913567861,399318.906508085,405681.704634567, + 411664.085009797,417149.647216853,421974.269587487, + 425886.432468616,428457.847058395,428832.791544889, + 424672.884952779}, + hRef = { + 418317.035128306,426163.587402212,433855.473474184, + 441342.371701698,448569.586759484,455475.412466164, + 461988.043511396,468022.071596944,473474.189346821, + 478212.639980691}); + annotation ( + defaultComponentPrefixes = "parameter", + defaultComponentName = "pro", + Documentation(info=" +

+Record containing properties of R134a. +Its name in CoolProp is \"R134a\". +A figure in the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +shows which lines these arrays represent. +

+")); +end R134a; \ No newline at end of file diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/R245fa.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/R245fa.mo new file mode 100644 index 0000000000..74dda59b71 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/R245fa.mo @@ -0,0 +1,58 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids; +record R245fa "Data record for R245fa" + extends Generic( + T = { + 263.15 ,280.245555556,297.341111111,314.436666667, + 331.532222222,348.627777778,365.723333333,382.818888889, + 399.914444444,417.01 }, + p = { + 33074.455269577, 72887.366701788, 144193.124203996, + 261432.955364019, 441494.101343335, 703414.198474153, + 1068359.342462996,1560145.848431753,2206880.485192474, + 3045794.17123294 }, + rhoLiq = { + 1428.970464918,1385.766605559,1340.65562986 ,1293.01283556 , + 1241.96829885 ,1186.239888383,1123.767592805,1050.81390283 , + 959.216593671, 822.828460561}, + dTRef = 30, + sSatLiq = { + 956.193112483,1035.364417516,1111.944630847,1186.435838862, + 1259.293596381,1330.986299328,1402.082979051,1473.433817707, + 1546.692369155,1626.938235226}, + sSatVap = { + 1753.339480749,1752.701557681,1756.61081491 ,1763.705762957, + 1772.828904987,1782.876329527,1792.610957024,1800.320573857, + 1802.878905152,1791.348871671}, + sRef = { + 1843.301914471,1841.682942619,1845.068883248,1852.125571196, + 1861.778475563,1873.119878874,1885.336511854,1897.653409147, + 1909.296310246,1919.468376844}, + hSatLiq = { + 188217.135523087,209752.050428183,231916.973241534, + 254789.508127216,278461.658759156,303057.594061445, + 328767.54169158 ,355926.037457738,385245.530754186, + 418981.075267556}, + hSatVap = { + 397986.202332377,410782.595794416,423602.732706635, + 436304.338826503,448715.160811117,460599.011089822, + 471592.735555778,481064.462239284,487698.226971601, + 487541.954771701}, + hRef = { + 422999.193929367,437043.348637611,451220.086433009, + 465419.510903738,479522.71650364 ,493393.292575899, + 506866.898229809,519740.667011956,531767.47525367 , + 542662.050436945}); + annotation ( + defaultComponentPrefixes = "parameter", + defaultComponentName = "pro", + Documentation(info=" +

+Record containing properties of R245fa. +Its name in CoolProp is \"R245fa\". +A figure in the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +shows which lines these arrays represent. +

+")); +end R245fa; \ No newline at end of file diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/R32.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/R32.mo new file mode 100644 index 0000000000..5d27e81c87 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/R32.mo @@ -0,0 +1,58 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids; +record R32 "Data record for R32" + extends Generic( + T = { + 263.15 ,271.828333333,280.506666667,289.185 , + 297.863333333,306.541666667,315.22 ,323.898333333, + 332.576666667,341.255 }, + p = { + 582632.423455563, 779227.155447199,1022507.826631392, + 1319243.784536832,1676689.244070605,2102683.141551342, + 2605825.859299297,3195797.469126429,3883981.451679397, + 4684958.748097608}, + rhoLiq = { + 1088.762616995,1059.796758515,1029.295189956, 996.920197574, + 962.201981414, 924.453822345, 882.605293946, 834.832837403, + 777.582757731, 702.054968683}, + dTRef = 30, + sSatLiq = { + 936.52451307 , 991.659733916,1046.223239241,1100.490775854, + 1154.795359523,1209.572891273,1265.450416315,1323.441013333, + 1385.463021423,1456.23976066 }, + sSatVap = { + 2191.530923721,2159.130803487,2127.849016758,2097.105691514, + 2066.253567277,2034.508896214,2000.819981866,1963.579527028, + 1919.859591813,1862.561221543}, + sRef = { + 2304.157093291,2274.544797147,2246.748153968,2220.383262429, + 2195.095643776,2170.551795417,2146.430627551,2122.413280091, + 2098.166495379,2073.295617553}, + hSatLiq = { + 182764.696330276,197695.34939879 ,212996.704346489, + 228747.503919312,245052.432711042,262058.639462482, + 279988.045994578,299208.744263246,320424.342790452, + 345361.467556621}, + hSatVap = { + 513019.633293376,515047.064455002,516399.945778408, + 516953.588304626,516542.412668788,514935.89731114 , + 511791.24044753 ,506548.541951439,498152.172848862, + 484020.697690199}, + hRef = { + 544272.165701895,548069.095566735,551444.02060146 , + 554348.972337043,556731.55185084 ,558534.039175514, + 559692.26585121 ,560133.992100001,559775.669486533, + 558511.071672622}); + annotation ( + defaultComponentPrefixes = "parameter", + defaultComponentName = "pro", + Documentation(info=" +

+Record containing properties of R32. +Its name in CoolProp is \"R32\". +A figure in the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +shows which lines these arrays represent. +

+")); +end R32; \ No newline at end of file diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Toluene.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Toluene.mo new file mode 100644 index 0000000000..97423305d3 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/Toluene.mo @@ -0,0 +1,56 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids; +record Toluene "Data record for toluene" + extends Generic( + T = { + 263.15,298.55,333.95,369.35,404.75,440.15,475.55,510.95,546.35, + 581.75}, + p = { + 4.658645382e+02,3.878506476e+03,1.913620075e+04,6.607278574e+04, + 1.775240880e+05,3.982149511e+05,7.826031771e+05,1.394511614e+06, + 2.312008822e+06,3.647284909e+06}, + rhoLiq = { + 894.591737923,861.787657162,828.382229573,793.747189122, + 757.123274828,717.4577212 ,673.073614045,620.835702655, + 553.321381336,437.838439728}, + dTRef = 30, + sSatLiq = { + -670.300584422,-462.345778557,-265.173474299, -75.486089983, + 108.735317728, 288.918011292, 466.37022759 , 642.81477669 , + 821.684991655,1017.475208721}, + sSatVap = { + 978.30668321 , 919.722310325, 907.690979281, 926.229656023, + 964.682067033,1015.530364113,1072.870878952,1130.921098435, + 1181.095766989,1195.352192032}, + sRef = { + 1091.412085347,1033.610736055,1022.489953315,1042.016294547, + 1081.594543273,1133.917046387,1193.599794878,1256.201212851, + 1317.428314692,1372.739080272}, + hSatLiq = { + -215928.299658583,-157558.83018377 , -95210.963812949, + -28467.959306084, 42965.246838653, 119373.480365183, + 201168.191553062, 289147.81263614 , 385288.937285889, + 498520.557921947}, + hSatVap = { + 217902.702818657,255057.597752471,296467.120460337, + 341515.751482012,389409.693620114,439191.907459599, + 489589.576308111,538545.73773166 ,581653.014389845, + 602000.492963232}, + hRef = { + 249364.004857819,290767.909737456,336525.499214213, + 386015.721699957,438478.677428664,493067.399188192, + 548799.919772023,604412.858652115,658123.631255034, + 707533.724749596}); + annotation ( + defaultComponentPrefixes = "parameter", + defaultComponentName = "pro", + Documentation(info=" +

+Record containing properties of toluene. +Its name in CoolProp is \"Toluene\". +A figure in the documentation of + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +shows which lines these arrays represent. +

+")); +end Toluene; \ No newline at end of file diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/package.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/package.mo new file mode 100644 index 0000000000..af0fe1a2ec --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/package.mo @@ -0,0 +1,9 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Data; +package WorkingFluids "Package with working fluid data" + extends Modelica.Icons.Package; + annotation (Documentation(info=" +

+Package for data records of specific working fluids. +

+")); +end WorkingFluids; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/package.order b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/package.order new file mode 100644 index 0000000000..a579853c54 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/WorkingFluids/package.order @@ -0,0 +1,10 @@ +Acetone +Ethanol +Heptane +Pentane +Propane +R123 +R134a +R245fa +R32 +Toluene diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/package.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Data/package.mo new file mode 100644 index 0000000000..66dbc9604a --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/package.mo @@ -0,0 +1,9 @@ +within IBPSA.Fluid.CHPs.OrganicRankine; +package Data "Package with working fluid data" + extends Modelica.Icons.MaterialPropertiesPackage; + annotation (Documentation(info=" +

+Package for data records of working fluids. +

+")); +end Data; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Data/package.order b/IBPSA/Fluid/CHPs/OrganicRankine/Data/package.order new file mode 100644 index 0000000000..954861e71c --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Data/package.order @@ -0,0 +1,2 @@ +Generic +WorkingFluids diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Examples/ORCHotWater.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Examples/ORCHotWater.mo new file mode 100644 index 0000000000..c6834bc851 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Examples/ORCHotWater.mo @@ -0,0 +1,232 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Examples; +model ORCHotWater "ORC that outputs hot water at a fixed temperature" + extends Modelica.Icons.Example; + + package MediumHot = IBPSA.Media.Air "Evaporator hot fluid"; + package MediumCol = IBPSA.Media.Water "Condenser cold fluid"; + + parameter Modelica.Units.SI.MassFlowRate mHot_flow_nominal = 1 + "Nominal mass flow rate of evaporator hot fluid"; + parameter Modelica.Units.SI.MassFlowRate mCol_flow_nominal = 1.35 + "Nominal mass flow rate of condenser cold fluid"; + parameter Modelica.Units.SI.PressureDifference dpCon_nominal( + displayUnit = "Pa") = 10000 + "Nominal pressure drop across the ORC condenser"; + parameter Modelica.Units.SI.PressureDifference dpValCol_nominal( + displayUnit = "Pa") = 10000 + "Nominal pressure difference used for valves in the cold fluid loop"; + parameter Modelica.Units.SI.ThermodynamicTemperature TCol_start = 35 + 273.15 + "Start value for cold fluid temperature"; + + IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation orc( + redeclare final package Medium1 = MediumHot, + redeclare final package Medium2 = MediumCol, + T2_start=TCol_start, + redeclare IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids.R123 pro, + final mHot_flow_nominal=mHot_flow_nominal, + dTPinEva_set=5, + TWorEva=373.15, + pWorEva(displayUnit="bar"), + final mCol_flow_nominal=mCol_flow_nominal, + dpHot_nominal=0, + dpCol_nominal=0, + dTPinCon=5, + mWor_flow_max=0.5, + mWor_flow_min=0.1, + mWor_flow_hysteresis=0.05, + etaExp=0.8, + etaPum=0.6) "Organic Rankine cycle" + annotation (Placement(transformation(extent={{-40,-44},{-20,-24}}))); + + Modelica.Units.SI.Efficiency etaThe =orc.PExp / max(orc.QEva_flow,1) + "Thermal efficiency of the ORC"; + + IBPSA.Fluid.Sources.MassFlowSource_T souHot( + redeclare final package Medium = MediumHot, + m_flow=mHot_flow_nominal, + T=423.15, + nPorts=1) "Evaporator hot fluid source" + annotation (Placement(transformation(extent={{-180,80},{-160,100}}))); + IBPSA.Fluid.Sources.Boundary_pT sinHot( + redeclare final package Medium = MediumHot, + nPorts=1) "Evaporator hot fluid sink" + annotation (Placement(transformation(extent={{120,80},{100,100}}))); + IBPSA.Controls.Continuous.LimPID conPI( + controllerType=Modelica.Blocks.Types.SimpleController.PI, + k=0.25, + Ti=30, + Ni=0.2, + initType=Modelica.Blocks.Types.Init.InitialOutput, + y_start=0, + reverseActing=false) "PI controller" + annotation (Placement(transformation(extent={{40,0},{60,20}}))); + Modelica.Blocks.Sources.Constant TWatOut_set(k=55 + 273.15) + "Set point of hot water output" + annotation (Placement(transformation(extent={{0,0},{20,20}}))); + IBPSA.Fluid.Sources.Boundary_pT colBou( + redeclare final package Medium = MediumCol, + use_T_in=true, + nPorts=2) "Cold fluid boundary conditions" + annotation (Placement(transformation(extent={{10,-10},{-10,10}},rotation=0,origin={110,-60}))); + IBPSA.Fluid.Sensors.TemperatureTwoPort senTWatSup( + redeclare final package Medium = MediumCol, + m_flow_nominal=mCol_flow_nominal, + T_start=TCol_start) + "Water supply temperature" annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=0, + origin={70,-80}))); + IBPSA.Fluid.Sensors.TemperatureTwoPort senTWatRet( + redeclare final package Medium = MediumCol, + m_flow_nominal=mCol_flow_nominal, + T_start=TCol_start) + "Water return temperature" annotation (Placement(transformation( + extent={{10,-10},{-10,10}}, + rotation=0, + origin={70,-40}))); + Modelica.Blocks.Sources.TimeTable TWatRet( + y(final unit="K", displayUnit="degC"), + table=[0,35; 3,35; 6,45; 9,45], + timeScale=100, + offset=273.15) "Water return temperature values" + annotation (Placement(transformation(extent={{170,-70},{150,-50}}))); + IBPSA.Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear val( + redeclare final package Medium = MediumCol, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + T_start=TCol_start, + from_dp=false, + use_inputFilter=false, + final m_flow_nominal=mCol_flow_nominal, + final dpValve_nominal=dpValCol_nominal, + final dpFixed_nominal=fill(dpCon_nominal, 2)) "Control valve" + annotation (Placement(transformation( + extent={{-10,10},{10,-10}}, + rotation=180, + origin={40,-40}))); + IBPSA.Fluid.Movers.Preconfigured.FlowControlled_m_flow pum( + redeclare final package Medium = MediumCol, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + T_start=TCol_start, + addPowerToMedium=false, + m_flow_nominal=mCol_flow_nominal, + dp_nominal=dpCon_nominal + dpValCol_nominal, + m_flow_start=0) "Cooling water pump" + annotation (Placement(transformation(extent={{-100,-50},{-120,-30}}))); + IBPSA.Fluid.FixedResistances.Junction spl( + redeclare final package Medium = MediumCol, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + final dp_nominal=fill(0,3), + final m_flow_nominal=mCol_flow_nominal .* {1,-1,-1}, + final from_dp=false, + T_start=TCol_start) "Flow splitter" + annotation (Placement(transformation( + extent={{10,-10},{-10,10}}, + rotation=180, + origin={40,-80}))); + Modelica.Blocks.Math.BooleanToReal booToRea( + realTrue = mCol_flow_nominal) + "Constant speed primary pump control signal" + annotation (Placement(transformation(extent={{-140,0},{-120,20}}))); + Modelica.Blocks.Logical.Hysteresis hys( + uLow=mCol_flow_nominal/3, + uHigh=mCol_flow_nominal/2) "Hysteresis" + annotation (Placement(transformation(extent={{-180,40},{-160,60}}))); + Modelica.Blocks.Logical.And and1 + annotation (Placement(transformation(extent={{-140,40},{-120,60}}))); + IBPSA.Fluid.Sensors.TemperatureTwoPort senTColOut( + redeclare final package Medium = MediumCol, + m_flow_nominal=mCol_flow_nominal, + T_start=TCol_start) annotation (Placement( + transformation( + extent={{10,-10},{-10,10}}, + rotation=0, + origin={-70,-40}))); + IBPSA.Fluid.Sensors.MassFlowRate senMasFlo( + redeclare final package Medium = MediumCol) + "Mass flow rate sensor for the ORC condenser cold fluid" + annotation (Placement(transformation(extent={{-140,-50},{-160,-30}}))); + Modelica.Blocks.Sources.BooleanTable booTab(table={100}, startValue=false) + "Boolean table with initial false" + annotation (Placement(transformation(extent={{-180,0},{-160,20}}))); +equation + connect(orc.port_b1, sinHot.ports[1]) annotation (Line(points={{-20,-28},{-14, + -28},{-14,90},{100,90}}, + color={0,127,255})); + connect(souHot.ports[1], orc.port_a1) annotation (Line(points={{-160,90},{-46, + 90},{-46,-28},{-40,-28}}, + color={0,127,255})); + connect(TWatOut_set.y, conPI.u_s) + annotation (Line(points={{21,10},{38,10}}, color={0,0,127})); + connect(colBou.ports[1], senTWatSup.port_b) annotation (Line(points={{100,-61}, + {100,-80},{80,-80}}, color={0,127,255})); + connect(senTWatRet.port_a, colBou.ports[2]) annotation (Line(points={{80,-40}, + {100,-40},{100,-59}}, color={0,127,255})); + connect(TWatRet.y, colBou.T_in) annotation (Line(points={{149,-60},{132,-60}, + {132,-56},{122,-56}},color={0,0,127})); + connect(senTWatRet.port_b, val.port_1) + annotation (Line(points={{60,-40},{50,-40}}, color={0,127,255})); + connect(spl.port_3, val.port_3) annotation (Line(points={{40,-70},{40,-50}}, + color={0,127,255})); + connect(spl.port_2, senTWatSup.port_a) annotation (Line(points={{50,-80},{60,-80}}, + color={0,127,255})); + connect(conPI.y, val.y) + annotation (Line(points={{61,10},{80,10},{80,-20},{40,-20},{40,-28}}, + color={0,0,127})); + connect(and1.y, orc.ena) annotation (Line(points={{-119,50},{-54,50},{-54,-34}, + {-41,-34}},color={255,0,255})); + connect(orc.port_b2,senTColOut. port_a) annotation (Line(points={{-40,-40},{-60, + -40}}, color={0,127,255})); + connect(senTColOut.port_b, pum.port_a) + annotation (Line(points={{-80,-40},{-100,-40}}, color={0,127,255})); + connect(senTColOut.T, conPI.u_m) annotation (Line(points={{-70,-29},{-70,-12}, + {50,-12},{50,-2}}, color={0,0,127})); + connect(val.port_2, orc.port_a2) annotation (Line(points={{30,-40},{-20,-40}}, + color={0,127,255})); + connect(pum.m_flow_in, booToRea.y) + annotation (Line(points={{-110,-28},{-110,10},{-118,10}}, + color={0,0,127})); + connect(spl.port_1, senMasFlo.port_b) annotation (Line(points={{30,-80},{-180, + -80},{-180,-40},{-160,-40}}, + color={0,127,255})); + connect(senMasFlo.port_a, pum.port_b) + annotation (Line(points={{-140,-40},{-120,-40}}, color={0,127,255})); + connect(booTab.y, booToRea.u) + annotation (Line(points={{-159,10},{-142,10}}, color={255,0,255})); + connect(booTab.y, and1.u2) annotation (Line(points={{-159,10},{-150,10},{-150, + 42},{-142,42}}, color={255,0,255})); + connect(hys.y, and1.u1) + annotation (Line(points={{-158,50},{-142,50}}, color={255,0,255})); + connect(senMasFlo.m_flow, hys.u) annotation (Line(points={{-150,-29},{-150,-20}, + {-190,-20},{-190,50},{-182,50}}, color={0,0,127})); +annotation(experiment(StopTime=900,Tolerance=1E-6), + __Dymola_Commands(file="modelica://IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/Examples/ORCHotWater.mos" + "Simulate and plot"), + Documentation(info=" +

+This example model demonstrates how + +IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation +can be integrated in a system. +The three-way valve is controlled to track the hot water +output temperature, which is the cold fluid of the ORC, +at a set point of 55°C. +The system and control are similar to the one implemented in + +IBPSA.DHC.ETS.Combined.Subsystems.Validation.Chiller. +

+

+In addition, a safety control sequence prevents the ORC from turning on +until a minimum flow rate is established in the condenser water loop. +

+",revisions=" + +"), + Diagram(coordinateSystem(extent={{-200,-100},{180,120}})), + Icon(coordinateSystem(extent={{-100,-100},{100,100}}))); +end ORCHotWater; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Examples/package.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Examples/package.mo new file mode 100644 index 0000000000..b65f7b7652 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Examples/package.mo @@ -0,0 +1,9 @@ +within IBPSA.Fluid.CHPs.OrganicRankine; +package Examples "Package containing example models" + extends Modelica.Icons.ExamplesPackage; +annotation (preferredView="info", Documentation(info=" +

+This package contains examples. +

+")); +end Examples; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Examples/package.order b/IBPSA/Fluid/CHPs/OrganicRankine/Examples/package.order new file mode 100644 index 0000000000..8ad1dded5c --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Examples/package.order @@ -0,0 +1 @@ +ORCHotWater diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Validation/VariableSource.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Validation/VariableSource.mo new file mode 100644 index 0000000000..9df9da0be9 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Validation/VariableSource.mo @@ -0,0 +1,155 @@ +within IBPSA.Fluid.CHPs.OrganicRankine.Validation; +model VariableSource + "ORC with waste heat stream with variable flow rate and temperature" + extends Modelica.Icons.Example; + + package MediumHot = IBPSA.Media.Air "Evaporator hot fluid"; + package MediumCol = IBPSA.Media.Water "Condenser cold fluid"; + + parameter IBPSA.Fluid.CHPs.OrganicRankine.Data.WorkingFluids.R245fa pro + "Property record of the working fluid" + annotation (Placement(transformation(extent={{20,60},{40,80}}))); + parameter Modelica.Units.SI.MassFlowRate mHot_flow_nominal = 1 + "Nominal mass flow rate of evaporator hot fluid"; + parameter Modelica.Units.SI.MassFlowRate mCol_flow_nominal = 1 + "Nominal mass flow rate of condenser cold fluid"; + + IBPSA.Fluid.CHPs.OrganicRankine.ConstantEvaporation orc( + redeclare package Medium1 = MediumHot, + redeclare package Medium2 = MediumCol, + pro=pro, + tau1=0, + tau2=0, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + T1_start(displayUnit="K") = 350, + T2_start(displayUnit="K") = 290, + dpHot_nominal = 0, + dpCol_nominal = 0, + mHot_flow_nominal=mHot_flow_nominal, + mCol_flow_nominal=mCol_flow_nominal, + mWor_flow_max = + 3E4 / ( + IBPSA.Utilities.Math.Functions.smoothInterpolation( + x = orc.TWorEva, + xSup = pro.T, + ySup = pro.hSatVap) - + IBPSA.Utilities.Math.Functions.smoothInterpolation( + x = 300, + xSup = pro.T, + ySup = pro.hSatLiq)), + mWor_flow_min = orc.mWor_flow_max * 0.2, + TWorEva=350, + etaExp=0.7, + etaPum=0.7) "Organic Rankine cycle" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); + IBPSA.Fluid.Sources.MassFlowSource_T souHot( + redeclare final package Medium = MediumHot, + m_flow=mHot_flow_nominal, + T=orc.TWorEva + 20, + nPorts=1, + use_m_flow_in=true, + use_T_in=true) "Evaporator hot fluid source" + annotation (Placement(transformation(extent={{-40,20},{-20,40}}))); + IBPSA.Fluid.Sources.Boundary_pT sinHot( + redeclare final package Medium = MediumHot, + nPorts=1) "Evaporator hot fluid sink" + annotation (Placement(transformation(extent={{80,20},{60,40}}))); + IBPSA.Fluid.Sources.MassFlowSource_T souCol( + redeclare final package Medium = MediumCol, + m_flow=mCol_flow_nominal, + nPorts=1) "Condenser cold fluid source" + annotation (Placement(transformation(extent={{40,-40},{20,-20}}))); + IBPSA.Fluid.Sources.Boundary_pT sinCol( + redeclare final package Medium = MediumCol, + nPorts=1) "Condenser cold fluid sink" + annotation (Placement(transformation(extent={{-80,-40},{-60,-20}}))); + IBPSA.Fluid.Sensors.TemperatureTwoPort THotOut( + redeclare final package Medium = MediumHot, + final m_flow_nominal=mHot_flow_nominal, + tau=0) "Outgoing temperature of evaporator hot fluid" + annotation (Placement(transformation(extent={{30,20},{50,40}}))); + IBPSA.Fluid.Sensors.TemperatureTwoPort TColOut( + redeclare final package Medium = MediumCol, + final m_flow_nominal=mCol_flow_nominal, + tau=0) "Outgoing temperature of condenser cold fluid" + annotation (Placement(transformation(extent={{-30,-40},{-50,-20}}))); + + Modelica.Blocks.Sources.BooleanConstant tru(k=true) "Constant true" + annotation (Placement(transformation(extent={{-40,-10},{-20,10}}))); + + Modelica.Blocks.Sources.TimeTable mHot_flow_set(table=[ + 0,0; + 20,0; + 50,mHot_flow_nominal*1.5; + 250,mHot_flow_nominal*1.5; + 280,0; + 300,0]) + "Sets the hot fluid flow rate in the evaporator" + annotation (Placement(transformation(extent={{-80,40},{-60,60}}))); + Modelica.Blocks.Sources.TimeTable THotIn_set(table=[ + 0,orc.TWorEva + 20; + 100,orc.TWorEva + 20; + 150,orc.TWorEva - 5; + 200,orc.TWorEva + 20; + 300,orc.TWorEva + 20]) + "Sets the hot fluid incoming temperature in the evaporator" + annotation (Placement(transformation(extent={{-80,0},{-60,20}}))); +equation + connect(souHot.ports[1],orc. port_a1) annotation (Line(points={{-20,30},{-16,30}, + {-16,6},{-10,6}}, color={0,127,255})); + connect(souCol.ports[1],orc. port_a2) annotation (Line(points={{20,-30},{16,-30}, + {16,-6},{10,-6}}, color={0,127,255})); + connect(sinHot.ports[1],THotOut. port_b) + annotation (Line(points={{60,30},{50,30}}, color={0,127,255})); + connect(THotOut.port_a,orc. port_b1) annotation (Line(points={{30,30},{16,30}, + {16,6},{10,6}}, color={0,127,255})); + connect(TColOut.port_a,orc. port_b2) annotation (Line(points={{-30,-30},{-16,-30}, + {-16,-6},{-10,-6}}, color={0,127,255})); + connect(sinCol.ports[1], TColOut.port_b) + annotation (Line(points={{-60,-30},{-50,-30}}, color={0,127,255})); + connect(tru.y, orc.ena) + annotation (Line(points={{-19,0},{-11,0}},color={255,0,255})); + connect(mHot_flow_set.y, souHot.m_flow_in) annotation (Line(points={{-59,50},{ + -50,50},{-50,38},{-42,38}}, color={0,0,127})); + connect(THotIn_set.y, souHot.T_in) annotation (Line(points={{-59,10},{-50,10}, + {-50,34},{-42,34}}, color={0,0,127})); + annotation(experiment(StopTime=300,Tolerance=1E-6), + __Dymola_Commands(file="modelica://IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/Validation/VariableSource.mos" + "Simulate and plot"), + Documentation(info=" +

+This model demonstrates how the ORC model reacts to variable flow rate +and temperature of the incoming hot fluid carrying waste heat. +Normally, the working fluid flow rate of the cycle +w is found from +the set point for the evaporator pinch point temperature differential +ΔTpin,eva. +This constraint is relaxed under any of the following two conditions: +

+ +",revisions=" + +")); +end VariableSource; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Validation/package.mo b/IBPSA/Fluid/CHPs/OrganicRankine/Validation/package.mo new file mode 100644 index 0000000000..62441fab23 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Validation/package.mo @@ -0,0 +1,20 @@ +within IBPSA.Fluid.CHPs.OrganicRankine; +package Validation "Collection of validation models" + extends Modelica.Icons.ExamplesPackage; + +annotation (preferredView="info", Documentation(info=" +

+This package contains validation models for the classes in + +IBPSA.Fluid.CHPs.OrganicRankine. +

+

+Note that most validation models contain simple input data +which may not be realistic, but for which the correct +output can be obtained through an analytic solution. +The examples plot various outputs, which have been verified against these +solutions. These model outputs are stored as reference data and +used for continuous validation whenever models in the library change. +

+")); +end Validation; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/Validation/package.order b/IBPSA/Fluid/CHPs/OrganicRankine/Validation/package.order new file mode 100644 index 0000000000..cd35ba383f --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/Validation/package.order @@ -0,0 +1 @@ +VariableSource diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/package.mo b/IBPSA/Fluid/CHPs/OrganicRankine/package.mo new file mode 100644 index 0000000000..9a4fcf0106 --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/package.mo @@ -0,0 +1,9 @@ +within IBPSA.Fluid.CHPs; +package OrganicRankine "Package for the rankine cycle" + extends Modelica.Icons.VariantsPackage; + annotation (Documentation(info=" +

+Package with a model of an organic Rankine cycle. +

+")); +end OrganicRankine; diff --git a/IBPSA/Fluid/CHPs/OrganicRankine/package.order b/IBPSA/Fluid/CHPs/OrganicRankine/package.order new file mode 100644 index 0000000000..cdf4e1c5fa --- /dev/null +++ b/IBPSA/Fluid/CHPs/OrganicRankine/package.order @@ -0,0 +1,5 @@ +ConstantEvaporation +Data +Examples +Validation +BaseClasses diff --git a/IBPSA/Fluid/CHPs/package.mo b/IBPSA/Fluid/CHPs/package.mo new file mode 100644 index 0000000000..91192f873f --- /dev/null +++ b/IBPSA/Fluid/CHPs/package.mo @@ -0,0 +1,10 @@ +within IBPSA.Fluid; +package CHPs "Package with model for combined heat and power device" + extends Modelica.Icons.VariantsPackage; + +annotation (preferredView="info", Documentation(info=" +

+This package contains models for combined heat and power plant. +

+")); +end CHPs; diff --git a/IBPSA/Fluid/CHPs/package.order b/IBPSA/Fluid/CHPs/package.order new file mode 100644 index 0000000000..7ec1bfe1a5 --- /dev/null +++ b/IBPSA/Fluid/CHPs/package.order @@ -0,0 +1 @@ +OrganicRankine diff --git a/IBPSA/Fluid/package.order b/IBPSA/Fluid/package.order index 43ef0cc687..74bde15564 100644 --- a/IBPSA/Fluid/package.order +++ b/IBPSA/Fluid/package.order @@ -1,5 +1,6 @@ UsersGuide Actuators +CHPs Chillers Delays FMI diff --git a/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/ComputationPaths.pdf b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/ComputationPaths.pdf new file mode 100644 index 0000000000..0da76d1e29 Binary files /dev/null and b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/ComputationPaths.pdf differ diff --git a/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/ComputationPaths.png b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/ComputationPaths.png new file mode 100644 index 0000000000..12b57fa05b Binary files /dev/null and b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/ComputationPaths.png differ diff --git a/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/ComputationPaths.svg b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/ComputationPaths.svg new file mode 100644 index 0000000000..6e56f6ca1a --- /dev/null +++ b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/ComputationPaths.svg @@ -0,0 +1,684 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Evaporator + (a) + Condenser + T + peva + pcon + ηexp + s + + + + + exp,out + exp,in + exp,out,ise + + + + + + + Evaporator + (b) + Condenser + T + peva + pcon + ηexp + s + + + + + exp,out + exp,in + exp,out,ise + + + + + + Evaporator + (c) + Condenser + T + peva + pcon + ηexp + s + + + + + exp,out + exp,in + exp,in,ise + + + + + + diff --git a/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/CycleArchitecture.pdf b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/CycleArchitecture.pdf new file mode 100644 index 0000000000..9a6d2e3b28 Binary files /dev/null and b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/CycleArchitecture.pdf differ diff --git a/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/CycleArchitecture.png b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/CycleArchitecture.png new file mode 100644 index 0000000000..b1ff89d604 Binary files /dev/null and b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/CycleArchitecture.png differ diff --git a/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/CycleArchitecture.svg b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/CycleArchitecture.svg new file mode 100644 index 0000000000..f81e8d2928 --- /dev/null +++ b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/CycleArchitecture.svg @@ -0,0 +1,621 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + exp,in + PP + PP + Evaporator + Condenser + pum,in + T + Th,in + ΔTpin,eva + Th,pin + Tw,eva + Th,out + Tc,out + Tc,in + s + exp,out + + + + + + ΔTpin,con + Tc,pin + Tw,con + + + pum,out + + + Evaporator + (b) + (a) + Condenser + T + s + + + exp,out + exp,in + pum,in + pum,out + + Th,out + Th,in + Tc,out + Tc,in + peva + Tw,eva + Tw,con + PP + + + PP + + + diff --git a/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/SupportCurves.pdf b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/SupportCurves.pdf new file mode 100644 index 0000000000..db0b5984bc Binary files /dev/null and b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/SupportCurves.pdf differ diff --git a/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/SupportCurves.png b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/SupportCurves.png new file mode 100644 index 0000000000..47e51ccbf2 Binary files /dev/null and b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/SupportCurves.png differ diff --git a/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/SupportCurves.svg b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/SupportCurves.svg new file mode 100644 index 0000000000..9b556a6da6 --- /dev/null +++ b/IBPSA/Resources/Images/Fluid/CHPs/OrganicRankine/SupportCurves.svg @@ -0,0 +1,234 @@ + + + + + + + + + + + A + B + C + + + + T + s + + + + + Isobars + Saturated liquid + Saturated vapour + Superheated vapour(Reference line) + + + + 1 + + 2 + + + 3 + + + diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_CHPs_OrganicRankine_BaseClasses_Validation_DryFluid.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_CHPs_OrganicRankine_BaseClasses_Validation_DryFluid.txt new file mode 100644 index 0000000000..3815da5c55 --- /dev/null +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_CHPs_OrganicRankine_BaseClasses_Validation_DryFluid.txt @@ -0,0 +1,9 @@ +last-generated=2024-08-20 +statistics-simulation= +{ + "linear": " ", + "nonlinear": " ", + "numerical Jacobians": "0" +} +time=[0e+00, 1e+00] +cyc.etaThe=[1.980379521846771e-01, 1.980379521846771e-01] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_CHPs_OrganicRankine_BaseClasses_Validation_WetFluid.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_CHPs_OrganicRankine_BaseClasses_Validation_WetFluid.txt new file mode 100644 index 0000000000..ddb05ccefa --- /dev/null +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_CHPs_OrganicRankine_BaseClasses_Validation_WetFluid.txt @@ -0,0 +1,10 @@ +last-generated=2024-08-20 +statistics-simulation= +{ + "linear": " ", + "nonlinear": " ", + "numerical Jacobians": "0" +} +time=[0e+00, 1e+00] +cyc.etaThe=[8.098627626895905e-02, 8.098627626895905e-02] +cyc.dTSup=[3.80600905418396e+00, 3.80600905418396e+00] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_CHPs_OrganicRankine_Examples_ORCHotWater.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_CHPs_OrganicRankine_Examples_ORCHotWater.txt new file mode 100644 index 0000000000..1c97067a36 --- /dev/null +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_CHPs_OrganicRankine_Examples_ORCHotWater.txt @@ -0,0 +1,21 @@ +last-generated=2024-08-20 +statistics-initialization= +{ + "nonlinear": "1, 0, 1", + "numerical Jacobians": "0" +} +statistics-simulation= +{ + "linear": "0", + "nonlinear": "1, 4, 1", + "number of continuous time states": "10", + "numerical Jacobians": "0" +} +time=[0e+00, 9e+02] +pum.m_flow=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 8.276177644729614e-01, 1.260666489601135e+00, 1.337571144104004e+00, 1.34843111038208e+00, 1.349812865257263e+00, 1.349978446960449e+00, 1.349997639656067e+00, 1.349999785423279e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00, 1.350000023841858e+00] +orc.PExp=[-0e+00, -0e+00, -0e+00, -0e+00, -0e+00, -0e+00, -0e+00, 0e+00, -0e+00, -0e+00, -0e+00, -0e+00, -5.21338525390625e+03, -5.7865263671875e+03, -5.58937744140625e+03, -5.29769775390625e+03, -4.999458984375e+03, -4.70734033203125e+03, -4.429e+03, -4.22086669921875e+03, -4.17293603515625e+03, -4.538412109375e+03, -4.9009267578125e+03, -4.8358515625e+03, -4.63467529296875e+03, -4.5854638671875e+03, -4.67494775390625e+03, -4.73824951171875e+03, -4.7132568359375e+03, -4.6721337890625e+03, -4.670376953125e+03, -4.69179296875e+03, -4.700517578125e+03, -4.6924052734375e+03, -4.68203759765625e+03, -4.675662109375e+03, -4.6782373046875e+03, -4.6823583984375e+03, -4.68229931640625e+03, -4.67996728515625e+03, -4.67886279296875e+03, -4.67931591796875e+03, -4.67972998046875e+03, -4.6793271484375e+03, -4.67857080078125e+03, -4.6780703125e+03, -4.6778203125e+03, -4.6774833984375e+03, -4.67695849609375e+03, -4.67637158203125e+03, -4.67579931640625e+03, -4.6752060546875e+03, -4.67454541015625e+03, -4.6738017578125e+03, -4.6729775390625e+03, -4.67207568359375e+03, -4.671087890625e+03, -4.6699931640625e+03, -4.668767578125e+03, -4.66739013671875e+03, -4.6658388671875e+03, -4.6640849609375e+03, -4.66209716796875e+03, -4.65983984375e+03, -4.6572705078125e+03, -4.65434326171875e+03, -4.6510087890625e+03, -4.64889697265625e+03, -4.66262451171875e+03, -4.681119140625e+03, -4.690369140625e+03, -4.69412451171875e+03, -4.69510302734375e+03, -4.6935986328125e+03, -4.6910537109375e+03, -4.68930322265625e+03, -4.68884423828125e+03, -4.6892099609375e+03, -4.68975537109375e+03, -4.6900927734375e+03, -4.69015234375e+03, -4.69005126953125e+03, -4.6899296875e+03, -4.68986083984375e+03, -4.6898583984375e+03, -4.6898916015625e+03, -4.68992431640625e+03, -4.68993798828125e+03, -4.68993310546875e+03, -4.6899208984375e+03, -4.68991064453125e+03, -4.68990673828125e+03, -4.6899091796875e+03, -4.68991455078125e+03, -4.68991943359375e+03, -4.689921875e+03, -4.6899208984375e+03, -4.68991845703125e+03, -4.6899169921875e+03, -4.68991552734375e+03, -4.6899150390625e+03] +orc.PPum=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 2.194105682373047e+02, 2.296008605957031e+02, 2.262570343017578e+02, 2.210031585693359e+02, 2.152084197998047e+02, 2.090667114257812e+02, 2.027371826171875e+02, 1.976718139648438e+02, 1.964627685546875e+02, 2.052838592529297e+02, 2.131909790039062e+02, 2.118288116455078e+02, 2.07461181640625e+02, 2.063553619384766e+02, 2.0835498046875e+02, 2.097399597167969e+02, 2.091960296630859e+02, 2.082928466796875e+02, 2.082540283203125e+02, 2.087258911132812e+02, 2.089173278808594e+02, 2.087393493652344e+02, 2.085112915039062e+02, 2.083707427978516e+02, 2.084275360107422e+02, 2.085183563232422e+02, 2.085170593261719e+02, 2.084656829833984e+02, 2.084413299560547e+02, 2.084513244628906e+02, 2.0846044921875e+02, 2.084515686035156e+02, 2.084348907470703e+02, 2.084238586425781e+02, 2.084183502197266e+02, 2.084109191894531e+02, 2.083993377685547e+02, 2.083863983154297e+02, 2.083737640380859e+02, 2.083606719970703e+02, 2.083460998535156e+02, 2.083296661376953e+02, 2.083114776611328e+02, 2.082915649414062e+02, 2.082697296142578e+02, 2.082455444335938e+02, 2.082184600830078e+02, 2.0818798828125e+02, 2.081536865234375e+02, 2.081148681640625e+02, 2.080708465576172e+02, 2.080208282470703e+02, 2.079638671875e+02, 2.078989105224609e+02, 2.078248748779297e+02, 2.077779388427734e+02, 2.0808251953125e+02, 2.084910583496094e+02, 2.086946105957031e+02, 2.087770843505859e+02, 2.08798583984375e+02, 2.087655487060547e+02, 2.087096557617188e+02, 2.086711730957031e+02, 2.086610870361328e+02, 2.086691284179688e+02, 2.086811065673828e+02, 2.086885375976562e+02, 2.086898345947266e+02, 2.086876220703125e+02, 2.086849517822266e+02, 2.086834259033203e+02, 2.086833801269531e+02, 2.086841125488281e+02, 2.086848297119141e+02, 2.086851348876953e+02, 2.086850280761719e+02, 2.086847534179688e+02, 2.086845245361328e+02, 2.086844482421875e+02, 2.086844940185547e+02, 2.086846160888672e+02, 2.086847229003906e+02, 2.086847686767578e+02, 2.086847534179688e+02, 2.086847076416016e+02, 2.086846771240234e+02, 2.086846466064453e+02, 2.086846313476562e+02] +orc.QEva_flow=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, -6.2071421875e+04, -6.354440625e+04, -6.304579296875e+04, -6.229257421875e+04, -6.150347265625e+04, -6.071241796875e+04, -5.9942640625e+04, -5.9357390625e+04, -5.922151171875e+04, -6.02470390625e+04, -6.1238625e+04, -6.106259765625e+04, -6.05129296875e+04, -6.037723046875e+04, -6.062362109375e+04, -6.079694921875e+04, -6.072861328125e+04, -6.061589453125e+04, -6.061107421875e+04, -6.066982421875e+04, -6.069373046875e+04, -6.067150390625e+04, -6.064307421875e+04, -6.062558203125e+04, -6.06326484375e+04, -6.0643953125e+04, -6.064379296875e+04, -6.063739453125e+04, -6.063436328125e+04, -6.063560546875e+04, -6.06367421875e+04, -6.063563671875e+04, -6.06335625e+04, -6.063219140625e+04, -6.063150390625e+04, -6.0630578125e+04, -6.062913671875e+04, -6.062752734375e+04, -6.062595703125e+04, -6.0624328125e+04, -6.0622515625e+04, -6.062047265625e+04, -6.06182109375e+04, -6.061573828125e+04, -6.06130234375e+04, -6.061001953125e+04, -6.060665625e+04, -6.060287109375e+04, -6.059861328125e+04, -6.0593796875e+04, -6.05883359375e+04, -6.05821328125e+04, -6.057507421875e+04, -6.056702734375e+04, -6.055786328125e+04, -6.05520546875e+04, -6.058978125e+04, -6.06405546875e+04, -6.0665921875e+04, -6.067621484375e+04, -6.067889453125e+04, -6.06747734375e+04, -6.0667796875e+04, -6.066299609375e+04, -6.066173828125e+04, -6.06627421875e+04, -6.066423828125e+04, -6.06651640625e+04, -6.066532421875e+04, -6.066505078125e+04, -6.066471484375e+04, -6.066452734375e+04, -6.066451953125e+04, -6.066461328125e+04, -6.0664703125e+04, -6.066473828125e+04, -6.06647265625e+04, -6.066469140625e+04, -6.06646640625e+04, -6.066465234375e+04, -6.066466015625e+04, -6.066467578125e+04, -6.06646875e+04, -6.06646953125e+04, -6.066469140625e+04, -6.06646875e+04, -6.06646796875e+04, -6.066467578125e+04, -6.066467578125e+04] +orc.QCon_flow=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 5.707744921875e+04, 5.798748046875e+04, 5.7682671875e+04, 5.721587890625e+04, 5.671921875e+04, 5.621414453125e+04, 5.5716375e+04, 5.53341953125e+04, 5.52450390625e+04, 5.591391015625e+04, 5.655088671875e+04, 5.643857421875e+04, 5.608571484375e+04, 5.599812109375e+04, 5.615702734375e+04, 5.62684375e+04, 5.622455078125e+04, 5.61520546875e+04, 5.614894921875e+04, 5.61867578125e+04, 5.62021328125e+04, 5.61878359375e+04, 5.6169546875e+04, 5.61582890625e+04, 5.61628359375e+04, 5.617011328125e+04, 5.61700078125e+04, 5.6165890625e+04, 5.616394140625e+04, 5.61647421875e+04, 5.616547265625e+04, 5.616476171875e+04, 5.616342578125e+04, 5.616254296875e+04, 5.61621015625e+04, 5.61615078125e+04, 5.6160578125e+04, 5.615954296875e+04, 5.615853125e+04, 5.6157484375e+04, 5.615631640625e+04, 5.615500390625e+04, 5.6153546875e+04, 5.6151953125e+04, 5.615020703125e+04, 5.61482734375e+04, 5.614610546875e+04, 5.614366796875e+04, 5.614092578125e+04, 5.613782421875e+04, 5.613430859375e+04, 5.61303125e+04, 5.6125765625e+04, 5.612058203125e+04, 5.61146796875e+04, 5.61109375e+04, 5.61352421875e+04, 5.616792578125e+04, 5.618424609375e+04, 5.61908671875e+04, 5.619258984375e+04, 5.618994140625e+04, 5.6185453125e+04, 5.61823671875e+04, 5.618155859375e+04, 5.6182203125e+04, 5.61831640625e+04, 5.61837578125e+04, 5.618386328125e+04, 5.61836875e+04, 5.618347265625e+04, 5.618334765625e+04, 5.618334375e+04, 5.618340234375e+04, 5.61834609375e+04, 5.6183484375e+04, 5.61834765625e+04, 5.618345703125e+04, 5.61834375e+04, 5.61834296875e+04, 5.618343359375e+04, 5.61834453125e+04, 5.6183453125e+04, 5.618345703125e+04, 5.618345703125e+04, 5.6183453125e+04, 5.618344921875e+04, 5.61834453125e+04, 5.61834453125e+04] +senTWatSup.T=[3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081500244140625e+02, 3.081500244140625e+02, 3.081500244140625e+02, 3.086663513183594e+02, 3.147927856445312e+02, 3.23910400390625e+02, 3.276824645996094e+02, 3.278363952636719e+02, 3.275316772460938e+02, 3.275317687988281e+02, 3.278418273925781e+02, 3.280816040039062e+02, 3.28080078125e+02, 3.280160827636719e+02, 3.280325927734375e+02, 3.281018981933594e+02, 3.281392517089844e+02, 3.281311645507812e+02, 3.281198120117188e+02, 3.281288757324219e+02, 3.281544494628906e+02, 3.281800231933594e+02, 3.28192138671875e+02, 3.281955871582031e+02, 3.282001037597656e+02, 3.282074279785156e+02, 3.282138671875e+02, 3.282176208496094e+02, 3.282201232910156e+02, 3.282230529785156e+02, 3.282266235351562e+02, 3.282300415039062e+02, 3.282330627441406e+02, 3.28236083984375e+02, 3.282394104003906e+02, 3.282430114746094e+02, 3.28246826171875e+02, 3.282508850097656e+02, 3.282551879882812e+02, 3.282599182128906e+02, 3.282650756835938e+02, 3.282707214355469e+02, 3.282769165039062e+02, 3.282837524414062e+02, 3.282913208007812e+02, 3.282997436523438e+02, 3.283091735839844e+02, 3.283197631835938e+02, 3.283316955566406e+02, 3.2834521484375e+02, 3.283605346679688e+02, 3.283779296875e+02, 3.283974914550781e+02, 3.284040832519531e+02, 3.283757019042969e+02, 3.283257141113281e+02, 3.282757873535156e+02, 3.282338562011719e+02, 3.282029418945312e+02, 3.2818408203125e+02, 3.281746215820312e+02, 3.281699829101562e+02, 3.281666870117188e+02, 3.281632995605469e+02, 3.281598510742188e+02, 3.281568908691406e+02, 3.281546936035156e+02, 3.281533203125e+02, 3.281524658203125e+02, 3.281519470214844e+02, 3.281515502929688e+02, 3.281511840820312e+02, 3.281508483886719e+02, 3.281506042480469e+02, 3.281504211425781e+02, 3.281502990722656e+02, 3.281502380371094e+02, 3.281501770019531e+02, 3.28150146484375e+02, 3.281501159667969e+02, 3.281500854492188e+02, 3.281500549316406e+02, 3.281500244140625e+02, 3.281500244140625e+02, 3.281500244140625e+02, 3.281500244140625e+02] +senTWatRet.T=[3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081500244140625e+02, 3.081500244140625e+02, 3.081500244140625e+02, 3.081500244140625e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.081499938964844e+02, 3.08285888671875e+02, 3.085835876464844e+02, 3.088851013183594e+02, 3.091863403320312e+02, 3.094871520996094e+02, 3.097880249023438e+02, 3.100890808105469e+02, 3.103901672363281e+02, 3.106911926269531e+02, 3.109921569824219e+02, 3.112931518554688e+02, 3.115941467285156e+02, 3.118951721191406e+02, 3.121961669921875e+02, 3.124971618652344e+02, 3.127981567382812e+02, 3.130991516113281e+02, 3.13400146484375e+02, 3.137011108398438e+02, 3.140021057128906e+02, 3.143031005859375e+02, 3.146040649414062e+02, 3.149050598144531e+02, 3.152060241699219e+02, 3.155069885253906e+02, 3.158079833984375e+02, 3.161089477539062e+02, 3.164098815917969e+02, 3.167108459472656e+02, 3.170117797851562e+02, 3.173127136230469e+02, 3.176136474609375e+02, 3.179145812988281e+02, 3.181482543945312e+02, 3.181500854492188e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02, 3.181499938964844e+02] diff --git a/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_CHPs_OrganicRankine_Validation_VariableSource.txt b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_CHPs_OrganicRankine_Validation_VariableSource.txt new file mode 100644 index 0000000000..2eb4c2d937 --- /dev/null +++ b/IBPSA/Resources/ReferenceResults/Dymola/IBPSA_Fluid_CHPs_OrganicRankine_Validation_VariableSource.txt @@ -0,0 +1,18 @@ +last-generated=2024-08-20 +statistics-simulation= +{ + "linear": "0, 0, 0", + "nonlinear": "4", + "numerical Jacobians": "0" +} +time=[0e+00, 3e+02] +mHot_flow_set.y=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 5.000000074505824e-02, 2.000000029802322e-01, 3.499999940395355e-01, 5e-01, 6.499999761581421e-01, 8.00000011920929e-01, 9.49999988079071e-01, 1.100000023841858e+00, 1.25e+00, 1.399999976158142e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.5e+00, 1.399999976158142e+00, 1.25e+00, 1.100000023841858e+00, 9.49999988079071e-01, 8.00000011920929e-01, 6.499999761581421e-01, 5e-01, 3.499999940395355e-01, 2.000000029802322e-01, 5.000000074505806e-02, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00] +souHot.T_in=[3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.69e+02, 3.675e+02, 3.66e+02, 3.645e+02, 3.63e+02, 3.615e+02, 3.6e+02, 3.585e+02, 3.57e+02, 3.555e+02, 3.54e+02, 3.525e+02, 3.51e+02, 3.495e+02, 3.48e+02, 3.465e+02, 3.45e+02, 3.465e+02, 3.48e+02, 3.495e+02, 3.51e+02, 3.525e+02, 3.54e+02, 3.555e+02, 3.57e+02, 3.585e+02, 3.6e+02, 3.615e+02, 3.63e+02, 3.645e+02, 3.66e+02, 3.675e+02, 3.69e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02, 3.7e+02] +orc.cyc.TWorEva=[3.5e+02, 3.5e+02] +orc.cyc.mWor_flow=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 7.782351970672607e-02, 9.241543710231781e-02, 1.07007347047329e-01, 1.215992569923401e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.215992569923401e-01, 1.070073470473289e-01, 9.241543710231781e-02, 7.782351970672607e-02, 6.323160976171494e-02, 4.863970354199409e-02, 3.404778987169273e-02, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 7.782351970672607e-02, 9.241543710231781e-02, 1.070073470473289e-01, 1.215992569923401e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.326909810304642e-01, 1.215992569923401e-01, 1.070073470473289e-01, 9.241543710231781e-02, 7.782351970672607e-02, 6.323160976171494e-02, 4.863970354199409e-02, 3.404778987169266e-02, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00] +orc.cyc.mWor_flow_max=[1.326909810304642e-01, 1.326909810304642e-01] +orc.cyc.mWor_flow_min=[2.653819508850574e-02, 2.653819508850574e-02] +orc.cyc.dTPinEva=[9.397287368774414e+00, 9.397287368774414e+00, 9.397287368774414e+00, 9.397287368774414e+00, 9.397287368774414e+00, 9.397287368774414e+00, 9.397287368774414e+00, 2e+01, 2e+01, 2e+01, 2e+01, 2e+01, 5e+00, 5e+00, 5e+00, 5e+00, 5.38550853729248e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 5.359807968139641e+00, 5e+00, 5e+00, 5e+00, 5e+00, 5e+00, 5e+00, 5e+00, 7e+00, 5.5e+00, 4e+00, 2.5e+00, 1e+00, -5e-01, -2e+00, -3.5e+00, -5e+00, -3.5e+00, -2e+00, -5e-01, 1e+00, 2.5e+00, 4.000000000000014e+00, 5.499999999999986e+00, 7e+00, 8.5e+00, 1e+01, 1.15e+01, 5e+00, 5e+00, 5e+00, 5e+00, 5.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 6.359807968139648e+00, 5.38550853729248e+00, 5e+00, 5e+00, 5e+00, 5e+00, 5e+00, 5e+00, 5e+00, 2e+01, 2e+01, 2e+01, 2e+01, 2e+01, 2e+01, 2e+01, 2e+01, 2e+01] +orc.cyc.dTPinEva_set=[5e+00, 5e+00] +orc.ena=[1e+00, 1e+00] +orc.on_actual=[0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 1e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00, 0e+00] diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/DryFluid.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/DryFluid.mos new file mode 100644 index 0000000000..34c8bc07c1 --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/DryFluid.mos @@ -0,0 +1,12 @@ +simulateModel("IBPSA.Fluid.CHPs.OrganicRankine.BaseClasses.Validation.DryFluid", + method="dassl", stopTime=1, tolerance=1e-06, resultFile="DryFluid"); +// Plot commands +createPlot(id=1, + position={95, 95, 592, 371}, + y={"cyc.etaThe"}, + range={0.0, 1.0, 0.13, 0.165}, + grid=true, + colors={{28,108,200}}, + timeUnit="s", + displayUnits={"1"}); + diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/WetFluid.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/WetFluid.mos new file mode 100644 index 0000000000..add3b5ad7c --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/BaseClasses/Validation/WetFluid.mos @@ -0,0 +1,6 @@ +simulateModel("IBPSA.Fluid.CHPs.OrganicRankine.BaseClasses.Validation.WetFluid", + method="dassl", stopTime=1, tolerance=1e-06, resultFile="WetFluid"); +// Plot commands +createPlot(id=1, position={120, 7, 595, 507}, y={"cyc.etaThe"}, range={0.0, 1.0, 0.08, 0.10500000000000001}, grid=true, subPlot=101, colors={{28,108,200}}, timeUnit="s", displayUnits={"1"}); +createPlot(id=1, position={120, 7, 595, 507}, y={"cyc.dTSup"}, range={0.0, 1.0, 3.6, 4.800000000000001}, grid=true, subPlot=102, colors={{28,108,200}}, timeUnit="s", displayUnits={"K"}); + diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/Examples/ORCHotWater.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/Examples/ORCHotWater.mos new file mode 100644 index 0000000000..79ee91e226 --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/Examples/ORCHotWater.mos @@ -0,0 +1,8 @@ +simulateModel("IBPSA.Fluid.CHPs.OrganicRankine.Examples.ORCHotWater", + method="Cvode", stopTime=900, tolerance=1e-06, resultFile="ORCHotWater"); +// Plot commands +createPlot(id=1, position={147, 7, 573, 658}, y={"pum.m_flow"}, range={0.0, 900.0, -1.0, 2.0}, grid=true, subPlot=101, colors={{28,108,200}}, timeUnit="s", displayUnits={"kg/s"}); +createPlot(id=1, position={147, 7, 573, 658}, y={"orc.PExp", "orc.PPum"}, range={0.0, 900.0, -5000.0, 10000.0}, grid=true, subPlot=102, colors={{28,108,200}, {238,46,47}}, timeUnit="s", displayUnits={"W", "W"}); +createPlot(id=1, position={147, 7, 573, 658}, y={"orc.QEva_flow", "orc.QCon_flow"}, range={0.0, 900.0, -50000.0, 100000.0}, grid=true, subPlot=103, colors={{28,108,200}, {238,46,47}}, timeUnit="s", displayUnits={"W", "W"}); +createPlot(id=1, position={147, 7, 573, 658}, y={"senTWatSup.T", "senTWatRet.T"}, range={0.0, 900.0, 30.0, 60.0}, grid=true, subPlot=104, colors={{28,108,200}, {238,46,47}}, timeUnit="s", displayUnits={"degC", "degC"}); + diff --git a/IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/Validation/VariableSource.mos b/IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/Validation/VariableSource.mos new file mode 100644 index 0000000000..adb56e4d33 --- /dev/null +++ b/IBPSA/Resources/Scripts/Dymola/Fluid/CHPs/OrganicRankine/Validation/VariableSource.mos @@ -0,0 +1,9 @@ +simulateModel("IBPSA.Fluid.CHPs.OrganicRankine.Validation.VariableSource", + method="dassl", stopTime=300, tolerance=1e-06, resultFile="VariableSource"); +// Plot commands +createPlot(id=3, position={11, 52, 624, 352}, y={"mHot_flow_set.y"}, range={0.0, 300.0, -1.0, 2.0}, autoscale=false, grid=true, subPlot=101, colors={{28,108,200}}, timeUnit="s"); +createPlot(id=3, position={11, 52, 624, 352}, y={"souHot.T_in", "orc.cyc.TWorEva"}, range={0.0, 300.0, 70.0, 100.0}, autoscale=false, grid=true, subPlot=102, colors={{28,108,200}, {238,46,47}}, timeUnit="s", displayUnits={"degC", "degC"}); +createPlot(id=4, position={627, 10, 618, 464}, y={"orc.cyc.mWor_flow", "orc.cyc.mWor_flow_max", "orc.cyc.mWor_flow_min"}, range={0.0, 300.0, -0.1, 0.20000000000000004}, grid=true, subPlot=101, colors={{28,108,200}, {238,46,47}, {0,140,72}}, timeUnit="s", displayUnits={"kg/s", "kg/s", "kg/s"}); +createPlot(id=4, position={627, 10, 618, 464}, y={"orc.cyc.dTPinEva", "orc.cyc.dTPinEva_set"}, range={0.0, 300.0, -20.0, 40.0}, grid=true, subPlot=102, colors={{28,108,200}, {238,46,47}}, timeUnit="s", displayUnits={"K", "K"}); +createPlot(id=4, position={627, 10, 618, 464}, y={"orc.ena", "orc.on_actual"}, range={0.0, 300.0, -1.0, 2.0}, grid=true, subPlot=103, colors={{28,108,200}, {28,108,200}}, timeUnit="s"); +