Opened 8 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.
  Note:
 See   TracTickets
 for help on using tickets.
    
