delayed integrator internal state update after the call to step handler

to ensure integrator.getStepStart() and interpolator.getPreviousTime()
are consistent.
renamed getStepsize() into getSignedStepsize()

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@591661 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Luc Maisonobe 2007-11-03 18:46:11 +00:00
parent c9272ec872
commit 2071918a7a
5 changed files with 20 additions and 17 deletions

View File

@ -332,7 +332,7 @@ public abstract class AdaptiveStepsizeIntegrator
return stepStart; return stepStart;
} }
public double getCurrentStepsize() { public double getCurrentSignedStepsize() {
return stepSize; return stepSize;
} }

View File

@ -67,7 +67,7 @@ public interface FirstOrderIntegrator {
* <p>This method solves an Initial Value Problem (IVP).</p> * <p>This method solves an Initial Value Problem (IVP).</p>
* <p>Since this method stores some internal state variables made * <p>Since this method stores some internal state variables made
* available in its public interface during integration ({@link * available in its public interface during integration ({@link
* #getCurrentStepsize()}), it is <em>not</em> thread-safe.</p> * #getCurrentSignedStepsize()}), it is <em>not</em> thread-safe.</p>
* @param equations differential equations to integrate * @param equations differential equations to integrate
* @param t0 initial time * @param t0 initial time
* @param y0 initial value of the state vector at t0 * @param y0 initial value of the state vector at t0
@ -95,15 +95,15 @@ public interface FirstOrderIntegrator {
*/ */
public double getCurrentStepStart(); public double getCurrentStepStart();
/** Get the current value of the integration stepsize. /** Get the current signed value of the integration stepsize.
* <p>This method can be called during integration (typically by * <p>This method can be called during integration (typically by
* the object implementing the {@link FirstOrderDifferentialEquations * the object implementing the {@link FirstOrderDifferentialEquations
* differential equations} problem) if the value of the current stepsize * differential equations} problem) if the signed value of the current stepsize
* that is tried is needed.</p> * that is tried is needed.</p>
* <p>The result is undefined if the method is called outside of * <p>The result is undefined if the method is called outside of
* calls to {@link #integrate}</p> * calls to {@link #integrate}</p>
* @return current value of the stepsize * @return current signed value of the stepsize
*/ */
public double getCurrentStepsize(); public double getCurrentSignedStepsize();
} }

View File

@ -850,17 +850,18 @@ public class GraggBulirschStoerIntegrator
if (! reject) { if (! reject) {
// store end of step state // store end of step state
stepStart += stepSize; double nextStep = stepStart + stepSize;
System.arraycopy(y1, 0, y, 0, y0.length); System.arraycopy(y1, 0, y, 0, y0.length);
switchesHandler.stepAccepted(stepStart, y); switchesHandler.stepAccepted(nextStep, y);
if (switchesHandler.stop()) { if (switchesHandler.stop()) {
lastStep = true; lastStep = true;
} }
// provide the step data to the step handler // provide the step data to the step handler
interpolator.storeTime(stepStart); interpolator.storeTime(nextStep);
handler.handleStep(interpolator, lastStep); handler.handleStep(interpolator, lastStep);
stepStart = nextStep;
if (switchesHandler.reset(stepStart, y) && ! lastStep) { if (switchesHandler.reset(stepStart, y) && ! lastStep) {
// some switching function has triggered changes that // some switching function has triggered changes that

View File

@ -274,18 +274,19 @@ public abstract class RungeKuttaFehlbergIntegrator
} }
// the step has been accepted // the step has been accepted
stepStart += stepSize; double nextStep = stepStart + stepSize;
System.arraycopy(yTmp, 0, y, 0, y0.length); System.arraycopy(yTmp, 0, y, 0, y0.length);
switchesHandler.stepAccepted(stepStart, y); switchesHandler.stepAccepted(nextStep, y);
if (switchesHandler.stop()) { if (switchesHandler.stop()) {
lastStep = true; lastStep = true;
} else { } else {
lastStep = forward ? (stepStart >= t) : (stepStart <= t); lastStep = forward ? (nextStep >= t) : (nextStep <= t);
} }
// provide the step data to the step handler // provide the step data to the step handler
interpolator.storeTime(stepStart); interpolator.storeTime(nextStep);
handler.handleStep(interpolator, lastStep); handler.handleStep(interpolator, lastStep);
stepStart = nextStep;
if (fsal) { if (fsal) {
// save the last evaluation for the next step // save the last evaluation for the next step

View File

@ -219,9 +219,9 @@ public abstract class RungeKuttaIntegrator
} }
// the step has been accepted // the step has been accepted
stepStart += stepSize; double nextStep = stepStart + stepSize;
System.arraycopy(yTmp, 0, y, 0, y0.length); System.arraycopy(yTmp, 0, y, 0, y0.length);
switchesHandler.stepAccepted(stepStart, y); switchesHandler.stepAccepted(nextStep, y);
if (switchesHandler.stop()) { if (switchesHandler.stop()) {
lastStep = true; lastStep = true;
} else { } else {
@ -229,8 +229,9 @@ public abstract class RungeKuttaIntegrator
} }
// provide the step data to the step handler // provide the step data to the step handler
interpolator.storeTime(stepStart); interpolator.storeTime(nextStep);
handler.handleStep(interpolator, lastStep); handler.handleStep(interpolator, lastStep);
stepStart = nextStep;
if (switchesHandler.reset(stepStart, y) && ! lastStep) { if (switchesHandler.reset(stepStart, y) && ! lastStep) {
// some switching function has triggered changes that // some switching function has triggered changes that
@ -256,7 +257,7 @@ public abstract class RungeKuttaIntegrator
return stepStart; return stepStart;
} }
public double getCurrentStepsize() { public double getCurrentSignedStepsize() {
return stepSize; return stepSize;
} }