1   package org.orekit.propagation.events;
2   
3   import org.hipparchus.Field;
4   import org.hipparchus.util.Binary64;
5   import org.hipparchus.util.Binary64Field;
6   import org.junit.jupiter.api.Assertions;
7   import org.junit.jupiter.api.Test;
8   import org.orekit.Utils;
9   import org.orekit.bodies.CelestialBodyFactory;
10  import org.orekit.frames.Frame;
11  import org.orekit.frames.FramesFactory;
12  import org.orekit.orbits.FieldKeplerianOrbit;
13  import org.orekit.orbits.FieldOrbit;
14  import org.orekit.orbits.PositionAngleType;
15  import org.orekit.propagation.FieldPropagator;
16  import org.orekit.propagation.FieldSpacecraftState;
17  import org.orekit.propagation.analytical.FieldKeplerianPropagator;
18  import org.orekit.propagation.events.handlers.FieldStopOnEvent;
19  import org.orekit.time.AbsoluteDate;
20  import org.orekit.time.FieldAbsoluteDate;
21  import org.orekit.utils.FieldPVCoordinatesProvider;
22  import org.orekit.utils.PVCoordinatesProvider;
23  
24  import static org.mockito.Mockito.mock;
25  
26  class FieldExtremumApproachDetectorTest {
27      /**
28       * Test the detector on a keplerian orbit and detect extremum approach with Earth.
29       */
30      @Test
31      public void testStopPropagationClosestApproachByDefault() {
32          // Given
33          // Loading Orekit data
34          Utils.setDataRoot("regular-data");
35  
36          // Generating orbit
37          final Field<Binary64>             field       = Binary64Field.getInstance();
38          final FieldAbsoluteDate<Binary64> initialDate = new FieldAbsoluteDate<>(field, new AbsoluteDate());
39          final Frame                       frame       = FramesFactory.getEME2000();
40          final Binary64                    mu          = new Binary64(398600e9); //m**3/s**2
41  
42          final Binary64 rp = new Binary64((6378 + 400) * 1000); //m
43          final Binary64 ra = new Binary64((6378 + 800) * 1000); //m
44  
45          final Binary64 a       = ra.add(rp).divide(2); //m
46          final Binary64 e       = ra.subtract(rp).divide(ra.add(rp)); //m
47          final Binary64 i       = new Binary64(0); //rad
48          final Binary64 pa      = new Binary64(0); //rad
49          final Binary64 raan    = new Binary64(0); //rad
50          final Binary64 anomaly = new Binary64(0); //rad
51          final FieldOrbit<Binary64> orbit =
52                  new FieldKeplerianOrbit<>(a, e, i, pa, raan, anomaly, PositionAngleType.TRUE, frame, initialDate, mu);
53  
54          // Will detect extremum approaches with Earth
55          final PVCoordinatesProvider earthPVProvider = CelestialBodyFactory.getEarth();
56  
57          // Initializing detector
58          final FieldExtremumApproachDetector<Binary64> detector = new FieldExtremumApproachDetector<>(field, earthPVProvider);
59  
60          // Initializing propagator
61          final FieldPropagator<Binary64> propagator = new FieldKeplerianPropagator<>(orbit);
62          propagator.addEventDetector(detector);
63  
64          // When
65          final FieldSpacecraftState<Binary64> stateAtEvent =
66                  propagator.propagate(initialDate.shiftedBy(orbit.getKeplerianPeriod().multiply(2.)));
67  
68          // Then
69          Assertions.assertEquals(stateAtEvent.getDate().durationFrom(initialDate).getReal(),
70                                  orbit.getKeplerianPeriod().getReal(), 1e-9);
71  
72      }
73  
74      /**
75       * Test the detector on a keplerian orbit and detect extremum approach with Earth.
76       */
77      @Test
78      public void testStopPropagationFarthestApproachWithHandler() {
79  
80          // Given
81          // Loading Orekit data
82          Utils.setDataRoot("regular-data");
83  
84          // Generating orbit
85          final Field<Binary64>             field       = Binary64Field.getInstance();
86          final FieldAbsoluteDate<Binary64> initialDate = new FieldAbsoluteDate<>(field, new AbsoluteDate());
87          final Frame                       frame       = FramesFactory.getEME2000();
88          final Binary64                    mu          = new Binary64(398600e9); //m**3/s**2
89  
90          final Binary64 rp = new Binary64(6378 + 400 * 1000); //m
91          final Binary64 ra = new Binary64((6378 + 800) * 1000); //m
92  
93          final Binary64 a       = ra.add(rp).divide(2); //m
94          final Binary64 e       = ra.subtract(rp).divide(ra.add(rp)); //m
95          final Binary64 i       = new Binary64(0.); //rad
96          final Binary64 pa      = new Binary64(0); //rad
97          final Binary64 raan    = new Binary64(0); //rad
98          final Binary64 anomaly = new Binary64(0); //rad
99          final FieldOrbit<Binary64> orbit =
100                 new FieldKeplerianOrbit<>(a, e, i, pa, raan, anomaly, PositionAngleType.TRUE, frame, initialDate, mu);
101 
102         // Will detect extremum approaches with Earth
103         final PVCoordinatesProvider earthPVProvider = CelestialBodyFactory.getEarth();
104 
105         // Initializing detector with custom handler
106         final FieldExtremumApproachDetector<Binary64> detector =
107                 new FieldExtremumApproachDetector<>(field, earthPVProvider).withHandler(new FieldStopOnEvent<>());
108 
109         // Initializing propagator
110         final FieldPropagator<Binary64> propagator = new FieldKeplerianPropagator<>(orbit);
111         propagator.addEventDetector(detector);
112 
113         // When
114         final FieldSpacecraftState<Binary64> stateAtEvent =
115                 propagator.propagate(initialDate.shiftedBy(orbit.getKeplerianPeriod().multiply(2)));
116 
117         // Then
118         Assertions.assertEquals(stateAtEvent.getDate().durationFrom(initialDate).getReal(),
119                                 orbit.getKeplerianPeriod().divide(2).getReal(), 1e-7);
120 
121     }
122 
123     @Test
124     @SuppressWarnings("unchecked")
125     void testSecondaryPVCoordinatesProviderGetter() {
126         // Given
127         final Field<Binary64>                      field               = Binary64Field.getInstance();
128         final FieldPVCoordinatesProvider<Binary64> secondaryPVProvider = mock(FieldPVCoordinatesProvider.class);
129 
130         final FieldExtremumApproachDetector<Binary64> extremumApproachDetector =
131                 new FieldExtremumApproachDetector<>(field, secondaryPVProvider);
132 
133         // When
134         final FieldPVCoordinatesProvider<Binary64> returnedSecondaryPVProvider =
135                 extremumApproachDetector.getSecondaryPVProvider();
136 
137         // Then
138         Assertions.assertEquals(secondaryPVProvider, returnedSecondaryPVProvider);
139     }
140 
141 }