Fieldifier.java

  1. /* Copyright 2002-2023 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.utils;

  18. import org.hipparchus.CalculusFieldElement;
  19. import org.hipparchus.Field;
  20. import org.hipparchus.linear.FieldMatrix;
  21. import org.hipparchus.linear.MatrixUtils;
  22. import org.hipparchus.linear.RealMatrix;
  23. import org.orekit.errors.OrekitInternalError;
  24. import org.orekit.frames.Frame;
  25. import org.orekit.orbits.CircularOrbit;
  26. import org.orekit.orbits.EquinoctialOrbit;
  27. import org.orekit.orbits.FieldCartesianOrbit;
  28. import org.orekit.orbits.FieldCircularOrbit;
  29. import org.orekit.orbits.FieldEquinoctialOrbit;
  30. import org.orekit.orbits.FieldKeplerianOrbit;
  31. import org.orekit.orbits.FieldOrbit;
  32. import org.orekit.orbits.KeplerianOrbit;
  33. import org.orekit.orbits.Orbit;
  34. import org.orekit.orbits.OrbitType;
  35. import org.orekit.orbits.PositionAngleType;
  36. import org.orekit.propagation.FieldStateCovariance;
  37. import org.orekit.propagation.StateCovariance;
  38. import org.orekit.time.FieldAbsoluteDate;

  39. /**
  40.  * Utility class used to convert class to their Field equivalent.
  41.  *
  42.  * @author Vincent Cucchietti
  43.  */
  44. public class Fieldifier {

  45.     /** Private constructor. */
  46.     private Fieldifier() {
  47.         // Empty constructor
  48.     }

  49.     /**
  50.      * Fieldify given orbit with given field.
  51.      * <p>
  52.      * Conserve derivatives and return orbit in same orbit type as input orbit.
  53.      *
  54.      * @param field field to fieldify with
  55.      * @param orbit orbit to fieldify
  56.      * @param <T> type of the elements
  57.      *
  58.      * @return fielded orbit
  59.      */
  60.     public static <T extends CalculusFieldElement<T>> FieldOrbit<T> fieldify(final Field<T> field, final Orbit orbit) {

  61.         final T                    one       = field.getOne();
  62.         final FieldAbsoluteDate<T> fieldDate = new FieldAbsoluteDate<>(field, orbit.getDate());
  63.         final T                    fieldMu   = one.multiply(orbit.getMu());
  64.         final Frame                frame     = orbit.getFrame();

  65.         switch (orbit.getType()) {
  66.             case CIRCULAR: {
  67.                 final CircularOrbit circOrbit = (CircularOrbit) OrbitType.CIRCULAR.convertType(orbit);

  68.                 // Get orbital elements
  69.                 final T a      = one.multiply(circOrbit.getA());
  70.                 final T ex     = one.multiply(circOrbit.getCircularEx());
  71.                 final T ey     = one.multiply(circOrbit.getCircularEy());
  72.                 final T i      = one.multiply(circOrbit.getI());
  73.                 final T raan   = one.multiply(circOrbit.getRightAscensionOfAscendingNode());
  74.                 final T alphaM = one.multiply(circOrbit.getAlphaM());

  75.                 // Get derivatives
  76.                 final T aDot      = one.multiply(circOrbit.getADot());
  77.                 final T exDot     = one.multiply(circOrbit.getCircularExDot());
  78.                 final T eyDot     = one.multiply(circOrbit.getCircularEyDot());
  79.                 final T iDot      = one.multiply(circOrbit.getIDot());
  80.                 final T raanDot   = one.multiply(circOrbit.getRightAscensionOfAscendingNodeDot());
  81.                 final T alphaMDot = one.multiply(circOrbit.getAlphaMDot());

  82.                 return new FieldCircularOrbit<>(a, ex, ey, i, raan, alphaM, aDot, exDot, eyDot, iDot, raanDot, alphaMDot,
  83.                                                 PositionAngleType.MEAN, frame, fieldDate, fieldMu);
  84.             }

  85.             case CARTESIAN: {
  86.                 final FieldPVCoordinates<T> orbitPV = new FieldPVCoordinates<>(field, orbit.getPVCoordinates());

  87.                 return new FieldCartesianOrbit<>(orbitPV, orbit.getFrame(), fieldDate, fieldMu);
  88.             }

  89.             case KEPLERIAN: {
  90.                 final KeplerianOrbit kepOrbit = (KeplerianOrbit) OrbitType.KEPLERIAN.convertType(orbit);

  91.                 // Get orbital elements
  92.                 final T a           = one.multiply(kepOrbit.getA());
  93.                 final T e           = one.multiply(kepOrbit.getE());
  94.                 final T i           = one.multiply(kepOrbit.getI());
  95.                 final T raan        = one.multiply(kepOrbit.getRightAscensionOfAscendingNode());
  96.                 final T pa          = one.multiply(kepOrbit.getPerigeeArgument());
  97.                 final T meanAnomaly = one.multiply(kepOrbit.getMeanAnomaly());

  98.                 // Get derivatives
  99.                 final T aDot           = one.multiply(kepOrbit.getADot());
  100.                 final T eDot           = one.multiply(kepOrbit.getEDot());
  101.                 final T iDot           = one.multiply(kepOrbit.getIDot());
  102.                 final T raanDot        = one.multiply(kepOrbit.getRightAscensionOfAscendingNodeDot());
  103.                 final T paDot          = one.multiply(kepOrbit.getPerigeeArgumentDot());
  104.                 final T meanAnomalyDot = one.multiply(kepOrbit.getMeanAnomalyDot());

  105.                 return new FieldKeplerianOrbit<>(a, e, i, pa, raan, meanAnomaly, aDot, eDot, iDot, paDot, raanDot,
  106.                                                  meanAnomalyDot, PositionAngleType.MEAN, frame, fieldDate, fieldMu);
  107.             }
  108.             case EQUINOCTIAL: {
  109.                 final EquinoctialOrbit equiOrbit = (EquinoctialOrbit) OrbitType.EQUINOCTIAL.convertType(orbit);

  110.                 // Get orbital elements
  111.                 final T a  = one.multiply(equiOrbit.getA());
  112.                 final T ex = one.multiply(equiOrbit.getEquinoctialEx());
  113.                 final T ey = one.multiply(equiOrbit.getEquinoctialEy());
  114.                 final T hx = one.multiply(equiOrbit.getHx());
  115.                 final T hy = one.multiply(equiOrbit.getHy());
  116.                 final T lm = one.multiply(equiOrbit.getLM());

  117.                 // Get derivatives
  118.                 final T aDot  = one.multiply(equiOrbit.getADot());
  119.                 final T exDot = one.multiply(equiOrbit.getEquinoctialExDot());
  120.                 final T eyDot = one.multiply(equiOrbit.getEquinoctialEyDot());
  121.                 final T hxDot = one.multiply(equiOrbit.getHxDot());
  122.                 final T hyDot = one.multiply(equiOrbit.getHyDot());
  123.                 final T lmDot = one.multiply(equiOrbit.getLMDot());

  124.                 return new FieldEquinoctialOrbit<>(a, ex, ey, hx, hy, lm, aDot, exDot, eyDot, hxDot, hyDot,
  125.                                                    lmDot, PositionAngleType.MEAN, frame, fieldDate, fieldMu);
  126.             }
  127.             default:
  128.                 // Should never happen
  129.                 throw new OrekitInternalError(null);
  130.         }

  131.     }

  132.     /**
  133.      * Fieldify given matrix with given field.
  134.      *
  135.      * @param field field to fieldify with
  136.      * @param matrix matrix to fieldify
  137.      * @param <T> type of the elements
  138.      *
  139.      * @return fielded matrix
  140.      */
  141.     public static <T extends CalculusFieldElement<T>> FieldMatrix<T> fieldify(final Field<T> field,
  142.                                                                               final RealMatrix matrix) {

  143.         final int rowDim    = matrix.getRowDimension();
  144.         final int columnDim = matrix.getColumnDimension();

  145.         final FieldMatrix<T> fieldMatrix = MatrixUtils.createFieldMatrix(field, rowDim, columnDim);

  146.         for (int i = 0; i < rowDim; i++) {
  147.             for (int j = 0; j < columnDim; j++) {
  148.                 fieldMatrix.setEntry(i, j, field.getOne().multiply(matrix.getEntry(i, j)));
  149.             }
  150.         }

  151.         return fieldMatrix;
  152.     }

  153.     /**
  154.      * Fieldify given state covariance with given field.
  155.      *
  156.      * @param field field to which the
  157.      * @param stateCovariance state covariance to fieldify
  158.      * @param <T> type of the elements
  159.      *
  160.      * @return fielded state covariance
  161.      *
  162.      * @since 12.0
  163.      */
  164.     public static <T extends CalculusFieldElement<T>> FieldStateCovariance<T> fieldify(final Field<T> field,
  165.                                                                                        final StateCovariance stateCovariance) {
  166.         final FieldMatrix<T>       fieldMatrix = fieldify(field, stateCovariance.getMatrix());
  167.         final FieldAbsoluteDate<T> fieldEpoch  = new FieldAbsoluteDate<>(field, stateCovariance.getDate());
  168.         if (stateCovariance.getLOF() == null) {
  169.             return new FieldStateCovariance<>(fieldMatrix, fieldEpoch, stateCovariance.getFrame(),
  170.                                               stateCovariance.getOrbitType(), stateCovariance.getPositionAngleType());
  171.         }
  172.         return new FieldStateCovariance<>(fieldMatrix, fieldEpoch, stateCovariance.getLOF());
  173.     }

  174. }