Search code examples
modelicaopenmodelica

Modelica - freezing a specific time value during simulation


I am having a problem that could be easily solved in a causal environment like Fortran, but has proved difficult in Modelica, considering my limited knowledge

Consider a volume with an inlet and outlet. The inlet mass flow rate is specified, while the outlet mass flow is calculated based on pressure in the volume. When pressure in the volume goes above a set point, the outlet area starts to increase linearly from its initial value to a max value and remains fixed afterwards. In other words:

A = min( const * (t - t*) + A_0, A_max)
if p > p_set
where t* = the time at which pressure in the volume exceeds the set pressure.

The question is: there's a function to capture t* during the simulation? OR how could the model be programmed to do it? I have tried a number of ways, but models are never closed. Thoughts are welcome and appreciated!

Happy holidays/New Year!

Mohammad


Solution

  • You may find the sample and hold example in my book useful. It uses sampling based on time whereas you probably want it based on your pressure value. But the principle is the same. That will allow you to record the time at which your event occurred.

    Addressing your specific case, the following (untested) code is probably pretty close to what you want:

      ...
      Modelica.SIunits.Time t_star=-1;
    equation
      when p >= p_set then
        t_star = time;
      end when;
      A = if t_star<0 then A_max else min(const*(t - t_star) + A_0, A_max);