Opened 7 years ago

#4740 new defect

"if noEvent()" won't protect sqrt from being called

Reported by: Henning Kiel Owned by: Lennart Ochel
Priority: high Milestone: Future
Component: Backend Version:
Keywords: Cc: Willi Braun, Lennart Ochel

Description

model behaelter
  parameter Real A = 5;
  parameter Real V0 = 0;
  parameter Real g = 9.81;
  parameter Real k = 0.1;
  Real h, fout, fin, v, V;
initial equation
  V=V0;
equation
  der(V) = -fout+fin;
  if noEvent(V >= 0)then
    A*h = V;
    v = sqrt(2*g*h);
    fout = k*v;
  else
    fout = 0;
    h = 0;
    v = 0;
  end if;
end behaelter;
model wasserkette
  behaelter b1(V0 = 1);
equation
  if noEvent(time < 10)then
    b1.fin = 0.25;
  else
    b1.fin = 0;
  end if;
end wasserkette;

When I simulate(wasserkette,stopTime=20) I get the following output:

record SimulationResult
    resultFile = "wasserkette_res.mat",
    messages = "assert            | debug   | division leads to inf or nan at time 0, (a=6.93672) / (b=0), where divisor b is: sqrt(b1.g * b1.h)
LOG_SUCCESS       | info    | The initialization finished successfully without homotopy method.
assert            | warning | The following assertion has been violated at time 10.560000
assert            | debug   | Model error: Argument of sqrt(b1.g * b1.h) was -0.186758 should be >= 0
assert            | warning | The following assertion has been violated at time 10.560000
assert            | debug   | Model error: Argument of sqrt(b1.g * b1.h) was -0.154058 should be >= 0
assert            | debug   | division leads to inf or nan at time 21.9614, (a=0) / (b=0), where divisor b is: sqrt(b1.g * b1.h)
assert            | debug   | division leads to inf or nan at time 20.1835, (a=0) / (b=0), where divisor b is: sqrt(b1.g * b1.h)
LOG_SUCCESS       | info    | The simulation finished successfully.
"
end SimulationResult;

"Warning: Iteration variables with default zero start attribute in equation system w/o analytic Jacobian:
         b1.v:VARIABLE()  type: Real 
         b1.h:VARIABLE()  type: Real 
         b1.fout:VARIABLE()  type: Real
"

Moving either A*H=V or fout=k*v out of the if expression (and removing the corresponding equation from else branch) leads to successfull simulation.

Change History (0)

Note: See TracTickets for help on using tickets.