1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.events;
18
19 import org.hipparchus.util.FastMath;
20 import org.junit.jupiter.api.Assertions;
21 import org.junit.jupiter.api.Test;
22 import org.mockito.Mockito;
23 import org.orekit.Utils;
24 import org.orekit.bodies.CelestialBodyFactory;
25 import org.orekit.frames.Frame;
26 import org.orekit.frames.FramesFactory;
27 import org.orekit.orbits.KeplerianOrbit;
28 import org.orekit.orbits.Orbit;
29 import org.orekit.orbits.PositionAngleType;
30 import org.orekit.propagation.Propagator;
31 import org.orekit.propagation.SpacecraftState;
32 import org.orekit.propagation.analytical.KeplerianPropagator;
33 import org.orekit.propagation.events.handlers.StopOnEvent;
34 import org.orekit.time.AbsoluteDate;
35 import org.orekit.utils.PVCoordinatesProvider;
36
37 public class ExtremumApproachDetectorTest {
38
39
40
41
42 @Test
43 public void testStopPropagationClosestApproachByDefault() {
44
45
46 Utils.setDataRoot("regular-data");
47
48
49 final AbsoluteDate initialDate = new AbsoluteDate();
50 final Frame frame = FramesFactory.getEME2000();
51 final double mu = 398600e9;
52
53 final double rp = (6378 + 400) * 1000;
54 final double ra = (6378 + 800) * 1000;
55
56 final double a = (ra + rp) / 2;
57 final double e = (ra - rp) / (ra + rp);
58 final double i = 0;
59 final double pa = 0;
60 final double raan = 0;
61 final double anomaly = FastMath.toRadians(0);
62 final Orbit orbit =
63 new KeplerianOrbit(a, e, i, pa, raan, anomaly, PositionAngleType.TRUE, frame, initialDate, mu);
64
65
66 final PVCoordinatesProvider earthPVProvider = CelestialBodyFactory.getEarth();
67
68
69 final ExtremumApproachDetector detector = new ExtremumApproachDetector(earthPVProvider);
70
71
72 final Propagator propagator = new KeplerianPropagator(orbit);
73 propagator.addEventDetector(detector);
74
75
76 final SpacecraftState stateAtEvent =
77 propagator.propagate(initialDate.shiftedBy(orbit.getKeplerianPeriod() * 2));
78
79
80 Assertions.assertEquals(stateAtEvent.getDate().durationFrom(initialDate),orbit.getKeplerianPeriod(),1e-9);
81
82 }
83
84
85
86
87 @Test
88 public void testStopPropagationFarthestApproachWithHandler() {
89
90
91
92 Utils.setDataRoot("regular-data");
93
94
95 final AbsoluteDate initialDate = new AbsoluteDate();
96 final Frame frame = FramesFactory.getEME2000();
97 final double mu = 398600e9;
98
99 final double rp = (6378 + 400) * 1000;
100 final double ra = (6378 + 800) * 1000;
101
102 final double a = (ra + rp) / 2;
103 final double e = (ra - rp) / (ra + rp);
104 final double i = 0;
105 final double pa = 0;
106 final double raan = 0;
107 final double anomaly = FastMath.toRadians(0);
108 final Orbit orbit =
109 new KeplerianOrbit(a, e, i, pa, raan, anomaly, PositionAngleType.TRUE, frame, initialDate, mu);
110
111
112 final PVCoordinatesProvider earthPVProvider = CelestialBodyFactory.getEarth();
113
114
115 final ExtremumApproachDetector detector =
116 new ExtremumApproachDetector(earthPVProvider).withHandler(new StopOnEvent());
117
118
119 final Propagator propagator = new KeplerianPropagator(orbit);
120 propagator.addEventDetector(detector);
121
122
123 final SpacecraftState stateAtEvent =
124 propagator.propagate(initialDate.shiftedBy(orbit.getKeplerianPeriod() * 2));
125
126
127 Assertions.assertEquals(stateAtEvent.getDate().durationFrom(initialDate),orbit.getKeplerianPeriod() / 2,1e-7);
128
129 }
130
131 @Test
132 void testSecondaryPVCoordinatesProviderGetter() {
133
134 final PVCoordinatesProvider secondaryPVProvider = Mockito.mock(PVCoordinatesProvider.class);
135 final ExtremumApproachDetector extremumApproachDetector = new ExtremumApproachDetector(secondaryPVProvider);
136
137
138 final PVCoordinatesProvider returnedSecondaryPVProvider = extremumApproachDetector.getSecondaryPVProvider();
139
140
141 Assertions.assertEquals(secondaryPVProvider, returnedSecondaryPVProvider);
142 }
143 }