TLE2ToCZML/node_modules/satellite.js/lib/propagation/sgp4init.js

645 lines
19 KiB
JavaScript
Raw Normal View History

2024-02-22 11:07:01 +08:00
/*!
* 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 */
}