259 lines
6.8 KiB
JavaScript
259 lines
6.8 KiB
JavaScript
|
/*!
|
||
|
* 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"] = dpper;
|
||
|
var _constants = require("../constants");
|
||
|
/* -----------------------------------------------------------------------------
|
||
|
*
|
||
|
* procedure dpper
|
||
|
*
|
||
|
* this procedure provides deep space long period periodic contributions
|
||
|
* to the mean elements. by design, these periodics are zero at epoch.
|
||
|
* this used to be dscom which included initialization, but it's really a
|
||
|
* recurring function.
|
||
|
*
|
||
|
* author : david vallado 719-573-2600 28 jun 2005
|
||
|
*
|
||
|
* inputs :
|
||
|
* e3 -
|
||
|
* ee2 -
|
||
|
* peo -
|
||
|
* pgho -
|
||
|
* pho -
|
||
|
* pinco -
|
||
|
* plo -
|
||
|
* se2 , se3 , sgh2, sgh3, sgh4, sh2, sh3, si2, si3, sl2, sl3, sl4 -
|
||
|
* t -
|
||
|
* xh2, xh3, xi2, xi3, xl2, xl3, xl4 -
|
||
|
* zmol -
|
||
|
* zmos -
|
||
|
* ep - eccentricity 0.0 - 1.0
|
||
|
* inclo - inclination - needed for lyddane modification
|
||
|
* nodep - right ascension of ascending node
|
||
|
* argpp - argument of perigee
|
||
|
* mp - mean anomaly
|
||
|
*
|
||
|
* outputs :
|
||
|
* ep - eccentricity 0.0 - 1.0
|
||
|
* inclp - inclination
|
||
|
* nodep - right ascension of ascending node
|
||
|
* argpp - argument of perigee
|
||
|
* mp - mean anomaly
|
||
|
*
|
||
|
* locals :
|
||
|
* alfdp -
|
||
|
* betdp -
|
||
|
* cosip , sinip , cosop , sinop ,
|
||
|
* dalf -
|
||
|
* dbet -
|
||
|
* dls -
|
||
|
* f2, f3 -
|
||
|
* pe -
|
||
|
* pgh -
|
||
|
* ph -
|
||
|
* pinc -
|
||
|
* pl -
|
||
|
* sel , ses , sghl , sghs , shl , shs , sil , sinzf , sis ,
|
||
|
* sll , sls
|
||
|
* xls -
|
||
|
* xnoh -
|
||
|
* zf -
|
||
|
* zm -
|
||
|
*
|
||
|
* coupling :
|
||
|
* none.
|
||
|
*
|
||
|
* 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 dpper(satrec, options) {
|
||
|
var 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,
|
||
|
t = satrec.t,
|
||
|
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 init = options.init,
|
||
|
opsmode = options.opsmode;
|
||
|
var ep = options.ep,
|
||
|
inclp = options.inclp,
|
||
|
nodep = options.nodep,
|
||
|
argpp = options.argpp,
|
||
|
mp = options.mp;
|
||
|
|
||
|
// Copy satellite attributes into local variables for convenience
|
||
|
// and symmetry in writing formulae.
|
||
|
|
||
|
var alfdp;
|
||
|
var betdp;
|
||
|
var cosip;
|
||
|
var sinip;
|
||
|
var cosop;
|
||
|
var sinop;
|
||
|
var dalf;
|
||
|
var dbet;
|
||
|
var dls;
|
||
|
var f2;
|
||
|
var f3;
|
||
|
var pe;
|
||
|
var pgh;
|
||
|
var ph;
|
||
|
var pinc;
|
||
|
var pl;
|
||
|
var sinzf;
|
||
|
var xls;
|
||
|
var xnoh;
|
||
|
var zf;
|
||
|
var zm;
|
||
|
|
||
|
// ---------------------- constants -----------------------------
|
||
|
var zns = 1.19459e-5;
|
||
|
var zes = 0.01675;
|
||
|
var znl = 1.5835218e-4;
|
||
|
var zel = 0.05490;
|
||
|
|
||
|
// --------------- calculate time varying periodics -----------
|
||
|
zm = zmos + zns * t;
|
||
|
|
||
|
// be sure that the initial call has time set to zero
|
||
|
if (init === 'y') {
|
||
|
zm = zmos;
|
||
|
}
|
||
|
zf = zm + 2.0 * zes * Math.sin(zm);
|
||
|
sinzf = Math.sin(zf);
|
||
|
f2 = 0.5 * sinzf * sinzf - 0.25;
|
||
|
f3 = -0.5 * sinzf * Math.cos(zf);
|
||
|
var ses = se2 * f2 + se3 * f3;
|
||
|
var sis = si2 * f2 + si3 * f3;
|
||
|
var sls = sl2 * f2 + sl3 * f3 + sl4 * sinzf;
|
||
|
var sghs = sgh2 * f2 + sgh3 * f3 + sgh4 * sinzf;
|
||
|
var shs = sh2 * f2 + sh3 * f3;
|
||
|
zm = zmol + znl * t;
|
||
|
if (init === 'y') {
|
||
|
zm = zmol;
|
||
|
}
|
||
|
zf = zm + 2.0 * zel * Math.sin(zm);
|
||
|
sinzf = Math.sin(zf);
|
||
|
f2 = 0.5 * sinzf * sinzf - 0.25;
|
||
|
f3 = -0.5 * sinzf * Math.cos(zf);
|
||
|
var sel = ee2 * f2 + e3 * f3;
|
||
|
var sil = xi2 * f2 + xi3 * f3;
|
||
|
var sll = xl2 * f2 + xl3 * f3 + xl4 * sinzf;
|
||
|
var sghl = xgh2 * f2 + xgh3 * f3 + xgh4 * sinzf;
|
||
|
var shll = xh2 * f2 + xh3 * f3;
|
||
|
pe = ses + sel;
|
||
|
pinc = sis + sil;
|
||
|
pl = sls + sll;
|
||
|
pgh = sghs + sghl;
|
||
|
ph = shs + shll;
|
||
|
if (init === 'n') {
|
||
|
pe -= peo;
|
||
|
pinc -= pinco;
|
||
|
pl -= plo;
|
||
|
pgh -= pgho;
|
||
|
ph -= pho;
|
||
|
inclp += pinc;
|
||
|
ep += pe;
|
||
|
sinip = Math.sin(inclp);
|
||
|
cosip = Math.cos(inclp);
|
||
|
|
||
|
/* ----------------- apply periodics directly ------------ */
|
||
|
// sgp4fix for lyddane choice
|
||
|
// strn3 used original inclination - this is technically feasible
|
||
|
// gsfc used perturbed inclination - also technically feasible
|
||
|
// probably best to readjust the 0.2 limit value and limit discontinuity
|
||
|
// 0.2 rad = 11.45916 deg
|
||
|
// use next line for original strn3 approach and original inclination
|
||
|
// if (inclo >= 0.2)
|
||
|
// use next line for gsfc version and perturbed inclination
|
||
|
if (inclp >= 0.2) {
|
||
|
ph /= sinip;
|
||
|
pgh -= cosip * ph;
|
||
|
argpp += pgh;
|
||
|
nodep += ph;
|
||
|
mp += pl;
|
||
|
} else {
|
||
|
// ---- apply periodics with lyddane modification ----
|
||
|
sinop = Math.sin(nodep);
|
||
|
cosop = Math.cos(nodep);
|
||
|
alfdp = sinip * sinop;
|
||
|
betdp = sinip * cosop;
|
||
|
dalf = ph * cosop + pinc * cosip * sinop;
|
||
|
dbet = -ph * sinop + pinc * cosip * cosop;
|
||
|
alfdp += dalf;
|
||
|
betdp += dbet;
|
||
|
nodep %= _constants.twoPi;
|
||
|
|
||
|
// sgp4fix for afspc written intrinsic functions
|
||
|
// nodep used without a trigonometric function ahead
|
||
|
if (nodep < 0.0 && opsmode === 'a') {
|
||
|
nodep += _constants.twoPi;
|
||
|
}
|
||
|
xls = mp + argpp + cosip * nodep;
|
||
|
dls = pl + pgh - pinc * nodep * sinip;
|
||
|
xls += dls;
|
||
|
xnoh = nodep;
|
||
|
nodep = Math.atan2(alfdp, betdp);
|
||
|
|
||
|
// sgp4fix for afspc written intrinsic functions
|
||
|
// nodep used without a trigonometric function ahead
|
||
|
if (nodep < 0.0 && opsmode === 'a') {
|
||
|
nodep += _constants.twoPi;
|
||
|
}
|
||
|
if (Math.abs(xnoh - nodep) > _constants.pi) {
|
||
|
if (nodep < xnoh) {
|
||
|
nodep += _constants.twoPi;
|
||
|
} else {
|
||
|
nodep -= _constants.twoPi;
|
||
|
}
|
||
|
}
|
||
|
mp += pl;
|
||
|
argpp = xls - mp - cosip * nodep;
|
||
|
}
|
||
|
}
|
||
|
return {
|
||
|
ep: ep,
|
||
|
inclp: inclp,
|
||
|
nodep: nodep,
|
||
|
argpp: argpp,
|
||
|
mp: mp
|
||
|
};
|
||
|
}
|