OsculatingToDSST6X0Converter.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.Orbit;
  20. import org.orekit.propagation.SpacecraftState;
  21. import org.orekit.propagation.semianalytical.dsst.DSSTPropagator;
  22. import org.orekit.propagation.semianalytical.dsst.forces.DSSTForceModel;
  23. import org.orekit.propagation.conversion.averaging.DSST6X0OrbitalState;
  24. import org.orekit.propagation.conversion.averaging.elements.AveragedEquinoctialWithMeanAngle;

  25. import java.util.Collection;

  26. /**
  27.  * Class for osculating-to-averaged conversion according to DSST theory, using 6 zonal harmonics as
  28.  * the only perturbations.
  29.  *
  30.  * @author Romain Serra
  31.  * @see DSSTPropagator
  32.  * @see DSST6X0OrbitalState
  33.  * @since 12.1
  34.  */
  35. public class OsculatingToDSST6X0Converter
  36.         extends FixedPointOsculatingToAveragedConverter<DSST6X0OrbitalState> {

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

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

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

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

  65.     /**
  66.      * Build averaged orbit.
  67.      * @param osculatingOrbit osculating orbit
  68.      * @return averaged orbit in DSST sense.
  69.      */
  70.     private Orbit createAveragedOrbit(final Orbit osculatingOrbit) {
  71.         final Collection<DSSTForceModel> forceModels = DSST6X0OrbitalState
  72.                 .createForces(harmonicsProvider);
  73.         final SpacecraftState osculatingState = new SpacecraftState(osculatingOrbit);
  74.         final SpacecraftState averagedState = DSSTPropagator.computeMeanState(osculatingState,
  75.                 null, forceModels, getEpsilon(), getMaxIterations());
  76.         return averagedState.getOrbit();
  77.     }

  78.     /**
  79.      * Build averaged orbital elements from orbit.
  80.      * @param averagedOrbit averaged orbit
  81.      * @return orbital elements
  82.      */
  83.     private AveragedEquinoctialWithMeanAngle buildElements(final Orbit averagedOrbit) {
  84.         return new AveragedEquinoctialWithMeanAngle(averagedOrbit.getA(),
  85.                 averagedOrbit.getEquinoctialEx(), averagedOrbit.getEquinoctialEy(),
  86.                 averagedOrbit.getHx(), averagedOrbit.getHy(), averagedOrbit.getLM());
  87.     }

  88. }