Completed
Push — master ( d35909...f740b5 )
by Yannick
06:46
created

Predict_SGPSDP   F

Complexity

Total Complexity 59

Size/Duplication

Total Lines 1035
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 8

Importance

Changes 0
Metric Value
dl 0
loc 1035
rs 3
c 0
b 0
f 0
wmc 59
lcom 0
cbo 8

4 Methods

Rating   Name   Duplication   Size   Complexity  
D SGP4() 0 237 10
C SDP4() 0 221 7
F Deep() 0 500 40
A getInstance() 0 9 2

How to fix   Complexity   

Complex Class

Complex classes like Predict_SGPSDP often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Predict_SGPSDP, and based on these observations, apply Extract Interface, too.

1
<?php
2
/*
3
 * Ported to PHP by Bill Shupp from the sgp4sdp4 code in gpredict
4
 *
5
 * Original comments below
6
 */
7
8
//require_once 'Predict.php';
9
require_once 'Time.php';
10
require_once 'Math.php';
11
12
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
13
/*
14
 *  Unit SGP4SDP4
15
 *           Author:  Dr TS Kelso
16
 * Original Version:  1991 Oct 30
17
 * Current Revision:  1992 Sep 03
18
 *          Version:  1.50
19
 *        Copyright:  1991-1992, All Rights Reserved
20
 *
21
 *   Ported to C by:  Neoklis Kyriazis  April 10  2001
22
 *   Reentrancy mods by Alexandru Csete OZ9AEC
23
 */
