1   /* Copyright 2002-2025 Airbus Defence and Space
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    * Airbus Defence and Space 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.analytical.intelsat;
18  
19  import org.hipparchus.util.FastMath;
20  import org.hipparchus.util.MathUtils;
21  import org.junit.jupiter.api.Assertions;
22  import org.junit.jupiter.api.BeforeAll;
23  import org.junit.jupiter.api.Test;
24  import org.orekit.Utils;
25  import org.orekit.errors.OrekitException;
26  import org.orekit.errors.OrekitMessages;
27  import org.orekit.frames.FramesFactory;
28  import org.orekit.orbits.KeplerianOrbit;
29  import org.orekit.orbits.OrbitType;
30  import org.orekit.orbits.PositionAngleType;
31  import org.orekit.time.AbsoluteDate;
32  import org.orekit.time.TimeScalesFactory;
33  import org.orekit.utils.IERSConventions;
34  
35  class IntelsatElevenElementsPropagatorTest {
36  
37      private static IntelsatElevenElements ELEMENTS;
38  
39      @Test
40      public void testCannotResetIntermediateState() {
41          IntelsatElevenElementsPropagator propagator = new IntelsatElevenElementsPropagator(ELEMENTS);
42          try {
43              propagator.resetIntermediateState(null, false);
44          }
45          catch (OrekitException oe) {
46              Assertions.assertEquals(oe.getSpecifier(), OrekitMessages.NON_RESETABLE_STATE);
47          }
48      }
49  
50      @Test
51      public void testCannotResetInitialState() {
52          IntelsatElevenElementsPropagator propagator = new IntelsatElevenElementsPropagator(ELEMENTS);
53          try {
54              propagator.resetInitialState(null);
55          }
56          catch (OrekitException oe) {
57              Assertions.assertEquals(oe.getSpecifier(), OrekitMessages.NON_RESETABLE_STATE);
58          }
59      }
60  
61      @Test
62      public void testPropagation() {
63          // Reference: Intelsat calculator for spacecraft 4521 (used 2023/12/04)
64          // https://www.intelsat.com/resources/tools/
65          IntelsatElevenElementsPropagator propagator = new IntelsatElevenElementsPropagator(ELEMENTS);
66          double referenceLongitude170Hours = 301.9191;
67          double referenceLatitude170Hours = 0.0257;
68          double tolerance = 0.0001;
69          propagator.propagateInEcef(ELEMENTS.getEpoch().shiftedBy(170 * 3600.0));
70          Assertions.assertEquals(referenceLongitude170Hours, propagator.getEastLongitudeDegrees().getValue(), tolerance);
71          Assertions.assertEquals(referenceLatitude170Hours, propagator.getGeocentricLatitudeDegrees().getValue(), tolerance);
72          Assertions.assertNotNull(propagator.getIntelsatElevenElements());
73      }
74  
75      @Test
76      public void testOrbitElementsAtT0() {
77          // Reference use of the Intelsat's 11 elements propagator developed in STK
78          IntelsatElevenElementsPropagator propagator = new IntelsatElevenElementsPropagator(ELEMENTS, FramesFactory.getTOD(IERSConventions.IERS_2010, false),
79                                                                                             FramesFactory.getITRF(IERSConventions.IERS_2010, false));
80          Assertions.assertNotNull(propagator.getIntelsatElevenElements());
81          KeplerianOrbit orbit = (KeplerianOrbit) OrbitType.KEPLERIAN.convertType(propagator.propagateOrbit(ELEMENTS.getEpoch()));
82          Assertions.assertEquals(302.0355, propagator.getEastLongitudeDegrees().getValue(), 0.0001);
83          Assertions.assertEquals(0.0378, propagator.getGeocentricLatitudeDegrees().getValue(), 0.0001);
84          Assertions.assertEquals(-1.529465e-6, propagator.getEastLongitudeDegrees().getFirstDerivative(), 1.0e-12);
85          Assertions.assertEquals(-1.01044e-7, propagator.getGeocentricLatitudeDegrees().getFirstDerivative(), 1.0e-12);
86          Assertions.assertEquals(42172456.005, propagator.getOrbitRadius().getValue(), 1.0e-3);
87          Assertions.assertEquals(0.797, propagator.getOrbitRadius().getFirstDerivative(), 1.0e-3);
88          Assertions.assertEquals(42166413.453, orbit.getA(), 4.0e-2);
89          Assertions.assertEquals(0.000296, orbit.getE(), 1.0e-6);
90          Assertions.assertEquals(0.037825, FastMath.toDegrees(orbit.getI()), 1.0e-6);
91          Assertions.assertEquals(282.488, FastMath.toDegrees(MathUtils.normalizeAngle(orbit.getRightAscensionOfAscendingNode(), FastMath.PI)), 4.0e-3);
92          Assertions.assertEquals(333.151, FastMath.toDegrees(MathUtils.normalizeAngle(orbit.getPerigeeArgument(), FastMath.PI)), 4.0e-3);
93          Assertions.assertEquals(118.919, FastMath.toDegrees(MathUtils.normalizeAngle(orbit.getAnomaly(PositionAngleType.MEAN), FastMath.PI)), 1.0e-3);
94      }
95  
96      @BeforeAll
97      public static void initialize() {
98          Utils.setDataRoot("regular-data");
99          // Reference elements from Intelsat website (spacecraft 4521)
100         ELEMENTS = new IntelsatElevenElements(new AbsoluteDate("2023-12-04T00:00:00.000", TimeScalesFactory.getUTC()), 302.0058, -0.0096, -0.000629, 0.0297, -0.0004, -0.0194,
101                                               0.0007, 0.0378, -0.0018, -0.0011, 0.0015);
102     }
103 }