1 package org.orekit.files.iirv;
2
3 import org.junit.jupiter.api.Assertions;
4 import org.junit.jupiter.api.BeforeEach;
5 import org.junit.jupiter.api.Test;
6 import org.junit.jupiter.api.io.TempDir;
7 import org.orekit.Utils;
8 import org.orekit.annotation.DefaultDataContext;
9 import org.orekit.errors.OrekitIllegalArgumentException;
10 import org.orekit.files.iirv.terms.CoordinateSystemTerm;
11 import org.orekit.files.iirv.terms.CrossSectionalAreaTerm;
12 import org.orekit.files.iirv.terms.DataSourceTerm;
13 import org.orekit.files.iirv.terms.DragCoefficientTerm;
14 import org.orekit.files.iirv.terms.MassTerm;
15 import org.orekit.files.iirv.terms.MessageClassTerm;
16 import org.orekit.files.iirv.terms.MessageIDTerm;
17 import org.orekit.files.iirv.terms.MessageSourceTerm;
18 import org.orekit.files.iirv.terms.MessageTypeTerm;
19 import org.orekit.files.iirv.terms.OriginIdentificationTerm;
20 import org.orekit.files.iirv.terms.OriginatorRoutingIndicatorTerm;
21 import org.orekit.files.iirv.terms.RoutingIndicatorTerm;
22 import org.orekit.files.iirv.terms.SequenceNumberTerm;
23 import org.orekit.files.iirv.terms.SolarReflectivityCoefficientTerm;
24 import org.orekit.files.iirv.terms.SupportIdCodeTerm;
25 import org.orekit.files.iirv.terms.VectorTypeTerm;
26 import org.orekit.files.iirv.terms.VehicleIdCodeTerm;
27 import org.orekit.frames.Frame;
28 import org.orekit.frames.FramesFactory;
29 import org.orekit.orbits.KeplerianOrbit;
30 import org.orekit.orbits.PositionAngleType;
31 import org.orekit.propagation.analytical.KeplerianPropagator;
32 import org.orekit.time.AbsoluteDate;
33 import org.orekit.time.TimeComponents;
34 import org.orekit.time.TimeScalesFactory;
35 import org.orekit.time.UTCScale;
36 import org.orekit.utils.Constants;
37 import org.orekit.utils.TimeStampedPVCoordinates;
38
39 import java.io.IOException;
40 import java.nio.file.Path;
41 import java.util.ArrayList;
42 import java.util.List;
43
44 import static org.junit.jupiter.api.Assertions.assertEquals;
45 import static org.junit.jupiter.api.Assertions.assertThrows;
46
47
48
49
50
51 public class IIRVBuilderTest {
52
53 private static UTCScale UTC;
54 private static List<TimeStampedPVCoordinates> testCoordinates;
55
56 @TempDir
57 public Path temporaryFolderPath;
58
59 @BeforeEach
60 @DefaultDataContext
61 public void setUp() {
62
63 Utils.setDataRoot("regular-data");
64 UTC = TimeScalesFactory.getUTC();
65 testCoordinates = getTestCoordinates(5);
66 }
67
68
69 List<TimeStampedPVCoordinates> getTestCoordinates(int nCoordinates) {
70 final KeplerianOrbit orbit =
71 new KeplerianOrbit(6.5e6, 0.01, -0.1, 0.1, 0.2, 0.3, PositionAngleType.TRUE,
72 FramesFactory.getEME2000(), AbsoluteDate.J2000_EPOCH,
73 Constants.WGS84_EARTH_MU);
74 final AbsoluteDate startDate = new AbsoluteDate(2009, 1, 16, 0, 0, 0, UTC);
75
76 final Frame eme2000 = FramesFactory.getEME2000();
77
78 final double finalTime = 3600;
79 final double stepSizeSeconds = finalTime / nCoordinates;
80
81 final KeplerianPropagator propagator = new KeplerianPropagator(orbit);
82 final List<TimeStampedPVCoordinates> coordinates = new ArrayList<>();
83 for (double dt = 0.0; dt < finalTime; dt += stepSizeSeconds) {
84 coordinates.add(propagator.getPVCoordinates(startDate.shiftedBy(dt), eme2000));
85 }
86 return coordinates;
87 }
88
89 @Test
90 @DefaultDataContext
91 void testIIRVBuilderBuildMethods() {
92 final IIRVBuilder iirvBuilder = new IIRVBuilder(UTC);
93
94 for (TimeStampedPVCoordinates pv : testCoordinates) {
95
96
97 IIRVVector iirvPrecise = iirvBuilder.buildVector(pv);
98 IIRVVector iirv = new IIRVVector(iirvPrecise.toIIRVStrings(true), UTC);
99
100
101 IIRVVector iirvFromTerms = iirvBuilder.buildVector(
102 iirvPrecise.getDayOfYear(),
103 iirvPrecise.getVectorEpoch(),
104 iirvPrecise.getXPosition(),
105 iirvPrecise.getYPosition(),
106 iirvPrecise.getZPosition(),
107 iirvPrecise.getXVelocity(),
108 iirvPrecise.getYVelocity(),
109 iirvPrecise.getZVelocity());
110
111
112 assertEquals(Math.round(pv.getPosition().getX()), iirv.getPositionVector().getX());
113 assertEquals(Math.round(pv.getPosition().getX()), iirv.getXPosition().value());
114 assertEquals(Math.round(pv.getPosition().getY()), iirv.getPositionVector().getY());
115 assertEquals(Math.round(pv.getPosition().getY()), iirv.getYPosition().value());
116 assertEquals(Math.round(pv.getPosition().getZ()), iirv.getPositionVector().getZ());
117 assertEquals(Math.round(pv.getPosition().getZ()), iirv.getZPosition().value());
118
119
120 final double velTol = 1e-3;
121 assertEquals(pv.getVelocity().getX(), iirv.getVelocityVector().getX(), velTol);
122 assertEquals(pv.getVelocity().getX(), iirv.getXVelocity().value(), velTol);
123 assertEquals(pv.getVelocity().getY(), iirv.getVelocityVector().getY(), velTol);
124 assertEquals(pv.getVelocity().getY(), iirv.getYVelocity().value(), velTol);
125 assertEquals(pv.getVelocity().getZ(), iirv.getVelocityVector().getZ(), velTol);
126 assertEquals(pv.getVelocity().getZ(), iirv.getZVelocity().value(), velTol);
127
128
129 assertEquals(pv.getDate().getComponents(UTC).getDate().getDayOfYear(),
130 iirv.getDayOfYear().value());
131
132
133 TimeComponents timeTruth = pv.getDate().getComponents(UTC).getTime();
134 TimeComponents timeIIRV = iirv.getVectorEpoch().value();
135 assertEquals(timeTruth.getHour(), timeIIRV.getHour());
136 assertEquals(timeTruth.getMinute(), timeIIRV.getMinute());
137 assertEquals(timeTruth.getSecond(), timeIIRV.getSecond(), 1e-3);
138
139 assertEquals(iirvPrecise, iirvFromTerms);
140 assertEquals(iirv, iirvFromTerms);
141 }
142 }
143
144 @Test
145 void testIIRVBuilderMassTerm() {
146 IIRVBuilder iirvBuilder;
147
148 String valStr = "1.2";
149 double val = Double.parseDouble(valStr);
150 MassTerm massTerm = new MassTerm(val);
151
152
153 iirvBuilder = new IIRVBuilder(UTC);
154 iirvBuilder.setMass(massTerm);
155 assertEquals(massTerm, iirvBuilder.getMass());
156
157
158 iirvBuilder = new IIRVBuilder(UTC);
159 iirvBuilder.setMass(val);
160 assertEquals(massTerm, iirvBuilder.getMass());
161
162
163 iirvBuilder = new IIRVBuilder(UTC);
164 iirvBuilder.setMass(massTerm.toEncodedString());
165 assertEquals(massTerm, iirvBuilder.getMass());
166 }
167
168 @Test
169 void testIIRVBuilderMessageID() {
170 IIRVBuilder iirvBuilder;
171
172 String valStr = "0012345";
173 long val = Long.parseLong(valStr);
174 MessageIDTerm messageIDTerm = new MessageIDTerm(valStr);
175
176
177 iirvBuilder = new IIRVBuilder(UTC);
178 iirvBuilder.setMessageID(messageIDTerm);
179 assertEquals(messageIDTerm, iirvBuilder.getMessageID());
180
181
182 iirvBuilder = new IIRVBuilder(UTC);
183 iirvBuilder.setMessageID(val);
184 assertEquals(messageIDTerm, iirvBuilder.getMessageID());
185
186
187 iirvBuilder = new IIRVBuilder(UTC);
188 iirvBuilder.setMessageID((int) val);
189 assertEquals(messageIDTerm, iirvBuilder.getMessageID());
190
191
192 iirvBuilder = new IIRVBuilder(UTC);
193 iirvBuilder.setMessageID(messageIDTerm.toEncodedString());
194 assertEquals(messageIDTerm, iirvBuilder.getMessageID());
195 }
196
197 @Test
198 void testIIRVBuilderMessageClass() {
199 IIRVBuilder iirvBuilder;
200
201 MessageClassTerm messageClassTerm = MessageClassTerm.NOMINAL;
202
203
204 iirvBuilder = new IIRVBuilder(UTC);
205 iirvBuilder.setMessageClass(messageClassTerm);
206 assertEquals(messageClassTerm, iirvBuilder.getMessageClass());
207
208
209 iirvBuilder = new IIRVBuilder(UTC);
210 iirvBuilder.setMessageClass(messageClassTerm.value());
211 assertEquals(messageClassTerm, iirvBuilder.getMessageClass());
212
213
214 iirvBuilder = new IIRVBuilder(UTC);
215 iirvBuilder.setMessageClass(messageClassTerm.toEncodedString());
216 assertEquals(messageClassTerm, iirvBuilder.getMessageClass());
217 }
218
219 @Test
220 void testIIRVBuilderOriginIdentification() {
221 IIRVBuilder iirvBuilder;
222
223 OriginIdentificationTerm originIdentificationTerm = OriginIdentificationTerm.GSFC;
224
225
226 iirvBuilder = new IIRVBuilder(UTC);
227 iirvBuilder.setOriginIdentification(originIdentificationTerm);
228 assertEquals(originIdentificationTerm, iirvBuilder.getOriginIdentification());
229
230
231 iirvBuilder = new IIRVBuilder(UTC);
232 iirvBuilder.setOriginIdentification(originIdentificationTerm.toEncodedString());
233 assertEquals(originIdentificationTerm, iirvBuilder.getOriginIdentification());
234 }
235
236 @Test
237 void testIIRVBuilderMessageTypeTerm() {
238 IIRVBuilder iirvBuilder;
239
240 MessageTypeTerm messageTypeTerm = new MessageTypeTerm("05");
241
242
243 iirvBuilder = new IIRVBuilder(UTC);
244 iirvBuilder.setMessageType(messageTypeTerm);
245 assertEquals(messageTypeTerm, iirvBuilder.getMessageType());
246
247
248 iirvBuilder = new IIRVBuilder(UTC);
249 iirvBuilder.setMessageType(messageTypeTerm.toEncodedString());
250 assertEquals(messageTypeTerm, iirvBuilder.getMessageType());
251 }
252
253 @Test
254 void testIIRVBuilderMessageSourceTerm() {
255 IIRVBuilder iirvBuilder;
256
257 MessageSourceTerm messageSourceTerm = new MessageSourceTerm("1");
258
259
260 iirvBuilder = new IIRVBuilder(UTC);
261 iirvBuilder.setMessageSource(messageSourceTerm);
262 assertEquals(messageSourceTerm, iirvBuilder.getMessageSource());
263
264
265 iirvBuilder = new IIRVBuilder(UTC);
266 iirvBuilder.setMessageSource(messageSourceTerm.toEncodedString());
267 assertEquals(messageSourceTerm, iirvBuilder.getMessageSource());
268 }
269
270 @Test
271 void testIIRVBuilderRoutingIndicator() {
272 IIRVBuilder iirvBuilder;
273
274 RoutingIndicatorTerm routingIndicatorTerm = RoutingIndicatorTerm.GSFC;
275
276
277 iirvBuilder = new IIRVBuilder(UTC);
278 iirvBuilder.setRoutingIndicator(routingIndicatorTerm);
279 assertEquals(routingIndicatorTerm, iirvBuilder.getRoutingIndicator());
280
281
282 iirvBuilder = new IIRVBuilder(UTC);
283 iirvBuilder.setRoutingIndicator(routingIndicatorTerm.toEncodedString());
284 assertEquals(routingIndicatorTerm, iirvBuilder.getRoutingIndicator());
285 }
286
287 @Test
288 void testIIRVBuilderVectorType() {
289 IIRVBuilder iirvBuilder;
290
291 VectorTypeTerm vectorTypeTerm = VectorTypeTerm.POWERED_FLIGHT;
292
293
294 iirvBuilder = new IIRVBuilder(UTC);
295 iirvBuilder.setVectorType(vectorTypeTerm);
296 assertEquals(vectorTypeTerm, iirvBuilder.getVectorType());
297
298
299 iirvBuilder = new IIRVBuilder(UTC);
300 iirvBuilder.setVectorType(vectorTypeTerm.value());
301 assertEquals(vectorTypeTerm, iirvBuilder.getVectorType());
302
303
304 iirvBuilder = new IIRVBuilder(UTC);
305 iirvBuilder.setVectorType(vectorTypeTerm.toEncodedString());
306 assertEquals(vectorTypeTerm, iirvBuilder.getVectorType());
307 }
308
309 @Test
310 void testIIRVBuilderDataSourceTerm() {
311 IIRVBuilder iirvBuilder;
312
313 DataSourceTerm dataSourceTerm = DataSourceTerm.OFFLINE;
314
315
316 iirvBuilder = new IIRVBuilder(UTC);
317 iirvBuilder.setDataSource(dataSourceTerm);
318 assertEquals(dataSourceTerm, iirvBuilder.getDataSource());
319
320
321 iirvBuilder = new IIRVBuilder(UTC);
322 iirvBuilder.setDataSource(dataSourceTerm.value());
323 assertEquals(dataSourceTerm, iirvBuilder.getDataSource());
324
325
326 iirvBuilder = new IIRVBuilder(UTC);
327 iirvBuilder.setDataSource(dataSourceTerm.toEncodedString());
328 assertEquals(dataSourceTerm, iirvBuilder.getDataSource());
329 }
330
331 @Test
332 void testIIRVBuilderCoordinateSystemTerm() {
333 IIRVBuilder iirvBuilder;
334
335 CoordinateSystemTerm coordinateSystemTerm = CoordinateSystemTerm.GEOCENTRIC_TRUE_OF_DATE_ROTATING;
336
337
338 iirvBuilder = new IIRVBuilder(UTC);
339 iirvBuilder.setCoordinateSystem(coordinateSystemTerm);
340 assertEquals(coordinateSystemTerm, iirvBuilder.getCoordinateSystem());
341
342
343 iirvBuilder = new IIRVBuilder(UTC);
344 iirvBuilder.setCoordinateSystem(coordinateSystemTerm.value());
345 assertEquals(coordinateSystemTerm, iirvBuilder.getCoordinateSystem());
346
347
348 iirvBuilder = new IIRVBuilder(UTC);
349 iirvBuilder.setCoordinateSystem(coordinateSystemTerm.toEncodedString());
350 assertEquals(coordinateSystemTerm, iirvBuilder.getCoordinateSystem());
351 }
352
353 @Test
354 void testIIRVBuilderSupportIdTerm() {
355 IIRVBuilder iirvBuilder;
356
357 SupportIdCodeTerm supportIdCodeTerm = new SupportIdCodeTerm(1234);
358
359
360 iirvBuilder = new IIRVBuilder(UTC);
361 iirvBuilder.setSupportIdCode(supportIdCodeTerm);
362 assertEquals(supportIdCodeTerm, iirvBuilder.getSupportIdCode());
363
364
365 iirvBuilder = new IIRVBuilder(UTC);
366 iirvBuilder.setSupportIdCode(supportIdCodeTerm.value());
367 assertEquals(supportIdCodeTerm, iirvBuilder.getSupportIdCode());
368
369
370 iirvBuilder = new IIRVBuilder(UTC);
371 iirvBuilder.setSupportIdCode(supportIdCodeTerm.toEncodedString());
372 assertEquals(supportIdCodeTerm, iirvBuilder.getSupportIdCode());
373 }
374
375 @Test
376 void testIIRVBuilderVehicleIdTerm() {
377 IIRVBuilder iirvBuilder;
378
379 VehicleIdCodeTerm vehicleIdCodeTerm = new VehicleIdCodeTerm(5);
380
381
382 iirvBuilder = new IIRVBuilder(UTC);
383 iirvBuilder.setVehicleIdCode(vehicleIdCodeTerm);
384 assertEquals(vehicleIdCodeTerm, iirvBuilder.getVehicleIdCode());
385
386
387 iirvBuilder = new IIRVBuilder(UTC);
388 iirvBuilder.setVehicleIdCode(vehicleIdCodeTerm.value());
389 assertEquals(vehicleIdCodeTerm, iirvBuilder.getVehicleIdCode());
390
391
392 iirvBuilder = new IIRVBuilder(UTC);
393 iirvBuilder.setVehicleIdCode(vehicleIdCodeTerm.toEncodedString());
394 assertEquals(vehicleIdCodeTerm, iirvBuilder.getVehicleIdCode());
395 }
396
397 @Test
398 void testIIRVBuilderSequenceNumberTerm() {
399 IIRVBuilder iirvBuilder;
400
401 SequenceNumberTerm sequenceNumberTerm = new SequenceNumberTerm(10);
402
403
404 iirvBuilder = new IIRVBuilder(UTC);
405 iirvBuilder.setSequenceNumber(sequenceNumberTerm);
406 assertEquals(sequenceNumberTerm, iirvBuilder.getSequenceNumber());
407
408
409 iirvBuilder = new IIRVBuilder(UTC);
410 iirvBuilder.setSequenceNumber(sequenceNumberTerm.value());
411 assertEquals(sequenceNumberTerm, iirvBuilder.getSequenceNumber());
412
413
414 iirvBuilder = new IIRVBuilder(UTC);
415 iirvBuilder.setSequenceNumber(sequenceNumberTerm.toEncodedString());
416 assertEquals(sequenceNumberTerm, iirvBuilder.getSequenceNumber());
417
418
419 Assertions.assertThrows(OrekitIllegalArgumentException.class, () -> new IIRVBuilder(UTC).setSequenceNumber(1000));
420 }
421
422 @Test
423 void testIIRVBuilderCrossSectionalAreaTerm() {
424 IIRVBuilder iirvBuilder;
425
426 CrossSectionalAreaTerm crossSectionalAreaTerm = new CrossSectionalAreaTerm(10.5);
427
428
429 iirvBuilder = new IIRVBuilder(UTC);
430 iirvBuilder.setCrossSectionalArea(crossSectionalAreaTerm);
431 assertEquals(crossSectionalAreaTerm, iirvBuilder.getCrossSectionalArea());
432
433
434 iirvBuilder = new IIRVBuilder(UTC);
435 iirvBuilder.setCrossSectionalArea(crossSectionalAreaTerm.value());
436 assertEquals(crossSectionalAreaTerm, iirvBuilder.getCrossSectionalArea());
437
438
439 iirvBuilder = new IIRVBuilder(UTC);
440 iirvBuilder.setCrossSectionalArea(crossSectionalAreaTerm.toEncodedString());
441 assertEquals(crossSectionalAreaTerm, iirvBuilder.getCrossSectionalArea());
442 }
443
444 @Test
445 void testIIRVBuilderDragCoefficientTerm() {
446 IIRVBuilder iirvBuilder;
447
448 DragCoefficientTerm dragCoefficientTerm = new DragCoefficientTerm(2.2);
449
450
451 iirvBuilder = new IIRVBuilder(UTC);
452 iirvBuilder.setDragCoefficient(dragCoefficientTerm);
453 assertEquals(dragCoefficientTerm, iirvBuilder.getDragCoefficient());
454
455
456 iirvBuilder = new IIRVBuilder(UTC);
457 iirvBuilder.setDragCoefficient(dragCoefficientTerm.value());
458 assertEquals(dragCoefficientTerm, iirvBuilder.getDragCoefficient());
459
460
461 iirvBuilder = new IIRVBuilder(UTC);
462 iirvBuilder.setDragCoefficient(dragCoefficientTerm.toEncodedString());
463 assertEquals(dragCoefficientTerm, iirvBuilder.getDragCoefficient());
464 }
465
466 @Test
467 void testIIRVBuilderSolarReflectivityCoefficientTerm() {
468 IIRVBuilder iirvBuilder;
469
470 SolarReflectivityCoefficientTerm solarReflectivityCoefficientTerm = new SolarReflectivityCoefficientTerm(-7.8);
471
472
473 iirvBuilder = new IIRVBuilder(UTC);
474 iirvBuilder.setSolarReflectivityCoefficient(solarReflectivityCoefficientTerm);
475 assertEquals(solarReflectivityCoefficientTerm, iirvBuilder.getSolarReflectivityCoefficient());
476
477
478 iirvBuilder = new IIRVBuilder(UTC);
479 iirvBuilder.setSolarReflectivityCoefficient(solarReflectivityCoefficientTerm.value());
480 assertEquals(solarReflectivityCoefficientTerm, iirvBuilder.getSolarReflectivityCoefficient());
481
482
483 iirvBuilder = new IIRVBuilder(UTC);
484 iirvBuilder.setSolarReflectivityCoefficient(solarReflectivityCoefficientTerm.toEncodedString());
485 assertEquals(solarReflectivityCoefficientTerm, iirvBuilder.getSolarReflectivityCoefficient());
486 }
487
488 @Test
489 void testIIRVBuilderOriginatorRoutingIndicatorTerm() {
490 IIRVBuilder iirvBuilder;
491
492 OriginatorRoutingIndicatorTerm originatorRoutingIndicatorTerm = OriginatorRoutingIndicatorTerm.GCQU;
493
494
495 iirvBuilder = new IIRVBuilder(UTC);
496 iirvBuilder.setOriginatorRoutingIndicator(originatorRoutingIndicatorTerm);
497 assertEquals(originatorRoutingIndicatorTerm, iirvBuilder.getOriginatorRoutingIndicator());
498
499
500 iirvBuilder = new IIRVBuilder(UTC);
501 iirvBuilder.setOriginatorRoutingIndicator(originatorRoutingIndicatorTerm.toEncodedString());
502 assertEquals(originatorRoutingIndicatorTerm, iirvBuilder.getOriginatorRoutingIndicator());
503 }
504
505 @Test
506 void testNumberOfElementsErrorHandling() {
507
508 List<TimeStampedPVCoordinates> coordinates = getTestCoordinates(1001);
509 assertThrows(OrekitIllegalArgumentException.class, () -> new IIRVBuilder(UTC).buildIIRVMessage(coordinates));
510 assertThrows(OrekitIllegalArgumentException.class, () -> new IIRVBuilder(UTC).buildEphemerisFile(coordinates));
511 }
512
513
514 @Test
515 void exampleUsage() throws IOException {
516
517
518
519 List<TimeStampedPVCoordinates> coordinates = testCoordinates;
520
521
522 IIRVBuilder iirvBuilder = new IIRVBuilder(TimeScalesFactory.getUTC());
523 iirvBuilder.setSupportIdCode(1221);
524 iirvBuilder.setDragCoefficient(2.2);
525 iirvBuilder.setOriginIdentification(OriginIdentificationTerm.GSFC);
526 iirvBuilder.setRoutingIndicator("MANY");
527
528
529
530 IIRVFileWriter writer = new IIRVFileWriter(iirvBuilder, IIRVMessage.IncludeMessageMetadata.ALL_VECTORS);
531
532
533 IIRVEphemerisFile iirvFile = iirvBuilder.buildEphemerisFile(coordinates);
534
535
536
537 String testFilename = "TestSatellite" + "_" +
538 iirvFile.getStartYear() + "_" +
539 iirvFile.getIIRV().get(0).getDayOfYear().toEncodedString() + "_" +
540 iirvFile.getIIRV().get(0).getVectorEpoch().toEncodedString() + ".iirv";
541 writer.write(temporaryFolderPath.resolve(testFilename).toString(), iirvFile);
542 }
543 }