Completed
Push — master ( 46434e...ad133e )
by Yannick
32:08 queued 16:03
created
require/libs/Predict/Predict/SGPSDP.php 1 patch
Indentation   +1031 added lines, -1031 removed lines patch added patch discarded remove patch
@@ -23,1037 +23,1037 @@
 block discarded – undo
23 23
  */
24 24
 class Predict_SGPSDP
25 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()
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 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;
290
-        $sat->pos->y = $rk * $uy;
291
-        $sat->pos->z = $rk * $uz;
292
-        $sat->vel->x = $rdotk * $ux + $rfdotk * $vx;
293
-        $sat->vel->y = $rdotk * $uy + $rfdotk * $vy;
294
-        $sat->vel->z = $rdotk * $uz + $rfdotk * $vz;
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;
519
-        $sat->pos->y = $rk * $uy;
520
-        $sat->pos->z = $rk * $uz;
521
-        $sat->vel->x = $rdotk * $ux + $rfdotk * $vx;
522
-        $sat->vel->y = $rdotk * $uy + $rfdotk * $vy;
523
-        $sat->vel->z = $rdotk * $uz + $rfdotk * $vz;
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;
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;
694
-                $sat->flags |= self::LUNAR_TERMS_DONE_FLAG;
695
-            } /* End of for(;;) */
696
-
697
-            $sat->dps->sse = $sat->dps->sse + $se;
698
-            $sat->dps->ssi = $sat->dps->ssi + $si;
699
-            $sat->dps->ssl = $sat->dps->ssl + $sl;
700
-            $sat->dps->ssg = $sat->dps->ssg + $sgh - $sat->deep_arg->cosio / $sat->deep_arg->sinio * $sh;
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;
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;
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;
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
-    }
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;
290
+		$sat->pos->y = $rk * $uy;
291
+		$sat->pos->z = $rk * $uz;
292
+		$sat->vel->x = $rdotk * $ux + $rfdotk * $vx;
293
+		$sat->vel->y = $rdotk * $uy + $rfdotk * $vy;
294
+		$sat->vel->z = $rdotk * $uz + $rfdotk * $vz;
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;
519
+		$sat->pos->y = $rk * $uy;
520
+		$sat->pos->z = $rk * $uz;
521
+		$sat->vel->x = $rdotk * $ux + $rfdotk * $vx;
522
+		$sat->vel->y = $rdotk * $uy + $rfdotk * $vy;
523
+		$sat->vel->z = $rdotk * $uz + $rfdotk * $vz;
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;
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;
694
+				$sat->flags |= self::LUNAR_TERMS_DONE_FLAG;
695
+			} /* End of for(;;) */
696
+
697
+			$sat->dps->sse = $sat->dps->sse + $se;
698
+			$sat->dps->ssi = $sat->dps->ssi + $si;
699
+			$sat->dps->ssl = $sat->dps->ssl + $sl;
700
+			$sat->dps->ssg = $sat->dps->ssg + $sgh - $sat->deep_arg->cosio / $sat->deep_arg->sinio * $sh;
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;
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;
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;
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 1058
 }
1059 1059
 ?>
Please login to merge, or discard this patch.
require/libs/Predict/Predict/PassDetail.php 1 patch
Indentation   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -12,26 +12,26 @@
 block discarded – undo
12 12
  */
13 13
 class Predict_PassDetail
14 14
 {
15
-    public $time;   /*!< time in "jul_utc" */
16
-    public $pos;    /*!< Raw unprocessed position at time */
17
-    public $vel;    /*!< Raw unprocessed velocity at time */
18
-    public $velo;
19
-    public $az;
20
-    public $el;
21
-    public $range;
22
-    public $range_rate;
23
-    public $lat;
24
-    public $lon;
25
-    public $alt;
26
-    public $ma;
27
-    public $phase;
28
-    public $footprint;
29
-    public $vis;
30
-    public $orbit;
15
+	public $time;   /*!< time in "jul_utc" */
16
+	public $pos;    /*!< Raw unprocessed position at time */
17
+	public $vel;    /*!< Raw unprocessed velocity at time */
18
+	public $velo;
19
+	public $az;
20
+	public $el;
21
+	public $range;
22
+	public $range_rate;
23
+	public $lat;
24
+	public $lon;
25
+	public $alt;
26
+	public $ma;
27
+	public $phase;
28
+	public $footprint;
29
+	public $vis;
30
+	public $orbit;
31 31
 
32
-    public function __construct()
33
-    {
34
-        $this->pos = new Predict_Vector();
35
-        $this->vel = new Predict_Vector();
36
-    }
32
+	public function __construct()
33
+	{
34
+		$this->pos = new Predict_Vector();
35
+		$this->vel = new Predict_Vector();
36
+	}
37 37
 }
Please login to merge, or discard this patch.
require/libs/Predict/Predict/ObsSet.php 1 patch
Indentation   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -5,8 +5,8 @@
 block discarded – undo
5 5
  */
6 6
 class Predict_ObsSet
7 7
 {
8
-    public $az         = 0.0;  /*!< Azimuth [deg] */
9
-    public $el         = 0.0;  /*!< Elevation [deg] */
10
-    public $range      = 0.0;  /*!< Range [km] */
11
-    public $range_rate = 0.0;  /*!< Velocity [km/sec] */
8
+	public $az         = 0.0;  /*!< Azimuth [deg] */
9
+	public $el         = 0.0;  /*!< Elevation [deg] */
10
+	public $range      = 0.0;  /*!< Range [km] */
11
+	public $range_rate = 0.0;  /*!< Velocity [km/sec] */
12 12
 }
Please login to merge, or discard this patch.
require/libs/Predict/Predict/TLE.php 1 patch
Indentation   +192 added lines, -192 removed lines patch added patch discarded remove patch
@@ -12,221 +12,221 @@
 block discarded – undo
12 12
  */
13 13
 class Predict_TLE
