Search code examples
modelicadymola

Failure to handle clock inference in Dymola


The following model in Dymola gives an error,

model Test1
  Real outvar;
  Real outvarc;
  Real internal;
  parameter Real Tp=0.1;
equation 
  when Clock(Tp) then
    internal = time;
  end when;
  outvar = hold(outvarc);
algorithm 
  if (firstTick(internal)) then
    outvarc := 1;
  else
    outvarc := previous(outvarc);
    outvarc := outvarc + 1;
  end if;

end Test1;

If I modify the variable internal as follows then the model works.

model Test2
  Real outvar;
  Real outvarc;
  Boolean internal(start=true);
  parameter Real Tp=0.1;
equation 
  when Clock(Tp) then
    internal = false;
  end when;
  outvar = hold(outvarc);
algorithm 
  if (firstTick(internal)) then
    outvarc := 1;
  else
    outvarc := previous(outvarc);
    outvarc := outvarc + 1;
  end if;
end Test2;

Is there any explanation why model Test1 is giving an error?


Solution

  • It fails in Dymola 2022x and earlier. In Dymola 2023 and later it gives the warning:

    The sub clock, BaseClock_0.SubClock_1, includes pre, time, or non-clocked when, but no solver method is specified. This is not correct according to the specification and it could indicate that it was clocked by mistake. The warning can be disabled by setting Advanced.Translation.WarnForMissingSolverMethod=false;

    That suggests that the simplest solution would be:

    when Clock(Tp) then
      internal = sample(time);
    end when;
    

    Basically time is not a clocked variable. (Yes, I'm aware that time in clocked partitions is messier than this suggests.)