1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.analytical;
18
19 import org.hamcrest.CoreMatchers;
20 import org.hamcrest.MatcherAssert;
21 import org.hipparchus.geometry.euclidean.threed.Vector3D;
22 import org.junit.jupiter.api.Assertions;
23 import org.junit.jupiter.api.BeforeEach;
24 import org.junit.jupiter.api.Test;
25 import org.mockito.Mockito;
26 import org.orekit.OrekitMatchers;
27 import org.orekit.Utils;
28 import org.orekit.attitudes.FrameAlignedProvider;
29 import org.orekit.attitudes.LofOffset;
30 import org.orekit.errors.OrekitException;
31 import org.orekit.frames.Frame;
32 import org.orekit.frames.FramesFactory;
33 import org.orekit.frames.LOFType;
34 import org.orekit.orbits.KeplerianOrbit;
35 import org.orekit.orbits.Orbit;
36 import org.orekit.orbits.PositionAngleType;
37 import org.orekit.propagation.BoundedPropagator;
38 import org.orekit.propagation.EphemerisGenerator;
39 import org.orekit.propagation.SpacecraftState;
40 import org.orekit.time.AbsoluteDate;
41 import org.orekit.utils.Constants;
42 import org.orekit.utils.TimeSpanMap;
43
44 import java.util.ArrayList;
45 import java.util.Arrays;
46 import java.util.Collections;
47 import java.util.List;
48 import java.util.NavigableMap;
49 import java.util.TreeMap;
50
51
52
53
54
55
56 public class AggregateBoundedPropagatorTest {
57
58 public static final Frame frame = FramesFactory.getGCRF();
59
60
61 @BeforeEach
62 public void setUp() {
63 Utils.setDataRoot("regular-data");
64 }
65
66
67
68
69
70 @Test
71 public void testAdjacent() {
72
73 AbsoluteDate date = AbsoluteDate.CCSDS_EPOCH;
74 BoundedPropagator p1 = createPropagator(date, date.shiftedBy(10), 0);
75 BoundedPropagator p2 = createPropagator(date.shiftedBy(10), date.shiftedBy(20), 1);
76
77
78 AggregateBoundedPropagator actual = new AggregateBoundedPropagator(Arrays.asList(p1, p2));
79
80
81 int ulps = 0;
82 MatcherAssert.assertThat(actual.getFrame(), CoreMatchers.is(p1.getFrame()));
83 MatcherAssert.assertThat(actual.getMinDate(), CoreMatchers.is(date));
84 MatcherAssert.assertThat(actual.getMaxDate(), CoreMatchers.is(date.shiftedBy(20)));
85 MatcherAssert.assertThat(
86 actual.propagate(date).getPVCoordinates(),
87 OrekitMatchers.pvCloseTo(p1.propagate(date).getPVCoordinates(), ulps));
88 MatcherAssert.assertThat(
89 actual.propagate(date.shiftedBy(5)).getPVCoordinates(),
90 OrekitMatchers.pvCloseTo(p1.propagate(date.shiftedBy(5)).getPVCoordinates(), ulps));
91 MatcherAssert.assertThat(
92 actual.propagate(date.shiftedBy(10)).getPVCoordinates(),
93 OrekitMatchers.pvCloseTo(p2.propagate(date.shiftedBy(10)).getPVCoordinates(), ulps));
94 MatcherAssert.assertThat(
95 actual.propagate(date.shiftedBy(15)).getPVCoordinates(),
96 OrekitMatchers.pvCloseTo(p2.propagate(date.shiftedBy(15)).getPVCoordinates(), ulps));
97 MatcherAssert.assertThat(
98 actual.propagate(date.shiftedBy(20)).getPVCoordinates(),
99 OrekitMatchers.pvCloseTo(p2.propagate(date.shiftedBy(20)).getPVCoordinates(), ulps));
100
101 for (TimeSpanMap.Span<BoundedPropagator> span = actual.getPropagatorsMap().getFirstNonNullSpan();
102 span != null;
103 span = span.next()) {
104 Assertions.assertEquals(span.getStart(), span.getData().getMinDate());
105 }
106
107 }
108
109
110
111
112
113 @Test
114 public void testOverlap() {
115
116 AbsoluteDate date = AbsoluteDate.CCSDS_EPOCH;
117 BoundedPropagator p1 = createPropagator(date, date.shiftedBy(25), 0);
118 BoundedPropagator p2 = createPropagator(date.shiftedBy(10), date.shiftedBy(20), 1);
119
120
121 BoundedPropagator actual = new AggregateBoundedPropagator(Arrays.asList(p1, p2));
122
123
124 int ulps = 0;
125 MatcherAssert.assertThat(actual.getFrame(), CoreMatchers.is(p1.getFrame()));
126 MatcherAssert.assertThat(actual.getMinDate(), CoreMatchers.is(date));
127 MatcherAssert.assertThat(actual.getMaxDate(), CoreMatchers.is(date.shiftedBy(20)));
128 MatcherAssert.assertThat(
129 actual.propagate(date).getPVCoordinates(),
130 OrekitMatchers.pvCloseTo(p1.propagate(date).getPVCoordinates(), ulps));
131 MatcherAssert.assertThat(
132 actual.propagate(date.shiftedBy(5)).getPVCoordinates(),
133 OrekitMatchers.pvCloseTo(p1.propagate(date.shiftedBy(5)).getPVCoordinates(), ulps));
134 MatcherAssert.assertThat(
135 actual.propagate(date.shiftedBy(10)).getPVCoordinates(),
136 OrekitMatchers.pvCloseTo(p2.propagate(date.shiftedBy(10)).getPVCoordinates(), ulps));
137 MatcherAssert.assertThat(
138 actual.propagate(date.shiftedBy(15)).getPVCoordinates(),
139 OrekitMatchers.pvCloseTo(p2.propagate(date.shiftedBy(15)).getPVCoordinates(), ulps));
140 MatcherAssert.assertThat(
141 actual.propagate(date.shiftedBy(20)).getPVCoordinates(),
142 OrekitMatchers.pvCloseTo(p2.propagate(date.shiftedBy(20)).getPVCoordinates(), ulps));
143 }
144
145
146
147
148
149 @Test
150 public void testGap() {
151
152 AbsoluteDate date = AbsoluteDate.CCSDS_EPOCH;
153 BoundedPropagator p1 = createPropagator(date, date.shiftedBy(1), 0);
154 BoundedPropagator p2 = createPropagator(date.shiftedBy(10), date.shiftedBy(20), 1);
155
156
157 BoundedPropagator actual = new AggregateBoundedPropagator(Arrays.asList(p1, p2));
158
159
160 int ulps = 0;
161 MatcherAssert.assertThat(actual.getFrame(), CoreMatchers.is(p1.getFrame()));
162 MatcherAssert.assertThat(actual.getMinDate(), CoreMatchers.is(date));
163 MatcherAssert.assertThat(actual.getMaxDate(), CoreMatchers.is(date.shiftedBy(20)));
164 MatcherAssert.assertThat(
165 actual.propagate(date).getPVCoordinates(),
166 OrekitMatchers.pvCloseTo(p1.propagate(date).getPVCoordinates(), ulps));
167 MatcherAssert.assertThat(
168 actual.propagate(date.shiftedBy(10)).getPVCoordinates(),
169 OrekitMatchers.pvCloseTo(p2.propagate(date.shiftedBy(10)).getPVCoordinates(), ulps));
170 MatcherAssert.assertThat(
171 actual.propagate(date.shiftedBy(15)).getPVCoordinates(),
172 OrekitMatchers.pvCloseTo(p2.propagate(date.shiftedBy(15)).getPVCoordinates(), ulps));
173 MatcherAssert.assertThat(
174 actual.propagate(date.shiftedBy(20)).getPVCoordinates(),
175 OrekitMatchers.pvCloseTo(p2.propagate(date.shiftedBy(20)).getPVCoordinates(), ulps));
176 try {
177
178 MatcherAssert.assertThat(
179 actual.propagate(date.shiftedBy(5)).getPVCoordinates(),
180 OrekitMatchers.pvCloseTo(p1.propagate(date.shiftedBy(5)).getPVCoordinates(), ulps));
181 } catch (OrekitException e) {
182
183 }
184 }
185
186 @Test
187 public void testOutsideBounds() {
188
189 AbsoluteDate date = AbsoluteDate.CCSDS_EPOCH;
190 BoundedPropagator p1 = createPropagator(date, date.shiftedBy(10), 0);
191 BoundedPropagator p2 = createPropagator(date.shiftedBy(10), date.shiftedBy(20), 1);
192
193
194 BoundedPropagator actual = new AggregateBoundedPropagator(Arrays.asList(p1, p2));
195
196
197 int ulps = 0;
198
199 try {
200
201 MatcherAssert.assertThat(
202 actual.propagate(date.shiftedBy(-60)).getPVCoordinates(),
203 OrekitMatchers.pvCloseTo(p1.propagate(date.shiftedBy(-60)).getPVCoordinates(), ulps));
204 } catch (OrekitException e) {
205
206 }
207 try {
208
209 MatcherAssert.assertThat(
210 actual.getPVCoordinates(date.shiftedBy(-60), frame),
211 OrekitMatchers.pvCloseTo(p1.propagate(date.shiftedBy(-60)).getPVCoordinates(), ulps));
212 } catch (OrekitException e) {
213
214 }
215
216 try {
217
218 MatcherAssert.assertThat(
219 actual.propagate(date.shiftedBy(60)).getPVCoordinates(),
220 OrekitMatchers.pvCloseTo(p2.propagate(date.shiftedBy(60)).getPVCoordinates(), ulps));
221 } catch (OrekitException e) {
222
223 }
224 try {
225
226 MatcherAssert.assertThat(
227 actual.getPVCoordinates(date.shiftedBy(60), frame),
228 OrekitMatchers.pvCloseTo(p2.propagate(date.shiftedBy(60)).getPVCoordinates(), ulps));
229 } catch (OrekitException e) {
230
231 }
232
233 }
234
235
236
237
238 @Test
239 public void testResetState() {
240
241 AbsoluteDate date = AbsoluteDate.CCSDS_EPOCH;
242 BoundedPropagator p1 = createPropagator(date, date.shiftedBy(10), 0);
243 BoundedPropagator p2 = createPropagator(date.shiftedBy(10), date.shiftedBy(20), 1);
244 SpacecraftState ic = p2.getInitialState();
245
246
247 BoundedPropagator actual = new AggregateBoundedPropagator(Arrays.asList(p1, p2));
248
249
250 try {
251 actual.resetInitialState(ic);
252 Assertions.fail("Expected Exception");
253 } catch (OrekitException e) {
254
255 }
256 }
257
258
259
260
261
262 @Test
263 public void testEmptyList() {
264
265 try {
266 new AggregateBoundedPropagator(Collections.emptyList());
267 Assertions.fail("Expected Exception");
268 } catch (OrekitException e) {
269
270 }
271 }
272
273
274
275
276
277
278
279 @Test
280 public void testAggregateBoundedPropagator() {
281
282 NavigableMap<AbsoluteDate, BoundedPropagator> map = new TreeMap<>();
283 AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
284 AbsoluteDate end = date.shiftedBy(20);
285 BoundedPropagator p1 = createPropagator(date, end, 0);
286 BoundedPropagator p2 = createPropagator(date.shiftedBy(10), end, 0);
287 map.put(date, p1);
288 map.put(date.shiftedBy(10), p2);
289 AbsoluteDate min = date.shiftedBy(-10);
290 AbsoluteDate max = end.shiftedBy(10);
291
292
293 final BoundedPropagator actual =
294 new AggregateBoundedPropagator(map, min, max);
295
296
297 MatcherAssert.assertThat(actual.getMinDate(), CoreMatchers.is(min));
298 MatcherAssert.assertThat(actual.getMaxDate(), CoreMatchers.is(max));
299 MatcherAssert.assertThat(actual.propagate(date).getPVCoordinates(),
300 OrekitMatchers.pvCloseTo(p1.propagate(date).getPVCoordinates(), 0));
301 MatcherAssert.assertThat(actual.propagate(end).getPVCoordinates(),
302 OrekitMatchers.pvCloseTo(p2.propagate(end).getPVCoordinates(), 0));
303 MatcherAssert.assertThat(actual.propagate(min).getPVCoordinates(),
304 OrekitMatchers.pvCloseTo(p1.propagate(min).getPVCoordinates(), 0));
305 }
306
307
308
309
310
311
312
313
314
315 private BoundedPropagator createPropagator(AbsoluteDate start,
316 AbsoluteDate end,
317 double v) {
318 double gm = Constants.EGM96_EARTH_MU;
319 KeplerianPropagator propagator = new KeplerianPropagator(new KeplerianOrbit(
320 6778137, 0, 0, 0, 0, v, PositionAngleType.TRUE, frame, start, gm));
321 propagator.setAttitudeProvider(new LofOffset(frame, LOFType.LVLH_CCSDS));
322 final EphemerisGenerator generator = propagator.getEphemerisGenerator();
323 propagator.propagate(start, end);
324 return generator.getGeneratedEphemeris();
325 }
326
327 @Test
328 void testAttitude() {
329 AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
330 AbsoluteDate end = date.shiftedBy(20);
331 BoundedPropagator p1 = createPropagator(date, end, 0);
332 BoundedPropagator p2 = createPropagator(date.shiftedBy(10), end, 0);
333 final BoundedPropagator actual = new AggregateBoundedPropagator(Arrays.asList(p1, p2));
334
335
336 final SpacecraftState s0 = actual.propagate(date.shiftedBy(15));
337 Assertions.assertEquals(0,
338 Vector3D.angle(s0.getPosition(),
339 s0.getAttitude().getRotation().applyInverseTo(Vector3D.MINUS_K)),
340 3.0e-16);
341
342
343 actual.setAttitudeProvider(new FrameAlignedProvider(p1.getInitialState().getFrame()));
344 final SpacecraftState s1 = actual.propagate(date.shiftedBy(15));
345 Assertions.assertEquals(0,
346 Vector3D.angle(Vector3D.MINUS_K,
347 s1.getAttitude().getRotation().applyInverseTo(Vector3D.MINUS_K)),
348 3.0e-16);
349 Assertions.assertEquals(1.570796,
350 Vector3D.angle(s1.getPosition(),
351 s1.getAttitude().getRotation().applyInverseTo(Vector3D.MINUS_K)),
352 1.0e-6);
353
354 }
355
356 @Test
357 void testPropagateOrbit() {
358
359 final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
360 final SpacecraftState mockedState = Mockito.mock(SpacecraftState.class);
361 final Orbit expectedOrbit = Mockito.mock(Orbit.class);
362 Mockito.when(mockedState.getOrbit()).thenReturn(expectedOrbit);
363 final BoundedPropagator mockedBoundedPropagator = mockBoundedPropagator(date, mockedState);
364 final List<BoundedPropagator> boundedPropagatorList = new ArrayList<>();
365 boundedPropagatorList.add(mockedBoundedPropagator);
366 final AggregateBoundedPropagator propagator = new AggregateBoundedPropagator(boundedPropagatorList);
367
368
369 final Orbit actualOrbit = propagator.propagateOrbit(date);
370
371
372 Assertions.assertEquals(expectedOrbit, actualOrbit);
373 }
374
375 @Test
376 void testGetPosition() {
377
378 final AbsoluteDate date = AbsoluteDate.ARBITRARY_EPOCH;
379 final Frame mockedFrame = Mockito.mock(Frame.class);
380 final SpacecraftState mockedState = Mockito.mock(SpacecraftState.class);
381 final Vector3D expectedPosition = new Vector3D(1, 2, 3);
382 Mockito.when(mockedState.getPosition(mockedFrame)).thenReturn(expectedPosition);
383 final BoundedPropagator mockedBoundedPropagator = mockBoundedPropagator(date, mockedState);
384 final List<BoundedPropagator> boundedPropagatorList = new ArrayList<>();
385 boundedPropagatorList.add(mockedBoundedPropagator);
386 final AggregateBoundedPropagator propagator = new AggregateBoundedPropagator(boundedPropagatorList);
387
388
389 final Vector3D actualPosition = propagator.getPosition(date, mockedFrame);
390
391
392 Assertions.assertEquals(expectedPosition, actualPosition);
393 }
394
395 private BoundedPropagator mockBoundedPropagator(final AbsoluteDate date, final SpacecraftState state) {
396 final BoundedPropagator mockedBoundedPropagator = Mockito.mock(BoundedPropagator.class);
397 Mockito.when(mockedBoundedPropagator.getMinDate()).thenReturn(AbsoluteDate.PAST_INFINITY);
398 Mockito.when(mockedBoundedPropagator.getMinDate()).thenReturn(AbsoluteDate.FUTURE_INFINITY);
399 Mockito.when(mockedBoundedPropagator.propagate(date)).thenReturn(state);
400 Mockito.when(mockedBoundedPropagator.getInitialState()).thenReturn(state);
401 return mockedBoundedPropagator;
402 }
403
404 }