1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation;
18
19 import java.util.Arrays;
20
21 import org.hipparchus.geometry.euclidean.threed.Vector3D;
22 import org.hipparchus.linear.MatrixUtils;
23 import org.hipparchus.linear.RealMatrix;
24 import org.hipparchus.ode.ODEIntegrator;
25 import org.hipparchus.ode.nonstiff.ClassicalRungeKuttaIntegrator;
26 import org.hipparchus.util.FastMath;
27 import org.junit.jupiter.api.Assertions;
28 import org.junit.jupiter.api.Test;
29 import org.junit.jupiter.params.ParameterizedTest;
30 import org.junit.jupiter.params.provider.EnumSource;
31 import org.orekit.Utils;
32 import org.orekit.forces.ForceModel;
33 import org.orekit.forces.gravity.HolmesFeatherstoneAttractionModel;
34 import org.orekit.forces.gravity.J2OnlyPerturbation;
35 import org.orekit.forces.gravity.potential.GravityFieldFactory;
36 import org.orekit.forces.gravity.potential.ICGEMFormatReader;
37 import org.orekit.forces.gravity.potential.NormalizedSphericalHarmonicsProvider;
38 import org.orekit.forces.gravity.potential.UnnormalizedSphericalHarmonicsProvider;
39 import org.orekit.frames.Frame;
40 import org.orekit.frames.FramesFactory;
41 import org.orekit.frames.LOFType;
42 import org.orekit.orbits.CartesianOrbit;
43 import org.orekit.orbits.Orbit;
44 import org.orekit.orbits.OrbitType;
45 import org.orekit.orbits.PositionAngleType;
46 import org.orekit.propagation.analytical.EcksteinHechlerPropagator;
47 import org.orekit.propagation.analytical.KeplerianPropagator;
48 import org.orekit.propagation.numerical.NumericalPropagator;
49 import org.orekit.propagation.semianalytical.dsst.DSSTHarvester;
50 import org.orekit.propagation.semianalytical.dsst.DSSTPropagator;
51 import org.orekit.propagation.semianalytical.dsst.forces.DSSTForceModel;
52 import org.orekit.propagation.semianalytical.dsst.forces.DSSTJ2SquaredClosedForm;
53 import org.orekit.propagation.semianalytical.dsst.forces.DSSTZonal;
54 import org.orekit.propagation.semianalytical.dsst.forces.ZeisModel;
55 import org.orekit.time.AbsoluteDate;
56 import org.orekit.time.TimeScalesFactory;
57 import org.orekit.utils.Constants;
58 import org.orekit.utils.IERSConventions;
59 import org.orekit.utils.PVCoordinates;
60
61 class StateCovarianceMatrixProviderTest {
62
63
64 private SpacecraftState initialState;
65
66
67 private RealMatrix initCov;
68
69
70 private RealMatrix refCovAfter60s;
71
72
73 void setUp() {
74 Utils.setDataRoot("orbit-determination/february-2016:potential/icgem-format");
75 GravityFieldFactory.addPotentialCoefficientsReader(new ICGEMFormatReader("eigen-6s-truncated", true));
76 Orbit initialOrbit = new CartesianOrbit(
77 new PVCoordinates(new Vector3D(7526993.581890527, -9646310.10026971, 1464110.4928112086),
78 new Vector3D(3033.79456099698, 1715.265069098717, -4447.658745923895)),
79 FramesFactory.getEME2000(),
80 new AbsoluteDate("2016-02-13T16:00:00.000", TimeScalesFactory.getUTC()),
81 Constants.WGS84_EARTH_MU);
82 initialState = new SpacecraftState(initialOrbit);
83 initCov = MatrixUtils.createRealMatrix( new double[][] {
84 { 8.651816029e+01, 5.689987127e+01, -2.763870764e+01, -2.435617201e-02, 2.058274137e-02, -5.872883051e-03 },
85 { 5.689987127e+01, 7.070624321e+01, 1.367120909e+01, -6.112622013e-03, 7.623626008e-03, -1.239413190e-02 },
86 { -2.763870764e+01, 1.367120909e+01, 1.811858898e+02, 3.143798992e-02, -4.963106559e-02, -7.420114385e-04 },
87 { -2.435617201e-02, -6.112622013e-03, 3.143798992e-02, 4.657077389e-05, 1.469943634e-05, 3.328475593e-05 },
88 { 2.058274137e-02, 7.623626008e-03, -4.963106559e-02, 1.469943634e-05, 3.950715934e-05, 2.516044258e-05 },
89 { -5.872883051e-03, -1.239413190e-02, -7.420114385e-04, 3.328475593e-05, 2.516044258e-05, 3.547466120e-05 }
90 });
91
92
93 refCovAfter60s = MatrixUtils.createRealMatrix( new double[][] {
94 { 5.770543135e+02, 2.316979550e+02, -5.172369105e+02, -2.585893247e-01, 2.113809017e-01, -1.759509343e-01 },
95 { 2.316979550e+02, 1.182942930e+02, -1.788422178e+02, -9.570305681e-02, 7.792155309e-02, -7.435822327e-02 },
96 { -5.172369105e+02, -1.788422178e+02, 6.996248500e+02, 2.633605389e-01, -2.480144888e-01, 1.908427233e-01 },
97 { -2.585893247e-01, -9.570305681e-02, 2.633605389e-01, 1.419148897e-04, -8.715858320e-05, 1.024944399e-04 },
98 { 2.113809017e-01, 7.792155309e-02, -2.480144888e-01, -8.715858320e-05, 1.069566588e-04, -5.667563856e-05 },
99 { -1.759509343e-01, -7.435822327e-02, 1.908427233e-01, 1.024944399e-04, -5.667563856e-05, 8.178356868e-05 }
100 });
101 }
102
103
104
105
106
107
108
109
110 private void compareCovariance(final RealMatrix reference, final RealMatrix computed, final double threshold) {
111 for (int row = 0; row < reference.getRowDimension(); row++) {
112 for (int column = 0; column < reference.getColumnDimension(); column++) {
113 if (reference.getEntry(row, column) == 0) {
114 Assertions.assertEquals(reference.getEntry(row, column), computed.getEntry(row, column),
115 threshold);
116 }
117 else {
118 Assertions.assertEquals(reference.getEntry(row, column), computed.getEntry(row, column),
119 FastMath.abs(threshold * reference.getEntry(row, column)));
120 }
121 }
122 }
123 }
124
125
126
127
128 @Test
129 void testWithNumericalPropagatorCartesian() {
130
131
132 setUp();
133
134
135 final double step = 60.0;
136 final ODEIntegrator integrator = new ClassicalRungeKuttaIntegrator(step);
137
138
139 final OrbitType propType = OrbitType.CARTESIAN;
140 final PositionAngleType angleType = PositionAngleType.MEAN;
141 final NumericalPropagator propagator = new NumericalPropagator(integrator);
142
143 final NormalizedSphericalHarmonicsProvider gravity = GravityFieldFactory.getNormalizedProvider(2, 0);
144 final ForceModel holmesFeatherstone =
145 new HolmesFeatherstoneAttractionModel(FramesFactory.getITRF(IERSConventions.IERS_2010, true), gravity);
146 propagator.addForceModel(holmesFeatherstone);
147
148
149 propagator.setOrbitType(propType);
150 propagator.setPositionAngleType(angleType);
151 propagator.setInitialState(initialState);
152
153
154 final StateCovarianceMatrixProvider provider = setUpCovariancePropagation(propagator);
155
156
157
158 final SpacecraftState propagated = propagator.propagate(initialState.getDate().shiftedBy(Constants.JULIAN_DAY));
159
160
161 final StateCovariance propagatedStateCov = provider.getStateCovariance(propagated);
162 final RealMatrix propagatedCov = propagatedStateCov.getMatrix();
163
164
165 compareCovariance(refCovAfter60s, propagatedCov, 4.0e-7);
166 Assertions.assertEquals(OrbitType.CARTESIAN, provider.getCovarianceOrbitType());
167 Assertions.assertEquals(OrbitType.CARTESIAN, propagatedStateCov.getOrbitType());
168 Assertions.assertNull(propagatedStateCov.getLOF());
169
170
171
172
173
174
175 final Frame frameB = FramesFactory.getTEME();
176
177
178 RealMatrix transformedCovA = provider.getStateCovariance(propagated, frameB).getMatrix();
179
180
181 RealMatrix transformedCovB =
182 propagatedStateCov.changeCovarianceFrame(propagated.getOrbit(), frameB).getMatrix();
183
184
185 compareCovariance(transformedCovA, transformedCovB, 1.0e-15);
186
187
188
189
190
191
192 final OrbitType outOrbitType = OrbitType.KEPLERIAN;
193 final PositionAngleType outAngleType = PositionAngleType.MEAN;
194
195
196 RealMatrix transformedCovC = provider.getStateCovariance(propagated, outOrbitType, outAngleType).getMatrix();
197
198
199 RealMatrix transformedCovD =
200 propagatedStateCov.changeCovarianceType(propagated.getOrbit(), outOrbitType, outAngleType).getMatrix();
201
202
203 compareCovariance(transformedCovC, transformedCovD, 1.0e-15);
204
205 }
206
207
208
209
210
211 @Test
212 void testAdditionalDataProvider() {
213
214
215 setUp();
216
217
218 final double step = 60.0;
219 final ODEIntegrator integrator = new ClassicalRungeKuttaIntegrator(step);
220
221
222 final NumericalPropagator propagator = new NumericalPropagator(integrator);
223
224 final NormalizedSphericalHarmonicsProvider gravity = GravityFieldFactory.getNormalizedProvider(2, 0);
225 final ForceModel j2OnlyPerturbation = new J2OnlyPerturbation(GravityFieldFactory.getUnnormalizedProvider(gravity),
226 FramesFactory.getITRF(IERSConventions.IERS_2010, true));
227 propagator.addForceModel(j2OnlyPerturbation);
228 propagator.setInitialState(initialState);
229
230
231 final StateCovarianceMatrixProvider provider = setUpCovariancePropagation(propagator);
232
233
234 final SpacecraftState propagated = propagator.propagate(initialState.getDate().shiftedBy(Constants.JULIAN_DAY));
235
236
237 final RealMatrix propagatedCov = provider.getAdditionalData(propagated);
238
239
240 compareCovariance(refCovAfter60s, propagatedCov, 3.0e-5);
241 Assertions.assertEquals(OrbitType.CARTESIAN, provider.getCovarianceOrbitType());
242 }
243
244 @ParameterizedTest
245 @EnumSource(value = LOFType.class, names = {"QSW", "NTW", "LVLH", "TNW"})
246 void testStmLof(final LOFType lofType) {
247
248 setUp();
249 final NumericalPropagator propagator = new NumericalPropagator(new ClassicalRungeKuttaIntegrator(100));
250 propagator.resetInitialState(initialState);
251 propagator.setOrbitType(OrbitType.EQUINOCTIAL);
252 final MatricesHarvester harvester = propagator.setupMatricesComputation("stm", null, null);
253 final StateCovariance initialCovariance = new StateCovariance(MatrixUtils.createRealIdentityMatrix(6).scalarMultiply(1e-2),
254 initialState.getDate(), lofType);
255 final StateCovarianceMatrixProvider provider =
256 new StateCovarianceMatrixProvider("cov", "stm", harvester, initialCovariance);
257 propagator.setInitialState(initialState);
258 propagator.addAdditionalDataProvider(provider);
259
260 final SpacecraftState sameState = propagator.propagate(initialState.getDate());
261
262 final StateCovariance actualCovariance = provider.getStateCovariance(sameState);
263 Assertions.assertEquals(initialCovariance.getDate(), actualCovariance.getDate());
264 Assertions.assertEquals(initialCovariance.getLOF(), actualCovariance.getLOF());
265 Assertions.assertEquals(initialCovariance.getFrame(), actualCovariance.getFrame());
266 Assertions.assertEquals(initialCovariance.getOrbitType(), actualCovariance.getOrbitType());
267 }
268
269
270
271
272
273 @Test
274 void testWithNumericalPropagatorDefault() {
275
276
277 setUp();
278
279
280 final double step = 60.0;
281 final ODEIntegrator integrator = new ClassicalRungeKuttaIntegrator(step);
282
283
284 final NumericalPropagator propagator = new NumericalPropagator(integrator);
285
286 final NormalizedSphericalHarmonicsProvider gravity = GravityFieldFactory.getNormalizedProvider(2, 0);
287 final ForceModel holmesFeatherstone =
288 new HolmesFeatherstoneAttractionModel(FramesFactory.getITRF(IERSConventions.IERS_2010, true), gravity);
289 propagator.addForceModel(holmesFeatherstone);
290 propagator.setInitialState(initialState);
291
292
293 final StateCovarianceMatrixProvider provider = setUpCovariancePropagation(propagator);
294
295
296 final SpacecraftState propagated = propagator.propagate(initialState.getDate().shiftedBy(Constants.JULIAN_DAY));
297
298
299 final StateCovariance propagatedStateCov = provider.getStateCovariance(propagated);
300 final RealMatrix propagatedCov = propagatedStateCov.getMatrix();
301
302
303 compareCovariance(refCovAfter60s, propagatedCov, 3.0e-5);
304 Assertions.assertEquals(OrbitType.CARTESIAN, provider.getCovarianceOrbitType());
305
306
307
308
309
310
311 final Frame frameB = FramesFactory.getTEME();
312
313
314 RealMatrix transformedCovA = provider.getStateCovariance(propagated, frameB).getMatrix();
315
316
317 RealMatrix transformedCovB =
318 propagatedStateCov.changeCovarianceFrame(propagated.getOrbit(), frameB).getMatrix();
319
320
321 compareCovariance(transformedCovA, transformedCovB, 1.0e-15);
322
323
324
325
326
327
328 final OrbitType outOrbitType = OrbitType.KEPLERIAN;
329 final PositionAngleType outAngleType = PositionAngleType.MEAN;
330
331
332 RealMatrix transformedCovC = provider.getStateCovariance(propagated, outOrbitType, outAngleType).getMatrix();
333
334
335 RealMatrix transformedCovD =
336 propagatedStateCov.changeCovarianceType(propagated.getOrbit(), outOrbitType, outAngleType).getMatrix();
337
338
339 compareCovariance(transformedCovC, transformedCovD, 1.0e-15);
340
341 }
342
343
344
345
346
347
348
349
350 @Test
351 void testWithNumericalPropagatorDefaultAndKeplerianOrbitType() {
352
353
354 setUp();
355
356
357 final double step = 60.0;
358 final ODEIntegrator integrator = new ClassicalRungeKuttaIntegrator(step);
359
360
361 final String stmName = "STM";
362 final NumericalPropagator propagator = new NumericalPropagator(integrator);
363
364 final NormalizedSphericalHarmonicsProvider gravity = GravityFieldFactory.getNormalizedProvider(2, 0);
365 final ForceModel holmesFeatherstone =
366 new HolmesFeatherstoneAttractionModel(FramesFactory.getITRF(IERSConventions.IERS_2010, true), gravity);
367 propagator.addForceModel(holmesFeatherstone);
368
369 final MatricesHarvester harvester = propagator.setupMatricesComputation(stmName, null, null);
370
371
372 final String additionalName = "cartCov";
373 final StateCovariance initialStateCovariance = new StateCovariance(initCov, initialState.getDate(), initialState.getFrame(), OrbitType.CARTESIAN, PositionAngleType.MEAN);
374 final StateCovariance initialStateCovarianceInKep = initialStateCovariance.changeCovarianceType(initialState.getOrbit(), OrbitType.KEPLERIAN, PositionAngleType.MEAN);
375 final StateCovarianceMatrixProvider provider =
376 new StateCovarianceMatrixProvider(additionalName, stmName, harvester, initialStateCovarianceInKep);
377 propagator.setInitialState(initialState);
378 propagator.addAdditionalDataProvider(provider);
379
380
381 final SpacecraftState propagated = propagator.propagate(initialState.getDate().shiftedBy(Constants.JULIAN_DAY));
382
383
384 final StateCovariance propagatedStateCov = provider.getStateCovariance(propagated);
385 final StateCovariance propagatedStateCovInCart = propagatedStateCov.changeCovarianceType(propagated.getOrbit(), OrbitType.CARTESIAN, PositionAngleType.MEAN);
386 final RealMatrix propagatedCovInCart = propagatedStateCovInCart.getMatrix();
387
388
389 compareCovariance(refCovAfter60s, propagatedCovInCart, 3.0e-5);
390 Assertions.assertEquals(OrbitType.KEPLERIAN, provider.getCovarianceOrbitType());
391 Assertions.assertEquals(OrbitType.KEPLERIAN, propagatedStateCov.getOrbitType());
392
393 }
394
395
396
397
398 @Test
399 void testWithAnalyticalPropagator() {
400
401
402 setUp();
403
404
405 final EcksteinHechlerPropagator propagator = new EcksteinHechlerPropagator(initialState.getOrbit(),
406 GravityFieldFactory.getUnnormalizedProvider(6, 0));
407
408
409 final StateCovarianceMatrixProvider provider = setUpCovariancePropagation(propagator);
410
411
412 final SpacecraftState propagated = propagator.propagate(initialState.getDate().shiftedBy(Constants.JULIAN_DAY));
413
414
415 final StateCovariance propagatedStateCov = provider.getStateCovariance(propagated);
416 final RealMatrix propagatedCov = propagatedStateCov.getMatrix();
417
418
419 compareCovariance(refCovAfter60s, propagatedCov, 5.0e-4);
420 Assertions.assertEquals(OrbitType.CARTESIAN, provider.getCovarianceOrbitType());
421
422
423
424
425
426
427 final Frame frameB = FramesFactory.getTEME();
428
429
430 RealMatrix transformedCovA = provider.getStateCovariance(propagated, frameB).getMatrix();
431
432
433 RealMatrix transformedCovB =
434 propagatedStateCov.changeCovarianceFrame(propagated.getOrbit(), frameB).getMatrix();
435
436
437 compareCovariance(transformedCovA, transformedCovB, 1.0e-15);
438
439
440
441
442
443
444 final OrbitType outOrbitType = OrbitType.KEPLERIAN;
445 final PositionAngleType outAngleType = PositionAngleType.MEAN;
446
447
448 RealMatrix transformedCovC = provider.getStateCovariance(propagated, outOrbitType, outAngleType).getMatrix();
449
450
451 RealMatrix transformedCovD =
452 propagatedStateCov.changeCovarianceType(propagated.getOrbit(), outOrbitType, outAngleType).getMatrix();
453
454
455 compareCovariance(transformedCovC, transformedCovD, 1.0e-15);
456
457 }
458
459
460
461
462 @Test
463 void testWithDSSTPropagatorDefault() {
464
465
466 setUp();
467
468
469 final double step = 3600.0;
470 final ODEIntegrator integrator = new ClassicalRungeKuttaIntegrator(step);
471
472
473 final String stmName = "STM";
474 final DSSTPropagator propagator = new DSSTPropagator(integrator, PropagationType.OSCULATING);
475
476 final UnnormalizedSphericalHarmonicsProvider gravity = GravityFieldFactory.getUnnormalizedProvider(2, 0);
477 final DSSTForceModel zonal = new DSSTZonal(gravity);
478 propagator.addForceModel(zonal);
479 propagator.addForceModel(new DSSTJ2SquaredClosedForm(new ZeisModel(), gravity));
480
481 final DSSTHarvester harvester = (DSSTHarvester) propagator.setupMatricesComputation(stmName, null, null);
482 harvester.initializeFieldShortPeriodTerms(DSSTPropagator.computeMeanState(initialState, propagator.getAttitudeProvider(), Arrays.asList(zonal)));
483
484
485 final String additionalName = "cartCov";
486 final StateCovariance initialStateCovariance = new StateCovariance(initCov, initialState.getDate(), initialState.getFrame(), OrbitType.CARTESIAN, PositionAngleType.MEAN);
487 final StateCovarianceMatrixProvider provider =
488 new StateCovarianceMatrixProvider(additionalName, stmName, harvester, initialStateCovariance);
489 propagator.setInitialState(initialState);
490 propagator.addAdditionalDataProvider(provider);
491
492
493 final SpacecraftState propagated = propagator.propagate(initialState.getDate().shiftedBy(Constants.JULIAN_DAY));
494
495
496 final StateCovariance propagatedStateCov = provider.getStateCovariance(propagated);
497 final RealMatrix propagatedCov = propagatedStateCov.getMatrix();
498
499
500 compareCovariance(refCovAfter60s, propagatedCov, 0.03);
501 Assertions.assertEquals(OrbitType.CARTESIAN, provider.getCovarianceOrbitType());
502 }
503
504
505
506
507
508 @Test
509 void testCovarianceShift() {
510
511
512 setUp();
513
514
515 final KeplerianPropagator propagator = new KeplerianPropagator(initialState.getOrbit());
516 final double dt = 60.0;
517
518
519 final StateCovarianceMatrixProvider provider = setUpCovariancePropagation(propagator);
520
521
522 final SpacecraftState propagated = propagator.propagate(initialState.getDate().shiftedBy(dt));
523
524
525 final StateCovariance propagatedStateCov = provider.getStateCovariance(propagated);
526 final RealMatrix propagatedCov = propagatedStateCov.getMatrix();
527
528
529 final StateCovariance initialStateCovariance = new StateCovariance(initCov, initialState.getDate(), initialState.getFrame(), OrbitType.CARTESIAN, PositionAngleType.MEAN);
530 final StateCovariance shiftedStateCov = initialStateCovariance.shiftedBy(initialState.getOrbit(), dt);
531 final RealMatrix shiftedCov = shiftedStateCov.getMatrix();
532
533
534 compareCovariance(propagatedCov, shiftedCov, 4.0e-12);
535 Assertions.assertEquals(propagatedStateCov.getDate(), shiftedStateCov.getDate());
536 Assertions.assertEquals(propagatedStateCov.getOrbitType(), shiftedStateCov.getOrbitType());
537 Assertions.assertEquals(propagatedStateCov.getPositionAngleType(), shiftedStateCov.getPositionAngleType());
538 }
539
540
541
542
543
544
545
546
547
548 @Test
549 void testIssue1253_IntegratedPropagator() {
550
551
552
553
554
555 setUp();
556
557
558 final double dt = 3600.0;
559 final AbsoluteDate propDate = initialState.getDate().shiftedBy(dt);
560
561
562 final OrbitType propType = OrbitType.CARTESIAN;
563 final PositionAngleType angleType = PositionAngleType.MEAN;
564 NumericalPropagator propagator = new NumericalPropagator(new ClassicalRungeKuttaIntegrator(60.));
565 propagator.setOrbitType(propType);
566 propagator.setPositionAngleType(angleType);
567 propagator.setInitialState(initialState);
568 StateCovarianceMatrixProvider provider = setUpCovariancePropagation(propagator);
569
570
571 SpacecraftState propagated = propagator.propagate(propDate);
572
573
574 final StateCovariance refPropagatedStateCov = provider.getStateCovariance(propagated);
575 final RealMatrix refPropagatedCov = refPropagatedStateCov.getMatrix();
576
577
578
579
580
581 propagator = new NumericalPropagator(new ClassicalRungeKuttaIntegrator(60.));
582 propagator.setOrbitType(propType);
583 propagator.setPositionAngleType(angleType);
584 propagator.setInitialState(initialState);
585 provider = setUpCovariancePropagation(propagator);
586
587
588 final EphemerisGenerator generator = propagator.getEphemerisGenerator();
589 propagator.propagate(propDate);
590 final BoundedPropagator ephemeris = generator.getGeneratedEphemeris();
591
592
593 propagated = ephemeris.propagate(propDate);
594 final StateCovariance propagatedStateCov = provider.getStateCovariance(propagated);
595 final RealMatrix propagatedCov = provider.getStateCovariance(propagated).getMatrix();
596
597
598
599
600
601
602 Assertions.assertEquals(refPropagatedStateCov.getDate(), propagatedStateCov.getDate());
603 Assertions.assertEquals(refPropagatedStateCov.getOrbitType(), propagatedStateCov.getOrbitType());
604 Assertions.assertEquals(refPropagatedStateCov.getPositionAngleType(), propagatedStateCov.getPositionAngleType());
605 compareCovariance(refPropagatedCov, propagatedCov, 0.);
606 }
607
608
609
610
611
612
613 @Test
614 void testIssue1253_AnalyticalPropagator() {
615
616
617
618
619
620 setUp();
621
622
623 final double dt = 3600.0;
624 final AbsoluteDate propDate = initialState.getDate().shiftedBy(dt);
625
626
627 Propagator propagator = new KeplerianPropagator(initialState.getOrbit());
628 StateCovarianceMatrixProvider provider = setUpCovariancePropagation(propagator);
629
630
631 SpacecraftState propagated = propagator.propagate(propDate);
632
633
634 final StateCovariance refPropagatedStateCov = provider.getStateCovariance(propagated);
635 final RealMatrix refPropagatedCov = refPropagatedStateCov.getMatrix();
636
637
638
639
640
641 propagator = new KeplerianPropagator(initialState.getOrbit());
642 provider = setUpCovariancePropagation(propagator);
643
644
645 final EphemerisGenerator generator = propagator.getEphemerisGenerator();
646 propagator.propagate(propDate);
647 final BoundedPropagator ephemeris = generator.getGeneratedEphemeris();
648
649
650 propagated = ephemeris.propagate(propDate);
651 final StateCovariance propagatedStateCov = provider.getStateCovariance(propagated);
652 final RealMatrix propagatedCov = provider.getStateCovariance(propagated).getMatrix();
653
654
655
656
657
658
659 Assertions.assertEquals(refPropagatedStateCov.getDate(), propagatedStateCov.getDate());
660 Assertions.assertEquals(refPropagatedStateCov.getOrbitType(), propagatedStateCov.getOrbitType());
661 Assertions.assertEquals(refPropagatedStateCov.getPositionAngleType(), propagatedStateCov.getPositionAngleType());
662 compareCovariance(refPropagatedCov, propagatedCov, 0.);
663 }
664
665
666
667
668
669
670 private StateCovarianceMatrixProvider setUpCovariancePropagation(final Propagator propagator) {
671
672 final String stmName = "STM";
673 final String additionalName = "cartCov";
674
675
676 final MatricesHarvester harvester = propagator.setupMatricesComputation(stmName, null, null);
677
678
679 final StateCovariance initialStateCovariance = new StateCovariance(initCov, initialState.getDate(), initialState.getFrame(), OrbitType.CARTESIAN, PositionAngleType.MEAN);
680 final StateCovarianceMatrixProvider provider =
681 new StateCovarianceMatrixProvider(additionalName, stmName, harvester, initialStateCovariance);
682 propagator.addAdditionalDataProvider(provider);
683
684 return provider;
685 }
686
687 }