This function is used to approximate the equation

state =ifx > 0thenstate_aelsestate_b;

by a smooth characteristic, so that the expression is continuous and differentiable:

state :=smooth(1,ifx > x_smallthenstate_aelseifx < -x_smallthenstate_belsef(state_a, state_b));

This is performed by applying function **Media.Common.smoothStep**(..)
on every element of the thermodynamic state record.

If **mass fractions** X[:] are approximated with this function then this can be performed
for all **nX** mass fractions, instead of applying it for nX-1 mass fractions and computing
the last one by the mass fraction constraint sum(X)=1. The reason is that the approximating function has the
property that sum(state.X) = 1, provided sum(state_a.X) = sum(state_b.X) = 1.
This can be shown by evaluating the approximating function in the abs(x) < x_small
region (otherwise state.X is either state_a.X or state_b.X):

X[1] = smoothStep(x, X_a[1] , X_b[1] , x_small); X[2] = smoothStep(x, X_a[2] , X_b[2] , x_small); ... X[nX] = smoothStep(x, X_a[nX], X_b[nX], x_small);

or

X[1] = c*(X_a[1] - X_b[1]) + (X_a[1] + X_b[1])/2 X[2] = c*(X_a[2] - X_b[2]) + (X_a[2] + X_b[2])/2; ... X[nX] = c*(X_a[nX] - X_b[nX]) + (X_a[nX] + X_b[nX])/2; c = (x/x_small)*((x/x_small)^2 - 3)/4

Summing all mass fractions together results in

sum(X) = c*(sum(X_a) - sum(X_b)) + (sum(X_a) + sum(X_b))/2 = c*(1 - 1) + (1 + 1)/2 = 1

partial function setSmoothState extends Modelica.Icons.Function; input Real x "m_flow or dp"; input ThermodynamicState state_a "Thermodynamic state if x > 0"; input ThermodynamicState state_b "Thermodynamic state if x < 0"; input Real x_small(min = 0) "Smooth transition in the region -x_small < x < x_small"; output ThermodynamicState state "Smooth thermodynamic state for all x (continuous and differentiable)"; end setSmoothState;

Generated at 2023-11-20T01:32:44Z by OpenModelicaOpenModelica 1.22.0 using GenerateDoc.mos