sgp4init function

void sgp4init(
  1. Map<String, dynamic> satrec,
  2. Map<String, dynamic> options
)

Implementation

void sgp4init(Map<String, dynamic> satrec, Map<String, dynamic> options) {
  /* eslint-disable no-param-reassign */

  final opsmode = options['opsmode'];
  final satn = options['satn'];
  final epoch = options['epoch'];
  final xbstar = options['xbstar'];
  final xecco = options['xecco'];
  final xargpo = options['xargpo'];
  final xinclo = options['xinclo'];
  final xmo = options['xmo'];
  final xno = options['xno'];
  final 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
  final 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 devaring 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 finalants -----------------------
  // sgp4fix identify finalants and allow alternate values

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

  satrec['init'] = 'y';
  satrec['t'] = 0.0;

  final initlOptions = {
    'satn': satn,
    'ecco': satrec['ecco'],

    'epoch': epoch,
    'inclo': satrec['inclo'],
    'no': satrec['no'],

    'method': satrec['method'],
    'opsmode': satrec['operationmode'],
  };

  final initlResult = initl(initlOptions);

  final ao = initlResult['ao'];
  final con42 = initlResult['con42'];
  final cosio = initlResult['cosio'];
  final cosio2 = initlResult['cosio2'];
  final eccsq = initlResult['eccsq'];
  final omeosq = initlResult['omeosq'];
  final posq = initlResult['posq'];
  final rp = initlResult['rp'];
  final rteosq = initlResult['rteosq'];
  final 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
      final 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 = 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 (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
    final 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'];

      final 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'],
      };

      final dscomResult = 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'];

      final dpperOptions = {
        'inclo': inclm,
        'init': satrec['init'],
        'ep': satrec['ecco'],
        'inclp': satrec['inclo'],
        'nodep': satrec['nodeo'],
        'argpp': satrec['argpo'],
        'mp': satrec['mo'],
        'opsmode': satrec['operationmode'],
      };

      final dpperResult = 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;

      final 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'],
      };

      final dsinitResult = 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 var satellites process until they are actually below earth surface
    // if(satrec['error'] == 0)
  }

  sgp4(satrec, 0);

  satrec['init'] = 'n';

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