#pragma once #include "minivec.hh" #include int ephAge(int tow, int t0e); template void getCoordinates(int wn, double tow, const T& iod, Point* p, bool quiet=true) { using namespace std; // here goes const double mu = 3.986004418 * pow(10.0, 14.0); const double omegaE = 7.2921151467 * pow(10.0, -5); double sqrtA = 1.0*iod.sqrtA / (1ULL<<19); double deltan = M_PI * 1.0*iod.deltan / (1LL<<43); double t0e = iod.t0e; // t0e is PRE-SCALED double m0 = M_PI * 1.0*iod.m0 / (1LL<<31); double e = 1.0*iod.e / (1ULL<<33); double omega = M_PI * 1.0*iod.omega / (1LL<<31); double cuc = 1.0*iod.cuc / (1LL<<29); double cus = 1.0*iod.cus / (1LL<<29); double crc = 1.0*iod.crc / (1LL<<5); double crs = 1.0*iod.crs / (1LL<<5); double cic = 1.0*iod.cic / (1LL<<29); double cis = 1.0*iod.cis / (1LL<<29); double idot = M_PI * 1.0*iod.idot / (1LL<<43); double i0 = M_PI * 1.0*iod.i0 / (1LL << 31); double Omegadot = M_PI * 1.0*iod.omegadot / (1LL << 43); double Omega0 = M_PI * 1.0*iod.omega0 / (1LL << 31); // NO IOD BEYOND THIS POINT! if(!quiet) { auto todeg = [](double rad) { return 360 * rad/(2*M_PI); }; cerr << "sqrtA = "<< sqrtA << endl; cerr << "deltan = "<< deltan << endl; cerr << "t0e = "<< t0e << endl; cerr << "m0 = "<< m0 << " ("<x = xprime * cos(Omega) - yprime * cos(i) * sin(Omega); p->y = xprime * sin(Omega) + yprime * cos(i) * cos(Omega); p->z = yprime * sin(i); if(!quiet) { Point core(0.0, .0, .0); Vector radius(core, *p); cerr << radius.length() << " calculated r "<