Fluid libraries usually have balance volume components with one fluid connector port that fulfill the mass and energy balance and on a different grid components that fulfill the momentum balance. A balance volume component, called junction volume below, should be primarily implemented in the following way (see also the implementation in Modelica.Media.Examples.Utilities.PortVolume):

model JunctionVolume
  import Modelica.Units.SI;
  import Modelica.Media.Examples.Utilities.FluidPort_a;

  parameter SI.Volume V = 1e-6 "Fixed size of junction volume";
  replaceable package Medium = Modelica.Media.Interfaces.PartialMedium
                         "Medium model" annotation (choicesAllMatching = true);

  FluidPort_a port(redeclare package Medium = Medium);
  Medium.BaseProperties medium(preferredMediumStates = true);

  SI.Energy U              "Internal energy of junction volume";
  SI.Mass   M              "Mass of junction volume";
  SI.Mass   MX[Medium.nXi] "Independent substance masses of junction volume";
  medium.p   = port.p;
  medium.h   = port.h;
  medium.Xi = port.Xi;

  M  = V*medium.d;                  // mass of JunctionVolume
  MX = M*medium.Xi;                 // mass fractions in JunctionVolume
  U  = M*medium.u;                  // internal energy in JunctionVolume

  der(M)  = port.m_flow;    // mass balance
  der(MX) = port.mX_flow;   // substance mass balance
  der(U)  = port.H_flow;    // energy balance
end JunctionVolume;

Assume the Modelica.Media.Air.SimpleAir medium model is used with the JunctionVolume model above. This medium model uses pressure p and temperature T as independent variables. If the flag "preferredMediumStates" is set to true in the declaration of "medium", then the independent variables of this medium model get the attribute "stateSelect = StateSelect.prefer", i.e., the Modelica translator should use these variables as states, if this is possible. Basically, this means that constraints between the potential states p,T and the potential states U,M are present. A Modelica tool will therefore automatically differentiate medium equations and will use the following equations for code generation (note the equations related to X are removed, because SimpleAir consists of a single substance only):

M  = V*medium.d;
U  = M*medium.u;

// balance equations
der(M)  = port.m_flow;
der(U)  = port.H_flow;

// abbreviations introduced to get simpler terms
p = medium.p;
T = medium.T;
d = medium.d;
u = medium.u;
h = medium.h;

// medium equations
d = fd(p,T);
h = fh(p,T);
u = h - p/d;

// equations derived automatically by a Modelica tool due to index reduction
der(U) = der(M)*u + M*der(u);
der(M) = V*der(d);
der(u) = der(h) - der(p)/d - p/der(d);
der(d) = der(fd,p)*der(p) + der(fd,T)*der(T);
der(h) = der(fh,p)*der(p) + der(fd,T)*der(T);

Note, that "der(y,x)" is an operator that characterizes in the example above the partial derivative of y with respect to x (this operator will be included in one of the next Modelica language releases). All media models in this library are written in such a way that at least the partial derivatives of the medium variables with respect to the independent variables are provided, either because the equations are directly given (= symbolic differentiation is possible) or because the derivative of the corresponding function (such as fd above) is provided. A Modelica tool will transform the equations above in differential equations with p and T as states, i.e., will generate equations to compute der(p) and der(T) as function of p and T.

Note, when preferredMediumStates = false, no differentiation will take place and the Modelica translator will use the variables appearing differentiated as states, i.e., M and U. This has the disadvantage that for many media non-linear systems of equations are present to compute the intrinsic properties p, d, T, u, h from M and U.

Generated at 2024-06-17T18:20:35Z by OpenModelicaOpenModelica 1.22.4 using GenerateDoc.mos