1 | model WaterHammerValve
|
---|
2 | extends Modelica.Icons.Example;
|
---|
3 | parameter Modelica.Fluid.Types.ModelStructure pipeModelStructure = Modelica.Fluid.Types.ModelStructure.av_vb;
|
---|
4 | //parameter Types.ModelStructure pipeModelStructure = Modelica.Fluid.Types.ModelStructure.a_v_b;
|
---|
5 | replaceable package Medium = Modelica.Media.CompressibleLiquids.LinearColdWater constrainedby Modelica.Media.Interfaces.PartialMedium;
|
---|
6 | //replaceable package Medium =
|
---|
7 | // Modelica.Media.Water.StandardWaterOnePhase
|
---|
8 | // constrainedby Modelica.Media.Interfaces.PartialMedium;
|
---|
9 | import Modelica.Fluid.Types.Dynamics;
|
---|
10 | parameter Dynamics systemMassDynamics = if Medium.singleState then Dynamics.SteadyState else Dynamics.SteadyStateInitial;
|
---|
11 | parameter Boolean filteredValveOpening = not Medium.singleState;
|
---|
12 | inner Modelica.Fluid.System system(massDynamics = Modelica.Fluid.Types.Dynamics.SteadyStateInitial, energyDynamics = Modelica.Fluid.Types.Dynamics.FixedInitial, use_eps_Re = true, momentumDynamics = Modelica.Fluid.Types.Dynamics.SteadyStateInitial, T_ambient = 300) annotation(Placement(transformation(extent = {{90, -92}, {110, -72}}, rotation = 0)));
|
---|
13 | Modelica.Fluid.Valves.ValveIncompressible Valve(redeclare package Medium = Medium, m_flow_nominal = 1, rho_nominal = 1000, CvData = Modelica.Fluid.Types.CvTypes.Av, Av = 0.025 ^ 2 / 4 * Modelica.Constants.pi, dp_nominal = 30000, opening_nominal = 1) annotation(Placement(visible = true, transformation(origin = {0, 0}, extent = {{-10, 10}, {10, -10}}, rotation = 0)));
|
---|
14 | Modelica.Blocks.Sources.Ramp OpenCloseSignal(height = -1, duration = 5, offset = 1, startTime = 10) annotation(Placement(visible = true, transformation(origin = {-20, -40}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
---|
15 | Modelica.Fluid.Pipes.DynamicPipe Pipeline(use_T_start = true, length = 50, diameter = 0.025, redeclare package Medium = Medium, modelStructure = pipeModelStructure, redeclare model FlowModel = Modelica.Fluid.Pipes.BaseClasses.FlowModels.TurbulentPipeFlow, nNodes = 50) annotation(Placement(visible = true, transformation(origin = {-40, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
---|
16 | Modelica.Fluid.Sources.Boundary_pT Source(nPorts = 1, redeclare package Medium = Medium, p = 500000.0, T = system.T_ambient) annotation(Placement(visible = true, transformation(origin = {-80, 0}, extent = {{-13, -13}, {13, 13}}, rotation = 0)));
|
---|
17 | Modelica.Fluid.Sources.Boundary_pT Sink(nPorts = 1, redeclare package Medium = Medium, T = system.T_ambient, p = 450000) annotation(Placement(visible = true, transformation(origin = {100, 0}, extent = {{13, -13}, {-13, 13}}, rotation = 0)));
|
---|
18 | Modelica.Fluid.Pipes.DynamicPipe Pipe(use_T_start = true, diameter = 0.025, redeclare package Medium = Medium, modelStructure = pipeModelStructure, redeclare model FlowModel = Modelica.Fluid.Pipes.BaseClasses.FlowModels.TurbulentPipeFlow, length = 0.5, nNodes = 2) annotation(Placement(visible = true, transformation(origin = {60, 0}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
|
---|
19 | equation
|
---|
20 | connect(OpenCloseSignal.y, Valve.opening) annotation(Line(points = {{-9, -40}, {0.357782, -40}, {0.357782, -8.94454}, {0.357782, -8.94454}}));
|
---|
21 | connect(Pipe.port_b, Sink.ports[1]) annotation(Line(points = {{70, 0}, {86.941, 0}, {86.941, -0.715564}, {86.941, -0.715564}}));
|
---|
22 | connect(Valve.port_b, Pipe.port_a) annotation(Line(points = {{10, 0}, {50.0894, 0}, {50.0894, 0}, {50.0894, 0}}));
|
---|
23 | connect(Pipeline.port_b, Valve.port_a) annotation(Line(points = {{-30, 0}, {-9.66011, 0}, {-9.66011, -0.715564}, {-9.66011, -0.715564}}));
|
---|
24 | connect(Source.ports[1], Pipeline.port_a) annotation(Line(points = {{-67, 0}, {-50.0894, 0}, {-50.0894, -0.357782}, {-50.0894, -0.357782}}));
|
---|
25 | annotation(Documentation(info = "<html>
|
---|
26 | <p>
|
---|
27 | This example demonstrates two aspects: the treatment of multi-way connections
|
---|
28 | and the usage of an incompressible medium model.
|
---|
29 | </p><p>
|
---|
30 | Eleven pipe models with nNodes=2 each introduce 22 temperature states and and 22 pressure states.
|
---|
31 | When configuring <b>pipeModelStructure=a_v_b</b>, the flow models at the pipe ports constitute algebraic loops for the pressures.
|
---|
32 | A common work-around is to introduce \"mixing volumes\" in critical connections.
|
---|
33 | </p><p>
|
---|
34 | Here the problem is treated alternatively with the default <b>pipeModelStructure=av_vb</b> of the
|
---|
35 | <a href=\"modelica://Modelica.Fluid.Pipes.DynamicPipe\">DynamicPipe</a> model.
|
---|
36 | Each pipe exposes the states of the outer fluid segments to the respective fluid ports.
|
---|
37 | Consequently the pressures of all connected pipe segments get lumped together into one mass balance spanning the whole connection set.
|
---|
38 | Overall this treatment as high-index DAE results in the reduction to 9 pressure states, preventing algebraic loops in connections.
|
---|
39 | This can be studied with a rigorous medium model like <b>StandardWaterOnePhase</b>.
|
---|
40 | </p><p>
|
---|
41 | The pressure dynamics completely disappears with an incompressible medium model, like the used <b>Glycol47</b>.
|
---|
42 | It appears reasonable to assume steady-state mass balances in this case
|
---|
43 | (see parameter systemMassDynamics used in system.massDynamics, tab Assumptions).
|
---|
44 | </p><p>
|
---|
45 | Note that with the stream concept in the fluid ports, the energy and substance balances of the connected pipe segments remain independent
|
---|
46 | from each other, despite of pressures being lumped together. The following simulation results can be observed:
|
---|
47 | </p>
|
---|
48 | <ol>
|
---|
49 | <li>The simulation starts with system.T_ambient as initial temperature in all pipes.
|
---|
50 | The temperatures upstream or bypassing pipe8 are approaching the value of 26.85 degC from the source, including also pipe9.
|
---|
51 | The temperatures downstream of pipe8 take a higher value, depending on the mixing with heated fluid, see e.g. pipe10.</li>
|
---|
52 | <li>After 50s valve1 fully closes. This causes flow reversal in pipe8. Now heated fluid flows from pipe8 to pipe9.
|
---|
53 | Note that the temperature of the connected pipe7 remains unchanged as there is no flow into pipe7.
|
---|
54 | The temperature of pipe10 cools down to the source temperature.</li>
|
---|
55 | <li>After 100s valve2 closes half way, which affects mass flow rates and temperatures.</li>
|
---|
56 | <li>After 150s valve5 closes half way, which affects mass flow rates and temperatures.</li>
|
---|
57 | </ol>
|
---|
58 | <p>
|
---|
59 | The fluid temperatures in the pipes of interest are exposed through heatPorts.
|
---|
60 | </p>
|
---|
61 | <img src=\"modelica://Modelica/Resources/Images/Fluid/Examples/IncompressibleFluidNetwork.png\" border=\"1\"
|
---|
62 | alt=\"IncompressibleFluidNetwork.png\">
|
---|
63 | </html>"), __Dymola_Commands(file = "modelica://Modelica/Resources/Scripts/Dymola/Fluid/IncompressibleFluidNetwork/plotResults.mos" "plotResults"), Diagram(coordinateSystem(preserveAspectRatio = false, extent = {{-100, -100}, {120, 100}})), Icon(coordinateSystem(preserveAspectRatio = false, extent = {{-100, -100}, {120, 100}})), experiment(StartTime = 0, StopTime = 100, Tolerance = 1e-06, Interval = 0.01));
|
---|
64 | end WaterHammerValve;
|
---|