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