14 14
 {
15
-    public $header;     /* Header line of TLE file */
16
-    public $line1;      /* Line 1 of TLE */
17
-    public $line2;      /* Line 2 of TLE */
18
-    public $epoch;      /*!< Epoch Time in NORAD TLE format YYDDD.FFFFFFFF */
19
-    public $epoch_year; /*!< Epoch: year */
20
-    public $epoch_day;  /*!< Epoch: day of year */
21
-    public $epoch_fod;  /*!< Epoch: Fraction of day. */
22
-    public $xndt2o;     /*!< 1. time derivative of mean motion */
23
-    public $xndd6o;     /*!< 2. time derivative of mean motion */
24
-    public $bstar;      /*!< Bstar drag coefficient. */
25
-    public $xincl;      /*!< Inclination */
26
-    public $xnodeo;     /*!< R.A.A.N. */
27
-    public $eo;         /*!< Eccentricity */
28
-    public $omegao;     /*!< argument of perigee */
29
-    public $xmo;        /*!< mean anomaly */
30
-    public $xno;        /*!< mean motion */
31
-
32
-    public $catnr;      /*!< Catalogue Number.  */
33
-    public $elset;      /*!< Element Set number. */
34
-    public $revnum;     /*!< Revolution Number at epoch. */
35
-
36
-    public $sat_name;   /*!< Satellite name string. */
37
-    public $idesg;      /*!< International Designator. */
38
-    public $status;     /*!< Operational status. */
39
-
40
-    /* values needed for squint calculations */
41
-    public $xincl1;
42
-    public $xnodeo1;
43
-    public $omegao1;
44
-
45
-
46
-    /* Converts the strings in a raw two-line element set  */
47
-    /* to their intended numerical values. No processing   */
48
-    /* of these values is done, e.g. from deg to rads etc. */
49
-    /* This is done in the select_ephemeris() function.    */
50
-    public function __construct($header, $line1, $line2)
51
-    {
52
-        if (!$this->Good_Elements($line1, $line2)) {
53
-            throw new Predict_Exception('Invalid TLE contents');
54
-        }
55
-
56
-        $this->header = $header;
57
-        $this->line1  = $line1;
58
-        $this->line2  = $line2;
59
-
60
-        /** Decode Card 1 **/
61
-        /* Satellite's catalogue number */
62
-        $this->catnr = (int) substr($line1, 2, 5);
63
-
64
-        /* International Designator for satellite */
65
-        $this->idesg = substr($line1, 9, 8);
66
-
67
-        /* Epoch time; this is the complete, unconverted epoch. */
68
-        /* Replace spaces with 0 before casting, as leading spaces are allowed */
69
-        $this->epoch = (float) str_replace(' ', '0', substr($line1, 18, 14));
70
-
71
-        /* Now, convert the epoch time into year, day
15
+	public $header;     /* Header line of TLE file */
16
+	public $line1;      /* Line 1 of TLE */
17
+	public $line2;      /* Line 2 of TLE */
18
+	public $epoch;      /*!< Epoch Time in NORAD TLE format YYDDD.FFFFFFFF */
19
+	public $epoch_year; /*!< Epoch: year */
20
+	public $epoch_day;  /*!< Epoch: day of year */
21
+	public $epoch_fod;  /*!< Epoch: Fraction of day. */
22
+	public $xndt2o;     /*!< 1. time derivative of mean motion */
23
+	public $xndd6o;     /*!< 2. time derivative of mean motion */
24
+	public $bstar;      /*!< Bstar drag coefficient. */
25
+	public $xincl;      /*!< Inclination */
26
+	public $xnodeo;     /*!< R.A.A.N. */
27
+	public $eo;         /*!< Eccentricity */
28
+	public $omegao;     /*!< argument of perigee */
29
+	public $xmo;        /*!< mean anomaly */
30
+	public $xno;        /*!< mean motion */
31
+
32
+	public $catnr;      /*!< Catalogue Number.  */
33
+	public $elset;      /*!< Element Set number. */
34
+	public $revnum;     /*!< Revolution Number at epoch. */
35
+
36
+	public $sat_name;   /*!< Satellite name string. */
37
+	public $idesg;      /*!< International Designator. */
38
+	public $status;     /*!< Operational status. */
39
+
40
+	/* values needed for squint calculations */
41
+	public $xincl1;
42
+	public $xnodeo1;
43
+	public $omegao1;
44
+
45
+
46
+	/* Converts the strings in a raw two-line element set  */
47
+	/* to their intended numerical values. No processing   */
48
+	/* of these values is done, e.g. from deg to rads etc. */
49
+	/* This is done in the select_ephemeris() function.    */
50
+	public function __construct($header, $line1, $line2)
51
+	{
52
+		if (!$this->Good_Elements($line1, $line2)) {
53
+			throw new Predict_Exception('Invalid TLE contents');
54
+		}
55
+
56
+		$this->header = $header;
57
+		$this->line1  = $line1;
58
+		$this->line2  = $line2;
59
+
60
+		/** Decode Card 1 **/
61
+		/* Satellite's catalogue number */
62
+		$this->catnr = (int) substr($line1, 2, 5);
63
+
64
+		/* International Designator for satellite */
65
+		$this->idesg = substr($line1, 9, 8);
66
+
67
+		/* Epoch time; this is the complete, unconverted epoch. */
68
+		/* Replace spaces with 0 before casting, as leading spaces are allowed */
69
+		$this->epoch = (float) str_replace(' ', '0', substr($line1, 18, 14));
70
+
71
+		/* Now, convert the epoch time into year, day
72 72
            and fraction of day, according to:
73 73
 
74 74
            YYDDD.FFFFFFFF
75 75
         */
76 76
 
77
-        // Adjust for 2 digit year through 2056
78
-        $this->epoch_year = (int) substr($line1, 18, 2);
79
-        if ($this->epoch_year > 56) {
80
-            $this->epoch_year = $this->epoch_year + 1900;
81
-        } else {
82
-            $this->epoch_year = $this->epoch_year + 2000;
83
-        }
77
+		// Adjust for 2 digit year through 2056
78
+		$this->epoch_year = (int) substr($line1, 18, 2);
79
+		if ($this->epoch_year > 56) {
80
+			$this->epoch_year = $this->epoch_year + 1900;
81
+		} else {
82
+			$this->epoch_year = $this->epoch_year + 2000;
83
+		}
84 84
 
85
-        /* Epoch day */
86
-        $this->epoch_day = (int) substr($line1, 20, 3);
85
+		/* Epoch day */
86
+		$this->epoch_day = (int) substr($line1, 20, 3);
87 87
 
88
-        /* Epoch fraction of day */
89
-        $this->epoch_fod = (float) substr($line1, 23, 9);
88
+		/* Epoch fraction of day */
89
+		$this->epoch_fod = (float) substr($line1, 23, 9);
90 90
 
91 91
 
92
-        /* Satellite's First Time Derivative */
93
-        $this->xndt2o = (float) substr($line1, 33, 10);
92
+		/* Satellite's First Time Derivative */
93
+		$this->xndt2o = (float) substr($line1, 33, 10);
94 94
 
95
-        /* Satellite's Second Time Derivative */
96
-        $this->xndd6o = (float) (substr($line1, 44, 1) . '.' . substr($line1, 45, 5) . 'E' . substr($line1, 50, 2));
95
+		/* Satellite's Second Time Derivative */
96
+		$this->xndd6o = (float) (substr($line1, 44, 1) . '.' . substr($line1, 45, 5) . 'E' . substr($line1, 50, 2));
97 97
 
98
-        /* Satellite's bstar drag term
98
+		/* Satellite's bstar drag term
99 99
            FIXME: How about buff[0] ????
100 100
         */
101
-        $this->bstar = (float) (substr($line1, 53, 1) . '.' . substr($line1, 54, 5) . 'E' . substr($line1, 59, 2));
101
+		$this->bstar = (float) (substr($line1, 53, 1) . '.' . substr($line1, 54, 5) . 'E' . substr($line1, 59, 2));
102 102
 
103
-        /* Element Number */
104
-        $this->elset = (int) substr($line1, 64, 4);
103
+		/* Element Number */
104
+		$this->elset = (int) substr($line1, 64, 4);
105 105
 
106
-        /** Decode Card 2 **/
107
-        /* Satellite's Orbital Inclination (degrees) */
108
-        $this->xincl = (float) substr($line2, 8, 8);
106
+		/** Decode Card 2 **/
107
+		/* Satellite's Orbital Inclination (degrees) */
108
+		$this->xincl = (float) substr($line2, 8, 8);
109 109
 
110
-        /* Satellite's RAAN (degrees) */
111
-        $this->xnodeo = (float) substr($line2, 17, 8);
110
+		/* Satellite's RAAN (degrees) */
111
+		$this->xnodeo = (float) substr($line2, 17, 8);
112 112
 
113
-        /* Satellite's Orbital Eccentricity */
114
-        $this->eo = (float) ('.' . substr($line2, 26, 7));
113
+		/* Satellite's Orbital Eccentricity */
114
+		$this->eo = (float) ('.' . substr($line2, 26, 7));
115 115
 
116
-        /* Satellite's Argument of Perigee (degrees) */
117
-        $this->omegao = (float) substr($line2, 34, 8);
116
+		/* Satellite's Argument of Perigee (degrees) */
117
+		$this->omegao = (float) substr($line2, 34, 8);
118 118
 
119
-        /* Satellite's Mean Anomaly of Orbit (degrees) */
120
-        $this->xmo = (float) substr($line2, 43, 8);
119
+		/* Satellite's Mean Anomaly of Orbit (degrees) */
120
+		$this->xmo = (float) substr($line2, 43, 8);
121 121
 
122
-        /* Satellite's Mean Motion (rev/day) */
123
-        $this->xno = (float) substr($line2, 52, 11);
122
+		/* Satellite's Mean Motion (rev/day) */
123
+		$this->xno = (float) substr($line2, 52, 11);
124 124
 
125
-        /* Satellite's Revolution number at epoch */
126
-        $this->revnum = (float) substr($line2, 63, 5);
127
-    }
125
+		/* Satellite's Revolution number at epoch */
126
+		$this->revnum = (float) substr($line2, 63, 5);
127
+	}
128 128
 
129
-    /* Calculates the checksum mod 10 of a line from a TLE set and */
130
-    /* returns true if it compares with checksum in column 68, else false.*/
131
-    /* tle_set is a character string holding the two lines read    */
132
-    /* from a text file containing NASA format Keplerian elements. */
133
-    /* NOTE!!! The stuff about two lines is not quite true.
129
+	/* Calculates the checksum mod 10 of a line from a TLE set and */
130
+	/* returns true if it compares with checksum in column 68, else false.*/
131
+	/* tle_set is a character string holding the two lines read    */
132
+	/* from a text file containing NASA format Keplerian elements. */
133
+	/* NOTE!!! The stuff about two lines is not quite true.
134 134
        The function assumes that tle_set[0] is the begining
135 135
        of the line and that there are 68 elements - see the consumer
136 136
     */
137
-    public function Checksum_Good($tle_set)
138
-    {
139
-        if (strlen($tle_set) < 69) {
140
-            return false;
141
-        }
142
-
143
-        $checksum = 0;
144
-
145
-        for ($i = 0; $i < 68; $i++) {
146
-            if (($tle_set[$i] >= '0') && ($tle_set[$i] <= '9')) {
147
-                $value = $tle_set[$i] - '0';
148
-            } else if ($tle_set[$i] == '-' ) {
149
-                $value = 1;
150
-            } else {
151
-                $value = 0;
152
-            }
153
-
154
-            $checksum += $value;
155
-        }
156
-
157
-        $checksum   %= 10;
158
-        $check_digit = $tle_set[68] - '0';
159
-
160
-        return $checksum == $check_digit;
161
-    }
162
-
163
-    /* Carries out various checks on a TLE set to verify its validity */
164
-    /* $line1 is the first line of the TLE, $line2 is the second line */
165
-    /* from a text file containing NASA format Keplerian elements. */
166
-    public function Good_Elements($line1, $line2)
167
-    {
168
-        /* Verify checksum of both lines of a TLE set */
169
-        if (!$this->Checksum_Good($line1) || !$this->Checksum_Good($line2)) {
170
-            return false;
171
-        }
172
-
173
-        /* Check the line number of each line */
174
-        if (($line1[0] != '1') || ($line2[0] != '2')) {
175
-            return false;
176
-        }
177
-
178
-        /* Verify that Satellite Number is same in both lines */
179
-        if (strncmp($line1[2], $line2[2], 5) != 0) {
180
-            return false;
181
-        }
182
-
183
-        /* Check that various elements are in the right place */
184
-        if (($line1[23] != '.') ||
185
-            ($line1[34] != '.') ||
186
-            ($line2[11] != '.') ||
187
-            ($line2[20] != '.') ||
188
-            ($line2[37] != '.') ||
189
-            ($line2[46] != '.') ||
190
-            ($line2[54] != '.') ||
191
-            (strncmp(substr($line1, 61), ' 0 ', 3) != 0)) {
192
-
193
-            return false;
194
-        }
195
-
196
-        return true;
197
-    }
198
-
199
-    /**
200
-     * A function to allow checksum creation of a line.  This is driven by
201
-     * the fact that some TLEs from SpaceTrack are missing checksum numbers.
202
-     * You can use this to create a checksum for a line, but you should
203
-     * probably have confidence that the TLE data itself is good.  YMMV.
204
-     *
205
-     * @throws Predict_Exception if the line is not exactly 68 chars
206
-     * @return string
207
-     */
208
-    static public function createChecksum($line)
209
-    {
210
-        if (strlen($line) != 68) {
211
-            throw Predict_Exception('Invalid line, needs to e 68 chars');
212
-        }
213
-
214
-        $checksum = 0;
215
-
216
-        for ($i = 0; $i < 68; $i++) {
217
-            if (($line[$i] >= '0') && ($line[$i] <= '9')) {
218
-                $value = (int) $line[$i];
219
-            } else if ($line[$i] == '-' ) {
220
-                $value = 1;
221
-            } else {
222
-                $value = 0;
223
-            }
224
-
225
-            $checksum += $value;
226
-        }
227
-
228
-        $checksum %= 10;
229
-
230
-        return $checksum;
231
-    }
137
+	public function Checksum_Good($tle_set)
138
+	{
139
+		if (strlen($tle_set) < 69) {
140
+			return false;
141
+		}
142
+
143
+		$checksum = 0;
144
+
145
+		for ($i = 0; $i < 68; $i++) {
146
+			if (($tle_set[$i] >= '0') && ($tle_set[$i] <= '9')) {
147
+				$value = $tle_set[$i] - '0';
148
+			} else if ($tle_set[$i] == '-' ) {
149
+				$value = 1;
150
+			} else {
151
+				$value = 0;
152
+			}
153
+
154
+			$checksum += $value;
155
+		}
156
+
157
+		$checksum   %= 10;
158
+		$check_digit = $tle_set[68] - '0';
159
+
160
+		return $checksum == $check_digit;
161
+	}
162
+
163
+	/* Carries out various checks on a TLE set to verify its validity */
164
+	/* $line1 is the first line of the TLE, $line2 is the second line */
165
+	/* from a text file containing NASA format Keplerian elements. */
166
+	public function Good_Elements($line1, $line2)
167
+	{
168
+		/* Verify checksum of both lines of a TLE set */
169
+		if (!$this->Checksum_Good($line1) || !$this->Checksum_Good($line2)) {
170
+			return false;
171
+		}
172
+
173
+		/* Check the line number of each line */
174
+		if (($line1[0] != '1') || ($line2[0] != '2')) {
175
+			return false;
176
+		}
177
+
178
+		/* Verify that Satellite Number is same in both lines */
179
+		if (strncmp($line1[2], $line2[2], 5) != 0) {
180
+			return false;
181
+		}
182
+
183
+		/* Check that various elements are in the right place */
184
+		if (($line1[23] != '.') ||
185
+			($line1[34] != '.') ||
186
+			($line2[11] != '.') ||
187
+			($line2[20] != '.') ||
188
+			($line2[37] != '.') ||
189
+			($line2[46] != '.') ||
190
+			($line2[54] != '.') ||
191
+			(strncmp(substr($line1, 61), ' 0 ', 3) != 0)) {
192
+
193
+			return false;
194
+		}
195
+
196
+		return true;
197
+	}
198
+
199
+	/**
200
+	 * A function to allow checksum creation of a line.  This is driven by
201
+	 * the fact that some TLEs from SpaceTrack are missing checksum numbers.
202
+	 * You can use this to create a checksum for a line, but you should
203
+	 * probably have confidence that the TLE data itself is good.  YMMV.
204
+	 *
205
+	 * @throws Predict_Exception if the line is not exactly 68 chars
206
+	 * @return string
207
+	 */
208
+	static public function createChecksum($line)
209
+	{
210
+		if (strlen($line) != 68) {
211
+			throw Predict_Exception('Invalid line, needs to e 68 chars');
212
+		}
213
+
214
+		$checksum = 0;
215
+
216
+		for ($i = 0; $i < 68; $i++) {
217
+			if (($line[$i] >= '0') && ($line[$i] <= '9')) {
218
+				$value = (int) $line[$i];
219
+			} else if ($line[$i] == '-' ) {
220
+				$value = 1;
221
+			} else {
222
+				$value = 0;
223
+			}
224
+
225
+			$checksum += $value;
226
+		}
227
+
228
+		$checksum %= 10;
229
+
230
+		return $checksum;
231
+	}
232 232
 }
