Example #1
0
/*-----------------------------------------------------------------------------
 *
 *                           procedure dsinit
 *
 *  this procedure provides deep space contributions to mean motion dot due
 *    to geopotential resonance with half day and one day orbits.
 *
 *  author        : david vallado                  719-573-2600   28 jun 2005
 *
 *  inputs        :
 *    cosim, sinim-
 *    emsq        - eccentricity squared
 *    argpo       - argument of perigee
 *    s1, s2, s3, s4, s5      -
 *    ss1, ss2, ss3, ss4, ss5 -
 *    sz1, sz3, sz11, sz13, sz21, sz23, sz31, sz33 -
 *    t           - time
 *    tc          -
 *    gsto        - greenwich sidereal time                   rad
 *    mo          - mean anomaly
 *    mdot        - mean anomaly dot (rate)
 *    no          - mean motion
 *    nodeo       - right ascension of ascending node
 *    nodedot     - right ascension of ascending node dot (rate)
 *    xpidot      -
 *    z1, z3, z11, z13, z21, z23, z31, z33 -
 *    eccm        - eccentricity
 *    argpm       - argument of perigee
 *    inclm       - inclination
 *    mm          - mean anomaly
 *    xn          - mean motion
 *    nodem       - right ascension of ascending node
 *
 *  outputs       :
 *    em          - eccentricity
 *    argpm       - argument of perigee
 *    inclm       - inclination
 *    mm          - mean anomaly
 *    nm          - mean motion
 *    nodem       - right ascension of ascending node
 *    irez        - flag for resonance           0-none, 1-one day, 2-half day
 *    atime       -
 *    d2201, d2211, d3210, d3222, d4410, d4422, d5220, d5232, d5421, d5433    -
 *    dedt        -
 *    didt        -
 *    dmdt        -
 *    dndt        -
 *    dnodt       -
 *    domdt       -
 *    del1, del2, del3        -
 *    ses  , sghl , sghs , sgs  , shl  , shs  , sis  , sls
 *    theta       -
 *    xfact       -
 *    xlamo       -
 *    xli         -
 *    xni
 *
 *  locals        :
 *    ainv2       -
 *    aonv        -
 *    cosisq      -
 *    eoc         -
 *    f220, f221, f311, f321, f322, f330, f441, f442, f522, f523, f542, f543  -
 *    g200, g201, g211, g300, g310, g322, g410, g422, g520, g521, g532, g533  -
 *    sini2       -
 *    temp        -
 *    temp1       -
 *    theta       -
 *    xno2        -
 *
 *  coupling      :
 *    getgravconst
 *
 *  references    :
 *    hoots, roehrich, norad spacetrack report #3 1980
 *    hoots, norad spacetrack report #6 1986
 *    hoots, schumacher and glover 2004
 *    vallado, crawford, hujsak, kelso  2006
 * ----------------------------------------------------------------------------*/
        public DsinitResult dsinit(DsinitOptions dsinitOptions)
        {
            Globals globals = new Globals();
            double  pi      = globals.pi;
            double  twoPi   = globals.twoPi;
            double  xke     = globals.xke;
            double  x2o3    = globals.x2o3;

            double cosim   = dsinitOptions.cosim;
            double argpo   = dsinitOptions.argpo;
            double s1      = dsinitOptions.s1;
            double s2      = dsinitOptions.s2;
            double s3      = dsinitOptions.s3;
            double s4      = dsinitOptions.s4;
            double s5      = dsinitOptions.s5;
            double sinim   = dsinitOptions.sinim;
            double ss1     = dsinitOptions.ss1;
            double ss2     = dsinitOptions.ss2;
            double ss3     = dsinitOptions.ss3;
            double ss4     = dsinitOptions.ss4;
            double ss5     = dsinitOptions.ss5;
            double sz1     = dsinitOptions.sz1;
            double sz3     = dsinitOptions.sz3;
            double sz11    = dsinitOptions.sz11;
            double sz13    = dsinitOptions.sz13;
            double sz21    = dsinitOptions.sz21;
            double sz23    = dsinitOptions.sz23;
            double sz31    = dsinitOptions.sz31;
            double sz33    = dsinitOptions.sz33;
            double t       = dsinitOptions.t;
            double tc      = dsinitOptions.tc;
            double gsto    = dsinitOptions.gsto;
            double mo      = dsinitOptions.mo;
            double mdot    = dsinitOptions.mdot;
            double no      = dsinitOptions.no;
            double nodeo   = dsinitOptions.nodeo;
            double nodedot = dsinitOptions.nodedot;
            double xpidot  = dsinitOptions.xpidot;
            double z1      = dsinitOptions.z1;
            double z3      = dsinitOptions.z3;
            double z11     = dsinitOptions.z11;
            double z13     = dsinitOptions.z13;
            double z21     = dsinitOptions.z21;
            double z23     = dsinitOptions.z23;
            double z31     = dsinitOptions.z31;
            double z33     = dsinitOptions.z33;
            double ecco    = dsinitOptions.ecco;
            double eccsq   = dsinitOptions.eccsq;

            double emsq  = dsinitOptions.emsq;
            double em    = dsinitOptions.em;
            double argpm = dsinitOptions.argpm;
            double inclm = dsinitOptions.inclm;
            double mm    = dsinitOptions.mm;
            double nm    = dsinitOptions.nm;
            double nodem = dsinitOptions.nodem;
            double irez  = dsinitOptions.irez;
            double atime = dsinitOptions.atime;
            double d2201 = dsinitOptions.d2201;
            double d2211 = dsinitOptions.d2211;
            double d3210 = dsinitOptions.d3210;
            double d3222 = dsinitOptions.d3222;
            double d4410 = dsinitOptions.d4410;
            double d4422 = dsinitOptions.d4422;
            double d5220 = dsinitOptions.d5220;
            double d5232 = dsinitOptions.d5232;
            double d5421 = dsinitOptions.d5421;
            double d5433 = dsinitOptions.d5433;
            double dedt  = dsinitOptions.dedt;
            double didt  = dsinitOptions.didt;
            double dmdt  = dsinitOptions.dmdt;
            double dnodt = dsinitOptions.dnodt;
            double domdt = dsinitOptions.domdt;
            double del1  = dsinitOptions.del1;
            double del2  = dsinitOptions.del2;
            double del3  = dsinitOptions.del3;
            double xfact = dsinitOptions.xfact;
            double xlamo = dsinitOptions.xlamo;
            double xli   = dsinitOptions.xli;
            double xni   = dsinitOptions.xni;

            double f220   = 0.0;
            double f221   = 0.0;
            double f311   = 0.0;
            double f321   = 0.0;
            double f322   = 0.0;
            double f330   = 0.0;
            double f441   = 0.0;
            double f442   = 0.0;
            double f522   = 0.0;
            double f523   = 0.0;
            double f542   = 0.0;
            double f543   = 0.0;
            double g200   = 0.0;
            double g201   = 0.0;
            double g211   = 0.0;
            double g300   = 0.0;
            double g310   = 0.0;
            double g322   = 0.0;
            double g410   = 0.0;
            double g422   = 0.0;
            double g520   = 0.0;
            double g521   = 0.0;
            double g532   = 0.0;
            double g533   = 0.0;
            double sini2  = 0.0;
            double temp   = 0.0;
            double temp1  = 0.0;
            double xno2   = 0.0;
            double ainv2  = 0.0;
            double aonv   = 0.0;
            double cosisq = 0.0;
            double eoc    = 0.0;

            double q22    = 1.7891679e-6;
            double q31    = 2.1460748e-6;
            double q33    = 2.2123015e-7;
            double root22 = 1.7891679e-6;
            double root44 = 7.3636953e-9;
            double root54 = 2.1765803e-9;
            double rptim  = 4.37526908801129966e-3; // equates to 7.29211514668855e-5 rad/sec
            double root32 = 3.7393792e-7;
            double root52 = 1.1428639e-7;
            double znl    = 1.5835218e-4;
            double zns    = 1.19459e-5;

            // -------------------- deep space initialization ------------
            irez = 0;
            if ((nm < 0.0052359877) && (nm > 0.0034906585))
            {
                irez = 1;
            }
            if ((nm >= 8.26e-3) && (nm <= 9.24e-3) && (em >= 0.5))
            {
                irez = 2;
            }

            // ------------------------ do solar terms -------------------
            double ses  = ss1 * zns * ss5;
            double sis  = ss2 * zns * (sz11 + sz13);
            double sls  = -zns * ss3 * ((sz1 + sz3) - 14.0 - (6.0 * emsq));
            double sghs = ss4 * zns * ((sz31 + sz33) - 6.0);
            double shs  = -zns * ss2 * (sz21 + sz23);

            // sgp4fix for 180 deg incl
            if (inclm < 5.2359877e-2 || inclm > pi - 5.2359877e-2)
            {
                shs = 0.0;
            }
            if (sinim != 0.0)
            {
                shs /= sinim;
            }
            double sgs = sghs - (cosim * shs);

            // ------------------------- do lunar terms ------------------
            dedt = ses + (s1 * znl * s5);
            didt = sis + (s2 * znl * (z11 + z13));
            dmdt = sls - (znl * s3 * ((z1 + z3) - 14.0 - (6.0 * emsq)));
            double sghl = s4 * znl * ((z31 + z33) - 6.0);
            double shll = -znl * s2 * (z21 + z23);


            // sgp4fix for 180 deg incl
            if ((inclm < 5.2359877e-2) || (inclm > (pi - 5.2359877e-2)))
            {
                shll = 0.0;
            }
            domdt = sgs + sghl;
            dnodt = shs;
            if (sinim != 0.0)
            {
                domdt -= (cosim / sinim) * shll;
                dnodt += shll / sinim;
            }

            // ----------- calculate deep space resonance effects --------
            double dndt  = 0.0;
            double theta = (gsto + (tc * rptim)) % twoPi;

            em    += dedt * t;
            inclm += didt * t;
            argpm += domdt * t;
            nodem += dnodt * t;
            mm    += dmdt * t;

            // sgp4fix for negative inclinations
            // the following if statement should be commented out
            // if (inclm < 0.0)
            // {
            //   inclm  = -inclm;
            //   argpm  = argpm - pi;
            //   nodem = nodem + pi;
            // }

            // -------------- initialize the resonance terms -------------
            if (irez != 0)
            {
                aonv = (Math.Pow((nm / xke), x2o3));

                // ---------- geopotential resonance for 12 hour orbits ------
                if (irez == 2)
                {
                    cosisq = cosim * cosim;
                    double emo = em;
                    em = ecco;
                    double emsqo = emsq;
                    emsq = eccsq;
                    eoc  = em * emsq;
                    g201 = -0.306 - ((em - 0.64) * 0.440);

                    if (em <= 0.65)
                    {
                        g211 = (3.616 - (13.2470 * em)) + (16.2900 * emsq);
                        g310 = ((-19.302 + (117.3900 * em)) - (228.4190 * emsq)) + (156.5910 * eoc);
                        g322 = ((-18.9068 + (109.7927 * em)) - (214.6334 * emsq)) + (146.5816 * eoc);
                        g410 = ((-41.122 + (242.6940 * em)) - (471.0940 * emsq)) + (313.9530 * eoc);
                        g422 = ((-146.407 + (841.8800 * em)) - (1629.014 * emsq)) + (1083.4350 * eoc);
                        g520 = ((-532.114 + (3017.977 * em)) - (5740.032 * emsq)) + (3708.2760 * eoc);
                    }
                    else
                    {
                        g211 = ((-72.099 + (331.819 * em)) - (508.738 * emsq)) + (266.724 * eoc);
                        g310 = ((-346.844 + (1582.851 * em)) - (2415.925 * emsq)) + (1246.113 * eoc);
                        g322 = ((-342.585 + (1554.908 * em)) - (2366.899 * emsq)) + (1215.972 * eoc);
                        g410 = ((-1052.797 + (4758.686 * em)) - (7193.992 * emsq)) + (3651.957 * eoc);
                        g422 = ((-3581.690 + (16178.110 * em)) - (24462.770 * emsq)) + (12422.520 * eoc);
                        if (em > 0.715)
                        {
                            g520 = ((-5149.66 + (29936.92 * em)) - (54087.36 * emsq)) + (31324.56 * eoc);
                        }
                        else
                        {
                            g520 = (1464.74 - (4664.75 * em)) + (3763.64 * emsq);
                        }
                    }
                    if (em < 0.7)
                    {
                        g533 = ((-919.22770 + (4988.6100 * em)) - (9064.7700 * emsq)) + (5542.21 * eoc);
                        g521 = ((-822.71072 + (4568.6173 * em)) - (8491.4146 * emsq)) + (5337.524 * eoc);
                        g532 = ((-853.66600 + (4690.2500 * em)) - (8624.7700 * emsq)) + (5341.4 * eoc);
                    }
                    else
                    {
                        g533 = ((-37995.780 + (161616.52 * em)) - (229838.20 * emsq)) + (109377.94 * eoc);
                        g521 = ((-51752.104 + (218913.95 * em)) - (309468.16 * emsq)) + (146349.42 * eoc);
                        g532 = ((-40023.880 + (170470.89 * em)) - (242699.48 * emsq)) + (115605.82 * eoc);
                    }
                    sini2 = sinim * sinim;
                    f220  = 0.75 * (1.0 + (2.0 * cosim) + cosisq);
                    f221  = 1.5 * sini2;
                    f321  = 1.875 * sinim * (1.0 - (2.0 * cosim) - (3.0 * cosisq));
                    f322  = -1.875 * sinim * ((1.0 + (2.0 * cosim)) - (3.0 * cosisq));
                    f441  = 35.0 * sini2 * f220;
                    f442  = 39.3750 * sini2 * sini2;

                    f522 = 9.84375 * sinim * ((sini2 * (1.0 - (2.0 * cosim) - (5.0 * cosisq)))
                                              + (0.33333333 * (-2.0 + (4.0 * cosim) + (6.0 * cosisq))));
                    f523 = sinim * ((4.92187512 * sini2 * ((-2.0 - (4.0 * cosim)) + (10.0 * cosisq)))
                                    + (6.56250012 * ((1.0 + (2.0 * cosim)) - (3.0 * cosisq))));
                    f542 = 29.53125 * sinim * ((2.0 - (8.0 * cosim))
                                               + (cosisq * (-12.0 + (8.0 * cosim) + (10.0 * cosisq))));
                    f543 = 29.53125 * sinim * ((-2.0 - (8.0 * cosim))
                                               + (cosisq * ((12.0 + (8.0 * cosim)) - (10.0 * cosisq))));

                    xno2   = nm * nm;
                    ainv2  = aonv * aonv;
                    temp1  = 3.0 * xno2 * ainv2;
                    temp   = temp1 * root22;
                    d2201  = temp * f220 * g201;
                    d2211  = temp * f221 * g211;
                    temp1 *= aonv;
                    temp   = temp1 * root32;
                    d3210  = temp * f321 * g310;
                    d3222  = temp * f322 * g322;
                    temp1 *= aonv;
                    temp   = 2.0 * temp1 * root44;
                    d4410  = temp * f441 * g410;
                    d4422  = temp * f442 * g422;
                    temp1 *= aonv;
                    temp   = temp1 * root52;
                    d5220  = temp * f522 * g520;
                    d5232  = temp * f523 * g532;
                    temp   = 2.0 * temp1 * root54;
                    d5421  = temp * f542 * g521;
                    d5433  = temp * f543 * g533;
                    xlamo  = ((mo + nodeo + nodeo) - (theta + theta)) % twoPi;
                    xfact  = (mdot + dmdt + (2.0 * ((nodedot + dnodt) - rptim))) - no;
                    em     = emo;
                    emsq   = emsqo;
                }

                //  ---------------- synchronous resonance terms --------------
                if (irez == 1)
                {
                    g200  = 1.0 + (emsq * (-2.5 + (0.8125 * emsq)));
                    g310  = 1.0 + (2.0 * emsq);
                    g300  = 1.0 + (emsq * (-6.0 + (6.60937 * emsq)));
                    f220  = 0.75 * (1.0 + cosim) * (1.0 + cosim);
                    f311  = (0.9375 * sinim * sinim * (1.0 + (3.0 * cosim))) - (0.75 * (1.0 + cosim));
                    f330  = 1.0 + cosim;
                    f330 *= 1.875 * f330 * f330;
                    del1  = 3.0 * nm * nm * aonv * aonv;
                    del2  = 2.0 * del1 * f220 * g200 * q22;
                    del3  = 3.0 * del1 * f330 * g300 * q33 * aonv;
                    del1  = del1 * f311 * g310 * q31 * aonv;
                    xlamo = ((mo + nodeo + argpo) - theta) % twoPi;
                    xfact = (mdot + xpidot + dmdt + domdt + dnodt) - (no + rptim);
                }

                //  ------------ for sgp4, initialize the integrator ----------
                xli   = xlamo;
                xni   = no;
                atime = 0.0;
                nm    = no + dndt;
            }

            DsinitResult dsinitResult = new DsinitResult();

            dsinitResult.em    = em;
            dsinitResult.argpm = argpm;
            dsinitResult.inclm = inclm;
            dsinitResult.mm    = mm;
            dsinitResult.nm    = nm;
            dsinitResult.nodem = nodem;

            dsinitResult.irez  = irez;
            dsinitResult.atime = atime;

            dsinitResult.d2201 = d2201;
            dsinitResult.d2211 = d2211;
            dsinitResult.d3210 = d3210;
            dsinitResult.d3222 = d3222;
            dsinitResult.d4410 = d4410;

            dsinitResult.d4422 = d4422;
            dsinitResult.d5220 = d5220;
            dsinitResult.d5232 = d5232;
            dsinitResult.d5421 = d5421;
            dsinitResult.d5433 = d5433;

            dsinitResult.dedt  = dedt;
            dsinitResult.didt  = didt;
            dsinitResult.dmdt  = dmdt;
            dsinitResult.dndt  = dndt;
            dsinitResult.dnodt = dnodt;
            dsinitResult.domdt = domdt;

            dsinitResult.del1 = del1;
            dsinitResult.del2 = del2;
            dsinitResult.del3 = del3;

            dsinitResult.xfact = xfact;
            dsinitResult.xlamo = xlamo;
            dsinitResult.xli   = xli;
            dsinitResult.xni   = xni;

            return(dsinitResult);
        }
