1   /* Copyright 2020-2025 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;
18  
19  import org.orekit.forces.gravity.potential.UnnormalizedSphericalHarmonicsProvider;
20  import org.orekit.frames.Frame;
21  import org.orekit.orbits.KeplerianOrbit;
22  import org.orekit.orbits.Orbit;
23  import org.orekit.orbits.OrbitType;
24  import org.orekit.orbits.PositionAngleType;
25  import org.orekit.propagation.PropagationType;
26  import org.orekit.propagation.analytical.BrouwerLyddanePropagator;
27  import org.orekit.time.AbsoluteDate;
28  import org.orekit.propagation.conversion.averaging.elements.AveragedKeplerianWithMeanAngle;
29  
30  /**
31   * Class representing an averaged orbital state as in the Brouwer-Lyddane theory.
32   *
33   * @author Romain Serra
34   * @see AveragedOrbitalState
35   * @see BrouwerLyddanePropagator
36   * @since 12.1
37   */
38  public class BrouwerLyddaneOrbitalState extends AbstractHarmonicsBasedOrbitalState {
39  
40      /** So-called M2 coefficient, set to zero. */
41      private static final double M2 = 0.;
42  
43      /** Averaged Keplerian elements. */
44      private final AveragedKeplerianWithMeanAngle averagedElements;
45  
46      /**
47       * Constructor.
48       * @param date epoch
49       * @param elements averaged orbital elements
50       * @param frame reference frame
51       * @param harmonicsProvider spherical harmonics provider
52       */
53      public BrouwerLyddaneOrbitalState(final AbsoluteDate date,
54                                        final AveragedKeplerianWithMeanAngle elements,
55                                        final Frame frame,
56                                        final UnnormalizedSphericalHarmonicsProvider harmonicsProvider) {
57          super(date, frame, harmonicsProvider);
58          this.averagedElements = elements;
59      }
60  
61      /** {@inheritDoc} */
62      @Override
63      public OrbitType getOrbitType() {
64          return OrbitType.KEPLERIAN;
65      }
66  
67      /** {@inheritDoc} */
68      @Override
69      public PositionAngleType getPositionAngleType() {
70          return PositionAngleType.MEAN;
71      }
72  
73      /** {@inheritDoc} */
74      @Override
75      public AveragedKeplerianWithMeanAngle getAveragedElements() {
76          return averagedElements;
77      }
78  
79      /** {@inheritDoc} */
80      @Override
81      public Orbit toOsculatingOrbit() {
82          final BrouwerLyddanePropagator propagator = createPropagator();
83          return propagator.propagateOrbit(getDate());
84      }
85  
86      /**
87       * Create Brouwer-Lyddane propagator.
88       * @return propagator using relevant theory
89       */
90      private BrouwerLyddanePropagator createPropagator() {
91          final KeplerianOrbit orekitOrbit = createOrekitOrbit();
92          return new BrouwerLyddanePropagator(orekitOrbit, getHarmonicsProvider(),
93                  PropagationType.MEAN, M2);
94      }
95  
96      /**
97       * Create Keplerian orbit representation of averaged state.
98       * @return Keplerian orbit
99       */
100     private KeplerianOrbit createOrekitOrbit() {
101         return new KeplerianOrbit(averagedElements.getAveragedSemiMajorAxis(),
102                 averagedElements.getAveragedEccentricity(), averagedElements.getAveragedInclination(),
103                 averagedElements.getAveragedPerigeeArgument(),
104                 averagedElements.getAveragedRightAscensionOfTheAscendingNode(),
105                 averagedElements.getAveragedMeanAnomaly(), getPositionAngleType(), getFrame(),
106                 getDate(), getMu());
107     }
108 
109 }