24
class Predict_SGPSDP
25
{
26
    const ALL_FLAGS             = -1;
27
    const SGP_INITIALIZED_FLAG  = 0x000001;
28
    const SGP4_INITIALIZED_FLAG = 0x000002;
29
    const SDP4_INITIALIZED_FLAG = 0x000004;
30
    const SGP8_INITIALIZED_FLAG = 0x000008;
31
    const SDP8_INITIALIZED_FLAG = 0x000010;
32
    const SIMPLE_FLAG           = 0x000020;
33
    const DEEP_SPACE_EPHEM_FLAG = 0x000040;
34
    const LUNAR_TERMS_DONE_FLAG = 0x000080;
35
    const NEW_EPHEMERIS_FLAG    = 0x000100;
36
    const DO_LOOP_FLAG          = 0x000200;
37
    const RESONANCE_FLAG        = 0x000400;
38
    const SYNCHRONOUS_FLAG      = 0x000800;
39
    const EPOCH_RESTART_FLAG    = 0x001000;
40
    const VISIBLE_FLAG          = 0x002000;
41
    const SAT_ECLIPSED_FLAG     = 0x004000;
42
43
    /* orbit_type_t struct */
44
    const ORBIT_TYPE_UNKNOWN = 0;
45
    const ORBIT_TYPE_LEO     = 1;            /*!< Low Earth orbit, up to 1200 km. */
46
    const ORBIT_TYPE_ICO     = 2;            /*!< Intermediate Circular Orbit, up to 1400 km. */
47
    const ORBIT_TYPE_GEO     = 3;            /*!< Geostationary. */
48
    const ORBIT_TYPE_GSO     = 4;            /*!< Geosynchronuous. */
49
    const ORBIT_TYPE_MOLNIYA = 5;
50
    const ORBIT_TYPE_TUNDRA  = 6;
51
    const ORBIT_TYPE_POLAR   = 7;
52
    const ORBIT_TYPE_SUNSYNC = 8;
53
    const ORBIT_TYPE_DECAYED = 9;
54
55
56
57
    /* Entry points of Deep()
58
    // FIXME: Change to enu */
59
    const dpinit = 1; /* Deep-space initialization code */
60
    const dpsec  = 2; /* Deep-space secular code        */
61
    const dpper  = 3; /* Deep-space periodic code       */
62
63
    /* SGP4 */
64
    /* This function is used to calculate the position and velocity */
65
    /* of near-earth (period < 225 minutes) satellites. tsince is   */
66
    /* time since epoch in minutes, tle is a pointer to a tle_t     */
67
    /* structure with Keplerian orbital elements and pos and vel    */
68
    /* are vector_t structures returning ECI satellite position and */
69
    /* velocity. Use Convert_Sat_State() to convert to km and km/s.*/
70
    public function SGP4(Predict_Sat $sat, $tsince)
71
    {
72
        /* Initialization */
73
        if (~$sat->flags & self::SGP4_INITIALIZED_FLAG) {
74
            $sat->flags |= self::SGP4_INITIALIZED_FLAG;
75
76
            /* Recover original mean motion (xnodp) and   */
77
            /* semimajor axis (aodp) from input elements. */
78
            $a1 = pow(Predict::xke / $sat->tle->xno, Predict::tothrd);
79
            $sat->sgps->cosio = cos($sat->tle->xincl);
80
            $theta2 = $sat->sgps->cosio * $sat->sgps->cosio;
81
            $sat->sgps->x3thm1 = 3 * $theta2 - 1.0;
82
            $eosq = $sat->tle->eo * $sat->tle->eo;
83
            $betao2 = 1 - $eosq;
84
            $betao = sqrt($betao2);
85
            $del1 = 1.5 * Predict::ck2 * $sat->sgps->x3thm1 / ($a1 * $a1 * $betao * $betao2);
86
            $ao = $a1 * (1 - $del1 * (0.5 * Predict::tothrd + $del1 * (1 + 134.0 / 81.0 * $del1)));
87
            $delo = 1.5 * Predict::ck2 * $sat->sgps->x3thm1 / ($ao * $ao * $betao * $betao2);
88
            $sat->sgps->xnodp = $sat->tle->xno / (1.0 + $delo);
89
            $sat->sgps->aodp = $ao / (1.0 - $delo);
90
91
            /* For perigee less than 220 kilometers, the "simple" flag is set */
92
            /* and the equations are truncated to linear variation in sqrt a  */
93
            /* and quadratic variation in mean anomaly.  Also, the c3 term,   */
94
            /* the delta omega term, and the delta m term are dropped.        */
95
            if (($sat->sgps->aodp * (1.0 - $sat->tle->eo) / Predict::ae) < (220.0 / Predict::xkmper + Predict::ae)) {
96
                $sat->flags |= self::SIMPLE_FLAG;
97
            } else {
98
                $sat->flags &= ~self::SIMPLE_FLAG;
99
            }
100
101
            /* For perigee below 156 km, the       */
102
            /* values of s and qoms2t are altered. */
103
            $s4 = Predict::__s__;
104
            $qoms24 = Predict::qoms2t;
105
            $perige = ($sat->sgps->aodp * (1 - $sat->tle->eo) - Predict::ae) * Predict::xkmper;
106
            if ($perige < 156.0) {
107
                if ($perige <= 98.0) {
108
                    $s4 = 20.0;
109
                } else {
110
                    $s4 = $perige - 78.0;
111
                }
112
                $qoms24 = pow((120.0 - $s4) * Predict::ae / Predict::xkmper, 4);
113
                $s4 = $s4 / Predict::xkmper + Predict::ae;
114
            }; /* FIXME FIXME: End of if(perige <= 98) NO WAY!!!! */
115
116
            $pinvsq = 1.0 / ($sat->sgps->aodp * $sat->sgps->aodp * $betao2 * $betao2);
117
            $tsi = 1.0 / ($sat->sgps->aodp - $s4);
118
            $sat->sgps->eta = $sat->sgps->aodp * $sat->tle->eo * $tsi;
119
            $etasq = $sat->sgps->eta * $sat->sgps->eta;
120
            $eeta = $sat->tle->eo * $sat->sgps->eta;
121
            $psisq = abs(1.0 - $etasq);
122
            $coef = $qoms24 * pow($tsi, 4);
123
            $coef1 = $coef / pow($psisq, 3.5);
124
            $c2 = $coef1 * $sat->sgps->xnodp * ($sat->sgps->aodp *
125
                            (1.0 + 1.5 * $etasq + $eeta * (4.0 + $etasq)) +
126
                            0.75 * Predict::ck2 * $tsi / $psisq * $sat->sgps->x3thm1 *
127
                            (8.0 + 3.0 * $etasq * (8 + $etasq)));
128
            $sat->sgps->c1 = $c2 * $sat->tle->bstar;
129
            $sat->sgps->sinio = sin($sat->tle->xincl);
130
            $a3ovk2 = -Predict::xj3 / Predict::ck2 * pow(Predict::ae, 3);
131
            $c3 = $coef * $tsi * $a3ovk2 * $sat->sgps->xnodp * Predict::ae * $sat->sgps->sinio / $sat->tle->eo;
132
            $sat->sgps->x1mth2 = 1.0 - $theta2;
133
            $sat->sgps->c4 = 2.0 * $sat->sgps->xnodp * $coef1 * $sat->sgps->aodp * $betao2 *
134
                ($sat->sgps->eta * (2.0 + 0.5 * $etasq) +
135
                 $sat->tle->eo * (0.5 + 2.0 * $etasq) -
136
                 2.0 * Predict::ck2 * $tsi / ($sat->sgps->aodp * $psisq) *
137
                 (-3.0 * $sat->sgps->x3thm1 * (1.0 - 2.0 * $eeta + $etasq * (1.5 - 0.5 * $eeta)) +
138
                  0.75 * $sat->sgps->x1mth2 * (2.0 * $etasq - $eeta * (1.0 + $etasq)) *
139
                  cos(2.0 * $sat->tle->omegao)));
140
            $sat->sgps->c5 = 2.0 * $coef1 * $sat->sgps->aodp * $betao2 *
141
                (1.0 + 2.75 * ($etasq + $eeta) + $eeta * $etasq);
142
            $theta4 = $theta2 * $theta2;
143
            $temp1 = 3.0 * Predict::ck2 * $pinvsq * $sat->sgps->xnodp;
144
            $temp2 = $temp1 * Predict::ck2 * $pinvsq;
145
            $temp3 = 1.25 * Predict::ck4 * $pinvsq * $pinvsq * $sat->sgps->xnodp;
146
            $sat->sgps->xmdot = $sat->sgps->xnodp + 0.5 * $temp1 * $betao * $sat->sgps->x3thm1 +
147
                0.0625 * $temp2 * $betao * (13.0 - 78.0 * $theta2 + 137.0 * $theta4);
148
            $x1m5th = 1.0 - 5.0 * $theta2;
149
            $sat->sgps->omgdot = -0.5 * $temp1 * $x1m5th +
150
                0.0625 * $temp2 * (7.0 - 114.0 * $theta2 + 395.0 * $theta4) +
151
                $temp3 * (3.0 - 36.0 * $theta2 + 49.0 * $theta4);
152
            $xhdot1 = -$temp1 * $sat->sgps->cosio;
153
            $sat->sgps->xnodot = $xhdot1 + (0.5 * $temp2 * (4.0 - 19.0 * $theta2) +
154
                             2.0 * $temp3 * (3.0 - 7.0 * $theta2)) * $sat->sgps->cosio;
155
            $sat->sgps->omgcof = $sat->tle->bstar * $c3 * cos($sat->tle->omegao);
156
            $sat->sgps->xmcof = -Predict::tothrd * $coef * $sat->tle->bstar * Predict::ae / $eeta;
157
            $sat->sgps->xnodcf = 3.5 * $betao2 * $xhdot1 * $sat->sgps->c1;
158
            $sat->sgps->t2cof = 1.5 * $sat->sgps->c1;
159
            $sat->sgps->xlcof = 0.125 * $a3ovk2 * $sat->sgps->sinio *
160
                (3.0 + 5.0 * $sat->sgps->cosio) / (1.0 + $sat->sgps->cosio);
161
            $sat->sgps->aycof = 0.25 * $a3ovk2 * $sat->sgps->sinio;
162
            $sat->sgps->delmo = pow(1.0 + $sat->sgps->eta * cos($sat->tle->xmo), 3);
163
            $sat->sgps->sinmo = sin($sat->tle->xmo);
164
            $sat->sgps->x7thm1 = 7.0 * $theta2 - 1.0;
165
            if (~$sat->flags & self::SIMPLE_FLAG) {
166
                $c1sq = $sat->sgps->c1 * $sat->sgps->c1;
167
                $sat->sgps->d2 = 4.0 * $sat->sgps->aodp * $tsi * $c1sq;
168
                $temp = $sat->sgps->d2 * $tsi * $sat->sgps->c1 / 3.0;
169
                $sat->sgps->d3 = (17.0 * $sat->sgps->aodp + $s4) * $temp;
170
                $sat->sgps->d4 = 0.5 * $temp * $sat->sgps->aodp * $tsi *
171
                    (221.0 * $sat->sgps->aodp + 31.0 * $s4) * $sat->sgps->c1;
172
                $sat->sgps->t3cof = $sat->sgps->d2 + 2.0 * $c1sq;
173
                $sat->sgps->t4cof = 0.25 * (3.0 * $sat->sgps->d3 + $sat->sgps->c1 *
174
                              (12.0 * $sat->sgps->d2 + 10.0 * $c1sq));
175
                $sat->sgps->t5cof = 0.2 * (3.0 * $sat->sgps->d4 +
176
                             12.0 * $sat->sgps->c1 * $sat->sgps->d3 +
177
                             6.0 * $sat->sgps->d2 * $sat->sgps->d2 +
178
                             15.0 * $c1sq * (2.0 * $sat->sgps->d2 + $c1sq));
179
            }; /* End of if (isFlagClear(SIMPLE_FLAG)) */
180
        }; /* End of SGP4() initialization */
181
182
        /* Update for secular gravity and atmospheric drag. */
183
        $xmdf = $sat->tle->xmo + $sat->sgps->xmdot * $tsince;
184
        $omgadf = $sat->tle->omegao + $sat->sgps->omgdot * $tsince;
185
        $xnoddf = $sat->tle->xnodeo + $sat->sgps->xnodot * $tsince;
186
        $omega = $omgadf;
187
        $xmp = $xmdf;
188
        $tsq = $tsince * $tsince;
189
        $xnode = $xnoddf + $sat->sgps->xnodcf * $tsq;
190
        $tempa = 1.0 - $sat->sgps->c1 * $tsince;
191
        $tempe = $sat->tle->bstar * $sat->sgps->c4 * $tsince;
192
        $templ = $sat->sgps->t2cof * $tsq;
193
        if (~$sat->flags & self::SIMPLE_FLAG) {
194
            $delomg = $sat->sgps->omgcof * $tsince;
195
            $delm = $sat->sgps->xmcof * (pow(1 + $sat->sgps->eta * cos($xmdf), 3) - $sat->sgps->delmo);
196
            $temp = $delomg + $delm;
197
            $xmp = $xmdf + $temp;
198
            $omega = $omgadf - $temp;
199
            $tcube = $tsq * $tsince;
200
            $tfour = $tsince * $tcube;
201
            $tempa = $tempa - $sat->sgps->d2 * $tsq - $sat->sgps->d3 * $tcube - $sat->sgps->d4 * $tfour;
202
            $tempe = $tempe + $sat->tle->bstar * $sat->sgps->c5 * (sin($xmp) - $sat->sgps->sinmo);
203
            $templ = $templ + $sat->sgps->t3cof * $tcube + $tfour *
204
                ($sat->sgps->t4cof + $tsince * $sat->sgps->t5cof);
205
        }; /* End of if (isFlagClear(SIMPLE_FLAG)) */
206
207
        $a = $sat->sgps->aodp * pow($tempa, 2);
208
        $e = $sat->tle->eo - $tempe;
209
        $xl = $xmp + $omega + $xnode + $sat->sgps->xnodp * $templ;
210
        $beta = sqrt(1.0 - ($e * $e));
211
        $xn = Predict::xke / pow($a, 1.5);
212
213
        /* Long period periodics */
214
        $axn = $e * cos($omega);
215
        $temp = 1.0 / ($a * $beta * $beta);
216
        $xll = $temp * $sat->sgps->xlcof * $axn;
217
        $aynl = $temp * $sat->sgps->aycof;
218
        $xlt = $xl + $xll;
219
        $ayn = $e * sin($omega) + $aynl;
220
221
        /* Solve Kepler's' Equation */
222
        $capu = Predict_Math::FMod2p($xlt - $xnode);
223
        $temp2 = $capu;
224
225
        $i = 0;
226
        do {
227
            $sinepw = sin($temp2);
228
            $cosepw = cos($temp2);
229
            $temp3 = $axn * $sinepw;
230
            $temp4 = $ayn * $cosepw;
231
            $temp5 = $axn * $cosepw;
232
            $temp6 = $ayn * $sinepw;
233
            $epw = ($capu - $temp4 + $temp3 - $temp2) / (1.0 - $temp5 - $temp6) + $temp2;
234
            if (abs($epw - $temp2) <= Predict::e6a) {
235
                break;
236
            }
237
            $temp2 = $epw;
238
        } while ($i++ < 10);
239
240
        /* Short period preliminary quantities */
241
        $ecose = $temp5 + $temp6;
242
        $esine = $temp3 - $temp4;
243
        $elsq = $axn * $axn + $ayn * $ayn;
244
        $temp = 1.0 - $elsq;
245
        $pl = $a * $temp;
246
        $r = $a * (1.0 - $ecose);
247
        $temp1 = 1.0 / $r;
248
        $rdot = Predict::xke * sqrt($a) * $esine * $temp1;
249
        $rfdot = Predict::xke * sqrt($pl) * $temp1;
250
        $temp2 = $a * $temp1;
251
        $betal = sqrt($temp);
252
        $temp3 = 1.0 / (1.0 + $betal);
253
        $cosu = $temp2 * ($cosepw - $axn + $ayn * $esine * $temp3);
254
        $sinu = $temp2 * ($sinepw - $ayn - $axn * $esine * $temp3);
255
        $u = Predict_Math::AcTan($sinu, $cosu);
256
        $sin2u = 2.0 * $sinu * $cosu;
257
        $cos2u = 2.0 * $cosu * $cosu - 1.0;
258
        $temp = 1.0 / $pl;
259
        $temp1 = Predict::ck2 * $temp;
260
        $temp2 = $temp1 * $temp;
261
262
        /* Update for short periodics */
263
        $rk = $r * (1.0 - 1.5 * $temp2 * $betal * $sat->sgps->x3thm1) +
264
            0.5 * $temp1 * $sat->sgps->x1mth2 * $cos2u;
265
        $uk = $u - 0.25 * $temp2 * $sat->sgps->x7thm1 * $sin2u;
266
        $xnodek = $xnode + 1.5 * $temp2 * $sat->sgps->cosio * $sin2u;
267
        $xinck = $sat->tle->xincl + 1.5 * $temp2 * $sat->sgps->cosio * $sat->sgps->sinio * $cos2u;
268
        $rdotk = $rdot - $xn * $temp1 * $sat->sgps->x1mth2 * $sin2u;
269
        $rfdotk = $rfdot + $xn * $temp1 * ($sat->sgps->x1mth2 * $cos2u + 1.5 * $sat->sgps->x3thm1);
270
271
272
        /* Orientation vectors */
273
        $sinuk = sin($uk);
274
        $cosuk = cos($uk);
275
        $sinik = sin($xinck);
276
        $cosik = cos($xinck);
277
        $sinnok = sin($xnodek);
278
        $cosnok = cos($xnodek);
279
        $xmx = -$sinnok * $cosik;
280
        $xmy = $cosnok * $cosik;
281
        $ux = $xmx * $sinuk + $cosnok * $cosuk;
282
        $uy = $xmy * $sinuk + $sinnok * $cosuk;
283
        $uz = $sinik * $sinuk;
284
        $vx = $xmx * $cosuk - $cosnok * $sinuk;
285
        $vy = $xmy * $cosuk - $sinnok * $sinuk;
286
        $vz = $sinik * $cosuk;
287
288
        /* Position and velocity */
289
        $sat->pos->x = $rk * $ux;
0 ignored issues
show
Documentation Bug introduced by
The property $x was declared of type integer, but $rk * $ux is of type double. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
290
        $sat->pos->y = $rk * $uy;
0 ignored issues
show
Documentation Bug introduced by
The property $y was declared of type integer, but $rk * $uy is of type double. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
291
        $sat->pos->z = $rk * $uz;
0 ignored issues
show
Documentation Bug introduced by
The property $z was declared of type integer, but $rk * $uz is of type double. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
292
        $sat->vel->x = $rdotk * $ux + $rfdotk * $vx;
0 ignored issues
show
Documentation Bug introduced by
The property $x was declared of type integer, but $rdotk * $ux + $rfdotk * $vx is of type double. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
293
        $sat->vel->y = $rdotk * $uy + $rfdotk * $vy;
0 ignored issues
show
Documentation Bug introduced by
The property $y was declared of type integer, but $rdotk * $uy + $rfdotk * $vy is of type double. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
294
        $sat->vel->z = $rdotk * $uz + $rfdotk * $vz;
0 ignored issues
show
Documentation Bug introduced by
The property $z was declared of type integer, but $rdotk * $uz + $rfdotk * $vz is of type double. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
295
296
        $sat->phase = $xlt - $xnode - $omgadf + Predict::twopi;
297
        if ($sat->phase < 0) {
298
            $sat->phase += Predict::twopi;
299
        }
300
        $sat->phase = Predict_Math::FMod2p($sat->phase);
301
302
        $sat->tle->omegao1 = $omega;
303
        $sat->tle->xincl1  = $xinck;
304
        $sat->tle->xnodeo1 = $xnodek;
305
306
    } /*SGP4*/
307
308
    /* SDP4 */
309
    /* This function is used to calculate the position and velocity */
310
    /* of deep-space (period > 225 minutes) satellites. tsince is   */
311
    /* time since epoch in minutes, tle is a pointer to a tle_t     */
312
    /* structure with Keplerian orbital elements and pos and vel    */
313
    /* are vector_t structures returning ECI satellite position and */
314
    /* velocity. Use Convert_Sat_State() to convert to km and km/s. */
315
    public function SDP4(Predict_Sat $sat, $tsince)
316
    {
317
        /* Initialization */
318
        if (~$sat->flags & self::SDP4_INITIALIZED_FLAG) {
319
320
            $sat->flags |= self::SDP4_INITIALIZED_FLAG;
321
322
            /* Recover original mean motion (xnodp) and   */
323
            /* semimajor axis (aodp) from input elements. */
324
            $a1 = pow(Predict::xke / $sat->tle->xno, Predict::tothrd);
325
            $sat->deep_arg->cosio = cos($sat->tle->xincl);
326
            $sat->deep_arg->theta2 = $sat->deep_arg->cosio * $sat->deep_arg->cosio;
327
            $sat->sgps->x3thm1 = 3.0 * $sat->deep_arg->theta2 - 1.0;
328
            $sat->deep_arg->eosq = $sat->tle->eo * $sat->tle->eo;
329
            $sat->deep_arg->betao2 = 1.0 - $sat->deep_arg->eosq;
330
            $sat->deep_arg->betao = sqrt($sat->deep_arg->betao2);
331
            $del1 = 1.5 * Predict::ck2 * $sat->sgps->x3thm1 /
332
                ($a1 * $a1 * $sat->deep_arg->betao * $sat->deep_arg->betao2);
333
            $ao = $a1 * (1.0 - $del1 * (0.5 * Predict::tothrd + $del1 * (1.0 + 134.0 / 81.0 * $del1)));
334
            $delo = 1.5 * Predict::ck2 * $sat->sgps->x3thm1 /
335
                ($ao * $ao * $sat->deep_arg->betao * $sat->deep_arg->betao2);
336
            $sat->deep_arg->xnodp = $sat->tle->xno / (1.0 + $delo);
337
            $sat->deep_arg->aodp = $ao / (1.0 - $delo);
338
339
            /* For perigee below 156 km, the values */
340
            /* of s and qoms2t are altered.         */
341
            $s4 = Predict::__s__;
342
            $qoms24 = Predict::qoms2t;
343
            $perige = ($sat->deep_arg->aodp * (1.0 - $sat->tle->eo) - Predict::ae) * Predict::xkmper;
344
            if ($perige < 156.0) {
345
                if ($perige <= 98.0) {
346
                    $s4 = 20.0;
347
                } else {
348
                    $s4 = $perige - 78.0;
349
                }
350
                $qoms24 = pow((120.0 - $s4) * Predict::ae / Predict::xkmper, 4);
351
                $s4 = $s4 / Predict::xkmper + Predict::ae;
352
            }
353
            $pinvsq = 1.0 / ($sat->deep_arg->aodp * $sat->deep_arg->aodp *
354
                    $sat->deep_arg->betao2 * $sat->deep_arg->betao2);
355
            $sat->deep_arg->sing = sin($sat->tle->omegao);
356
            $sat->deep_arg->cosg = cos($sat->tle->omegao);
357
            $tsi = 1.0 / ($sat->deep_arg->aodp - $s4);
358
            $eta = $sat->deep_arg->aodp * $sat->tle->eo * $tsi;
359
            $etasq = $eta * $eta;
360
            $eeta = $sat->tle->eo * $eta;
361
            $psisq = abs(1.0 - $etasq);
362
            $coef = $qoms24 * pow($tsi, 4);
363
            $coef1 = $coef / pow($psisq, 3.5);
364
            $c2 = $coef1 * $sat->deep_arg->xnodp * ($sat->deep_arg->aodp *
365
                                (1.0 + 1.5 * $etasq + $eeta *
366
                                 (4.0 + $etasq)) + 0.75 * Predict::ck2 * $tsi / $psisq *
367
                                $sat->sgps->x3thm1 * (8.0 + 3.0 * $etasq *
368
                                        (8.0 + $etasq)));
369
            $sat->sgps->c1 = $sat->tle->bstar * $c2;
370
            $sat->deep_arg->sinio = sin($sat->tle->xincl);
371
            $a3ovk2 = -Predict::xj3 / Predict::ck2 * pow(Predict::ae, 3);
372
            $sat->sgps->x1mth2 = 1.0 - $sat->deep_arg->theta2;
373
            $sat->sgps->c4 = 2.0 * $sat->deep_arg->xnodp * $coef1 *
374
                $sat->deep_arg->aodp * $sat->deep_arg->betao2 *
375
                ($eta * (2.0 + 0.5 * $etasq) + $sat->tle->eo *
376
                 (0.5 + 2.0 * $etasq) - 2.0 * Predict::ck2 * $tsi /
377
                 ($sat->deep_arg->aodp * $psisq) * (-3.0 * $sat->sgps->x3thm1 *
378
                                 (1.0 - 2.0 * $eeta + $etasq *
379
                                  (1.5 - 0.5 * $eeta)) +
380
                                 0.75 * $sat->sgps->x1mth2 *
381
                                 (2.0 * $etasq - $eeta * (1.0 + $etasq)) *
382
                                 cos(2.0 * $sat->tle->omegao)));
383
            $theta4 = $sat->deep_arg->theta2 * $sat->deep_arg->theta2;
384
            $temp1 = 3.0 * Predict::ck2 * $pinvsq * $sat->deep_arg->xnodp;
385
            $temp2 = $temp1 * Predict::ck2 * $pinvsq;
386
            $temp3 = 1.25 * Predict::ck4 * $pinvsq * $pinvsq * $sat->deep_arg->xnodp;
387
            $sat->deep_arg->xmdot = $sat->deep_arg->xnodp + 0.5 * $temp1 * $sat->deep_arg->betao *
388
                $sat->sgps->x3thm1 + 0.0625 * $temp2 * $sat->deep_arg->betao *
389
                (13.0 - 78.0 * $sat->deep_arg->theta2 + 137.0 * $theta4);
390
            $x1m5th = 1.0 - 5.0 * $sat->deep_arg->theta2;
391
            $sat->deep_arg->omgdot = -0.5 * $temp1 * $x1m5th + 0.0625 * $temp2 *
392
                            (7.0 - 114.0 * $sat->deep_arg->theta2 + 395.0 * $theta4) +
393
                        $temp3 * (3.0 - 36.0 * $sat->deep_arg->theta2 + 49.0 * $theta4);
394
            $xhdot1 = -$temp1 * $sat->deep_arg->cosio;
395
            $sat->deep_arg->xnodot = $xhdot1 + (0.5 * $temp2 * (4.0 - 19.0 * $sat->deep_arg->theta2) +
396
                             2.0 * $temp3 * (3.0 - 7.0 * $sat->deep_arg->theta2)) *
397
                $sat->deep_arg->cosio;
398
            $sat->sgps->xnodcf = 3.5 * $sat->deep_arg->betao2 * $xhdot1 * $sat->sgps->c1;
399
            $sat->sgps->t2cof = 1.5 * $sat->sgps->c1;
400
            $sat->sgps->xlcof = 0.125 * $a3ovk2 * $sat->deep_arg->sinio *
401
                (3.0 + 5.0 * $sat->deep_arg->cosio) / (1.0 + $sat->deep_arg->cosio);
402
            $sat->sgps->aycof = 0.25 * $a3ovk2 * $sat->deep_arg->sinio;
403
            $sat->sgps->x7thm1 = 7.0 * $sat->deep_arg->theta2 - 1.0;
404
405
            /* initialize Deep() */
406
            $this->Deep(self::dpinit, $sat);
407
        }; /*End of SDP4() initialization */
408
409
        /* Update for secular gravity and atmospheric drag */
410
        $xmdf = $sat->tle->xmo + $sat->deep_arg->xmdot * $tsince;
411
        $sat->deep_arg->omgadf = $sat->tle->omegao + $sat->deep_arg->omgdot * $tsince;
412
        $xnoddf = $sat->tle->xnodeo + $sat->deep_arg->xnodot * $tsince;
413
        $tsq = $tsince * $tsince;
414
        $sat->deep_arg->xnode = $xnoddf + $sat->sgps->xnodcf * $tsq;
415
        $tempa = 1.0 - $sat->sgps->c1 * $tsince;
416
        $tempe = $sat->tle->bstar * $sat->sgps->c4 * $tsince;
417
        $templ = $sat->sgps->t2cof * $tsq;
418
        $sat->deep_arg->xn = $sat->deep_arg->xnodp;
419
420
        /* Update for deep-space secular effects */
421
        $sat->deep_arg->xll = $xmdf;
422
        $sat->deep_arg->t = $tsince;
423
424
        $this->Deep(self::dpsec, $sat);
425
426
        $xmdf = $sat->deep_arg->xll;
427
        $a = pow(Predict::xke / $sat->deep_arg->xn, Predict::tothrd) * $tempa * $tempa;
428
        $sat->deep_arg->em = $sat->deep_arg->em - $tempe;
429
        $xmam = $xmdf + $sat->deep_arg->xnodp * $templ;
430
431
        /* Update for deep-space periodic effects */
432
        $sat->deep_arg->xll = $xmam;
433
434
        $this->Deep(self::dpper, $sat);
435
436
        $xmam = $sat->deep_arg->xll;
437
        $xl = $xmam + $sat->deep_arg->omgadf + $sat->deep_arg->xnode;
438
        $beta = sqrt(1.0 - $sat->deep_arg->em * $sat->deep_arg->em);
439
        $sat->deep_arg->xn = Predict::xke / pow($a, 1.5);
440
441
        /* Long period periodics */
442
        $axn = $sat->deep_arg->em * cos($sat->deep_arg->omgadf);
443
        $temp = 1.0 / ($a * $beta * $beta);
444
        $xll = $temp * $sat->sgps->xlcof * $axn;
445
        $aynl = $temp * $sat->sgps->aycof;
446
        $xlt = $xl + $xll;
447
        $ayn = $sat->deep_arg->em * sin($sat->deep_arg->omgadf) + $aynl;
448
449
        /* Solve Kepler's Equation */
450
        $capu = Predict_Math::FMod2p ($xlt - $sat->deep_arg->xnode);
451
        $temp2 = $capu;
452
453
        $i = 0;
454
        do {
455
            $sinepw = sin($temp2);
456
            $cosepw = cos($temp2);
457
            $temp3 = $axn * $sinepw;
458
            $temp4 = $ayn * $cosepw;
459
            $temp5 = $axn * $cosepw;
460
            $temp6 = $ayn * $sinepw;
461
            $epw = ($capu - $temp4 + $temp3 - $temp2) / (1.0 - $temp5 - $temp6) + $temp2;
462
            if (abs($epw - $temp2) <= Predict::e6a) {
463
                break;
464
            }
465
            $temp2 = $epw;
466
        } while ($i++ < 10);
467
468
        /* Short period preliminary quantities */
469
        $ecose = $temp5 + $temp6;
470
        $esine = $temp3 - $temp4;
471
        $elsq = $axn * $axn + $ayn * $ayn;
472
        $temp = 1.0 - $elsq;
473
        $pl = $a * $temp;
474
        $r = $a * (1.0 - $ecose);
475
        $temp1 = 1.0 / $r;
476
        $rdot = Predict::xke * sqrt($a) * $esine * $temp1;
477
        $rfdot = Predict::xke * sqrt($pl) * $temp1;
478
        $temp2 = $a * $temp1;
479
        $betal = sqrt($temp);
480
        $temp3 = 1.0 / (1.0 + $betal);
481
        $cosu = $temp2 * ($cosepw - $axn + $ayn * $esine * $temp3);
482
        $sinu = $temp2 * ($sinepw - $ayn - $axn * $esine * $temp3);
483
        $u = Predict_Math::AcTan($sinu, $cosu);
484
        $sin2u = 2.0 * $sinu * $cosu;
485
        $cos2u = 2.0 * $cosu * $cosu - 1.0;
486
        $temp = 1.0 / $pl;
487
        $temp1 = Predict::ck2 * $temp;
488
        $temp2 = $temp1 * $temp;
489
490
        /* Update for short periodics */
491
        $rk = $r * (1.0 - 1.5 * $temp2 * $betal * $sat->sgps->x3thm1) +
492
             0.5 * $temp1 * $sat->sgps->x1mth2 * $cos2u;
493
        $uk = $u - 0.25 * $temp2 * $sat->sgps->x7thm1 * $sin2u;
494
        $xnodek = $sat->deep_arg->xnode + 1.5 * $temp2 * $sat->deep_arg->cosio * $sin2u;
495
        $xinck = $sat->deep_arg->xinc + 1.5 * $temp2 *
496
             $sat->deep_arg->cosio * $sat->deep_arg->sinio * $cos2u;
497
        $rdotk = $rdot - $sat->deep_arg->xn * $temp1 * $sat->sgps->x1mth2 * $sin2u;
498
        $rfdotk = $rfdot + $sat->deep_arg->xn * $temp1 *
499
             ($sat->sgps->x1mth2 * $cos2u + 1.5 * $sat->sgps->x3thm1);
500
501
        /* Orientation vectors */
502
        $sinuk = sin($uk);
503
        $cosuk = cos($uk);
504
        $sinik = sin($xinck);
505
        $cosik = cos($xinck);
506
        $sinnok = sin($xnodek);
507
        $cosnok = cos($xnodek);
508
        $xmx = -$sinnok * $cosik;
509
        $xmy = $cosnok * $cosik;
510
        $ux = $xmx * $sinuk + $cosnok * $cosuk;
511
        $uy = $xmy * $sinuk + $sinnok * $cosuk;
512
        $uz = $sinik * $sinuk;
513
        $vx = $xmx * $cosuk - $cosnok * $sinuk;
514
        $vy = $xmy * $cosuk - $sinnok * $sinuk;
515
        $vz = $sinik * $cosuk;
516
517
        /* Position and velocity */
518
        $sat->pos->x = $rk * $ux;
0 ignored issues
show
Documentation Bug introduced by
The property $x was declared of type integer, but $rk * $ux is of type double. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
519
        $sat->pos->y = $rk * $uy;
0 ignored issues
show
Documentation Bug introduced by
The property $y was declared of type integer, but $rk * $uy is of type double. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
520
        $sat->pos->z = $rk * $uz;
0 ignored issues
show
Documentation Bug introduced by
The property $z was declared of type integer, but $rk * $uz is of type double. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
521
        $sat->vel->x = $rdotk * $ux + $rfdotk * $vx;
0 ignored issues
show
Documentation Bug introduced by
The property $x was declared of type integer, but $rdotk * $ux + $rfdotk * $vx is of type double. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
522
        $sat->vel->y = $rdotk * $uy + $rfdotk * $vy;
0 ignored issues
show
Documentation Bug introduced by
The property $y was declared of type integer, but $rdotk * $uy + $rfdotk * $vy is of type double. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
523
        $sat->vel->z = $rdotk * $uz + $rfdotk * $vz;
0 ignored issues
show
Documentation Bug introduced by
The property $z was declared of type integer, but $rdotk * $uz + $rfdotk * $vz is of type double. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
524
525
        /* Phase in rads */
526
        $sat->phase = $xlt - $sat->deep_arg->xnode - $sat->deep_arg->omgadf + Predict::twopi;
527
        if ($sat->phase < 0.0) {
528
            $sat->phase += Predict::twopi;
529
        }
530
        $sat->phase = Predict_Math::FMod2p ($sat->phase);
531
532
        $sat->tle->omegao1 = $sat->deep_arg->omgadf;
533
        $sat->tle->xincl1  = $sat->deep_arg->xinc;
534
        $sat->tle->xnodeo1 = $sat->deep_arg->xnode;
535
    } /* SDP4 */
536
537
538
    /* DEEP */
539
    /* This function is used by SDP4 to add lunar and solar */
540
    /* perturbation effects to deep-space orbit objects.    */
541
    public function Deep($ientry, Predict_Sat $sat)
542
    {
543
        switch ($ientry) {
544
        case self::dpinit : /* Entrance for deep space initialization */
545
            $sat->dps->thgr = Predict_Time::ThetaG($sat->tle->epoch, $sat->deep_arg);
546
            $eq = $sat->tle->eo;
547
            $sat->dps->xnq = $sat->deep_arg->xnodp;
548
            $aqnv = 1.0 / $sat->deep_arg->aodp;
549
            $sat->dps->xqncl = $sat->tle->xincl;
550
            $xmao = $sat->tle->xmo;
551
            $xpidot = $sat->deep_arg->omgdot + $sat->deep_arg->xnodot;
552
            $sinq = sin($sat->tle->xnodeo);
553
            $cosq = cos($sat->tle->xnodeo);
554
            $sat->dps->omegaq = $sat->tle->omegao;
555
            $sat->dps->preep = 0;
556
557
            /* Initialize lunar solar terms */
558
            $day = $sat->deep_arg->ds50 + 18261.5;  /* Days since 1900 Jan 0.5 */
559
            if ($day != $sat->dps->preep) {
560
                $sat->dps->preep = $day;
561
                $xnodce = 4.5236020 - 9.2422029E-4 * $day;
562
                $stem = sin($xnodce);
563
                $ctem = cos($xnodce);
564
                $sat->dps->zcosil = 0.91375164 - 0.03568096 * $ctem;
565
                $sat->dps->zsinil = sqrt(1.0 - $sat->dps->zcosil * $sat->dps->zcosil);
566
                $sat->dps->zsinhl = 0.089683511 * $stem / $sat->dps->zsinil;
567
                $sat->dps->zcoshl = sqrt(1.0 - $sat->dps->zsinhl * $sat->dps->zsinhl);
568
                $c = 4.7199672 + 0.22997150 * $day;
569
                $gam = 5.8351514 + 0.0019443680 * $day;
570
                $sat->dps->zmol = Predict_Math::FMod2p($c - $gam);
571
                $zx = 0.39785416 * $stem / $sat->dps->zsinil;
572
                $zy = $sat->dps->zcoshl * $ctem + 0.91744867 * $sat->dps->zsinhl * $stem;
573
                $zx = Predict_Math::AcTan($zx, $zy);
574
                $zx = $gam + $zx - $xnodce;
575
                $sat->dps->zcosgl = cos($zx);
576
                $sat->dps->zsingl = sin($zx);
577
                $sat->dps->zmos = 6.2565837 + 0.017201977 * $day;
578
                $sat->dps->zmos = Predict_Math::FMod2p($sat->dps->zmos);
579
            } /* End if(day != preep) */
580
581
            /* Do solar terms */
582
            $sat->dps->savtsn = 1E20;
583
            $zcosg = Predict::zcosgs;
584
            $zsing = Predict::zsings;
585
            $zcosi = Predict::zcosis;
586
            $zsini = Predict::zsinis;
587
            $zcosh = $cosq;
588
            $zsinh = $sinq;
589
            $cc = Predict::c1ss;
590
            $zn = Predict::zns;
591
            $ze = Predict::zes;
592
            $zmo = $sat->dps->zmos;
0 ignored issues
show
Unused Code introduced by
$zmo is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
593
            $xnoi = 1.0 / $sat->dps->xnq;
594
595
            /* Loop breaks when Solar terms are done a second */
596
            /* time, after Lunar terms are initialized        */
597
            for(;;) {
598
                /* Solar terms done again after Lunar terms are done */
599
                $a1 = $zcosg * $zcosh + $zsing * $zcosi * $zsinh;
600
                $a3 = -$zsing * $zcosh + $zcosg * $zcosi * $zsinh;
601
                $a7 = -$zcosg * $zsinh + $zsing * $zcosi * $zcosh;
602
                $a8 = $zsing * $zsini;
603
                $a9 = $zsing * $zsinh + $zcosg * $zcosi * $zcosh;
604
                $a10 = $zcosg * $zsini;
605
                $a2 = $sat->deep_arg->cosio * $a7 + $sat->deep_arg->sinio * $a8;
606
                $a4 = $sat->deep_arg->cosio * $a9 + $sat->deep_arg->sinio * $a10;
607
                $a5 = -$sat->deep_arg->sinio * $a7 + $sat->deep_arg->cosio * $a8;
608
                $a6 = -$sat->deep_arg->sinio * $a9 + $sat->deep_arg->cosio * $a10;
609
                $x1 = $a1 * $sat->deep_arg->cosg + $a2 * $sat->deep_arg->sing;
610
                $x2 = $a3 * $sat->deep_arg->cosg + $a4 * $sat->deep_arg->sing;
611
                $x3 = -$a1 * $sat->deep_arg->sing + $a2 * $sat->deep_arg->cosg;
612
                $x4 = -$a3 * $sat->deep_arg->sing + $a4 * $sat->deep_arg->cosg;
613
                $x5 = $a5 * $sat->deep_arg->sing;
614
                $x6 = $a6 * $sat->deep_arg->sing;
615
                $x7 = $a5 * $sat->deep_arg->cosg;
616
                $x8 = $a6 * $sat->deep_arg->cosg;
617
                $z31 = 12 * $x1 * $x1 - 3 * $x3 * $x3;
618
                $z32 = 24 * $x1 * $x2 - 6 * $x3 * $x4;
619
                $z33 = 12 * $x2 * $x2 - 3 * $x4 * $x4;
620
                $z1 = 3 * ($a1 * $a1 + $a2 * $a2) + $z31 * $sat->deep_arg->eosq;
621
                $z2 = 6 * ($a1 * $a3 + $a2 * $a4) + $z32 * $sat->deep_arg->eosq;
622
                $z3 = 3 * ($a3 * $a3 + $a4 * $a4) + $z33 * $sat->deep_arg->eosq;
623
                $z11 = -6 * $a1 * $a5 + $sat->deep_arg->eosq * (-24 * $x1 * $x7 - 6 * $x3 * $x5);
624
                $z12 = -6 * ($a1 * $a6 + $a3 * $a5) + $sat->deep_arg->eosq *
625
                    (-24 * ($x2 * $x7 + $x1 * $x8) - 6 * ($x3 * $x6 + $x4 * $x5));
626
                $z13 = -6 * $a3 * $a6 + $sat->deep_arg->eosq * (-24 * $x2 * $x8 - 6 * $x4 * $x6);
627
                $z21 = 6 * $a2 * $a5 + $sat->deep_arg->eosq * (24 * $x1 * $x5 - 6 * $x3 * $x7);
628
                $z22 = 6 * ($a4 * $a5 + $a2 * $a6) + $sat->deep_arg->eosq *
629
                    (24 * ($x2 * $x5 + $x1 * $x6) - 6 * ($x4 * $x7 + $x3 * $x8));
630
                $z23 = 6 * $a4 * $a6 + $sat->deep_arg->eosq * (24 * $x2 * $x6 - 6 * $x4 * $x8);
631
                $z1 = $z1 + $z1 + $sat->deep_arg->betao2 * $z31;
632
                $z2 = $z2 + $z2 + $sat->deep_arg->betao2 * $z32;
633
                $z3 = $z3 + $z3 + $sat->deep_arg->betao2 * $z33;
634
                $s3 = $cc * $xnoi;
635
                $s2 = -0.5 * $s3 / $sat->deep_arg->betao;
636
                $s4 = $s3 * $sat->deep_arg->betao;
637
                $s1 = -15 * $eq * $s4;
638
                $s5 = $x1 * $x3 + $x2 * $x4;
639
                $s6 = $x2 * $x3 + $x1 * $x4;
640
                $s7 = $x2 * $x4 - $x1 * $x3;
641
                $se = $s1 * $zn * $s5;
642
                $si = $s2 * $zn * ($z11 + $z13);
643
                $sl = -$zn * $s3 * ($z1 + $z3 - 14 - 6 * $sat->deep_arg->eosq);
644
                $sgh = $s4 * $zn * ($z31 + $z33 - 6);
645
                $sh = -$zn * $s2 * ($z21 + $z23);
646
                if ($sat->dps->xqncl < 5.2359877E-2) {
647
                    $sh = 0;
648
                }
649
                $sat->dps->ee2 = 2 * $s1 * $s6;
650
                $sat->dps->e3 = 2 * $s1 * $s7;
651
                $sat->dps->xi2 = 2 * $s2 * $z12;
652
                $sat->dps->xi3 = 2 * $s2 * ($z13 - $z11);
653
                $sat->dps->xl2 = -2 * $s3 * $z2;
654
                $sat->dps->xl3 = -2 * $s3 * ($z3 - $z1);
655
                $sat->dps->xl4 = -2 * $s3 * (-21 - 9 * $sat->deep_arg->eosq) * $ze;
656
                $sat->dps->xgh2 = 2 * $s4 * $z32;
657
                $sat->dps->xgh3 = 2 * $s4 * ($z33 - $z31);
658
                $sat->dps->xgh4 = -18 * $s4 * $ze;
659
                $sat->dps->xh2 = -2 * $s2 * $z22;
660
                $sat->dps->xh3 = -2 * $s2 * ($z23 - $z21);
661
662
                if ($sat->flags & self::LUNAR_TERMS_DONE_FLAG) {
663
                    break;
664
                }
665
666
                /* Do lunar terms */
667
                $sat->dps->sse = $se;
668
                $sat->dps->ssi = $si;
669
                $sat->dps->ssl = $sl;
670
                $sat->dps->ssh = $sh / $sat->deep_arg->sinio;
671
                $sat->dps->ssg = $sgh - $sat->deep_arg->cosio * $sat->dps->ssh;
672
                $sat->dps->se2 = $sat->dps->ee2;
673
                $sat->dps->si2 = $sat->dps->xi2;
674
                $sat->dps->sl2 = $sat->dps->xl2;
675
                $sat->dps->sgh2 = $sat->dps->xgh2;
676
                $sat->dps->sh2 = $sat->dps->xh2;
677
                $sat->dps->se3 = $sat->dps->e3;
678
                $sat->dps->si3 = $sat->dps->xi3;
679
                $sat->dps->sl3 = $sat->dps->xl3;
680
                $sat->dps->sgh3 = $sat->dps->xgh3;
681
                $sat->dps->sh3 = $sat->dps->xh3;
682
                $sat->dps->sl4 = $sat->dps->xl4;
683
                $sat->dps->sgh4 = $sat->dps->xgh4;
684
                $zcosg = $sat->dps->zcosgl;
685
                $zsing = $sat->dps->zsingl;
686
                $zcosi = $sat->dps->zcosil;
687
                $zsini = $sat->dps->zsinil;
688
                $zcosh = $sat->dps->zcoshl * $cosq + $sat->dps->zsinhl * $sinq;
689
                $zsinh = $sinq * $sat->dps->zcoshl - $cosq * $sat->dps->zsinhl;
690
                $zn = Predict::znl;
691
                $cc = Predict::c1l;
692
                $ze = Predict::zel;
693
                $zmo = $sat->dps->zmol;
0 ignored issues
show
Unused Code introduced by
$zmo is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
694
                $sat->flags |= self::LUNAR_TERMS_DONE_FLAG;
695
            } /* End of for(;;) */
696
697
            $sat->dps->sse = $sat->dps->sse + $se;
0 ignored issues
show
Bug introduced by
The variable $se does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
698
            $sat->dps->ssi = $sat->dps->ssi + $si;
0 ignored issues
show
Bug introduced by
The variable $si does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
699
            $sat->dps->ssl = $sat->dps->ssl + $sl;
0 ignored issues
show
Bug introduced by
The variable $sl does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
700
            $sat->dps->ssg = $sat->dps->ssg + $sgh - $sat->deep_arg->cosio / $sat->deep_arg->sinio * $sh;
0 ignored issues
show
Bug introduced by
The variable $sgh does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
Bug introduced by
The variable $sh does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
701
            $sat->dps->ssh = $sat->dps->ssh + $sh / $sat->deep_arg->sinio;
702
703
            /* Geopotential resonance initialization for 12 hour orbits */
704
            $sat->flags &= ~self::RESONANCE_FLAG;
705
            $sat->flags &= ~self::SYNCHRONOUS_FLAG;
706
707
            if (!(($sat->dps->xnq < 0.0052359877) && ($sat->dps->xnq > 0.0034906585))) {
708
                if( ($sat->dps->xnq < 0.00826) || ($sat->dps->xnq > 0.00924) ) {
709
                    return;
710
                }
711
                if ($eq < 0.5) {
712
                    return;
713
                }
714
                $sat->flags |= self::RESONANCE_FLAG;
715
                $eoc = $eq * $sat->deep_arg->eosq;
716
                $g201 = -0.306 - ($eq - 0.64) * 0.440;
717
                if ($eq <= 0.65) {
718
                    $g211 = 3.616 - 13.247 * $eq + 16.290 * $sat->deep_arg->eosq;
719
                    $g310 = -19.302 + 117.390 * $eq - 228.419 *
720
                        $sat->deep_arg->eosq + 156.591 * $eoc;
721
                    $g322 = -18.9068 + 109.7927 * $eq - 214.6334 *
722
                        $sat->deep_arg->eosq + 146.5816 * $eoc;
723
                    $g410 = -41.122 + 242.694 * $eq - 471.094 *
724
                        $sat->deep_arg->eosq + 313.953 * $eoc;
725
                    $g422 = -146.407 + 841.880 * $eq - 1629.014 *
726
                        $sat->deep_arg->eosq + 1083.435 * $eoc;
727
                    $g520 = -532.114 + 3017.977 * $eq - 5740 *
728
                        $sat->deep_arg->eosq + 3708.276 * $eoc;
729
                } else {
730
                    $g211 = -72.099 + 331.819 * $eq - 508.738 *
731
                        $sat->deep_arg->eosq + 266.724 * $eoc;
732
                    $g310 = -346.844 + 1582.851 * $eq - 2415.925 *
733
                        $sat->deep_arg->eosq + 1246.113 * $eoc;
734
                    $g322 = -342.585 + 1554.908 * $eq - 2366.899 *
735
                        $sat->deep_arg->eosq + 1215.972 * $eoc;
736
                    $g410 = -1052.797 + 4758.686 * $eq - 7193.992 *
737
                        $sat->deep_arg->eosq + 3651.957 * $eoc;
738
                    $g422 = -3581.69 + 16178.11 * $eq - 24462.77 *
739
                        $sat->deep_arg->eosq+ 12422.52 * $eoc;
740
                    if ($eq <= 0.715) {
741
                        $g520 = 1464.74 - 4664.75 * $eq + 3763.64 * $sat->deep_arg->eosq;
742
                    } else {
743
                        $g520 = -5149.66 + 29936.92 * $eq - 54087.36 *
744
                            $sat->deep_arg->eosq + 31324.56 * $eoc;
745
                    }
746
                } /* End if (eq <= 0.65) */
747
748
                if ($eq < 0.7) {
749
                    $g533 = -919.2277 + 4988.61 * $eq - 9064.77 *
750
                        $sat->deep_arg->eosq + 5542.21 * $eoc;
751
                    $g521 = -822.71072 + 4568.6173 * $eq - 8491.4146 *
752
                        $sat->deep_arg->eosq + 5337.524 * $eoc;
753
                    $g532 = -853.666 + 4690.25 * $eq - 8624.77 *
754
                        $sat->deep_arg->eosq + 5341.4 * $eoc;
755
                }
756
                else {
757
                    $g533 = -37995.78 + 161616.52 * $eq - 229838.2*
758
                        $sat->deep_arg->eosq + 109377.94 * $eoc;
759
                    $g521 = -51752.104 + 218913.95 * $eq - 309468.16*
760
                        $sat->deep_arg->eosq + 146349.42 * $eoc;
761
                    $g532 = -40023.88 + 170470.89 * $eq - 242699.48*
762
                        $sat->deep_arg->eosq + 115605.82 * $eoc;
763
                } /* End if (eq <= 0.7) */
764
765
                $sini2 = $sat->deep_arg->sinio * $sat->deep_arg->sinio;
766
                $f220 = 0.75 * (1 + 2 * $sat->deep_arg->cosio + $sat->deep_arg->theta2);
767
                $f221 = 1.5 * $sini2;
768
                $f321 = 1.875 * $sat->deep_arg->sinio * (1 - 2 *
769
                                  $sat->deep_arg->cosio - 3 * $sat->deep_arg->theta2);
770
                $f322 = -1.875 * $sat->deep_arg->sinio * (1 + 2*
771
                                   $sat->deep_arg->cosio - 3 * $sat->deep_arg->theta2);
772
                $f441 = 35 * $sini2 * $f220;
773
                $f442 = 39.3750 * $sini2 * $sini2;
774
                $f522 = 9.84375 * $sat->deep_arg->sinio * ($sini2 * (1 - 2 * $sat->deep_arg->cosio - 5 *
775
                                       $sat->deep_arg->theta2) + 0.33333333 * (-2 + 4 * $sat->deep_arg->cosio +
776
                                                     6 * $sat->deep_arg->theta2));
777
                $f523 = $sat->deep_arg->sinio * (4.92187512 * $sini2 * (-2 - 4 *
778
                                      $sat->deep_arg->cosio + 10 * $sat->deep_arg->theta2) + 6.56250012
779
                            * (1 + 2 * $sat->deep_arg->cosio - 3 * $sat->deep_arg->theta2));
780
                $f542 = 29.53125 * $sat->deep_arg->sinio * (2 - 8 *
781
                                 $sat->deep_arg->cosio + $sat->deep_arg->theta2 *
782
                                 (-12 + 8 * $sat->deep_arg->cosio + 10 * $sat->deep_arg->theta2));
783
                $f543 = 29.53125 * $sat->deep_arg->sinio * (-2 - 8 * $sat->deep_arg->cosio +
784
                                 $sat->deep_arg->theta2 * (12 + 8 * $sat->deep_arg->cosio - 10 *
785
                                           $sat->deep_arg->theta2));
786
                $xno2 = $sat->dps->xnq * $sat->dps->xnq;
787
                $ainv2 = $aqnv * $aqnv;
788
                $temp1 = 3 * $xno2 * $ainv2;
789
                $temp = $temp1 * Predict::root22;
790
                $sat->dps->d2201 = $temp * $f220 * $g201;
791
                $sat->dps->d2211 = $temp * $f221 * $g211;
792
                $temp1 = $temp1 * $aqnv;
793
                $temp = $temp1 * Predict::root32;
794
                $sat->dps->d3210 = $temp * $f321 * $g310;
795
                $sat->dps->d3222 = $temp * $f322 * $g322;
796
                $temp1 = $temp1 * $aqnv;
797
                $temp = 2 * $temp1 * Predict::root44;
798
                $sat->dps->d4410 = $temp * $f441 * $g410;
799
                $sat->dps->d4422 = $temp * $f442 * $g422;
800
                $temp1 = $temp1 * $aqnv;
801
                $temp = $temp1 * Predict::root52;
802
                $sat->dps->d5220 = $temp * $f522 * $g520;
803
                $sat->dps->d5232 = $temp * $f523 * $g532;
804
                $temp = 2 * $temp1 * Predict::root54;
805
                $sat->dps->d5421 = $temp * $f542 * $g521;
806
                $sat->dps->d5433 = $temp * $f543 * $g533;
807
                $sat->dps->xlamo = $xmao + $sat->tle->xnodeo + $sat->tle->xnodeo - $sat->dps->thgr - $sat->dps->thgr;
808
                $bfact = $sat->deep_arg->xmdot + $sat->deep_arg->xnodot +
809
                    $sat->deep_arg->xnodot - Predict::thdt - Predict::thdt;
810
                $bfact = $bfact + $sat->dps->ssl + $sat->dps->ssh + $sat->dps->ssh;
811
            } else {
812
                $sat->flags |= self::RESONANCE_FLAG;
813
                $sat->flags |= self::SYNCHRONOUS_FLAG;
814
                /* Synchronous resonance terms initialization */
815
                $g200 = 1 + $sat->deep_arg->eosq * (-2.5 + 0.8125 * $sat->deep_arg->eosq);
816
                $g310 = 1 + 2 * $sat->deep_arg->eosq;
817
                $g300 = 1 + $sat->deep_arg->eosq * (-6 + 6.60937 * $sat->deep_arg->eosq);
818
                $f220 = 0.75 * (1 + $sat->deep_arg->cosio) * (1 + $sat->deep_arg->cosio);
819
                $f311 = 0.9375 * $sat->deep_arg->sinio * $sat->deep_arg->sinio *
820
                    (1 + 3 * $sat->deep_arg->cosio) - 0.75 * (1 + $sat->deep_arg->cosio);
821
                $f330 = 1 + $sat->deep_arg->cosio;
822
                $f330 = 1.875 * $f330 * $f330 * $f330;
823
                $sat->dps->del1 = 3 * $sat->dps->xnq * $sat->dps->xnq * $aqnv * $aqnv;
824
                $sat->dps->del2 = 2 * $sat->dps->del1 * $f220 * $g200 * Predict::q22;
825
                $sat->dps->del3 = 3 * $sat->dps->del1 * $f330 * $g300 * Predict::q33 * $aqnv;
826
                $sat->dps->del1 = $sat->dps->del1 * $f311 * $g310 * Predict::q31 * $aqnv;
827
                $sat->dps->fasx2 = 0.13130908;
828
                $sat->dps->fasx4 = 2.8843198;
829
                $sat->dps->fasx6 = 0.37448087;
830
                $sat->dps->xlamo = $xmao + $sat->tle->xnodeo + $sat->tle->omegao - $sat->dps->thgr;
831
                $bfact = $sat->deep_arg->xmdot + $xpidot - Predict::thdt;
832
                $bfact = $bfact + $sat->dps->ssl + $sat->dps->ssg + $sat->dps->ssh;
833
            } /* End if( !(xnq < 0.0052359877) && (xnq > 0.0034906585) ) */
834
835
            $sat->dps->xfact = $bfact - $sat->dps->xnq;
836
837
            /* Initialize integrator */
838
            $sat->dps->xli = $sat->dps->xlamo;
839
            $sat->dps->xni = $sat->dps->xnq;
840
            $sat->dps->atime = 0;
841
            $sat->dps->stepp = 720;
842
            $sat->dps->stepn = -720;
843
            $sat->dps->step2 = 259200;
844
            /* End case self::dpinit: */
845
            return;
846
847
        case self::dpsec: /* Entrance for deep space secular effects */
848
            $sat->deep_arg->xll = $sat->deep_arg->xll + $sat->dps->ssl * $sat->deep_arg->t;
849
            $sat->deep_arg->omgadf = $sat->deep_arg->omgadf + $sat->dps->ssg * $sat->deep_arg->t;
850
            $sat->deep_arg->xnode = $sat->deep_arg->xnode + $sat->dps->ssh * $sat->deep_arg->t;
851
            $sat->deep_arg->em = $sat->tle->eo + $sat->dps->sse * $sat->deep_arg->t;
852
            $sat->deep_arg->xinc = $sat->tle->xincl + $sat->dps->ssi * $sat->deep_arg->t;
853
            if ($sat->deep_arg->xinc < 0) {
854
                $sat->deep_arg->xinc = -$sat->deep_arg->xinc;
0 ignored issues
show
Documentation Bug introduced by
The property $xinc was declared of type double, but -$sat->deep_arg->xinc is of type integer. Maybe add a type cast?

This check looks for assignments to scalar types that may be of the wrong type.

To ensure the code behaves as expected, it may be a good idea to add an explicit type cast.

$answer = 42;

$correct = false;

$correct = (bool) $answer;
Loading history...
855
                $sat->deep_arg->xnode = $sat->deep_arg->xnode + Predict::pi;
856
                $sat->deep_arg->omgadf = $sat->deep_arg->omgadf - Predict::pi;
857
            }
858
            if(~$sat->flags & self::RESONANCE_FLAG ) {
859
                return;
860
            }
861
862
            do {
863
                if ( ($sat->dps->atime == 0) ||
864
                    (($sat->deep_arg->t >= 0) && ($sat->dps->atime < 0)) ||
865
                    (($sat->deep_arg->t < 0) && ($sat->dps->atime >= 0)) ) {
866
                    /* Epoch restart */
867
                    if ($sat->deep_arg->t >= 0) {
868
                        $delt = $sat->dps->stepp;
869
                    } else {
870
                        $delt = $sat->dps->stepn;
871
                    }
872
873
                    $sat->dps->atime = 0;
874
                    $sat->dps->xni = $sat->dps->xnq;
875
                    $sat->dps->xli = $sat->dps->xlamo;
876
                } else {
877
                    if (abs($sat->deep_arg->t) >= abs($sat->dps->atime)) {
878
                        if ($sat->deep_arg->t > 0) {
879
                            $delt = $sat->dps->stepp;
880
                        } else {
881
                            $delt = $sat->dps->stepn;
882
                        }
883
                    }
884
                }
885
886
                do {
887
                    if (abs($sat->deep_arg->t - $sat->dps->atime) >= $sat->dps->stepp) {
888
                        $sat->flags |= self::DO_LOOP_FLAG;
889
                        $sat->flags &= ~self::EPOCH_RESTART_FLAG;
890
                    }
891
                    else {
892
                        $ft = $sat->deep_arg->t - $sat->dps->atime;
893
                        $sat->flags &= ~self::DO_LOOP_FLAG;
894
                    }
895
896
                    if (abs($sat->deep_arg->t) < abs($sat->dps->atime)) {
897
                        if ($sat->deep_arg->t >= 0) {
898
                            $delt = $sat->dps->stepn;
899
                        } else {
900
                            $delt = $sat->dps->stepp;
901
                        }
902
                        $sat->flags |= (self::DO_LOOP_FLAG | self::EPOCH_RESTART_FLAG);
903
                    }
904
905
                    /* Dot terms calculated */
906
                    if ($sat->flags & self::SYNCHRONOUS_FLAG) {
907
                        $xndot = $sat->dps->del1 * sin($sat->dps->xli - $sat->dps->fasx2) + $sat->dps->del2 * sin(2 * ($sat->dps->xli - $sat->dps->fasx4))
908
                            + $sat->dps->del3 * sin(3 * ($sat->dps->xli - $sat->dps->fasx6));
909
                        $xnddt = $sat->dps->del1 * cos($sat->dps->xli - $sat->dps->fasx2) + 2 * $sat->dps->del2 * cos(2 * ($sat->dps->xli - $sat->dps->fasx4))
910
                            + 3 * $sat->dps->del3 * cos(3 * ($sat->dps->xli - $sat->dps->fasx6));
911
                    } else {
912
                        $xomi = $sat->dps->omegaq + $sat->deep_arg->omgdot * $sat->dps->atime;
913
                        $x2omi = $xomi + $xomi;
914
                        $x2li = $sat->dps->xli + $sat->dps->xli;
915
                        $xndot = $sat->dps->d2201 * sin($x2omi + $sat->dps->xli - Predict::g22)
916
                            + $sat->dps->d2211 * sin($sat->dps->xli - Predict::g22)
917
                            + $sat->dps->d3210 * sin($xomi + $sat->dps->xli - Predict::g32)
918
                            + $sat->dps->d3222 * sin(-$xomi + $sat->dps->xli - Predict::g32)
919
                            + $sat->dps->d4410 * sin($x2omi + $x2li- Predict::g44)
920
                            + $sat->dps->d4422 * sin($x2li- Predict::g44)
921
                            + $sat->dps->d5220 * sin($xomi + $sat->dps->xli- Predict::g52)
922
                            + $sat->dps->d5232 * sin(-$xomi + $sat->dps->xli- Predict::g52)
923
                            + $sat->dps->d5421 * sin($xomi + $x2li - Predict::g54)
924
                            + $sat->dps->d5433 * sin(-$xomi + $x2li - Predict::g54);
925
                        $xnddt = $sat->dps->d2201 * cos($x2omi + $sat->dps->xli- Predict::g22)
926
                            + $sat->dps->d2211 * cos($sat->dps->xli - Predict::g22)
927
                            + $sat->dps->d3210 * cos($xomi + $sat->dps->xli - Predict::g32)
928
                            + $sat->dps->d3222 * cos(-$xomi + $sat->dps->xli - Predict::g32)
929
                            + $sat->dps->d5220 * cos($xomi + $sat->dps->xli - Predict::g52)
930
                            + $sat->dps->d5232 * cos(-$xomi + $sat->dps->xli - Predict::g52)
931
                            + 2 * ($sat->dps->d4410 * cos($x2omi + $x2li - Predict::g44)
932
                                + $sat->dps->d4422 * cos($x2li - Predict::g44)
933
                                + $sat->dps->d5421 * cos($xomi + $x2li - Predict::g54)
934
                                + $sat->dps->d5433 * cos(-$xomi + $x2li - Predict::g54));
935
                    } /* End of if (isFlagSet(SYNCHRONOUS_FLAG)) */
936
937
                    $xldot = $sat->dps->xni + $sat->dps->xfact;
938
                    $xnddt = $xnddt * $xldot;
939
940
                    if ($sat->flags & self::DO_LOOP_FLAG) {
941
                        $sat->dps->xli = $sat->dps->xli + $xldot * $delt + $xndot * $sat->dps->step2;
0 ignored issues
show
Bug introduced by
The variable $delt does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
942
                        $sat->dps->xni = $sat->dps->xni + $xndot * $delt + $xnddt * $sat->dps->step2;
943
                        $sat->dps->atime = $sat->dps->atime + $delt;
944
                    }
945
                } while (($sat->flags & self::DO_LOOP_FLAG) &&
946
                        (~$sat->flags & self::EPOCH_RESTART_FLAG));
947
            }
948
            while (($sat->flags & self::DO_LOOP_FLAG) && ($sat->flags & self::EPOCH_RESTART_FLAG));
949
950
            $sat->deep_arg->xn = $sat->dps->xni + $xndot * $ft + $xnddt * $ft * $ft * 0.5;
0 ignored issues
show
Bug introduced by
The variable $ft does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
951
            $xl = $sat->dps->xli + $xldot * $ft + $xndot * $ft * $ft * 0.5;
952
            $temp = -$sat->deep_arg->xnode + $sat->dps->thgr + $sat->deep_arg->t * Predict::thdt;
953
954
            if (~$sat->flags & self::SYNCHRONOUS_FLAG) {
955
                $sat->deep_arg->xll = $xl + $temp + $temp;
956
            } else {
957
                $sat->deep_arg->xll = $xl - $sat->deep_arg->omgadf + $temp;
958
            }
959
960
            return;
961
            /* End case dpsec: */
962
963
        case self::dpper: /* Entrance for lunar-solar periodics */
964
            $sinis = sin($sat->deep_arg->xinc);
965
            $cosis = cos($sat->deep_arg->xinc);
966
            if (abs($sat->dps->savtsn - $sat->deep_arg->t) >= 30) {
967
                $sat->dps->savtsn = $sat->deep_arg->t;
968
                $zm = $sat->dps->zmos + Predict::zns * $sat->deep_arg->t;
969
                $zf = $zm + 2 * Predict::zes * sin($zm);
970
                $sinzf = sin($zf);
971
                $f2 = 0.5 * $sinzf * $sinzf - 0.25;
972
                $f3 = -0.5 * $sinzf * cos($zf);
973
                $ses = $sat->dps->se2 * $f2 + $sat->dps->se3 * $f3;
974
                $sis = $sat->dps->si2 * $f2 + $sat->dps->si3 * $f3;
975
                $sls = $sat->dps->sl2 * $f2 + $sat->dps->sl3 * $f3 + $sat->dps->sl4 * $sinzf;
976
                $sat->dps->sghs = $sat->dps->sgh2 * $f2 + $sat->dps->sgh3 * $f3 + $sat->dps->sgh4 * $sinzf;
977
                $sat->dps->shs = $sat->dps->sh2 * $f2 + $sat->dps->sh3 * $f3;
978
                $zm = $sat->dps->zmol + Predict::znl * $sat->deep_arg->t;
979
                $zf = $zm + 2 * Predict::zel * sin($zm);
980
                $sinzf = sin($zf);
981
                $f2 = 0.5 * $sinzf * $sinzf - 0.25;
982
                $f3 = -0.5 * $sinzf * cos($zf);
983
                $sel = $sat->dps->ee2 * $f2 + $sat->dps->e3 * $f3;
984
                $sil = $sat->dps->xi2 * $f2 + $sat->dps->xi3 * $f3;
985
                $sll = $sat->dps->xl2 * $f2 + $sat->dps->xl3 * $f3 + $sat->dps->xl4 * $sinzf;
986
                $sat->dps->sghl = $sat->dps->xgh2 * $f2 + $sat->dps->xgh3 * $f3 + $sat->dps->xgh4 * $sinzf;
987
                $sat->dps->sh1 = $sat->dps->xh2 * $f2 + $sat->dps->xh3 * $f3;
988
                $sat->dps->pe = $ses + $sel;
989
                $sat->dps->pinc = $sis + $sil;
990
                $sat->dps->pl = $sls + $sll;
991
            }
992
993
            $pgh = $sat->dps->sghs + $sat->dps->sghl;
994
            $ph = $sat->dps->shs + $sat->dps->sh1;
995
            $sat->deep_arg->xinc = $sat->deep_arg->xinc + $sat->dps->pinc;
996
            $sat->deep_arg->em = $sat->deep_arg->em + $sat->dps->pe;
997
998
            if ($sat->dps->xqncl >= 0.2) {
999
                /* Apply periodics directly */
1000
                $ph = $ph / $sat->deep_arg->sinio;
1001
                $pgh = $pgh - $sat->deep_arg->cosio * $ph;
1002
                $sat->deep_arg->omgadf = $sat->deep_arg->omgadf + $pgh;
1003
                $sat->deep_arg->xnode = $sat->deep_arg->xnode + $ph;
1004
                $sat->deep_arg->xll = $sat->deep_arg->xll + $sat->dps->pl;
1005
            } else {
1006
                /* Apply periodics with Lyddane modification */
1007
                $sinok = sin($sat->deep_arg->xnode);
1008
                $cosok = cos($sat->deep_arg->xnode);
1009
                $alfdp = $sinis * $sinok;
1010
                $betdp = $sinis * $cosok;
1011
                $dalf = $ph * $cosok + $sat->dps->pinc * $cosis * $sinok;
1012
                $dbet = -$ph * $sinok + $sat->dps->pinc * $cosis * $cosok;
1013
                $alfdp = $alfdp + $dalf;
1014
                $betdp = $betdp + $dbet;
1015
                $sat->deep_arg->xnode = Predict_Math::FMod2p($sat->deep_arg->xnode);
1016
                $xls = $sat->deep_arg->xll + $sat->deep_arg->omgadf + $cosis * $sat->deep_arg->xnode;
1017
                $dls = $sat->dps->pl + $pgh - $sat->dps->pinc * $sat->deep_arg->xnode * $sinis;
1018
                $xls = $xls + $dls;
1019
                $xnoh = $sat->deep_arg->xnode;
1020
                $sat->deep_arg->xnode = Predict_Math::AcTan($alfdp, $betdp);
1021
1022
                /* This is a patch to Lyddane modification */
1023
                /* suggested by Rob Matson. */
1024
                if(abs($xnoh - $sat->deep_arg->xnode) > Predict::pi) {
1025
                    if ($sat->deep_arg->xnode < $xnoh) {
1026
                        $sat->deep_arg->xnode += Predict::twopi;
1027
                    } else {
1028
                        $sat->deep_arg->xnode -= Predict::twopi;
1029
                    }
1030
                }
1031
1032
                $sat->deep_arg->xll = $sat->deep_arg->xll + $sat->dps->pl;
1033
                $sat->deep_arg->omgadf = $xls - $sat->deep_arg->xll - cos($sat->deep_arg->xinc) *
1034
                    $sat->deep_arg->xnode;
1035
            } /* End case dpper: */
1036
            return;
1037
1038
        } /* End switch(ientry) */
1039
1040
    } /* End of Deep() */
1041
1042
    /**
1043
     * Singleton
1044
     *
1045
     * @param Predict_Sat $sat The current satellite data instance
1046
     *
1047
     * @return Predict_SGPSDP
1048
     */
1049
    public static function getInstance(Predict_Sat $sat)
1050
    {
1051
        static $instances = array();
1052
        $catnr = $sat->tle->catnr;
1053
        if (!isset($instances[$catnr])) {
1054
            $instances[$catnr] = new self();
1055
        }
1056
        return $instances[$catnr];
1057
    }
1058
}
1059
?>
1060