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
29
30 @Test
31 public void testStopPropagationClosestApproachByDefault() {
32
33
34 Utils.setDataRoot("regular-data");
35
36
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);
41
42 final Binary64 rp = new Binary64((6378 + 400) * 1000);
43 final Binary64 ra = new Binary64((6378 + 800) * 1000);
44
45 final Binary64 a = ra.add(rp).divide(2);
46 final Binary64 e = ra.subtract(rp).divide(ra.add(rp));
47 final Binary64 i = new Binary64(0);
48 final Binary64 pa = new Binary64(0);
49 final Binary64 raan = new Binary64(0);
50 final Binary64 anomaly = new Binary64(0);
51 final FieldOrbit<Binary64> orbit =
52 new FieldKeplerianOrbit<>(a, e, i, pa, raan, anomaly, PositionAngleType.TRUE, frame, initialDate, mu);
53
54
55 final PVCoordinatesProvider earthPVProvider = CelestialBodyFactory.getEarth();
56
57
58 final FieldExtremumApproachDetector<Binary64> detector = new FieldExtremumApproachDetector<>(field, earthPVProvider);
59
60
61 final FieldPropagator<Binary64> propagator = new FieldKeplerianPropagator<>(orbit);
62 propagator.addEventDetector(detector);
63
64
65 final FieldSpacecraftState<Binary64> stateAtEvent =
66 propagator.propagate(initialDate.shiftedBy(orbit.getKeplerianPeriod().multiply(2.)));
67
68
69 Assertions.assertEquals(stateAtEvent.getDate().durationFrom(initialDate).getReal(),
70 orbit.getKeplerianPeriod().getReal(), 1e-9);
71
72 }
73
74
75
76
77 @Test
78 public void testStopPropagationFarthestApproachWithHandler() {
79
80
81
82 Utils.setDataRoot("regular-data");
83
84
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);
89
90 final Binary64 rp = new Binary64(6378 + 400 * 1000);
91 final Binary64 ra = new Binary64((6378 + 800) * 1000);
92
93 final Binary64 a = ra.add(rp).divide(2);
94 final Binary64 e = ra.subtract(rp).divide(ra.add(rp));
95 final Binary64 i = new Binary64(0.);
96 final Binary64 pa = new Binary64(0);
97 final Binary64 raan = new Binary64(0);
98 final Binary64 anomaly = new Binary64(0);
99 final FieldOrbit<Binary64> orbit =
100 new FieldKeplerianOrbit<>(a, e, i, pa, raan, anomaly, PositionAngleType.TRUE, frame, initialDate, mu);
101
102
103 final PVCoordinatesProvider earthPVProvider = CelestialBodyFactory.getEarth();
104
105
106 final FieldExtremumApproachDetector<Binary64> detector =
107 new FieldExtremumApproachDetector<>(field, earthPVProvider).withHandler(new FieldStopOnEvent<>());
108
109
110 final FieldPropagator<Binary64> propagator = new FieldKeplerianPropagator<>(orbit);
111 propagator.addEventDetector(detector);
112
113
114 final FieldSpacecraftState<Binary64> stateAtEvent =
115 propagator.propagate(initialDate.shiftedBy(orbit.getKeplerianPeriod().multiply(2)));
116
117
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
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
134 final FieldPVCoordinatesProvider<Binary64> returnedSecondaryPVProvider =
135 extremumApproachDetector.getSecondaryPVProvider();
136
137
138 Assertions.assertEquals(secondaryPVProvider, returnedSecondaryPVProvider);
139 }
140
141 }