commons-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From l..@apache.org
Subject svn commit: r676610 - /commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/events/EventState.java
Date Mon, 14 Jul 2008 14:51:34 GMT
Author: luc
Date: Mon Jul 14 07:51:33 2008
New Revision: 676610

URL: http://svn.apache.org/viewvc?rev=676610&view=rev
Log:
improved robustness in case of events just at integration start

When an event occurs exactly at integration start, the first truncated
steps ends up with zero size. This induced problems with forward/backward
sensing based on this step alone. This also induced an infinite loop in
the calling integrators.

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

Modified: commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/events/EventState.java
URL: http://svn.apache.org/viewvc/commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/events/EventState.java?rev=676610&r1=676609&r2=676610&view=diff
==============================================================================
--- commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/events/EventState.java
(original)
+++ commons/proper/math/branches/MATH_2_0/src/java/org/apache/commons/math/ode/events/EventState.java
Mon Jul 14 07:51:33 2008
@@ -177,7 +177,7 @@
 
             double ta = t0;
             double ga = g0;
-            double tb = t0 + ((t1 > t0) ? convergence : -convergence);
+            double tb = t0 + (interpolator.isForward() ? convergence : -convergence);
             for (int i = 0; i < n; ++i) {
 
                 // evaluate handler value at the end of the substep
@@ -207,7 +207,11 @@
                     solver.setAbsoluteAccuracy(convergence);
                     solver.setMaximalIterationCount(maxIterationCount);
                     final double root = (ta <= tb) ? solver.solve(ta, tb) : solver.solve(tb,
ta);
-                    if (Double.isNaN(previousEventTime) ||
+                    if (Math.abs(root - ta) <= convergence) {
+                        // we have found (again ?) a past event, we simply ignore it
+                        ta = tb;
+                        ga = gb;
+                    } else if (Double.isNaN(previousEventTime) ||
                         (Math.abs(previousEventTime - root) > convergence)) {
                         pendingEventTime = root;
                         if (pendingEvent && (Math.abs(t1 - pendingEventTime) <=
convergence)) {
@@ -313,7 +317,7 @@
         pendingEventTime  = Double.NaN;
 
         return (nextAction == EventHandler.RESET_STATE) ||
-        (nextAction == EventHandler.RESET_DERIVATIVES);
+               (nextAction == EventHandler.RESET_DERIVATIVES);
 
     }
 



Mime
View raw message