Please login to merge, or discard this patch.
require/libs/Predict/Predict/Geodetic.php 1 patch
Indentation   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -6,8 +6,8 @@
 block discarded – undo
6 6
  */
7 7
 class Predict_Geodetic
8 8
 {
9
-    public $lat; /*!< Lattitude [rad] */
10
-    public $lon; /*!< Longitude [rad] */
11
-    public $alt; /*!< Altitude [km] */
12
-    public $theta;
9
+	public $lat; /*!< Lattitude [rad] */
10
+	public $lon; /*!< Longitude [rad] */
11
+	public $alt; /*!< Altitude [km] */
12
+	public $theta;
13 13
 }
Please login to merge, or discard this patch.
require/libs/Predict/Predict/SGSDPStatic.php 1 patch
Indentation   +28 added lines, -28 removed lines patch added patch discarded remove patch
@@ -8,32 +8,32 @@
 block discarded – undo
8 8
  */
9 9
 class Predict_SGSDPStatic
10 10
 {
11
-    public $aodp;
12
-    public $aycof;
13
-    public $c1;
14
-    public $c4;
15
-    public $c5;
16
-    public $cosio;
17
-    public $d2;
18
-    public $d3;
19
-    public $d4;
20
-    public $delmo;
21
-    public $omgcof;
22
-    public $eta;
23
-    public $omgdot;
24
-    public $sinio;
25
-    public $xnodp;
26
-    public $sinmo;
27
-    public $t2cof;
28
-    public $t3cof;
29
-    public $t4cof;
30
-    public $t5cof;
31
-    public $x1mth2;
32
-    public $x3thm1;
33
-    public $x7thm1;
34
-    public $xmcof;
35
-    public $xmdot;
36
-    public $xnodcf;
37
-    public $xnodot;
38
-    public $xlcof;
11
+	public $aodp;
12
+	public $aycof;
13
+	public $c1;
14
+	public $c4;
15
+	public $c5;
16
+	public $cosio;
17
+	public $d2;
18
+	public $d3;
19
+	public $d4;
20
+	public $delmo;
21
+	public $omgcof;
22
+	public $eta;
23
+	public $omgdot;
24
+	public $sinio;
25
+	public $xnodp;
26
+	public $sinmo;
27
+	public $t2cof;
28
+	public $t3cof;
29
+	public $t4cof;
30
+	public $t5cof;
31
+	public $x1mth2;
32
+	public $x3thm1;
33
+	public $x7thm1;
34
+	public $xmcof;
35
+	public $xmdot;
36
+	public $xnodcf;
37
+	public $xnodot;
38
+	public $xlcof;
39 39
 }
