9#include "ksplanetbase.h"
11#include "kspopupmenu.h"
13#include "kstarsdata.h"
16#include "skymapcomposite.h"
25#define RADIUSEARTHKM 6378.135
26#define XKE 0.07436691613317
28#define J4 -0.00000165597
29#define J3OJ2 -2.34506972e-3
32#define TWOPI 6.2831853071795864769
33#define PIO2 1.5707963267948966192
34#define X2O3 .66666666666666666667
35#define DEG2RAD 1.745329251994330e-2
41#define AU 1.49597870691e8
42#define XPDOTP 229.1831180523293
43#define SS 1.0122292801892716288
44#define QZMS2T 1.8802791590152706439e-9
45#define F 3.35281066474748e-3
46#define MFACTOR 7.292115e-5
52 m_class =
line1.at(7);
53 m_id =
line1.mid(9, 8);
54 m_epoch =
line1.midRef(18, 14).toDouble();
55 m_first_deriv =
line1.midRef(33, 10).toDouble() / (XPDOTP * MINPD);
57 line1.midRef(44, 6).toDouble() * (1.0e-5 /
pow(10.0,
line1.midRef(51, 1).toDouble())) / (XPDOTP * MINPD * MINPD);
58 m_bstar =
line1.midRef(53, 6).toDouble() * 1.0e-5 /
pow(10.0,
line1.midRef(60, 1).toDouble());
61 m_inclination =
line2.midRef(8, 8).toDouble() * DEG2RAD;
62 m_ra =
line2.midRef(17, 8).toDouble() * DEG2RAD;
63 m_eccentricity =
line2.midRef(26, 7).toDouble() * 1.0e-7;
64 m_arg_perigee =
line2.midRef(34, 8).toDouble() * DEG2RAD;
65 m_mean_anomaly =
line2.midRef(43, 8).toDouble() * DEG2RAD;
66 m_mean_motion =
line2.midRef(52, 11).toDouble() * TWOPI / MINPD;
76 m_is_selected = Options::selectedSatellites().contains(
name);
79 double day =
modf(m_epoch * 1.e-3, &m_epoch_year) * 1.e3;
80 if (m_epoch_year < 57.)
81 m_epoch_year += 2000.;
83 m_epoch_year += 1900.;
84 double year = m_epoch_year - 1.;
91 m_tle_jd = i + 1720994.5 + B + day;
102void Satellite::init()
104 double ao,
cosio,
sinio,
cosio2,
omeosq,
posq,
rp,
rteosq,
eccsq,
con42,
cnodm,
snodm,
cosim,
sinim,
cosomm,
sinomm,
105 cc1sq,
cc2,
cc3,
coef,
coef1,
cosio4, day,
em,
emsq,
eeta,
etasq,
gam,
inclm, nm,
perige,
pinvsq,
psisq,
106 qzms24,
rtemsq,
s1,
s2,
s3,
s4,
s5,
s6,
s7,
sfour,
ss1(0),
ss2(0),
ss3(0),
ss4(0),
ss5(0),
ss6(0),
ss7(0),
107 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,
108 temp,
temp1,
temp2,
temp3,
tsi,
xpidot,
xhdot1,
z1,
z2,
z3,
z11,
z12,
z13,
z21,
z22,
z23,
z31,
z32,
z33,
ak,
d1,
200 m_is_visible =
false;
203 const double temp4 = 1.5e-12;
207 eccsq = m_eccentricity * m_eccentricity;
210 cosio = cos(m_inclination);
214 ak =
pow(XKE / m_mean_motion, X2O3);
217 adel =
ak * (1.0 - del * del - del * (1.0 / 3.0 + 134.0 * del * del / 81.0));
219 m_mean_motion = m_mean_motion / (1.0 + del);
221 ao =
pow(XKE / m_mean_motion, X2O3);
222 sinio = sin(m_inclination);
227 rp = ao * (1.0 - m_eccentricity);
231 ts70 = m_tle_jd - 2433281.5 - 7305.0;
235 c1 = 1.72027916940703639e-2;
236 thgr70 = 1.7321343856509374;
237 fk5r = 5.07551419432269442e-15;
243 if ((
omeosq >= 0.0) || (m_mean_motion >= 0.0))
245 if (
rp < (220.0 / RADIUSEARTHKM + 1.0))
249 perige = (
rp - 1.0) * RADIUSEARTHKM;
263 eta = ao * m_eccentricity *
tsi;
265 eeta = m_eccentricity * eta;
274 if (m_eccentricity > 1.0e-4)
275 cc3 = -2.0 *
coef *
tsi * J3OJ2 * m_mean_motion *
sinio / m_eccentricity;
278 (eta * (2.0 + 0.5 *
etasq) + m_eccentricity * (0.5 + 2.0 *
etasq) -
280 (-3.0 * con41 * (1.0 - 2.0 *
eeta +
etasq * (1.5 - 0.5 *
eeta)) +
281 0.75 * x1mth2 * (2.0 *
etasq -
eeta * (1.0 +
etasq)) * cos(2.0 * m_arg_perigee)));
288 mdot = m_mean_motion + 0.5 *
temp1 *
rteosq * con41 +
294 xpidot = argpdot + nodedot;
295 omgcof = m_bstar *
cc3 * cos(m_arg_perigee);
297 if (m_eccentricity > 1.0e-4)
298 xmcof = -X2O3 *
coef * m_bstar /
eeta;
306 aycof = -0.5 * J3OJ2 *
sinio;
307 delmo =
pow((1.0 + eta * cos(m_mean_anomaly)), 3);
308 sinmao = sin(m_mean_anomaly);
309 x7thm1 = 7.0 *
cosio2 - 1.0;
312 if ((TWOPI / m_mean_motion) >= 225.0)
317 inclm = m_inclination;
321 const double zes = 0.01675;
322 const double zel = 0.05490;
323 const double c1ss = 2.9864797e-6;
324 const double c1l = 4.7968065e-7;
325 const double zsinis = 0.39785416;
326 const double zcosis = 0.91744867;
327 const double zcosgs = 0.1945905;
328 const double zsings = -0.98088458;
331 double a1,
a2,
a3,
a4,
a5,
a6,
a7,
a8,
a9,
a10,
betasq, cc,
ctem,
stem, x1, x2,
x3,
x4,
x5,
x6,
x7,
x8,
332 xnodce,
xnoi,
zcosg,
zcosgl,
zcosh,
zcoshl,
zcosi,
zcosil,
zsing,
zsingl,
zsinh,
zsinhl,
zsini,
zsinil,
339 sinomm = sin(m_arg_perigee);
340 cosomm = cos(m_arg_perigee);
341 sinim = sin(m_inclination);
342 cosim = cos(m_inclination);
353 day = m_tle_jd - 2433281.5 + 18261.5 +
tc / 1440.0;
354 xnodce =
fmod(4.5236020 - 9.2422029e-4 * day, TWOPI);
361 gam = 5.8351514 + 0.0019443680 * day;
401 z31 = 12.0 * x1 * x1 - 3.0 *
x3 *
x3;
402 z32 = 24.0 * x1 * x2 - 6.0 *
x3 *
x4;
403 z33 = 12.0 * x2 * x2 - 3.0 *
x4 *
x4;
456 zmol =
fmod(4.7199672 + 0.22997150 * day -
gam, TWOPI);
457 zmos =
fmod(6.2565837 + 0.017201977 * day, TWOPI);
466 sl4 = -2.0 *
ss3 * (-21.0 - 9.0 *
emsq) *
zes;
476 xi2 = 2.0 *
s2 *
z12;
478 xl2 = -2.0 *
s3 *
z2;
479 xl3 = -2.0 *
s3 * (
z3 -
z1);
480 xl4 = -2.0 *
s3 * (-21.0 - 9.0 *
emsq) *
zel;
481 xgh2 = 2.0 *
s4 *
z32;
483 xgh4 = -18.0 *
s4 *
zel;
484 xh2 = -2.0 *
s2 *
z22;
492 const double zns = 1.19459e-5;
493 const double znl = 1.5835218e-4;
517 double ainv2,
aonv = 0.0,
cosisq,
eoc,
f220,
f221,
f311,
f321,
f322,
f330,
f441,
f442,
f522,
f523,
f542,
518 f543,
g200,
g201,
g211,
g300,
g310,
g322,
g410,
g422,
g520,
g521,
g532,
g533,
sgs,
sini2,
523 const double q22 = 1.7891679e-6;
524 const double q31 = 2.1460748e-6;
525 const double q33 = 2.2123015e-7;
526 const double root22 = 1.7891679e-6;
527 const double root44 = 7.3636953e-9;
528 const double root54 = 2.1765803e-9;
529 const double rptim = 4.37526908801129966e-3;
530 const double root32 = 3.7393792e-7;
531 const double root52 = 1.1428639e-7;
535 if ((nm < 0.0052359877) && (nm > 0.0034906585))
537 if ((nm >= 8.26e-3) && (nm <= 9.24e-3) && (
em >= 0.5))
546 if ((
inclm < 5.2359877e-2) || (
inclm > M_PI - 5.2359877e-2))
558 if ((
inclm < 5.2359877e-2) || (
inclm > M_PI - 5.2359877e-2))
588 g201 = -0.306 - (
em - 0.64) * 0.440;
593 g310 = -19.302 + 117.3900 *
em - 228.4190 *
emsq + 156.5910 *
eoc;
594 g322 = -18.9068 + 109.7927 *
em - 214.6334 *
emsq + 146.5816 *
eoc;
595 g410 = -41.122 + 242.6940 *
em - 471.0940 *
emsq + 313.9530 *
eoc;
596 g422 = -146.407 + 841.8800 *
em - 1629.014 *
emsq + 1083.4350 *
eoc;
597 g520 = -532.114 + 3017.977 *
em - 5740.032 *
emsq + 3708.2760 *
eoc;
601 g211 = -72.099 + 331.819 *
em - 508.738 *
emsq + 266.724 *
eoc;
602 g310 = -346.844 + 1582.851 *
em - 2415.925 *
emsq + 1246.113 *
eoc;
603 g322 = -342.585 + 1554.908 *
em - 2366.899 *
emsq + 1215.972 *
eoc;
604 g410 = -1052.797 + 4758.686 *
em - 7193.992 *
emsq + 3651.957 *
eoc;
605 g422 = -3581.690 + 16178.110 *
em - 24462.770 *
emsq + 12422.520 *
eoc;
607 g520 = -5149.66 + 29936.92 *
em - 54087.36 *
emsq + 31324.56 *
eoc;
609 g520 = 1464.74 - 4664.75 *
em + 3763.64 *
emsq;
613 g533 = -919.22770 + 4988.6100 *
em - 9064.7700 *
emsq + 5542.21 *
eoc;
614 g521 = -822.71072 + 4568.6173 *
em - 8491.4146 *
emsq + 5337.524 *
eoc;
615 g532 = -853.66600 + 4690.2500 *
em - 8624.7700 *
emsq + 5341.4 *
eoc;
619 g533 = -37995.780 + 161616.52 *
em - 229838.20 *
emsq + 109377.94 *
eoc;
620 g521 = -51752.104 + 218913.95 *
em - 309468.16 *
emsq + 146349.42 *
eoc;
621 g532 = -40023.880 + 170470.89 *
em - 242699.48 *
emsq + 115605.82 *
eoc;
659 xlamo =
fmod(m_mean_anomaly + m_ra + m_ra - theta - theta, TWOPI);
660 xfact = mdot + dmdt + 2.0 * (nodedot + dnodt -
rptim) - m_mean_motion;
679 xlamo =
fmod(m_mean_anomaly + m_ra + m_arg_perigee - theta, TWOPI);
680 xfact = mdot +
xpidot -
rptim + dmdt + domdt + dnodt - m_mean_motion;
696 temp = d2 *
tsi * cc1 / 3.0;
697 d3 = (17.0 * ao +
sfour) * temp;
698 d4 = 0.5 * temp * ao *
tsi * (221.0 * ao + 31.0 *
sfour) * cc1;
699 t3cof = d2 + 2.0 *
cc1sq;
700 t4cof = 0.25 * (3.0 * d3 + cc1 * (12.0 * d2 + 10.0 *
cc1sq));
701 t5cof = 0.2 * (3.0 * d4 + 12.0 * cc1 * d3 + 6.0 * d2 * d2 + 15.0 *
cc1sq * (2.0 * d2 +
cc1sq));
709 return sgp4((data->
clock()->
utc().djd() - m_tle_jd) * MINPD);
712int Satellite::sgp4(
double tsince)
717 double am,
axnl,
aynl,
betal,
cosim,
cnod,
cos2u,
coseo1 = 0,
cosi,
cosip,
cosisq,
cossu,
cosu,
delm,
delomg,
em,
719 mrt = 0.0,
mvt,
rdotl,
rl,
rvdot,
rvdotl,
sinim,
dndt,
sin2u,
sineo1 = 0,
sini,
sinip,
sinsu,
sinu,
snod,
su,
t2,
720 t3,
t4,
tem5, temp,
temp1,
temp2,
tempa,
tempe,
templ,
u,
ux,
uy,
uz,
vx,
vy,
vz,
inclm,
mm, nm,
nodem,
xinc,
721 xincp,
xl,
xlm,
mp,
xmdf,
xmx,
xmy,
nodedf,
xnode,
nodep,
tc,
sat_posx,
sat_posy,
sat_posz,
sat_posw,
sat_velx,
726 const double temp4 = 1.5e-12;
747 delm = xmcof * (
pow((1.0 + eta * cos(
xmdf)), 3) - delmo);
760 inclm = m_inclination;
770 const double fasx2 = 0.13130908;
771 const double fasx4 = 2.8843198;
772 const double fasx6 = 0.37448087;
773 const double g22 = 5.7686396;
774 const double g32 = 0.95240898;
775 const double g44 = 1.8014998;
776 const double g52 = 1.0508330;
777 const double g54 = 4.4108898;
778 const double rptim = 4.37526908801129966e-3;
779 const double step = 720.0;
780 const double step2 = step * step / 2;
816 xndt = del1 * sin(xli -
fasx2) + del2 * sin(2.0 * (xli -
fasx4)) + del3 * sin(3.0 * (xli -
fasx6));
818 xnddt = del1 * cos(xli -
fasx2) + 2.0 * del2 * cos(2.0 * (xli -
fasx4)) +
819 3.0 * del3 * cos(3.0 * (xli -
fasx6));
825 xomi = m_arg_perigee + argpdot * atime;
835 d5232 * cos(-
xomi + xli -
g52) +
855 atime = atime +
delt;
865 dndt = nm - m_mean_motion;
870 dndt = nm - m_mean_motion;
873 nm = m_mean_motion +
dndt;
884 nm = XKE /
pow(
am, 1.5);
887 if ((
em >= 1.0) || (
em < -0.001))
922 double alfdp,
betdp,
cosip,
cosop,
dalf,
dbet,
dls,
f2,
f3,
pe,
pgh,
ph,
pinc,
pl,
sel,
ses,
sghl,
sghs,
shll,
923 shs,
sil,
sinip,
sinop,
sinzf,
sis,
sll,
sls,
xls,
xnoh,
zf,
zm;
926 const double zns = 1.19459e-5;
927 const double zes = 0.01675;
928 const double znl = 1.5835218e-4;
929 const double zel = 0.05490;
1017 if ((ep < 0.0) || (ep > 1.0))
1029 aycof = -0.5 * J3OJ2 *
sinip;
1036 temp = 1.0 / (
am * (1.0 - ep * ep));
1061 pl =
am * (1.0 - el2);
1080 temp1 = 0.5 * J2 * temp;
1087 con41 = 3.0 *
cosisq - 1.0;
1089 x7thm1 = 7.0 *
cosisq - 1.0;
1145 sq = (1.0 - F) * (1.0 - F) * c;
1175 double elevation = arcSin(
top_z / m_range);
1180 setAz(azimuth / DEG2RAD);
1181 setAlt(elevation / DEG2RAD);
1186 double mjd, year, T, M, L, e, C, O,
Lsa,
nu, R, eps;
1189 year = 1900.0 +
mjd / 365.25;
1190 T = (
mjd + deltaET(year) / (MINPD * 60.0)) / 36525.0;
1191 M = DEG2RAD * (Modulus(358.47583 + Modulus(35999.04975 * T, 360.0) - (0.000150 + 0.0000033 * T) * T * T, 360.0));
1192 L = DEG2RAD * (Modulus(279.69668 + Modulus(36000.76892 * T, 360.0) + 0.0003025 * T * T, 360.0));
1193 e = 0.01675104 - (0.0000418 + 0.000000126 * T) * T;
1194 C = DEG2RAD * ((1.919460 - (0.004789 + 0.000014 * T) * T) * sin(M) + (0.020094 - 0.000100 * T) * sin(2 * M) +
1195 0.000293 * sin(3 * M));
1196 O = DEG2RAD * (Modulus(259.18 - 1934.142 * T, 360.0));
1197 Lsa = Modulus(L + C - DEG2RAD * (0.00569 - 0.00479 * sin(O)), TWOPI);
1198 nu = Modulus(M + C, TWOPI);
1199 R = 1.0000002 * (1.0 - e * e) / (1.0 + e * cos(
nu));
1200 eps = DEG2RAD * (23.452294 - (0.0130125 + (0.00000164 - 0.000000503 * T) * T) * T + 0.00256 * cos(O));
1227 m_is_visible = !m_is_eclipsed && sun->
alt().Degrees() <= -12.0 && elevation >= 0.0;
1237 return i18n(
"Success");
1241 return i18n(
"Eccentricity >= 1.0 or < -0.001");
1244 return i18n(
"Mean motion less than 0.0");
1247 return i18n(
"Semi-latus rectum < 0.0");
1250 return i18n(
"Satellite has decayed");
1253 return i18n(
"Unknown error");
1257double Satellite::arcSin(
double arg)
1259 if (
fabs(arg) >= 1.)
1267 return (
atan(arg /
sqrt(1. - arg * arg)));
1270double Satellite::deltaET(
double year)
1274 delta_et = 26.465 + 0.747622 * (year - 1950) + 1.886913 * sin(TWOPI * (year - 1975) / 33);
1279double Satellite::Modulus(
double arg1,
double arg2)
1296 return m_is_visible;
1301 return m_is_selected;
const CachingDms * lat() const
Child class of KSPlanetBase; encapsulates information about the Sun.
KStarsData is the backbone of KStars.
Q_INVOKABLE SimClock * clock()
SkyMapComposite * skyComposite()
Represents an artificial satellites.
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
SkyObject * findByName(const QString &name, bool exact=true) override
Search the children of this SkyMapComposite for a SkyObject whose name matches the argument.
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.
QString i18n(const char *text, const TYPE &arg...)