9#include "ksplanetbase.h"
11#include "kspopupmenu.h"
13#include "kstarsdata.h"
16#include "skymapcomposite.h"
17#include "kstars_debug.h"
24#define RADIUSEARTHKM 6378.135
25#define XKE 0.07436691613317
27#define J4 -0.00000165597
28#define J3OJ2 -2.34506972e-3
31#define TWOPI 6.2831853071795864769
32#define PIO2 1.5707963267948966192
33#define X2O3 .66666666666666666667
34#define DEG2RAD 1.745329251994330e-2
40#define AU 1.49597870691e8
41#define XPDOTP 229.1831180523293
42#define SS 1.0122292801892716288
43#define QZMS2T 1.8802791590152706439e-9
44#define F 3.35281066474748e-3
45#define MFACTOR 7.292115e-5
51 m_class = line1.
at(7);
52 m_id = line1.
mid(9, 8);
54 m_first_deriv = line1.
mid(33, 10).
toDouble() / (XPDOTP * MINPD);
56 line1.
mid(44, 6).
toDouble() * (1.0e-5 / pow(10.0, line1.
mid(51, 1).
toDouble())) / (XPDOTP * MINPD * MINPD);
58 m_ephem_type = line1.
mid(62, 1).
toInt();
59 m_elem_number = line1.
mid(64, 4).
toInt();
60 m_inclination = line2.
mid(8, 8).
toDouble() * DEG2RAD;
62 m_eccentricity = line2.
mid(26, 7).
toDouble() * 1.0e-7;
63 m_arg_perigee = line2.
mid(34, 8).
toDouble() * DEG2RAD;
64 m_mean_anomaly = line2.
mid(43, 8).
toDouble() * DEG2RAD;
65 m_mean_motion = line2.
mid(52, 11).
toDouble() * TWOPI / MINPD;
66 m_nb_revolution = line2.
mid(63, 5).
toInt();
67 m_tle =
name +
"\n" + line1 +
"\n" + line2;
75 m_is_selected = Options::selectedSatellites().contains(
name);
78 double day = modf(m_epoch * 1.e-3, &m_epoch_year) * 1.e3;
79 if (m_epoch_year < 57.)
80 m_epoch_year += 2000.;
82 m_epoch_year += 1900.;
83 double year = m_epoch_year - 1.;
90 m_tle_jd = i + 1720994.5 + B + day;
97 Q_ASSERT(
typeid(
this) ==
typeid(
static_cast<const Satellite *
>(
this)));
101void Satellite::init()
103 double ao, cosio, sinio, cosio2, omeosq, posq, rp, rteosq, eccsq, con42, cnodm, snodm, cosim, sinim, cosomm, sinomm,
104 cc1sq, cc2, cc3, coef, coef1, cosio4, day, em, emsq, eeta, etasq, gam, inclm, nm, perige, pinvsq, psisq,
105 qzms24, rtemsq, s1, s2, s3, s4, s5, s6, s7, sfour, ss1(0), ss2(0), ss3(0), ss4(0), ss5(0), ss6(0), ss7(0),
106 sz1(0), sz2(0), sz3(0), sz11(0), sz12(0), sz13(0), sz21(0), sz22(0), sz23(0), sz31(0), sz32(0), sz33(0), tc,
107 temp, temp1, temp2, temp3, tsi, xpidot, xhdot1, z1, z2, z3, z11, z12, z13, z21, z22, z23, z31, z32, z33, ak, d1,
108 del, adel, po, ds70, ts70, tfrac, c1, thgr70, fk5r, c1p2p;
199 m_is_visible =
false;
202 const double temp4 = 1.5e-12;
206 eccsq = m_eccentricity * m_eccentricity;
207 omeosq = 1.0 - eccsq;
208 rteosq = sqrt(omeosq);
209 cosio = cos(m_inclination);
210 cosio2 = cosio * cosio;
213 ak = pow(XKE / m_mean_motion, X2O3);
214 d1 = 0.75 * J2 * (3.0 * cosio2 - 1.0) / (rteosq * omeosq);
215 del = d1 / (ak * ak);
216 adel = ak * (1.0 - del * del - del * (1.0 / 3.0 + 134.0 * del * del / 81.0));
217 del = d1 / (adel * adel);
218 m_mean_motion = m_mean_motion / (1.0 + del);
220 ao = pow(XKE / m_mean_motion, X2O3);
221 sinio = sin(m_inclination);
223 con42 = 1.0 - 5.0 * cosio2;
224 con41 = -con42 - (2.0 * cosio2);
226 rp = ao * (1.0 - m_eccentricity);
230 ts70 = m_tle_jd - 2433281.5 - 7305.0;
231 ds70 = floor(ts70 + 1.0e-8);
234 c1 = 1.72027916940703639e-2;
235 thgr70 = 1.7321343856509374;
236 fk5r = 5.07551419432269442e-15;
238 gsto = fmod(thgr70 + c1 * ds70 + c1p2p * tfrac + ts70 * ts70 * fk5r, TWOPI);
242 if ((omeosq >= 0.0) || (m_mean_motion >= 0.0))
244 if (rp < (220.0 / RADIUSEARTHKM + 1.0))
248 perige = (rp - 1.0) * RADIUSEARTHKM;
253 sfour = perige - 78.0;
256 qzms24 = pow(((120.0 - sfour) / RADIUSEARTHKM), 4.0);
257 sfour = sfour / RADIUSEARTHKM + 1.0;
261 tsi = 1.0 / (ao - sfour);
262 eta = ao * m_eccentricity * tsi;
264 eeta = m_eccentricity * eta;
265 psisq = fabs(1.0 - etasq);
266 coef = qzms24 * pow(tsi, 4.0);
267 coef1 = coef / pow(psisq, 3.5);
268 cc2 = coef1 * m_mean_motion *
269 (ao * (1.0 + 1.5 * etasq + eeta * (4.0 + etasq)) +
270 0.375 * J2 * tsi / psisq * con41 * (8.0 + 3.0 * etasq * (8.0 + etasq)));
273 if (m_eccentricity > 1.0e-4)
274 cc3 = -2.0 * coef * tsi * J3OJ2 * m_mean_motion * sinio / m_eccentricity;
275 x1mth2 = 1.0 - cosio2;
276 cc4 = 2.0 * m_mean_motion * coef1 * ao * omeosq *
277 (eta * (2.0 + 0.5 * etasq) + m_eccentricity * (0.5 + 2.0 * etasq) -
278 J2 * tsi / (ao * psisq) *
279 (-3.0 * con41 * (1.0 - 2.0 * eeta + etasq * (1.5 - 0.5 * eeta)) +
280 0.75 * x1mth2 * (2.0 * etasq - eeta * (1.0 + etasq)) * cos(2.0 * m_arg_perigee)));
281 cc5 = 2.0 * coef1 * ao * omeosq * (1.0 + 2.75 * (etasq + eeta) + eeta * etasq);
283 cosio4 = cosio2 * cosio2;
284 temp1 = 1.5 * J2 * pinvsq * m_mean_motion;
285 temp2 = 0.5 * temp1 * J2 * pinvsq;
286 temp3 = -0.46875 * J4 * pinvsq * pinvsq * m_mean_motion;
287 mdot = m_mean_motion + 0.5 * temp1 * rteosq * con41 +
288 0.0625 * temp2 * rteosq * (13.0 - 78.0 * cosio2 + 137.0 * cosio4);
289 argpdot = -0.5 * temp1 * con42 + 0.0625 * temp2 * (7.0 - 114.0 * cosio2 + 395.0 * cosio4) +
290 temp3 * (3.0 - 36.0 * cosio2 + 49.0 * cosio4);
291 xhdot1 = -temp1 * cosio;
292 nodedot = xhdot1 + (0.5 * temp2 * (4.0 - 19.0 * cosio2) + 2.0 * temp3 * (3.0 - 7.0 * cosio2)) * cosio;
293 xpidot = argpdot + nodedot;
294 omgcof = m_bstar * cc3 * cos(m_arg_perigee);
296 if (m_eccentricity > 1.0e-4)
297 xmcof = -X2O3 * coef * m_bstar / eeta;
298 nodecf = 3.5 * omeosq * xhdot1 * cc1;
301 if (fabs(1.0 + cosio) > 1.5e-12)
302 xlcof = -0.25 * J3OJ2 * sinio * (3.0 + 5.0 * cosio) / (1.0 + cosio);
304 xlcof = -0.25 * J3OJ2 * sinio * (3.0 + 5.0 * cosio) / temp4;
305 aycof = -0.5 * J3OJ2 * sinio;
306 delmo = pow((1.0 + eta * cos(m_mean_anomaly)), 3);
307 sinmao = sin(m_mean_anomaly);
308 x7thm1 = 7.0 * cosio2 - 1.0;
311 if ((TWOPI / m_mean_motion) >= 225.0)
316 inclm = m_inclination;
320 const double zes = 0.01675;
321 const double zel = 0.05490;
322 const double c1ss = 2.9864797e-6;
323 const double c1l = 4.7968065e-7;
324 const double zsinis = 0.39785416;
325 const double zcosis = 0.91744867;
326 const double zcosgs = 0.1945905;
327 const double zsings = -0.98088458;
330 double a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, betasq, cc, ctem, stem, x1, x2, x3, x4, x5, x6, x7, x8,
331 xnodce, xnoi, zcosg, zcosgl, zcosh, zcoshl, zcosi, zcosil, zsing, zsingl, zsinh, zsinhl, zsini, zsinil,
338 sinomm = sin(m_arg_perigee);
339 cosomm = cos(m_arg_perigee);
340 sinim = sin(m_inclination);
341 cosim = cos(m_inclination);
344 rtemsq = sqrt(betasq);
352 day = m_tle_jd - 2433281.5 + 18261.5 + tc / 1440.0;
353 xnodce = fmod(4.5236020 - 9.2422029e-4 * day, TWOPI);
356 zcosil = 0.91375164 - 0.03568096 * ctem;
357 zsinil = sqrt(1.0 - zcosil * zcosil);
358 zsinhl = 0.089683511 * stem / zsinil;
359 zcoshl = sqrt(1.0 - zsinhl * zsinhl);
360 gam = 5.8351514 + 0.0019443680 * day;
361 zx = 0.39785416 * stem / zsinil;
362 zy = zcoshl * ctem + 0.91744867 * zsinhl * stem;
364 zx = gam + zx - xnodce;
378 for (lsflg = 1; lsflg <= 2; ++lsflg)
380 a1 = zcosg * zcosh + zsing * zcosi * zsinh;
381 a3 = -zsing * zcosh + zcosg * zcosi * zsinh;
382 a7 = -zcosg * zsinh + zsing * zcosi * zcosh;
384 a9 = zsing * zsinh + zcosg * zcosi * zcosh;
386 a2 = cosim * a7 + sinim * a8;
387 a4 = cosim * a9 + sinim * a10;
388 a5 = -sinim * a7 + cosim * a8;
389 a6 = -sinim * a9 + cosim * a10;
391 x1 = a1 * cosomm + a2 * sinomm;
392 x2 = a3 * cosomm + a4 * sinomm;
393 x3 = -a1 * sinomm + a2 * cosomm;
394 x4 = -a3 * sinomm + a4 * cosomm;
400 z31 = 12.0 * x1 * x1 - 3.0 * x3 * x3;
401 z32 = 24.0 * x1 * x2 - 6.0 * x3 * x4;
402 z33 = 12.0 * x2 * x2 - 3.0 * x4 * x4;
403 z1 = 3.0 * (a1 * a1 + a2 * a2) + z31 * emsq;
404 z2 = 6.0 * (a1 * a3 + a2 * a4) + z32 * emsq;
405 z3 = 3.0 * (a3 * a3 + a4 * a4) + z33 * emsq;
406 z11 = -6.0 * a1 * a5 + emsq * (-24.0 * x1 * x7 - 6.0 * x3 * x5);
407 z12 = -6.0 * (a1 * a6 + a3 * a5) + emsq * (-24.0 * (x2 * x7 + x1 * x8) - 6.0 * (x3 * x6 + x4 * x5));
408 z13 = -6.0 * a3 * a6 + emsq * (-24.0 * x2 * x8 - 6.0 * x4 * x6);
409 z21 = 6.0 * a2 * a5 + emsq * (24.0 * x1 * x5 - 6.0 * x3 * x7);
410 z22 = 6.0 * (a4 * a5 + a2 * a6) + emsq * (24.0 * (x2 * x5 + x1 * x6) - 6.0 * (x4 * x7 + x3 * x8));
411 z23 = 6.0 * a4 * a6 + emsq * (24.0 * x2 * x6 - 6.0 * x4 * x8);
412 z1 = z1 + z1 + betasq * z31;
413 z2 = z2 + z2 + betasq * z32;
414 z3 = z3 + z3 + betasq * z33;
416 s2 = -0.5 * s3 / rtemsq;
418 s1 = -15.0 * em * s4;
419 s5 = x1 * x3 + x2 * x4;
420 s6 = x2 * x3 + x1 * x4;
421 s7 = x2 * x4 - x1 * x3;
449 zcosh = zcoshl * cnodm + zsinhl * snodm;
450 zsinh = snodm * zcoshl - cnodm * zsinhl;
455 zmol = fmod(4.7199672 + 0.22997150 * day - gam, TWOPI);
456 zmos = fmod(6.2565837 + 0.017201977 * day, TWOPI);
459 se2 = 2.0 * ss1 * ss6;
460 se3 = 2.0 * ss1 * ss7;
461 si2 = 2.0 * ss2 * sz12;
462 si3 = 2.0 * ss2 * (sz13 - sz11);
463 sl2 = -2.0 * ss3 * sz2;
464 sl3 = -2.0 * ss3 * (sz3 - sz1);
465 sl4 = -2.0 * ss3 * (-21.0 - 9.0 * emsq) * zes;
466 sgh2 = 2.0 * ss4 * sz32;
467 sgh3 = 2.0 * ss4 * (sz33 - sz31);
468 sgh4 = -18.0 * ss4 * zes;
469 sh2 = -2.0 * ss2 * sz22;
470 sh3 = -2.0 * ss2 * (sz23 - sz21);
475 xi2 = 2.0 * s2 * z12;
476 xi3 = 2.0 * s2 * (z13 - z11);
477 xl2 = -2.0 * s3 * z2;
478 xl3 = -2.0 * s3 * (z3 - z1);
479 xl4 = -2.0 * s3 * (-21.0 - 9.0 * emsq) * zel;
480 xgh2 = 2.0 * s4 * z32;
481 xgh3 = 2.0 * s4 * (z33 - z31);
482 xgh4 = -18.0 * s4 * zel;
483 xh2 = -2.0 * s2 * z22;
484 xh3 = -2.0 * s2 * (z23 - z21);
488 double ses, sghl, sghs, shll, shs, sis, sls;
491 const double zns = 1.19459e-5;
492 const double znl = 1.5835218e-4;
516 double ainv2, aonv = 0.0, cosisq, eoc, f220, f221, f311, f321, f322, f330, f441, f442, f522, f523, f542,
517 f543, g200, g201, g211, g300, g310, g322, g410, g422, g520, g521, g532, g533, sgs, sini2,
518 temp, temp1, theta, xno2, emsqo;
522 const double q22 = 1.7891679e-6;
523 const double q31 = 2.1460748e-6;
524 const double q33 = 2.2123015e-7;
525 const double root22 = 1.7891679e-6;
526 const double root44 = 7.3636953e-9;
527 const double root54 = 2.1765803e-9;
528 const double rptim = 4.37526908801129966e-3;
529 const double root32 = 3.7393792e-7;
530 const double root52 = 1.1428639e-7;
534 if ((nm < 0.0052359877) && (nm > 0.0034906585))
536 if ((nm >= 8.26e-3) && (nm <= 9.24e-3) && (em >= 0.5))
540 ses = ss1 * zns * ss5;
541 sis = ss2 * zns * (sz11 + sz13);
542 sls = -zns * ss3 * (sz1 + sz3 - 14.0 - 6.0 * emsq);
543 sghs = ss4 * zns * (sz31 + sz33 - 6.0);
544 shs = -zns * ss2 * (sz21 + sz23);
545 if ((inclm < 5.2359877e-2) || (inclm > M_PI - 5.2359877e-2))
549 sgs = sghs - cosim * shs;
552 dedt = ses + s1 * znl * s5;
553 didt = sis + s2 * znl * (z11 + z13);
554 dmdt = sls - znl * s3 * (z1 + z3 - 14.0 - 6.0 * emsq);
555 sghl = s4 * znl * (z31 + z33 - 6.0);
556 shll = -znl * s2 * (z21 + z23);
557 if ((inclm < 5.2359877e-2) || (inclm > M_PI - 5.2359877e-2))
563 domdt = domdt - cosim / sinim * shll;
564 dnodt = dnodt + shll / sinim;
570 theta = fmod(gsto + tc * rptim, TWOPI);
575 aonv = pow(nm / XKE, X2O3);
580 cosisq = cosim * cosim;
587 g201 = -0.306 - (em - 0.64) * 0.440;
591 g211 = 3.616 - 13.2470 * em + 16.2900 * emsq;
592 g310 = -19.302 + 117.3900 * em - 228.4190 * emsq + 156.5910 * eoc;
593 g322 = -18.9068 + 109.7927 * em - 214.6334 * emsq + 146.5816 * eoc;
594 g410 = -41.122 + 242.6940 * em - 471.0940 * emsq + 313.9530 * eoc;
595 g422 = -146.407 + 841.8800 * em - 1629.014 * emsq + 1083.4350 * eoc;
596 g520 = -532.114 + 3017.977 * em - 5740.032 * emsq + 3708.2760 * eoc;
600 g211 = -72.099 + 331.819 * em - 508.738 * emsq + 266.724 * eoc;
601 g310 = -346.844 + 1582.851 * em - 2415.925 * emsq + 1246.113 * eoc;
602 g322 = -342.585 + 1554.908 * em - 2366.899 * emsq + 1215.972 * eoc;
603 g410 = -1052.797 + 4758.686 * em - 7193.992 * emsq + 3651.957 * eoc;
604 g422 = -3581.690 + 16178.110 * em - 24462.770 * emsq + 12422.520 * eoc;
606 g520 = -5149.66 + 29936.92 * em - 54087.36 * emsq + 31324.56 * eoc;
608 g520 = 1464.74 - 4664.75 * em + 3763.64 * emsq;
612 g533 = -919.22770 + 4988.6100 * em - 9064.7700 * emsq + 5542.21 * eoc;
613 g521 = -822.71072 + 4568.6173 * em - 8491.4146 * emsq + 5337.524 * eoc;
614 g532 = -853.66600 + 4690.2500 * em - 8624.7700 * emsq + 5341.4 * eoc;
618 g533 = -37995.780 + 161616.52 * em - 229838.20 * emsq + 109377.94 * eoc;
619 g521 = -51752.104 + 218913.95 * em - 309468.16 * emsq + 146349.42 * eoc;
620 g532 = -40023.880 + 170470.89 * em - 242699.48 * emsq + 115605.82 * eoc;
623 sini2 = sinim * sinim;
624 f220 = 0.75 * (1.0 + 2.0 * cosim + cosisq);
626 f321 = 1.875 * sinim * (1.0 - 2.0 * cosim - 3.0 * cosisq);
627 f322 = -1.875 * sinim * (1.0 + 2.0 * cosim - 3.0 * cosisq);
628 f441 = 35.0 * sini2 * f220;
629 f442 = 39.3750 * sini2 * sini2;
632 (sini2 * (1.0 - 2.0 * cosim - 5.0 * cosisq) + 0.33333333 * (-2.0 + 4.0 * cosim + 6.0 * cosisq));
633 f523 = sinim * (4.92187512 * sini2 * (-2.0 - 4.0 * cosim + 10.0 * cosisq) +
634 6.56250012 * (1.0 + 2.0 * cosim - 3.0 * cosisq));
635 f542 = 29.53125 * sinim * (2.0 - 8.0 * cosim + cosisq * (-12.0 + 8.0 * cosim + 10.0 * cosisq));
636 f543 = 29.53125 * sinim * (-2.0 - 8.0 * cosim + cosisq * (12.0 + 8.0 * cosim - 10.0 * cosisq));
639 temp1 = 3.0 * xno2 * ainv2;
640 temp = temp1 * root22;
641 d2201 = temp * f220 * g201;
642 d2211 = temp * f221 * g211;
643 temp1 = temp1 * aonv;
644 temp = temp1 * root32;
645 d3210 = temp * f321 * g310;
646 d3222 = temp * f322 * g322;
647 temp1 = temp1 * aonv;
648 temp = 2.0 * temp1 * root44;
649 d4410 = temp * f441 * g410;
650 d4422 = temp * f442 * g422;
651 temp1 = temp1 * aonv;
652 temp = temp1 * root52;
653 d5220 = temp * f522 * g520;
654 d5232 = temp * f523 * g532;
655 temp = 2.0 * temp1 * root54;
656 d5421 = temp * f542 * g521;
657 d5433 = temp * f543 * g533;
658 xlamo = fmod(m_mean_anomaly + m_ra + m_ra - theta - theta, TWOPI);
659 xfact = mdot + dmdt + 2.0 * (nodedot + dnodt - rptim) - m_mean_motion;
667 g200 = 1.0 + emsq * (-2.5 + 0.8125 * emsq);
668 g310 = 1.0 + 2.0 * emsq;
669 g300 = 1.0 + emsq * (-6.0 + 6.60937 * emsq);
670 f220 = 0.75 * (1.0 + cosim) * (1.0 + cosim);
671 f311 = 0.9375 * sinim * sinim * (1.0 + 3.0 * cosim) - 0.75 * (1.0 + cosim);
673 f330 = 1.875 * f330 * f330 * f330;
674 del1 = 3.0 * nm * nm * aonv * aonv;
675 del2 = 2.0 * del1 * f220 * g200 * q22;
676 del3 = 3.0 * del1 * f330 * g300 * q33 * aonv;
677 del1 = del1 * f311 * g310 * q31 * aonv;
678 xlamo = fmod(m_mean_anomaly + m_ra + m_arg_perigee - theta, TWOPI);
679 xfact = mdot + xpidot - rptim + dmdt + domdt + dnodt - m_mean_motion;
694 d2 = 4.0 * ao * tsi * cc1sq;
695 temp = d2 * tsi * cc1 / 3.0;
696 d3 = (17.0 * ao + sfour) * temp;
697 d4 = 0.5 * temp * ao * tsi * (221.0 * ao + 31.0 * sfour) * cc1;
698 t3cof = d2 + 2.0 * cc1sq;
699 t4cof = 0.25 * (3.0 * d3 + cc1 * (12.0 * d2 + 10.0 * cc1sq));
700 t5cof = 0.2 * (3.0 * d4 + 12.0 * cc1 * d3 + 6.0 * d2 * d2 + 15.0 * cc1sq * (2.0 * d2 + cc1sq));
708 return sgp4((data->
clock()->
utc().
djd() - m_tle_jd) * MINPD);
711int Satellite::sgp4(
double tsince)
716 double am, axnl, aynl, betal, cosim, cnod, cos2u, coseo1 = 0, cosi, cosip, cosisq, cossu, cosu, delm, delomg, em,
717 ecose, el2, eo1, ep, esine, argpm, argpp, argpdf, pl,
718 mrt = 0.0, mvt, rdotl, rl, rvdot, rvdotl, sinim, dndt, sin2u, sineo1 = 0, sini, sinip, sinsu, sinu, snod, su, t2,
719 t3, t4, tem5, temp, temp1, temp2, tempa, tempe, templ, u, ux, uy, uz, vx, vy, vz, inclm, mm, nm, nodem, xinc,
720 xincp, xl, xlm, mp, xmdf, xmx, xmy, nodedf, xnode, nodep, tc, sat_posx, sat_posy, sat_posz, sat_posw, sat_velx,
721 sat_vely, sat_velz, sinlat, obs_posx, obs_posy, obs_posz, obs_posw,
722 coslat, thetageo, sintheta, costheta, c, sq, achcp, vkmpersec;
725 const double temp4 = 1.5e-12;
729 vkmpersec = RADIUSEARTHKM * XKE / 60.0;
732 xmdf = m_mean_anomaly + mdot * tsince;
733 argpdf = m_arg_perigee + argpdot * tsince;
734 nodedf = m_ra + nodedot * tsince;
737 t2 = tsince * tsince;
738 nodem = nodedf + nodecf * t2;
739 tempa = 1.0 - cc1 * tsince;
740 tempe = m_bstar * cc4 * tsince;
745 delomg = omgcof * tsince;
746 delm = xmcof * (pow((1.0 + eta * cos(xmdf)), 3) - delmo);
747 temp = delomg + delm;
749 argpm = argpdf - temp;
752 tempa = tempa - d2 * t2 - d3 * t3 - d4 * t4;
753 tempe = tempe + m_bstar * cc5 * (sin(mm) - sinmao);
754 templ = templ + t3cof * t3 + t4 * (t4cof + tsince * t5cof);
759 inclm = m_inclination;
766 double delt, ft, theta, x2li, x2omi, xl, xldot, xnddt, xndt, xomi;
769 const double fasx2 = 0.13130908;
770 const double fasx4 = 2.8843198;
771 const double fasx6 = 0.37448087;
772 const double g22 = 5.7686396;
773 const double g32 = 0.95240898;
774 const double g44 = 1.8014998;
775 const double g52 = 1.0508330;
776 const double g54 = 4.4108898;
777 const double rptim = 4.37526908801129966e-3;
778 const double step = 720.0;
779 const double step2 = step * step / 2;
784 theta = fmod(gsto + tc * rptim, TWOPI);
785 em = em + dedt * tsince;
787 inclm = inclm + didt * tsince;
788 argpm = argpm + domdt * tsince;
789 nodem = nodem + dnodt * tsince;
790 mm = mm + dmdt * tsince;
796 if ((atime == 0.0) || (tsince * atime <= 0.0) || (fabs(tsince) < fabs(atime)))
815 xndt = del1 * sin(xli - fasx2) + del2 * sin(2.0 * (xli - fasx4)) + del3 * sin(3.0 * (xli - fasx6));
817 xnddt = del1 * cos(xli - fasx2) + 2.0 * del2 * cos(2.0 * (xli - fasx4)) +
818 3.0 * del3 * cos(3.0 * (xli - fasx6));
819 xnddt = xnddt * xldot;
824 xomi = m_arg_perigee + argpdot * atime;
827 xndt = d2201 * sin(x2omi + xli - g22) + d2211 * sin(xli - g22) + d3210 * sin(xomi + xli - g32) +
828 d3222 * sin(-xomi + xli - g32) + d4410 * sin(x2omi + x2li - g44) + d4422 * sin(x2li - g44) +
829 d5220 * sin(xomi + xli - g52) + d5232 * sin(-xomi + xli - g52) +
830 d5421 * sin(xomi + x2li - g54) + d5433 * sin(-xomi + x2li - g54);
832 xnddt = d2201 * cos(x2omi + xli - g22) + d2211 * cos(xli - g22) + d3210 * cos(xomi + xli - g32) +
833 d3222 * cos(-xomi + xli - g32) + d5220 * cos(xomi + xli - g52) +
834 d5232 * cos(-xomi + xli - g52) +
835 2.0 * (d4410 * cos(x2omi + x2li - g44) + d4422 * cos(x2li - g44) +
836 d5421 * cos(xomi + x2li - g54) + d5433 * cos(-xomi + x2li - g54));
837 xnddt = xnddt * xldot;
840 if (fabs(tsince - atime) >= step)
852 xli = xli + xldot * delt + xndt * step2;
853 xni = xni + xndt * delt + xnddt * step2;
854 atime = atime + delt;
858 nm = xni + xndt * ft + xnddt * ft * ft * 0.5;
859 xl = xli + xldot * ft + xndt * ft * ft * 0.5;
863 mm = xl - 2.0 * nodem + 2.0 * theta;
864 dndt = nm - m_mean_motion;
868 mm = xl - nodem - argpm + theta;
869 dndt = nm - m_mean_motion;
872 nm = m_mean_motion + dndt;
878 qDebug() << Q_FUNC_INFO <<
"Mean motion less than 0.0";
882 am = pow((XKE / nm), X2O3) * tempa * tempa;
883 nm = XKE / pow(am, 1.5);
886 if ((em >= 1.0) || (em < -0.001))
888 qDebug() << Q_FUNC_INFO <<
"Eccentricity >= 1.0 or < -0.001";
895 mm = mm + m_mean_motion * templ;
896 xlm = mm + argpm + nodem;
902 nodem = fmod(nodem, TWOPI);
903 argpm = fmod(argpm, TWOPI);
904 xlm = fmod(xlm, TWOPI);
905 mm = fmod(xlm - argpm - nodem, TWOPI);
921 double alfdp, betdp, cosip, cosop, dalf, dbet, dls, f2, f3, pe, pgh, ph, pinc, pl, sel, ses, sghl, sghs, shll,
922 shs, sil, sinip, sinop, sinzf, sis, sll, sls, xls, xnoh, zf, zm;
925 const double zns = 1.19459e-5;
926 const double zes = 0.01675;
927 const double znl = 1.5835218e-4;
928 const double zel = 0.05490;
931 zm = zmos + zns * tsince;
932 zf = zm + 2.0 * zes * sin(zm);
934 f2 = 0.5 * sinzf * sinzf - 0.25;
935 f3 = -0.5 * sinzf * cos(zf);
936 ses = se2 * f2 + se3 * f3;
937 sis = si2 * f2 + si3 * f3;
938 sls = sl2 * f2 + sl3 * f3 + sl4 * sinzf;
939 sghs = sgh2 * f2 + sgh3 * f3 + sgh4 * sinzf;
940 shs = sh2 * f2 + sh3 * f3;
941 zm = zmol + znl * tsince;
943 zf = zm + 2.0 * zel * sin(zm);
945 f2 = 0.5 * sinzf * sinzf - 0.25;
946 f3 = -0.5 * sinzf * cos(zf);
947 sel = ee2 * f2 + e3 * f3;
948 sil = xi2 * f2 + xi3 * f3;
949 sll = xl2 * f2 + xl3 * f3 + xl4 * sinzf;
950 sghl = xgh2 * f2 + xgh3 * f3 + xgh4 * sinzf;
951 shll = xh2 * f2 + xh3 * f3;
963 xincp = xincp + pinc;
972 pgh = pgh - cosip * ph;
982 alfdp = sinip * sinop;
983 betdp = sinip * cosop;
984 dalf = ph * cosop + pinc * cosip * sinop;
985 dbet = -ph * sinop + pinc * cosip * cosop;
986 alfdp = alfdp + dalf;
987 betdp = betdp + dbet;
988 nodep = fmod(nodep, TWOPI);
991 xls = mp + argpp + cosip * nodep;
992 dls = pl + pgh - pinc * nodep * sinip;
995 nodep = atan2(alfdp, betdp);
998 if (fabs(xnoh - nodep) > M_PI)
1006 argpp = xls - mp - cosip * nodep;
1012 nodep = nodep + M_PI;
1013 argpp = argpp - M_PI;
1016 if ((ep < 0.0) || (ep > 1.0))
1018 qDebug() << Q_FUNC_INFO <<
"Eccentricity < 0.0 or > 1.0";
1028 aycof = -0.5 * J3OJ2 * sinip;
1029 if (fabs(cosip + 1.0) > 1.5e-12)
1030 xlcof = -0.25 * J3OJ2 * sinip * (3.0 + 5.0 * cosip) / (1.0 + cosip);
1032 xlcof = -0.25 * J3OJ2 * sinip * (3.0 + 5.0 * cosip) / temp4;
1034 axnl = ep * cos(argpp);
1035 temp = 1.0 / (am * (1.0 - ep * ep));
1036 aynl = ep * sin(argpp) + temp * aycof;
1037 xl = mp + argpp + nodep + temp * xlcof * axnl;
1040 u = fmod(xl - nodep, TWOPI);
1044 while ((fabs(tem5) >= 1.0e-12) && (ktr <= 10))
1048 tem5 = 1.0 - coseo1 * axnl - sineo1 * aynl;
1049 tem5 = (u - aynl * coseo1 + axnl * sineo1 - eo1) / tem5;
1050 if (fabs(tem5) >= 0.95)
1051 tem5 = tem5 > 0.0 ? 0.95 : -0.95;
1057 ecose = axnl * coseo1 + aynl * sineo1;
1058 esine = axnl * sineo1 - aynl * coseo1;
1059 el2 = axnl * axnl + aynl * aynl;
1060 pl = am * (1.0 - el2);
1064 qDebug() << Q_FUNC_INFO <<
"Semi-latus rectum < 0.0";
1068 rl = am * (1.0 - ecose);
1069 rdotl = sqrt(am) * esine / rl;
1070 rvdotl = sqrt(pl) / rl;
1071 betal = sqrt(1.0 - el2);
1072 temp = esine / (1.0 + betal);
1073 sinu = am / rl * (sineo1 - aynl - axnl * temp);
1074 cosu = am / rl * (coseo1 - axnl + aynl * temp);
1075 su = atan2(sinu, cosu);
1076 sin2u = (cosu + cosu) * sinu;
1077 cos2u = 1.0 - 2.0 * sinu * sinu;
1079 temp1 = 0.5 * J2 * temp;
1080 temp2 = temp1 * temp;
1085 cosisq = cosip * cosip;
1086 con41 = 3.0 * cosisq - 1.0;
1087 x1mth2 = 1.0 - cosisq;
1088 x7thm1 = 7.0 * cosisq - 1.0;
1090 mrt = rl * (1.0 - 1.5 * temp2 * betal * con41) + 0.5 * temp1 * x1mth2 * cos2u;
1091 su = su - 0.25 * temp2 * x7thm1 * sin2u;
1092 xnode = nodep + 1.5 * temp2 * cosip * sin2u;
1093 xinc = xincp + 1.5 * temp2 * cosip * sinip * cos2u;
1094 mvt = rdotl - nm * temp1 * x1mth2 * sin2u / XKE;
1095 rvdot = rvdotl + nm * temp1 * (x1mth2 * cos2u + 1.5 * con41) / XKE;
1106 ux = xmx * sinsu + cnod * cossu;
1107 uy = xmy * sinsu + snod * cossu;
1109 vx = xmx * cossu - cnod * sinsu;
1110 vy = xmy * cossu - snod * sinsu;
1114 sat_posx = (mrt * ux) * RADIUSEARTHKM;
1115 sat_posy = (mrt * uy) * RADIUSEARTHKM;
1116 sat_posz = (mrt * uz) * RADIUSEARTHKM;
1117 sat_posw = sqrt(sat_posx * sat_posx + sat_posy * sat_posy + sat_posz * sat_posz);
1118 sat_velx = (mvt * ux + rvdot * vx) * vkmpersec;
1119 sat_vely = (mvt * uy + rvdot * vy) * vkmpersec;
1120 sat_velz = (mvt * uz + rvdot * vz) * vkmpersec;
1121 m_velocity = sqrt(sat_velx * sat_velx + sat_vely * sat_vely + sat_velz * sat_velz);
1133 qCDebug(KSTARS) << Q_FUNC_INFO <<
"Satellite has decayed";
1140 thetageo = data->
geo()->
LMST(jul_utc);
1141 sintheta = sin(thetageo);
1142 costheta = cos(thetageo);
1143 c = 1.0 / sqrt(1.0 + F * (F - 2.0) * sinlat * sinlat);
1144 sq = (1.0 - F) * (1.0 - F) * c;
1145 achcp = (RADIUSEARTHKM * c + MEANALT) * coslat;
1146 obs_posx = achcp * costheta;
1147 obs_posy = achcp * sintheta;
1148 obs_posz = (RADIUSEARTHKM * sq + MEANALT) * sinlat;
1149 obs_posw = sqrt(obs_posx * obs_posx + obs_posy * sat_posy + obs_posz * obs_posz);
1154 m_altitude = sat_posw - obs_posw + MEANALT;
1157 double range_posx = sat_posx - obs_posx;
1158 double range_posy = sat_posy - obs_posy;
1159 double range_posz = sat_posz - obs_posz;
1160 m_range = sqrt(range_posx * range_posx + range_posy * range_posy + range_posz * range_posz);
1165 double top_s = sinlat * costheta * range_posx + sinlat * sintheta * range_posy - coslat * range_posz;
1166 double top_e = -sintheta * range_posx + costheta * range_posy;
1167 double top_z = coslat * costheta * range_posx + coslat * sintheta * range_posy + sinlat * range_posz;
1169 double azimuth = atan(-top_e / top_s);
1174 double elevation = arcSin(top_z / m_range);
1179 setAz(azimuth / DEG2RAD);
1180 setAlt(elevation / DEG2RAD);
1185 double mjd, year, T, M, L, e, C, O, Lsa, nu, R, eps;
1187 mjd = jul_utc - 2415020.0;
1188 year = 1900.0 + mjd / 365.25;
1189 T = (mjd + deltaET(year) / (MINPD * 60.0)) / 36525.0;
1190 M = DEG2RAD * (Modulus(358.47583 + Modulus(35999.04975 * T, 360.0) - (0.000150 + 0.0000033 * T) * T * T, 360.0));
1191 L = DEG2RAD * (Modulus(279.69668 + Modulus(36000.76892 * T, 360.0) + 0.0003025 * T * T, 360.0));
1192 e = 0.01675104 - (0.0000418 + 0.000000126 * T) * T;
1193 C = DEG2RAD * ((1.919460 - (0.004789 + 0.000014 * T) * T) * sin(M) + (0.020094 - 0.000100 * T) * sin(2 * M) +
1194 0.000293 * sin(3 * M));
1195 O = DEG2RAD * (Modulus(259.18 - 1934.142 * T, 360.0));
1196 Lsa = Modulus(L + C - DEG2RAD * (0.00569 - 0.00479 * sin(O)), TWOPI);
1197 nu = Modulus(M + C, TWOPI);
1198 R = 1.0000002 * (1.0 - e * e) / (1.0 + e * cos(nu));
1199 eps = DEG2RAD * (23.452294 - (0.0130125 + (0.00000164 - 0.000000503 * T) * T) * T + 0.00256 * cos(O));
1202 double sun_posx = R * cos(Lsa);
1203 double sun_posy = R * sin(Lsa) * cos(eps);
1204 double sun_posz = R * sin(Lsa) * sin(eps);
1205 double sun_posw = R;
1208 double sd_sun, sd_earth, delta, depth;
1211 sd_earth = arcSin(RADIUSEARTHKM / sat_posw);
1212 double rho_x = sun_posx - sat_posx;
1213 double rho_y = sun_posy - sat_posy;
1214 double rho_z = sun_posz - sat_posz;
1215 double rho_w = sqrt(rho_x * rho_x + rho_y * rho_y + rho_z * rho_z);
1216 sd_sun = arcSin(SR / rho_w);
1217 double earth_x = -1.0 * sat_posx;
1218 double earth_y = -1.0 * sat_posy;
1219 double earth_z = -1.0 * sat_posz;
1220 double earth_w = sat_posw;
1221 delta = PIO2 - arcSin((sun_posx * earth_x + sun_posy * earth_y + sun_posz * earth_z) / (sun_posw * earth_w));
1222 depth = sd_earth - sd_sun - delta;
1225 m_is_eclipsed = sd_earth >= sd_sun && depth >= 0;
1226 m_is_visible = !m_is_eclipsed && sun->
alt().
Degrees() <= -12.0 && elevation >= 0.0;
1236 return i18n(
"Success");
1240 return i18n(
"Eccentricity >= 1.0 or < -0.001");
1243 return i18n(
"Mean motion less than 0.0");
1246 return i18n(
"Semi-latus rectum < 0.0");
1249 return i18n(
"Satellite has decayed");
1252 return i18n(
"Unknown error");
1256double Satellite::arcSin(
double arg)
1258 if (fabs(arg) >= 1.)
1266 return (atan(arg / sqrt(1. - arg * arg)));
1269double Satellite::deltaET(
double year)
1273 delta_et = 26.465 + 0.747622 * (year - 1950) + 1.886913 * sin(TWOPI * (year - 1975) / 33);
1278double Satellite::Modulus(
double arg1,
double arg2)
1285 ret_val -= i * arg2;
1295 return m_is_visible;
1300 return m_is_selected;
const CachingDms * lat() const
KStarsData is the backbone of KStars.
Q_INVOKABLE SimClock * clock()
SkyMapComposite * skyComposite()
int updatePos()
Update satellite position.
void setSelected(bool selected)
Select or not the satellite.
QString sgp4ErrorString(int code)
sgp4ErrorString Get error string associated with sgp4 calculation failure
void initPopupMenu(KSPopupMenu *pmenu) override
Initialize the popup menut.
Satellite(const QString &name, const QString &line1, const QString &line2)
Constructor.
Satellite * clone() const override
const KStarsDateTime & utc() const
void setName2(const QString &name2=QString())
Set the object's secondary name.
void setLongName(const QString &longname=QString())
Set the object's long name.
void setMag(float m)
Set the object's sorting magnitude.
virtual QString name(void) const
void setName(const QString &name)
Set the object's primary name.
void setType(int t)
Set the object's type identifier to the argument.
void setAlt(dms alt)
Sets Alt, the Altitude.
void HorizontalToEquatorial(const dms *LST, const dms *lat)
Determine the (RA, Dec) coordinates of the SkyPoint from its (Altitude, Azimuth) coordinates,...
void setAz(dms az)
Sets Az, the Azimuth.
double radians() const
Express the angle in radians.
const double & Degrees() const
QString i18n(const char *text, const TYPE &arg...)
StandardShortcut findByName(const QString &name)
const QChar at(qsizetype position) const const
QString mid(qsizetype position, qsizetype n) const const
double toDouble(bool *ok) const const
int toInt(bool *ok, int base) const const