Please login to merge, or discard this patch.
require/libs/Predict/Predict/QTH.php 1 patch
Indentation   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -7,14 +7,14 @@
 block discarded – undo
7 7
  */
8 8
 class Predict_QTH
9 9
 {
10
-     public $name;   /*!< Name, eg. callsign. */
11
-     public $loc;    /*!< Location, eg City, Country. */
12
-     public $desc;   /*!< Short description. */
13
-     public $lat;    /*!< Latitude in dec. deg. North. */
14
-     public $lon;    /*!< Longitude in dec. deg. East. */
15
-     public $alt;    /*!< Altitude above sea level in meters. */
16
-     public $qra;    /*!< QRA locator */
17
-     public $wx;     /*!< Weather station code (4 chars). */
10
+	 public $name;   /*!< Name, eg. callsign. */
11
+	 public $loc;    /*!< Location, eg City, Country. */
12
+	 public $desc;   /*!< Short description. */
13
+	 public $lat;    /*!< Latitude in dec. deg. North. */
14
+	 public $lon;    /*!< Longitude in dec. deg. East. */
15
+	 public $alt;    /*!< Altitude above sea level in meters. */
16
+	 public $qra;    /*!< QRA locator */
17
+	 public $wx;     /*!< Weather station code (4 chars). */
18 18
 
19
-     public $data;   /*!< Raw data from cfg file. */
19
+	 public $data;   /*!< Raw data from cfg file. */
20 20
 }
Please login to merge, or discard this patch.
require/libs/Predict/Predict/Sat.php 1 patch
Indentation   +296 added lines, -296 removed lines patch added patch discarded remove patch
@@ -22,304 +22,304 @@
 block discarded – undo
22 22
  */
23 23
 class Predict_Sat
