FieldAdditionalDerivativesProvider.java

  1. /* Copyright 2002-2024 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.FieldSpacecraftState;
  20. import org.orekit.time.FieldAbsoluteDate;

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

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

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

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

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

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

  102. }