OsculatingToEcksteinHechlerConverter.java

  1. /* Copyright 2020-2024 Exotrail
  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.conversion.averaging.converters;

  18. import org.orekit.forces.gravity.potential.UnnormalizedSphericalHarmonicsProvider;
  19. import org.orekit.orbits.CircularOrbit;
  20. import org.orekit.orbits.Orbit;
  21. import org.orekit.propagation.analytical.EcksteinHechlerPropagator;
  22. import org.orekit.propagation.conversion.averaging.EcksteinHechlerOrbitalState;
  23. import org.orekit.propagation.conversion.averaging.elements.AveragedCircularWithMeanAngle;

  24. /**
  25.  * Class for osculating-to-averaged conversion according to Eckstein-Hechler theory.
  26.  *
  27.  * @author Romain Serra
  28.  * @see EcksteinHechlerPropagator
  29.  * @see EcksteinHechlerOrbitalState
  30.  * @since 12.1
  31.  */
  32. public class OsculatingToEcksteinHechlerConverter
  33.         extends FixedPointOsculatingToAveragedConverter<EcksteinHechlerOrbitalState> {

  34.     /** Order for spherical harmonics. */
  35.     private static final int HARMONICS_ORDER = 0;

  36.     /** Spherical harmonics provider. */
  37.     private final UnnormalizedSphericalHarmonicsProvider harmonicsProvider;

  38.     /**
  39.      * Constructor with default parameters for fixed-point algorithm.
  40.      * @param harmonicsProvider unnormalized provider
  41.      */
  42.     public OsculatingToEcksteinHechlerConverter(final UnnormalizedSphericalHarmonicsProvider harmonicsProvider) {
  43.         this(DEFAULT_EPSILON, DEFAULT_MAX_ITERATIONS, harmonicsProvider);
  44.     }

  45.     /**
  46.      * Constructor.
  47.      * @param epsilon convergence threshold
  48.      * @param maxIterations maximum number of iterations
  49.      * @param harmonicsProvider unnormalized provider
  50.      */
  51.     public OsculatingToEcksteinHechlerConverter(final double epsilon, final int maxIterations,
  52.                                                 final UnnormalizedSphericalHarmonicsProvider harmonicsProvider) {
  53.         super(epsilon, maxIterations);
  54.         this.harmonicsProvider = harmonicsProvider;
  55.     }

  56.     /** {@inheritDoc} */
  57.     @Override
  58.     public EcksteinHechlerOrbitalState convertToAveraged(final Orbit osculatingOrbit) {
  59.         final CircularOrbit averagedOrbit = createAveragedOrbit(osculatingOrbit);
  60.         final AveragedCircularWithMeanAngle elements = buildElements(averagedOrbit);
  61.         return new EcksteinHechlerOrbitalState(averagedOrbit.getDate(), elements,
  62.                 averagedOrbit.getFrame(), harmonicsProvider);
  63.     }

  64.     /**
  65.      * Build averaged orbit.
  66.      * @param osculatingOrbit osculating orbit
  67.      * @return averaged Circular orbit in Eckstein-Hechler sense.
  68.      */
  69.     private CircularOrbit createAveragedOrbit(final Orbit osculatingOrbit) {
  70.         final UnnormalizedSphericalHarmonicsProvider.UnnormalizedSphericalHarmonics harmonics =
  71.                 harmonicsProvider.onDate(osculatingOrbit.getDate());
  72.         return EcksteinHechlerPropagator.computeMeanOrbit(osculatingOrbit,
  73.                 harmonicsProvider.getAe(), harmonicsProvider.getMu(),
  74.                 harmonics.getUnnormalizedCnm(2, HARMONICS_ORDER),
  75.                 harmonics.getUnnormalizedCnm(3, HARMONICS_ORDER),
  76.                 harmonics.getUnnormalizedCnm(4, HARMONICS_ORDER),
  77.                 harmonics.getUnnormalizedCnm(5, HARMONICS_ORDER),
  78.                 harmonics.getUnnormalizedCnm(6, HARMONICS_ORDER),
  79.                 getEpsilon(), getMaxIterations());
  80.     }

  81.     /**
  82.      * Build averaged orbital elements from orbit.
  83.      * @param averagedOrbit averaged orbit
  84.      * @return orbital elements
  85.      */
  86.     private AveragedCircularWithMeanAngle buildElements(final CircularOrbit averagedOrbit) {
  87.         return new AveragedCircularWithMeanAngle(averagedOrbit.getA(),
  88.                 averagedOrbit.getCircularEx(), averagedOrbit.getCircularEy(), averagedOrbit.getI(),
  89.                 averagedOrbit.getRightAscensionOfAscendingNode(), averagedOrbit.getAlphaM());
  90.     }

  91. }