This information is part of the Modelica Standard Library maintained by the Modelica Association.
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 SI=Modelica.SIunits; 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"; equation 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.