24 24
 {
25
-    // Fifth root of a hundred, used for magnitude calculation
26
-    const POGSONS_RATIO = 2.5118864315096;
27
-
28
-    public $name     = null;
29
-    public $nickname = null;
30
-    public $website  = null;
31
-
32
-    public $tle      = null;   /*!< Keplerian elements */
33
-    public $flags    = 0;      /*!< Flags for algo ctrl */
34
-    public $sgps     = null;
35
-    public $dps      = null;
36
-    public $deep_arg = null;
37
-    public $pos      = null;   /*!< Raw position and range */
38
-    public $vel      = null;   /*!< Raw velocity */
39
-
40
-    /*** FIXME: REMOVE */
41
-    public $bearing = null;   /*!< Az, El, range and vel */
42
-    public $astro   = null;   /*!< Ra and Decl */
43
-    /*** END */
44
-
45
-    /* time keeping fields */
46
-    public $jul_epoch = null;
47
-    public $jul_utc   = null;
48
-    public $tsince    = null;
49
-    public $aos       = null;    /*!< Next AOS. */
50
-    public $los       = null;    /*!< Next LOS */
51
-
52
-    public $az         = null;   /*!< Azimuth [deg] */
53
-    public $el         = null;   /*!< Elevation [deg] */
54
-    public $range      = null;   /*!< Range [km] */
55
-    public $range_rate = null;   /*!< Range Rate [km/sec] */
56
-    public $ra         = null;   /*!< Right Ascension [deg] */
57
-    public $dec        = null;   /*!< Declination [deg] */
58
-    public $ssplat     = null;   /*!< SSP latitude [deg] */
59
-    public $ssplon     = null;   /*!< SSP longitude [deg] */
60
-    public $alt        = null;   /*!< altitude [km] */
61
-    public $velo       = null;   /*!< velocity [km/s] */
62
-    public $ma         = null;   /*!< mean anomaly */
63
-    public $footprint  = null;   /*!< footprint */
64
-    public $phase      = null;   /*!< orbit phase */
65
-    public $meanmo     = null;   /*!< mean motion kept in rev/day */
66
-    public $orbit      = null;   /*!< orbit number */
67
-    public $otype      = null;   /*!< orbit type. */
68
-
69
-    public function __construct(Predict_TLE $tle)
70
-    {
71
-        $headerParts    = explode(' ', $tle->header);
72
-        $this->name     = $headerParts[0];
73
-        $this->nickname = $this->name;
74
-        $this->tle      = $tle;
75
-        $this->pos      = new Predict_Vector();
76
-        $this->vel      = new Predict_Vector();
77
-        $this->sgps     = new Predict_SGSDPStatic();
78
-        $this->deep_arg = new Predict_DeepArg();
79
-        $this->dps      = new Predict_DeepStatic();
80
-
81
-        $this->select_ephemeris();
82
-        $this->sat_data_init_sat($this);
83
-    }
84
-
85
-    /* Selects the apropriate ephemeris type to be used */
86
-    /* for predictions according to the data in the TLE */
87
-    /* It also processes values in the tle set so that  */
88
-    /* they are apropriate for the sgp4/sdp4 routines   */
89
-    public function select_ephemeris()
90
-    {
91
-        /* Preprocess tle set */
92
-        $this->tle->xnodeo *= Predict::de2ra;
93
-        $this->tle->omegao *= Predict::de2ra;
94
-        $this->tle->xmo    *= Predict::de2ra;
95
-        $this->tle->xincl  *= Predict::de2ra;
96
-        $temp = Predict::twopi / Predict::xmnpda / Predict::xmnpda;
97
-
98
-        /* store mean motion before conversion */
99
-        $this->meanmo       = $this->tle->xno;
100
-        $this->tle->xno     = $this->tle->xno * $temp * Predict::xmnpda;
101
-        $this->tle->xndt2o *= $temp;
102
-        $this->tle->xndd6o  = $this->tle->xndd6o * $temp / Predict::xmnpda;
103
-        $this->tle->bstar  /= Predict::ae;
104
-
105
-        /* Period > 225 minutes is deep space */
106
-        $dd1 = Predict::xke / $this->tle->xno;
107
-        $dd2 = Predict::tothrd;
108
-        $a1 = pow($dd1, $dd2);
109
-        $r1 = cos($this->tle->xincl);
110
-        $dd1 = 1.0 - $this->tle->eo * $this->tle->eo;
111
-        $temp = Predict::ck2 * 1.5 * ($r1 * $r1 * 3.0 - 1.0) / pow($dd1, 1.5);
112
-        $del1 = $temp / ($a1 * $a1);
113
-        $ao = $a1 * (1.0 - $del1 * (Predict::tothrd * 0.5 + $del1 *
114
-                                 ($del1 * 1.654320987654321 + 1.0)));
115
-        $delo = $temp / ($ao * $ao);
116
-        $xnodp = $this->tle->xno / ($delo + 1.0);
117
-
118
-        /* Select a deep-space/near-earth ephemeris */
119
-        if (Predict::twopi / $xnodp / Predict::xmnpda >= .15625) {
120
-            $this->flags |= Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG;
121
-        } else {
122
-            $this->flags &= ~Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG;
123
-        }
124
-    }
125
-
126
-    /** Initialise satellite data.
127
-     *  @param sat The satellite to initialise.
128
-     *  @param qth Optional QTH info, use (0,0) if NULL.
129
-     *
130
-     * This function calculates the satellite data at t = 0, ie. epoch time
131
-     * The function is called automatically by gtk_sat_data_read_sat.
132
-     */
133
-    public function sat_data_init_sat(Predict_Sat $sat, Predict_QTH $qth = null)
134
-    {
135
-        $obs_geodetic = new Predict_Geodetic();
136
-        $obs_set = new Predict_ObsSet();
137
-        $sat_geodetic = new Predict_Geodetic();
138
-        /* double jul_utc, age; */
139
-
140
-        $jul_utc = Predict_Time::Julian_Date_of_Epoch($sat->tle->epoch); // => tsince = 0.0
141
-        $sat->jul_epoch = $jul_utc;
142
-
143
-        /* initialise observer location */
144
-        if ($qth != null) {
145
-            $obs_geodetic->lon = $qth->lon * Predict::de2ra;
146
-            $obs_geodetic->lat = $qth->lat * Predict::de2ra;
147
-            $obs_geodetic->alt = $qth->alt / 1000.0;
148
-            $obs_geodetic->theta = 0;
149
-        }
150
-        else {
151
-            $obs_geodetic->lon = 0.0;
152
-            $obs_geodetic->lat = 0.0;
153
-            $obs_geodetic->alt = 0.0;
154
-            $obs_geodetic->theta = 0;
155
-        }
156
-
157
-        /* execute computations */
158
-        $sdpsgp = Predict_SGPSDP::getInstance($sat);
159
-        if ($sat->flags & Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG) {
160
-            $sdpsgp->SDP4($sat, 0.0);
161
-        } else {
162
-            $sdpsgp->SGP4($sat, 0.0);
163
-        }
164
-
165
-        /* scale position and velocity to km and km/sec */
166
-        Predict_Math::Convert_Sat_State($sat->pos, $sat->vel);
167
-
168
-        /* get the velocity of the satellite */
169
-        $sat->vel->w = sqrt($sat->vel->x * $sat->vel->x + $sat->vel->y * $sat->vel->y + $sat->vel->z * $sat->vel->z);
170
-        $sat->velo = $sat->vel->w;
171
-        Predict_SGPObs::Calculate_Obs($jul_utc, $sat->pos, $sat->vel, $obs_geodetic, $obs_set);
172
-        Predict_SGPObs::Calculate_LatLonAlt($jul_utc, $sat->pos, $sat_geodetic);
173
-
174
-        while ($sat_geodetic->lon < -Predict::pi) {
175
-            $sat_geodetic->lon += Predict::twopi;
176
-        }
177
-
178
-        while ($sat_geodetic->lon > Predict::pi) {
179
-            $sat_geodetic->lon -= Predict::twopi;
180
-        }
181
-
182
-        $sat->az = Predict_Math::Degrees($obs_set->az);
183
-        $sat->el = Predict_Math::Degrees($obs_set->el);
184
-        $sat->range = $obs_set->range;
185
-        $sat->range_rate = $obs_set->range_rate;
186
-        $sat->ssplat = Predict_Math::Degrees($sat_geodetic->lat);
187
-        $sat->ssplon = Predict_Math::Degrees($sat_geodetic->lon);
188
-        $sat->alt = $sat_geodetic->alt;
189
-        $sat->ma = Predict_Math::Degrees($sat->phase);
190
-        $sat->ma *= 256.0 / 360.0;
191
-        $sat->footprint = 2.0 * Predict::xkmper * acos (Predict::xkmper/$sat->pos->w);
192
-        $age = 0.0;
193
-        $sat->orbit = floor(($sat->tle->xno * Predict::xmnpda / Predict::twopi +
194
-                                   $age * $sat->tle->bstar * Predict::ae) * $age +
195
-                                  $sat->tle->xmo / Predict::twopi) + $sat->tle->revnum - 1;
196
-
197
-        /* orbit type */
198
-        $sat->otype = $sat->get_orbit_type($sat);
199
-    }
200
-
201
-    public function get_orbit_type(Predict_Sat $sat)
202
-    {
203
-         $orbit = Predict_SGPSDP::ORBIT_TYPE_UNKNOWN;
204
-
205
-         if ($this->geostationary($sat)) {
206
-              $orbit = Predict_SGPSDP::ORBIT_TYPE_GEO;
207
-         } else if ($this->decayed($sat)) {
208
-              $orbit = Predict_SGPSDP::ORBIT_TYPE_DECAYED;
209
-         } else {
210
-              $orbit = Predict_SGPSDP::ORBIT_TYPE_UNKNOWN;
211
-         }
212
-
213
-         return $orbit;
214
-    }
215
-
216
-
217
-    /** Determinte whether satellite is in geostationary orbit.
218
-     *  @author John A. Magliacane, KD2BD
219
-     *  @param sat Pointer to satellite data.
220
-     *  @return TRUE if the satellite appears to be in geostationary orbit,
221
-     *          FALSE otherwise.
222
-     *
223
-     * A satellite is in geostationary orbit if
224
-     *
225
-     *     fabs (sat.meanmotion - 1.0027) < 0.0002
226
-     *
227
-     * Note: Appearantly, the mean motion can deviate much more from 1.0027 than 0.0002
228
-     */
229
-    public function geostationary(Predict_Sat $sat)
230
-    {
231
-         if (abs($sat->meanmo - 1.0027) < 0.0002) {
232
-              return true;
233
-         } else {
234
-              return false;
235
-        }
236
-    }
237
-
238
-
239
-    /** Determine whether satellite has decayed.
240
-     *  @author John A. Magliacane, KD2BD
241
-     *  @author Alexandru Csete, OZ9AEC
242
-     *  @param sat Pointer to satellite data.
243
-     *  @return TRUE if the satellite appears to have decayed, FALSE otherwise.
244
-     *  @bug Modified version of the predict code but it is not tested.
245
-     *
246
-     * A satellite is decayed if
247
-     *
248
-     *    satepoch + ((16.666666 - sat.meanmo) / (10.0*fabs(sat.drag))) < "now"
249
-     *
250
-     */
251
-    public function decayed(Predict_Sat $sat)
252
-    {
253
-        /* tle.xndt2o/(twopi/xmnpda/xmnpda) is the value before converted the
25
+	// Fifth root of a hundred, used for magnitude calculation
26
+	const POGSONS_RATIO = 2.5118864315096;
27
+
28
+	public $name     = null;
29
+	public $nickname = null;
30
+	public $website  = null;
31
+
32
+	public $tle      = null;   /*!< Keplerian elements */
33
+	public $flags    = 0;      /*!< Flags for algo ctrl */
34
+	public $sgps     = null;
35
+	public $dps      = null;
36
+	public $deep_arg = null;
37
+	public $pos      = null;   /*!< Raw position and range */
38
+	public $vel      = null;   /*!< Raw velocity */
39
+
40
+	/*** FIXME: REMOVE */
41
+	public $bearing = null;   /*!< Az, El, range and vel */
42
+	public $astro   = null;   /*!< Ra and Decl */
43
+	/*** END */
44
+
45
+	/* time keeping fields */
46
+	public $jul_epoch = null;
47
+	public $jul_utc   = null;
48
+	public $tsince    = null;
49
+	public $aos       = null;    /*!< Next AOS. */
50
+	public $los       = null;    /*!< Next LOS */
51
+
52
+	public $az         = null;   /*!< Azimuth [deg] */
53
+	public $el         = null;   /*!< Elevation [deg] */
54
+	public $range      = null;   /*!< Range [km] */
55
+	public $range_rate = null;   /*!< Range Rate [km/sec] */
56
+	public $ra         = null;   /*!< Right Ascension [deg] */
57
+	public $dec        = null;   /*!< Declination [deg] */
58
+	public $ssplat     = null;   /*!< SSP latitude [deg] */
59
+	public $ssplon     = null;   /*!< SSP longitude [deg] */
60
+	public $alt        = null;   /*!< altitude [km] */
61
+	public $velo       = null;   /*!< velocity [km/s] */
62
+	public $ma         = null;   /*!< mean anomaly */
63
+	public $footprint  = null;   /*!< footprint */
64
+	public $phase      = null;   /*!< orbit phase */
65
+	public $meanmo     = null;   /*!< mean motion kept in rev/day */
66
+	public $orbit      = null;   /*!< orbit number */
67
+	public $otype      = null;   /*!< orbit type. */
68
+
69
+	public function __construct(Predict_TLE $tle)
70
+	{
71
+		$headerParts    = explode(' ', $tle->header);
72
+		$this->name     = $headerParts[0];
73
+		$this->nickname = $this->name;
74
+		$this->tle      = $tle;
75
+		$this->pos      = new Predict_Vector();
76
+		$this->vel      = new Predict_Vector();
77
+		$this->sgps     = new Predict_SGSDPStatic();
78
+		$this->deep_arg = new Predict_DeepArg();
79
+		$this->dps      = new Predict_DeepStatic();
80
+
81
+		$this->select_ephemeris();
82
+		$this->sat_data_init_sat($this);
83
+	}
84
+
85
+	/* Selects the apropriate ephemeris type to be used */
86
+	/* for predictions according to the data in the TLE */
87
+	/* It also processes values in the tle set so that  */
88
+	/* they are apropriate for the sgp4/sdp4 routines   */
89
+	public function select_ephemeris()
90
+	{
91
+		/* Preprocess tle set */
92
+		$this->tle->xnodeo *= Predict::de2ra;
93
+		$this->tle->omegao *= Predict::de2ra;
94
+		$this->tle->xmo    *= Predict::de2ra;
95
+		$this->tle->xincl  *= Predict::de2ra;
96
+		$temp = Predict::twopi / Predict::xmnpda / Predict::xmnpda;
97
+
98
+		/* store mean motion before conversion */
99
+		$this->meanmo       = $this->tle->xno;
100
+		$this->tle->xno     = $this->tle->xno * $temp * Predict::xmnpda;
101
+		$this->tle->xndt2o *= $temp;
102
+		$this->tle->xndd6o  = $this->tle->xndd6o * $temp / Predict::xmnpda;
103
+		$this->tle->bstar  /= Predict::ae;
104
+
105
+		/* Period > 225 minutes is deep space */
106
+		$dd1 = Predict::xke / $this->tle->xno;
107
+		$dd2 = Predict::tothrd;
108
+		$a1 = pow($dd1, $dd2);
109
+		$r1 = cos($this->tle->xincl);
110
+		$dd1 = 1.0 - $this->tle->eo * $this->tle->eo;
111
+		$temp = Predict::ck2 * 1.5 * ($r1 * $r1 * 3.0 - 1.0) / pow($dd1, 1.5);
112
+		$del1 = $temp / ($a1 * $a1);
113
+		$ao = $a1 * (1.0 - $del1 * (Predict::tothrd * 0.5 + $del1 *
114
+								 ($del1 * 1.654320987654321 + 1.0)));
115
+		$delo = $temp / ($ao * $ao);
116
+		$xnodp = $this->tle->xno / ($delo + 1.0);
117
+
118
+		/* Select a deep-space/near-earth ephemeris */
119
+		if (Predict::twopi / $xnodp / Predict::xmnpda >= .15625) {
120
+			$this->flags |= Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG;
121
+		} else {
122
+			$this->flags &= ~Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG;
123
+		}
124
+	}
125
+
126
+	/** Initialise satellite data.
127
+	 *  @param sat The satellite to initialise.
128
+	 *  @param qth Optional QTH info, use (0,0) if NULL.
129
+	 *
130
+	 * This function calculates the satellite data at t = 0, ie. epoch time
131
+	 * The function is called automatically by gtk_sat_data_read_sat.
132
+	 */
133
+	public function sat_data_init_sat(Predict_Sat $sat, Predict_QTH $qth = null)
134
+	{
135
+		$obs_geodetic = new Predict_Geodetic();
136
+		$obs_set = new Predict_ObsSet();
137
+		$sat_geodetic = new Predict_Geodetic();
138
+		/* double jul_utc, age; */
139
+
140
+		$jul_utc = Predict_Time::Julian_Date_of_Epoch($sat->tle->epoch); // => tsince = 0.0
141
+		$sat->jul_epoch = $jul_utc;
142
+
143
+		/* initialise observer location */
144
+		if ($qth != null) {
145
+			$obs_geodetic->lon = $qth->lon * Predict::de2ra;
146
+			$obs_geodetic->lat = $qth->lat * Predict::de2ra;
147
+			$obs_geodetic->alt = $qth->alt / 1000.0;
148
+			$obs_geodetic->theta = 0;
149
+		}
150
+		else {
151
+			$obs_geodetic->lon = 0.0;
152
+			$obs_geodetic->lat = 0.0;
153
+			$obs_geodetic->alt = 0.0;
154
+			$obs_geodetic->theta = 0;
155
+		}
156
+
157
+		/* execute computations */
158
+		$sdpsgp = Predict_SGPSDP::getInstance($sat);
159
+		if ($sat->flags & Predict_SGPSDP::DEEP_SPACE_EPHEM_FLAG) {
160
+			$sdpsgp->SDP4($sat, 0.0);
161
+		} else {
162
+			$sdpsgp->SGP4($sat, 0.0);
163
+		}
164
+
165
+		/* scale position and velocity to km and km/sec */
166
+		Predict_Math::Convert_Sat_State($sat->pos, $sat->vel);
167
+
168
+		/* get the velocity of the satellite */
169
+		$sat->vel->w = sqrt($sat->vel->x * $sat->vel->x + $sat->vel->y * $sat->vel->y + $sat->vel->z * $sat->vel->z);
170
+		$sat->velo = $sat->vel->w;
171
+		Predict_SGPObs::Calculate_Obs($jul_utc, $sat->pos, $sat->vel, $obs_geodetic, $obs_set);
172
+		Predict_SGPObs::Calculate_LatLonAlt($jul_utc, $sat->pos, $sat_geodetic);
173
+
174
+		while ($sat_geodetic->lon < -Predict::pi) {
175
+			$sat_geodetic->lon += Predict::twopi;
176
+		}
177
+
178
+		while ($sat_geodetic->lon > Predict::pi) {
179
+			$sat_geodetic->lon -= Predict::twopi;
180
+		}
181
+
182
+		$sat->az = Predict_Math::Degrees($obs_set->az);
183
+		$sat->el = Predict_Math::Degrees($obs_set->el);
184
+		$sat->range = $obs_set->range;
185
+		$sat->range_rate = $obs_set->range_rate;
186
+		$sat->ssplat = Predict_Math::Degrees($sat_geodetic->lat);
187
+		$sat->ssplon = Predict_Math::Degrees($sat_geodetic->lon);
188
+		$sat->alt = $sat_geodetic->alt;
189
+		$sat->ma = Predict_Math::Degrees($sat->phase);
190
+		$sat->ma *= 256.0 / 360.0;
191
+		$sat->footprint = 2.0 * Predict::xkmper * acos (Predict::xkmper/$sat->pos->w);
192
+		$age = 0.0;
193
+		$sat->orbit = floor(($sat->tle->xno * Predict::xmnpda / Predict::twopi +
194
+								   $age * $sat->tle->bstar * Predict::ae) * $age +
195
+								  $sat->tle->xmo / Predict::twopi) + $sat->tle->revnum - 1;
196
+
197
+		/* orbit type */
198
+		$sat->otype = $sat->get_orbit_type($sat);
199
+	}
200
+
201
+	public function get_orbit_type(Predict_Sat $sat)
202
+	{
203
+		 $orbit = Predict_SGPSDP::ORBIT_TYPE_UNKNOWN;
204
+
205
+		 if ($this->geostationary($sat)) {
206
+			  $orbit = Predict_SGPSDP::ORBIT_TYPE_GEO;
207
+		 } else if ($this->decayed($sat)) {
208
+			  $orbit = Predict_SGPSDP::ORBIT_TYPE_DECAYED;
209
+		 } else {
210
+			  $orbit = Predict_SGPSDP::ORBIT_TYPE_UNKNOWN;
211
+		 }
212
+
213
+		 return $orbit;
214
+	}
215
+
216
+
217
+	/** Determinte whether satellite is in geostationary orbit.
218
+	 *  @author John A. Magliacane, KD2BD
219
+	 *  @param sat Pointer to satellite data.
220
+	 *  @return TRUE if the satellite appears to be in geostationary orbit,
221
+	 *          FALSE otherwise.
222
+	 *
223
+	 * A satellite is in geostationary orbit if
224
+	 *
225
+	 *     fabs (sat.meanmotion - 1.0027) < 0.0002
226
+	 *
227
+	 * Note: Appearantly, the mean motion can deviate much more from 1.0027 than 0.0002
228
+	 */
229
+	public function geostationary(Predict_Sat $sat)
230
+	{
231
+		 if (abs($sat->meanmo - 1.0027) < 0.0002) {
232
+			  return true;
233
+		 } else {
234
+			  return false;
235
+		}
236
+	}
237
+
238
+
239
+	/** Determine whether satellite has decayed.
240
+	 *  @author John A. Magliacane, KD2BD
241
+	 *  @author Alexandru Csete, OZ9AEC
242
+	 *  @param sat Pointer to satellite data.
243
+	 *  @return TRUE if the satellite appears to have decayed, FALSE otherwise.
244
+	 *  @bug Modified version of the predict code but it is not tested.
245
+	 *
246
+	 * A satellite is decayed if
247
+	 *
248
+	 *    satepoch + ((16.666666 - sat.meanmo) / (10.0*fabs(sat.drag))) < "now"
249
+	 *
250
+	 */
251
+	public function decayed(Predict_Sat $sat)
252
+	{
253
+		/* tle.xndt2o/(twopi/xmnpda/xmnpda) is the value before converted the
254 254
            value matches up with the value in predict 2.2.3 */
255
-        /*** FIXME decayed is treated as a static quantity.
255
+		/*** FIXME decayed is treated as a static quantity.
256 256
              It is time dependent. Also sat->jul_utc is often zero
257 257
              when this function is called
258 258
         ***/
259
-        if ((10.0 * abs($sat->tle->xndt2o / (Predict::twopi / Predict::xmnpda / Predict::xmnpda))) == 0) {
260
-    		return true;
261
-    	} elseif ($sat->jul_epoch + ((16.666666 - $sat->meanmo) /
262
-                               (10.0 * abs($sat->tle->xndt2o / (Predict::twopi / Predict::xmnpda / Predict::xmnpda)))) < $sat->jul_utc) {
263
-              return true;
264
-        } else {
265
-              return false;
266
-        }
267
-    }
268
-
269
-    /**
270
-     * Experimental attempt at calculating apparent magnitude.  Known intrinsic
271
-     * magnitudes are listed inside the function for now.
272
-     *
273
-     * @param float       $time The daynum the satellite is calculated for
274
-     * @param Predict_QTH $qth  The observer location
275
-     *
276
-     * @return null on failure, float otherwise
277
-     */
278
-    public function calculateApparentMagnitude($time, Predict_QTH $qth)
279
-    {
280
-        // Recorded intrinsic magnitudes and their respective
281
-        // illumination and distance from heavens-above.com
282
-        static $intrinsicMagnitudes = array(
283
-            '25544' => array(
284
-                'mag'      => -1.3,
285
-                'illum'    => .5,
286
-                'distance' => 1000,
287
-            )
288
-        );
289
-
290
-        // Return null if we don't have a record of the intrinsic mag
291
-        if (!isset($intrinsicMagnitudes[$this->tle->catnr])) {
292
-            return null;
293
-        }
294
-        $imag = $intrinsicMagnitudes[$this->tle->catnr];
295
-
296
-        // Convert the observer's geodetic info to radians and km so
297
-        // we can compare vectors
298
-        $observerGeo      = new Predict_Geodetic();
299
-        $observerGeo->lat = Predict_Math::Radians($qth->lat);
300
-        $observerGeo->lon = Predict_Math::Radians($qth->lon);
301
-        $observerGeo->alt = $qth->alt * 1000;
302
-
303
-        // Now determine the sun and observer positions
304
-        $observerPos      = new Predict_Vector();
305
-        $observerVel      = new Predict_Vector();
306
-        $solarVector      = new Predict_Vector();
307
-        Predict_Solar::Calculate_Solar_Position($time, $solarVector);
308
-        Predict_SGPObs::Calculate_User_PosVel($time, $observerGeo, $observerPos, $observerVel);
309
-
310
-        // Determine the solar phase and and thus the percent illumination
311
-        $observerSatPos = new Predict_Vector();
312
-        Predict_Math::Vec_Sub($this->pos, $observerPos, $observerSatPos);
313
-        $phaseAngle = Predict_Math::Degrees(Predict_Math::Angle($solarVector, $observerSatPos));
314
-        $illum      = $phaseAngle / 180;
315
-
316
-        $illuminationChange            = $illum / $imag['illum'];
317
-        $inverseSquareOfDistanceChange = pow(($imag['distance'] / $this->range), 2);
318
-        $changeInMagnitude             = log(
319
-            $illuminationChange * $inverseSquareOfDistanceChange,
320
-            self::POGSONS_RATIO
321
-        );
322
-
323
-        return $imag['mag'] - $changeInMagnitude;
324
-    }
259
+		if ((10.0 * abs($sat->tle->xndt2o / (Predict::twopi / Predict::xmnpda / Predict::xmnpda))) == 0) {
260
+			return true;
261
+		} elseif ($sat->jul_epoch + ((16.666666 - $sat->meanmo) /
262
+							   (10.0 * abs($sat->tle->xndt2o / (Predict::twopi / Predict::xmnpda / Predict::xmnpda)))) < $sat->jul_utc) {
263
+			  return true;
264
+		} else {
265
+			  return false;
266
+		}
267
+	}
268
+
269
+	/**
270
+	 * Experimental attempt at calculating apparent magnitude.  Known intrinsic
271
+	 * magnitudes are listed inside the function for now.
272
+	 *
273
+	 * @param float       $time The daynum the satellite is calculated for
274
+	 * @param Predict_QTH $qth  The observer location
275
+	 *
276
+	 * @return null on failure, float otherwise
277
+	 */
278
+	public function calculateApparentMagnitude($time, Predict_QTH $qth)
279
+	{
280
+		// Recorded intrinsic magnitudes and their respective
281
+		// illumination and distance from heavens-above.com
282
+		static $intrinsicMagnitudes = array(
283
+			'25544' => array(
284
+				'mag'      => -1.3,
285
+				'illum'    => .5,
286
+				'distance' => 1000,
287
+			)
288
+		);
289
+
290
+		// Return null if we don't have a record of the intrinsic mag
291
+		if (!isset($intrinsicMagnitudes[$this->tle->catnr])) {
292
+			return null;
293
+		}
294
+		$imag = $intrinsicMagnitudes[$this->tle->catnr];
295
+
296
+		// Convert the observer's geodetic info to radians and km so
297
+		// we can compare vectors
298
+		$observerGeo      = new Predict_Geodetic();
299
+		$observerGeo->lat = Predict_Math::Radians($qth->lat);
300
+		$observerGeo->lon = Predict_Math::Radians($qth->lon);
301
+		$observerGeo->alt = $qth->alt * 1000;
302
+
303
+		// Now determine the sun and observer positions
304
+		$observerPos      = new Predict_Vector();
305
+		$observerVel      = new Predict_Vector();
306
+		$solarVector      = new Predict_Vector();
307
+		Predict_Solar::Calculate_Solar_Position($time, $solarVector);
308
+		Predict_SGPObs::Calculate_User_PosVel($time, $observerGeo, $observerPos, $observerVel);
309
+
310
+		// Determine the solar phase and and thus the percent illumination
311
+		$observerSatPos = new Predict_Vector();
312
+		Predict_Math::Vec_Sub($this->pos, $observerPos, $observerSatPos);
313
+		$phaseAngle = Predict_Math::Degrees(Predict_Math::Angle($solarVector, $observerSatPos));
314
+		$illum      = $phaseAngle / 180;
315
+
316
+		$illuminationChange            = $illum / $imag['illum'];
317
+		$inverseSquareOfDistanceChange = pow(($imag['distance'] / $this->range), 2);
318
+		$changeInMagnitude             = log(
319
+			$illuminationChange * $inverseSquareOfDistanceChange,
320
+			self::POGSONS_RATIO
321
+		);
322
+
323
+		return $imag['mag'] - $changeInMagnitude;
324
+	}
325 325
 }
Please login to merge, or discard this patch.
require/libs/Predict/Predict/Vector.php 1 patch
Indentation   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -6,8 +6,8 @@
 block discarded – undo
6 6
  */
7 7
 class Predict_Vector
8 8
 {
9
-    public $x = 0;
10
-    public $y = 0;
11
-    public $z = 0;
12
-    public $w = 0;
9
+	public $x = 0;
10
+	public $y = 0;
11
+	public $z = 0;
12
+	public $w = 0;
13 13
 }
Please login to merge, or discard this patch.