37 #define SWAP(a, b) {typeof(a) t; t = a; a = b; b = t;}
52 const unsigned int mask=1;
69 void fft(std::complex<double> x_a[], std::complex<double> x_A[],
unsigned int n,
FFT_Direction dir)
73 std::complex<double> omega, omega_m;
74 std::complex<double> t, u;
75 std::complex<double> a;
79 while (1u<<log2n<n && log2n<32u)
84 std::cerr <<
"iterative_fft: number of points, " << n <<
", is not a power of 2.\n";
88 for (
unsigned int i=0; i<n; i++)
91 for (
unsigned int s=1; s<=log2n; s++)
95 omega_m = std::exp(a/((
double)m));
96 for (
unsigned int k=0; k<n; k+=m)
98 omega = std::complex<double>(1.0, 0.0);
99 for (
unsigned int j=0; j<hm; j++)
101 t = omega*x_A[k + j + hm];
104 x_A[k + j + hm] = u - t;
110 for (
unsigned int i=0; i<n; i++)
121 bool useOldEllipsoid)
129 f = 0.00335281068118;
136 double p, dP, ec, b, z, dZ, dE;
137 double dC0, dC1, dS0, dS1;
138 double dA0, dA1, dB0, dD0, dF0;
153 dA0 = hypot(dC0, dS0);
154 dB0 = 1.5*dE*dS0*dC0*dC0*( (dP*dS0 - dZ*dC0)*dA0 - dE*dS0*dC0);
155 dD0 = dZ*dA0*dA0*dA0 + dE*dS0*dS0*dS0;
156 dF0 = dP*dA0*dA0*dA0 - dE*dC0*dC0*dC0;
158 dS1 = dD0*dF0 - dB0*dS0;
159 dC1 = dF0*dF0 - dB0*dC0;
160 dA1 = hypot(dC1, dS1);
165 longitude += M_PI*2.0;
169 height = (p*dC1*ec + z*dS1 - b*dA1)/hypot(ec*dC1, dS1);
183 double dPsi_2000,
double dEps_2000,
double& diffPsi,
double& diffEps)
185 double psi_A, chi_A, eps_A, eps_0;
186 double dt1, dt2, dt3, dt4, dt5;
190 dt1 = (epoch -
tEphem)/36525.0;
198 psi_A = 5038.481507*dt1 - 1.0790069*dt2 - 0.00114045*dt3 + 0.000132851*dt4 - 0.0000000951*dt5;
200 chi_A = 10.556403*dt1 - 2.3814292*dt2 - 0.00121197*dt3 + 0.000170663*dt4 - 0.000000056*dt5;
201 eps_A = eps_0 - 46.836769*dt1 - 0.0001831*dt2 + 0.0020034*dt3 - 0.000000576*dt4 - 0.0000000434*dt5;
207 coseps_0 = cos(eps_0);
208 sineps_A = sin(eps_A);
210 f = f2 = psi_A*coseps_0 - chi_A;
213 diffPsi = dPsi_2000 - dPsi_1980;
214 diffEps = dEps_2000 - dEps_1980;
218 diffPsi+= (dX - f*dY)/(f2 + 1.0)/sineps_A;
219 diffEps+= (f*dX + dY)/(f2 + 1.0);
223 diffPsi+= -0.29965*dt1*
SEC2RAD;
224 diffEps+= -0.02524*dt1*
SEC2RAD;
230 diffPsi+= (-0.0417750)*
SEC2RAD;
231 diffEps+= (-0.0068192)*
SEC2RAD;
242 const double cL [5] = {134.96340251*
DEG2SEC, 1717915923.2178, 31.8792, 0.051635, -0.00024470};
243 const double cL0 [5] = {357.52910918*
DEG2SEC, 129596581.0481, -0.5532, 0.000136, -0.00001149};
244 const double cF [5] = { 93.27209062*
DEG2SEC, 1739527262.8478,-12.7512,-0.001037, 0.00000417};
245 const double cD [5] = {297.85019547*
DEG2SEC, 1602961601.2090, -6.3706, 0.006593, -0.00003169};
246 const double cOm [5] = {125.04455501*
DEG2SEC, -6962890.5431, 7.4722, 0.007702, -0.00005939};
247 double t((tEpoch -
tEphem)/36525.0);
249 double dL, dL0, dF, dD, dOm;
253 dL = cL [0] + cL [1]*t + cL [2]*t2 + cL [3]*t3 + cL [4]*t4;
254 dL0 = cL0[0] + cL0[1]*t + cL0[2]*t2 + cL0[3]*t3 + cL0[4]*t4;
255 dF = cF [0] + cF [1]*t + cF [2]*t2 + cF [3]*t3 + cF [4]*t4;
256 dD = cD [0] + cD [1]*t + cD [2]*t2 + cD [3]*t3 + cD [4]*t4;
257 dOm = cOm[0] + cOm[1]*t + cOm[2]*t2 + cOm[3]*t3 + cOm[4]*t4;
274 const double cL [5] = {134.96340251*
DEG2SEC, 1717915923.2178, 31.8792, 0.051635, -0.00024470};
275 const double cL0 [5] = {357.52910918*
DEG2SEC, 129596581.0481, -0.5532,-0.000136, -0.00001149};
276 const double cF [5] = { 93.27209062*
DEG2SEC, 1739527262.8478,-12.7512,-0.001037, 0.00000417};
277 const double cD [5] = {297.85019547*
DEG2SEC, 1602961601.2090, -6.3706, 0.006593, -0.00003169};
278 const double cOm [5] = {125.04455501*
DEG2SEC, -6962890.2665, 7.4722, 0.007702, -0.00005939};
280 double t((tEpoch -
tEphem)/36525.0);
282 double dL, dL0, dF, dD, dOm;
286 dL = cL [0] + cL [1]*t + cL [2]*t2 + cL [3]*t3 + cL [4]*t4;
287 dL0 = cL0[0] + cL0[1]*t + cL0[2]*t2 + cL0[3]*t3 + cL0[4]*t4;
288 dF = cF [0] + cF [1]*t + cF [2]*t2 + cF [3]*t3 + cF [4]*t4;
289 dD = cD [0] + cD [1]*t + cD [2]*t2 + cD [3]*t3 + cD [4]*t4;
290 dOm = cOm[0] + cOm[1]*t + cOm[2]*t2 + cOm[3]*t3 + cOm[4]*t4;
307 double t((tEpoch -
tEphem)/36525.0);
309 double dL, dL0, dF, dD, dOm;
316 dL = (134.0*3600.0 + 57.0*60.0 + 46.733) +
317 fmod((1325.0*r + 198.0*3600.0 + 52.0*60.0 + 2.633)*t, r) + 31.310*t2 + 0.064*t3;
320 dL0 = (357.0*3600.0 + 31.0*60.0 + 39.804) +
321 fmod(( 99.0*r + 359.0*3600.0 + 3.0*60.0 + 1.224)*t, r) - 0.577*t2 - 0.012*t3;
324 dF = ( 93.0*3600.0 + 16.0*60.0 + 18.877) +
325 fmod((1342.0*r + 82.0*3600.0 + 1.0*60.0 + 3.137)*t, r) - 13.257*t2 + 0.011*t3;
328 dD = (297.0*3600.0 + 51.0*60.0 + 1.307) +
329 fmod((1236.0*r + 307.0*3600.0 + 6.0*60.0 + 41.328)*t, r) - 6.891*t2 + 0.019*t3;
332 dOm = (125.0*3600.0 + 2.0*60.0 + 40.280) -
333 fmod(( 5.0*r + 134.0*3600.0 + 8.0*60.0 + 10.539)*t, r) + 7.455*t2 + 0.008*t3;
356 const std::complex<double>
zI(0.0, 1.0);
const SgMJD tEphem(51544.5)
void geocentric2geodetic(const Sg3dVector &r, double &latitude, double &longitude, double &height, bool useOldEllipsoid)
void calcNutationFundArgs_IersConv1996(const SgMJD &tEpoch, double args[5])
void fft(std::complex< double > x_a[], std::complex< double > x_A[], unsigned int n, FFT_Direction dir)
void calcNutationFundArgs_IersConv2003(const SgMJD &tEpoch, double args[5])
unsigned int reverseBitOrder(unsigned int n, unsigned int k)
void calcCip2IAU1980(const SgMJD &epoch, double dX, double dY, double dPsi_1980, double dEps_1980, double dPsi_2000, double dEps_2000, double &diffPsi, double &diffEps)
const std::complex< double > zI(0.0, 1.0)
void calcNutationFundArgs_IersStds1992(const SgMJD &tEpoch, double args[5])
#define SEC2RAD
radians to arc seconds:
double signum(const double x)
#define DEG2SEC
hours to radians:
double at(DIRECTION i) const