All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hipparchus.ode.events.ODEEventHandler Maven / Gradle / Ivy

The newest version!
/*
 * Licensed to the Hipparchus project under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The Hipparchus project licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.hipparchus.ode.events;

import org.hipparchus.ode.ODEState;
import org.hipparchus.ode.ODEStateAndDerivative;

/** This interface represents a handler for discrete events triggered
 * during ODE integration.
 *
 * 

Some events can be triggered at discrete times as an ODE problem * is solved. This occurs for example when the integration process * should be stopped as some state is reached (G-stop facility) when the * precise date is unknown a priori, or when the derivatives have * discontinuities, or simply when the user wants to monitor some * states boundaries crossings. *

* *

These events are defined as occurring when a g * switching function sign changes.

* *

Since events are only problem-dependent and are triggered by the * independent time variable and the state vector, they can * occur at virtually any time, unknown in advance. The integrators will * take care to avoid sign changes inside the steps, they will reduce * the step size when such an event is detected in order to put this * event exactly at the end of the current step. This guarantees that * step interpolation (which always has a one step scope) is relevant * even in presence of discontinuities. This is independent from the * stepsize control provided by integrators that monitor the local * error (this event handling feature is available for all integrators, * including fixed step ones).

* *

* Note that prior to Hipparchus 3.0, some of the methods that are now in * {@link ODEEventDetector} were in this interface (and the remaining * ones were in the defunct {@code EventHandlerConfiguration} interface). * The interfaces have been reorganized to allow different objects to be * used in event detection and event handling, hence allowing users to * reuse predefined events detectors with custom handlers. *

* @see org.hipparchus.ode.events * @since 3.0 */ public interface ODEEventHandler { /** Initialize event handler at the start of an ODE integration. *

* This method is called once at the start of the integration. It * may be used by the event handler to initialize some internal data * if needed. *

*

* The default implementation does nothing *

* @param initialState initial time, state vector and derivative * @param finalTime target time for the integration * @param detector event detector related to the event handler */ default void init(ODEStateAndDerivative initialState, double finalTime, ODEEventDetector detector) { // nothing by default } /** Handle an event and choose what to do next. *

This method is called when the integrator has accepted a step * ending exactly on a sign change of the function, just after * the step handler itself is called (see below for scheduling). It * allows the user to update his internal data to acknowledge the fact * the event has been handled (for example setting a flag in the {@link * org.hipparchus.ode.OrdinaryDifferentialEquation * differential equations} to switch the derivatives computation in * case of discontinuity), or to direct the integrator to either stop * or continue integration, possibly with a reset state or derivatives.

* *
    *
  • if {@link Action#STOP} is returned, the integration will be stopped,
  • *
  • if {@link Action#RESET_STATE} is returned, the {@link #resetState * resetState} method will be called once the step handler has * finished its task, and the integrator will also recompute the * derivatives,
  • *
  • if {@link Action#RESET_DERIVATIVES} is returned, the integrator * will recompute the derivatives, *
  • if {@link Action#RESET_EVENTS} is returned, the integrator * will recheck all event handlers, *
  • if {@link Action#CONTINUE} is returned, no specific action will * be taken (apart from having called this method) and integration * will continue.
  • *
* *

The scheduling between this method and the {@link * org.hipparchus.ode.sampling.ODEStepHandler ODEStepHandler} method {@link * org.hipparchus.ode.sampling.ODEStepHandler#handleStep(org.hipparchus.ode.sampling.ODEStateInterpolator) * handleStep(interpolator)} is to call {@code handleStep} first and this method afterwards * (this scheduling changed as of Hipparchus 2.0). This scheduling allows user code * called by this method and user code called by step handlers to get values * of the independent time variable consistent with integration direction.

* * @param state current value of the independent time variable, state vector * and derivative * @param detector detector that triggered the event * @param increasing if true, the value of the switching function increases * when times increases around event (note that increase is measured with respect * to physical time, not with respect to integration which may go backward in time) * @return indication of what the integrator should do next, this * value must be one of {@link Action#STOP}, {@link Action#RESET_STATE}, * {@link Action#RESET_DERIVATIVES}, {@link Action#RESET_EVENTS}, or * {@link Action#CONTINUE} */ Action eventOccurred(ODEStateAndDerivative state, ODEEventDetector detector, boolean increasing); /** Reset the state prior to continue the integration. * *

This method is called after the step handler has returned and * before the next step is started, but only when {@link * #eventOccurred} has itself returned the {@link Action#RESET_STATE} * indicator. It allows the user to reset the state vector for the * next step, without perturbing the step handler of the finishing * step.

*

The default implementation returns its argument.

* @param detector detector that triggered the event * @param state current value of the independent time variable, state vector * and derivative * @return reset state (note that it does not include the derivatives, they will * be added automatically by the integrator afterwards) */ default ODEState resetState(ODEEventDetector detector, ODEStateAndDerivative state) { return state; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy