1   /* Copyright 2002-2020 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  
19  import org.hipparchus.analysis.differentiation.DSFactory;
20  import org.hipparchus.analysis.differentiation.DerivativeStructure;
21  import org.hipparchus.geometry.euclidean.threed.FieldRotation;
22  import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
23  import org.orekit.propagation.numerical.NumericalPropagator;
24  import org.orekit.propagation.semianalytical.dsst.DSSTPropagator;
25  
26  /** Converter for states and parameters arrays
27   *  for both {@link NumericalPropagator numerical} and {@link DSSTPropagator semi-analytical} propagators.
28   *  @since 10.2 this class is replaced by {@link AbstractGradientConverter}
29   *  @author Luc Maisonobe
30   */
31  public abstract class AbstractDSConverter {
32  
33      /** Dimension of the state. */
34      private final int freeStateParameters;
35  
36      /** Simple constructor.
37       * @param freeStateParameters number of free parameters
38       */
39      protected AbstractDSConverter(final int freeStateParameters) {
40          this.freeStateParameters = freeStateParameters;
41      }
42  
43      /** Get the number of free state parameters.
44       * @return number of free state parameters
45       */
46      public int getFreeStateParameters() {
47          return freeStateParameters;
48      }
49  
50      /** Add zero derivatives.
51       * @param original original scalar
52       * @param factory factory for the extended derivatives
53       * @return extended scalar
54       */
55      protected DerivativeStructure extend(final DerivativeStructure original, final DSFactory factory) {
56          final double[] originalDerivatives = original.getAllDerivatives();
57          final double[] extendedDerivatives = new double[factory.getCompiler().getSize()];
58          System.arraycopy(originalDerivatives, 0, extendedDerivatives, 0, originalDerivatives.length);
59          return factory.build(extendedDerivatives);
60      }
61  
62      /** Add zero derivatives.
63       * @param original original vector
64       * @param factory factory for the extended derivatives
65       * @return extended vector
66       */
67      protected FieldVector3D<DerivativeStructure> extend(final FieldVector3D<DerivativeStructure> original, final DSFactory factory) {
68          return new FieldVector3D<>(extend(original.getX(), factory),
69                          extend(original.getY(), factory),
70                          extend(original.getZ(), factory));
71      }
72  
73      /** Add zero derivatives.
74       * @param original original rotation
75       * @param factory factory for the extended derivatives
76       * @return extended rotation
77       */
78      protected FieldRotation<DerivativeStructure> extend(final FieldRotation<DerivativeStructure> original, final DSFactory factory) {
79          return new FieldRotation<>(extend(original.getQ0(), factory),
80                          extend(original.getQ1(), factory),
81                          extend(original.getQ2(), factory),
82                          extend(original.getQ3(), factory),
83                          false);
84      }
85  }