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.numerical;
18  
19  import org.orekit.propagation.SpacecraftState;
20  import org.orekit.propagation.integration.AdditionalDerivativesProvider;
21  import org.orekit.propagation.integration.CombinedDerivatives;
22  
23  /** Generator for one column of a Jacobian matrix.
24   * <p>
25   * This generator is based on variational equations, so
26   * it implements {@link AdditionalDerivativesProvider} and
27   * computes only the derivative of the Jacobian column, to
28   * be integrated by the propagator alongside the primary state.
29   * </p>
30   * @author Luc Maisonobe
31   * @since 11.1
32   */
33  class IntegrableJacobianColumnGenerator
34      implements AdditionalDerivativesProvider, StateTransitionMatrixGenerator.PartialsObserver {
35  
36      /** Name of the state for State Transition Matrix. */
37      private final String stmName;
38  
39      /** Name of the parameter corresponding to the column. */
40      private final String columnName;
41  
42      /** Last value computed for the partial derivatives. */
43      private final double[] pDot;
44  
45      /** Simple constructor.
46       * <p>
47       * The generator for State Transition Matrix <em>must</em> be registered as
48       * an integrable generator to the same propagator as the instance, as it
49       * must be scheduled to update the state before the instance
50       * </p>
51       * @param stmGenerator generator for State Transition Matrix
52       * @param columnName name of the parameter corresponding to the column
53       */
54      IntegrableJacobianColumnGenerator(final StateTransitionMatrixGenerator stmGenerator, final String columnName) {
55          this.stmName    = stmGenerator.getName();
56          this.columnName = columnName;
57          this.pDot       = new double[getDimension()];
58          stmGenerator.addObserver(columnName, this);
59      }
60  
61      /** {@inheritDoc} */
62      @Override
63      public String getName() {
64          return columnName;
65      }
66  
67      /** Get the dimension of the generated column.
68       * @return dimension of the generated column
69       */
70      public int getDimension() {
71          return 6;
72      }
73  
74      /** {@inheritDoc}
75       * <p>
76       * The column derivative can be computed only if the State Transition Matrix derivatives
77       * are available, as it implies the STM generator has already been run.
78       * </p>
79       */
80      @Override
81      public boolean yields(final SpacecraftState state) {
82          return !state.hasAdditionalStateDerivative(stmName);
83      }
84  
85      /** {@inheritDoc} */
86      @Override
87      public void partialsComputed(final SpacecraftState state, final double[] factor, final double[] accelerationPartials) {
88          // retrieve current Jacobian column
89          final double[] p = state.getAdditionalState(getName());
90  
91          // compute time derivative of the Jacobian column
92          StateTransitionMatrixGenerator.multiplyMatrix(factor, p, pDot, 1);
93          pDot[3] += accelerationPartials[0];
94          pDot[4] += accelerationPartials[1];
95          pDot[5] += accelerationPartials[2];
96      }
97  
98      /** {@inheritDoc} */
99      @Override
100     public CombinedDerivatives combinedDerivatives(final SpacecraftState s) {
101         return new CombinedDerivatives(pDot, null);
102     }
103 
104 }
105