1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.ssa.collision.shorttermencounter.probability.twod;
18
19 import org.hipparchus.analysis.differentiation.DSFactory;
20 import org.hipparchus.analysis.differentiation.DerivativeStructure;
21 import org.hipparchus.util.Binary64;
22 import org.junit.jupiter.api.Assertions;
23 import org.junit.jupiter.api.BeforeAll;
24 import org.junit.jupiter.api.DisplayName;
25 import org.junit.jupiter.api.Test;
26 import org.orekit.Utils;
27 import org.orekit.data.DataSource;
28 import org.orekit.files.ccsds.ndm.ParserBuilder;
29 import org.orekit.files.ccsds.ndm.cdm.Cdm;
30 import org.orekit.ssa.metrics.FieldProbabilityOfCollision;
31 import org.orekit.ssa.metrics.ProbabilityOfCollision;
32
33 class Laas2015Test {
34
35
36 private final ShortTermEncounter2DPOCMethod method = new Laas2015();
37
38 @BeforeAll
39 static void initializeOrekitData() {
40 Utils.setDataRoot("regular-data");
41 }
42
43 @Test
44 @DisplayName("Chan test case 01")
45 void ChanTestCase01() {
46
47 final double xm = 0;
48 final double ym = 10;
49 final double sigmaX = 25;
50 final double sigmaY = 50;
51 final double radius = 5;
52
53
54 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
55
56
57 Assertions.assertEquals(9.742e-3, result.getValue(), 1e-6);
58 Assertions.assertEquals(9.704e-3, result.getLowerLimit(), 1e-6);
59 Assertions.assertEquals(9.742e-3, result.getUpperLimit(), 1e-6);
60 }
61
62 @Test
63 @DisplayName("Chan test case 02")
64 void ChanTestCase02() {
65
66 final double xm = 10;
67 final double ym = 0;
68 final double sigmaX = 25;
69 final double sigmaY = 50;
70 final double radius = 5;
71
72
73 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
74
75
76 Assertions.assertEquals(9.181e-3, result.getValue(), 1e-6);
77 Assertions.assertEquals(9.139e-3, result.getLowerLimit(), 1e-6);
78 Assertions.assertEquals(9.182e-3, result.getUpperLimit(), 1e-6);
79 }
80
81 @Test
82 @DisplayName("Chan test case 03")
83 void ChanTestCase03() {
84
85 final double xm = 0;
86 final double ym = 10;
87 final double sigmaX = 25;
88 final double sigmaY = 75;
89 final double radius = 5;
90
91
92 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
93
94
95 Assertions.assertEquals(6.571e-3, result.getValue(), 1e-6);
96 Assertions.assertEquals(6.542e-3, result.getLowerLimit(), 1e-6);
97 Assertions.assertEquals(6.572e-3, result.getUpperLimit(), 1e-6);
98 }
99
100 @Test
101 @DisplayName("Chan test case 04")
102 void ChanTestCase04() {
103
104 final double xm = 10;
105 final double ym = 0;
106 final double sigmaX = 25;
107 final double sigmaY = 75;
108 final double radius = 5;
109
110
111 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
112
113
114 Assertions.assertEquals(6.125e-3, result.getValue(), 1e-6);
115 Assertions.assertEquals(6.09e-3, result.getLowerLimit(), 1e-5);
116 Assertions.assertEquals(6.13e-3, result.getUpperLimit(), 1e-5);
117 }
118
119 @Test
120 @DisplayName("Chan test case 05")
121 void ChanTestCase05() {
122
123 final double xm = 0;
124 final double ym = 1000;
125 final double sigmaX = 1000;
126 final double sigmaY = 3000;
127 final double radius = 10;
128
129
130 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
131
132
133 Assertions.assertEquals(1.577e-5, result.getValue(), 1e-8);
134 Assertions.assertEquals(1.576561e-5, result.getLowerLimit(), 1e-9);
135 Assertions.assertEquals(1.576576e-5, result.getUpperLimit(), 1e-9);
136 }
137
138 @Test
139 @DisplayName("Chan test case 06")
140 void ChanTestCase06() {
141
142 final double xm = 1000;
143 final double ym = 0;
144 final double sigmaX = 1000;
145 final double sigmaY = 3000;
146 final double radius = 10;
147
148
149 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
150
151
152 Assertions.assertEquals(1.011e-5, result.getValue(), 1e-8);
153 Assertions.assertEquals(1.010860e-5, result.getLowerLimit(), 1e-11);
154 Assertions.assertEquals(1.010883e-5, result.getUpperLimit(), 1e-11);
155 }
156
157 @Test
158 @DisplayName("Chan test case 07")
159 void ChanTestCase07() {
160
161 final double xm = 0;
162 final double ym = 10000;
163 final double sigmaX = 1000;
164 final double sigmaY = 3000;
165 final double radius = 10;
166
167
168 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
169
170
171 Assertions.assertEquals(6.443e-8, result.getValue(), 1e-11);
172 Assertions.assertEquals(6.44304e-8, result.getLowerLimit(), 1e-13);
173 Assertions.assertEquals(6.44321e-8, result.getUpperLimit(), 1e-13);
174 }
175
176 @Test
177 @DisplayName("Chan test case 08")
178 void ChanTestCase08() {
179
180 final double xm = 10000;
181 final double ym = 0;
182 final double sigmaX = 1000;
183 final double sigmaY = 3000;
184 final double radius = 10;
185
186
187 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
188
189
190 Assertions.assertEquals(3.219e-27, result.getValue(), 1e-30);
191 Assertions.assertEquals(3.2145e-27, result.getLowerLimit(), 1e-31);
192 Assertions.assertEquals(3.2186e-27, result.getUpperLimit(), 1e-31);
193 }
194
195 @Test
196 @DisplayName("Chan test case 09")
197 void ChanTestCase09() {
198
199 final double xm = 0;
200 final double ym = 10000;
201 final double sigmaX = 1000;
202 final double sigmaY = 10000;
203 final double radius = 10;
204
205
206 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
207
208
209 Assertions.assertEquals(3.033e-6, result.getValue(), 1e-9);
210 Assertions.assertEquals(3.03258e-6, result.getLowerLimit(), 1e-11);
211 Assertions.assertEquals(3.03261e-6, result.getUpperLimit(), 1e-11);
212 }
213
214 @Test
215 @DisplayName("Chan test case 10")
216 void ChanTestCase10() {
217
218 final double xm = 10000;
219 final double ym = 0;
220 final double sigmaX = 1000;
221 final double sigmaY = 10000;
222 final double radius = 10;
223
224
225 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
226
227
228 Assertions.assertEquals(9.656e-28, result.getValue(), 1e-31);
229 Assertions.assertEquals(9.643e-28, result.getLowerLimit(), 1e-31);
230 Assertions.assertEquals(9.656e-28, result.getUpperLimit(), 1e-31);
231 }
232
233 @Test
234 @DisplayName("Chan test case 11")
235 void ChanTestCase11() {
236
237 final double xm = 0;
238 final double ym = 5000;
239 final double sigmaX = 1000;
240 final double sigmaY = 3000;
241 final double radius = 50;
242
243
244 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
245
246
247 Assertions.assertEquals(1.039e-4, result.getValue(), 1e-7);
248 Assertions.assertEquals(1.03831e-4, result.getLowerLimit(), 1e-9);
249 Assertions.assertEquals(1.03871e-4, result.getUpperLimit(), 1e-9);
250 }
251
252 @Test
253 @DisplayName("Chan test case 12")
254 void ChanTestCase12() {
255
256 final double xm = 5000;
257 final double ym = 0;
258 final double sigmaX = 1000;
259 final double sigmaY = 3000;
260 final double radius = 50;
261
262
263 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
264
265
266 Assertions.assertEquals(1.564e-9, result.getValue(), 1e-12);
267 Assertions.assertEquals(1.552e-9, result.getLowerLimit(), 1e-12);
268 Assertions.assertEquals(1.565e-9, result.getUpperLimit(), 1e-12);
269 }
270
271 @Test
272 @DisplayName("CSM test case 1")
273 void CsmTestCase1() {
274
275 final double xm = 84.875546;
276 final double ym = 60.583685;
277 final double sigmaX = 57.918666;
278 final double sigmaY = 152.8814468;
279 final double radius = 10.3;
280
281
282 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
283
284
285 Assertions.assertEquals(1.9002e-3, result.getValue(), 1e-7);
286 Assertions.assertEquals(1.878e-3, result.getLowerLimit(), 1e-6);
287 Assertions.assertEquals(1.900e-3, result.getUpperLimit(), 1e-6);
288 }
289
290 @Test
291 @DisplayName("CSM test case 2")
292 void CsmTestCase2() {
293
294 final double xm = -81.618369;
295 final double ym = 115.055899;
296 final double sigmaX = 15.988242;
297 final double sigmaY = 5756.840725;
298 final double radius = 1.3;
299
300
301 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
302
303
304 Assertions.assertEquals(2.0553e-11, result.getValue(), 1e-15);
305 Assertions.assertEquals(2.0101e-11, result.getLowerLimit(), 1e-15);
306 Assertions.assertEquals(2.0557e-11, result.getUpperLimit(), 1e-15);
307 }
308
309 @Test
310 @DisplayName("CSM test case 3")
311 void CsmTestCase3() {
312
313 final double xm = 102.177247;
314 final double ym = 693.405893;
315 final double sigmaX = 94.230921;
316 final double sigmaY = 643.409272;
317 final double radius = 5.3;
318
319
320 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
321
322
323 Assertions.assertEquals(7.2003e-5, result.getValue(), 1e-9);
324 Assertions.assertEquals(7.194e-5, result.getLowerLimit(), 1e-8);
325 Assertions.assertEquals(7.200e-5, result.getUpperLimit(), 1e-8);
326 }
327
328 @Test
329 @DisplayName("CDM test case 1")
330 void CdmTestCase1() {
331
332 final double xm = -752.672701;
333 final double ym = 644.939441;
334 final double sigmaX = 445.859950;
335 final double sigmaY = 6095.858688;
336 final double radius = 3.5;
337
338
339 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
340
341
342 Assertions.assertEquals(5.3904e-7, result.getValue(), 1e-11);
343 Assertions.assertEquals(5.3902e-7, result.getLowerLimit(), 1e-11);
344 Assertions.assertEquals(5.3904e-7, result.getUpperLimit(), 1e-11);
345 }
346
347 @Test
348 @DisplayName("CDM test case 2")
349 void CdmTestCase2() {
350
351 final double xm = -692.362272;
352 final double ym = 4475.456261;
353 final double sigmaX = 193.454603;
354 final double sigmaY = 562.027293;
355 final double radius = 13.2;
356
357
358 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
359
360
361 Assertions.assertEquals(2.2796e-20, result.getValue(), 1e-24);
362 Assertions.assertEquals(2.2517e-20, result.getLowerLimit(), 1e-24);
363 Assertions.assertEquals(2.2797e-20, result.getUpperLimit(), 1e-24);
364 }
365
366 @Test
367 @DisplayName("Alfano test case 3")
368 void AlfanoTestCase3() {
369
370 final double xm = -3.8872073;
371 final double ym = 0.1591646;
372 final double sigmaX = 1.4101830;
373 final double sigmaY = 114.2585190;
374 final double radius = 15;
375
376
377 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
378
379
380 Assertions.assertEquals(1.0038e-1, result.getValue(), 1e-5);
381 }
382
383
384
385
386
387
388
389
390
391
392
393 @Test
394 @DisplayName("Alfano test case 5")
395 void AlfanoTestCase5() {
396
397 final double xm = -1.2217895;
398 final double ym = 2.1230067;
399 final double sigmaX = 0.0373279;
400 final double sigmaY = 177.8109003;
401 final double radius = 10;
402
403
404 final ProbabilityOfCollision result = method.compute(xm, ym, sigmaX, sigmaY, radius);
405
406
407 Assertions.assertEquals(4.4507e-2, result.getValue(), 1e-6);
408 }
409
410 @Test
411 @DisplayName("Chan test case 04 with custom method constructor and relative boundaries close enough to the desired accuracy")
412 void ChanTestCase04WithCustomLaasMethod() {
413
414 final ShortTermEncounter2DPOCMethod customMethod = new Laas2015(1e-4, 1000);
415
416 final double xm = 10;
417 final double ym = 0;
418 final double sigmaX = 25;
419 final double sigmaY = 75;
420 final double radius = 5;
421
422
423 final ProbabilityOfCollision result = customMethod.compute(xm, ym, sigmaX, sigmaY, radius);
424
425
426 Assertions.assertEquals(6.1e-3, result.getValue(), 1e-4);
427 }
428
429 @Test
430 @DisplayName(
431 "Test probability from a real CDM. It has been mentioned in https://forum.orekit.org/t/collision-package-in-development/2638/16"
432 + " and define an expected probability of collision of 0.004450713 which is higher than the value found using"
433 + " the methods provided in this ssa package because the CSpOC use the projection of a square containing the"
434 + " collision disk instead of the collision disk directly. Hence an overestimation of the probability of"
435 + " collision. This test serves as a non regression test")
436 void testComputeProbabilityFromACdm() {
437
438
439 final String cdmPath = "/ccsds/cdm/ION_SCV8_vs_STARLINK_1233.txt";
440 final DataSource data = new DataSource(cdmPath, () -> getClass().getResourceAsStream(cdmPath));
441 final Cdm cdm = new ParserBuilder().buildCdmParser().parseMessage(data);
442
443
444 final double primaryRadius = 5;
445 final double secondaryRadius = 5;
446
447
448 final ProbabilityOfCollision result = method.compute(cdm, primaryRadius, secondaryRadius);
449
450
451 Assertions.assertEquals(0.0034965176443840897, result.getValue(), 1e-18);
452 }
453
454 @Test
455 @DisplayName("Chan test case 01 Field version")
456 void ChanTestCase01Field() {
457
458 final Binary64 xm = new Binary64(0);
459 final Binary64 ym = new Binary64(10);
460 final Binary64 sigmaX = new Binary64(25);
461 final Binary64 sigmaY = new Binary64(50);
462 final Binary64 radius = new Binary64(5);
463
464
465 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
466
467
468 Assertions.assertEquals(9.742e-3, result.getValue().getReal(), 1e-6);
469 Assertions.assertEquals(9.704e-3, result.getLowerLimit().getReal(), 1e-6);
470 Assertions.assertEquals(9.742e-3, result.getUpperLimit().getReal(), 1e-6);
471 }
472
473 @Test
474 @DisplayName("Chan test case 02 Field version")
475 void ChanTestCase02Field() {
476
477 final Binary64 xm = new Binary64(10);
478 final Binary64 ym = new Binary64(0);
479 final Binary64 sigmaX = new Binary64(25);
480 final Binary64 sigmaY = new Binary64(50);
481 final Binary64 radius = new Binary64(5);
482
483
484 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
485
486
487 Assertions.assertEquals(9.181e-3, result.getValue().getReal(), 1e-6);
488 Assertions.assertEquals(9.139e-3, result.getLowerLimit().getReal(), 1e-6);
489 Assertions.assertEquals(9.182e-3, result.getUpperLimit().getReal(), 1e-6);
490 }
491
492 @Test
493 @DisplayName("Chan test case 03 Field version")
494 void ChanTestCase03Field() {
495
496 final Binary64 xm = new Binary64(0);
497 final Binary64 ym = new Binary64(10);
498 final Binary64 sigmaX = new Binary64(25);
499 final Binary64 sigmaY = new Binary64(75);
500 final Binary64 radius = new Binary64(5);
501
502
503 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
504
505
506 Assertions.assertEquals(6.571e-3, result.getValue().getReal(), 1e-6);
507 Assertions.assertEquals(6.542e-3, result.getLowerLimit().getReal(), 1e-6);
508 Assertions.assertEquals(6.572e-3, result.getUpperLimit().getReal(), 1e-6);
509 }
510
511 @Test
512 @DisplayName("Chan test case 04 Field version")
513 void ChanTestCase04Field() {
514
515 final Binary64 xm = new Binary64(10);
516 final Binary64 ym = new Binary64(0);
517 final Binary64 sigmaX = new Binary64(25);
518 final Binary64 sigmaY = new Binary64(75);
519 final Binary64 radius = new Binary64(5);
520
521
522 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
523
524
525 Assertions.assertEquals(6.125e-3, result.getValue().getReal(), 1e-6);
526 Assertions.assertEquals(6.09e-3, result.getLowerLimit().getReal(), 1e-5);
527 Assertions.assertEquals(6.13e-3, result.getUpperLimit().getReal(), 1e-5);
528 }
529
530 @Test
531 @DisplayName("Chan test case 05 Field version")
532 void ChanTestCase05Field() {
533
534 final Binary64 xm = new Binary64(0);
535 final Binary64 ym = new Binary64(1000);
536 final Binary64 sigmaX = new Binary64(1000);
537 final Binary64 sigmaY = new Binary64(3000);
538 final Binary64 radius = new Binary64(10);
539
540
541 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
542
543
544 Assertions.assertEquals(1.577e-5, result.getValue().getReal(), 1e-8);
545 Assertions.assertEquals(1.576561e-5, result.getLowerLimit().getReal(), 1e-9);
546 Assertions.assertEquals(1.576576e-5, result.getUpperLimit().getReal(), 1e-9);
547 }
548
549 @Test
550 @DisplayName("Chan test case 06 Field version")
551 void ChanTestCase06Field() {
552
553 final Binary64 xm = new Binary64(1000);
554 final Binary64 ym = new Binary64(0);
555 final Binary64 sigmaX = new Binary64(1000);
556 final Binary64 sigmaY = new Binary64(3000);
557 final Binary64 radius = new Binary64(10);
558
559
560 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
561
562
563 Assertions.assertEquals(1.011e-5, result.getValue().getReal(), 1e-8);
564 Assertions.assertEquals(1.010860e-5, result.getLowerLimit().getReal(), 1e-11);
565 Assertions.assertEquals(1.010883e-5, result.getUpperLimit().getReal(), 1e-11);
566 }
567
568 @Test
569 @DisplayName("Chan test case 07 Field version")
570 void ChanTestCase07Field() {
571
572 final Binary64 xm = new Binary64(0);
573 final Binary64 ym = new Binary64(10000);
574 final Binary64 sigmaX = new Binary64(1000);
575 final Binary64 sigmaY = new Binary64(3000);
576 final Binary64 radius = new Binary64(10);
577
578
579 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
580
581
582 Assertions.assertEquals(6.443e-8, result.getValue().getReal(), 1e-11);
583 Assertions.assertEquals(6.44304e-8, result.getLowerLimit().getReal(), 1e-13);
584 Assertions.assertEquals(6.44321e-8, result.getUpperLimit().getReal(), 1e-13);
585 }
586
587 @Test
588 @DisplayName("Chan test case 08 Field version")
589 void ChanTestCase08Field() {
590
591 final Binary64 xm = new Binary64(10000);
592 final Binary64 ym = new Binary64(0);
593 final Binary64 sigmaX = new Binary64(1000);
594 final Binary64 sigmaY = new Binary64(3000);
595 final Binary64 radius = new Binary64(10);
596
597
598 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
599
600
601 Assertions.assertEquals(3.219e-27, result.getValue().getReal(), 1e-30);
602 Assertions.assertEquals(3.2145e-27, result.getLowerLimit().getReal(), 1e-31);
603 Assertions.assertEquals(3.2186e-27, result.getUpperLimit().getReal(), 1e-31);
604 }
605
606 @Test
607 @DisplayName("Chan test case 09 Field version")
608 void ChanTestCase09Field() {
609
610 final Binary64 xm = new Binary64(0);
611 final Binary64 ym = new Binary64(10000);
612 final Binary64 sigmaX = new Binary64(1000);
613 final Binary64 sigmaY = new Binary64(10000);
614 final Binary64 radius = new Binary64(10);
615
616
617 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
618
619
620 Assertions.assertEquals(3.033e-6, result.getValue().getReal(), 1e-9);
621 Assertions.assertEquals(3.03258e-6, result.getLowerLimit().getReal(), 1e-11);
622 Assertions.assertEquals(3.03261e-6, result.getUpperLimit().getReal(), 1e-11);
623 }
624
625 @Test
626 @DisplayName("Chan test case 10 Field version")
627 void ChanTestCase10Field() {
628
629 final Binary64 xm = new Binary64(10000);
630 final Binary64 ym = new Binary64(0);
631 final Binary64 sigmaX = new Binary64(1000);
632 final Binary64 sigmaY = new Binary64(10000);
633 final Binary64 radius = new Binary64(10);
634
635
636 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
637
638
639 Assertions.assertEquals(9.656e-28, result.getValue().getReal(), 1e-31);
640 Assertions.assertEquals(9.643e-28, result.getLowerLimit().getReal(), 1e-31);
641 Assertions.assertEquals(9.656e-28, result.getUpperLimit().getReal(), 1e-31);
642 }
643
644 @Test
645 @DisplayName("Chan test case 11 Field version")
646 void ChanTestCase11Field() {
647
648 final Binary64 xm = new Binary64(0);
649 final Binary64 ym = new Binary64(5000);
650 final Binary64 sigmaX = new Binary64(1000);
651 final Binary64 sigmaY = new Binary64(3000);
652 final Binary64 radius = new Binary64(50);
653
654
655 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
656
657
658 Assertions.assertEquals(1.039e-4, result.getValue().getReal(), 1e-7);
659 Assertions.assertEquals(1.03831e-4, result.getLowerLimit().getReal(), 1e-9);
660 Assertions.assertEquals(1.03871e-4, result.getUpperLimit().getReal(), 1e-9);
661 }
662
663 @Test
664 @DisplayName("Chan test case 12 Field version")
665 void ChanTestCase12Field() {
666
667 final Binary64 xm = new Binary64(5000);
668 final Binary64 ym = new Binary64(0);
669 final Binary64 sigmaX = new Binary64(1000);
670 final Binary64 sigmaY = new Binary64(3000);
671 final Binary64 radius = new Binary64(50);
672
673
674 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
675
676
677 Assertions.assertEquals(1.564e-9, result.getValue().getReal(), 1e-12);
678 Assertions.assertEquals(1.552e-9, result.getLowerLimit().getReal(), 1e-12);
679 Assertions.assertEquals(1.565e-9, result.getUpperLimit().getReal(), 1e-12);
680 }
681
682 @Test
683 @DisplayName("CSM test case 1 Field version")
684 void CsmTestCase1Field() {
685
686 final Binary64 xm = new Binary64(84.875546);
687 final Binary64 ym = new Binary64(60.583685);
688 final Binary64 sigmaX = new Binary64(57.918666);
689 final Binary64 sigmaY = new Binary64(152.8814468);
690 final Binary64 radius = new Binary64(10.3);
691
692
693 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
694
695
696 Assertions.assertEquals(1.9002e-3, result.getValue().getReal(), 1e-7);
697 Assertions.assertEquals(1.878e-3, result.getLowerLimit().getReal(), 1e-6);
698 Assertions.assertEquals(1.900e-3, result.getUpperLimit().getReal(), 1e-6);
699 }
700
701 @Test
702 @DisplayName("CSM test case 2 Field version")
703 void CsmTestCase2Field() {
704
705 final Binary64 xm = new Binary64(-81.618369);
706 final Binary64 ym = new Binary64(115.055899);
707 final Binary64 sigmaX = new Binary64(15.988242);
708 final Binary64 sigmaY = new Binary64(5756.840725);
709 final Binary64 radius = new Binary64(1.3);
710
711
712 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
713
714
715 Assertions.assertEquals(2.0553e-11, result.getValue().getReal(), 1e-15);
716 Assertions.assertEquals(2.0101e-11, result.getLowerLimit().getReal(), 1e-15);
717 Assertions.assertEquals(2.0557e-11, result.getUpperLimit().getReal(), 1e-15);
718 }
719
720 @Test
721 @DisplayName("CSM test case 3 Field version")
722 void CsmTestCase3Field() {
723
724 final Binary64 xm = new Binary64(102.177247);
725 final Binary64 ym = new Binary64(693.405893);
726 final Binary64 sigmaX = new Binary64(94.230921);
727 final Binary64 sigmaY = new Binary64(643.409272);
728 final Binary64 radius = new Binary64(5.3);
729
730
731 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
732
733
734 Assertions.assertEquals(7.2003e-5, result.getValue().getReal(), 1e-9);
735 Assertions.assertEquals(7.194e-5, result.getLowerLimit().getReal(), 1e-8);
736 Assertions.assertEquals(7.200e-5, result.getUpperLimit().getReal(), 1e-8);
737 }
738
739 @Test
740 @DisplayName("CDM test case 1 Field version")
741 void CdmTestCase1Field() {
742
743 final Binary64 xm = new Binary64(-752.672701);
744 final Binary64 ym = new Binary64(644.939441);
745 final Binary64 sigmaX = new Binary64(445.859950);
746 final Binary64 sigmaY = new Binary64(6095.858688);
747 final Binary64 radius = new Binary64(3.5);
748
749
750 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
751
752
753 Assertions.assertEquals(5.3904e-7, result.getValue().getReal(), 1e-11);
754 Assertions.assertEquals(5.3902e-7, result.getLowerLimit().getReal(), 1e-11);
755 Assertions.assertEquals(5.3904e-7, result.getUpperLimit().getReal(), 1e-11);
756 }
757
758 @Test
759 @DisplayName("CDM test case 2 Field version")
760 void CdmTestCase2Field() {
761
762 final Binary64 xm = new Binary64(-692.362272);
763 final Binary64 ym = new Binary64(4475.456261);
764 final Binary64 sigmaX = new Binary64(193.454603);
765 final Binary64 sigmaY = new Binary64(562.027293);
766 final Binary64 radius = new Binary64(13.2);
767
768
769 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
770
771
772 Assertions.assertEquals(2.2796e-20, result.getValue().getReal(), 1e-24);
773 Assertions.assertEquals(2.2517e-20, result.getLowerLimit().getReal(), 1e-24);
774 Assertions.assertEquals(2.2797e-20, result.getUpperLimit().getReal(), 1e-24);
775 }
776
777 @Test
778 @DisplayName("Alfano test case 3 Field version.")
779 void AlfanoTestCase3Field() {
780
781 final Binary64 xm = new Binary64(-3.8872073);
782 final Binary64 ym = new Binary64(0.1591646);
783 final Binary64 sigmaX = new Binary64(1.4101830);
784 final Binary64 sigmaY = new Binary64(114.2585190);
785 final Binary64 radius = new Binary64(15);
786
787
788 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
789
790
791 Assertions.assertEquals(1.0038e-1, result.getValue().getReal(), 1e-5);
792 }
793
794
795
796
797
798
799
800
801
802
803
804 @Test
805 @DisplayName("Alfano test case 5 Field version")
806 void AlfanoTestCase5Field() {
807
808 final Binary64 xm = new Binary64(-1.2217895);
809 final Binary64 ym = new Binary64(2.1230067);
810 final Binary64 sigmaX = new Binary64(0.0373279);
811 final Binary64 sigmaY = new Binary64(177.8109003);
812 final Binary64 radius = new Binary64(10);
813
814
815 final FieldProbabilityOfCollision<Binary64> result = method.compute(xm, ym, sigmaX, sigmaY, radius);
816
817
818 Assertions.assertEquals(4.4515e-2, result.getValue().getReal(), 1e-6);
819 }
820
821 @Test
822 @DisplayName("Chan test case 04 with custom method constructor and relative boundaries close enough to the desired accuracy Field version")
823 void ChanTestCase04WithCustomLaasMethodField() {
824
825 final ShortTermEncounter2DPOCMethod customMethod = new Laas2015(1e-4, 1000);
826
827 final Binary64 xm = new Binary64(10);
828 final Binary64 ym = new Binary64(0);
829 final Binary64 sigmaX = new Binary64(25);
830 final Binary64 sigmaY = new Binary64(75);
831 final Binary64 radius = new Binary64(5);
832
833
834 final FieldProbabilityOfCollision<Binary64> result = customMethod.compute(xm, ym, sigmaX, sigmaY, radius);
835
836
837 Assertions.assertEquals(6.1e-3, result.getValue().getReal(), 1e-4);
838 }
839
840 @Test
841 @DisplayName(
842 "Test probability from a real CDM. It has been mentioned in https://forum.orekit.org/t/collision-package-in-development/2638/16"
843 + " and define an expected probability of collision of 0.004450713 which is higher than the value found using"
844 + " the methods provided in this ssa package because the CSpOC use the projection of a square containing the"
845 + " collision disk instead of the collision disk directly. Hence an overestimation of the probability of"
846 + " collision. This test serves as a non regression test")
847 void testReturnExpectedProbabilityFromACdmField() {
848
849
850 final String cdmPath = "/ccsds/cdm/ION_SCV8_vs_STARLINK_1233.txt";
851 final DataSource data = new DataSource(cdmPath, () -> getClass().getResourceAsStream(cdmPath));
852 final Cdm cdm = new ParserBuilder().buildCdmParser().parseMessage(data);
853
854
855 final Binary64 primaryRadius = new Binary64(5);
856 final Binary64 secondaryRadius = new Binary64(5);
857
858
859 final FieldProbabilityOfCollision<Binary64> result = method.compute(cdm, primaryRadius, secondaryRadius);
860
861
862 Assertions.assertEquals(0.0034965176443840893, result.getValue().getReal(), 1e-19);
863 }
864
865 @Test
866 @DisplayName("Test impact on the probability of collision of a slight difference in combined radius in Chan test case 4")
867 void testReturnExpectedValueWhenIntroducingSmallChangeOnCombinedRadius() {
868
869 final DSFactory factory = new DSFactory(1, 10);
870
871 final double xmNominal = 10;
872 final double ymNominal = 0;
873 final double sigmaXNominal = 25;
874 final double sigmaYNominal = 75;
875 final double radiusNominal = 5;
876 final double dRadius = 2.5;
877
878 final DerivativeStructure xm = factory.constant(xmNominal);
879 final DerivativeStructure ym = factory.constant(ymNominal);
880 final DerivativeStructure sigmaX = factory.constant(sigmaXNominal);
881 final DerivativeStructure sigmaY = factory.constant(sigmaYNominal);
882 final DerivativeStructure radius = factory.variable(0, radiusNominal);
883
884
885 final FieldProbabilityOfCollision<DerivativeStructure> resultNominal =
886 method.compute(xm, ym, sigmaX, sigmaY, radius);
887 final double taylorResult = resultNominal.getValue().taylor(dRadius);
888 final double exactResult =
889 method.compute(xmNominal, ymNominal, sigmaXNominal, sigmaYNominal, radiusNominal + dRadius).getValue();
890
891
892 Assertions.assertEquals(6.1e-3, resultNominal.getValue().getReal(), 1e-4);
893 Assertions.assertEquals(exactResult, taylorResult, 1e-16);
894 }
895
896 @Test
897 @DisplayName("Alfano test case 1 (CDM) from NASA CARA")
898 void AlfanoCDMTestCase01() {
899
900 String cdmName = "AlfanoTestCase01.cdm";
901 final double combinedHbr = 15.;
902
903
904 final double expectedPc = 0.146749549;
905 final double tolerance = 1e-6;
906
907 computeAndCheckCollisionProbability(cdmName, combinedHbr, expectedPc, tolerance);
908 }
909
910 @Test
911 @DisplayName("Alfano test case 2 (CDM) from NASA CARA")
912 void AlfanoCDMTestCase02() {
913
914 String cdmName = "AlfanoTestCase02.cdm";
915 final double combinedHbr = 4.;
916
917
918 final double expectedPc = 0.006222267;
919 final double tolerance = 1e-6;
920
921 computeAndCheckCollisionProbability(cdmName, combinedHbr, expectedPc, tolerance);
922 }
923
924 @Test
925 @DisplayName("Alfano test case 3 (CDM) from NASA CARA")
926 void AlfanoCDMTestCase03() {
927
928 String cdmName = "AlfanoTestCase03.cdm";
929 final double combinedHbr = 15.;
930
931
932 final double expectedPc = 0.100351176;
933 final double tolerance = 1e-6;
934
935 computeAndCheckCollisionProbability(cdmName, combinedHbr, expectedPc, tolerance);
936 }
937
938 @Test
939 @DisplayName("Alfano test case 4 (CDM) from NASA CARA")
940 void AlfanoCDMTestCase04() {
941
942 String cdmName = "AlfanoTestCase04.cdm";
943 final double combinedHbr = 15.;
944
945
946 final double expectedPc = 0.049323406;
947 final double tolerance = 1e-5;
948
949 computeAndCheckCollisionProbability(cdmName, combinedHbr, expectedPc, tolerance);
950 }
951
952 @Test
953 @DisplayName("Alfano test case 5 (CDM) from NASA CARA")
954 void AlfanoCDMTestCase05() {
955
956 String cdmName = "AlfanoTestCase05.cdm";
957 final double combinedHbr = 10.;
958
959
960 final double expectedPc = 0.044487386;
961 final double tolerance = 1e-5;
962
963 computeAndCheckCollisionProbability(cdmName, combinedHbr, expectedPc, tolerance);
964 }
965
966 @Test
967 @DisplayName("Alfano test case 6 (CDM) from NASA CARA")
968 void AlfanoCDMTestCase06() {
969
970 String cdmName = "AlfanoTestCase06.cdm";
971 final double combinedHbr = 10.;
972
973
974 final double expectedPc = 0.004335455;
975 final double tolerance = 1e-8;
976
977 computeAndCheckCollisionProbability(cdmName, combinedHbr, expectedPc, tolerance);
978 }
979
980 @Test
981 @DisplayName("Alfano test case 7 (CDM) from NASA CARA")
982 void AlfanoCDMTestCase07() {
983
984 String cdmName = "AlfanoTestCase07.cdm";
985 final double combinedHbr = 10.;
986
987
988 final double expectedPc = 0.000158147;
989 final double tolerance = 1e-9;
990
991 computeAndCheckCollisionProbability(cdmName, combinedHbr, expectedPc, tolerance);
992 }
993
994 @Test
995 @DisplayName("Alfano test case 8 (CDM) from NASA CARA")
996 void AlfanoCDMTestCase08() {
997
998 String cdmName = "AlfanoTestCase08.cdm";
999 final double combinedHbr = 4.;
1000
1001
1002 final double expectedPc = 0.036948008;
1003 final double tolerance = 1e-5;
1004
1005 computeAndCheckCollisionProbability(cdmName, combinedHbr, expectedPc, tolerance);
1006 }
1007
1008 @Test
1009 @DisplayName("Alfano test case 9 (CDM) from NASA CARA")
1010 void AlfanoCDMTestCase09() {
1011
1012 String cdmName = "AlfanoTestCase09.cdm";
1013 final double combinedHbr = 6.;
1014
1015
1016 final double expectedPc = 0.290146291;
1017 final double tolerance = 2e-5;
1018
1019 computeAndCheckCollisionProbability(cdmName, combinedHbr, expectedPc, tolerance);
1020 }
1021
1022
1023
1024 @Test
1025 @DisplayName("Alfano test case 11 (CDM) from NASA CARA")
1026 void AlfanoCDMTestCase11() {
1027
1028 String cdmName = "AlfanoTestCase11.cdm";
1029 final double combinedHbr = 4.;
1030
1031
1032 final double expectedPc = 0.002672026;
1033 final double tolerance = 1e-7;
1034
1035 computeAndCheckCollisionProbability(cdmName, combinedHbr, expectedPc, tolerance);
1036 }
1037
1038 private void computeAndCheckCollisionProbability(
1039 final String cdmName,
1040 final double combinedHbr,
1041 final double expected,
1042 final double tolerance) {
1043
1044
1045 final String cdmPath = "/ccsds/cdm/" + cdmName;
1046 final DataSource data = new DataSource(cdmPath, () -> getClass().getResourceAsStream(cdmPath));
1047 final Cdm cdm = new ParserBuilder().buildCdmParser().parseMessage(data);
1048
1049
1050 final ProbabilityOfCollision result = method.compute(cdm, combinedHbr);
1051
1052
1053 Assertions.assertEquals(expected, result.getValue(), tolerance);
1054 }
1055 }