diff --git a/MetroscopeModelingLibrary/Tests/WaterSteamTests/Pipes/SteamExtractionSplitterTest_direct.mo b/MetroscopeModelingLibrary/Tests/WaterSteamTests/Pipes/SteamExtractionSplitterTest_direct.mo index a23165f8..c259d524 100644 --- a/MetroscopeModelingLibrary/Tests/WaterSteamTests/Pipes/SteamExtractionSplitterTest_direct.mo +++ b/MetroscopeModelingLibrary/Tests/WaterSteamTests/Pipes/SteamExtractionSplitterTest_direct.mo @@ -9,9 +9,6 @@ model SteamExtractionSplitterTest_direct // Input: Component parameters input Real alpha(start=0.8, min=0, max=1) "1"; - // Output: Observables - output Units.SpecificEnthalpy main_h_out; - // Components WaterSteam.Pipes.SteamExtractionSplitter steamExtractionSplitter annotation (Placement(transformation(extent={{-27,-26.6667},{27,21.3333}}))); diff --git a/MetroscopeModelingLibrary/Tests/WaterSteamTests/Pipes/SteamExtractionSplitterTest_reverse.mo b/MetroscopeModelingLibrary/Tests/WaterSteamTests/Pipes/SteamExtractionSplitterTest_reverse.mo index 4006f4bc..29355a3b 100644 --- a/MetroscopeModelingLibrary/Tests/WaterSteamTests/Pipes/SteamExtractionSplitterTest_reverse.mo +++ b/MetroscopeModelingLibrary/Tests/WaterSteamTests/Pipes/SteamExtractionSplitterTest_reverse.mo @@ -40,10 +40,10 @@ equation extracted_Q_sensor.Q = extracted_Q; // Input: Observables - steamExtractionSplitter.alpha = alpha; + steamExtractionSplitter.mainFlow.h_out = main_h_out; // Output: Component parameters - steamExtractionSplitter.mainFlow.h_out = main_h_out; + steamExtractionSplitter.alpha = alpha; // Assertion assert(alpha <= 1 and alpha >= 0, "From model assertion error: alpha should be within 0 and 1"); diff --git a/MetroscopeModelingLibrary/Tests/WaterSteamTests/Volumes.mo b/MetroscopeModelingLibrary/Tests/WaterSteamTests/Volumes.mo index 4053b632..154666ba 100644 --- a/MetroscopeModelingLibrary/Tests/WaterSteamTests/Volumes.mo +++ b/MetroscopeModelingLibrary/Tests/WaterSteamTests/Volumes.mo @@ -22,7 +22,6 @@ package Volumes source.Q_out = -Q_in; source.h_out = h_in; - connect(flashTank.C_in, source.C_out) annotation (Line(points={{-32,12},{-65,12}}, color={28,108,200})); connect(flashTank.C_hot_steam, steam_sink.C_in) @@ -35,7 +34,7 @@ package Volumes extends Modelica.Icons.Example; // Boundary Conditions - input Real P(start = 10, nominal=1e5) "barA"; + input Real P(start = 10, nominal=10) "barA"; input Real Q_in(start=500, nominal=500) "kg/s"; input Real h_in(start=2e6) "J/kg"; @@ -60,12 +59,11 @@ package Volumes // Component parameters steamDryer.x_steam_out = x_steam_out; - connect(steamDryer.C_in, source.C_out) annotation (Line(points={{-32, - 10.1818},{-48,10.1818},{-48,12},{-65,12}}, + connect(steamDryer.C_in, source.C_out) annotation (Line(points={{-32,10.1818},{-48,10.1818},{-48,12},{-65,12}}, color={28,108,200})); - connect(steamDryer.C_hot_steam, steam_sink.C_in) annotation (Line(points={{28, - 10.1818},{44,10.1818},{44,12},{61,12}}, color={28,108,200})); - connect(steamDryer.C_hot_liquid, liquid_sink.C_in) annotation (Line(points={{28, - -11.6364},{44,-11.6364},{44,-12},{61,-12}}, color={28,108,200})); + connect(steamDryer.C_hot_steam, steam_sink.C_in) annotation (Line(points={{28,10.1818},{44,10.1818},{44,12},{61,12}}, + color={28,108,200})); + connect(steamDryer.C_hot_liquid, liquid_sink.C_in) annotation (Line(points={{28,-11.6364},{44,-11.6364},{44,-12},{61,-12}}, + color={28,108,200})); end SteamDryer_direct; end Volumes; diff --git a/MetroscopeModelingLibrary/WaterSteam/Pipes/SteamExtractionSplitter.mo b/MetroscopeModelingLibrary/WaterSteam/Pipes/SteamExtractionSplitter.mo index dd87affe..f515d644 100644 --- a/MetroscopeModelingLibrary/WaterSteam/Pipes/SteamExtractionSplitter.mo +++ b/MetroscopeModelingLibrary/WaterSteam/Pipes/SteamExtractionSplitter.mo @@ -16,8 +16,8 @@ model SteamExtractionSplitter Units.InletMassFlowRate Q_in(start=Q_in_0) "Inlet Mass flow rate"; Units.Pressure P(start=P_0) "Inlet Pressure"; Units.SpecificEnthalpy h_in "Inlet specific enthalpy"; - Units.SpecificEnthalpy hesat(start=hesat_0) "Enthalpy of saturated water"; - Units.SpecificEnthalpy hvsat(start=hvsat_0) "Enthalpy of saturated vapor"; + Units.SpecificEnthalpy h_liq_sat(start=h_liq_sat_0) "Enthalpy of saturated water"; + Units.SpecificEnthalpy h_vap_sat(start=h_vap_sat_0) "Enthalpy of saturated vapor"; Units.MassFraction x_ext_out(start=0.8) "Vapor mass fraction at extraction outlet (0 <= x_ext_out <= x_in)"; Units.MassFraction x_main_out(start=0.8) "Vapor mass fraction at main outlet"; Units.MassFraction x_in(start=0.8) "Vapor mass fraction at inlet"; @@ -25,7 +25,6 @@ model SteamExtractionSplitter Inputs.InputReal alpha(start=1, min=0, max=1) "Extraction paramater"; // Components - WaterSteam.BaseClasses.WaterIsoPHFlowModel inletFlow(Q_0=Q_in_0, P_0=P_0) annotation (Placement(transformation(extent={{-85,-27},{-35,27}}))); WaterSteam.BaseClasses.WaterIsoPFlowModel extractedFlow(Q_0=Q_ext_0, P_0=P_0) annotation (Placement(transformation( extent={{-11.5,-10.5},{11.5,10.5}}, rotation=270, @@ -36,15 +35,15 @@ model SteamExtractionSplitter Connectors.WaterOutlet C_main_out(Q(start=-Q_main_0), P(start=P_0)) annotation (Placement(transformation(extent={{100,-10},{120,10}}),iconTransformation(extent={{96,-10},{116,10}}))); Connectors.WaterOutlet C_ext_out(Q(start=-Q_ext_0), P(start=P_0)) annotation (Placement(transformation(extent={{-10,-74},{10,-54}}), iconTransformation(extent={{-10,-78},{10,-58}}))); protected - parameter Units.SpecificEnthalpy hvsat_0 = WaterSteamMedium.dewEnthalpy(WaterSteamMedium.setSat_p(P_0)); - parameter Units.SpecificEnthalpy hesat_0 = WaterSteamMedium.bubbleEnthalpy(WaterSteamMedium.setSat_p(P_0)); + parameter Units.SpecificEnthalpy h_vap_sat_0 = WaterSteamMedium.dewEnthalpy(WaterSteamMedium.setSat_p(P_0)); + parameter Units.SpecificEnthalpy h_liq_sat_0 = WaterSteamMedium.bubbleEnthalpy(WaterSteamMedium.setSat_p(P_0)); equation // Definition of all intermediate variables - hvsat = WaterSteamMedium.dewEnthalpy(WaterSteamMedium.setSat_p(P)); - hesat = WaterSteamMedium.bubbleEnthalpy(WaterSteamMedium.setSat_p(P)); - Q_in = inletFlow.Q; - P = inletFlow.P; - h_in = inletFlow.h; + h_vap_sat = WaterSteamMedium.dewEnthalpy(WaterSteamMedium.setSat_p(P)); + h_liq_sat = WaterSteamMedium.bubbleEnthalpy(WaterSteamMedium.setSat_p(P)); + Q_in = extractedFlow.Q + mainFlow.Q; + P = C_in.P; + h_in = inStream(C_in.h_outflow); //Energy balance extractedFlow.W + mainFlow.W = 0; @@ -53,15 +52,14 @@ equation x_ext_out = alpha * x_in; // Mass Fractions Computation - x_in = (h_in - hesat) / (hvsat - hesat); - x_main_out = (mainFlow.h_out - hesat) / (hvsat - hesat); - x_ext_out = (extractedFlow.h_out - hesat) / (hvsat - hesat); - connect(inletFlow.C_out, mainFlow.C_in) annotation (Line(points={{-35,0},{35,0}}, color={28,108,200})); + x_in = (h_in - h_liq_sat) / (h_vap_sat - h_liq_sat); + x_main_out = (mainFlow.h_out - h_liq_sat) / (h_vap_sat - h_liq_sat); + x_ext_out = (extractedFlow.h_out - h_liq_sat) / (h_vap_sat - h_liq_sat); connect(extractedFlow.C_in, mainFlow.C_in) annotation (Line(points={{1.77636e-15,-18.5},{1.77636e-15,0},{35,0}}, color={28,108,200})); connect(extractedFlow.C_out, C_ext_out) annotation (Line(points={{-2.10942e-15,-41.5},{-2.10942e-15,-54},{0,-54},{0,-64}}, color={28,108,200})); - connect(C_in, inletFlow.C_in) annotation (Line(points={{-110,0},{-85,0}}, color={28,108,200})); connect(C_main_out, mainFlow.C_out) annotation (Line(points={{110,0},{85,0}}, color={28,108,200})); + connect(C_in, mainFlow.C_in) annotation (Line(points={{-110,0},{35,0}}, color={28,108,200})); annotation (Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,80}}), graphics={Polygon( points={{-100,20},{-100,-20},{-46,-20},{-8,-60},{10,-60},{-16,-20},{100,-20},{100,20},{-100,20}}, @@ -79,9 +77,5 @@ equation textColor={28,108,200}, origin={-12,-30}, rotation=270, - textString="extracted"), - Text( - extent={{-74,-18},{-32,-28}}, - textColor={28,108,200}, - textString="inlet")})); + textString="extracted")})); end SteamExtractionSplitter; diff --git a/MetroscopeModelingLibrary/WaterSteam/Volumes/FlashTank.mo b/MetroscopeModelingLibrary/WaterSteam/Volumes/FlashTank.mo index bf3a144f..4f9a20a8 100644 --- a/MetroscopeModelingLibrary/WaterSteam/Volumes/FlashTank.mo +++ b/MetroscopeModelingLibrary/WaterSteam/Volumes/FlashTank.mo @@ -4,19 +4,24 @@ model FlashTank package WaterSteamMedium = MetroscopeModelingLibrary.Media.WaterSteamMedium; import MetroscopeModelingLibrary.Units; - Units.Pressure P(start=10e5); - Units.InletMassFlowRate Q_in; - WaterSteam.Connectors.WaterInlet C_in + // Initialization parameters + parameter Units.Pressure P_0 = 10e5; + parameter Units.InletMassFlowRate Q_in_0=500; + + Units.Pressure P(start=P_0); + Units.InletMassFlowRate Q_in(start=Q_in_0); + + WaterSteam.Connectors.WaterInlet C_in(P(start=P_0), Q(start=Q_in_0)) annotation (Placement(transformation(extent={{-110,30},{-90,50}}), iconTransformation(extent={{-110,30},{-90,50}}))); - WaterSteam.Connectors.WaterOutlet C_hot_steam + WaterSteam.Connectors.WaterOutlet C_hot_steam(P(start=P_0), Q(start=-Q_in_0/2)) annotation (Placement(transformation(extent={{90,30},{110,50}}))); - WaterSteam.Connectors.WaterOutlet C_hot_liquid + WaterSteam.Connectors.WaterOutlet C_hot_liquid(P(start=P_0), Q(start=-Q_in_0/2)) annotation (Placement(transformation(extent={{90,-50},{110,-30}}))); - WaterSteam.BaseClasses.WaterIsoPFlowModel steam_phase + WaterSteam.BaseClasses.WaterIsoPFlowModel steam_phase(P_0=P_0, Q_0=Q_in_0/2) annotation (Placement(transformation(extent={{26,30},{46,50}}))); - WaterSteam.BaseClasses.WaterIsoPFlowModel liquid_phase + WaterSteam.BaseClasses.WaterIsoPFlowModel liquid_phase(P_0=P_0, Q_0=Q_in_0/2) annotation (Placement(transformation(extent={{26,-50},{46,-30}}))); equation diff --git a/MetroscopeModelingLibrary/WaterSteam/Volumes/SteamDryer.mo b/MetroscopeModelingLibrary/WaterSteam/Volumes/SteamDryer.mo index b3009fa1..6f7d5331 100644 --- a/MetroscopeModelingLibrary/WaterSteam/Volumes/SteamDryer.mo +++ b/MetroscopeModelingLibrary/WaterSteam/Volumes/SteamDryer.mo @@ -5,25 +5,32 @@ model SteamDryer import MetroscopeModelingLibrary.Units; - Units.SpecificEnthalpy h_vap_sat; // Saturated liquid enthalpy - Units.SpecificEnthalpy h_liq_sat; // Saturated steam enthalpy + // Initialization parameters + parameter Units.Pressure P_0 = 10e5; + parameter Units.InletMassFlowRate Q_in_0=500; - Units.Pressure P(start=10e5); // Pressure in dryer - Units.InletMassFlowRate Q_in; // Inlet mass flow rate + Units.SpecificEnthalpy h_vap_sat(start=h_vap_sat_0); // Saturated liquid enthalpy + Units.SpecificEnthalpy h_liq_sat(start=h_liq_sat_0); // Saturated steam enthalpy + + Units.Pressure P(start=P_0); // Pressure in dryer + Units.InletMassFlowRate Q_in(start=Q_in_0); // Inlet mass flow rate Units.MassFraction x_steam_out; // Steam mass fraction at steam outlet - WaterSteam.Connectors.WaterInlet C_in + WaterSteam.Connectors.WaterInlet C_in(P(start=P_0), Q(start=Q_in_0)) annotation (Placement(transformation(extent={{-110,30},{-90,50}}), iconTransformation(extent={{-110,30},{-90,50}}))); - WaterSteam.Connectors.WaterOutlet C_hot_steam + WaterSteam.Connectors.WaterOutlet C_hot_steam(P(start=P_0), Q(start=-Q_in_0/2)) annotation (Placement(transformation(extent={{90,30},{110,50}}))); - WaterSteam.Connectors.WaterOutlet C_hot_liquid + WaterSteam.Connectors.WaterOutlet C_hot_liquid(P(start=P_0), Q(start=-Q_in_0/2)) annotation (Placement(transformation(extent={{90,-50},{110,-30}}))); - WaterSteam.BaseClasses.WaterIsoPFlowModel steam_phase + WaterSteam.BaseClasses.WaterIsoPFlowModel steam_phase(P_0=P_0, Q_0=Q_in_0/2) annotation (Placement(transformation(extent={{26,30},{46,50}}))); - WaterSteam.BaseClasses.WaterIsoPFlowModel liquid_phase + WaterSteam.BaseClasses.WaterIsoPFlowModel liquid_phase(P_0=P_0, Q_0=Q_in_0/2) annotation (Placement(transformation(extent={{26,-50},{46,-30}}))); +protected + parameter Units.SpecificEnthalpy h_vap_sat_0 = WaterSteamMedium.dewEnthalpy(WaterSteamMedium.setSat_p(P_0)); + parameter Units.SpecificEnthalpy h_liq_sat_0 = WaterSteamMedium.bubbleEnthalpy(WaterSteamMedium.setSat_p(P_0)); equation // Definitions @@ -39,8 +46,6 @@ equation // Energy balance steam_phase.W + liquid_phase.W = 0; - - connect(liquid_phase.C_in, C_in) annotation (Line(points={{26,-40},{-40,-40},{ -40,40},{-100,40}}, color={28,108,200})); diff --git a/MetroscopeModelingLibrary/WaterSteam/Volumes/package.mo b/MetroscopeModelingLibrary/WaterSteam/Volumes/package.mo index effa6e7c..e15b71d0 100644 --- a/MetroscopeModelingLibrary/WaterSteam/Volumes/package.mo +++ b/MetroscopeModelingLibrary/WaterSteam/Volumes/package.mo @@ -1,3 +1,103 @@ within MetroscopeModelingLibrary.WaterSteam; package Volumes +annotation (Icon(graphics={ + Rectangle( + lineColor={200,200,200}, + fillColor={248,248,248}, + fillPattern=FillPattern.HorizontalCylinder, + extent={{-100,-100},{100,100}}, + radius=25.0), + Rectangle( + lineColor={128,128,128}, + extent={{-100,-100},{100,100}}, + radius=25.0), + Rectangle( + extent={{-68,40},{70,-40}}, + lineColor={28,108,200}, + fillColor={236,238,248}, + fillPattern=FillPattern.Solid, + lineThickness=1), + Polygon( + points={{-68,-10},{70,-10},{70,-40},{-68,-40},{-68,-10}}, + lineColor={28,108,200}, + lineThickness=0.5, + fillColor={79,188,247}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Ellipse( + extent={{-60,22},{-54,16}}, + lineThickness=1, + fillColor={79,188,247}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Ellipse( + extent={{-52,10},{-46,4}}, + lineThickness=1, + fillColor={79,188,247}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Ellipse( + extent={{-46,26},{-40,20}}, + lineThickness=1, + fillColor={79,188,247}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Ellipse( + extent={{-64,0},{-58,-6}}, + lineThickness=1, + fillColor={79,188,247}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Ellipse( + extent={{-56,34},{-50,28}}, + lineThickness=1, + fillColor={79,188,247}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Ellipse( + extent={{-40,6},{-34,0}}, + lineThickness=1, + fillColor={79,188,247}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Ellipse( + extent={{-32,22},{-26,16}}, + lineThickness=1, + fillColor={79,188,247}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Ellipse( + extent={{-20,10},{-14,4}}, + lineThickness=1, + fillColor={79,188,247}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Ellipse( + extent={{-26,-2},{-20,-8}}, + lineThickness=1, + fillColor={79,188,247}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Ellipse( + extent={{-66,14},{-60,8}}, + lineThickness=1, + fillColor={79,188,247}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Ellipse( + extent={{0,0},{6,-6}}, + lineThickness=1, + fillColor={79,188,247}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Ellipse( + extent={{-48,0},{-42,-6}}, + lineThickness=1, + fillColor={79,188,247}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-68,40},{70,-40}}, + lineColor={28,108,200}, + lineThickness=1)})); end Volumes;