/*! * satellite-js v5.0.0 * (c) 2013 Shashwat Kandadai and UCSC * https://github.com/shashwatak/satellite-js * License: MIT */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = sgp4init; var _constants = require("../constants"); var _dpper = _interopRequireDefault(require("./dpper")); var _dscom = _interopRequireDefault(require("./dscom")); var _dsinit = _interopRequireDefault(require("./dsinit")); var _initl = _interopRequireDefault(require("./initl")); var _sgp = _interopRequireDefault(require("./sgp4")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } /*----------------------------------------------------------------------------- * * procedure sgp4init * * this procedure initializes variables for sgp4. * * author : david vallado 719-573-2600 28 jun 2005 * author : david vallado 719-573-2600 28 jun 2005 * * inputs : * opsmode - mode of operation afspc or improved 'a', 'i' * satn - satellite number * bstar - sgp4 type drag coefficient kg/m2er * ecco - eccentricity * epoch - epoch time in days from jan 0, 1950. 0 hr * argpo - argument of perigee (output if ds) * inclo - inclination * mo - mean anomaly (output if ds) * no - mean motion * nodeo - right ascension of ascending node * * outputs : * rec - common values for subsequent calls * return code - non-zero on error. * 1 - mean elements, ecc >= 1.0 or ecc < -0.001 or a < 0.95 er * 2 - mean motion less than 0.0 * 3 - pert elements, ecc < 0.0 or ecc > 1.0 * 4 - semi-latus rectum < 0.0 * 5 - epoch elements are sub-orbital * 6 - satellite has decayed * * locals : * cnodm , snodm , cosim , sinim , cosomm , sinomm * cc1sq , cc2 , cc3 * coef , coef1 * cosio4 - * day - * dndt - * em - eccentricity * emsq - eccentricity squared * eeta - * etasq - * gam - * argpm - argument of perigee * nodem - * inclm - inclination * mm - mean anomaly * nm - mean motion * perige - perigee * pinvsq - * psisq - * qzms24 - * rtemsq - * s1, s2, s3, s4, s5, s6, s7 - * sfour - * ss1, ss2, ss3, ss4, ss5, ss6, ss7 - * sz1, sz2, sz3 * sz11, sz12, sz13, sz21, sz22, sz23, sz31, sz32, sz33 - * tc - * temp - * temp1, temp2, temp3 - * tsi - * xpidot - * xhdot1 - * z1, z2, z3 - * z11, z12, z13, z21, z22, z23, z31, z32, z33 - * * coupling : * getgravconst- * initl - * dscom - * dpper - * dsinit - * sgp4 - * * references : * hoots, roehrich, norad spacetrack report #3 1980 * hoots, norad spacetrack report #6 1986 * hoots, schumacher and glover 2004 * vallado, crawford, hujsak, kelso 2006 ----------------------------------------------------------------------------*/ function sgp4init(satrec, options) { /* eslint-disable no-param-reassign */ var opsmode = options.opsmode, satn = options.satn, epoch = options.epoch, xbstar = options.xbstar, xecco = options.xecco, xargpo = options.xargpo, xinclo = options.xinclo, xmo = options.xmo, xno = options.xno, xnodeo = options.xnodeo; var cosim; var sinim; var cc1sq; var cc2; var cc3; var coef; var coef1; var cosio4; var em; var emsq; var eeta; var etasq; var argpm; var nodem; var inclm; var mm; var nm; var perige; var pinvsq; var psisq; var qzms24; var s1; var s2; var s3; var s4; var s5; var sfour; var ss1; var ss2; var ss3; var ss4; var ss5; var sz1; var sz3; var sz11; var sz13; var sz21; var sz23; var sz31; var sz33; var tc; var temp; var temp1; var temp2; var temp3; var tsi; var xpidot; var xhdot1; var z1; var z3; var z11; var z13; var z21; var z23; var z31; var z33; /* ------------------------ initialization --------------------- */ // sgp4fix divisor for divide by zero check on inclination // the old check used 1.0 + Math.cos(pi-1.0e-9), but then compared it to // 1.5 e-12, so the threshold was changed to 1.5e-12 for consistency var temp4 = 1.5e-12; // ----------- set all near earth variables to zero ------------ satrec.isimp = 0; satrec.method = 'n'; satrec.aycof = 0.0; satrec.con41 = 0.0; satrec.cc1 = 0.0; satrec.cc4 = 0.0; satrec.cc5 = 0.0; satrec.d2 = 0.0; satrec.d3 = 0.0; satrec.d4 = 0.0; satrec.delmo = 0.0; satrec.eta = 0.0; satrec.argpdot = 0.0; satrec.omgcof = 0.0; satrec.sinmao = 0.0; satrec.t = 0.0; satrec.t2cof = 0.0; satrec.t3cof = 0.0; satrec.t4cof = 0.0; satrec.t5cof = 0.0; satrec.x1mth2 = 0.0; satrec.x7thm1 = 0.0; satrec.mdot = 0.0; satrec.nodedot = 0.0; satrec.xlcof = 0.0; satrec.xmcof = 0.0; satrec.nodecf = 0.0; // ----------- set all deep space variables to zero ------------ satrec.irez = 0; satrec.d2201 = 0.0; satrec.d2211 = 0.0; satrec.d3210 = 0.0; satrec.d3222 = 0.0; satrec.d4410 = 0.0; satrec.d4422 = 0.0; satrec.d5220 = 0.0; satrec.d5232 = 0.0; satrec.d5421 = 0.0; satrec.d5433 = 0.0; satrec.dedt = 0.0; satrec.del1 = 0.0; satrec.del2 = 0.0; satrec.del3 = 0.0; satrec.didt = 0.0; satrec.dmdt = 0.0; satrec.dnodt = 0.0; satrec.domdt = 0.0; satrec.e3 = 0.0; satrec.ee2 = 0.0; satrec.peo = 0.0; satrec.pgho = 0.0; satrec.pho = 0.0; satrec.pinco = 0.0; satrec.plo = 0.0; satrec.se2 = 0.0; satrec.se3 = 0.0; satrec.sgh2 = 0.0; satrec.sgh3 = 0.0; satrec.sgh4 = 0.0; satrec.sh2 = 0.0; satrec.sh3 = 0.0; satrec.si2 = 0.0; satrec.si3 = 0.0; satrec.sl2 = 0.0; satrec.sl3 = 0.0; satrec.sl4 = 0.0; satrec.gsto = 0.0; satrec.xfact = 0.0; satrec.xgh2 = 0.0; satrec.xgh3 = 0.0; satrec.xgh4 = 0.0; satrec.xh2 = 0.0; satrec.xh3 = 0.0; satrec.xi2 = 0.0; satrec.xi3 = 0.0; satrec.xl2 = 0.0; satrec.xl3 = 0.0; satrec.xl4 = 0.0; satrec.xlamo = 0.0; satrec.zmol = 0.0; satrec.zmos = 0.0; satrec.atime = 0.0; satrec.xli = 0.0; satrec.xni = 0.0; // sgp4fix - note the following variables are also passed directly via satrec. // it is possible to streamline the sgp4init call by deleting the "x" // variables, but the user would need to set the satrec.* values first. we // include the additional assignments in case twoline2rv is not used. satrec.bstar = xbstar; satrec.ecco = xecco; satrec.argpo = xargpo; satrec.inclo = xinclo; satrec.mo = xmo; satrec.no = xno; satrec.nodeo = xnodeo; // sgp4fix add opsmode satrec.operationmode = opsmode; // ------------------------ earth constants ----------------------- // sgp4fix identify constants and allow alternate values var ss = 78.0 / _constants.earthRadius + 1.0; // sgp4fix use multiply for speed instead of pow var qzms2ttemp = (120.0 - 78.0) / _constants.earthRadius; var qzms2t = qzms2ttemp * qzms2ttemp * qzms2ttemp * qzms2ttemp; satrec.init = 'y'; satrec.t = 0.0; var initlOptions = { satn: satn, ecco: satrec.ecco, epoch: epoch, inclo: satrec.inclo, no: satrec.no, method: satrec.method, opsmode: satrec.operationmode }; var initlResult = (0, _initl["default"])(initlOptions); var ao = initlResult.ao, con42 = initlResult.con42, cosio = initlResult.cosio, cosio2 = initlResult.cosio2, eccsq = initlResult.eccsq, omeosq = initlResult.omeosq, posq = initlResult.posq, rp = initlResult.rp, rteosq = initlResult.rteosq, sinio = initlResult.sinio; satrec.no = initlResult.no; satrec.con41 = initlResult.con41; satrec.gsto = initlResult.gsto; satrec.a = Math.pow(satrec.no * _constants.tumin, -2.0 / 3.0); satrec.alta = satrec.a * (1.0 + satrec.ecco) - 1.0; satrec.altp = satrec.a * (1.0 - satrec.ecco) - 1.0; satrec.error = 0; // sgp4fix remove this check as it is unnecessary // the mrt check in sgp4 handles decaying satellite cases even if the starting // condition is below the surface of te earth // if (rp < 1.0) // { // printf("// *** satn%d epoch elts sub-orbital ***\n", satn); // satrec.error = 5; // } if (omeosq >= 0.0 || satrec.no >= 0.0) { satrec.isimp = 0; if (rp < 220.0 / _constants.earthRadius + 1.0) { satrec.isimp = 1; } sfour = ss; qzms24 = qzms2t; perige = (rp - 1.0) * _constants.earthRadius; // - for perigees below 156 km, s and qoms2t are altered - if (perige < 156.0) { sfour = perige - 78.0; if (perige < 98.0) { sfour = 20.0; } // sgp4fix use multiply for speed instead of pow var qzms24temp = (120.0 - sfour) / _constants.earthRadius; qzms24 = qzms24temp * qzms24temp * qzms24temp * qzms24temp; sfour = sfour / _constants.earthRadius + 1.0; } pinvsq = 1.0 / posq; tsi = 1.0 / (ao - sfour); satrec.eta = ao * satrec.ecco * tsi; etasq = satrec.eta * satrec.eta; eeta = satrec.ecco * satrec.eta; psisq = Math.abs(1.0 - etasq); coef = qzms24 * Math.pow(tsi, 4.0); coef1 = coef / Math.pow(psisq, 3.5); cc2 = coef1 * satrec.no * (ao * (1.0 + 1.5 * etasq + eeta * (4.0 + etasq)) + 0.375 * _constants.j2 * tsi / psisq * satrec.con41 * (8.0 + 3.0 * etasq * (8.0 + etasq))); satrec.cc1 = satrec.bstar * cc2; cc3 = 0.0; if (satrec.ecco > 1.0e-4) { cc3 = -2.0 * coef * tsi * _constants.j3oj2 * satrec.no * sinio / satrec.ecco; } satrec.x1mth2 = 1.0 - cosio2; satrec.cc4 = 2.0 * satrec.no * coef1 * ao * omeosq * (satrec.eta * (2.0 + 0.5 * etasq) + satrec.ecco * (0.5 + 2.0 * etasq) - _constants.j2 * tsi / (ao * psisq) * (-3.0 * satrec.con41 * (1.0 - 2.0 * eeta + etasq * (1.5 - 0.5 * eeta)) + 0.75 * satrec.x1mth2 * (2.0 * etasq - eeta * (1.0 + etasq)) * Math.cos(2.0 * satrec.argpo))); satrec.cc5 = 2.0 * coef1 * ao * omeosq * (1.0 + 2.75 * (etasq + eeta) + eeta * etasq); cosio4 = cosio2 * cosio2; temp1 = 1.5 * _constants.j2 * pinvsq * satrec.no; temp2 = 0.5 * temp1 * _constants.j2 * pinvsq; temp3 = -0.46875 * _constants.j4 * pinvsq * pinvsq * satrec.no; satrec.mdot = satrec.no + 0.5 * temp1 * rteosq * satrec.con41 + 0.0625 * temp2 * rteosq * (13.0 - 78.0 * cosio2 + 137.0 * cosio4); satrec.argpdot = -0.5 * temp1 * con42 + 0.0625 * temp2 * (7.0 - 114.0 * cosio2 + 395.0 * cosio4) + temp3 * (3.0 - 36.0 * cosio2 + 49.0 * cosio4); xhdot1 = -temp1 * cosio; satrec.nodedot = xhdot1 + (0.5 * temp2 * (4.0 - 19.0 * cosio2) + 2.0 * temp3 * (3.0 - 7.0 * cosio2)) * cosio; xpidot = satrec.argpdot + satrec.nodedot; satrec.omgcof = satrec.bstar * cc3 * Math.cos(satrec.argpo); satrec.xmcof = 0.0; if (satrec.ecco > 1.0e-4) { satrec.xmcof = -_constants.x2o3 * coef * satrec.bstar / eeta; } satrec.nodecf = 3.5 * omeosq * xhdot1 * satrec.cc1; satrec.t2cof = 1.5 * satrec.cc1; // sgp4fix for divide by zero with xinco = 180 deg if (Math.abs(cosio + 1.0) > 1.5e-12) { satrec.xlcof = -0.25 * _constants.j3oj2 * sinio * (3.0 + 5.0 * cosio) / (1.0 + cosio); } else { satrec.xlcof = -0.25 * _constants.j3oj2 * sinio * (3.0 + 5.0 * cosio) / temp4; } satrec.aycof = -0.5 * _constants.j3oj2 * sinio; // sgp4fix use multiply for speed instead of pow var delmotemp = 1.0 + satrec.eta * Math.cos(satrec.mo); satrec.delmo = delmotemp * delmotemp * delmotemp; satrec.sinmao = Math.sin(satrec.mo); satrec.x7thm1 = 7.0 * cosio2 - 1.0; // --------------- deep space initialization ------------- if (2 * _constants.pi / satrec.no >= 225.0) { satrec.method = 'd'; satrec.isimp = 1; tc = 0.0; inclm = satrec.inclo; var dscomOptions = { epoch: epoch, ep: satrec.ecco, argpp: satrec.argpo, tc: tc, inclp: satrec.inclo, nodep: satrec.nodeo, np: satrec.no, e3: satrec.e3, ee2: satrec.ee2, peo: satrec.peo, pgho: satrec.pgho, pho: satrec.pho, pinco: satrec.pinco, plo: satrec.plo, se2: satrec.se2, se3: satrec.se3, sgh2: satrec.sgh2, sgh3: satrec.sgh3, sgh4: satrec.sgh4, sh2: satrec.sh2, sh3: satrec.sh3, si2: satrec.si2, si3: satrec.si3, sl2: satrec.sl2, sl3: satrec.sl3, sl4: satrec.sl4, xgh2: satrec.xgh2, xgh3: satrec.xgh3, xgh4: satrec.xgh4, xh2: satrec.xh2, xh3: satrec.xh3, xi2: satrec.xi2, xi3: satrec.xi3, xl2: satrec.xl2, xl3: satrec.xl3, xl4: satrec.xl4, zmol: satrec.zmol, zmos: satrec.zmos }; var dscomResult = (0, _dscom["default"])(dscomOptions); satrec.e3 = dscomResult.e3; satrec.ee2 = dscomResult.ee2; satrec.peo = dscomResult.peo; satrec.pgho = dscomResult.pgho; satrec.pho = dscomResult.pho; satrec.pinco = dscomResult.pinco; satrec.plo = dscomResult.plo; satrec.se2 = dscomResult.se2; satrec.se3 = dscomResult.se3; satrec.sgh2 = dscomResult.sgh2; satrec.sgh3 = dscomResult.sgh3; satrec.sgh4 = dscomResult.sgh4; satrec.sh2 = dscomResult.sh2; satrec.sh3 = dscomResult.sh3; satrec.si2 = dscomResult.si2; satrec.si3 = dscomResult.si3; satrec.sl2 = dscomResult.sl2; satrec.sl3 = dscomResult.sl3; satrec.sl4 = dscomResult.sl4; sinim = dscomResult.sinim; cosim = dscomResult.cosim; em = dscomResult.em; emsq = dscomResult.emsq; s1 = dscomResult.s1; s2 = dscomResult.s2; s3 = dscomResult.s3; s4 = dscomResult.s4; s5 = dscomResult.s5; ss1 = dscomResult.ss1; ss2 = dscomResult.ss2; ss3 = dscomResult.ss3; ss4 = dscomResult.ss4; ss5 = dscomResult.ss5; sz1 = dscomResult.sz1; sz3 = dscomResult.sz3; sz11 = dscomResult.sz11; sz13 = dscomResult.sz13; sz21 = dscomResult.sz21; sz23 = dscomResult.sz23; sz31 = dscomResult.sz31; sz33 = dscomResult.sz33; satrec.xgh2 = dscomResult.xgh2; satrec.xgh3 = dscomResult.xgh3; satrec.xgh4 = dscomResult.xgh4; satrec.xh2 = dscomResult.xh2; satrec.xh3 = dscomResult.xh3; satrec.xi2 = dscomResult.xi2; satrec.xi3 = dscomResult.xi3; satrec.xl2 = dscomResult.xl2; satrec.xl3 = dscomResult.xl3; satrec.xl4 = dscomResult.xl4; satrec.zmol = dscomResult.zmol; satrec.zmos = dscomResult.zmos; nm = dscomResult.nm; z1 = dscomResult.z1; z3 = dscomResult.z3; z11 = dscomResult.z11; z13 = dscomResult.z13; z21 = dscomResult.z21; z23 = dscomResult.z23; z31 = dscomResult.z31; z33 = dscomResult.z33; var dpperOptions = { inclo: inclm, init: satrec.init, ep: satrec.ecco, inclp: satrec.inclo, nodep: satrec.nodeo, argpp: satrec.argpo, mp: satrec.mo, opsmode: satrec.operationmode }; var dpperResult = (0, _dpper["default"])(satrec, dpperOptions); satrec.ecco = dpperResult.ep; satrec.inclo = dpperResult.inclp; satrec.nodeo = dpperResult.nodep; satrec.argpo = dpperResult.argpp; satrec.mo = dpperResult.mp; argpm = 0.0; nodem = 0.0; mm = 0.0; var dsinitOptions = { cosim: cosim, emsq: emsq, argpo: satrec.argpo, s1: s1, s2: s2, s3: s3, s4: s4, s5: s5, sinim: sinim, ss1: ss1, ss2: ss2, ss3: ss3, ss4: ss4, ss5: ss5, sz1: sz1, sz3: sz3, sz11: sz11, sz13: sz13, sz21: sz21, sz23: sz23, sz31: sz31, sz33: sz33, t: satrec.t, tc: tc, gsto: satrec.gsto, mo: satrec.mo, mdot: satrec.mdot, no: satrec.no, nodeo: satrec.nodeo, nodedot: satrec.nodedot, xpidot: xpidot, z1: z1, z3: z3, z11: z11, z13: z13, z21: z21, z23: z23, z31: z31, z33: z33, ecco: satrec.ecco, eccsq: eccsq, em: em, argpm: argpm, inclm: inclm, mm: mm, nm: nm, nodem: nodem, irez: satrec.irez, atime: satrec.atime, d2201: satrec.d2201, d2211: satrec.d2211, d3210: satrec.d3210, d3222: satrec.d3222, d4410: satrec.d4410, d4422: satrec.d4422, d5220: satrec.d5220, d5232: satrec.d5232, d5421: satrec.d5421, d5433: satrec.d5433, dedt: satrec.dedt, didt: satrec.didt, dmdt: satrec.dmdt, dnodt: satrec.dnodt, domdt: satrec.domdt, del1: satrec.del1, del2: satrec.del2, del3: satrec.del3, xfact: satrec.xfact, xlamo: satrec.xlamo, xli: satrec.xli, xni: satrec.xni }; var dsinitResult = (0, _dsinit["default"])(dsinitOptions); satrec.irez = dsinitResult.irez; satrec.atime = dsinitResult.atime; satrec.d2201 = dsinitResult.d2201; satrec.d2211 = dsinitResult.d2211; satrec.d3210 = dsinitResult.d3210; satrec.d3222 = dsinitResult.d3222; satrec.d4410 = dsinitResult.d4410; satrec.d4422 = dsinitResult.d4422; satrec.d5220 = dsinitResult.d5220; satrec.d5232 = dsinitResult.d5232; satrec.d5421 = dsinitResult.d5421; satrec.d5433 = dsinitResult.d5433; satrec.dedt = dsinitResult.dedt; satrec.didt = dsinitResult.didt; satrec.dmdt = dsinitResult.dmdt; satrec.dnodt = dsinitResult.dnodt; satrec.domdt = dsinitResult.domdt; satrec.del1 = dsinitResult.del1; satrec.del2 = dsinitResult.del2; satrec.del3 = dsinitResult.del3; satrec.xfact = dsinitResult.xfact; satrec.xlamo = dsinitResult.xlamo; satrec.xli = dsinitResult.xli; satrec.xni = dsinitResult.xni; } // ----------- set variables if not deep space ----------- if (satrec.isimp !== 1) { cc1sq = satrec.cc1 * satrec.cc1; satrec.d2 = 4.0 * ao * tsi * cc1sq; temp = satrec.d2 * tsi * satrec.cc1 / 3.0; satrec.d3 = (17.0 * ao + sfour) * temp; satrec.d4 = 0.5 * temp * ao * tsi * (221.0 * ao + 31.0 * sfour) * satrec.cc1; satrec.t3cof = satrec.d2 + 2.0 * cc1sq; satrec.t4cof = 0.25 * (3.0 * satrec.d3 + satrec.cc1 * (12.0 * satrec.d2 + 10.0 * cc1sq)); satrec.t5cof = 0.2 * (3.0 * satrec.d4 + 12.0 * satrec.cc1 * satrec.d3 + 6.0 * satrec.d2 * satrec.d2 + 15.0 * cc1sq * (2.0 * satrec.d2 + cc1sq)); } /* finally propogate to zero epoch to initialize all others. */ // sgp4fix take out check to let satellites process until they are actually below earth surface // if(satrec.error == 0) } (0, _sgp["default"])(satrec, 0, 0); satrec.init = 'n'; /* eslint-enable no-param-reassign */ }