Author: luc
Date: Tue Jun  2 20:42:15 2009
New Revision: 781157

URL: http://svn.apache.org/viewvc?rev=781157&view=rev
Log:
fixed corner cases when events occur right at integration start
(which in fact always happen when a resetting event forces a restart just after 
the event has occurred)

Modified:
    
commons/proper/math/trunk/src/java/org/apache/commons/math/ode/events/EventState.java

Modified: 
commons/proper/math/trunk/src/java/org/apache/commons/math/ode/events/EventState.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/java/org/apache/commons/math/ode/events/EventState.java?rev=781157&r1=781156&r2=781157&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/java/org/apache/commons/math/ode/events/EventState.java
 (original)
+++ 
commons/proper/math/trunk/src/java/org/apache/commons/math/ode/events/EventState.java
 Tue Jun  2 20:42:15 2009
@@ -211,13 +211,21 @@
                     final BrentSolver solver = new BrentSolver();
                     solver.setAbsoluteAccuracy(convergence);
                     solver.setMaximalIterationCount(maxIterationCount);
-                    final double root = (ta <= tb) ? solver.solve(f, ta, tb) : 
solver.solve(f, tb, ta);
-                    if (Math.abs(root - ta) <= convergence) {
-                        // we have found (again ?) a past event, we simply 
ignore it
+                    double root;
+                    try {
+                        root = (ta <= tb) ? solver.solve(f, ta, tb) : 
solver.solve(f, tb, ta);
+                    } catch (IllegalArgumentException iae) {
+                        // the interval did not really bracket a root
+                        root = Double.NaN;
+                    }
+                    if (Double.isNaN(root) ||
+                        ((Math.abs(root - ta) <= convergence) &&
+                         (Math.abs(root - previousEventTime) <= convergence))) 
{
+                        // we have either found nothing or found (again ?) a 
past event, we simply ignore it
                         ta = tb;
                         ga = gb;
                     } else if (Double.isNaN(previousEventTime) ||
-                        (Math.abs(previousEventTime - root) > convergence)) {
+                               (Math.abs(previousEventTime - root) > 
convergence)) {
                         pendingEventTime = root;
                         if (pendingEvent && (Math.abs(t1 - pendingEventTime) 
<= convergence)) {
                             // we were already waiting for this event which was


Reply via email to