1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.analytical.gnss;
18
19 import org.hipparchus.analysis.differentiation.UnivariateDerivative2;
20 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
21 import org.hipparchus.geometry.euclidean.threed.Vector3D;
22 import org.hipparchus.util.FastMath;
23 import org.hipparchus.util.FieldSinCos;
24 import org.hipparchus.util.MathArrays;
25 import org.hipparchus.util.MathUtils;
26 import org.hipparchus.util.Precision;
27 import org.orekit.attitudes.AttitudeProvider;
28 import org.orekit.data.DataContext;
29 import org.orekit.errors.OrekitException;
30 import org.orekit.errors.OrekitMessages;
31 import org.orekit.frames.Frame;
32 import org.orekit.orbits.CartesianOrbit;
33 import org.orekit.orbits.Orbit;
34 import org.orekit.propagation.SpacecraftState;
35 import org.orekit.propagation.analytical.AbstractAnalyticalPropagator;
36 import org.orekit.propagation.analytical.gnss.data.GLONASSOrbitalElements;
37 import org.orekit.propagation.analytical.gnss.data.GNSSConstants;
38 import org.orekit.time.AbsoluteDate;
39 import org.orekit.time.GLONASSDate;
40 import org.orekit.time.TimeScale;
41 import org.orekit.utils.PVCoordinates;
42
43
44
45
46
47
48
49
50
51
52
53 public class GLONASSAnalyticalPropagator extends AbstractAnalyticalPropagator {
54
55
56
57 private static final double SEVEN_THIRD = 7.0 / 3.0;
58
59
60 private static final double SEVEN_SIXTH = 7.0 / 6.0;
61
62
63 private static final double SEVEN_24TH = 7.0 / 24.0;
64
65
66 private static final double FN_72TH = 49.0 / 72.0;
67
68
69 private static final double GLONASS_AV = 7.2921150e-5;
70
71
72 private static final double GLONASS_MEAN_INCLINATION = 64.8;
73
74
75 private static final double GLONASS_MEAN_DRACONIAN_PERIOD = 40544;
76
77
78 private static final double GLONASS_J20 = 1.08262575e-3;
79
80
81 private static final double GLONASS_EARTH_EQUATORIAL_RADIUS = 6378136;
82
83
84
85 private static final double A;
86
87
88 private static final double B;
89
90 static {
91 final double k1 = 3 * FastMath.PI + 2;
92 final double k2 = FastMath.PI - 1;
93 final double k3 = 6 * FastMath.PI - 1;
94 A = 3 * k2 * k2 / k1;
95 B = k3 * k3 / (6 * k1);
96 }
97
98
99 private final GLONASSOrbitalElements glonassOrbit;
100
101
102 private final double mass;
103
104
105 private final Frame eci;
106
107
108 private final Frame ecef;
109
110
111 private final DataContext dataContext;
112
113
114
115
116
117
118
119
120
121
122 GLONASSAnalyticalPropagator(final GLONASSOrbitalElements glonassOrbit, final Frame eci,
123 final Frame ecef, final AttitudeProvider provider,
124 final double mass, final DataContext context) {
125 super(provider);
126 this.dataContext = context;
127
128 this.glonassOrbit = glonassOrbit;
129
130 setStartDate(glonassOrbit.getDate());
131
132 this.mass = mass;
133
134 this.eci = eci;
135
136 this.ecef = ecef;
137 }
138
139
140
141
142
143
144
145
146
147
148
149 public PVCoordinates propagateInEcef(final AbsoluteDate date) {
150
151
152 final UnivariateDerivative2 dTpr = getdTpr(date);
153
154
155 final UnivariateDerivative2 zero = dTpr.getField().getZero();
156
157
158 final UnivariateDerivative2 w = FastMath.floor(dTpr.divide(GLONASS_MEAN_DRACONIAN_PERIOD + glonassOrbit.getDeltaT()));
159
160
161 final UnivariateDerivative2 i = zero.add(GLONASS_MEAN_INCLINATION / 180 * GNSSConstants.GLONASS_PI + glonassOrbit.getDeltaI());
162
163
164 final UnivariateDerivative2 e = zero.add(glonassOrbit.getE());
165
166
167 final UnivariateDerivative2 tDR = w.multiply(2.0).add(1.0).multiply(glonassOrbit.getDeltaTDot()).
168 add(glonassOrbit.getDeltaT()).
169 add(GLONASS_MEAN_DRACONIAN_PERIOD);
170 final UnivariateDerivative2 n = tDR.divide(2.0 * GNSSConstants.GLONASS_PI).reciprocal();
171
172
173 final UnivariateDerivative2 sma = computeSma(tDR, i, e);
174
175
176 final UnivariateDerivative2 p = sma.multiply(e.multiply(e).negate().add(1.0));
177 final UnivariateDerivative2 aeop = p.divide(GLONASS_EARTH_EQUATORIAL_RADIUS).reciprocal();
178 final UnivariateDerivative2 aeop2 = aeop.multiply(aeop);
179
180
181 final UnivariateDerivative2 lambda = computeLambda(dTpr, n, aeop2, i);
182
183
184 final UnivariateDerivative2 pa = computePA(dTpr, n, aeop2, i);
185
186
187 final UnivariateDerivative2 tanPAo2 = FastMath.tan(pa.divide(2.0));
188 final UnivariateDerivative2 coef = tanPAo2.multiply(FastMath.sqrt(e.negate().add(1.0).divide(e.add(1.0))));
189 final UnivariateDerivative2 e0 = FastMath.atan(coef).multiply(2.0).negate();
190 final UnivariateDerivative2 m1 = pa.add(e0).subtract(FastMath.sin(e0).multiply(e));
191
192
193 final UnivariateDerivative2 correction = dTpr.
194 subtract(w.multiply(GLONASS_MEAN_DRACONIAN_PERIOD + glonassOrbit.getDeltaT())).
195 subtract(w.multiply(w).multiply(glonassOrbit.getDeltaTDot()));
196 final UnivariateDerivative2 m = m1.add(n.multiply(correction));
197
198
199 final FieldSinCos<UnivariateDerivative2> scPa = FastMath.sinCos(pa);
200 final UnivariateDerivative2 h = e.multiply(scPa.sin());
201 final UnivariateDerivative2 l = e.multiply(scPa.cos());
202
203 final UnivariateDerivative2[] d1 = getParameterDifferentials(sma, i, h, l, m1);
204
205 final UnivariateDerivative2[] d2 = getParameterDifferentials(sma, i, h, l, m);
206
207 final UnivariateDerivative2 smaCorr = sma.add(d2[0]).subtract(d1[0]);
208 final UnivariateDerivative2 hCorr = h.add(d2[1]).subtract(d1[1]);
209 final UnivariateDerivative2 lCorr = l.add(d2[2]).subtract(d1[2]);
210 final UnivariateDerivative2 lambdaCorr = lambda.add(d2[3]).subtract(d1[3]);
211 final UnivariateDerivative2 iCorr = i.add(d2[4]).subtract(d1[4]);
212 final UnivariateDerivative2 mCorr = m.add(d2[5]).subtract(d1[5]);
213 final UnivariateDerivative2 eCorr = FastMath.sqrt(hCorr.multiply(hCorr).add(lCorr.multiply(lCorr)));
214 final UnivariateDerivative2 paCorr;
215 if (eCorr.getValue() == 0.) {
216 paCorr = zero;
217 } else {
218 if (lCorr.getValue() == eCorr.getValue()) {
219 paCorr = zero.add(0.5 * GNSSConstants.GLONASS_PI);
220 } else if (lCorr.getValue() == -eCorr.getValue()) {
221 paCorr = zero.add(-0.5 * GNSSConstants.GLONASS_PI);
222 } else {
223 paCorr = FastMath.atan2(hCorr, lCorr);
224 }
225 }
226
227
228 final UnivariateDerivative2 mk = mCorr.subtract(paCorr);
229 final UnivariateDerivative2 ek = getEccentricAnomaly(mk, eCorr);
230
231
232 final UnivariateDerivative2 vk = getTrueAnomaly(ek, eCorr);
233
234
235 final UnivariateDerivative2 phik = vk.add(paCorr);
236
237
238 final UnivariateDerivative2 pCorr = smaCorr.multiply(eCorr.multiply(eCorr).negate().add(1.0));
239 final UnivariateDerivative2 rk = pCorr.divide(eCorr.multiply(FastMath.cos(vk)).add(1.0));
240
241
242 final FieldSinCos<UnivariateDerivative2> scPhik = FastMath.sinCos(phik);
243 final UnivariateDerivative2 xk = scPhik.cos().multiply(rk);
244 final UnivariateDerivative2 yk = scPhik.sin().multiply(rk);
245
246
247 final FieldSinCos<UnivariateDerivative2> scL = FastMath.sinCos(lambdaCorr);
248 final FieldSinCos<UnivariateDerivative2> scI = FastMath.sinCos(iCorr);
249 final FieldVector3D<UnivariateDerivative2> positionwithDerivatives =
250 new FieldVector3D<>(xk.multiply(scL.cos()).subtract(yk.multiply(scL.sin()).multiply(scI.cos())),
251 xk.multiply(scL.sin()).add(yk.multiply(scL.cos()).multiply(scI.cos())),
252 yk.multiply(scI.sin()));
253
254 return new PVCoordinates(new Vector3D(positionwithDerivatives.getX().getValue(),
255 positionwithDerivatives.getY().getValue(),
256 positionwithDerivatives.getZ().getValue()),
257 new Vector3D(positionwithDerivatives.getX().getFirstDerivative(),
258 positionwithDerivatives.getY().getFirstDerivative(),
259 positionwithDerivatives.getZ().getFirstDerivative()),
260 new Vector3D(positionwithDerivatives.getX().getSecondDerivative(),
261 positionwithDerivatives.getY().getSecondDerivative(),
262 positionwithDerivatives.getZ().getSecondDerivative()));
263 }
264
265
266
267
268
269
270
271
272
273
274
275
276 private UnivariateDerivative2 getEccentricAnomaly(final UnivariateDerivative2 mk, final UnivariateDerivative2 e) {
277
278
279 final UnivariateDerivative2 reducedM = new UnivariateDerivative2(MathUtils.normalizeAngle(mk.getValue(), 0.0),
280 mk.getFirstDerivative(),
281 mk.getSecondDerivative());
282
283
284 UnivariateDerivative2 ek;
285 if (FastMath.abs(reducedM.getValue()) < 1.0 / 6.0) {
286 if (FastMath.abs(reducedM.getValue()) < Precision.SAFE_MIN) {
287
288
289
290 ek = reducedM;
291 } else {
292
293 ek = reducedM.add(reducedM.multiply(6).cbrt().subtract(reducedM).multiply(e));
294 }
295 } else {
296 if (reducedM.getValue() < 0) {
297 final UnivariateDerivative2 w = reducedM.add(FastMath.PI);
298 ek = reducedM.add(w.multiply(-A).divide(w.subtract(B)).subtract(FastMath.PI).subtract(reducedM).multiply(e));
299 } else {
300 final UnivariateDerivative2 minusW = reducedM.subtract(FastMath.PI);
301 ek = reducedM.add(minusW.multiply(A).divide(minusW.add(B)).add(FastMath.PI).subtract(reducedM).multiply(e));
302 }
303 }
304
305 final UnivariateDerivative2 e1 = e.negate().add(1.0);
306 final boolean noCancellationRisk = (e1.getValue() + ek.getValue() * ek.getValue() / 6) >= 0.1;
307
308
309 for (int j = 0; j < 2; ++j) {
310 final UnivariateDerivative2 f;
311 UnivariateDerivative2 fd;
312 final UnivariateDerivative2 fdd = ek.sin().multiply(e);
313 final UnivariateDerivative2 fddd = ek.cos().multiply(e);
314 if (noCancellationRisk) {
315 f = ek.subtract(fdd).subtract(reducedM);
316 fd = fddd.subtract(1).negate();
317 } else {
318 f = eMeSinE(ek, e).subtract(reducedM);
319 final UnivariateDerivative2 s = ek.multiply(0.5).sin();
320 fd = s.multiply(s).multiply(e.multiply(2.0)).add(e1);
321 }
322 final UnivariateDerivative2 dee = f.multiply(fd).divide(f.multiply(0.5).multiply(fdd).subtract(fd.multiply(fd)));
323
324
325 final UnivariateDerivative2 w = fd.add(dee.multiply(0.5).multiply(fdd.add(dee.multiply(fdd).divide(3))));
326 fd = fd.add(dee.multiply(fdd.add(dee.multiply(0.5).multiply(fdd))));
327 ek = ek.subtract(f.subtract(dee.multiply(fd.subtract(w))).divide(fd));
328 }
329
330
331 ek = ek.add(mk.getValue() - reducedM.getValue());
332
333
334 return ek;
335 }
336
337
338
339
340
341
342
343
344 private UnivariateDerivative2 eMeSinE(final UnivariateDerivative2 E, final UnivariateDerivative2 ecc) {
345 UnivariateDerivative2 x = E.sin().multiply(ecc.negate().add(1.0));
346 final UnivariateDerivative2 mE2 = E.negate().multiply(E);
347 UnivariateDerivative2 term = E;
348 UnivariateDerivative2 d = E.getField().getZero();
349
350 for (UnivariateDerivative2 x0 = d.add(Double.NaN); !Double.valueOf(x.getValue()).equals(Double.valueOf(x0.getValue()));) {
351 d = d.add(2);
352 term = term.multiply(mE2.divide(d.multiply(d.add(1))));
353 x0 = x;
354 x = x.subtract(term);
355 }
356 return x;
357 }
358
359
360
361
362
363
364
365 private UnivariateDerivative2 getTrueAnomaly(final UnivariateDerivative2 ek, final UnivariateDerivative2 ecc) {
366 final UnivariateDerivative2 svk = ek.sin().multiply(FastMath.sqrt( ecc.multiply(ecc).negate().add(1.0)));
367 final UnivariateDerivative2 cvk = ek.cos().subtract(ecc);
368 return svk.atan2(cvk);
369 }
370
371
372
373
374
375
376
377 private UnivariateDerivative2 getdTpr(final AbsoluteDate date) {
378 final TimeScale glonass = dataContext.getTimeScales().getGLONASS();
379 final GLONASSDate tEnd = new GLONASSDate(date, glonass);
380 final GLONASSDate tSta = new GLONASSDate(glonassOrbit.getDate(), glonass);
381 final int n = tEnd.getDayNumber();
382 final int na = tSta.getDayNumber();
383 final int deltaN;
384 if (na == 27) {
385 deltaN = n - na - FastMath.round((float) (n - na) / 1460) * 1460;
386 } else {
387 deltaN = n - na - FastMath.round((float) (n - na) / 1461) * 1461;
388 }
389 final UnivariateDerivative2 ti = new UnivariateDerivative2(tEnd.getSecInDay(), 1.0, 0.0);
390
391 return ti.subtract(glonassOrbit.getTime()).add(86400 * deltaN);
392 }
393
394
395
396
397
398
399
400
401 private UnivariateDerivative2 computeSma(final UnivariateDerivative2 tDR,
402 final UnivariateDerivative2 i,
403 final UnivariateDerivative2 e) {
404
405
406 final UnivariateDerivative2 zero = tDR.getField().getZero();
407
408
409
410
411 if (Double.isNaN(tDR.getValue()) || Double.isNaN(i.getValue()) || Double.isNaN(e.getValue())) {
412 return zero.add(Double.NaN);
413 }
414
415
416 final UnivariateDerivative2 sinI = FastMath.sin(i);
417 final UnivariateDerivative2 sin2I = sinI.multiply(sinI);
418 final UnivariateDerivative2 ome2 = e.multiply(e).negate().add(1.0);
419 final UnivariateDerivative2 ome2Pow3o2 = FastMath.sqrt(ome2).multiply(ome2);
420 final UnivariateDerivative2 pa = zero.add(glonassOrbit.getPa());
421 final UnivariateDerivative2 cosPA = FastMath.cos(pa);
422 final UnivariateDerivative2 opecosPA = e.multiply(cosPA).add(1.0);
423 final UnivariateDerivative2 opecosPAPow2 = opecosPA.multiply(opecosPA);
424 final UnivariateDerivative2 opecosPAPow3 = opecosPAPow2.multiply(opecosPA);
425
426
427 UnivariateDerivative2 tOCK = tDR;
428
429
430
431 UnivariateDerivative2 an = zero;
432 UnivariateDerivative2 anp1 = zero;
433 boolean isLastStep = false;
434 while (!isLastStep) {
435
436
437 final UnivariateDerivative2 tOCKo2p = tOCK.divide(2.0 * GNSSConstants.GLONASS_PI);
438 final UnivariateDerivative2 tOCKo2pPow2 = tOCKo2p.multiply(tOCKo2p);
439 anp1 = FastMath.cbrt(tOCKo2pPow2.multiply(GNSSConstants.GLONASS_MU));
440
441
442 final UnivariateDerivative2 p = anp1.multiply(ome2);
443
444
445 final UnivariateDerivative2 aeop = p.divide(GLONASS_EARTH_EQUATORIAL_RADIUS).reciprocal();
446 final UnivariateDerivative2 aeop2 = aeop.multiply(aeop);
447 final UnivariateDerivative2 term1 = aeop2.multiply(GLONASS_J20).multiply(1.5);
448 final UnivariateDerivative2 term2 = sin2I.multiply(2.5).negate().add(2.0);
449 final UnivariateDerivative2 term3 = ome2Pow3o2.divide(opecosPAPow2);
450 final UnivariateDerivative2 term4 = opecosPAPow3.divide(ome2);
451 tOCK = tDR.divide(term1.multiply(term2.multiply(term3).add(term4)).negate().add(1.0));
452
453
454 if (FastMath.abs(anp1.subtract(an).getReal()) <= 0.01) {
455 isLastStep = true;
456 }
457
458 an = anp1;
459 }
460
461 return an;
462
463 }
464
465
466
467
468
469
470
471
472
473 private UnivariateDerivative2 computeLambda(final UnivariateDerivative2 dTpr,
474 final UnivariateDerivative2 n,
475 final UnivariateDerivative2 aeop2,
476 final UnivariateDerivative2 i) {
477 final UnivariateDerivative2 cosI = FastMath.cos(i);
478 final UnivariateDerivative2 precession = aeop2.multiply(n).multiply(cosI).multiply(1.5 * GLONASS_J20);
479 return dTpr.multiply(precession.add(GLONASS_AV)).negate().add(glonassOrbit.getLambda());
480 }
481
482
483
484
485
486
487
488
489
490 private UnivariateDerivative2 computePA(final UnivariateDerivative2 dTpr,
491 final UnivariateDerivative2 n,
492 final UnivariateDerivative2 aeop2,
493 final UnivariateDerivative2 i) {
494 final UnivariateDerivative2 cosI = FastMath.cos(i);
495 final UnivariateDerivative2 cos2I = cosI.multiply(cosI);
496 final UnivariateDerivative2 precession = aeop2.multiply(n).multiply(cos2I.multiply(5.0).negate().add(1.0)).multiply(0.75 * GLONASS_J20);
497 return dTpr.multiply(precession).negate().add(glonassOrbit.getPa());
498 }
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513 private UnivariateDerivative2[] getParameterDifferentials(final UnivariateDerivative2 a, final UnivariateDerivative2 i,
514 final UnivariateDerivative2 h, final UnivariateDerivative2 l,
515 final UnivariateDerivative2 m) {
516
517
518 final UnivariateDerivative2 aeoa = a.divide(GLONASS_EARTH_EQUATORIAL_RADIUS).reciprocal();
519 final UnivariateDerivative2 aeoa2 = aeoa.multiply(aeoa);
520 final UnivariateDerivative2 b = aeoa2.multiply(1.5 * GLONASS_J20);
521
522
523 final FieldSinCos<UnivariateDerivative2> scI = FastMath.sinCos(i);
524 final FieldSinCos<UnivariateDerivative2> scLk = FastMath.sinCos(m);
525 final FieldSinCos<UnivariateDerivative2> sc2Lk = FieldSinCos.sum(scLk, scLk);
526 final FieldSinCos<UnivariateDerivative2> sc3Lk = FieldSinCos.sum(scLk, sc2Lk);
527 final FieldSinCos<UnivariateDerivative2> sc4Lk = FieldSinCos.sum(sc2Lk, sc2Lk);
528 final UnivariateDerivative2 cosI = scI.cos();
529 final UnivariateDerivative2 sinI = scI.sin();
530 final UnivariateDerivative2 cosI2 = cosI.multiply(cosI);
531 final UnivariateDerivative2 sinI2 = sinI.multiply(sinI);
532 final UnivariateDerivative2 cosLk = scLk.cos();
533 final UnivariateDerivative2 sinLk = scLk.sin();
534 final UnivariateDerivative2 cos2Lk = sc2Lk.cos();
535 final UnivariateDerivative2 sin2Lk = sc2Lk.sin();
536 final UnivariateDerivative2 cos3Lk = sc3Lk.cos();
537 final UnivariateDerivative2 sin3Lk = sc3Lk.sin();
538 final UnivariateDerivative2 cos4Lk = sc4Lk.cos();
539 final UnivariateDerivative2 sin4Lk = sc4Lk.sin();
540
541
542
543 final UnivariateDerivative2 hCosLk = h.multiply(cosLk);
544 final UnivariateDerivative2 hSinLk = h.multiply(sinLk);
545 final UnivariateDerivative2 lCosLk = l.multiply(cosLk);
546 final UnivariateDerivative2 lSinLk = l.multiply(sinLk);
547
548 final UnivariateDerivative2 hCos2Lk = h.multiply(cos2Lk);
549 final UnivariateDerivative2 hSin2Lk = h.multiply(sin2Lk);
550 final UnivariateDerivative2 lCos2Lk = l.multiply(cos2Lk);
551 final UnivariateDerivative2 lSin2Lk = l.multiply(sin2Lk);
552
553 final UnivariateDerivative2 hCos3Lk = h.multiply(cos3Lk);
554 final UnivariateDerivative2 hSin3Lk = h.multiply(sin3Lk);
555 final UnivariateDerivative2 lCos3Lk = l.multiply(cos3Lk);
556 final UnivariateDerivative2 lSin3Lk = l.multiply(sin3Lk);
557
558 final UnivariateDerivative2 hCos4Lk = h.multiply(cos4Lk);
559 final UnivariateDerivative2 hSin4Lk = h.multiply(sin4Lk);
560 final UnivariateDerivative2 lCos4Lk = l.multiply(cos4Lk);
561 final UnivariateDerivative2 lSin4Lk = l.multiply(sin4Lk);
562
563
564 final UnivariateDerivative2 om3o2xSinI2 = sinI2.multiply(1.5).negate().add(1.0);
565
566
567
568 final UnivariateDerivative2 dakT1 = b.multiply(2.0).multiply(om3o2xSinI2).multiply(lCosLk.add(hSinLk));
569 final UnivariateDerivative2 dakT2 = b.multiply(sinI2).multiply(hSinLk.multiply(0.5).subtract(lCosLk.multiply(0.5)).
570 add(cos2Lk).add(lCos3Lk.multiply(3.5)).add(hSin3Lk.multiply(3.5)));
571 final UnivariateDerivative2 dak = dakT1.add(dakT2);
572
573
574 final UnivariateDerivative2 dhkT1 = b.multiply(om3o2xSinI2).multiply(sinLk.add(lSin2Lk.multiply(1.5)).subtract(hCos2Lk.multiply(1.5)));
575 final UnivariateDerivative2 dhkT2 = b.multiply(sinI2).multiply(0.25).multiply(sinLk.subtract(sin3Lk.multiply(SEVEN_THIRD)).add(lSin2Lk.multiply(5.0)).
576 subtract(lSin4Lk.multiply(8.5)).add(hCos4Lk.multiply(8.5)).add(hCos2Lk));
577 final UnivariateDerivative2 dhkT3 = lSin2Lk.multiply(cosI2).multiply(b).multiply(0.5).negate();
578 final UnivariateDerivative2 dhk = dhkT1.subtract(dhkT2).add(dhkT3);
579
580
581 final UnivariateDerivative2 dlkT1 = b.multiply(om3o2xSinI2).multiply(cosLk.add(lCos2Lk.multiply(1.5)).add(hSin2Lk.multiply(1.5)));
582 final UnivariateDerivative2 dlkT2 = b.multiply(sinI2).multiply(0.25).multiply(cosLk.negate().subtract(cos3Lk.multiply(SEVEN_THIRD)).subtract(hSin2Lk.multiply(5.0)).
583 subtract(lCos4Lk.multiply(8.5)).subtract(hSin4Lk.multiply(8.5)).add(lCos2Lk));
584 final UnivariateDerivative2 dlkT3 = hSin2Lk.multiply(cosI2).multiply(b).multiply(0.5);
585 final UnivariateDerivative2 dlk = dlkT1.subtract(dlkT2).add(dlkT3);
586
587
588 final UnivariateDerivative2 dokT1 = b.negate().multiply(cosI);
589 final UnivariateDerivative2 dokT2 = lSinLk.multiply(3.5).subtract(hCosLk.multiply(2.5)).subtract(sin2Lk.multiply(0.5)).
590 subtract(lSin3Lk.multiply(SEVEN_SIXTH)).add(hCos3Lk.multiply(SEVEN_SIXTH));
591 final UnivariateDerivative2 dok = dokT1.multiply(dokT2);
592
593
594 final UnivariateDerivative2 dik = b.multiply(sinI).multiply(cosI).multiply(0.5).
595 multiply(lCosLk.negate().add(hSinLk).add(cos2Lk).add(lCos3Lk.multiply(SEVEN_THIRD)).add(hSin3Lk.multiply(SEVEN_THIRD)));
596
597
598 final UnivariateDerivative2 dLkT1 = b.multiply(2.0).multiply(om3o2xSinI2).multiply(lSinLk.multiply(1.75).subtract(hCosLk.multiply(1.75)));
599 final UnivariateDerivative2 dLkT2 = b.multiply(sinI2).multiply(3.0).multiply(hCosLk.multiply(SEVEN_24TH).negate().subtract(lSinLk.multiply(SEVEN_24TH)).
600 subtract(hCos3Lk.multiply(FN_72TH)).add(lSin3Lk.multiply(FN_72TH)).add(sin2Lk.multiply(0.25)));
601 final UnivariateDerivative2 dLkT3 = b.multiply(cosI2).multiply(lSinLk.multiply(3.5).subtract(hCosLk.multiply(2.5)).subtract(sin2Lk.multiply(0.5)).
602 subtract(lSin3Lk.multiply(SEVEN_SIXTH)).add(hCos3Lk.multiply(SEVEN_SIXTH)));
603 final UnivariateDerivative2 dLk = dLkT1.add(dLkT2).add(dLkT3);
604
605
606 final UnivariateDerivative2[] differentials = MathArrays.buildArray(a.getField(), 6);
607 differentials[0] = dak.multiply(a);
608 differentials[1] = dhk;
609 differentials[2] = dlk;
610 differentials[3] = dok;
611 differentials[4] = dik;
612 differentials[5] = dLk;
613
614 return differentials;
615 }
616
617
618 protected double getMass(final AbsoluteDate date) {
619 return mass;
620 }
621
622
623
624
625
626 public static double getMU() {
627 return GNSSConstants.GLONASS_MU;
628 }
629
630
631
632
633
634
635 public GLONASSOrbitalElements getGLONASSOrbitalElements() {
636 return glonassOrbit;
637 }
638
639
640
641
642
643 public Frame getECI() {
644 return eci;
645 }
646
647
648
649
650
651 public Frame getECEF() {
652 return ecef;
653 }
654
655
656 public Frame getFrame() {
657 return eci;
658 }
659
660
661 public void resetInitialState(final SpacecraftState state) {
662 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
663 }
664
665
666 protected void resetIntermediateState(final SpacecraftState state, final boolean forward) {
667 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
668 }
669
670
671 protected Orbit propagateOrbit(final AbsoluteDate date) {
672
673 final PVCoordinates pvaInECEF = propagateInEcef(date);
674
675 final PVCoordinates pvaInECI = ecef.getTransformTo(eci, date).transformPVCoordinates(pvaInECEF);
676
677 return new CartesianOrbit(pvaInECI, eci, date, GNSSConstants.GLONASS_MU);
678 }
679
680 }