1   /* Copyright 2002-2025 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.files.general;
18  
19  import java.lang.reflect.InvocationTargetException;
20  import java.lang.reflect.Method;
21  import java.util.Arrays;
22  import java.util.List;
23  
24  import org.hamcrest.CoreMatchers;
25  import org.hamcrest.MatcherAssert;
26  import org.hipparchus.geometry.euclidean.threed.Vector3D;
27  import org.junit.jupiter.api.Assertions;
28  import org.junit.jupiter.api.BeforeEach;
29  import org.junit.jupiter.api.Test;
30  import org.orekit.OrekitMatchers;
31  import org.orekit.Utils;
32  import org.orekit.errors.OrekitException;
33  import org.orekit.errors.OrekitMessages;
34  import org.orekit.files.general.EphemerisFile.EphemerisSegment;
35  import org.orekit.frames.Frame;
36  import org.orekit.frames.FramesFactory;
37  import org.orekit.propagation.BoundedPropagator;
38  import org.orekit.propagation.SpacecraftState;
39  import org.orekit.time.AbsoluteDate;
40  import org.orekit.utils.CartesianDerivativesFilter;
41  import org.orekit.utils.Constants;
42  import org.orekit.utils.PVCoordinates;
43  import org.orekit.utils.TimeStampedPVCoordinates;
44  
45  /**
46   * Unit tests for {@link EphemerisSegmentPropagator}.
47   *
48   * @author Evan Ward
49   */
50  public class EphemerisSegmentPropagatorTest {
51  
52      /** Set Orekit data. */
53      @BeforeEach
54      public void setUp() {
55          Utils.setDataRoot("regular-data");
56      }
57  
58  
59      /**
60       * Check {@link EphemerisSegmentPropagator} and {@link EphemerisSegment#getPropagator()}.
61       *
62       * @throws Exception on error.
63       */
64      @Test
65      public void testPropagator() throws Exception {
66          // setup
67          AbsoluteDate start = AbsoluteDate.J2000_EPOCH, end = start.shiftedBy(60);
68          Frame frame = FramesFactory.getEME2000();
69          List<TimeStampedPVCoordinates> coordinates = Arrays.asList(
70                  new TimeStampedPVCoordinates(start, new Vector3D(6778137, 0, 0), new Vector3D(0, 7.5e3, 0)),
71                  new TimeStampedPVCoordinates(start.shiftedBy(30), new Vector3D(6778137 + 1, 0, 0), new Vector3D(0, 7.5e3, 0)),
72                  new TimeStampedPVCoordinates(end, new Vector3D(6778137 + 3, 0, 0), new Vector3D(0, 7.5e3, 0)));
73          EphemerisSegment<TimeStampedPVCoordinates> ephemeris = new EphemerisSegment<TimeStampedPVCoordinates>() {
74              @Override
75              public double getMu() {
76                  return Constants.EGM96_EARTH_MU;
77              }
78  
79              @Override
80              public Frame getFrame() {
81                  return frame;
82              }
83  
84              @Override
85              public int getInterpolationSamples() {
86                  return 2;
87              }
88  
89              @Override
90              public CartesianDerivativesFilter getAvailableDerivatives() {
91                  return CartesianDerivativesFilter.USE_P;
92              }
93  
94              @Override
95              public List<TimeStampedPVCoordinates> getCoordinates() {
96                  return coordinates;
97              }
98  
99              @Override
100             public AbsoluteDate getStart() {
101                 return start;
102             }
103 
104             @Override
105             public AbsoluteDate getStop() {
106                 return end;
107             }
108         };
109 
110         // action
111         BoundedPropagator propagator = ephemeris.getPropagator();
112 
113         //verify
114         MatcherAssert.assertThat(propagator.getMinDate(), CoreMatchers.is(start));
115         MatcherAssert.assertThat(propagator.getMaxDate(), CoreMatchers.is(end));
116         MatcherAssert.assertThat(propagator.getFrame(), CoreMatchers.is(frame));
117         int ulps = 0;
118         PVCoordinates expected = new PVCoordinates(
119                 new Vector3D(6778137, 0, 0),
120                 new Vector3D(1.0 / 30, 0, 0));
121         MatcherAssert.assertThat(
122                 propagator.propagate(start).getPVCoordinates(),
123                 OrekitMatchers.pvCloseTo(expected, ulps));
124         MatcherAssert.assertThat(
125                 propagator.getPVCoordinates(start, frame),
126                 OrekitMatchers.pvCloseTo(expected, ulps));
127         expected = new PVCoordinates(
128                 new Vector3D(6778137 + 2, 0, 0),
129                 new Vector3D(2 / 30.0, 0, 0));
130         MatcherAssert.assertThat(
131                 propagator.propagate(start.shiftedBy(45)).getPVCoordinates(),
132                 OrekitMatchers.pvCloseTo(expected, ulps));
133         MatcherAssert.assertThat(
134                 propagator.getPVCoordinates(start.shiftedBy(45), frame),
135                 OrekitMatchers.pvCloseTo(expected, ulps));
136         expected = new PVCoordinates(
137                 new Vector3D(6778137 + 3, 0, 0),
138                 new Vector3D(2 / 30.0, 0, 0));
139         MatcherAssert.assertThat(
140                 propagator.propagate(end).getPVCoordinates(),
141                 OrekitMatchers.pvCloseTo(expected, ulps));
142         MatcherAssert.assertThat(
143                 propagator.getPVCoordinates(end, frame),
144                 OrekitMatchers.pvCloseTo(expected, ulps));
145         // check reset state is prohibited
146         SpacecraftState ic = propagator.propagate(start);
147         try {
148             propagator.resetInitialState(ic);
149             Assertions.fail("Expected Exception");
150         } catch (OrekitException oe) {
151             Assertions.assertEquals(OrekitMessages.NON_RESETABLE_STATE, oe.getSpecifier());
152         }
153         try {
154             Method reset = EphemerisSegmentPropagator.class.getDeclaredMethod("resetIntermediateState",
155                                                                               SpacecraftState.class,
156                                                                               Boolean.TYPE);
157             reset.setAccessible(true);
158             reset.invoke(propagator, ic, true);
159             Assertions.fail("Expected Exception");
160         } catch (InvocationTargetException ite) {
161             OrekitException oe = (OrekitException) ite.getCause();
162             Assertions.assertEquals(OrekitMessages.NON_RESETABLE_STATE, oe.getSpecifier());
163         }
164 
165     }
166 
167 }