Example #2
0
/*-----------------------------------------------------------------------------
 *
 *                             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
 * ----------------------------------------------------------------------------*/
        public void sgp4init(Satrec satrec, Sgp4initOptions options)
        {
            Globals globals = new Globals();

            double pi          = globals.pi;
            double earthRadius = globals.earthRadius;
            double j2          = globals.j2;
            double j4          = globals.j4;
            double j3oj2       = globals.j3oj2;
            double x2o3        = globals.x2o3;

            char   opsmode = options.opsmode;
            string satn    = options.satn;
            double epoch   = options.epoch;
            double xbstar  = options.xbstar;
            double xecco   = options.xecco;
            double xargpo  = options.xargpo;
            double xinclo  = options.xinclo;
            double xmo     = options.xmo;
            double xno     = options.xno;
            double xnodeo  = options.xnodeo;


            double cosim;
            double sinim;
            double cc1sq;
            double cc2;
            double cc3;
            double coef;
            double coef1;
            double cosio4;
            double em;
            double emsq;
            double eeta;
            double etasq;
            double argpm;
            double nodem;
            double inclm;
            double mm;
            double nm;
            double perige;
            double pinvsq;
            double psisq;
            double qzms24;
            double s1;
            double s2;
            double s3;
            double s4;
            double s5;
            double sfour;
            double ss1;
            double ss2;
            double ss3;
            double ss4;
            double ss5;
            double sz1;
            double sz3;
            double sz11;
            double sz13;
            double sz21;
            double sz23;
            double sz31;
            double sz33;
            double tc;
            double temp;
            double temp1;
            double temp2;
            double temp3;
            double tsi;
            double xpidot;
            double xhdot1;
            double z1;
            double z3;
            double z11;
            double z13;
            double z21;
            double z23;
            double z31;
            double 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
            double 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

            double ss = (78.0 / earthRadius) + 1.0;
            // sgp4fix use multiply for speed instead of pow
            double qzms2ttemp = (120.0 - 78.0) / earthRadius;
            double qzms2t     = qzms2ttemp * qzms2ttemp * qzms2ttemp * qzms2ttemp;

            satrec.init = 'y';
            satrec.t    = 0.0;

            InitlOptions initlOptions = new InitlOptions();

            initlOptions.satn    = satn;
            initlOptions.ecco    = satrec.ecco;
            initlOptions.epoch   = epoch;
            initlOptions.inlco   = satrec.inclo;
            initlOptions.no      = satrec.no;
            initlOptions.method  = satrec.method;
            initlOptions.opsmode = satrec.operationmode;

            Initl       initl       = new Initl();
            InitlResult initlResult = new InitlResult();

            initlResult = initl.initl(initlOptions); //TODO: Finish impl

            double ao     = initlResult.ao;
            double con42  = initlResult.con42;
            double cosio  = initlResult.cosio;
            double cosio2 = initlResult.cosio2;
            double eccsq  = initlResult.eccsq;
            double omeosq = initlResult.omeosq;
            double posq   = initlResult.posq;
            double rp     = initlResult.rp;
            double rteosq = initlResult.rteosq;
            double sinio  = initlResult.sinio;

            satrec.no    = initlResult.no;
            satrec.con41 = initlResult.con41;
            satrec.gsto  = initlResult.gsto;
            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 / earthRadius + 1.0))
                {
                    satrec.isimp = 1;
                }
                sfour  = ss;
                qzms24 = qzms2t;
                perige = (rp - 1.0) * 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
                    double qzms24temp = (120.0 - sfour) / earthRadius;
                    qzms24 = qzms24temp * qzms24temp * qzms24temp * qzms24temp;
                    sfour  = (sfour / 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 * 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 * 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))))
                    - (((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 * j2 * pinvsq * satrec.no;
                temp2       = 0.5 * temp1 * j2 * pinvsq;
                temp3       = -0.46875 * 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 = (-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 * j3oj2 * sinio * (3.0 + (5.0 * cosio))) / (1.0 + cosio);
                }
                else
                {
                    satrec.xlcof = (-0.25 * j3oj2 * sinio * (3.0 + (5.0 * cosio))) / temp4;
                }
                satrec.aycof = -0.5 * j3oj2 * sinio;

                // sgp4fix use multiply for speed instead of pow
                double 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 * pi) / satrec.no >= 225.0)
                {
                    satrec.method = 'd';
                    satrec.isimp  = 1;
                    tc            = 0.0;
                    inclm         = satrec.inclo;


                    DscomOptions dscomOptions = new DscomOptions();
                    dscomOptions.epoch = epoch;
                    dscomOptions.ep    = satrec.ecco;
                    dscomOptions.argpp = satrec.argpo;
                    dscomOptions.tc    = tc;
                    dscomOptions.inclp = satrec.inclo;
                    dscomOptions.nodep = satrec.nodeo;

                    dscomOptions.np  = satrec.no;
                    dscomOptions.e3  = satrec.e3;
                    dscomOptions.ee2 = satrec.ee2;

                    dscomOptions.peo   = satrec.peo;
                    dscomOptions.pgho  = satrec.pgho;
                    dscomOptions.pho   = satrec.pho;
                    dscomOptions.pinco = satrec.pinco;

                    dscomOptions.plo = satrec.plo;
                    dscomOptions.se2 = satrec.se2;
                    dscomOptions.se3 = satrec.se3;

                    dscomOptions.sgh2 = satrec.sgh2;
                    dscomOptions.sgh3 = satrec.sgh3;
                    dscomOptions.sgh4 = satrec.sgh4;

                    dscomOptions.sh2 = satrec.sh2;
                    dscomOptions.sh3 = satrec.sh3;
                    dscomOptions.si2 = satrec.si2;
                    dscomOptions.si3 = satrec.si3;

                    dscomOptions.sl2 = satrec.sl2;
                    dscomOptions.sl3 = satrec.sl3;
                    dscomOptions.sl4 = satrec.sl4;

                    dscomOptions.xgh2 = satrec.xgh2;
                    dscomOptions.xgh3 = satrec.xgh3;
                    dscomOptions.xgh4 = satrec.xgh4;
                    dscomOptions.xh2  = satrec.xh2;

                    dscomOptions.xh3 = satrec.xh3;
                    dscomOptions.xi2 = satrec.xi2;
                    dscomOptions.xi3 = satrec.xi3;
                    dscomOptions.xl2 = satrec.xl2;

                    dscomOptions.xl3 = satrec.xl3;
                    dscomOptions.xl4 = satrec.xl4;

                    dscomOptions.zmol = satrec.zmol;
                    dscomOptions.zmos = satrec.zmos;



                    Dscom       dscom       = new Dscom();
                    DscomResult dscomResult = new DscomResult();

                    dscomResult = dscom.dscom(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;


                    DpperOptions dpperOptions = new DpperOptions();
                    dpperOptions.inclo   = inclm;
                    dpperOptions.init    = satrec.init;
                    dpperOptions.ep      = satrec.ecco;
                    dpperOptions.inclp   = satrec.inclo;
                    dpperOptions.nodep   = satrec.nodeo;
                    dpperOptions.argpp   = satrec.argpo;
                    dpperOptions.mp      = satrec.mo;
                    dpperOptions.opsmode = satrec.operationmode;


                    Dpper       dpper       = new Dpper();
                    DpperResult dpperResult = new DpperResult();

                    dpperResult = dpper.dpper(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;



                    DsinitOptions dsinitOptions = new DsinitOptions();

                    dsinitOptions.cosim = cosim;
                    dsinitOptions.emsq  = emsq;
                    dsinitOptions.argpo = satrec.argpo;
                    dsinitOptions.s1    = s1;
                    dsinitOptions.s2    = s2;
                    dsinitOptions.s3    = s3;
                    dsinitOptions.s4    = s4;
                    dsinitOptions.s5    = s5;
                    dsinitOptions.sinim = sinim;
                    dsinitOptions.ss1   = ss1;
                    dsinitOptions.ss2   = ss2;
                    dsinitOptions.ss3   = ss3;
                    dsinitOptions.ss4   = ss4;
                    dsinitOptions.ss5   = ss5;
                    dsinitOptions.sz1   = sz1;
                    dsinitOptions.sz3   = sz3;
                    dsinitOptions.sz11  = sz11;
                    dsinitOptions.sz13  = sz13;
                    dsinitOptions.sz21  = sz21;
                    dsinitOptions.sz23  = sz23;
                    dsinitOptions.sz31  = sz31;
                    dsinitOptions.sz33  = sz33;
                    dsinitOptions.t     = satrec.t;

                    dsinitOptions.tc      = tc;
                    dsinitOptions.gsto    = satrec.gsto;
                    dsinitOptions.mo      = satrec.mo;
                    dsinitOptions.mdot    = satrec.mdot;
                    dsinitOptions.no      = satrec.no;
                    dsinitOptions.nodeo   = satrec.nodeo;
                    dsinitOptions.nodedot = satrec.nodedot;

                    dsinitOptions.xpidot = xpidot;
                    dsinitOptions.z1     = z1;
                    dsinitOptions.z3     = z3;
                    dsinitOptions.z11    = z11;
                    dsinitOptions.z13    = z13;
                    dsinitOptions.z21    = z21;
                    dsinitOptions.z23    = z23;
                    dsinitOptions.z31    = z31;
                    dsinitOptions.z33    = z33;
                    dsinitOptions.ecco   = satrec.ecco;

                    dsinitOptions.eccsq = eccsq;
                    dsinitOptions.em    = em;
                    dsinitOptions.argpm = argpm;
                    dsinitOptions.inclm = inclm;
                    dsinitOptions.mm    = mm;
                    dsinitOptions.nm    = nm;
                    dsinitOptions.nodem = nodem;

                    dsinitOptions.irez  = satrec.irez;
                    dsinitOptions.atime = satrec.atime;
                    dsinitOptions.d2201 = satrec.d2201;
                    dsinitOptions.d2211 = satrec.d2211;
                    dsinitOptions.d3210 = satrec.d3210;
                    dsinitOptions.d3222 = satrec.d3222;
                    dsinitOptions.d4410 = satrec.d4410;
                    dsinitOptions.d4422 = satrec.d4422;
                    dsinitOptions.d5220 = satrec.d5220;
                    dsinitOptions.d5232 = satrec.d5232;
                    dsinitOptions.d5421 = satrec.d5421;
                    dsinitOptions.d5433 = satrec.d5433;
                    dsinitOptions.dedt  = satrec.dedt;
                    dsinitOptions.didt  = satrec.didt;
                    dsinitOptions.dmdt  = satrec.dmdt;
                    dsinitOptions.dnodt = satrec.dnodt;
                    dsinitOptions.domdt = satrec.domdt;
                    dsinitOptions.del1  = satrec.del1;
                    dsinitOptions.del2  = satrec.del2;
                    dsinitOptions.del3  = satrec.del3;
                    dsinitOptions.xfact = satrec.xfact;
                    dsinitOptions.xlamo = satrec.xlamo;
                    dsinitOptions.xli   = satrec.xli;
                    dsinitOptions.xni   = satrec.xni;

                    Dsinit       dsinit       = new Dsinit();
                    DsinitResult dsinitResult = new DsinitResult();
                    dsinitResult = dsinit.dsinit(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)
            }

            Sgp4 sgp4 = new Sgp4();

            sgp4.sgp4(satrec, 0);

            satrec.init = 'n';

            /* eslint-enable no-param-reassign */
        }