Grady Hillhouse / SGP4_vallado
Committer:
gradyhillhouse
Date:
Tue Aug 11 22:42:13 2015 +0000
Revision:
0:806c1dd6946c
Port of SGP4 library by Vallado

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gradyhillhouse 0:806c1dd6946c 1 /* ----------------------------------------------------------------
gradyhillhouse 0:806c1dd6946c 2 *
gradyhillhouse 0:806c1dd6946c 3 * sgp4unit.cpp
gradyhillhouse 0:806c1dd6946c 4 *
gradyhillhouse 0:806c1dd6946c 5 * this file contains the sgp4 procedures for analytical propagation
gradyhillhouse 0:806c1dd6946c 6 * of a satellite. the code was originally released in the 1980 and 1986
gradyhillhouse 0:806c1dd6946c 7 * spacetrack papers. a detailed discussion of the theory and history
gradyhillhouse 0:806c1dd6946c 8 * may be found in the 2006 aiaa paper by vallado, crawford, hujsak,
gradyhillhouse 0:806c1dd6946c 9 * and kelso.
gradyhillhouse 0:806c1dd6946c 10 *
gradyhillhouse 0:806c1dd6946c 11 * companion code for
gradyhillhouse 0:806c1dd6946c 12 * fundamentals of astrodynamics and applications
gradyhillhouse 0:806c1dd6946c 13 * 2007
gradyhillhouse 0:806c1dd6946c 14 * by david vallado
gradyhillhouse 0:806c1dd6946c 15 *
gradyhillhouse 0:806c1dd6946c 16 * (w) 719-573-2600, email dvallado@agi.com
gradyhillhouse 0:806c1dd6946c 17 *
gradyhillhouse 0:806c1dd6946c 18 * current :
gradyhillhouse 0:806c1dd6946c 19 * 30 Aug 10 david vallado
gradyhillhouse 0:806c1dd6946c 20 * delete unused variables in initl
gradyhillhouse 0:806c1dd6946c 21 * replace pow inetger 2, 3 with multiplies for speed
gradyhillhouse 0:806c1dd6946c 22 * changes :
gradyhillhouse 0:806c1dd6946c 23 * 3 Nov 08 david vallado
gradyhillhouse 0:806c1dd6946c 24 * put returns in for error codes
gradyhillhouse 0:806c1dd6946c 25 * 29 sep 08 david vallado
gradyhillhouse 0:806c1dd6946c 26 * fix atime for faster operation in dspace
gradyhillhouse 0:806c1dd6946c 27 * add operationmode for afspc (a) or improved (i)
gradyhillhouse 0:806c1dd6946c 28 * performance mode
gradyhillhouse 0:806c1dd6946c 29 * 16 jun 08 david vallado
gradyhillhouse 0:806c1dd6946c 30 * update small eccentricity check
gradyhillhouse 0:806c1dd6946c 31 * 16 nov 07 david vallado
gradyhillhouse 0:806c1dd6946c 32 * misc fixes for better compliance
gradyhillhouse 0:806c1dd6946c 33 * 20 apr 07 david vallado
gradyhillhouse 0:806c1dd6946c 34 * misc fixes for constants
gradyhillhouse 0:806c1dd6946c 35 * 11 aug 06 david vallado
gradyhillhouse 0:806c1dd6946c 36 * chg lyddane choice back to strn3, constants, misc doc
gradyhillhouse 0:806c1dd6946c 37 * 15 dec 05 david vallado
gradyhillhouse 0:806c1dd6946c 38 * misc fixes
gradyhillhouse 0:806c1dd6946c 39 * 26 jul 05 david vallado
gradyhillhouse 0:806c1dd6946c 40 * fixes for paper
gradyhillhouse 0:806c1dd6946c 41 * note that each fix is preceded by a
gradyhillhouse 0:806c1dd6946c 42 * comment with "sgp4fix" and an explanation of
gradyhillhouse 0:806c1dd6946c 43 * what was changed
gradyhillhouse 0:806c1dd6946c 44 * 10 aug 04 david vallado
gradyhillhouse 0:806c1dd6946c 45 * 2nd printing baseline working
gradyhillhouse 0:806c1dd6946c 46 * 14 may 01 david vallado
gradyhillhouse 0:806c1dd6946c 47 * 2nd edition baseline
gradyhillhouse 0:806c1dd6946c 48 * 80 norad
gradyhillhouse 0:806c1dd6946c 49 * original baseline
gradyhillhouse 0:806c1dd6946c 50 * ---------------------------------------------------------------- */
gradyhillhouse 0:806c1dd6946c 51
gradyhillhouse 0:806c1dd6946c 52 #include "sgp4unit.h"
gradyhillhouse 0:806c1dd6946c 53
gradyhillhouse 0:806c1dd6946c 54 //const char help = 'n'; //Not sure what this does. Commented out. - Grady Hillhouse 2015
gradyhillhouse 0:806c1dd6946c 55 //FILE *dbgfile;
gradyhillhouse 0:806c1dd6946c 56
gradyhillhouse 0:806c1dd6946c 57
gradyhillhouse 0:806c1dd6946c 58 /* ----------- local functions - only ever used internally by sgp4 ---------- */
gradyhillhouse 0:806c1dd6946c 59 static void dpper
gradyhillhouse 0:806c1dd6946c 60 (
gradyhillhouse 0:806c1dd6946c 61 double e3, double ee2, double peo, double pgho, double pho,
gradyhillhouse 0:806c1dd6946c 62 double pinco, double plo, double se2, double se3, double sgh2,
gradyhillhouse 0:806c1dd6946c 63 double sgh3, double sgh4, double sh2, double sh3, double si2,
gradyhillhouse 0:806c1dd6946c 64 double si3, double sl2, double sl3, double sl4, double t,
gradyhillhouse 0:806c1dd6946c 65 double xgh2, double xgh3, double xgh4, double xh2, double xh3,
gradyhillhouse 0:806c1dd6946c 66 double xi2, double xi3, double xl2, double xl3, double xl4,
gradyhillhouse 0:806c1dd6946c 67 double zmol, double zmos, double inclo,
gradyhillhouse 0:806c1dd6946c 68 char init,
gradyhillhouse 0:806c1dd6946c 69 double& ep, double& inclp, double& nodep, double& argpp, double& mp,
gradyhillhouse 0:806c1dd6946c 70 char opsmode
gradyhillhouse 0:806c1dd6946c 71 );
gradyhillhouse 0:806c1dd6946c 72
gradyhillhouse 0:806c1dd6946c 73 static void dscom
gradyhillhouse 0:806c1dd6946c 74 (
gradyhillhouse 0:806c1dd6946c 75 double epoch, double ep, double argpp, double tc, double inclp,
gradyhillhouse 0:806c1dd6946c 76 double nodep, double np,
gradyhillhouse 0:806c1dd6946c 77 double& snodm, double& cnodm, double& sinim, double& cosim, double& sinomm,
gradyhillhouse 0:806c1dd6946c 78 double& cosomm,double& day, double& e3, double& ee2, double& em,
gradyhillhouse 0:806c1dd6946c 79 double& emsq, double& gam, double& peo, double& pgho, double& pho,
gradyhillhouse 0:806c1dd6946c 80 double& pinco, double& plo, double& rtemsq, double& se2, double& se3,
gradyhillhouse 0:806c1dd6946c 81 double& sgh2, double& sgh3, double& sgh4, double& sh2, double& sh3,
gradyhillhouse 0:806c1dd6946c 82 double& si2, double& si3, double& sl2, double& sl3, double& sl4,
gradyhillhouse 0:806c1dd6946c 83 double& s1, double& s2, double& s3, double& s4, double& s5,
gradyhillhouse 0:806c1dd6946c 84 double& s6, double& s7, double& ss1, double& ss2, double& ss3,
gradyhillhouse 0:806c1dd6946c 85 double& ss4, double& ss5, double& ss6, double& ss7, double& sz1,
gradyhillhouse 0:806c1dd6946c 86 double& sz2, double& sz3, double& sz11, double& sz12, double& sz13,
gradyhillhouse 0:806c1dd6946c 87 double& sz21, double& sz22, double& sz23, double& sz31, double& sz32,
gradyhillhouse 0:806c1dd6946c 88 double& sz33, double& xgh2, double& xgh3, double& xgh4, double& xh2,
gradyhillhouse 0:806c1dd6946c 89 double& xh3, double& xi2, double& xi3, double& xl2, double& xl3,
gradyhillhouse 0:806c1dd6946c 90 double& xl4, double& nm, double& z1, double& z2, double& z3,
gradyhillhouse 0:806c1dd6946c 91 double& z11, double& z12, double& z13, double& z21, double& z22,
gradyhillhouse 0:806c1dd6946c 92 double& z23, double& z31, double& z32, double& z33, double& zmol,
gradyhillhouse 0:806c1dd6946c 93 double& zmos
gradyhillhouse 0:806c1dd6946c 94 );
gradyhillhouse 0:806c1dd6946c 95
gradyhillhouse 0:806c1dd6946c 96 static void dsinit
gradyhillhouse 0:806c1dd6946c 97 (
gradyhillhouse 0:806c1dd6946c 98 gravconsttype whichconst,
gradyhillhouse 0:806c1dd6946c 99 double cosim, double emsq, double argpo, double s1, double s2,
gradyhillhouse 0:806c1dd6946c 100 double s3, double s4, double s5, double sinim, double ss1,
gradyhillhouse 0:806c1dd6946c 101 double ss2, double ss3, double ss4, double ss5, double sz1,
gradyhillhouse 0:806c1dd6946c 102 double sz3, double sz11, double sz13, double sz21, double sz23,
gradyhillhouse 0:806c1dd6946c 103 double sz31, double sz33, double t, double tc, double gsto,
gradyhillhouse 0:806c1dd6946c 104 double mo, double mdot, double no, double nodeo, double nodedot,
gradyhillhouse 0:806c1dd6946c 105 double xpidot, double z1, double z3, double z11, double z13,
gradyhillhouse 0:806c1dd6946c 106 double z21, double z23, double z31, double z33, double ecco,
gradyhillhouse 0:806c1dd6946c 107 double eccsq, double& em, double& argpm, double& inclm, double& mm,
gradyhillhouse 0:806c1dd6946c 108 double& nm, double& nodem,
gradyhillhouse 0:806c1dd6946c 109 int& irez,
gradyhillhouse 0:806c1dd6946c 110 double& atime, double& d2201, double& d2211, double& d3210, double& d3222,
gradyhillhouse 0:806c1dd6946c 111 double& d4410, double& d4422, double& d5220, double& d5232, double& d5421,
gradyhillhouse 0:806c1dd6946c 112 double& d5433, double& dedt, double& didt, double& dmdt, double& dndt,
gradyhillhouse 0:806c1dd6946c 113 double& dnodt, double& domdt, double& del1, double& del2, double& del3,
gradyhillhouse 0:806c1dd6946c 114 double& xfact, double& xlamo, double& xli, double& xni
gradyhillhouse 0:806c1dd6946c 115 );
gradyhillhouse 0:806c1dd6946c 116
gradyhillhouse 0:806c1dd6946c 117 static void dspace
gradyhillhouse 0:806c1dd6946c 118 (
gradyhillhouse 0:806c1dd6946c 119 int irez,
gradyhillhouse 0:806c1dd6946c 120 double d2201, double d2211, double d3210, double d3222, double d4410,
gradyhillhouse 0:806c1dd6946c 121 double d4422, double d5220, double d5232, double d5421, double d5433,
gradyhillhouse 0:806c1dd6946c 122 double dedt, double del1, double del2, double del3, double didt,
gradyhillhouse 0:806c1dd6946c 123 double dmdt, double dnodt, double domdt, double argpo, double argpdot,
gradyhillhouse 0:806c1dd6946c 124 double t, double tc, double gsto, double xfact, double xlamo,
gradyhillhouse 0:806c1dd6946c 125 double no,
gradyhillhouse 0:806c1dd6946c 126 double& atime, double& em, double& argpm, double& inclm, double& xli,
gradyhillhouse 0:806c1dd6946c 127 double& mm, double& xni, double& nodem, double& dndt, double& nm
gradyhillhouse 0:806c1dd6946c 128 );
gradyhillhouse 0:806c1dd6946c 129
gradyhillhouse 0:806c1dd6946c 130 static void initl
gradyhillhouse 0:806c1dd6946c 131 (
gradyhillhouse 0:806c1dd6946c 132 int satn, gravconsttype whichconst,
gradyhillhouse 0:806c1dd6946c 133 double ecco, double epoch, double inclo, double& no,
gradyhillhouse 0:806c1dd6946c 134 char& method,
gradyhillhouse 0:806c1dd6946c 135 double& ainv, double& ao, double& con41, double& con42, double& cosio,
gradyhillhouse 0:806c1dd6946c 136 double& cosio2,double& eccsq, double& omeosq, double& posq,
gradyhillhouse 0:806c1dd6946c 137 double& rp, double& rteosq,double& sinio , double& gsto, char opsmode
gradyhillhouse 0:806c1dd6946c 138 );
gradyhillhouse 0:806c1dd6946c 139
gradyhillhouse 0:806c1dd6946c 140 /* -----------------------------------------------------------------------------
gradyhillhouse 0:806c1dd6946c 141 *
gradyhillhouse 0:806c1dd6946c 142 * procedure dpper
gradyhillhouse 0:806c1dd6946c 143 *
gradyhillhouse 0:806c1dd6946c 144 * this procedure provides deep space long period periodic contributions
gradyhillhouse 0:806c1dd6946c 145 * to the mean elements. by design, these periodics are zero at epoch.
gradyhillhouse 0:806c1dd6946c 146 * this used to be dscom which included initialization, but it's really a
gradyhillhouse 0:806c1dd6946c 147 * recurring function.
gradyhillhouse 0:806c1dd6946c 148 *
gradyhillhouse 0:806c1dd6946c 149 * author : david vallado 719-573-2600 28 jun 2005
gradyhillhouse 0:806c1dd6946c 150 *
gradyhillhouse 0:806c1dd6946c 151 * inputs :
gradyhillhouse 0:806c1dd6946c 152 * e3 -
gradyhillhouse 0:806c1dd6946c 153 * ee2 -
gradyhillhouse 0:806c1dd6946c 154 * peo -
gradyhillhouse 0:806c1dd6946c 155 * pgho -
gradyhillhouse 0:806c1dd6946c 156 * pho -
gradyhillhouse 0:806c1dd6946c 157 * pinco -
gradyhillhouse 0:806c1dd6946c 158 * plo -
gradyhillhouse 0:806c1dd6946c 159 * se2 , se3 , sgh2, sgh3, sgh4, sh2, sh3, si2, si3, sl2, sl3, sl4 -
gradyhillhouse 0:806c1dd6946c 160 * t -
gradyhillhouse 0:806c1dd6946c 161 * xh2, xh3, xi2, xi3, xl2, xl3, xl4 -
gradyhillhouse 0:806c1dd6946c 162 * zmol -
gradyhillhouse 0:806c1dd6946c 163 * zmos -
gradyhillhouse 0:806c1dd6946c 164 * ep - eccentricity 0.0 - 1.0
gradyhillhouse 0:806c1dd6946c 165 * inclo - inclination - needed for lyddane modification
gradyhillhouse 0:806c1dd6946c 166 * nodep - right ascension of ascending node
gradyhillhouse 0:806c1dd6946c 167 * argpp - argument of perigee
gradyhillhouse 0:806c1dd6946c 168 * mp - mean anomaly
gradyhillhouse 0:806c1dd6946c 169 *
gradyhillhouse 0:806c1dd6946c 170 * outputs :
gradyhillhouse 0:806c1dd6946c 171 * ep - eccentricity 0.0 - 1.0
gradyhillhouse 0:806c1dd6946c 172 * inclp - inclination
gradyhillhouse 0:806c1dd6946c 173 * nodep - right ascension of ascending node
gradyhillhouse 0:806c1dd6946c 174 * argpp - argument of perigee
gradyhillhouse 0:806c1dd6946c 175 * mp - mean anomaly
gradyhillhouse 0:806c1dd6946c 176 *
gradyhillhouse 0:806c1dd6946c 177 * locals :
gradyhillhouse 0:806c1dd6946c 178 * alfdp -
gradyhillhouse 0:806c1dd6946c 179 * betdp -
gradyhillhouse 0:806c1dd6946c 180 * cosip , sinip , cosop , sinop ,
gradyhillhouse 0:806c1dd6946c 181 * dalf -
gradyhillhouse 0:806c1dd6946c 182 * dbet -
gradyhillhouse 0:806c1dd6946c 183 * dls -
gradyhillhouse 0:806c1dd6946c 184 * f2, f3 -
gradyhillhouse 0:806c1dd6946c 185 * pe -
gradyhillhouse 0:806c1dd6946c 186 * pgh -
gradyhillhouse 0:806c1dd6946c 187 * ph -
gradyhillhouse 0:806c1dd6946c 188 * pinc -
gradyhillhouse 0:806c1dd6946c 189 * pl -
gradyhillhouse 0:806c1dd6946c 190 * sel , ses , sghl , sghs , shl , shs , sil , sinzf , sis ,
gradyhillhouse 0:806c1dd6946c 191 * sll , sls
gradyhillhouse 0:806c1dd6946c 192 * xls -
gradyhillhouse 0:806c1dd6946c 193 * xnoh -
gradyhillhouse 0:806c1dd6946c 194 * zf -
gradyhillhouse 0:806c1dd6946c 195 * zm -
gradyhillhouse 0:806c1dd6946c 196 *
gradyhillhouse 0:806c1dd6946c 197 * coupling :
gradyhillhouse 0:806c1dd6946c 198 * none.
gradyhillhouse 0:806c1dd6946c 199 *
gradyhillhouse 0:806c1dd6946c 200 * references :
gradyhillhouse 0:806c1dd6946c 201 * hoots, roehrich, norad spacetrack report #3 1980
gradyhillhouse 0:806c1dd6946c 202 * hoots, norad spacetrack report #6 1986
gradyhillhouse 0:806c1dd6946c 203 * hoots, schumacher and glover 2004
gradyhillhouse 0:806c1dd6946c 204 * vallado, crawford, hujsak, kelso 2006
gradyhillhouse 0:806c1dd6946c 205 ----------------------------------------------------------------------------*/
gradyhillhouse 0:806c1dd6946c 206
gradyhillhouse 0:806c1dd6946c 207 static void dpper
gradyhillhouse 0:806c1dd6946c 208 (
gradyhillhouse 0:806c1dd6946c 209 double e3, double ee2, double peo, double pgho, double pho,
gradyhillhouse 0:806c1dd6946c 210 double pinco, double plo, double se2, double se3, double sgh2,
gradyhillhouse 0:806c1dd6946c 211 double sgh3, double sgh4, double sh2, double sh3, double si2,
gradyhillhouse 0:806c1dd6946c 212 double si3, double sl2, double sl3, double sl4, double t,
gradyhillhouse 0:806c1dd6946c 213 double xgh2, double xgh3, double xgh4, double xh2, double xh3,
gradyhillhouse 0:806c1dd6946c 214 double xi2, double xi3, double xl2, double xl3, double xl4,
gradyhillhouse 0:806c1dd6946c 215 double zmol, double zmos, double inclo,
gradyhillhouse 0:806c1dd6946c 216 char init,
gradyhillhouse 0:806c1dd6946c 217 double& ep, double& inclp, double& nodep, double& argpp, double& mp,
gradyhillhouse 0:806c1dd6946c 218 char opsmode
gradyhillhouse 0:806c1dd6946c 219 )
gradyhillhouse 0:806c1dd6946c 220 {
gradyhillhouse 0:806c1dd6946c 221 /* --------------------- local variables ------------------------ */
gradyhillhouse 0:806c1dd6946c 222 const double twopi = 2.0 * pi;
gradyhillhouse 0:806c1dd6946c 223 double alfdp, betdp, cosip, cosop, dalf, dbet, dls,
gradyhillhouse 0:806c1dd6946c 224 f2, f3, pe, pgh, ph, pinc, pl ,
gradyhillhouse 0:806c1dd6946c 225 sel, ses, sghl, sghs, shll, shs, sil,
gradyhillhouse 0:806c1dd6946c 226 sinip, sinop, sinzf, sis, sll, sls, xls,
gradyhillhouse 0:806c1dd6946c 227 xnoh, zf, zm, zel, zes, znl, zns;
gradyhillhouse 0:806c1dd6946c 228
gradyhillhouse 0:806c1dd6946c 229 /* ---------------------- constants ----------------------------- */
gradyhillhouse 0:806c1dd6946c 230 zns = 1.19459e-5;
gradyhillhouse 0:806c1dd6946c 231 zes = 0.01675;
gradyhillhouse 0:806c1dd6946c 232 znl = 1.5835218e-4;
gradyhillhouse 0:806c1dd6946c 233 zel = 0.05490;
gradyhillhouse 0:806c1dd6946c 234
gradyhillhouse 0:806c1dd6946c 235 /* --------------- calculate time varying periodics ----------- */
gradyhillhouse 0:806c1dd6946c 236 zm = zmos + zns * t;
gradyhillhouse 0:806c1dd6946c 237 // be sure that the initial call has time set to zero
gradyhillhouse 0:806c1dd6946c 238 if (init == 'y')
gradyhillhouse 0:806c1dd6946c 239 zm = zmos;
gradyhillhouse 0:806c1dd6946c 240 zf = zm + 2.0 * zes * sin(zm);
gradyhillhouse 0:806c1dd6946c 241 sinzf = sin(zf);
gradyhillhouse 0:806c1dd6946c 242 f2 = 0.5 * sinzf * sinzf - 0.25;
gradyhillhouse 0:806c1dd6946c 243 f3 = -0.5 * sinzf * cos(zf);
gradyhillhouse 0:806c1dd6946c 244 ses = se2* f2 + se3 * f3;
gradyhillhouse 0:806c1dd6946c 245 sis = si2 * f2 + si3 * f3;
gradyhillhouse 0:806c1dd6946c 246 sls = sl2 * f2 + sl3 * f3 + sl4 * sinzf;
gradyhillhouse 0:806c1dd6946c 247 sghs = sgh2 * f2 + sgh3 * f3 + sgh4 * sinzf;
gradyhillhouse 0:806c1dd6946c 248 shs = sh2 * f2 + sh3 * f3;
gradyhillhouse 0:806c1dd6946c 249 zm = zmol + znl * t;
gradyhillhouse 0:806c1dd6946c 250 if (init == 'y')
gradyhillhouse 0:806c1dd6946c 251 zm = zmol;
gradyhillhouse 0:806c1dd6946c 252 zf = zm + 2.0 * zel * sin(zm);
gradyhillhouse 0:806c1dd6946c 253 sinzf = sin(zf);
gradyhillhouse 0:806c1dd6946c 254 f2 = 0.5 * sinzf * sinzf - 0.25;
gradyhillhouse 0:806c1dd6946c 255 f3 = -0.5 * sinzf * cos(zf);
gradyhillhouse 0:806c1dd6946c 256 sel = ee2 * f2 + e3 * f3;
gradyhillhouse 0:806c1dd6946c 257 sil = xi2 * f2 + xi3 * f3;
gradyhillhouse 0:806c1dd6946c 258 sll = xl2 * f2 + xl3 * f3 + xl4 * sinzf;
gradyhillhouse 0:806c1dd6946c 259 sghl = xgh2 * f2 + xgh3 * f3 + xgh4 * sinzf;
gradyhillhouse 0:806c1dd6946c 260 shll = xh2 * f2 + xh3 * f3;
gradyhillhouse 0:806c1dd6946c 261 pe = ses + sel;
gradyhillhouse 0:806c1dd6946c 262 pinc = sis + sil;
gradyhillhouse 0:806c1dd6946c 263 pl = sls + sll;
gradyhillhouse 0:806c1dd6946c 264 pgh = sghs + sghl;
gradyhillhouse 0:806c1dd6946c 265 ph = shs + shll;
gradyhillhouse 0:806c1dd6946c 266
gradyhillhouse 0:806c1dd6946c 267 if (init == 'n')
gradyhillhouse 0:806c1dd6946c 268 {
gradyhillhouse 0:806c1dd6946c 269 pe = pe - peo;
gradyhillhouse 0:806c1dd6946c 270 pinc = pinc - pinco;
gradyhillhouse 0:806c1dd6946c 271 pl = pl - plo;
gradyhillhouse 0:806c1dd6946c 272 pgh = pgh - pgho;
gradyhillhouse 0:806c1dd6946c 273 ph = ph - pho;
gradyhillhouse 0:806c1dd6946c 274 inclp = inclp + pinc;
gradyhillhouse 0:806c1dd6946c 275 ep = ep + pe;
gradyhillhouse 0:806c1dd6946c 276 sinip = sin(inclp);
gradyhillhouse 0:806c1dd6946c 277 cosip = cos(inclp);
gradyhillhouse 0:806c1dd6946c 278
gradyhillhouse 0:806c1dd6946c 279 /* ----------------- apply periodics directly ------------ */
gradyhillhouse 0:806c1dd6946c 280 // sgp4fix for lyddane choice
gradyhillhouse 0:806c1dd6946c 281 // strn3 used original inclination - this is technically feasible
gradyhillhouse 0:806c1dd6946c 282 // gsfc used perturbed inclination - also technically feasible
gradyhillhouse 0:806c1dd6946c 283 // probably best to readjust the 0.2 limit value and limit discontinuity
gradyhillhouse 0:806c1dd6946c 284 // 0.2 rad = 11.45916 deg
gradyhillhouse 0:806c1dd6946c 285 // use next line for original strn3 approach and original inclination
gradyhillhouse 0:806c1dd6946c 286 // if (inclo >= 0.2)
gradyhillhouse 0:806c1dd6946c 287 // use next line for gsfc version and perturbed inclination
gradyhillhouse 0:806c1dd6946c 288 if (inclp >= 0.2)
gradyhillhouse 0:806c1dd6946c 289 {
gradyhillhouse 0:806c1dd6946c 290 ph = ph / sinip;
gradyhillhouse 0:806c1dd6946c 291 pgh = pgh - cosip * ph;
gradyhillhouse 0:806c1dd6946c 292 argpp = argpp + pgh;
gradyhillhouse 0:806c1dd6946c 293 nodep = nodep + ph;
gradyhillhouse 0:806c1dd6946c 294 mp = mp + pl;
gradyhillhouse 0:806c1dd6946c 295 }
gradyhillhouse 0:806c1dd6946c 296 else
gradyhillhouse 0:806c1dd6946c 297 {
gradyhillhouse 0:806c1dd6946c 298 /* ---- apply periodics with lyddane modification ---- */
gradyhillhouse 0:806c1dd6946c 299 sinop = sin(nodep);
gradyhillhouse 0:806c1dd6946c 300 cosop = cos(nodep);
gradyhillhouse 0:806c1dd6946c 301 alfdp = sinip * sinop;
gradyhillhouse 0:806c1dd6946c 302 betdp = sinip * cosop;
gradyhillhouse 0:806c1dd6946c 303 dalf = ph * cosop + pinc * cosip * sinop;
gradyhillhouse 0:806c1dd6946c 304 dbet = -ph * sinop + pinc * cosip * cosop;
gradyhillhouse 0:806c1dd6946c 305 alfdp = alfdp + dalf;
gradyhillhouse 0:806c1dd6946c 306 betdp = betdp + dbet;
gradyhillhouse 0:806c1dd6946c 307 nodep = fmod(nodep, twopi);
gradyhillhouse 0:806c1dd6946c 308 // sgp4fix for afspc written intrinsic functions
gradyhillhouse 0:806c1dd6946c 309 // nodep used without a trigonometric function ahead
gradyhillhouse 0:806c1dd6946c 310 if ((nodep < 0.0) && (opsmode == 'a'))
gradyhillhouse 0:806c1dd6946c 311 nodep = nodep + twopi;
gradyhillhouse 0:806c1dd6946c 312 xls = mp + argpp + cosip * nodep;
gradyhillhouse 0:806c1dd6946c 313 dls = pl + pgh - pinc * nodep * sinip;
gradyhillhouse 0:806c1dd6946c 314 xls = xls + dls;
gradyhillhouse 0:806c1dd6946c 315 xnoh = nodep;
gradyhillhouse 0:806c1dd6946c 316 nodep = atan2(alfdp, betdp);
gradyhillhouse 0:806c1dd6946c 317 // sgp4fix for afspc written intrinsic functions
gradyhillhouse 0:806c1dd6946c 318 // nodep used without a trigonometric function ahead
gradyhillhouse 0:806c1dd6946c 319 if ((nodep < 0.0) && (opsmode == 'a'))
gradyhillhouse 0:806c1dd6946c 320 nodep = nodep + twopi;
gradyhillhouse 0:806c1dd6946c 321 if (fabs(xnoh - nodep) > pi)
gradyhillhouse 0:806c1dd6946c 322 if (nodep < xnoh)
gradyhillhouse 0:806c1dd6946c 323 nodep = nodep + twopi;
gradyhillhouse 0:806c1dd6946c 324 else
gradyhillhouse 0:806c1dd6946c 325 nodep = nodep - twopi;
gradyhillhouse 0:806c1dd6946c 326 mp = mp + pl;
gradyhillhouse 0:806c1dd6946c 327 argpp = xls - mp - cosip * nodep;
gradyhillhouse 0:806c1dd6946c 328 }
gradyhillhouse 0:806c1dd6946c 329 } // if init == 'n'
gradyhillhouse 0:806c1dd6946c 330
gradyhillhouse 0:806c1dd6946c 331 //#include "debug1.cpp"
gradyhillhouse 0:806c1dd6946c 332 } // end dpper
gradyhillhouse 0:806c1dd6946c 333
gradyhillhouse 0:806c1dd6946c 334 /*-----------------------------------------------------------------------------
gradyhillhouse 0:806c1dd6946c 335 *
gradyhillhouse 0:806c1dd6946c 336 * procedure dscom
gradyhillhouse 0:806c1dd6946c 337 *
gradyhillhouse 0:806c1dd6946c 338 * this procedure provides deep space common items used by both the secular
gradyhillhouse 0:806c1dd6946c 339 * and periodics subroutines. input is provided as shown. this routine
gradyhillhouse 0:806c1dd6946c 340 * used to be called dpper, but the functions inside weren't well organized.
gradyhillhouse 0:806c1dd6946c 341 *
gradyhillhouse 0:806c1dd6946c 342 * author : david vallado 719-573-2600 28 jun 2005
gradyhillhouse 0:806c1dd6946c 343 *
gradyhillhouse 0:806c1dd6946c 344 * inputs :
gradyhillhouse 0:806c1dd6946c 345 * epoch -
gradyhillhouse 0:806c1dd6946c 346 * ep - eccentricity
gradyhillhouse 0:806c1dd6946c 347 * argpp - argument of perigee
gradyhillhouse 0:806c1dd6946c 348 * tc -
gradyhillhouse 0:806c1dd6946c 349 * inclp - inclination
gradyhillhouse 0:806c1dd6946c 350 * nodep - right ascension of ascending node
gradyhillhouse 0:806c1dd6946c 351 * np - mean motion
gradyhillhouse 0:806c1dd6946c 352 *
gradyhillhouse 0:806c1dd6946c 353 * outputs :
gradyhillhouse 0:806c1dd6946c 354 * sinim , cosim , sinomm , cosomm , snodm , cnodm
gradyhillhouse 0:806c1dd6946c 355 * day -
gradyhillhouse 0:806c1dd6946c 356 * e3 -
gradyhillhouse 0:806c1dd6946c 357 * ee2 -
gradyhillhouse 0:806c1dd6946c 358 * em - eccentricity
gradyhillhouse 0:806c1dd6946c 359 * emsq - eccentricity squared
gradyhillhouse 0:806c1dd6946c 360 * gam -
gradyhillhouse 0:806c1dd6946c 361 * peo -
gradyhillhouse 0:806c1dd6946c 362 * pgho -
gradyhillhouse 0:806c1dd6946c 363 * pho -
gradyhillhouse 0:806c1dd6946c 364 * pinco -
gradyhillhouse 0:806c1dd6946c 365 * plo -
gradyhillhouse 0:806c1dd6946c 366 * rtemsq -
gradyhillhouse 0:806c1dd6946c 367 * se2, se3 -
gradyhillhouse 0:806c1dd6946c 368 * sgh2, sgh3, sgh4 -
gradyhillhouse 0:806c1dd6946c 369 * sh2, sh3, si2, si3, sl2, sl3, sl4 -
gradyhillhouse 0:806c1dd6946c 370 * s1, s2, s3, s4, s5, s6, s7 -
gradyhillhouse 0:806c1dd6946c 371 * ss1, ss2, ss3, ss4, ss5, ss6, ss7, sz1, sz2, sz3 -
gradyhillhouse 0:806c1dd6946c 372 * sz11, sz12, sz13, sz21, sz22, sz23, sz31, sz32, sz33 -
gradyhillhouse 0:806c1dd6946c 373 * xgh2, xgh3, xgh4, xh2, xh3, xi2, xi3, xl2, xl3, xl4 -
gradyhillhouse 0:806c1dd6946c 374 * nm - mean motion
gradyhillhouse 0:806c1dd6946c 375 * z1, z2, z3, z11, z12, z13, z21, z22, z23, z31, z32, z33 -
gradyhillhouse 0:806c1dd6946c 376 * zmol -
gradyhillhouse 0:806c1dd6946c 377 * zmos -
gradyhillhouse 0:806c1dd6946c 378 *
gradyhillhouse 0:806c1dd6946c 379 * locals :
gradyhillhouse 0:806c1dd6946c 380 * a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 -
gradyhillhouse 0:806c1dd6946c 381 * betasq -
gradyhillhouse 0:806c1dd6946c 382 * cc -
gradyhillhouse 0:806c1dd6946c 383 * ctem, stem -
gradyhillhouse 0:806c1dd6946c 384 * x1, x2, x3, x4, x5, x6, x7, x8 -
gradyhillhouse 0:806c1dd6946c 385 * xnodce -
gradyhillhouse 0:806c1dd6946c 386 * xnoi -
gradyhillhouse 0:806c1dd6946c 387 * zcosg , zsing , zcosgl , zsingl , zcosh , zsinh , zcoshl , zsinhl ,
gradyhillhouse 0:806c1dd6946c 388 * zcosi , zsini , zcosil , zsinil ,
gradyhillhouse 0:806c1dd6946c 389 * zx -
gradyhillhouse 0:806c1dd6946c 390 * zy -
gradyhillhouse 0:806c1dd6946c 391 *
gradyhillhouse 0:806c1dd6946c 392 * coupling :
gradyhillhouse 0:806c1dd6946c 393 * none.
gradyhillhouse 0:806c1dd6946c 394 *
gradyhillhouse 0:806c1dd6946c 395 * references :
gradyhillhouse 0:806c1dd6946c 396 * hoots, roehrich, norad spacetrack report #3 1980
gradyhillhouse 0:806c1dd6946c 397 * hoots, norad spacetrack report #6 1986
gradyhillhouse 0:806c1dd6946c 398 * hoots, schumacher and glover 2004
gradyhillhouse 0:806c1dd6946c 399 * vallado, crawford, hujsak, kelso 2006
gradyhillhouse 0:806c1dd6946c 400 ----------------------------------------------------------------------------*/
gradyhillhouse 0:806c1dd6946c 401
gradyhillhouse 0:806c1dd6946c 402 static void dscom
gradyhillhouse 0:806c1dd6946c 403 (
gradyhillhouse 0:806c1dd6946c 404 double epoch, double ep, double argpp, double tc, double inclp,
gradyhillhouse 0:806c1dd6946c 405 double nodep, double np,
gradyhillhouse 0:806c1dd6946c 406 double& snodm, double& cnodm, double& sinim, double& cosim, double& sinomm,
gradyhillhouse 0:806c1dd6946c 407 double& cosomm,double& day, double& e3, double& ee2, double& em,
gradyhillhouse 0:806c1dd6946c 408 double& emsq, double& gam, double& peo, double& pgho, double& pho,
gradyhillhouse 0:806c1dd6946c 409 double& pinco, double& plo, double& rtemsq, double& se2, double& se3,
gradyhillhouse 0:806c1dd6946c 410 double& sgh2, double& sgh3, double& sgh4, double& sh2, double& sh3,
gradyhillhouse 0:806c1dd6946c 411 double& si2, double& si3, double& sl2, double& sl3, double& sl4,
gradyhillhouse 0:806c1dd6946c 412 double& s1, double& s2, double& s3, double& s4, double& s5,
gradyhillhouse 0:806c1dd6946c 413 double& s6, double& s7, double& ss1, double& ss2, double& ss3,
gradyhillhouse 0:806c1dd6946c 414 double& ss4, double& ss5, double& ss6, double& ss7, double& sz1,
gradyhillhouse 0:806c1dd6946c 415 double& sz2, double& sz3, double& sz11, double& sz12, double& sz13,
gradyhillhouse 0:806c1dd6946c 416 double& sz21, double& sz22, double& sz23, double& sz31, double& sz32,
gradyhillhouse 0:806c1dd6946c 417 double& sz33, double& xgh2, double& xgh3, double& xgh4, double& xh2,
gradyhillhouse 0:806c1dd6946c 418 double& xh3, double& xi2, double& xi3, double& xl2, double& xl3,
gradyhillhouse 0:806c1dd6946c 419 double& xl4, double& nm, double& z1, double& z2, double& z3,
gradyhillhouse 0:806c1dd6946c 420 double& z11, double& z12, double& z13, double& z21, double& z22,
gradyhillhouse 0:806c1dd6946c 421 double& z23, double& z31, double& z32, double& z33, double& zmol,
gradyhillhouse 0:806c1dd6946c 422 double& zmos
gradyhillhouse 0:806c1dd6946c 423 )
gradyhillhouse 0:806c1dd6946c 424 {
gradyhillhouse 0:806c1dd6946c 425 /* -------------------------- constants ------------------------- */
gradyhillhouse 0:806c1dd6946c 426 const double zes = 0.01675;
gradyhillhouse 0:806c1dd6946c 427 const double zel = 0.05490;
gradyhillhouse 0:806c1dd6946c 428 const double c1ss = 2.9864797e-6;
gradyhillhouse 0:806c1dd6946c 429 const double c1l = 4.7968065e-7;
gradyhillhouse 0:806c1dd6946c 430 const double zsinis = 0.39785416;
gradyhillhouse 0:806c1dd6946c 431 const double zcosis = 0.91744867;
gradyhillhouse 0:806c1dd6946c 432 const double zcosgs = 0.1945905;
gradyhillhouse 0:806c1dd6946c 433 const double zsings = -0.98088458;
gradyhillhouse 0:806c1dd6946c 434 const double twopi = 2.0 * pi;
gradyhillhouse 0:806c1dd6946c 435
gradyhillhouse 0:806c1dd6946c 436 /* --------------------- local variables ------------------------ */
gradyhillhouse 0:806c1dd6946c 437 int lsflg;
gradyhillhouse 0:806c1dd6946c 438 double a1 , a2 , a3 , a4 , a5 , a6 , a7 ,
gradyhillhouse 0:806c1dd6946c 439 a8 , a9 , a10 , betasq, cc , ctem , stem ,
gradyhillhouse 0:806c1dd6946c 440 x1 , x2 , x3 , x4 , x5 , x6 , x7 ,
gradyhillhouse 0:806c1dd6946c 441 x8 , xnodce, xnoi , zcosg , zcosgl, zcosh , zcoshl,
gradyhillhouse 0:806c1dd6946c 442 zcosi , zcosil, zsing , zsingl, zsinh , zsinhl, zsini ,
gradyhillhouse 0:806c1dd6946c 443 zsinil, zx , zy;
gradyhillhouse 0:806c1dd6946c 444
gradyhillhouse 0:806c1dd6946c 445 nm = np;
gradyhillhouse 0:806c1dd6946c 446 em = ep;
gradyhillhouse 0:806c1dd6946c 447 snodm = sin(nodep);
gradyhillhouse 0:806c1dd6946c 448 cnodm = cos(nodep);
gradyhillhouse 0:806c1dd6946c 449 sinomm = sin(argpp);
gradyhillhouse 0:806c1dd6946c 450 cosomm = cos(argpp);
gradyhillhouse 0:806c1dd6946c 451 sinim = sin(inclp);
gradyhillhouse 0:806c1dd6946c 452 cosim = cos(inclp);
gradyhillhouse 0:806c1dd6946c 453 emsq = em * em;
gradyhillhouse 0:806c1dd6946c 454 betasq = 1.0 - emsq;
gradyhillhouse 0:806c1dd6946c 455 rtemsq = sqrt(betasq);
gradyhillhouse 0:806c1dd6946c 456
gradyhillhouse 0:806c1dd6946c 457 /* ----------------- initialize lunar solar terms --------------- */
gradyhillhouse 0:806c1dd6946c 458 peo = 0.0;
gradyhillhouse 0:806c1dd6946c 459 pinco = 0.0;
gradyhillhouse 0:806c1dd6946c 460 plo = 0.0;
gradyhillhouse 0:806c1dd6946c 461 pgho = 0.0;
gradyhillhouse 0:806c1dd6946c 462 pho = 0.0;
gradyhillhouse 0:806c1dd6946c 463 day = epoch + 18261.5 + tc / 1440.0;
gradyhillhouse 0:806c1dd6946c 464 xnodce = fmod(4.5236020 - 9.2422029e-4 * day, twopi);
gradyhillhouse 0:806c1dd6946c 465 stem = sin(xnodce);
gradyhillhouse 0:806c1dd6946c 466 ctem = cos(xnodce);
gradyhillhouse 0:806c1dd6946c 467 zcosil = 0.91375164 - 0.03568096 * ctem;
gradyhillhouse 0:806c1dd6946c 468 zsinil = sqrt(1.0 - zcosil * zcosil);
gradyhillhouse 0:806c1dd6946c 469 zsinhl = 0.089683511 * stem / zsinil;
gradyhillhouse 0:806c1dd6946c 470 zcoshl = sqrt(1.0 - zsinhl * zsinhl);
gradyhillhouse 0:806c1dd6946c 471 gam = 5.8351514 + 0.0019443680 * day;
gradyhillhouse 0:806c1dd6946c 472 zx = 0.39785416 * stem / zsinil;
gradyhillhouse 0:806c1dd6946c 473 zy = zcoshl * ctem + 0.91744867 * zsinhl * stem;
gradyhillhouse 0:806c1dd6946c 474 zx = atan2(zx, zy);
gradyhillhouse 0:806c1dd6946c 475 zx = gam + zx - xnodce;
gradyhillhouse 0:806c1dd6946c 476 zcosgl = cos(zx);
gradyhillhouse 0:806c1dd6946c 477 zsingl = sin(zx);
gradyhillhouse 0:806c1dd6946c 478
gradyhillhouse 0:806c1dd6946c 479 /* ------------------------- do solar terms --------------------- */
gradyhillhouse 0:806c1dd6946c 480 zcosg = zcosgs;
gradyhillhouse 0:806c1dd6946c 481 zsing = zsings;
gradyhillhouse 0:806c1dd6946c 482 zcosi = zcosis;
gradyhillhouse 0:806c1dd6946c 483 zsini = zsinis;
gradyhillhouse 0:806c1dd6946c 484 zcosh = cnodm;
gradyhillhouse 0:806c1dd6946c 485 zsinh = snodm;
gradyhillhouse 0:806c1dd6946c 486 cc = c1ss;
gradyhillhouse 0:806c1dd6946c 487 xnoi = 1.0 / nm;
gradyhillhouse 0:806c1dd6946c 488
gradyhillhouse 0:806c1dd6946c 489 for (lsflg = 1; lsflg <= 2; lsflg++)
gradyhillhouse 0:806c1dd6946c 490 {
gradyhillhouse 0:806c1dd6946c 491 a1 = zcosg * zcosh + zsing * zcosi * zsinh;
gradyhillhouse 0:806c1dd6946c 492 a3 = -zsing * zcosh + zcosg * zcosi * zsinh;
gradyhillhouse 0:806c1dd6946c 493 a7 = -zcosg * zsinh + zsing * zcosi * zcosh;
gradyhillhouse 0:806c1dd6946c 494 a8 = zsing * zsini;
gradyhillhouse 0:806c1dd6946c 495 a9 = zsing * zsinh + zcosg * zcosi * zcosh;
gradyhillhouse 0:806c1dd6946c 496 a10 = zcosg * zsini;
gradyhillhouse 0:806c1dd6946c 497 a2 = cosim * a7 + sinim * a8;
gradyhillhouse 0:806c1dd6946c 498 a4 = cosim * a9 + sinim * a10;
gradyhillhouse 0:806c1dd6946c 499 a5 = -sinim * a7 + cosim * a8;
gradyhillhouse 0:806c1dd6946c 500 a6 = -sinim * a9 + cosim * a10;
gradyhillhouse 0:806c1dd6946c 501
gradyhillhouse 0:806c1dd6946c 502 x1 = a1 * cosomm + a2 * sinomm;
gradyhillhouse 0:806c1dd6946c 503 x2 = a3 * cosomm + a4 * sinomm;
gradyhillhouse 0:806c1dd6946c 504 x3 = -a1 * sinomm + a2 * cosomm;
gradyhillhouse 0:806c1dd6946c 505 x4 = -a3 * sinomm + a4 * cosomm;
gradyhillhouse 0:806c1dd6946c 506 x5 = a5 * sinomm;
gradyhillhouse 0:806c1dd6946c 507 x6 = a6 * sinomm;
gradyhillhouse 0:806c1dd6946c 508 x7 = a5 * cosomm;
gradyhillhouse 0:806c1dd6946c 509 x8 = a6 * cosomm;
gradyhillhouse 0:806c1dd6946c 510
gradyhillhouse 0:806c1dd6946c 511 z31 = 12.0 * x1 * x1 - 3.0 * x3 * x3;
gradyhillhouse 0:806c1dd6946c 512 z32 = 24.0 * x1 * x2 - 6.0 * x3 * x4;
gradyhillhouse 0:806c1dd6946c 513 z33 = 12.0 * x2 * x2 - 3.0 * x4 * x4;
gradyhillhouse 0:806c1dd6946c 514 z1 = 3.0 * (a1 * a1 + a2 * a2) + z31 * emsq;
gradyhillhouse 0:806c1dd6946c 515 z2 = 6.0 * (a1 * a3 + a2 * a4) + z32 * emsq;
gradyhillhouse 0:806c1dd6946c 516 z3 = 3.0 * (a3 * a3 + a4 * a4) + z33 * emsq;
gradyhillhouse 0:806c1dd6946c 517 z11 = -6.0 * a1 * a5 + emsq * (-24.0 * x1 * x7-6.0 * x3 * x5);
gradyhillhouse 0:806c1dd6946c 518 z12 = -6.0 * (a1 * a6 + a3 * a5) + emsq *
gradyhillhouse 0:806c1dd6946c 519 (-24.0 * (x2 * x7 + x1 * x8) - 6.0 * (x3 * x6 + x4 * x5));
gradyhillhouse 0:806c1dd6946c 520 z13 = -6.0 * a3 * a6 + emsq * (-24.0 * x2 * x8 - 6.0 * x4 * x6);
gradyhillhouse 0:806c1dd6946c 521 z21 = 6.0 * a2 * a5 + emsq * (24.0 * x1 * x5 - 6.0 * x3 * x7);
gradyhillhouse 0:806c1dd6946c 522 z22 = 6.0 * (a4 * a5 + a2 * a6) + emsq *
gradyhillhouse 0:806c1dd6946c 523 (24.0 * (x2 * x5 + x1 * x6) - 6.0 * (x4 * x7 + x3 * x8));
gradyhillhouse 0:806c1dd6946c 524 z23 = 6.0 * a4 * a6 + emsq * (24.0 * x2 * x6 - 6.0 * x4 * x8);
gradyhillhouse 0:806c1dd6946c 525 z1 = z1 + z1 + betasq * z31;
gradyhillhouse 0:806c1dd6946c 526 z2 = z2 + z2 + betasq * z32;
gradyhillhouse 0:806c1dd6946c 527 z3 = z3 + z3 + betasq * z33;
gradyhillhouse 0:806c1dd6946c 528 s3 = cc * xnoi;
gradyhillhouse 0:806c1dd6946c 529 s2 = -0.5 * s3 / rtemsq;
gradyhillhouse 0:806c1dd6946c 530 s4 = s3 * rtemsq;
gradyhillhouse 0:806c1dd6946c 531 s1 = -15.0 * em * s4;
gradyhillhouse 0:806c1dd6946c 532 s5 = x1 * x3 + x2 * x4;
gradyhillhouse 0:806c1dd6946c 533 s6 = x2 * x3 + x1 * x4;
gradyhillhouse 0:806c1dd6946c 534 s7 = x2 * x4 - x1 * x3;
gradyhillhouse 0:806c1dd6946c 535
gradyhillhouse 0:806c1dd6946c 536 /* ----------------------- do lunar terms ------------------- */
gradyhillhouse 0:806c1dd6946c 537 if (lsflg == 1)
gradyhillhouse 0:806c1dd6946c 538 {
gradyhillhouse 0:806c1dd6946c 539 ss1 = s1;
gradyhillhouse 0:806c1dd6946c 540 ss2 = s2;
gradyhillhouse 0:806c1dd6946c 541 ss3 = s3;
gradyhillhouse 0:806c1dd6946c 542 ss4 = s4;
gradyhillhouse 0:806c1dd6946c 543 ss5 = s5;
gradyhillhouse 0:806c1dd6946c 544 ss6 = s6;
gradyhillhouse 0:806c1dd6946c 545 ss7 = s7;
gradyhillhouse 0:806c1dd6946c 546 sz1 = z1;
gradyhillhouse 0:806c1dd6946c 547 sz2 = z2;
gradyhillhouse 0:806c1dd6946c 548 sz3 = z3;
gradyhillhouse 0:806c1dd6946c 549 sz11 = z11;
gradyhillhouse 0:806c1dd6946c 550 sz12 = z12;
gradyhillhouse 0:806c1dd6946c 551 sz13 = z13;
gradyhillhouse 0:806c1dd6946c 552 sz21 = z21;
gradyhillhouse 0:806c1dd6946c 553 sz22 = z22;
gradyhillhouse 0:806c1dd6946c 554 sz23 = z23;
gradyhillhouse 0:806c1dd6946c 555 sz31 = z31;
gradyhillhouse 0:806c1dd6946c 556 sz32 = z32;
gradyhillhouse 0:806c1dd6946c 557 sz33 = z33;
gradyhillhouse 0:806c1dd6946c 558 zcosg = zcosgl;
gradyhillhouse 0:806c1dd6946c 559 zsing = zsingl;
gradyhillhouse 0:806c1dd6946c 560 zcosi = zcosil;
gradyhillhouse 0:806c1dd6946c 561 zsini = zsinil;
gradyhillhouse 0:806c1dd6946c 562 zcosh = zcoshl * cnodm + zsinhl * snodm;
gradyhillhouse 0:806c1dd6946c 563 zsinh = snodm * zcoshl - cnodm * zsinhl;
gradyhillhouse 0:806c1dd6946c 564 cc = c1l;
gradyhillhouse 0:806c1dd6946c 565 }
gradyhillhouse 0:806c1dd6946c 566 }
gradyhillhouse 0:806c1dd6946c 567
gradyhillhouse 0:806c1dd6946c 568 zmol = fmod(4.7199672 + 0.22997150 * day - gam, twopi);
gradyhillhouse 0:806c1dd6946c 569 zmos = fmod(6.2565837 + 0.017201977 * day, twopi);
gradyhillhouse 0:806c1dd6946c 570
gradyhillhouse 0:806c1dd6946c 571 /* ------------------------ do solar terms ---------------------- */
gradyhillhouse 0:806c1dd6946c 572 se2 = 2.0 * ss1 * ss6;
gradyhillhouse 0:806c1dd6946c 573 se3 = 2.0 * ss1 * ss7;
gradyhillhouse 0:806c1dd6946c 574 si2 = 2.0 * ss2 * sz12;
gradyhillhouse 0:806c1dd6946c 575 si3 = 2.0 * ss2 * (sz13 - sz11);
gradyhillhouse 0:806c1dd6946c 576 sl2 = -2.0 * ss3 * sz2;
gradyhillhouse 0:806c1dd6946c 577 sl3 = -2.0 * ss3 * (sz3 - sz1);
gradyhillhouse 0:806c1dd6946c 578 sl4 = -2.0 * ss3 * (-21.0 - 9.0 * emsq) * zes;
gradyhillhouse 0:806c1dd6946c 579 sgh2 = 2.0 * ss4 * sz32;
gradyhillhouse 0:806c1dd6946c 580 sgh3 = 2.0 * ss4 * (sz33 - sz31);
gradyhillhouse 0:806c1dd6946c 581 sgh4 = -18.0 * ss4 * zes;
gradyhillhouse 0:806c1dd6946c 582 sh2 = -2.0 * ss2 * sz22;
gradyhillhouse 0:806c1dd6946c 583 sh3 = -2.0 * ss2 * (sz23 - sz21);
gradyhillhouse 0:806c1dd6946c 584
gradyhillhouse 0:806c1dd6946c 585 /* ------------------------ do lunar terms ---------------------- */
gradyhillhouse 0:806c1dd6946c 586 ee2 = 2.0 * s1 * s6;
gradyhillhouse 0:806c1dd6946c 587 e3 = 2.0 * s1 * s7;
gradyhillhouse 0:806c1dd6946c 588 xi2 = 2.0 * s2 * z12;
gradyhillhouse 0:806c1dd6946c 589 xi3 = 2.0 * s2 * (z13 - z11);
gradyhillhouse 0:806c1dd6946c 590 xl2 = -2.0 * s3 * z2;
gradyhillhouse 0:806c1dd6946c 591 xl3 = -2.0 * s3 * (z3 - z1);
gradyhillhouse 0:806c1dd6946c 592 xl4 = -2.0 * s3 * (-21.0 - 9.0 * emsq) * zel;
gradyhillhouse 0:806c1dd6946c 593 xgh2 = 2.0 * s4 * z32;
gradyhillhouse 0:806c1dd6946c 594 xgh3 = 2.0 * s4 * (z33 - z31);
gradyhillhouse 0:806c1dd6946c 595 xgh4 = -18.0 * s4 * zel;
gradyhillhouse 0:806c1dd6946c 596 xh2 = -2.0 * s2 * z22;
gradyhillhouse 0:806c1dd6946c 597 xh3 = -2.0 * s2 * (z23 - z21);
gradyhillhouse 0:806c1dd6946c 598
gradyhillhouse 0:806c1dd6946c 599 //#include "debug2.cpp"
gradyhillhouse 0:806c1dd6946c 600 } // end dscom
gradyhillhouse 0:806c1dd6946c 601
gradyhillhouse 0:806c1dd6946c 602 /*-----------------------------------------------------------------------------
gradyhillhouse 0:806c1dd6946c 603 *
gradyhillhouse 0:806c1dd6946c 604 * procedure dsinit
gradyhillhouse 0:806c1dd6946c 605 *
gradyhillhouse 0:806c1dd6946c 606 * this procedure provides deep space contributions to mean motion dot due
gradyhillhouse 0:806c1dd6946c 607 * to geopotential resonance with half day and one day orbits.
gradyhillhouse 0:806c1dd6946c 608 *
gradyhillhouse 0:806c1dd6946c 609 * author : david vallado 719-573-2600 28 jun 2005
gradyhillhouse 0:806c1dd6946c 610 *
gradyhillhouse 0:806c1dd6946c 611 * inputs :
gradyhillhouse 0:806c1dd6946c 612 * cosim, sinim-
gradyhillhouse 0:806c1dd6946c 613 * emsq - eccentricity squared
gradyhillhouse 0:806c1dd6946c 614 * argpo - argument of perigee
gradyhillhouse 0:806c1dd6946c 615 * s1, s2, s3, s4, s5 -
gradyhillhouse 0:806c1dd6946c 616 * ss1, ss2, ss3, ss4, ss5 -
gradyhillhouse 0:806c1dd6946c 617 * sz1, sz3, sz11, sz13, sz21, sz23, sz31, sz33 -
gradyhillhouse 0:806c1dd6946c 618 * t - time
gradyhillhouse 0:806c1dd6946c 619 * tc -
gradyhillhouse 0:806c1dd6946c 620 * gsto - greenwich sidereal time rad
gradyhillhouse 0:806c1dd6946c 621 * mo - mean anomaly
gradyhillhouse 0:806c1dd6946c 622 * mdot - mean anomaly dot (rate)
gradyhillhouse 0:806c1dd6946c 623 * no - mean motion
gradyhillhouse 0:806c1dd6946c 624 * nodeo - right ascension of ascending node
gradyhillhouse 0:806c1dd6946c 625 * nodedot - right ascension of ascending node dot (rate)
gradyhillhouse 0:806c1dd6946c 626 * xpidot -
gradyhillhouse 0:806c1dd6946c 627 * z1, z3, z11, z13, z21, z23, z31, z33 -
gradyhillhouse 0:806c1dd6946c 628 * eccm - eccentricity
gradyhillhouse 0:806c1dd6946c 629 * argpm - argument of perigee
gradyhillhouse 0:806c1dd6946c 630 * inclm - inclination
gradyhillhouse 0:806c1dd6946c 631 * mm - mean anomaly
gradyhillhouse 0:806c1dd6946c 632 * xn - mean motion
gradyhillhouse 0:806c1dd6946c 633 * nodem - right ascension of ascending node
gradyhillhouse 0:806c1dd6946c 634 *
gradyhillhouse 0:806c1dd6946c 635 * outputs :
gradyhillhouse 0:806c1dd6946c 636 * em - eccentricity
gradyhillhouse 0:806c1dd6946c 637 * argpm - argument of perigee
gradyhillhouse 0:806c1dd6946c 638 * inclm - inclination
gradyhillhouse 0:806c1dd6946c 639 * mm - mean anomaly
gradyhillhouse 0:806c1dd6946c 640 * nm - mean motion
gradyhillhouse 0:806c1dd6946c 641 * nodem - right ascension of ascending node
gradyhillhouse 0:806c1dd6946c 642 * irez - flag for resonance 0-none, 1-one day, 2-half day
gradyhillhouse 0:806c1dd6946c 643 * atime -
gradyhillhouse 0:806c1dd6946c 644 * d2201, d2211, d3210, d3222, d4410, d4422, d5220, d5232, d5421, d5433 -
gradyhillhouse 0:806c1dd6946c 645 * dedt -
gradyhillhouse 0:806c1dd6946c 646 * didt -
gradyhillhouse 0:806c1dd6946c 647 * dmdt -
gradyhillhouse 0:806c1dd6946c 648 * dndt -
gradyhillhouse 0:806c1dd6946c 649 * dnodt -
gradyhillhouse 0:806c1dd6946c 650 * domdt -
gradyhillhouse 0:806c1dd6946c 651 * del1, del2, del3 -
gradyhillhouse 0:806c1dd6946c 652 * ses , sghl , sghs , sgs , shl , shs , sis , sls
gradyhillhouse 0:806c1dd6946c 653 * theta -
gradyhillhouse 0:806c1dd6946c 654 * xfact -
gradyhillhouse 0:806c1dd6946c 655 * xlamo -
gradyhillhouse 0:806c1dd6946c 656 * xli -
gradyhillhouse 0:806c1dd6946c 657 * xni
gradyhillhouse 0:806c1dd6946c 658 *
gradyhillhouse 0:806c1dd6946c 659 * locals :
gradyhillhouse 0:806c1dd6946c 660 * ainv2 -
gradyhillhouse 0:806c1dd6946c 661 * aonv -
gradyhillhouse 0:806c1dd6946c 662 * cosisq -
gradyhillhouse 0:806c1dd6946c 663 * eoc -
gradyhillhouse 0:806c1dd6946c 664 * f220, f221, f311, f321, f322, f330, f441, f442, f522, f523, f542, f543 -
gradyhillhouse 0:806c1dd6946c 665 * g200, g201, g211, g300, g310, g322, g410, g422, g520, g521, g532, g533 -
gradyhillhouse 0:806c1dd6946c 666 * sini2 -
gradyhillhouse 0:806c1dd6946c 667 * temp -
gradyhillhouse 0:806c1dd6946c 668 * temp1 -
gradyhillhouse 0:806c1dd6946c 669 * theta -
gradyhillhouse 0:806c1dd6946c 670 * xno2 -
gradyhillhouse 0:806c1dd6946c 671 *
gradyhillhouse 0:806c1dd6946c 672 * coupling :
gradyhillhouse 0:806c1dd6946c 673 * getgravconst
gradyhillhouse 0:806c1dd6946c 674 *
gradyhillhouse 0:806c1dd6946c 675 * references :
gradyhillhouse 0:806c1dd6946c 676 * hoots, roehrich, norad spacetrack report #3 1980
gradyhillhouse 0:806c1dd6946c 677 * hoots, norad spacetrack report #6 1986
gradyhillhouse 0:806c1dd6946c 678 * hoots, schumacher and glover 2004
gradyhillhouse 0:806c1dd6946c 679 * vallado, crawford, hujsak, kelso 2006
gradyhillhouse 0:806c1dd6946c 680 ----------------------------------------------------------------------------*/
gradyhillhouse 0:806c1dd6946c 681
gradyhillhouse 0:806c1dd6946c 682 static void dsinit
gradyhillhouse 0:806c1dd6946c 683 (
gradyhillhouse 0:806c1dd6946c 684 gravconsttype whichconst,
gradyhillhouse 0:806c1dd6946c 685 double cosim, double emsq, double argpo, double s1, double s2,
gradyhillhouse 0:806c1dd6946c 686 double s3, double s4, double s5, double sinim, double ss1,
gradyhillhouse 0:806c1dd6946c 687 double ss2, double ss3, double ss4, double ss5, double sz1,
gradyhillhouse 0:806c1dd6946c 688 double sz3, double sz11, double sz13, double sz21, double sz23,
gradyhillhouse 0:806c1dd6946c 689 double sz31, double sz33, double t, double tc, double gsto,
gradyhillhouse 0:806c1dd6946c 690 double mo, double mdot, double no, double nodeo, double nodedot,
gradyhillhouse 0:806c1dd6946c 691 double xpidot, double z1, double z3, double z11, double z13,
gradyhillhouse 0:806c1dd6946c 692 double z21, double z23, double z31, double z33, double ecco,
gradyhillhouse 0:806c1dd6946c 693 double eccsq, double& em, double& argpm, double& inclm, double& mm,
gradyhillhouse 0:806c1dd6946c 694 double& nm, double& nodem,
gradyhillhouse 0:806c1dd6946c 695 int& irez,
gradyhillhouse 0:806c1dd6946c 696 double& atime, double& d2201, double& d2211, double& d3210, double& d3222,
gradyhillhouse 0:806c1dd6946c 697 double& d4410, double& d4422, double& d5220, double& d5232, double& d5421,
gradyhillhouse 0:806c1dd6946c 698 double& d5433, double& dedt, double& didt, double& dmdt, double& dndt,
gradyhillhouse 0:806c1dd6946c 699 double& dnodt, double& domdt, double& del1, double& del2, double& del3,
gradyhillhouse 0:806c1dd6946c 700 double& xfact, double& xlamo, double& xli, double& xni
gradyhillhouse 0:806c1dd6946c 701 )
gradyhillhouse 0:806c1dd6946c 702 {
gradyhillhouse 0:806c1dd6946c 703 /* --------------------- local variables ------------------------ */
gradyhillhouse 0:806c1dd6946c 704 const double twopi = 2.0 * pi;
gradyhillhouse 0:806c1dd6946c 705
gradyhillhouse 0:806c1dd6946c 706 double ainv2 , aonv=0.0, cosisq, eoc, f220 , f221 , f311 ,
gradyhillhouse 0:806c1dd6946c 707 f321 , f322 , f330 , f441 , f442 , f522 , f523 ,
gradyhillhouse 0:806c1dd6946c 708 f542 , f543 , g200 , g201 , g211 , g300 , g310 ,
gradyhillhouse 0:806c1dd6946c 709 g322 , g410 , g422 , g520 , g521 , g532 , g533 ,
gradyhillhouse 0:806c1dd6946c 710 ses , sgs , sghl , sghs , shs , shll , sis ,
gradyhillhouse 0:806c1dd6946c 711 sini2 , sls , temp , temp1 , theta , xno2 , q22 ,
gradyhillhouse 0:806c1dd6946c 712 q31 , q33 , root22, root44, root54, rptim , root32,
gradyhillhouse 0:806c1dd6946c 713 root52, x2o3 , xke , znl , emo , zns , emsqo,
gradyhillhouse 0:806c1dd6946c 714 tumin, mu, radiusearthkm, j2, j3, j4, j3oj2;
gradyhillhouse 0:806c1dd6946c 715
gradyhillhouse 0:806c1dd6946c 716 q22 = 1.7891679e-6;
gradyhillhouse 0:806c1dd6946c 717 q31 = 2.1460748e-6;
gradyhillhouse 0:806c1dd6946c 718 q33 = 2.2123015e-7;
gradyhillhouse 0:806c1dd6946c 719 root22 = 1.7891679e-6;
gradyhillhouse 0:806c1dd6946c 720 root44 = 7.3636953e-9;
gradyhillhouse 0:806c1dd6946c 721 root54 = 2.1765803e-9;
gradyhillhouse 0:806c1dd6946c 722 rptim = 4.37526908801129966e-3; // this equates to 7.29211514668855e-5 rad/sec
gradyhillhouse 0:806c1dd6946c 723 root32 = 3.7393792e-7;
gradyhillhouse 0:806c1dd6946c 724 root52 = 1.1428639e-7;
gradyhillhouse 0:806c1dd6946c 725 x2o3 = 2.0 / 3.0;
gradyhillhouse 0:806c1dd6946c 726 znl = 1.5835218e-4;
gradyhillhouse 0:806c1dd6946c 727 zns = 1.19459e-5;
gradyhillhouse 0:806c1dd6946c 728
gradyhillhouse 0:806c1dd6946c 729 // sgp4fix identify constants and allow alternate values
gradyhillhouse 0:806c1dd6946c 730 getgravconst( whichconst, tumin, mu, radiusearthkm, xke, j2, j3, j4, j3oj2 );
gradyhillhouse 0:806c1dd6946c 731
gradyhillhouse 0:806c1dd6946c 732 /* -------------------- deep space initialization ------------ */
gradyhillhouse 0:806c1dd6946c 733 irez = 0;
gradyhillhouse 0:806c1dd6946c 734 if ((nm < 0.0052359877) && (nm > 0.0034906585))
gradyhillhouse 0:806c1dd6946c 735 irez = 1;
gradyhillhouse 0:806c1dd6946c 736 if ((nm >= 8.26e-3) && (nm <= 9.24e-3) && (em >= 0.5))
gradyhillhouse 0:806c1dd6946c 737 irez = 2;
gradyhillhouse 0:806c1dd6946c 738
gradyhillhouse 0:806c1dd6946c 739 /* ------------------------ do solar terms ------------------- */
gradyhillhouse 0:806c1dd6946c 740 ses = ss1 * zns * ss5;
gradyhillhouse 0:806c1dd6946c 741 sis = ss2 * zns * (sz11 + sz13);
gradyhillhouse 0:806c1dd6946c 742 sls = -zns * ss3 * (sz1 + sz3 - 14.0 - 6.0 * emsq);
gradyhillhouse 0:806c1dd6946c 743 sghs = ss4 * zns * (sz31 + sz33 - 6.0);
gradyhillhouse 0:806c1dd6946c 744 shs = -zns * ss2 * (sz21 + sz23);
gradyhillhouse 0:806c1dd6946c 745 // sgp4fix for 180 deg incl
gradyhillhouse 0:806c1dd6946c 746 if ((inclm < 5.2359877e-2) || (inclm > pi - 5.2359877e-2))
gradyhillhouse 0:806c1dd6946c 747 shs = 0.0;
gradyhillhouse 0:806c1dd6946c 748 if (sinim != 0.0)
gradyhillhouse 0:806c1dd6946c 749 shs = shs / sinim;
gradyhillhouse 0:806c1dd6946c 750 sgs = sghs - cosim * shs;
gradyhillhouse 0:806c1dd6946c 751
gradyhillhouse 0:806c1dd6946c 752 /* ------------------------- do lunar terms ------------------ */
gradyhillhouse 0:806c1dd6946c 753 dedt = ses + s1 * znl * s5;
gradyhillhouse 0:806c1dd6946c 754 didt = sis + s2 * znl * (z11 + z13);
gradyhillhouse 0:806c1dd6946c 755 dmdt = sls - znl * s3 * (z1 + z3 - 14.0 - 6.0 * emsq);
gradyhillhouse 0:806c1dd6946c 756 sghl = s4 * znl * (z31 + z33 - 6.0);
gradyhillhouse 0:806c1dd6946c 757 shll = -znl * s2 * (z21 + z23);
gradyhillhouse 0:806c1dd6946c 758 // sgp4fix for 180 deg incl
gradyhillhouse 0:806c1dd6946c 759 if ((inclm < 5.2359877e-2) || (inclm > pi - 5.2359877e-2))
gradyhillhouse 0:806c1dd6946c 760 shll = 0.0;
gradyhillhouse 0:806c1dd6946c 761 domdt = sgs + sghl;
gradyhillhouse 0:806c1dd6946c 762 dnodt = shs;
gradyhillhouse 0:806c1dd6946c 763 if (sinim != 0.0)
gradyhillhouse 0:806c1dd6946c 764 {
gradyhillhouse 0:806c1dd6946c 765 domdt = domdt - cosim / sinim * shll;
gradyhillhouse 0:806c1dd6946c 766 dnodt = dnodt + shll / sinim;
gradyhillhouse 0:806c1dd6946c 767 }
gradyhillhouse 0:806c1dd6946c 768
gradyhillhouse 0:806c1dd6946c 769 /* ----------- calculate deep space resonance effects -------- */
gradyhillhouse 0:806c1dd6946c 770 dndt = 0.0;
gradyhillhouse 0:806c1dd6946c 771 theta = fmod(gsto + tc * rptim, twopi);
gradyhillhouse 0:806c1dd6946c 772 em = em + dedt * t;
gradyhillhouse 0:806c1dd6946c 773 inclm = inclm + didt * t;
gradyhillhouse 0:806c1dd6946c 774 argpm = argpm + domdt * t;
gradyhillhouse 0:806c1dd6946c 775 nodem = nodem + dnodt * t;
gradyhillhouse 0:806c1dd6946c 776 mm = mm + dmdt * t;
gradyhillhouse 0:806c1dd6946c 777 // sgp4fix for negative inclinations
gradyhillhouse 0:806c1dd6946c 778 // the following if statement should be commented out
gradyhillhouse 0:806c1dd6946c 779 //if (inclm < 0.0)
gradyhillhouse 0:806c1dd6946c 780 // {
gradyhillhouse 0:806c1dd6946c 781 // inclm = -inclm;
gradyhillhouse 0:806c1dd6946c 782 // argpm = argpm - pi;
gradyhillhouse 0:806c1dd6946c 783 // nodem = nodem + pi;
gradyhillhouse 0:806c1dd6946c 784 // }
gradyhillhouse 0:806c1dd6946c 785
gradyhillhouse 0:806c1dd6946c 786 /* -------------- initialize the resonance terms ------------- */
gradyhillhouse 0:806c1dd6946c 787 if (irez != 0)
gradyhillhouse 0:806c1dd6946c 788 {
gradyhillhouse 0:806c1dd6946c 789 aonv = pow(nm / xke, x2o3);
gradyhillhouse 0:806c1dd6946c 790
gradyhillhouse 0:806c1dd6946c 791 /* ---------- geopotential resonance for 12 hour orbits ------ */
gradyhillhouse 0:806c1dd6946c 792 if (irez == 2)
gradyhillhouse 0:806c1dd6946c 793 {
gradyhillhouse 0:806c1dd6946c 794 cosisq = cosim * cosim;
gradyhillhouse 0:806c1dd6946c 795 emo = em;
gradyhillhouse 0:806c1dd6946c 796 em = ecco;
gradyhillhouse 0:806c1dd6946c 797 emsqo = emsq;
gradyhillhouse 0:806c1dd6946c 798 emsq = eccsq;
gradyhillhouse 0:806c1dd6946c 799 eoc = em * emsq;
gradyhillhouse 0:806c1dd6946c 800 g201 = -0.306 - (em - 0.64) * 0.440;
gradyhillhouse 0:806c1dd6946c 801
gradyhillhouse 0:806c1dd6946c 802 if (em <= 0.65)
gradyhillhouse 0:806c1dd6946c 803 {
gradyhillhouse 0:806c1dd6946c 804 g211 = 3.616 - 13.2470 * em + 16.2900 * emsq;
gradyhillhouse 0:806c1dd6946c 805 g310 = -19.302 + 117.3900 * em - 228.4190 * emsq + 156.5910 * eoc;
gradyhillhouse 0:806c1dd6946c 806 g322 = -18.9068 + 109.7927 * em - 214.6334 * emsq + 146.5816 * eoc;
gradyhillhouse 0:806c1dd6946c 807 g410 = -41.122 + 242.6940 * em - 471.0940 * emsq + 313.9530 * eoc;
gradyhillhouse 0:806c1dd6946c 808 g422 = -146.407 + 841.8800 * em - 1629.014 * emsq + 1083.4350 * eoc;
gradyhillhouse 0:806c1dd6946c 809 g520 = -532.114 + 3017.977 * em - 5740.032 * emsq + 3708.2760 * eoc;
gradyhillhouse 0:806c1dd6946c 810 }
gradyhillhouse 0:806c1dd6946c 811 else
gradyhillhouse 0:806c1dd6946c 812 {
gradyhillhouse 0:806c1dd6946c 813 g211 = -72.099 + 331.819 * em - 508.738 * emsq + 266.724 * eoc;
gradyhillhouse 0:806c1dd6946c 814 g310 = -346.844 + 1582.851 * em - 2415.925 * emsq + 1246.113 * eoc;
gradyhillhouse 0:806c1dd6946c 815 g322 = -342.585 + 1554.908 * em - 2366.899 * emsq + 1215.972 * eoc;
gradyhillhouse 0:806c1dd6946c 816 g410 = -1052.797 + 4758.686 * em - 7193.992 * emsq + 3651.957 * eoc;
gradyhillhouse 0:806c1dd6946c 817 g422 = -3581.690 + 16178.110 * em - 24462.770 * emsq + 12422.520 * eoc;
gradyhillhouse 0:806c1dd6946c 818 if (em > 0.715)
gradyhillhouse 0:806c1dd6946c 819 g520 =-5149.66 + 29936.92 * em - 54087.36 * emsq + 31324.56 * eoc;
gradyhillhouse 0:806c1dd6946c 820 else
gradyhillhouse 0:806c1dd6946c 821 g520 = 1464.74 - 4664.75 * em + 3763.64 * emsq;
gradyhillhouse 0:806c1dd6946c 822 }
gradyhillhouse 0:806c1dd6946c 823 if (em < 0.7)
gradyhillhouse 0:806c1dd6946c 824 {
gradyhillhouse 0:806c1dd6946c 825 g533 = -919.22770 + 4988.6100 * em - 9064.7700 * emsq + 5542.21 * eoc;
gradyhillhouse 0:806c1dd6946c 826 g521 = -822.71072 + 4568.6173 * em - 8491.4146 * emsq + 5337.524 * eoc;
gradyhillhouse 0:806c1dd6946c 827 g532 = -853.66600 + 4690.2500 * em - 8624.7700 * emsq + 5341.4 * eoc;
gradyhillhouse 0:806c1dd6946c 828 }
gradyhillhouse 0:806c1dd6946c 829 else
gradyhillhouse 0:806c1dd6946c 830 {
gradyhillhouse 0:806c1dd6946c 831 g533 =-37995.780 + 161616.52 * em - 229838.20 * emsq + 109377.94 * eoc;
gradyhillhouse 0:806c1dd6946c 832 g521 =-51752.104 + 218913.95 * em - 309468.16 * emsq + 146349.42 * eoc;
gradyhillhouse 0:806c1dd6946c 833 g532 =-40023.880 + 170470.89 * em - 242699.48 * emsq + 115605.82 * eoc;
gradyhillhouse 0:806c1dd6946c 834 }
gradyhillhouse 0:806c1dd6946c 835
gradyhillhouse 0:806c1dd6946c 836 sini2= sinim * sinim;
gradyhillhouse 0:806c1dd6946c 837 f220 = 0.75 * (1.0 + 2.0 * cosim+cosisq);
gradyhillhouse 0:806c1dd6946c 838 f221 = 1.5 * sini2;
gradyhillhouse 0:806c1dd6946c 839 f321 = 1.875 * sinim * (1.0 - 2.0 * cosim - 3.0 * cosisq);
gradyhillhouse 0:806c1dd6946c 840 f322 = -1.875 * sinim * (1.0 + 2.0 * cosim - 3.0 * cosisq);
gradyhillhouse 0:806c1dd6946c 841 f441 = 35.0 * sini2 * f220;
gradyhillhouse 0:806c1dd6946c 842 f442 = 39.3750 * sini2 * sini2;
gradyhillhouse 0:806c1dd6946c 843 f522 = 9.84375 * sinim * (sini2 * (1.0 - 2.0 * cosim- 5.0 * cosisq) +
gradyhillhouse 0:806c1dd6946c 844 0.33333333 * (-2.0 + 4.0 * cosim + 6.0 * cosisq) );
gradyhillhouse 0:806c1dd6946c 845 f523 = sinim * (4.92187512 * sini2 * (-2.0 - 4.0 * cosim +
gradyhillhouse 0:806c1dd6946c 846 10.0 * cosisq) + 6.56250012 * (1.0+2.0 * cosim - 3.0 * cosisq));
gradyhillhouse 0:806c1dd6946c 847 f542 = 29.53125 * sinim * (2.0 - 8.0 * cosim+cosisq *
gradyhillhouse 0:806c1dd6946c 848 (-12.0 + 8.0 * cosim + 10.0 * cosisq));
gradyhillhouse 0:806c1dd6946c 849 f543 = 29.53125 * sinim * (-2.0 - 8.0 * cosim+cosisq *
gradyhillhouse 0:806c1dd6946c 850 (12.0 + 8.0 * cosim - 10.0 * cosisq));
gradyhillhouse 0:806c1dd6946c 851 xno2 = nm * nm;
gradyhillhouse 0:806c1dd6946c 852 ainv2 = aonv * aonv;
gradyhillhouse 0:806c1dd6946c 853 temp1 = 3.0 * xno2 * ainv2;
gradyhillhouse 0:806c1dd6946c 854 temp = temp1 * root22;
gradyhillhouse 0:806c1dd6946c 855 d2201 = temp * f220 * g201;
gradyhillhouse 0:806c1dd6946c 856 d2211 = temp * f221 * g211;
gradyhillhouse 0:806c1dd6946c 857 temp1 = temp1 * aonv;
gradyhillhouse 0:806c1dd6946c 858 temp = temp1 * root32;
gradyhillhouse 0:806c1dd6946c 859 d3210 = temp * f321 * g310;
gradyhillhouse 0:806c1dd6946c 860 d3222 = temp * f322 * g322;
gradyhillhouse 0:806c1dd6946c 861 temp1 = temp1 * aonv;
gradyhillhouse 0:806c1dd6946c 862 temp = 2.0 * temp1 * root44;
gradyhillhouse 0:806c1dd6946c 863 d4410 = temp * f441 * g410;
gradyhillhouse 0:806c1dd6946c 864 d4422 = temp * f442 * g422;
gradyhillhouse 0:806c1dd6946c 865 temp1 = temp1 * aonv;
gradyhillhouse 0:806c1dd6946c 866 temp = temp1 * root52;
gradyhillhouse 0:806c1dd6946c 867 d5220 = temp * f522 * g520;
gradyhillhouse 0:806c1dd6946c 868 d5232 = temp * f523 * g532;
gradyhillhouse 0:806c1dd6946c 869 temp = 2.0 * temp1 * root54;
gradyhillhouse 0:806c1dd6946c 870 d5421 = temp * f542 * g521;
gradyhillhouse 0:806c1dd6946c 871 d5433 = temp * f543 * g533;
gradyhillhouse 0:806c1dd6946c 872 xlamo = fmod(mo + nodeo + nodeo-theta - theta, twopi);
gradyhillhouse 0:806c1dd6946c 873 xfact = mdot + dmdt + 2.0 * (nodedot + dnodt - rptim) - no;
gradyhillhouse 0:806c1dd6946c 874 em = emo;
gradyhillhouse 0:806c1dd6946c 875 emsq = emsqo;
gradyhillhouse 0:806c1dd6946c 876 }
gradyhillhouse 0:806c1dd6946c 877
gradyhillhouse 0:806c1dd6946c 878 /* ---------------- synchronous resonance terms -------------- */
gradyhillhouse 0:806c1dd6946c 879 if (irez == 1)
gradyhillhouse 0:806c1dd6946c 880 {
gradyhillhouse 0:806c1dd6946c 881 g200 = 1.0 + emsq * (-2.5 + 0.8125 * emsq);
gradyhillhouse 0:806c1dd6946c 882 g310 = 1.0 + 2.0 * emsq;
gradyhillhouse 0:806c1dd6946c 883 g300 = 1.0 + emsq * (-6.0 + 6.60937 * emsq);
gradyhillhouse 0:806c1dd6946c 884 f220 = 0.75 * (1.0 + cosim) * (1.0 + cosim);
gradyhillhouse 0:806c1dd6946c 885 f311 = 0.9375 * sinim * sinim * (1.0 + 3.0 * cosim) - 0.75 * (1.0 + cosim);
gradyhillhouse 0:806c1dd6946c 886 f330 = 1.0 + cosim;
gradyhillhouse 0:806c1dd6946c 887 f330 = 1.875 * f330 * f330 * f330;
gradyhillhouse 0:806c1dd6946c 888 del1 = 3.0 * nm * nm * aonv * aonv;
gradyhillhouse 0:806c1dd6946c 889 del2 = 2.0 * del1 * f220 * g200 * q22;
gradyhillhouse 0:806c1dd6946c 890 del3 = 3.0 * del1 * f330 * g300 * q33 * aonv;
gradyhillhouse 0:806c1dd6946c 891 del1 = del1 * f311 * g310 * q31 * aonv;
gradyhillhouse 0:806c1dd6946c 892 xlamo = fmod(mo + nodeo + argpo - theta, twopi);
gradyhillhouse 0:806c1dd6946c 893 xfact = mdot + xpidot - rptim + dmdt + domdt + dnodt - no;
gradyhillhouse 0:806c1dd6946c 894 }
gradyhillhouse 0:806c1dd6946c 895
gradyhillhouse 0:806c1dd6946c 896 /* ------------ for sgp4, initialize the integrator ---------- */
gradyhillhouse 0:806c1dd6946c 897 xli = xlamo;
gradyhillhouse 0:806c1dd6946c 898 xni = no;
gradyhillhouse 0:806c1dd6946c 899 atime = 0.0;
gradyhillhouse 0:806c1dd6946c 900 nm = no + dndt;
gradyhillhouse 0:806c1dd6946c 901 }
gradyhillhouse 0:806c1dd6946c 902
gradyhillhouse 0:806c1dd6946c 903 //#include "debug3.cpp"
gradyhillhouse 0:806c1dd6946c 904 } // end dsinit
gradyhillhouse 0:806c1dd6946c 905
gradyhillhouse 0:806c1dd6946c 906 /*-----------------------------------------------------------------------------
gradyhillhouse 0:806c1dd6946c 907 *
gradyhillhouse 0:806c1dd6946c 908 * procedure dspace
gradyhillhouse 0:806c1dd6946c 909 *
gradyhillhouse 0:806c1dd6946c 910 * this procedure provides deep space contributions to mean elements for
gradyhillhouse 0:806c1dd6946c 911 * perturbing third body. these effects have been averaged over one
gradyhillhouse 0:806c1dd6946c 912 * revolution of the sun and moon. for earth resonance effects, the
gradyhillhouse 0:806c1dd6946c 913 * effects have been averaged over no revolutions of the satellite.
gradyhillhouse 0:806c1dd6946c 914 * (mean motion)
gradyhillhouse 0:806c1dd6946c 915 *
gradyhillhouse 0:806c1dd6946c 916 * author : david vallado 719-573-2600 28 jun 2005
gradyhillhouse 0:806c1dd6946c 917 *
gradyhillhouse 0:806c1dd6946c 918 * inputs :
gradyhillhouse 0:806c1dd6946c 919 * d2201, d2211, d3210, d3222, d4410, d4422, d5220, d5232, d5421, d5433 -
gradyhillhouse 0:806c1dd6946c 920 * dedt -
gradyhillhouse 0:806c1dd6946c 921 * del1, del2, del3 -
gradyhillhouse 0:806c1dd6946c 922 * didt -
gradyhillhouse 0:806c1dd6946c 923 * dmdt -
gradyhillhouse 0:806c1dd6946c 924 * dnodt -
gradyhillhouse 0:806c1dd6946c 925 * domdt -
gradyhillhouse 0:806c1dd6946c 926 * irez - flag for resonance 0-none, 1-one day, 2-half day
gradyhillhouse 0:806c1dd6946c 927 * argpo - argument of perigee
gradyhillhouse 0:806c1dd6946c 928 * argpdot - argument of perigee dot (rate)
gradyhillhouse 0:806c1dd6946c 929 * t - time
gradyhillhouse 0:806c1dd6946c 930 * tc -
gradyhillhouse 0:806c1dd6946c 931 * gsto - gst
gradyhillhouse 0:806c1dd6946c 932 * xfact -
gradyhillhouse 0:806c1dd6946c 933 * xlamo -
gradyhillhouse 0:806c1dd6946c 934 * no - mean motion
gradyhillhouse 0:806c1dd6946c 935 * atime -
gradyhillhouse 0:806c1dd6946c 936 * em - eccentricity
gradyhillhouse 0:806c1dd6946c 937 * ft -
gradyhillhouse 0:806c1dd6946c 938 * argpm - argument of perigee
gradyhillhouse 0:806c1dd6946c 939 * inclm - inclination
gradyhillhouse 0:806c1dd6946c 940 * xli -
gradyhillhouse 0:806c1dd6946c 941 * mm - mean anomaly
gradyhillhouse 0:806c1dd6946c 942 * xni - mean motion
gradyhillhouse 0:806c1dd6946c 943 * nodem - right ascension of ascending node
gradyhillhouse 0:806c1dd6946c 944 *
gradyhillhouse 0:806c1dd6946c 945 * outputs :
gradyhillhouse 0:806c1dd6946c 946 * atime -
gradyhillhouse 0:806c1dd6946c 947 * em - eccentricity
gradyhillhouse 0:806c1dd6946c 948 * argpm - argument of perigee
gradyhillhouse 0:806c1dd6946c 949 * inclm - inclination
gradyhillhouse 0:806c1dd6946c 950 * xli -
gradyhillhouse 0:806c1dd6946c 951 * mm - mean anomaly
gradyhillhouse 0:806c1dd6946c 952 * xni -
gradyhillhouse 0:806c1dd6946c 953 * nodem - right ascension of ascending node
gradyhillhouse 0:806c1dd6946c 954 * dndt -
gradyhillhouse 0:806c1dd6946c 955 * nm - mean motion
gradyhillhouse 0:806c1dd6946c 956 *
gradyhillhouse 0:806c1dd6946c 957 * locals :
gradyhillhouse 0:806c1dd6946c 958 * delt -
gradyhillhouse 0:806c1dd6946c 959 * ft -
gradyhillhouse 0:806c1dd6946c 960 * theta -
gradyhillhouse 0:806c1dd6946c 961 * x2li -
gradyhillhouse 0:806c1dd6946c 962 * x2omi -
gradyhillhouse 0:806c1dd6946c 963 * xl -
gradyhillhouse 0:806c1dd6946c 964 * xldot -
gradyhillhouse 0:806c1dd6946c 965 * xnddt -
gradyhillhouse 0:806c1dd6946c 966 * xndt -
gradyhillhouse 0:806c1dd6946c 967 * xomi -
gradyhillhouse 0:806c1dd6946c 968 *
gradyhillhouse 0:806c1dd6946c 969 * coupling :
gradyhillhouse 0:806c1dd6946c 970 * none -
gradyhillhouse 0:806c1dd6946c 971 *
gradyhillhouse 0:806c1dd6946c 972 * references :
gradyhillhouse 0:806c1dd6946c 973 * hoots, roehrich, norad spacetrack report #3 1980
gradyhillhouse 0:806c1dd6946c 974 * hoots, norad spacetrack report #6 1986
gradyhillhouse 0:806c1dd6946c 975 * hoots, schumacher and glover 2004
gradyhillhouse 0:806c1dd6946c 976 * vallado, crawford, hujsak, kelso 2006
gradyhillhouse 0:806c1dd6946c 977 ----------------------------------------------------------------------------*/
gradyhillhouse 0:806c1dd6946c 978
gradyhillhouse 0:806c1dd6946c 979 static void dspace
gradyhillhouse 0:806c1dd6946c 980 (
gradyhillhouse 0:806c1dd6946c 981 int irez,
gradyhillhouse 0:806c1dd6946c 982 double d2201, double d2211, double d3210, double d3222, double d4410,
gradyhillhouse 0:806c1dd6946c 983 double d4422, double d5220, double d5232, double d5421, double d5433,
gradyhillhouse 0:806c1dd6946c 984 double dedt, double del1, double del2, double del3, double didt,
gradyhillhouse 0:806c1dd6946c 985 double dmdt, double dnodt, double domdt, double argpo, double argpdot,
gradyhillhouse 0:806c1dd6946c 986 double t, double tc, double gsto, double xfact, double xlamo,
gradyhillhouse 0:806c1dd6946c 987 double no,
gradyhillhouse 0:806c1dd6946c 988 double& atime, double& em, double& argpm, double& inclm, double& xli,
gradyhillhouse 0:806c1dd6946c 989 double& mm, double& xni, double& nodem, double& dndt, double& nm
gradyhillhouse 0:806c1dd6946c 990 )
gradyhillhouse 0:806c1dd6946c 991 {
gradyhillhouse 0:806c1dd6946c 992 const double twopi = 2.0 * pi;
gradyhillhouse 0:806c1dd6946c 993 int iretn, iret;
gradyhillhouse 0:806c1dd6946c 994 double delt, ft, theta, x2li, x2omi, xl, xldot , xnddt, xndt, xomi, g22, g32,
gradyhillhouse 0:806c1dd6946c 995 g44, g52, g54, fasx2, fasx4, fasx6, rptim , step2, stepn , stepp;
gradyhillhouse 0:806c1dd6946c 996
gradyhillhouse 0:806c1dd6946c 997 fasx2 = 0.13130908;
gradyhillhouse 0:806c1dd6946c 998 fasx4 = 2.8843198;
gradyhillhouse 0:806c1dd6946c 999 fasx6 = 0.37448087;
gradyhillhouse 0:806c1dd6946c 1000 g22 = 5.7686396;
gradyhillhouse 0:806c1dd6946c 1001 g32 = 0.95240898;
gradyhillhouse 0:806c1dd6946c 1002 g44 = 1.8014998;
gradyhillhouse 0:806c1dd6946c 1003 g52 = 1.0508330;
gradyhillhouse 0:806c1dd6946c 1004 g54 = 4.4108898;
gradyhillhouse 0:806c1dd6946c 1005 rptim = 4.37526908801129966e-3; // this equates to 7.29211514668855e-5 rad/sec
gradyhillhouse 0:806c1dd6946c 1006 stepp = 720.0;
gradyhillhouse 0:806c1dd6946c 1007 stepn = -720.0;
gradyhillhouse 0:806c1dd6946c 1008 step2 = 259200.0;
gradyhillhouse 0:806c1dd6946c 1009
gradyhillhouse 0:806c1dd6946c 1010 /* ----------- calculate deep space resonance effects ----------- */
gradyhillhouse 0:806c1dd6946c 1011 dndt = 0.0;
gradyhillhouse 0:806c1dd6946c 1012 theta = fmod(gsto + tc * rptim, twopi);
gradyhillhouse 0:806c1dd6946c 1013 em = em + dedt * t;
gradyhillhouse 0:806c1dd6946c 1014
gradyhillhouse 0:806c1dd6946c 1015 inclm = inclm + didt * t;
gradyhillhouse 0:806c1dd6946c 1016 argpm = argpm + domdt * t;
gradyhillhouse 0:806c1dd6946c 1017 nodem = nodem + dnodt * t;
gradyhillhouse 0:806c1dd6946c 1018 mm = mm + dmdt * t;
gradyhillhouse 0:806c1dd6946c 1019
gradyhillhouse 0:806c1dd6946c 1020 // sgp4fix for negative inclinations
gradyhillhouse 0:806c1dd6946c 1021 // the following if statement should be commented out
gradyhillhouse 0:806c1dd6946c 1022 // if (inclm < 0.0)
gradyhillhouse 0:806c1dd6946c 1023 // {
gradyhillhouse 0:806c1dd6946c 1024 // inclm = -inclm;
gradyhillhouse 0:806c1dd6946c 1025 // argpm = argpm - pi;
gradyhillhouse 0:806c1dd6946c 1026 // nodem = nodem + pi;
gradyhillhouse 0:806c1dd6946c 1027 // }
gradyhillhouse 0:806c1dd6946c 1028
gradyhillhouse 0:806c1dd6946c 1029 /* - update resonances : numerical (euler-maclaurin) integration - */
gradyhillhouse 0:806c1dd6946c 1030 /* ------------------------- epoch restart ---------------------- */
gradyhillhouse 0:806c1dd6946c 1031 // sgp4fix for propagator problems
gradyhillhouse 0:806c1dd6946c 1032 // the following integration works for negative time steps and periods
gradyhillhouse 0:806c1dd6946c 1033 // the specific changes are unknown because the original code was so convoluted
gradyhillhouse 0:806c1dd6946c 1034
gradyhillhouse 0:806c1dd6946c 1035 // sgp4fix take out atime = 0.0 and fix for faster operation
gradyhillhouse 0:806c1dd6946c 1036 ft = 0.0;
gradyhillhouse 0:806c1dd6946c 1037 if (irez != 0)
gradyhillhouse 0:806c1dd6946c 1038 {
gradyhillhouse 0:806c1dd6946c 1039 // sgp4fix streamline check
gradyhillhouse 0:806c1dd6946c 1040 if ((atime == 0.0) || (t * atime <= 0.0) || (fabs(t) < fabs(atime)) )
gradyhillhouse 0:806c1dd6946c 1041 {
gradyhillhouse 0:806c1dd6946c 1042 atime = 0.0;
gradyhillhouse 0:806c1dd6946c 1043 xni = no;
gradyhillhouse 0:806c1dd6946c 1044 xli = xlamo;
gradyhillhouse 0:806c1dd6946c 1045 }
gradyhillhouse 0:806c1dd6946c 1046 // sgp4fix move check outside loop
gradyhillhouse 0:806c1dd6946c 1047 if (t > 0.0)
gradyhillhouse 0:806c1dd6946c 1048 delt = stepp;
gradyhillhouse 0:806c1dd6946c 1049 else
gradyhillhouse 0:806c1dd6946c 1050 delt = stepn;
gradyhillhouse 0:806c1dd6946c 1051
gradyhillhouse 0:806c1dd6946c 1052 iretn = 381; // added for do loop
gradyhillhouse 0:806c1dd6946c 1053 iret = 0; // added for loop
gradyhillhouse 0:806c1dd6946c 1054 while (iretn == 381)
gradyhillhouse 0:806c1dd6946c 1055 {
gradyhillhouse 0:806c1dd6946c 1056 /* ------------------- dot terms calculated ------------- */
gradyhillhouse 0:806c1dd6946c 1057 /* ----------- near - synchronous resonance terms ------- */
gradyhillhouse 0:806c1dd6946c 1058 if (irez != 2)
gradyhillhouse 0:806c1dd6946c 1059 {
gradyhillhouse 0:806c1dd6946c 1060 xndt = del1 * sin(xli - fasx2) + del2 * sin(2.0 * (xli - fasx4)) +
gradyhillhouse 0:806c1dd6946c 1061 del3 * sin(3.0 * (xli - fasx6));
gradyhillhouse 0:806c1dd6946c 1062 xldot = xni + xfact;
gradyhillhouse 0:806c1dd6946c 1063 xnddt = del1 * cos(xli - fasx2) +
gradyhillhouse 0:806c1dd6946c 1064 2.0 * del2 * cos(2.0 * (xli - fasx4)) +
gradyhillhouse 0:806c1dd6946c 1065 3.0 * del3 * cos(3.0 * (xli - fasx6));
gradyhillhouse 0:806c1dd6946c 1066 xnddt = xnddt * xldot;
gradyhillhouse 0:806c1dd6946c 1067 }
gradyhillhouse 0:806c1dd6946c 1068 else
gradyhillhouse 0:806c1dd6946c 1069 {
gradyhillhouse 0:806c1dd6946c 1070 /* --------- near - half-day resonance terms -------- */
gradyhillhouse 0:806c1dd6946c 1071 xomi = argpo + argpdot * atime;
gradyhillhouse 0:806c1dd6946c 1072 x2omi = xomi + xomi;
gradyhillhouse 0:806c1dd6946c 1073 x2li = xli + xli;
gradyhillhouse 0:806c1dd6946c 1074 xndt = d2201 * sin(x2omi + xli - g22) + d2211 * sin(xli - g22) +
gradyhillhouse 0:806c1dd6946c 1075 d3210 * sin(xomi + xli - g32) + d3222 * sin(-xomi + xli - g32)+
gradyhillhouse 0:806c1dd6946c 1076 d4410 * sin(x2omi + x2li - g44)+ d4422 * sin(x2li - g44) +
gradyhillhouse 0:806c1dd6946c 1077 d5220 * sin(xomi + xli - g52) + d5232 * sin(-xomi + xli - g52)+
gradyhillhouse 0:806c1dd6946c 1078 d5421 * sin(xomi + x2li - g54) + d5433 * sin(-xomi + x2li - g54);
gradyhillhouse 0:806c1dd6946c 1079 xldot = xni + xfact;
gradyhillhouse 0:806c1dd6946c 1080 xnddt = d2201 * cos(x2omi + xli - g22) + d2211 * cos(xli - g22) +
gradyhillhouse 0:806c1dd6946c 1081 d3210 * cos(xomi + xli - g32) + d3222 * cos(-xomi + xli - g32) +
gradyhillhouse 0:806c1dd6946c 1082 d5220 * cos(xomi + xli - g52) + d5232 * cos(-xomi + xli - g52) +
gradyhillhouse 0:806c1dd6946c 1083 2.0 * (d4410 * cos(x2omi + x2li - g44) +
gradyhillhouse 0:806c1dd6946c 1084 d4422 * cos(x2li - g44) + d5421 * cos(xomi + x2li - g54) +
gradyhillhouse 0:806c1dd6946c 1085 d5433 * cos(-xomi + x2li - g54));
gradyhillhouse 0:806c1dd6946c 1086 xnddt = xnddt * xldot;
gradyhillhouse 0:806c1dd6946c 1087 }
gradyhillhouse 0:806c1dd6946c 1088
gradyhillhouse 0:806c1dd6946c 1089 /* ----------------------- integrator ------------------- */
gradyhillhouse 0:806c1dd6946c 1090 // sgp4fix move end checks to end of routine
gradyhillhouse 0:806c1dd6946c 1091 if (fabs(t - atime) >= stepp)
gradyhillhouse 0:806c1dd6946c 1092 {
gradyhillhouse 0:806c1dd6946c 1093 iret = 0;
gradyhillhouse 0:806c1dd6946c 1094 iretn = 381;
gradyhillhouse 0:806c1dd6946c 1095 }
gradyhillhouse 0:806c1dd6946c 1096 else // exit here
gradyhillhouse 0:806c1dd6946c 1097 {
gradyhillhouse 0:806c1dd6946c 1098 ft = t - atime;
gradyhillhouse 0:806c1dd6946c 1099 iretn = 0;
gradyhillhouse 0:806c1dd6946c 1100 }
gradyhillhouse 0:806c1dd6946c 1101
gradyhillhouse 0:806c1dd6946c 1102 if (iretn == 381)
gradyhillhouse 0:806c1dd6946c 1103 {
gradyhillhouse 0:806c1dd6946c 1104 xli = xli + xldot * delt + xndt * step2;
gradyhillhouse 0:806c1dd6946c 1105 xni = xni + xndt * delt + xnddt * step2;
gradyhillhouse 0:806c1dd6946c 1106 atime = atime + delt;
gradyhillhouse 0:806c1dd6946c 1107 }
gradyhillhouse 0:806c1dd6946c 1108 } // while iretn = 381
gradyhillhouse 0:806c1dd6946c 1109
gradyhillhouse 0:806c1dd6946c 1110 nm = xni + xndt * ft + xnddt * ft * ft * 0.5;
gradyhillhouse 0:806c1dd6946c 1111 xl = xli + xldot * ft + xndt * ft * ft * 0.5;
gradyhillhouse 0:806c1dd6946c 1112 if (irez != 1)
gradyhillhouse 0:806c1dd6946c 1113 {
gradyhillhouse 0:806c1dd6946c 1114 mm = xl - 2.0 * nodem + 2.0 * theta;
gradyhillhouse 0:806c1dd6946c 1115 dndt = nm - no;
gradyhillhouse 0:806c1dd6946c 1116 }
gradyhillhouse 0:806c1dd6946c 1117 else
gradyhillhouse 0:806c1dd6946c 1118 {
gradyhillhouse 0:806c1dd6946c 1119 mm = xl - nodem - argpm + theta;
gradyhillhouse 0:806c1dd6946c 1120 dndt = nm - no;
gradyhillhouse 0:806c1dd6946c 1121 }
gradyhillhouse 0:806c1dd6946c 1122 nm = no + dndt;
gradyhillhouse 0:806c1dd6946c 1123 }
gradyhillhouse 0:806c1dd6946c 1124
gradyhillhouse 0:806c1dd6946c 1125 //#include "debug4.cpp"
gradyhillhouse 0:806c1dd6946c 1126 } // end dsspace
gradyhillhouse 0:806c1dd6946c 1127
gradyhillhouse 0:806c1dd6946c 1128 /*-----------------------------------------------------------------------------
gradyhillhouse 0:806c1dd6946c 1129 *
gradyhillhouse 0:806c1dd6946c 1130 * procedure initl
gradyhillhouse 0:806c1dd6946c 1131 *
gradyhillhouse 0:806c1dd6946c 1132 * this procedure initializes the spg4 propagator. all the initialization is
gradyhillhouse 0:806c1dd6946c 1133 * consolidated here instead of having multiple loops inside other routines.
gradyhillhouse 0:806c1dd6946c 1134 *
gradyhillhouse 0:806c1dd6946c 1135 * author : david vallado 719-573-2600 28 jun 2005
gradyhillhouse 0:806c1dd6946c 1136 *
gradyhillhouse 0:806c1dd6946c 1137 * inputs :
gradyhillhouse 0:806c1dd6946c 1138 * ecco - eccentricity 0.0 - 1.0
gradyhillhouse 0:806c1dd6946c 1139 * epoch - epoch time in days from jan 0, 1950. 0 hr
gradyhillhouse 0:806c1dd6946c 1140 * inclo - inclination of satellite
gradyhillhouse 0:806c1dd6946c 1141 * no - mean motion of satellite
gradyhillhouse 0:806c1dd6946c 1142 * satn - satellite number
gradyhillhouse 0:806c1dd6946c 1143 *
gradyhillhouse 0:806c1dd6946c 1144 * outputs :
gradyhillhouse 0:806c1dd6946c 1145 * ainv - 1.0 / a
gradyhillhouse 0:806c1dd6946c 1146 * ao - semi major axis
gradyhillhouse 0:806c1dd6946c 1147 * con41 -
gradyhillhouse 0:806c1dd6946c 1148 * con42 - 1.0 - 5.0 cos(i)
gradyhillhouse 0:806c1dd6946c 1149 * cosio - cosine of inclination
gradyhillhouse 0:806c1dd6946c 1150 * cosio2 - cosio squared
gradyhillhouse 0:806c1dd6946c 1151 * eccsq - eccentricity squared
gradyhillhouse 0:806c1dd6946c 1152 * method - flag for deep space 'd', 'n'
gradyhillhouse 0:806c1dd6946c 1153 * omeosq - 1.0 - ecco * ecco
gradyhillhouse 0:806c1dd6946c 1154 * posq - semi-parameter squared
gradyhillhouse 0:806c1dd6946c 1155 * rp - radius of perigee
gradyhillhouse 0:806c1dd6946c 1156 * rteosq - square root of (1.0 - ecco*ecco)
gradyhillhouse 0:806c1dd6946c 1157 * sinio - sine of inclination
gradyhillhouse 0:806c1dd6946c 1158 * gsto - gst at time of observation rad
gradyhillhouse 0:806c1dd6946c 1159 * no - mean motion of satellite
gradyhillhouse 0:806c1dd6946c 1160 *
gradyhillhouse 0:806c1dd6946c 1161 * locals :
gradyhillhouse 0:806c1dd6946c 1162 * ak -
gradyhillhouse 0:806c1dd6946c 1163 * d1 -
gradyhillhouse 0:806c1dd6946c 1164 * del -
gradyhillhouse 0:806c1dd6946c 1165 * adel -
gradyhillhouse 0:806c1dd6946c 1166 * po -
gradyhillhouse 0:806c1dd6946c 1167 *
gradyhillhouse 0:806c1dd6946c 1168 * coupling :
gradyhillhouse 0:806c1dd6946c 1169 * getgravconst
gradyhillhouse 0:806c1dd6946c 1170 * gstime - find greenwich sidereal time from the julian date
gradyhillhouse 0:806c1dd6946c 1171 *
gradyhillhouse 0:806c1dd6946c 1172 * references :
gradyhillhouse 0:806c1dd6946c 1173 * hoots, roehrich, norad spacetrack report #3 1980
gradyhillhouse 0:806c1dd6946c 1174 * hoots, norad spacetrack report #6 1986
gradyhillhouse 0:806c1dd6946c 1175 * hoots, schumacher and glover 2004
gradyhillhouse 0:806c1dd6946c 1176 * vallado, crawford, hujsak, kelso 2006
gradyhillhouse 0:806c1dd6946c 1177 ----------------------------------------------------------------------------*/
gradyhillhouse 0:806c1dd6946c 1178
gradyhillhouse 0:806c1dd6946c 1179 static void initl
gradyhillhouse 0:806c1dd6946c 1180 (
gradyhillhouse 0:806c1dd6946c 1181 int satn, gravconsttype whichconst,
gradyhillhouse 0:806c1dd6946c 1182 double ecco, double epoch, double inclo, double& no,
gradyhillhouse 0:806c1dd6946c 1183 char& method,
gradyhillhouse 0:806c1dd6946c 1184 double& ainv, double& ao, double& con41, double& con42, double& cosio,
gradyhillhouse 0:806c1dd6946c 1185 double& cosio2,double& eccsq, double& omeosq, double& posq,
gradyhillhouse 0:806c1dd6946c 1186 double& rp, double& rteosq,double& sinio , double& gsto,
gradyhillhouse 0:806c1dd6946c 1187 char opsmode
gradyhillhouse 0:806c1dd6946c 1188 )
gradyhillhouse 0:806c1dd6946c 1189 {
gradyhillhouse 0:806c1dd6946c 1190 /* --------------------- local variables ------------------------ */
gradyhillhouse 0:806c1dd6946c 1191 double ak, d1, del, adel, po, x2o3, j2, xke,
gradyhillhouse 0:806c1dd6946c 1192 tumin, mu, radiusearthkm, j3, j4, j3oj2;
gradyhillhouse 0:806c1dd6946c 1193
gradyhillhouse 0:806c1dd6946c 1194 // sgp4fix use old way of finding gst
gradyhillhouse 0:806c1dd6946c 1195 double ds70;
gradyhillhouse 0:806c1dd6946c 1196 double ts70, tfrac, c1, thgr70, fk5r, c1p2p;
gradyhillhouse 0:806c1dd6946c 1197 const double twopi = 2.0 * pi;
gradyhillhouse 0:806c1dd6946c 1198
gradyhillhouse 0:806c1dd6946c 1199 /* ----------------------- earth constants ---------------------- */
gradyhillhouse 0:806c1dd6946c 1200 // sgp4fix identify constants and allow alternate values
gradyhillhouse 0:806c1dd6946c 1201 getgravconst( whichconst, tumin, mu, radiusearthkm, xke, j2, j3, j4, j3oj2 );
gradyhillhouse 0:806c1dd6946c 1202 x2o3 = 2.0 / 3.0;
gradyhillhouse 0:806c1dd6946c 1203
gradyhillhouse 0:806c1dd6946c 1204 /* ------------- calculate auxillary epoch quantities ---------- */
gradyhillhouse 0:806c1dd6946c 1205 eccsq = ecco * ecco;
gradyhillhouse 0:806c1dd6946c 1206 omeosq = 1.0 - eccsq;
gradyhillhouse 0:806c1dd6946c 1207 rteosq = sqrt(omeosq);
gradyhillhouse 0:806c1dd6946c 1208 cosio = cos(inclo);
gradyhillhouse 0:806c1dd6946c 1209 cosio2 = cosio * cosio;
gradyhillhouse 0:806c1dd6946c 1210
gradyhillhouse 0:806c1dd6946c 1211 /* ------------------ un-kozai the mean motion ----------------- */
gradyhillhouse 0:806c1dd6946c 1212 ak = pow(xke / no, x2o3);
gradyhillhouse 0:806c1dd6946c 1213 d1 = 0.75 * j2 * (3.0 * cosio2 - 1.0) / (rteosq * omeosq);
gradyhillhouse 0:806c1dd6946c 1214 del = d1 / (ak * ak);
gradyhillhouse 0:806c1dd6946c 1215 adel = ak * (1.0 - del * del - del *
gradyhillhouse 0:806c1dd6946c 1216 (1.0 / 3.0 + 134.0 * del * del / 81.0));
gradyhillhouse 0:806c1dd6946c 1217 del = d1/(adel * adel);
gradyhillhouse 0:806c1dd6946c 1218 no = no / (1.0 + del);
gradyhillhouse 0:806c1dd6946c 1219
gradyhillhouse 0:806c1dd6946c 1220 ao = pow(xke / no, x2o3);
gradyhillhouse 0:806c1dd6946c 1221 sinio = sin(inclo);
gradyhillhouse 0:806c1dd6946c 1222 po = ao * omeosq;
gradyhillhouse 0:806c1dd6946c 1223 con42 = 1.0 - 5.0 * cosio2;
gradyhillhouse 0:806c1dd6946c 1224 con41 = -con42-cosio2-cosio2;
gradyhillhouse 0:806c1dd6946c 1225 ainv = 1.0 / ao;
gradyhillhouse 0:806c1dd6946c 1226 posq = po * po;
gradyhillhouse 0:806c1dd6946c 1227 rp = ao * (1.0 - ecco);
gradyhillhouse 0:806c1dd6946c 1228 method = 'n';
gradyhillhouse 0:806c1dd6946c 1229
gradyhillhouse 0:806c1dd6946c 1230 // sgp4fix modern approach to finding sidereal time
gradyhillhouse 0:806c1dd6946c 1231 if (opsmode == 'a')
gradyhillhouse 0:806c1dd6946c 1232 {
gradyhillhouse 0:806c1dd6946c 1233 // sgp4fix use old way of finding gst
gradyhillhouse 0:806c1dd6946c 1234 // count integer number of days from 0 jan 1970
gradyhillhouse 0:806c1dd6946c 1235 ts70 = epoch - 7305.0;
gradyhillhouse 0:806c1dd6946c 1236 ds70 = floor(ts70 + 1.0e-8);
gradyhillhouse 0:806c1dd6946c 1237 tfrac = ts70 - ds70;
gradyhillhouse 0:806c1dd6946c 1238 // find greenwich location at epoch
gradyhillhouse 0:806c1dd6946c 1239 c1 = 1.72027916940703639e-2;
gradyhillhouse 0:806c1dd6946c 1240 thgr70= 1.7321343856509374;
gradyhillhouse 0:806c1dd6946c 1241 fk5r = 5.07551419432269442e-15;
gradyhillhouse 0:806c1dd6946c 1242 c1p2p = c1 + twopi;
gradyhillhouse 0:806c1dd6946c 1243 gsto = fmod( thgr70 + c1*ds70 + c1p2p*tfrac + ts70*ts70*fk5r, twopi);
gradyhillhouse 0:806c1dd6946c 1244 if ( gsto < 0.0 )
gradyhillhouse 0:806c1dd6946c 1245 gsto = gsto + twopi;
gradyhillhouse 0:806c1dd6946c 1246 }
gradyhillhouse 0:806c1dd6946c 1247 else
gradyhillhouse 0:806c1dd6946c 1248 gsto = gstime(epoch + 2433281.5);
gradyhillhouse 0:806c1dd6946c 1249
gradyhillhouse 0:806c1dd6946c 1250
gradyhillhouse 0:806c1dd6946c 1251 //#include "debug5.cpp"
gradyhillhouse 0:806c1dd6946c 1252 } // end initl
gradyhillhouse 0:806c1dd6946c 1253
gradyhillhouse 0:806c1dd6946c 1254 /*-----------------------------------------------------------------------------
gradyhillhouse 0:806c1dd6946c 1255 *
gradyhillhouse 0:806c1dd6946c 1256 * procedure sgp4init
gradyhillhouse 0:806c1dd6946c 1257 *
gradyhillhouse 0:806c1dd6946c 1258 * this procedure initializes variables for sgp4.
gradyhillhouse 0:806c1dd6946c 1259 *
gradyhillhouse 0:806c1dd6946c 1260 * author : david vallado 719-573-2600 28 jun 2005
gradyhillhouse 0:806c1dd6946c 1261 *
gradyhillhouse 0:806c1dd6946c 1262 * inputs :
gradyhillhouse 0:806c1dd6946c 1263 * opsmode - mode of operation afspc or improved 'a', 'i'
gradyhillhouse 0:806c1dd6946c 1264 * whichconst - which set of constants to use 72, 84
gradyhillhouse 0:806c1dd6946c 1265 * satn - satellite number
gradyhillhouse 0:806c1dd6946c 1266 * bstar - sgp4 type drag coefficient kg/m2er
gradyhillhouse 0:806c1dd6946c 1267 * ecco - eccentricity
gradyhillhouse 0:806c1dd6946c 1268 * epoch - epoch time in days from jan 0, 1950. 0 hr
gradyhillhouse 0:806c1dd6946c 1269 * argpo - argument of perigee (output if ds)
gradyhillhouse 0:806c1dd6946c 1270 * inclo - inclination
gradyhillhouse 0:806c1dd6946c 1271 * mo - mean anomaly (output if ds)
gradyhillhouse 0:806c1dd6946c 1272 * no - mean motion
gradyhillhouse 0:806c1dd6946c 1273 * nodeo - right ascension of ascending node
gradyhillhouse 0:806c1dd6946c 1274 *
gradyhillhouse 0:806c1dd6946c 1275 * outputs :
gradyhillhouse 0:806c1dd6946c 1276 * satrec - common values for subsequent calls
gradyhillhouse 0:806c1dd6946c 1277 * return code - non-zero on error.
gradyhillhouse 0:806c1dd6946c 1278 * 1 - mean elements, ecc >= 1.0 or ecc < -0.001 or a < 0.95 er
gradyhillhouse 0:806c1dd6946c 1279 * 2 - mean motion less than 0.0
gradyhillhouse 0:806c1dd6946c 1280 * 3 - pert elements, ecc < 0.0 or ecc > 1.0
gradyhillhouse 0:806c1dd6946c 1281 * 4 - semi-latus rectum < 0.0
gradyhillhouse 0:806c1dd6946c 1282 * 5 - epoch elements are sub-orbital
gradyhillhouse 0:806c1dd6946c 1283 * 6 - satellite has decayed
gradyhillhouse 0:806c1dd6946c 1284 *
gradyhillhouse 0:806c1dd6946c 1285 * locals :
gradyhillhouse 0:806c1dd6946c 1286 * cnodm , snodm , cosim , sinim , cosomm , sinomm
gradyhillhouse 0:806c1dd6946c 1287 * cc1sq , cc2 , cc3
gradyhillhouse 0:806c1dd6946c 1288 * coef , coef1
gradyhillhouse 0:806c1dd6946c 1289 * cosio4 -
gradyhillhouse 0:806c1dd6946c 1290 * day -
gradyhillhouse 0:806c1dd6946c 1291 * dndt -
gradyhillhouse 0:806c1dd6946c 1292 * em - eccentricity
gradyhillhouse 0:806c1dd6946c 1293 * emsq - eccentricity squared
gradyhillhouse 0:806c1dd6946c 1294 * eeta -
gradyhillhouse 0:806c1dd6946c 1295 * etasq -
gradyhillhouse 0:806c1dd6946c 1296 * gam -
gradyhillhouse 0:806c1dd6946c 1297 * argpm - argument of perigee
gradyhillhouse 0:806c1dd6946c 1298 * nodem -
gradyhillhouse 0:806c1dd6946c 1299 * inclm - inclination
gradyhillhouse 0:806c1dd6946c 1300 * mm - mean anomaly
gradyhillhouse 0:806c1dd6946c 1301 * nm - mean motion
gradyhillhouse 0:806c1dd6946c 1302 * perige - perigee
gradyhillhouse 0:806c1dd6946c 1303 * pinvsq -
gradyhillhouse 0:806c1dd6946c 1304 * psisq -
gradyhillhouse 0:806c1dd6946c 1305 * qzms24 -
gradyhillhouse 0:806c1dd6946c 1306 * rtemsq -
gradyhillhouse 0:806c1dd6946c 1307 * s1, s2, s3, s4, s5, s6, s7 -
gradyhillhouse 0:806c1dd6946c 1308 * sfour -
gradyhillhouse 0:806c1dd6946c 1309 * ss1, ss2, ss3, ss4, ss5, ss6, ss7 -
gradyhillhouse 0:806c1dd6946c 1310 * sz1, sz2, sz3
gradyhillhouse 0:806c1dd6946c 1311 * sz11, sz12, sz13, sz21, sz22, sz23, sz31, sz32, sz33 -
gradyhillhouse 0:806c1dd6946c 1312 * tc -
gradyhillhouse 0:806c1dd6946c 1313 * temp -
gradyhillhouse 0:806c1dd6946c 1314 * temp1, temp2, temp3 -
gradyhillhouse 0:806c1dd6946c 1315 * tsi -
gradyhillhouse 0:806c1dd6946c 1316 * xpidot -
gradyhillhouse 0:806c1dd6946c 1317 * xhdot1 -
gradyhillhouse 0:806c1dd6946c 1318 * z1, z2, z3 -
gradyhillhouse 0:806c1dd6946c 1319 * z11, z12, z13, z21, z22, z23, z31, z32, z33 -
gradyhillhouse 0:806c1dd6946c 1320 *
gradyhillhouse 0:806c1dd6946c 1321 * coupling :
gradyhillhouse 0:806c1dd6946c 1322 * getgravconst-
gradyhillhouse 0:806c1dd6946c 1323 * initl -
gradyhillhouse 0:806c1dd6946c 1324 * dscom -
gradyhillhouse 0:806c1dd6946c 1325 * dpper -
gradyhillhouse 0:806c1dd6946c 1326 * dsinit -
gradyhillhouse 0:806c1dd6946c 1327 * sgp4 -
gradyhillhouse 0:806c1dd6946c 1328 *
gradyhillhouse 0:806c1dd6946c 1329 * references :
gradyhillhouse 0:806c1dd6946c 1330 * hoots, roehrich, norad spacetrack report #3 1980
gradyhillhouse 0:806c1dd6946c 1331 * hoots, norad spacetrack report #6 1986
gradyhillhouse 0:806c1dd6946c 1332 * hoots, schumacher and glover 2004
gradyhillhouse 0:806c1dd6946c 1333 * vallado, crawford, hujsak, kelso 2006
gradyhillhouse 0:806c1dd6946c 1334 ----------------------------------------------------------------------------*/
gradyhillhouse 0:806c1dd6946c 1335
gradyhillhouse 0:806c1dd6946c 1336 bool sgp4init
gradyhillhouse 0:806c1dd6946c 1337 (
gradyhillhouse 0:806c1dd6946c 1338 gravconsttype whichconst, char opsmode, const int satn, const double epoch,
gradyhillhouse 0:806c1dd6946c 1339 const double xbstar, const double xecco, const double xargpo,
gradyhillhouse 0:806c1dd6946c 1340 const double xinclo, const double xmo, const double xno,
gradyhillhouse 0:806c1dd6946c 1341 const double xnodeo, elsetrec& satrec
gradyhillhouse 0:806c1dd6946c 1342 )
gradyhillhouse 0:806c1dd6946c 1343 {
gradyhillhouse 0:806c1dd6946c 1344 /* --------------------- local variables ------------------------ */
gradyhillhouse 0:806c1dd6946c 1345 double ao, ainv, con42, cosio, sinio, cosio2, eccsq,
gradyhillhouse 0:806c1dd6946c 1346 omeosq, posq, rp, rteosq,
gradyhillhouse 0:806c1dd6946c 1347 cnodm , snodm , cosim , sinim , cosomm, sinomm, cc1sq ,
gradyhillhouse 0:806c1dd6946c 1348 cc2 , cc3 , coef , coef1 , cosio4, day , dndt ,
gradyhillhouse 0:806c1dd6946c 1349 em , emsq , eeta , etasq , gam , argpm , nodem ,
gradyhillhouse 0:806c1dd6946c 1350 inclm , mm , nm , perige, pinvsq, psisq , qzms24,
gradyhillhouse 0:806c1dd6946c 1351 rtemsq, s1 , s2 , s3 , s4 , s5 , s6 ,
gradyhillhouse 0:806c1dd6946c 1352 s7 , sfour , ss1 , ss2 , ss3 , ss4 , ss5 ,
gradyhillhouse 0:806c1dd6946c 1353 ss6 , ss7 , sz1 , sz2 , sz3 , sz11 , sz12 ,
gradyhillhouse 0:806c1dd6946c 1354 sz13 , sz21 , sz22 , sz23 , sz31 , sz32 , sz33 ,
gradyhillhouse 0:806c1dd6946c 1355 tc , temp , temp1 , temp2 , temp3 , tsi , xpidot,
gradyhillhouse 0:806c1dd6946c 1356 xhdot1, z1 , z2 , z3 , z11 , z12 , z13 ,
gradyhillhouse 0:806c1dd6946c 1357 z21 , z22 , z23 , z31 , z32 , z33,
gradyhillhouse 0:806c1dd6946c 1358 qzms2t, ss, j2, j3oj2, j4, x2o3, r[3], v[3],
gradyhillhouse 0:806c1dd6946c 1359 tumin, mu, radiusearthkm, xke, j3, delmotemp, qzms2ttemp, qzms24temp;
gradyhillhouse 0:806c1dd6946c 1360
gradyhillhouse 0:806c1dd6946c 1361 /* ------------------------ initialization --------------------- */
gradyhillhouse 0:806c1dd6946c 1362 // sgp4fix divisor for divide by zero check on inclination
gradyhillhouse 0:806c1dd6946c 1363 // the old check used 1.0 + cos(pi-1.0e-9), but then compared it to
gradyhillhouse 0:806c1dd6946c 1364 // 1.5 e-12, so the threshold was changed to 1.5e-12 for consistency
gradyhillhouse 0:806c1dd6946c 1365 const double temp4 = 1.5e-12;
gradyhillhouse 0:806c1dd6946c 1366
gradyhillhouse 0:806c1dd6946c 1367 /* ----------- set all near earth variables to zero ------------ */
gradyhillhouse 0:806c1dd6946c 1368 satrec.isimp = 0; satrec.method = 'n'; satrec.aycof = 0.0;
gradyhillhouse 0:806c1dd6946c 1369 satrec.con41 = 0.0; satrec.cc1 = 0.0; satrec.cc4 = 0.0;
gradyhillhouse 0:806c1dd6946c 1370 satrec.cc5 = 0.0; satrec.d2 = 0.0; satrec.d3 = 0.0;
gradyhillhouse 0:806c1dd6946c 1371 satrec.d4 = 0.0; satrec.delmo = 0.0; satrec.eta = 0.0;
gradyhillhouse 0:806c1dd6946c 1372 satrec.argpdot = 0.0; satrec.omgcof = 0.0; satrec.sinmao = 0.0;
gradyhillhouse 0:806c1dd6946c 1373 satrec.t = 0.0; satrec.t2cof = 0.0; satrec.t3cof = 0.0;
gradyhillhouse 0:806c1dd6946c 1374 satrec.t4cof = 0.0; satrec.t5cof = 0.0; satrec.x1mth2 = 0.0;
gradyhillhouse 0:806c1dd6946c 1375 satrec.x7thm1 = 0.0; satrec.mdot = 0.0; satrec.nodedot = 0.0;
gradyhillhouse 0:806c1dd6946c 1376 satrec.xlcof = 0.0; satrec.xmcof = 0.0; satrec.nodecf = 0.0;
gradyhillhouse 0:806c1dd6946c 1377
gradyhillhouse 0:806c1dd6946c 1378 /* ----------- set all deep space variables to zero ------------ */
gradyhillhouse 0:806c1dd6946c 1379 satrec.irez = 0; satrec.d2201 = 0.0; satrec.d2211 = 0.0;
gradyhillhouse 0:806c1dd6946c 1380 satrec.d3210 = 0.0; satrec.d3222 = 0.0; satrec.d4410 = 0.0;
gradyhillhouse 0:806c1dd6946c 1381 satrec.d4422 = 0.0; satrec.d5220 = 0.0; satrec.d5232 = 0.0;
gradyhillhouse 0:806c1dd6946c 1382 satrec.d5421 = 0.0; satrec.d5433 = 0.0; satrec.dedt = 0.0;
gradyhillhouse 0:806c1dd6946c 1383 satrec.del1 = 0.0; satrec.del2 = 0.0; satrec.del3 = 0.0;
gradyhillhouse 0:806c1dd6946c 1384 satrec.didt = 0.0; satrec.dmdt = 0.0; satrec.dnodt = 0.0;
gradyhillhouse 0:806c1dd6946c 1385 satrec.domdt = 0.0; satrec.e3 = 0.0; satrec.ee2 = 0.0;
gradyhillhouse 0:806c1dd6946c 1386 satrec.peo = 0.0; satrec.pgho = 0.0; satrec.pho = 0.0;
gradyhillhouse 0:806c1dd6946c 1387 satrec.pinco = 0.0; satrec.plo = 0.0; satrec.se2 = 0.0;
gradyhillhouse 0:806c1dd6946c 1388 satrec.se3 = 0.0; satrec.sgh2 = 0.0; satrec.sgh3 = 0.0;
gradyhillhouse 0:806c1dd6946c 1389 satrec.sgh4 = 0.0; satrec.sh2 = 0.0; satrec.sh3 = 0.0;
gradyhillhouse 0:806c1dd6946c 1390 satrec.si2 = 0.0; satrec.si3 = 0.0; satrec.sl2 = 0.0;
gradyhillhouse 0:806c1dd6946c 1391 satrec.sl3 = 0.0; satrec.sl4 = 0.0; satrec.gsto = 0.0;
gradyhillhouse 0:806c1dd6946c 1392 satrec.xfact = 0.0; satrec.xgh2 = 0.0; satrec.xgh3 = 0.0;
gradyhillhouse 0:806c1dd6946c 1393 satrec.xgh4 = 0.0; satrec.xh2 = 0.0; satrec.xh3 = 0.0;
gradyhillhouse 0:806c1dd6946c 1394 satrec.xi2 = 0.0; satrec.xi3 = 0.0; satrec.xl2 = 0.0;
gradyhillhouse 0:806c1dd6946c 1395 satrec.xl3 = 0.0; satrec.xl4 = 0.0; satrec.xlamo = 0.0;
gradyhillhouse 0:806c1dd6946c 1396 satrec.zmol = 0.0; satrec.zmos = 0.0; satrec.atime = 0.0;
gradyhillhouse 0:806c1dd6946c 1397 satrec.xli = 0.0; satrec.xni = 0.0;
gradyhillhouse 0:806c1dd6946c 1398
gradyhillhouse 0:806c1dd6946c 1399 // sgp4fix - note the following variables are also passed directly via satrec.
gradyhillhouse 0:806c1dd6946c 1400 // it is possible to streamline the sgp4init call by deleting the "x"
gradyhillhouse 0:806c1dd6946c 1401 // variables, but the user would need to set the satrec.* values first. we
gradyhillhouse 0:806c1dd6946c 1402 // include the additional assignments in case twoline2rv is not used.
gradyhillhouse 0:806c1dd6946c 1403 satrec.bstar = xbstar;
gradyhillhouse 0:806c1dd6946c 1404 satrec.ecco = xecco;
gradyhillhouse 0:806c1dd6946c 1405 satrec.argpo = xargpo;
gradyhillhouse 0:806c1dd6946c 1406 satrec.inclo = xinclo;
gradyhillhouse 0:806c1dd6946c 1407 satrec.mo = xmo;
gradyhillhouse 0:806c1dd6946c 1408 satrec.no = xno;
gradyhillhouse 0:806c1dd6946c 1409 satrec.nodeo = xnodeo;
gradyhillhouse 0:806c1dd6946c 1410
gradyhillhouse 0:806c1dd6946c 1411 // sgp4fix add opsmode
gradyhillhouse 0:806c1dd6946c 1412 satrec.operationmode = opsmode;
gradyhillhouse 0:806c1dd6946c 1413
gradyhillhouse 0:806c1dd6946c 1414 /* ------------------------ earth constants ----------------------- */
gradyhillhouse 0:806c1dd6946c 1415 // sgp4fix identify constants and allow alternate values
gradyhillhouse 0:806c1dd6946c 1416 getgravconst( whichconst, tumin, mu, radiusearthkm, xke, j2, j3, j4, j3oj2 );
gradyhillhouse 0:806c1dd6946c 1417 ss = 78.0 / radiusearthkm + 1.0;
gradyhillhouse 0:806c1dd6946c 1418 // sgp4fix use multiply for speed instead of pow
gradyhillhouse 0:806c1dd6946c 1419 qzms2ttemp = (120.0 - 78.0) / radiusearthkm;
gradyhillhouse 0:806c1dd6946c 1420 qzms2t = qzms2ttemp * qzms2ttemp * qzms2ttemp * qzms2ttemp;
gradyhillhouse 0:806c1dd6946c 1421 x2o3 = 2.0 / 3.0;
gradyhillhouse 0:806c1dd6946c 1422
gradyhillhouse 0:806c1dd6946c 1423 satrec.init = 'y';
gradyhillhouse 0:806c1dd6946c 1424 satrec.t = 0.0;
gradyhillhouse 0:806c1dd6946c 1425
gradyhillhouse 0:806c1dd6946c 1426 initl
gradyhillhouse 0:806c1dd6946c 1427 (
gradyhillhouse 0:806c1dd6946c 1428 satn, whichconst, satrec.ecco, epoch, satrec.inclo, satrec.no, satrec.method,
gradyhillhouse 0:806c1dd6946c 1429 ainv, ao, satrec.con41, con42, cosio, cosio2, eccsq, omeosq,
gradyhillhouse 0:806c1dd6946c 1430 posq, rp, rteosq, sinio, satrec.gsto, satrec.operationmode
gradyhillhouse 0:806c1dd6946c 1431 );
gradyhillhouse 0:806c1dd6946c 1432 satrec.error = 0;
gradyhillhouse 0:806c1dd6946c 1433
gradyhillhouse 0:806c1dd6946c 1434 // sgp4fix remove this check as it is unnecessary
gradyhillhouse 0:806c1dd6946c 1435 // the mrt check in sgp4 handles decaying satellite cases even if the starting
gradyhillhouse 0:806c1dd6946c 1436 // condition is below the surface of te earth
gradyhillhouse 0:806c1dd6946c 1437 // if (rp < 1.0)
gradyhillhouse 0:806c1dd6946c 1438 // {
gradyhillhouse 0:806c1dd6946c 1439 // printf("# *** satn%d epoch elts sub-orbital ***\n", satn);
gradyhillhouse 0:806c1dd6946c 1440 // satrec.error = 5;
gradyhillhouse 0:806c1dd6946c 1441 // }
gradyhillhouse 0:806c1dd6946c 1442
gradyhillhouse 0:806c1dd6946c 1443 if ((omeosq >= 0.0 ) || ( satrec.no >= 0.0))
gradyhillhouse 0:806c1dd6946c 1444 {
gradyhillhouse 0:806c1dd6946c 1445 satrec.isimp = 0;
gradyhillhouse 0:806c1dd6946c 1446 if (rp < (220.0 / radiusearthkm + 1.0))
gradyhillhouse 0:806c1dd6946c 1447 satrec.isimp = 1;
gradyhillhouse 0:806c1dd6946c 1448 sfour = ss;
gradyhillhouse 0:806c1dd6946c 1449 qzms24 = qzms2t;
gradyhillhouse 0:806c1dd6946c 1450 perige = (rp - 1.0) * radiusearthkm;
gradyhillhouse 0:806c1dd6946c 1451
gradyhillhouse 0:806c1dd6946c 1452 /* - for perigees below 156 km, s and qoms2t are altered - */
gradyhillhouse 0:806c1dd6946c 1453 if (perige < 156.0)
gradyhillhouse 0:806c1dd6946c 1454 {
gradyhillhouse 0:806c1dd6946c 1455 sfour = perige - 78.0;
gradyhillhouse 0:806c1dd6946c 1456 if (perige < 98.0)
gradyhillhouse 0:806c1dd6946c 1457 sfour = 20.0;
gradyhillhouse 0:806c1dd6946c 1458 // sgp4fix use multiply for speed instead of pow
gradyhillhouse 0:806c1dd6946c 1459 qzms24temp = (120.0 - sfour) / radiusearthkm;
gradyhillhouse 0:806c1dd6946c 1460 qzms24 = qzms24temp * qzms24temp * qzms24temp * qzms24temp;
gradyhillhouse 0:806c1dd6946c 1461 sfour = sfour / radiusearthkm + 1.0;
gradyhillhouse 0:806c1dd6946c 1462 }
gradyhillhouse 0:806c1dd6946c 1463 pinvsq = 1.0 / posq;
gradyhillhouse 0:806c1dd6946c 1464
gradyhillhouse 0:806c1dd6946c 1465 tsi = 1.0 / (ao - sfour);
gradyhillhouse 0:806c1dd6946c 1466 satrec.eta = ao * satrec.ecco * tsi;
gradyhillhouse 0:806c1dd6946c 1467 etasq = satrec.eta * satrec.eta;
gradyhillhouse 0:806c1dd6946c 1468 eeta = satrec.ecco * satrec.eta;
gradyhillhouse 0:806c1dd6946c 1469 psisq = fabs(1.0 - etasq);
gradyhillhouse 0:806c1dd6946c 1470 coef = qzms24 * pow(tsi, 4.0);
gradyhillhouse 0:806c1dd6946c 1471 coef1 = coef / pow(psisq, 3.5);
gradyhillhouse 0:806c1dd6946c 1472 cc2 = coef1 * satrec.no * (ao * (1.0 + 1.5 * etasq + eeta *
gradyhillhouse 0:806c1dd6946c 1473 (4.0 + etasq)) + 0.375 * j2 * tsi / psisq * satrec.con41 *
gradyhillhouse 0:806c1dd6946c 1474 (8.0 + 3.0 * etasq * (8.0 + etasq)));
gradyhillhouse 0:806c1dd6946c 1475 satrec.cc1 = satrec.bstar * cc2;
gradyhillhouse 0:806c1dd6946c 1476 cc3 = 0.0;
gradyhillhouse 0:806c1dd6946c 1477 if (satrec.ecco > 1.0e-4)
gradyhillhouse 0:806c1dd6946c 1478 cc3 = -2.0 * coef * tsi * j3oj2 * satrec.no * sinio / satrec.ecco;
gradyhillhouse 0:806c1dd6946c 1479 satrec.x1mth2 = 1.0 - cosio2;
gradyhillhouse 0:806c1dd6946c 1480 satrec.cc4 = 2.0* satrec.no * coef1 * ao * omeosq *
gradyhillhouse 0:806c1dd6946c 1481 (satrec.eta * (2.0 + 0.5 * etasq) + satrec.ecco *
gradyhillhouse 0:806c1dd6946c 1482 (0.5 + 2.0 * etasq) - j2 * tsi / (ao * psisq) *
gradyhillhouse 0:806c1dd6946c 1483 (-3.0 * satrec.con41 * (1.0 - 2.0 * eeta + etasq *
gradyhillhouse 0:806c1dd6946c 1484 (1.5 - 0.5 * eeta)) + 0.75 * satrec.x1mth2 *
gradyhillhouse 0:806c1dd6946c 1485 (2.0 * etasq - eeta * (1.0 + etasq)) * cos(2.0 * satrec.argpo)));
gradyhillhouse 0:806c1dd6946c 1486 satrec.cc5 = 2.0 * coef1 * ao * omeosq * (1.0 + 2.75 *
gradyhillhouse 0:806c1dd6946c 1487 (etasq + eeta) + eeta * etasq);
gradyhillhouse 0:806c1dd6946c 1488 cosio4 = cosio2 * cosio2;
gradyhillhouse 0:806c1dd6946c 1489 temp1 = 1.5 * j2 * pinvsq * satrec.no;
gradyhillhouse 0:806c1dd6946c 1490 temp2 = 0.5 * temp1 * j2 * pinvsq;
gradyhillhouse 0:806c1dd6946c 1491 temp3 = -0.46875 * j4 * pinvsq * pinvsq * satrec.no;
gradyhillhouse 0:806c1dd6946c 1492 satrec.mdot = satrec.no + 0.5 * temp1 * rteosq * satrec.con41 + 0.0625 *
gradyhillhouse 0:806c1dd6946c 1493 temp2 * rteosq * (13.0 - 78.0 * cosio2 + 137.0 * cosio4);
gradyhillhouse 0:806c1dd6946c 1494 satrec.argpdot = -0.5 * temp1 * con42 + 0.0625 * temp2 *
gradyhillhouse 0:806c1dd6946c 1495 (7.0 - 114.0 * cosio2 + 395.0 * cosio4) +
gradyhillhouse 0:806c1dd6946c 1496 temp3 * (3.0 - 36.0 * cosio2 + 49.0 * cosio4);
gradyhillhouse 0:806c1dd6946c 1497 xhdot1 = -temp1 * cosio;
gradyhillhouse 0:806c1dd6946c 1498 satrec.nodedot = xhdot1 + (0.5 * temp2 * (4.0 - 19.0 * cosio2) +
gradyhillhouse 0:806c1dd6946c 1499 2.0 * temp3 * (3.0 - 7.0 * cosio2)) * cosio;
gradyhillhouse 0:806c1dd6946c 1500 xpidot = satrec.argpdot+ satrec.nodedot;
gradyhillhouse 0:806c1dd6946c 1501 satrec.omgcof = satrec.bstar * cc3 * cos(satrec.argpo);
gradyhillhouse 0:806c1dd6946c 1502 satrec.xmcof = 0.0;
gradyhillhouse 0:806c1dd6946c 1503 if (satrec.ecco > 1.0e-4)
gradyhillhouse 0:806c1dd6946c 1504 satrec.xmcof = -x2o3 * coef * satrec.bstar / eeta;
gradyhillhouse 0:806c1dd6946c 1505 satrec.nodecf = 3.5 * omeosq * xhdot1 * satrec.cc1;
gradyhillhouse 0:806c1dd6946c 1506 satrec.t2cof = 1.5 * satrec.cc1;
gradyhillhouse 0:806c1dd6946c 1507 // sgp4fix for divide by zero with xinco = 180 deg
gradyhillhouse 0:806c1dd6946c 1508 if (fabs(cosio+1.0) > 1.5e-12)
gradyhillhouse 0:806c1dd6946c 1509 satrec.xlcof = -0.25 * j3oj2 * sinio * (3.0 + 5.0 * cosio) / (1.0 + cosio);
gradyhillhouse 0:806c1dd6946c 1510 else
gradyhillhouse 0:806c1dd6946c 1511 satrec.xlcof = -0.25 * j3oj2 * sinio * (3.0 + 5.0 * cosio) / temp4;
gradyhillhouse 0:806c1dd6946c 1512 satrec.aycof = -0.5 * j3oj2 * sinio;
gradyhillhouse 0:806c1dd6946c 1513 // sgp4fix use multiply for speed instead of pow
gradyhillhouse 0:806c1dd6946c 1514 delmotemp = 1.0 + satrec.eta * cos(satrec.mo);
gradyhillhouse 0:806c1dd6946c 1515 satrec.delmo = delmotemp * delmotemp * delmotemp;
gradyhillhouse 0:806c1dd6946c 1516 satrec.sinmao = sin(satrec.mo);
gradyhillhouse 0:806c1dd6946c 1517 satrec.x7thm1 = 7.0 * cosio2 - 1.0;
gradyhillhouse 0:806c1dd6946c 1518
gradyhillhouse 0:806c1dd6946c 1519 /* --------------- deep space initialization ------------- */
gradyhillhouse 0:806c1dd6946c 1520 if ((2*pi / satrec.no) >= 225.0)
gradyhillhouse 0:806c1dd6946c 1521 {
gradyhillhouse 0:806c1dd6946c 1522 satrec.method = 'd';
gradyhillhouse 0:806c1dd6946c 1523 satrec.isimp = 1;
gradyhillhouse 0:806c1dd6946c 1524 tc = 0.0;
gradyhillhouse 0:806c1dd6946c 1525 inclm = satrec.inclo;
gradyhillhouse 0:806c1dd6946c 1526
gradyhillhouse 0:806c1dd6946c 1527 dscom
gradyhillhouse 0:806c1dd6946c 1528 (
gradyhillhouse 0:806c1dd6946c 1529 epoch, satrec.ecco, satrec.argpo, tc, satrec.inclo, satrec.nodeo,
gradyhillhouse 0:806c1dd6946c 1530 satrec.no, snodm, cnodm, sinim, cosim,sinomm, cosomm,
gradyhillhouse 0:806c1dd6946c 1531 day, satrec.e3, satrec.ee2, em, emsq, gam,
gradyhillhouse 0:806c1dd6946c 1532 satrec.peo, satrec.pgho, satrec.pho, satrec.pinco,
gradyhillhouse 0:806c1dd6946c 1533 satrec.plo, rtemsq, satrec.se2, satrec.se3,
gradyhillhouse 0:806c1dd6946c 1534 satrec.sgh2, satrec.sgh3, satrec.sgh4,
gradyhillhouse 0:806c1dd6946c 1535 satrec.sh2, satrec.sh3, satrec.si2, satrec.si3,
gradyhillhouse 0:806c1dd6946c 1536 satrec.sl2, satrec.sl3, satrec.sl4, s1, s2, s3, s4, s5,
gradyhillhouse 0:806c1dd6946c 1537 s6, s7, ss1, ss2, ss3, ss4, ss5, ss6, ss7, sz1, sz2, sz3,
gradyhillhouse 0:806c1dd6946c 1538 sz11, sz12, sz13, sz21, sz22, sz23, sz31, sz32, sz33,
gradyhillhouse 0:806c1dd6946c 1539 satrec.xgh2, satrec.xgh3, satrec.xgh4, satrec.xh2,
gradyhillhouse 0:806c1dd6946c 1540 satrec.xh3, satrec.xi2, satrec.xi3, satrec.xl2,
gradyhillhouse 0:806c1dd6946c 1541 satrec.xl3, satrec.xl4, nm, z1, z2, z3, z11,
gradyhillhouse 0:806c1dd6946c 1542 z12, z13, z21, z22, z23, z31, z32, z33,
gradyhillhouse 0:806c1dd6946c 1543 satrec.zmol, satrec.zmos
gradyhillhouse 0:806c1dd6946c 1544 );
gradyhillhouse 0:806c1dd6946c 1545 dpper
gradyhillhouse 0:806c1dd6946c 1546 (
gradyhillhouse 0:806c1dd6946c 1547 satrec.e3, satrec.ee2, satrec.peo, satrec.pgho,
gradyhillhouse 0:806c1dd6946c 1548 satrec.pho, satrec.pinco, satrec.plo, satrec.se2,
gradyhillhouse 0:806c1dd6946c 1549 satrec.se3, satrec.sgh2, satrec.sgh3, satrec.sgh4,
gradyhillhouse 0:806c1dd6946c 1550 satrec.sh2, satrec.sh3, satrec.si2, satrec.si3,
gradyhillhouse 0:806c1dd6946c 1551 satrec.sl2, satrec.sl3, satrec.sl4, satrec.t,
gradyhillhouse 0:806c1dd6946c 1552 satrec.xgh2,satrec.xgh3,satrec.xgh4, satrec.xh2,
gradyhillhouse 0:806c1dd6946c 1553 satrec.xh3, satrec.xi2, satrec.xi3, satrec.xl2,
gradyhillhouse 0:806c1dd6946c 1554 satrec.xl3, satrec.xl4, satrec.zmol, satrec.zmos, inclm, satrec.init,
gradyhillhouse 0:806c1dd6946c 1555 satrec.ecco, satrec.inclo, satrec.nodeo, satrec.argpo, satrec.mo,
gradyhillhouse 0:806c1dd6946c 1556 satrec.operationmode
gradyhillhouse 0:806c1dd6946c 1557 );
gradyhillhouse 0:806c1dd6946c 1558
gradyhillhouse 0:806c1dd6946c 1559 argpm = 0.0;
gradyhillhouse 0:806c1dd6946c 1560 nodem = 0.0;
gradyhillhouse 0:806c1dd6946c 1561 mm = 0.0;
gradyhillhouse 0:806c1dd6946c 1562
gradyhillhouse 0:806c1dd6946c 1563 dsinit
gradyhillhouse 0:806c1dd6946c 1564 (
gradyhillhouse 0:806c1dd6946c 1565 whichconst,
gradyhillhouse 0:806c1dd6946c 1566 cosim, emsq, satrec.argpo, s1, s2, s3, s4, s5, sinim, ss1, ss2, ss3, ss4,
gradyhillhouse 0:806c1dd6946c 1567 ss5, sz1, sz3, sz11, sz13, sz21, sz23, sz31, sz33, satrec.t, tc,
gradyhillhouse 0:806c1dd6946c 1568 satrec.gsto, satrec.mo, satrec.mdot, satrec.no, satrec.nodeo,
gradyhillhouse 0:806c1dd6946c 1569 satrec.nodedot, xpidot, z1, z3, z11, z13, z21, z23, z31, z33,
gradyhillhouse 0:806c1dd6946c 1570 satrec.ecco, eccsq, em, argpm, inclm, mm, nm, nodem,
gradyhillhouse 0:806c1dd6946c 1571 satrec.irez, satrec.atime,
gradyhillhouse 0:806c1dd6946c 1572 satrec.d2201, satrec.d2211, satrec.d3210, satrec.d3222 ,
gradyhillhouse 0:806c1dd6946c 1573 satrec.d4410, satrec.d4422, satrec.d5220, satrec.d5232,
gradyhillhouse 0:806c1dd6946c 1574 satrec.d5421, satrec.d5433, satrec.dedt, satrec.didt,
gradyhillhouse 0:806c1dd6946c 1575 satrec.dmdt, dndt, satrec.dnodt, satrec.domdt ,
gradyhillhouse 0:806c1dd6946c 1576 satrec.del1, satrec.del2, satrec.del3, satrec.xfact,
gradyhillhouse 0:806c1dd6946c 1577 satrec.xlamo, satrec.xli, satrec.xni
gradyhillhouse 0:806c1dd6946c 1578 );
gradyhillhouse 0:806c1dd6946c 1579 }
gradyhillhouse 0:806c1dd6946c 1580
gradyhillhouse 0:806c1dd6946c 1581 /* ----------- set variables if not deep space ----------- */
gradyhillhouse 0:806c1dd6946c 1582 if (satrec.isimp != 1)
gradyhillhouse 0:806c1dd6946c 1583 {
gradyhillhouse 0:806c1dd6946c 1584 cc1sq = satrec.cc1 * satrec.cc1;
gradyhillhouse 0:806c1dd6946c 1585 satrec.d2 = 4.0 * ao * tsi * cc1sq;
gradyhillhouse 0:806c1dd6946c 1586 temp = satrec.d2 * tsi * satrec.cc1 / 3.0;
gradyhillhouse 0:806c1dd6946c 1587 satrec.d3 = (17.0 * ao + sfour) * temp;
gradyhillhouse 0:806c1dd6946c 1588 satrec.d4 = 0.5 * temp * ao * tsi * (221.0 * ao + 31.0 * sfour) *
gradyhillhouse 0:806c1dd6946c 1589 satrec.cc1;
gradyhillhouse 0:806c1dd6946c 1590 satrec.t3cof = satrec.d2 + 2.0 * cc1sq;
gradyhillhouse 0:806c1dd6946c 1591 satrec.t4cof = 0.25 * (3.0 * satrec.d3 + satrec.cc1 *
gradyhillhouse 0:806c1dd6946c 1592 (12.0 * satrec.d2 + 10.0 * cc1sq));
gradyhillhouse 0:806c1dd6946c 1593 satrec.t5cof = 0.2 * (3.0 * satrec.d4 +
gradyhillhouse 0:806c1dd6946c 1594 12.0 * satrec.cc1 * satrec.d3 +
gradyhillhouse 0:806c1dd6946c 1595 6.0 * satrec.d2 * satrec.d2 +
gradyhillhouse 0:806c1dd6946c 1596 15.0 * cc1sq * (2.0 * satrec.d2 + cc1sq));
gradyhillhouse 0:806c1dd6946c 1597 }
gradyhillhouse 0:806c1dd6946c 1598 } // if omeosq = 0 ...
gradyhillhouse 0:806c1dd6946c 1599
gradyhillhouse 0:806c1dd6946c 1600 /* finally propogate to zero epoch to initialize all others. */
gradyhillhouse 0:806c1dd6946c 1601 // sgp4fix take out check to let satellites process until they are actually below earth surface
gradyhillhouse 0:806c1dd6946c 1602 // if(satrec.error == 0)
gradyhillhouse 0:806c1dd6946c 1603 sgp4(whichconst, satrec, 0.0, r, v);
gradyhillhouse 0:806c1dd6946c 1604
gradyhillhouse 0:806c1dd6946c 1605 satrec.init = 'n';
gradyhillhouse 0:806c1dd6946c 1606
gradyhillhouse 0:806c1dd6946c 1607 //#include "debug6.cpp"
gradyhillhouse 0:806c1dd6946c 1608 //sgp4fix return boolean. satrec.error contains any error codes
gradyhillhouse 0:806c1dd6946c 1609 return true;
gradyhillhouse 0:806c1dd6946c 1610 } // end sgp4init
gradyhillhouse 0:806c1dd6946c 1611
gradyhillhouse 0:806c1dd6946c 1612 /*-----------------------------------------------------------------------------
gradyhillhouse 0:806c1dd6946c 1613 *
gradyhillhouse 0:806c1dd6946c 1614 * procedure sgp4
gradyhillhouse 0:806c1dd6946c 1615 *
gradyhillhouse 0:806c1dd6946c 1616 * this procedure is the sgp4 prediction model from space command. this is an
gradyhillhouse 0:806c1dd6946c 1617 * updated and combined version of sgp4 and sdp4, which were originally
gradyhillhouse 0:806c1dd6946c 1618 * published separately in spacetrack report #3. this version follows the
gradyhillhouse 0:806c1dd6946c 1619 * methodology from the aiaa paper (2006) describing the history and
gradyhillhouse 0:806c1dd6946c 1620 * development of the code.
gradyhillhouse 0:806c1dd6946c 1621 *
gradyhillhouse 0:806c1dd6946c 1622 * author : david vallado 719-573-2600 28 jun 2005
gradyhillhouse 0:806c1dd6946c 1623 *
gradyhillhouse 0:806c1dd6946c 1624 * inputs :
gradyhillhouse 0:806c1dd6946c 1625 * satrec - initialised structure from sgp4init() call.
gradyhillhouse 0:806c1dd6946c 1626 * tsince - time eince epoch (minutes)
gradyhillhouse 0:806c1dd6946c 1627 *
gradyhillhouse 0:806c1dd6946c 1628 * outputs :
gradyhillhouse 0:806c1dd6946c 1629 * r - position vector km
gradyhillhouse 0:806c1dd6946c 1630 * v - velocity km/sec
gradyhillhouse 0:806c1dd6946c 1631 * return code - non-zero on error.
gradyhillhouse 0:806c1dd6946c 1632 * 1 - mean elements, ecc >= 1.0 or ecc < -0.001 or a < 0.95 er
gradyhillhouse 0:806c1dd6946c 1633 * 2 - mean motion less than 0.0
gradyhillhouse 0:806c1dd6946c 1634 * 3 - pert elements, ecc < 0.0 or ecc > 1.0
gradyhillhouse 0:806c1dd6946c 1635 * 4 - semi-latus rectum < 0.0
gradyhillhouse 0:806c1dd6946c 1636 * 5 - epoch elements are sub-orbital
gradyhillhouse 0:806c1dd6946c 1637 * 6 - satellite has decayed
gradyhillhouse 0:806c1dd6946c 1638 *
gradyhillhouse 0:806c1dd6946c 1639 * locals :
gradyhillhouse 0:806c1dd6946c 1640 * am -
gradyhillhouse 0:806c1dd6946c 1641 * axnl, aynl -
gradyhillhouse 0:806c1dd6946c 1642 * betal -
gradyhillhouse 0:806c1dd6946c 1643 * cosim , sinim , cosomm , sinomm , cnod , snod , cos2u ,
gradyhillhouse 0:806c1dd6946c 1644 * sin2u , coseo1 , sineo1 , cosi , sini , cosip , sinip ,
gradyhillhouse 0:806c1dd6946c 1645 * cosisq , cossu , sinsu , cosu , sinu
gradyhillhouse 0:806c1dd6946c 1646 * delm -
gradyhillhouse 0:806c1dd6946c 1647 * delomg -
gradyhillhouse 0:806c1dd6946c 1648 * dndt -
gradyhillhouse 0:806c1dd6946c 1649 * eccm -
gradyhillhouse 0:806c1dd6946c 1650 * emsq -
gradyhillhouse 0:806c1dd6946c 1651 * ecose -
gradyhillhouse 0:806c1dd6946c 1652 * el2 -
gradyhillhouse 0:806c1dd6946c 1653 * eo1 -
gradyhillhouse 0:806c1dd6946c 1654 * eccp -
gradyhillhouse 0:806c1dd6946c 1655 * esine -
gradyhillhouse 0:806c1dd6946c 1656 * argpm -
gradyhillhouse 0:806c1dd6946c 1657 * argpp -
gradyhillhouse 0:806c1dd6946c 1658 * omgadf -
gradyhillhouse 0:806c1dd6946c 1659 * pl -
gradyhillhouse 0:806c1dd6946c 1660 * r -
gradyhillhouse 0:806c1dd6946c 1661 * rtemsq -
gradyhillhouse 0:806c1dd6946c 1662 * rdotl -
gradyhillhouse 0:806c1dd6946c 1663 * rl -
gradyhillhouse 0:806c1dd6946c 1664 * rvdot -
gradyhillhouse 0:806c1dd6946c 1665 * rvdotl -
gradyhillhouse 0:806c1dd6946c 1666 * su -
gradyhillhouse 0:806c1dd6946c 1667 * t2 , t3 , t4 , tc
gradyhillhouse 0:806c1dd6946c 1668 * tem5, temp , temp1 , temp2 , tempa , tempe , templ
gradyhillhouse 0:806c1dd6946c 1669 * u , ux , uy , uz , vx , vy , vz
gradyhillhouse 0:806c1dd6946c 1670 * inclm - inclination
gradyhillhouse 0:806c1dd6946c 1671 * mm - mean anomaly
gradyhillhouse 0:806c1dd6946c 1672 * nm - mean motion
gradyhillhouse 0:806c1dd6946c 1673 * nodem - right asc of ascending node
gradyhillhouse 0:806c1dd6946c 1674 * xinc -
gradyhillhouse 0:806c1dd6946c 1675 * xincp -
gradyhillhouse 0:806c1dd6946c 1676 * xl -
gradyhillhouse 0:806c1dd6946c 1677 * xlm -
gradyhillhouse 0:806c1dd6946c 1678 * mp -
gradyhillhouse 0:806c1dd6946c 1679 * xmdf -
gradyhillhouse 0:806c1dd6946c 1680 * xmx -
gradyhillhouse 0:806c1dd6946c 1681 * xmy -
gradyhillhouse 0:806c1dd6946c 1682 * nodedf -
gradyhillhouse 0:806c1dd6946c 1683 * xnode -
gradyhillhouse 0:806c1dd6946c 1684 * nodep -
gradyhillhouse 0:806c1dd6946c 1685 * np -
gradyhillhouse 0:806c1dd6946c 1686 *
gradyhillhouse 0:806c1dd6946c 1687 * coupling :
gradyhillhouse 0:806c1dd6946c 1688 * getgravconst-
gradyhillhouse 0:806c1dd6946c 1689 * dpper
gradyhillhouse 0:806c1dd6946c 1690 * dpspace
gradyhillhouse 0:806c1dd6946c 1691 *
gradyhillhouse 0:806c1dd6946c 1692 * references :
gradyhillhouse 0:806c1dd6946c 1693 * hoots, roehrich, norad spacetrack report #3 1980
gradyhillhouse 0:806c1dd6946c 1694 * hoots, norad spacetrack report #6 1986
gradyhillhouse 0:806c1dd6946c 1695 * hoots, schumacher and glover 2004
gradyhillhouse 0:806c1dd6946c 1696 * vallado, crawford, hujsak, kelso 2006
gradyhillhouse 0:806c1dd6946c 1697 ----------------------------------------------------------------------------*/
gradyhillhouse 0:806c1dd6946c 1698
gradyhillhouse 0:806c1dd6946c 1699 bool sgp4
gradyhillhouse 0:806c1dd6946c 1700 (
gradyhillhouse 0:806c1dd6946c 1701 gravconsttype whichconst, elsetrec& satrec, double tsince,
gradyhillhouse 0:806c1dd6946c 1702 double r[3], double v[3]
gradyhillhouse 0:806c1dd6946c 1703 )
gradyhillhouse 0:806c1dd6946c 1704 {
gradyhillhouse 0:806c1dd6946c 1705 double am , axnl , aynl , betal , cosim , cnod ,
gradyhillhouse 0:806c1dd6946c 1706 cos2u, coseo1, cosi , cosip , cosisq, cossu , cosu,
gradyhillhouse 0:806c1dd6946c 1707 delm , delomg, em , emsq , ecose , el2 , eo1 ,
gradyhillhouse 0:806c1dd6946c 1708 ep , esine , argpm, argpp , argpdf, pl, mrt = 0.0,
gradyhillhouse 0:806c1dd6946c 1709 mvt , rdotl , rl , rvdot , rvdotl, sinim ,
gradyhillhouse 0:806c1dd6946c 1710 sin2u, sineo1, sini , sinip , sinsu , sinu ,
gradyhillhouse 0:806c1dd6946c 1711 snod , su , t2 , t3 , t4 , tem5 , temp,
gradyhillhouse 0:806c1dd6946c 1712 temp1, temp2 , tempa, tempe , templ , u , ux ,
gradyhillhouse 0:806c1dd6946c 1713 uy , uz , vx , vy , vz , inclm , mm ,
gradyhillhouse 0:806c1dd6946c 1714 nm , nodem, xinc , xincp , xl , xlm , mp ,
gradyhillhouse 0:806c1dd6946c 1715 xmdf , xmx , xmy , nodedf, xnode , nodep, tc , dndt,
gradyhillhouse 0:806c1dd6946c 1716 twopi, x2o3 , j2 , j3 , tumin, j4 , xke , j3oj2, radiusearthkm,
gradyhillhouse 0:806c1dd6946c 1717 mu, vkmpersec, delmtemp;
gradyhillhouse 0:806c1dd6946c 1718 int ktr;
gradyhillhouse 0:806c1dd6946c 1719
gradyhillhouse 0:806c1dd6946c 1720 /* ------------------ set mathematical constants --------------- */
gradyhillhouse 0:806c1dd6946c 1721 // sgp4fix divisor for divide by zero check on inclination
gradyhillhouse 0:806c1dd6946c 1722 // the old check used 1.0 + cos(pi-1.0e-9), but then compared it to
gradyhillhouse 0:806c1dd6946c 1723 // 1.5 e-12, so the threshold was changed to 1.5e-12 for consistency
gradyhillhouse 0:806c1dd6946c 1724 const double temp4 = 1.5e-12;
gradyhillhouse 0:806c1dd6946c 1725 twopi = 2.0 * pi;
gradyhillhouse 0:806c1dd6946c 1726 x2o3 = 2.0 / 3.0;
gradyhillhouse 0:806c1dd6946c 1727 // sgp4fix identify constants and allow alternate values
gradyhillhouse 0:806c1dd6946c 1728 getgravconst( whichconst, tumin, mu, radiusearthkm, xke, j2, j3, j4, j3oj2 );
gradyhillhouse 0:806c1dd6946c 1729 vkmpersec = radiusearthkm * xke/60.0;
gradyhillhouse 0:806c1dd6946c 1730
gradyhillhouse 0:806c1dd6946c 1731 /* --------------------- clear sgp4 error flag ----------------- */
gradyhillhouse 0:806c1dd6946c 1732 satrec.t = tsince;
gradyhillhouse 0:806c1dd6946c 1733 satrec.error = 0;
gradyhillhouse 0:806c1dd6946c 1734
gradyhillhouse 0:806c1dd6946c 1735 /* ------- update for secular gravity and atmospheric drag ----- */
gradyhillhouse 0:806c1dd6946c 1736 xmdf = satrec.mo + satrec.mdot * satrec.t;
gradyhillhouse 0:806c1dd6946c 1737 argpdf = satrec.argpo + satrec.argpdot * satrec.t;
gradyhillhouse 0:806c1dd6946c 1738 nodedf = satrec.nodeo + satrec.nodedot * satrec.t;
gradyhillhouse 0:806c1dd6946c 1739 argpm = argpdf;
gradyhillhouse 0:806c1dd6946c 1740 mm = xmdf;
gradyhillhouse 0:806c1dd6946c 1741 t2 = satrec.t * satrec.t;
gradyhillhouse 0:806c1dd6946c 1742 nodem = nodedf + satrec.nodecf * t2;
gradyhillhouse 0:806c1dd6946c 1743 tempa = 1.0 - satrec.cc1 * satrec.t;
gradyhillhouse 0:806c1dd6946c 1744 tempe = satrec.bstar * satrec.cc4 * satrec.t;
gradyhillhouse 0:806c1dd6946c 1745 templ = satrec.t2cof * t2;
gradyhillhouse 0:806c1dd6946c 1746
gradyhillhouse 0:806c1dd6946c 1747 if (satrec.isimp != 1)
gradyhillhouse 0:806c1dd6946c 1748 {
gradyhillhouse 0:806c1dd6946c 1749 delomg = satrec.omgcof * satrec.t;
gradyhillhouse 0:806c1dd6946c 1750 // sgp4fix use mutliply for speed instead of pow
gradyhillhouse 0:806c1dd6946c 1751 delmtemp = 1.0 + satrec.eta * cos(xmdf);
gradyhillhouse 0:806c1dd6946c 1752 delm = satrec.xmcof *
gradyhillhouse 0:806c1dd6946c 1753 (delmtemp * delmtemp * delmtemp -
gradyhillhouse 0:806c1dd6946c 1754 satrec.delmo);
gradyhillhouse 0:806c1dd6946c 1755 temp = delomg + delm;
gradyhillhouse 0:806c1dd6946c 1756 mm = xmdf + temp;
gradyhillhouse 0:806c1dd6946c 1757 argpm = argpdf - temp;
gradyhillhouse 0:806c1dd6946c 1758 t3 = t2 * satrec.t;
gradyhillhouse 0:806c1dd6946c 1759 t4 = t3 * satrec.t;
gradyhillhouse 0:806c1dd6946c 1760 tempa = tempa - satrec.d2 * t2 - satrec.d3 * t3 -
gradyhillhouse 0:806c1dd6946c 1761 satrec.d4 * t4;
gradyhillhouse 0:806c1dd6946c 1762 tempe = tempe + satrec.bstar * satrec.cc5 * (sin(mm) -
gradyhillhouse 0:806c1dd6946c 1763 satrec.sinmao);
gradyhillhouse 0:806c1dd6946c 1764 templ = templ + satrec.t3cof * t3 + t4 * (satrec.t4cof +
gradyhillhouse 0:806c1dd6946c 1765 satrec.t * satrec.t5cof);
gradyhillhouse 0:806c1dd6946c 1766 }
gradyhillhouse 0:806c1dd6946c 1767
gradyhillhouse 0:806c1dd6946c 1768 nm = satrec.no;
gradyhillhouse 0:806c1dd6946c 1769 em = satrec.ecco;
gradyhillhouse 0:806c1dd6946c 1770 inclm = satrec.inclo;
gradyhillhouse 0:806c1dd6946c 1771 if (satrec.method == 'd')
gradyhillhouse 0:806c1dd6946c 1772 {
gradyhillhouse 0:806c1dd6946c 1773 tc = satrec.t;
gradyhillhouse 0:806c1dd6946c 1774 dspace
gradyhillhouse 0:806c1dd6946c 1775 (
gradyhillhouse 0:806c1dd6946c 1776 satrec.irez,
gradyhillhouse 0:806c1dd6946c 1777 satrec.d2201, satrec.d2211, satrec.d3210,
gradyhillhouse 0:806c1dd6946c 1778 satrec.d3222, satrec.d4410, satrec.d4422,
gradyhillhouse 0:806c1dd6946c 1779 satrec.d5220, satrec.d5232, satrec.d5421,
gradyhillhouse 0:806c1dd6946c 1780 satrec.d5433, satrec.dedt, satrec.del1,
gradyhillhouse 0:806c1dd6946c 1781 satrec.del2, satrec.del3, satrec.didt,
gradyhillhouse 0:806c1dd6946c 1782 satrec.dmdt, satrec.dnodt, satrec.domdt,
gradyhillhouse 0:806c1dd6946c 1783 satrec.argpo, satrec.argpdot, satrec.t, tc,
gradyhillhouse 0:806c1dd6946c 1784 satrec.gsto, satrec.xfact, satrec.xlamo,
gradyhillhouse 0:806c1dd6946c 1785 satrec.no, satrec.atime,
gradyhillhouse 0:806c1dd6946c 1786 em, argpm, inclm, satrec.xli, mm, satrec.xni,
gradyhillhouse 0:806c1dd6946c 1787 nodem, dndt, nm
gradyhillhouse 0:806c1dd6946c 1788 );
gradyhillhouse 0:806c1dd6946c 1789 } // if method = d
gradyhillhouse 0:806c1dd6946c 1790
gradyhillhouse 0:806c1dd6946c 1791 if (nm <= 0.0)
gradyhillhouse 0:806c1dd6946c 1792 {
gradyhillhouse 0:806c1dd6946c 1793 // printf("# error nm %f\n", nm);
gradyhillhouse 0:806c1dd6946c 1794 satrec.error = 2;
gradyhillhouse 0:806c1dd6946c 1795 // sgp4fix add return
gradyhillhouse 0:806c1dd6946c 1796 return false;
gradyhillhouse 0:806c1dd6946c 1797 }
gradyhillhouse 0:806c1dd6946c 1798 am = pow((xke / nm),x2o3) * tempa * tempa;
gradyhillhouse 0:806c1dd6946c 1799 nm = xke / pow(am, 1.5);
gradyhillhouse 0:806c1dd6946c 1800 em = em - tempe;
gradyhillhouse 0:806c1dd6946c 1801
gradyhillhouse 0:806c1dd6946c 1802 // fix tolerance for error recognition
gradyhillhouse 0:806c1dd6946c 1803 // sgp4fix am is fixed from the previous nm check
gradyhillhouse 0:806c1dd6946c 1804 if ((em >= 1.0) || (em < -0.001)/* || (am < 0.95)*/ )
gradyhillhouse 0:806c1dd6946c 1805 {
gradyhillhouse 0:806c1dd6946c 1806 // printf("# error em %f\n", em);
gradyhillhouse 0:806c1dd6946c 1807 satrec.error = 1;
gradyhillhouse 0:806c1dd6946c 1808 // sgp4fix to return if there is an error in eccentricity
gradyhillhouse 0:806c1dd6946c 1809 return false;
gradyhillhouse 0:806c1dd6946c 1810 }
gradyhillhouse 0:806c1dd6946c 1811 // sgp4fix fix tolerance to avoid a divide by zero
gradyhillhouse 0:806c1dd6946c 1812 if (em < 1.0e-6)
gradyhillhouse 0:806c1dd6946c 1813 em = 1.0e-6;
gradyhillhouse 0:806c1dd6946c 1814 mm = mm + satrec.no * templ;
gradyhillhouse 0:806c1dd6946c 1815 xlm = mm + argpm + nodem;
gradyhillhouse 0:806c1dd6946c 1816 emsq = em * em;
gradyhillhouse 0:806c1dd6946c 1817 temp = 1.0 - emsq;
gradyhillhouse 0:806c1dd6946c 1818
gradyhillhouse 0:806c1dd6946c 1819 nodem = fmod(nodem, twopi);
gradyhillhouse 0:806c1dd6946c 1820 argpm = fmod(argpm, twopi);
gradyhillhouse 0:806c1dd6946c 1821 xlm = fmod(xlm, twopi);
gradyhillhouse 0:806c1dd6946c 1822 mm = fmod(xlm - argpm - nodem, twopi);
gradyhillhouse 0:806c1dd6946c 1823
gradyhillhouse 0:806c1dd6946c 1824 /* ----------------- compute extra mean quantities ------------- */
gradyhillhouse 0:806c1dd6946c 1825 sinim = sin(inclm);
gradyhillhouse 0:806c1dd6946c 1826 cosim = cos(inclm);
gradyhillhouse 0:806c1dd6946c 1827
gradyhillhouse 0:806c1dd6946c 1828 /* -------------------- add lunar-solar periodics -------------- */
gradyhillhouse 0:806c1dd6946c 1829 ep = em;
gradyhillhouse 0:806c1dd6946c 1830 xincp = inclm;
gradyhillhouse 0:806c1dd6946c 1831 argpp = argpm;
gradyhillhouse 0:806c1dd6946c 1832 nodep = nodem;
gradyhillhouse 0:806c1dd6946c 1833 mp = mm;
gradyhillhouse 0:806c1dd6946c 1834 sinip = sinim;
gradyhillhouse 0:806c1dd6946c 1835 cosip = cosim;
gradyhillhouse 0:806c1dd6946c 1836 if (satrec.method == 'd')
gradyhillhouse 0:806c1dd6946c 1837 {
gradyhillhouse 0:806c1dd6946c 1838 dpper
gradyhillhouse 0:806c1dd6946c 1839 (
gradyhillhouse 0:806c1dd6946c 1840 satrec.e3, satrec.ee2, satrec.peo,
gradyhillhouse 0:806c1dd6946c 1841 satrec.pgho, satrec.pho, satrec.pinco,
gradyhillhouse 0:806c1dd6946c 1842 satrec.plo, satrec.se2, satrec.se3,
gradyhillhouse 0:806c1dd6946c 1843 satrec.sgh2, satrec.sgh3, satrec.sgh4,
gradyhillhouse 0:806c1dd6946c 1844 satrec.sh2, satrec.sh3, satrec.si2,
gradyhillhouse 0:806c1dd6946c 1845 satrec.si3, satrec.sl2, satrec.sl3,
gradyhillhouse 0:806c1dd6946c 1846 satrec.sl4, satrec.t, satrec.xgh2,
gradyhillhouse 0:806c1dd6946c 1847 satrec.xgh3, satrec.xgh4, satrec.xh2,
gradyhillhouse 0:806c1dd6946c 1848 satrec.xh3, satrec.xi2, satrec.xi3,
gradyhillhouse 0:806c1dd6946c 1849 satrec.xl2, satrec.xl3, satrec.xl4,
gradyhillhouse 0:806c1dd6946c 1850 satrec.zmol, satrec.zmos, satrec.inclo,
gradyhillhouse 0:806c1dd6946c 1851 'n', ep, xincp, nodep, argpp, mp, satrec.operationmode
gradyhillhouse 0:806c1dd6946c 1852 );
gradyhillhouse 0:806c1dd6946c 1853 if (xincp < 0.0)
gradyhillhouse 0:806c1dd6946c 1854 {
gradyhillhouse 0:806c1dd6946c 1855 xincp = -xincp;
gradyhillhouse 0:806c1dd6946c 1856 nodep = nodep + pi;
gradyhillhouse 0:806c1dd6946c 1857 argpp = argpp - pi;
gradyhillhouse 0:806c1dd6946c 1858 }
gradyhillhouse 0:806c1dd6946c 1859 if ((ep < 0.0 ) || ( ep > 1.0))
gradyhillhouse 0:806c1dd6946c 1860 {
gradyhillhouse 0:806c1dd6946c 1861 // printf("# error ep %f\n", ep);
gradyhillhouse 0:806c1dd6946c 1862 satrec.error = 3;
gradyhillhouse 0:806c1dd6946c 1863 // sgp4fix add return
gradyhillhouse 0:806c1dd6946c 1864 return false;
gradyhillhouse 0:806c1dd6946c 1865 }
gradyhillhouse 0:806c1dd6946c 1866 } // if method = d
gradyhillhouse 0:806c1dd6946c 1867
gradyhillhouse 0:806c1dd6946c 1868 /* -------------------- long period periodics ------------------ */
gradyhillhouse 0:806c1dd6946c 1869 if (satrec.method == 'd')
gradyhillhouse 0:806c1dd6946c 1870 {
gradyhillhouse 0:806c1dd6946c 1871 sinip = sin(xincp);
gradyhillhouse 0:806c1dd6946c 1872 cosip = cos(xincp);
gradyhillhouse 0:806c1dd6946c 1873 satrec.aycof = -0.5*j3oj2*sinip;
gradyhillhouse 0:806c1dd6946c 1874 // sgp4fix for divide by zero for xincp = 180 deg
gradyhillhouse 0:806c1dd6946c 1875 if (fabs(cosip+1.0) > 1.5e-12)
gradyhillhouse 0:806c1dd6946c 1876 satrec.xlcof = -0.25 * j3oj2 * sinip * (3.0 + 5.0 * cosip) / (1.0 + cosip);
gradyhillhouse 0:806c1dd6946c 1877 else
gradyhillhouse 0:806c1dd6946c 1878 satrec.xlcof = -0.25 * j3oj2 * sinip * (3.0 + 5.0 * cosip) / temp4;
gradyhillhouse 0:806c1dd6946c 1879 }
gradyhillhouse 0:806c1dd6946c 1880 axnl = ep * cos(argpp);
gradyhillhouse 0:806c1dd6946c 1881 temp = 1.0 / (am * (1.0 - ep * ep));
gradyhillhouse 0:806c1dd6946c 1882 aynl = ep* sin(argpp) + temp * satrec.aycof;
gradyhillhouse 0:806c1dd6946c 1883 xl = mp + argpp + nodep + temp * satrec.xlcof * axnl;
gradyhillhouse 0:806c1dd6946c 1884
gradyhillhouse 0:806c1dd6946c 1885 /* --------------------- solve kepler's equation --------------- */
gradyhillhouse 0:806c1dd6946c 1886 u = fmod(xl - nodep, twopi);
gradyhillhouse 0:806c1dd6946c 1887 eo1 = u;
gradyhillhouse 0:806c1dd6946c 1888 tem5 = 9999.9;
gradyhillhouse 0:806c1dd6946c 1889 ktr = 1;
gradyhillhouse 0:806c1dd6946c 1890 // sgp4fix for kepler iteration
gradyhillhouse 0:806c1dd6946c 1891 // the following iteration needs better limits on corrections
gradyhillhouse 0:806c1dd6946c 1892 while (( fabs(tem5) >= 1.0e-12) && (ktr <= 10) )
gradyhillhouse 0:806c1dd6946c 1893 {
gradyhillhouse 0:806c1dd6946c 1894 sineo1 = sin(eo1);
gradyhillhouse 0:806c1dd6946c 1895 coseo1 = cos(eo1);
gradyhillhouse 0:806c1dd6946c 1896 tem5 = 1.0 - coseo1 * axnl - sineo1 * aynl;
gradyhillhouse 0:806c1dd6946c 1897 tem5 = (u - aynl * coseo1 + axnl * sineo1 - eo1) / tem5;
gradyhillhouse 0:806c1dd6946c 1898 if(fabs(tem5) >= 0.95)
gradyhillhouse 0:806c1dd6946c 1899 tem5 = tem5 > 0.0 ? 0.95 : -0.95;
gradyhillhouse 0:806c1dd6946c 1900 eo1 = eo1 + tem5;
gradyhillhouse 0:806c1dd6946c 1901 ktr = ktr + 1;
gradyhillhouse 0:806c1dd6946c 1902 }
gradyhillhouse 0:806c1dd6946c 1903
gradyhillhouse 0:806c1dd6946c 1904 /* ------------- short period preliminary quantities ----------- */
gradyhillhouse 0:806c1dd6946c 1905 ecose = axnl*coseo1 + aynl*sineo1;
gradyhillhouse 0:806c1dd6946c 1906 esine = axnl*sineo1 - aynl*coseo1;
gradyhillhouse 0:806c1dd6946c 1907 el2 = axnl*axnl + aynl*aynl;
gradyhillhouse 0:806c1dd6946c 1908 pl = am*(1.0-el2);
gradyhillhouse 0:806c1dd6946c 1909 if (pl < 0.0)
gradyhillhouse 0:806c1dd6946c 1910 {
gradyhillhouse 0:806c1dd6946c 1911 // printf("# error pl %f\n", pl);
gradyhillhouse 0:806c1dd6946c 1912 satrec.error = 4;
gradyhillhouse 0:806c1dd6946c 1913 // sgp4fix add return
gradyhillhouse 0:806c1dd6946c 1914 return false;
gradyhillhouse 0:806c1dd6946c 1915 }
gradyhillhouse 0:806c1dd6946c 1916 else
gradyhillhouse 0:806c1dd6946c 1917 {
gradyhillhouse 0:806c1dd6946c 1918 rl = am * (1.0 - ecose);
gradyhillhouse 0:806c1dd6946c 1919 rdotl = sqrt(am) * esine/rl;
gradyhillhouse 0:806c1dd6946c 1920 rvdotl = sqrt(pl) / rl;
gradyhillhouse 0:806c1dd6946c 1921 betal = sqrt(1.0 - el2);
gradyhillhouse 0:806c1dd6946c 1922 temp = esine / (1.0 + betal);
gradyhillhouse 0:806c1dd6946c 1923 sinu = am / rl * (sineo1 - aynl - axnl * temp);
gradyhillhouse 0:806c1dd6946c 1924 cosu = am / rl * (coseo1 - axnl + aynl * temp);
gradyhillhouse 0:806c1dd6946c 1925 su = atan2(sinu, cosu);
gradyhillhouse 0:806c1dd6946c 1926 sin2u = (cosu + cosu) * sinu;
gradyhillhouse 0:806c1dd6946c 1927 cos2u = 1.0 - 2.0 * sinu * sinu;
gradyhillhouse 0:806c1dd6946c 1928 temp = 1.0 / pl;
gradyhillhouse 0:806c1dd6946c 1929 temp1 = 0.5 * j2 * temp;
gradyhillhouse 0:806c1dd6946c 1930 temp2 = temp1 * temp;
gradyhillhouse 0:806c1dd6946c 1931
gradyhillhouse 0:806c1dd6946c 1932 /* -------------- update for short period periodics ------------ */
gradyhillhouse 0:806c1dd6946c 1933 if (satrec.method == 'd')
gradyhillhouse 0:806c1dd6946c 1934 {
gradyhillhouse 0:806c1dd6946c 1935 cosisq = cosip * cosip;
gradyhillhouse 0:806c1dd6946c 1936 satrec.con41 = 3.0*cosisq - 1.0;
gradyhillhouse 0:806c1dd6946c 1937 satrec.x1mth2 = 1.0 - cosisq;
gradyhillhouse 0:806c1dd6946c 1938 satrec.x7thm1 = 7.0*cosisq - 1.0;
gradyhillhouse 0:806c1dd6946c 1939 }
gradyhillhouse 0:806c1dd6946c 1940 mrt = rl * (1.0 - 1.5 * temp2 * betal * satrec.con41) +
gradyhillhouse 0:806c1dd6946c 1941 0.5 * temp1 * satrec.x1mth2 * cos2u;
gradyhillhouse 0:806c1dd6946c 1942 su = su - 0.25 * temp2 * satrec.x7thm1 * sin2u;
gradyhillhouse 0:806c1dd6946c 1943 xnode = nodep + 1.5 * temp2 * cosip * sin2u;
gradyhillhouse 0:806c1dd6946c 1944 xinc = xincp + 1.5 * temp2 * cosip * sinip * cos2u;
gradyhillhouse 0:806c1dd6946c 1945 mvt = rdotl - nm * temp1 * satrec.x1mth2 * sin2u / xke;
gradyhillhouse 0:806c1dd6946c 1946 rvdot = rvdotl + nm * temp1 * (satrec.x1mth2 * cos2u +
gradyhillhouse 0:806c1dd6946c 1947 1.5 * satrec.con41) / xke;
gradyhillhouse 0:806c1dd6946c 1948
gradyhillhouse 0:806c1dd6946c 1949 /* --------------------- orientation vectors ------------------- */
gradyhillhouse 0:806c1dd6946c 1950 sinsu = sin(su);
gradyhillhouse 0:806c1dd6946c 1951 cossu = cos(su);
gradyhillhouse 0:806c1dd6946c 1952 snod = sin(xnode);
gradyhillhouse 0:806c1dd6946c 1953 cnod = cos(xnode);
gradyhillhouse 0:806c1dd6946c 1954 sini = sin(xinc);
gradyhillhouse 0:806c1dd6946c 1955 cosi = cos(xinc);
gradyhillhouse 0:806c1dd6946c 1956 xmx = -snod * cosi;
gradyhillhouse 0:806c1dd6946c 1957 xmy = cnod * cosi;
gradyhillhouse 0:806c1dd6946c 1958 ux = xmx * sinsu + cnod * cossu;
gradyhillhouse 0:806c1dd6946c 1959 uy = xmy * sinsu + snod * cossu;
gradyhillhouse 0:806c1dd6946c 1960 uz = sini * sinsu;
gradyhillhouse 0:806c1dd6946c 1961 vx = xmx * cossu - cnod * sinsu;
gradyhillhouse 0:806c1dd6946c 1962 vy = xmy * cossu - snod * sinsu;
gradyhillhouse 0:806c1dd6946c 1963 vz = sini * cossu;
gradyhillhouse 0:806c1dd6946c 1964
gradyhillhouse 0:806c1dd6946c 1965 /* --------- position and velocity (in km and km/sec) ---------- */
gradyhillhouse 0:806c1dd6946c 1966 r[0] = (mrt * ux)* radiusearthkm;
gradyhillhouse 0:806c1dd6946c 1967 r[1] = (mrt * uy)* radiusearthkm;
gradyhillhouse 0:806c1dd6946c 1968 r[2] = (mrt * uz)* radiusearthkm;
gradyhillhouse 0:806c1dd6946c 1969 v[0] = (mvt * ux + rvdot * vx) * vkmpersec;
gradyhillhouse 0:806c1dd6946c 1970 v[1] = (mvt * uy + rvdot * vy) * vkmpersec;
gradyhillhouse 0:806c1dd6946c 1971 v[2] = (mvt * uz + rvdot * vz) * vkmpersec;
gradyhillhouse 0:806c1dd6946c 1972 } // if pl > 0
gradyhillhouse 0:806c1dd6946c 1973
gradyhillhouse 0:806c1dd6946c 1974 // sgp4fix for decaying satellites
gradyhillhouse 0:806c1dd6946c 1975 if (mrt < 1.0)
gradyhillhouse 0:806c1dd6946c 1976 {
gradyhillhouse 0:806c1dd6946c 1977 // printf("# decay condition %11.6f \n",mrt);
gradyhillhouse 0:806c1dd6946c 1978 satrec.error = 6;
gradyhillhouse 0:806c1dd6946c 1979 return false;
gradyhillhouse 0:806c1dd6946c 1980 }
gradyhillhouse 0:806c1dd6946c 1981
gradyhillhouse 0:806c1dd6946c 1982 //#include "debug7.cpp"
gradyhillhouse 0:806c1dd6946c 1983 return true;
gradyhillhouse 0:806c1dd6946c 1984 } // end sgp4
gradyhillhouse 0:806c1dd6946c 1985
gradyhillhouse 0:806c1dd6946c 1986
gradyhillhouse 0:806c1dd6946c 1987 /* -----------------------------------------------------------------------------
gradyhillhouse 0:806c1dd6946c 1988 *
gradyhillhouse 0:806c1dd6946c 1989 * function gstime
gradyhillhouse 0:806c1dd6946c 1990 *
gradyhillhouse 0:806c1dd6946c 1991 * this function finds the greenwich sidereal time.
gradyhillhouse 0:806c1dd6946c 1992 *
gradyhillhouse 0:806c1dd6946c 1993 * author : david vallado 719-573-2600 1 mar 2001
gradyhillhouse 0:806c1dd6946c 1994 *
gradyhillhouse 0:806c1dd6946c 1995 * inputs description range / units
gradyhillhouse 0:806c1dd6946c 1996 * jdut1 - julian date in ut1 days from 4713 bc
gradyhillhouse 0:806c1dd6946c 1997 *
gradyhillhouse 0:806c1dd6946c 1998 * outputs :
gradyhillhouse 0:806c1dd6946c 1999 * gstime - greenwich sidereal time 0 to 2pi rad
gradyhillhouse 0:806c1dd6946c 2000 *
gradyhillhouse 0:806c1dd6946c 2001 * locals :
gradyhillhouse 0:806c1dd6946c 2002 * temp - temporary variable for doubles rad
gradyhillhouse 0:806c1dd6946c 2003 * tut1 - julian centuries from the
gradyhillhouse 0:806c1dd6946c 2004 * jan 1, 2000 12 h epoch (ut1)
gradyhillhouse 0:806c1dd6946c 2005 *
gradyhillhouse 0:806c1dd6946c 2006 * coupling :
gradyhillhouse 0:806c1dd6946c 2007 * none
gradyhillhouse 0:806c1dd6946c 2008 *
gradyhillhouse 0:806c1dd6946c 2009 * references :
gradyhillhouse 0:806c1dd6946c 2010 * vallado 2004, 191, eq 3-45
gradyhillhouse 0:806c1dd6946c 2011 * --------------------------------------------------------------------------- */
gradyhillhouse 0:806c1dd6946c 2012
gradyhillhouse 0:806c1dd6946c 2013 double gstime
gradyhillhouse 0:806c1dd6946c 2014 (
gradyhillhouse 0:806c1dd6946c 2015 double jdut1
gradyhillhouse 0:806c1dd6946c 2016 )
gradyhillhouse 0:806c1dd6946c 2017 {
gradyhillhouse 0:806c1dd6946c 2018 const double twopi = 2.0 * pi;
gradyhillhouse 0:806c1dd6946c 2019 const double deg2rad = pi / 180.0;
gradyhillhouse 0:806c1dd6946c 2020 double temp, tut1;
gradyhillhouse 0:806c1dd6946c 2021
gradyhillhouse 0:806c1dd6946c 2022 tut1 = (jdut1 - 2451545.0) / 36525.0;
gradyhillhouse 0:806c1dd6946c 2023 temp = -6.2e-6* tut1 * tut1 * tut1 + 0.093104 * tut1 * tut1 +
gradyhillhouse 0:806c1dd6946c 2024 (876600.0*3600 + 8640184.812866) * tut1 + 67310.54841; // sec
gradyhillhouse 0:806c1dd6946c 2025 temp = fmod(temp * deg2rad / 240.0, twopi); //360/86400 = 1/240, to deg, to rad
gradyhillhouse 0:806c1dd6946c 2026
gradyhillhouse 0:806c1dd6946c 2027 // ------------------------ check quadrants ---------------------
gradyhillhouse 0:806c1dd6946c 2028 if (temp < 0.0)
gradyhillhouse 0:806c1dd6946c 2029 temp += twopi;
gradyhillhouse 0:806c1dd6946c 2030
gradyhillhouse 0:806c1dd6946c 2031 return temp;
gradyhillhouse 0:806c1dd6946c 2032 } // end gstime
gradyhillhouse 0:806c1dd6946c 2033
gradyhillhouse 0:806c1dd6946c 2034
gradyhillhouse 0:806c1dd6946c 2035 /* -----------------------------------------------------------------------------
gradyhillhouse 0:806c1dd6946c 2036 *
gradyhillhouse 0:806c1dd6946c 2037 * function getgravconst
gradyhillhouse 0:806c1dd6946c 2038 *
gradyhillhouse 0:806c1dd6946c 2039 * this function gets constants for the propagator. note that mu is identified to
gradyhillhouse 0:806c1dd6946c 2040 * facilitiate comparisons with newer models. the common useage is wgs72.
gradyhillhouse 0:806c1dd6946c 2041 *
gradyhillhouse 0:806c1dd6946c 2042 * author : david vallado 719-573-2600 21 jul 2006
gradyhillhouse 0:806c1dd6946c 2043 *
gradyhillhouse 0:806c1dd6946c 2044 * inputs :
gradyhillhouse 0:806c1dd6946c 2045 * whichconst - which set of constants to use wgs72old, wgs72, wgs84
gradyhillhouse 0:806c1dd6946c 2046 *
gradyhillhouse 0:806c1dd6946c 2047 * outputs :
gradyhillhouse 0:806c1dd6946c 2048 * tumin - minutes in one time unit
gradyhillhouse 0:806c1dd6946c 2049 * mu - earth gravitational parameter
gradyhillhouse 0:806c1dd6946c 2050 * radiusearthkm - radius of the earth in km
gradyhillhouse 0:806c1dd6946c 2051 * xke - reciprocal of tumin
gradyhillhouse 0:806c1dd6946c 2052 * j2, j3, j4 - un-normalized zonal harmonic values
gradyhillhouse 0:806c1dd6946c 2053 * j3oj2 - j3 divided by j2
gradyhillhouse 0:806c1dd6946c 2054 *
gradyhillhouse 0:806c1dd6946c 2055 * locals :
gradyhillhouse 0:806c1dd6946c 2056 *
gradyhillhouse 0:806c1dd6946c 2057 * coupling :
gradyhillhouse 0:806c1dd6946c 2058 * none
gradyhillhouse 0:806c1dd6946c 2059 *
gradyhillhouse 0:806c1dd6946c 2060 * references :
gradyhillhouse 0:806c1dd6946c 2061 * norad spacetrack report #3
gradyhillhouse 0:806c1dd6946c 2062 * vallado, crawford, hujsak, kelso 2006
gradyhillhouse 0:806c1dd6946c 2063 --------------------------------------------------------------------------- */
gradyhillhouse 0:806c1dd6946c 2064
gradyhillhouse 0:806c1dd6946c 2065 void getgravconst
gradyhillhouse 0:806c1dd6946c 2066 (
gradyhillhouse 0:806c1dd6946c 2067 gravconsttype whichconst,
gradyhillhouse 0:806c1dd6946c 2068 double& tumin,
gradyhillhouse 0:806c1dd6946c 2069 double& mu,
gradyhillhouse 0:806c1dd6946c 2070 double& radiusearthkm,
gradyhillhouse 0:806c1dd6946c 2071 double& xke,
gradyhillhouse 0:806c1dd6946c 2072 double& j2,
gradyhillhouse 0:806c1dd6946c 2073 double& j3,
gradyhillhouse 0:806c1dd6946c 2074 double& j4,
gradyhillhouse 0:806c1dd6946c 2075 double& j3oj2
gradyhillhouse 0:806c1dd6946c 2076 )
gradyhillhouse 0:806c1dd6946c 2077 {
gradyhillhouse 0:806c1dd6946c 2078
gradyhillhouse 0:806c1dd6946c 2079 switch (whichconst)
gradyhillhouse 0:806c1dd6946c 2080 {
gradyhillhouse 0:806c1dd6946c 2081 // -- wgs-72 low precision str#3 constants --
gradyhillhouse 0:806c1dd6946c 2082 case wgs72old:
gradyhillhouse 0:806c1dd6946c 2083 mu = 398600.79964; // in km3 / s2
gradyhillhouse 0:806c1dd6946c 2084 radiusearthkm = 6378.135; // km
gradyhillhouse 0:806c1dd6946c 2085 xke = 0.0743669161;
gradyhillhouse 0:806c1dd6946c 2086 tumin = 1.0 / xke;
gradyhillhouse 0:806c1dd6946c 2087 j2 = 0.001082616;
gradyhillhouse 0:806c1dd6946c 2088 j3 = -0.00000253881;
gradyhillhouse 0:806c1dd6946c 2089 j4 = -0.00000165597;
gradyhillhouse 0:806c1dd6946c 2090 j3oj2 = j3 / j2;
gradyhillhouse 0:806c1dd6946c 2091 break;
gradyhillhouse 0:806c1dd6946c 2092 // ------------ wgs-72 constants ------------
gradyhillhouse 0:806c1dd6946c 2093 case wgs72:
gradyhillhouse 0:806c1dd6946c 2094 mu = 398600.8; // in km3 / s2
gradyhillhouse 0:806c1dd6946c 2095 radiusearthkm = 6378.135; // km
gradyhillhouse 0:806c1dd6946c 2096 xke = 60.0 / sqrt(radiusearthkm*radiusearthkm*radiusearthkm/mu);
gradyhillhouse 0:806c1dd6946c 2097 tumin = 1.0 / xke;
gradyhillhouse 0:806c1dd6946c 2098 j2 = 0.001082616;
gradyhillhouse 0:806c1dd6946c 2099 j3 = -0.00000253881;
gradyhillhouse 0:806c1dd6946c 2100 j4 = -0.00000165597;
gradyhillhouse 0:806c1dd6946c 2101 j3oj2 = j3 / j2;
gradyhillhouse 0:806c1dd6946c 2102 break;
gradyhillhouse 0:806c1dd6946c 2103 case wgs84:
gradyhillhouse 0:806c1dd6946c 2104 // ------------ wgs-84 constants ------------
gradyhillhouse 0:806c1dd6946c 2105 mu = 398600.5; // in km3 / s2
gradyhillhouse 0:806c1dd6946c 2106 radiusearthkm = 6378.137; // km
gradyhillhouse 0:806c1dd6946c 2107 xke = 60.0 / sqrt(radiusearthkm*radiusearthkm*radiusearthkm/mu);
gradyhillhouse 0:806c1dd6946c 2108 tumin = 1.0 / xke;
gradyhillhouse 0:806c1dd6946c 2109 j2 = 0.00108262998905;
gradyhillhouse 0:806c1dd6946c 2110 j3 = -0.00000253215306;
gradyhillhouse 0:806c1dd6946c 2111 j4 = -0.00000161098761;
gradyhillhouse 0:806c1dd6946c 2112 j3oj2 = j3 / j2;
gradyhillhouse 0:806c1dd6946c 2113 break;
gradyhillhouse 0:806c1dd6946c 2114 default:
gradyhillhouse 0:806c1dd6946c 2115 // fprintf(stderr,"unknown gravity option (%d)\n",whichconst);
gradyhillhouse 0:806c1dd6946c 2116 break;
gradyhillhouse 0:806c1dd6946c 2117 }
gradyhillhouse 0:806c1dd6946c 2118
gradyhillhouse 0:806c1dd6946c 2119 } // end getgravconst
gradyhillhouse 0:806c1dd6946c 2120
gradyhillhouse 0:806c1dd6946c 2121
gradyhillhouse 0:806c1dd6946c 2122
gradyhillhouse 0:806c1dd6946c 2123