FieldAdditionalDerivativesProvider.java

  1. /* Copyright 2002-2025 CS GROUP
  2.  * Licensed to CS GROUP (CS) under one or more
  3.  * contributor license agreements.  See the NOTICE file distributed with
  4.  * this work for additional information regarding copyright ownership.
  5.  * CS licenses this file to You under the Apache License, Version 2.0
  6.  * (the "License"); you may not use this file except in compliance with
  7.  * the License.  You may obtain a copy of the License at
  8.  *
  9.  *   http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.orekit.propagation.integration;

  18. import org.hipparchus.CalculusFieldElement;
  19. import org.orekit.propagation.FieldAdditionalDataProvider;
  20. import org.orekit.propagation.FieldSpacecraftState;
  21. import org.orekit.time.FieldAbsoluteDate;

  22. /** Provider for additional derivatives.
  23. *
  24. * <p>
  25. * In some cases users may need to integrate some problem-specific equations along with
  26. * classical spacecraft equations of motions. One example is optimal control in low
  27. * thrust where adjoint parameters linked to the minimized Hamiltonian must be integrated.
  28. * Another example is formation flying or rendez-vous which use the Clohessy-Whiltshire
  29. * equations for the relative motion.
  30. * </p>
  31. * <p>
  32. * This interface allows users to add such equations to a {@link
  33. * org.orekit.propagation.numerical.FieldNumericalPropagator numerical propagator} or a {@link
  34. * org.orekit.propagation.semianalytical.dsst.FieldDSSTPropagator DSST propagator}. Users provide the
  35. * equations as an implementation of this interface and register it to the propagator thanks to
  36. * its {@link FieldAbstractIntegratedPropagator#addAdditionalDerivativesProvider(FieldAdditionalDerivativesProvider)}
  37. * method. Several such objects can be registered with each numerical propagator, but it is
  38. * recommended to gather in the same object the sets of parameters which equations can interact
  39. * on each others states.
  40. * </p>
  41. * <p>
  42. * This interface is the numerical (read not already integrated) counterpart of
  43. * the {@link FieldAdditionalDataProvider} interface.
  44. * It allows to append various additional state parameters to any {@link
  45. * org.orekit.propagation.numerical.FieldNumericalPropagator numerical propagator} or {@link
  46. * org.orekit.propagation.semianalytical.dsst.FieldDSSTPropagator DSST propagator}.
  47. * </p>
  48. * @see org.orekit.propagation.integration.FieldAbstractIntegratedPropagator
  49. * @author Luc Maisonobe
  50. * @since 11.1
  51. * @param <T> type of the field elements
  52. */
  53. public interface FieldAdditionalDerivativesProvider<T extends CalculusFieldElement<T>> {

  54.     /** Get the name of the additional derivatives (which will become state once integrated).
  55.      * @return name of the additional state (names containing "orekit"
  56.      * with any case are reserved for the library internal use)
  57.      */
  58.     String getName();

  59.     /** Get the dimension of the generated derivative.
  60.      * @return dimension of the generated
  61.      */
  62.     int getDimension();

  63.     /** Initialize the generator at the start of propagation.
  64.      * @param initialState initial state information at the start of propagation
  65.      * @param target       date of propagation
  66.      */
  67.     default void init(final FieldSpacecraftState<T> initialState, final FieldAbsoluteDate<T> target) {
  68.         // nothing by default
  69.     }

  70.     /** Check if this provider should yield so another provider has an opportunity to add missing parts.
  71.      * <p>
  72.      * Decision to yield is often based on an additional state being {@link FieldSpacecraftState#hasAdditionalData(String)
  73.      * already available} in the provided {@code state} (but it could theoretically also depend on
  74.      * an additional state derivative being {@link FieldSpacecraftState#hasAdditionalStateDerivative(String)
  75.      * already available}, or any other criterion). If for example a provider needs the state transition
  76.      * matrix, it could implement this method as:
  77.      * </p>
  78.      * <pre>{@code
  79.      * public boolean yields(final FieldSpacecraftState<T> state) {
  80.      *     return !state.getAdditionalStates().containsKey("STM");
  81.      * }
  82.      * }</pre>
  83.      * <p>
  84.      * The default implementation returns {@code false}, meaning that derivative data can be
  85.      * {@link #combinedDerivatives(FieldSpacecraftState) computed} immediately.
  86.      * </p>
  87.      * @param state state to handle
  88.      * @return true if this provider should yield so another provider has an opportunity to add missing parts
  89.      * as the state is incrementally built up
  90.      */
  91.     default boolean yields(FieldSpacecraftState<T> state) {
  92.         return false;
  93.     }

  94.     /** Compute the derivatives related to the additional state (and optionally main state increments).
  95.      * @param s current state information: date, kinematics, attitude, and
  96.      * additional states this equations depend on (according to the
  97.      * {@link #yields(FieldSpacecraftState) yields} method)
  98.      * @return computed combined derivatives, which may include some incremental
  99.      * coupling effect to add to main state derivatives
  100.      * @since 11.2
  101.      */
  102.     FieldCombinedDerivatives<T> combinedDerivatives(FieldSpacecraftState<T> s);

  103. }