Fluid libraries have components with two ports that store neither mass nor energy and fulfill the momentum equation between their two ports, e.g., a short pipe. In most cases this means that an equation is present relating the pressure drop between the two ports and the mass flow rate from one to the other port. Since no mass or energy is stored, no differential equations for thermodynamic variables are present. A component model of this type has therefore usually the following structure (see also the implementation in Modelica.Media.Examples.Utilities.ShortPipe):
model ShortPipe import SI=Modelica.SIunits; import Modelica.Media.Examples.Utilities; // parameters defining the pressure drop equation replaceable package Medium = Modelica.Media.Interfaces.PartialMedium "Medium model" annotation (choicesAllMatching = true); Utilities.FluidPort_a port_a (redeclare package Medium = Medium); Utilities.FluidPort_b port_b (redeclare package Medium = Medium); SI.Pressure dp = port_a.p - port_b.p "Pressure drop"; Medium.BaseProperties medium_a "Medium properties in port_a"; Medium.BaseProperties medium_b "Medium properties in port_b"; equation // define media models of the ports medium_a.p = port_a.p; medium_a.h = port_a.h; medium_a.Xi = port_a.Xi; medium_b.p = port_b.p; medium_b.h = port_b.h; medium_b.Xi = port_b.Xi; // Handle reverse and zero flow (semiLinear is a built-in Modelica operator) port_a.H_flow = semiLinear(port_a.m_flow, port_a.h, port_b.h); port_a.mXi_flow = semiLinear(port_a.m_flow, port_a.Xi, port_b.Xi); // Energy, mass and substance mass balance port_a.H_flow + port_b.H_flow = 0; port_a.m_flow + port_b.m_flow = 0; port_a.mXi_flow + port_b.mXi_flow = zeros(Medium.nXi); // Provide equation: port_a.m_flow = f(dp) end ShortPipe;
The semiLinear(..) operator is basically defined as:
semiLinear(m_flow, ha, hb) = if m_flow ≥ 0 then m_flow*ha else m_flow*hb;
that is, it computes the enthalpy flow rate either from the port_a or from the port_b properties, depending on flow direction. The exact details of this operator are given in ModelicaReference.Operators.'semiLinear()'. Especially, rules are defined in the Modelica specification that m_flow = 0 can be treated in a "meaningful way". Especially, if n fluid components (such as pipes) are connected together and the fluid connector from above is used, a linear system of equations appear between medium1.h, medium2.h, medium3.h, ..., port1.h, port2.h, port3.h, ..., port1.H_flow, port2.H_flow, port3.H_flow, .... The rules for the semiLinear(..) operator allow the following solution of this linear system of equations:
medium1.h = medium2.h = port1.h = port2.h 0 = port1.H_flow + port2.H_flowTherefore, no problems with zero mass flow rate are present.