1   /* Copyright 2002-2022 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.semianalytical.dsst;
18  
19  import org.hipparchus.linear.RealMatrix;
20  import org.orekit.propagation.SpacecraftState;
21  import org.orekit.propagation.integration.AdditionalDerivativesProvider;
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 DSSTIntegrableJacobianColumnGenerator
34      implements AdditionalDerivativesProvider, DSSTStateTransitionMatrixGenerator.DSSTPartialsObserver {
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      DSSTIntegrableJacobianColumnGenerator(final DSSTStateTransitionMatrixGenerator 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 yield(final SpacecraftState state) {
82          return !state.hasAdditionalStateDerivative(stmName);
83      }
84  
85      /** {@inheritDoc} */
86      @Override
87      public void partialsComputed(final SpacecraftState state, final RealMatrix factor, final double[] meanElementsPartials) {
88          // retrieve current Jacobian column
89          final double[] p = state.getAdditionalState(getName());
90  
91          // compute time derivative of the Jacobian column
92          System.arraycopy(factor.operate(p), 0, pDot, 0, pDot.length);
93          for (int i = 0; i < pDot.length; ++i) {
94              pDot[i] += meanElementsPartials[i];
95          }
96  
97      }
98  
99      /** {@inheritDoc} */
100     @Override
101     public double[] derivatives(final SpacecraftState s) {
102         return pDot;
103     }
104 
105 }
106