52 static const double fc[][5] = {
53 {134.96340251, 1717915923.2178, 31.8792, 0.051635, -0.00024470},
54 {357.52910918, 129596581.0481, -0.5532, 0.000136, -0.00001149},
55 {93.27209062, 1739527262.8478, -12.7512, -0.001037, 0.00000417},
56 {297.85019547, 1602961601.2090, -6.3706, 0.006593, -0.00003169},
57 {125.04455501, -6962890.2665, 7.4722, 0.007702, -0.00005939}};
61 for (tt[0] = t, i = 1; i < 4; i++) {
62 tt[i] = tt[i - 1] * t;
64 for (i = 0; i < 5; i++) {
65 f[i] = fc[i][0] * 3600.0;
66 for (j = 0; j < 4; j++) {
67 f[i] += fc[i][j + 1] * tt[j];
69 f[i] = fmod(f[i] *
AS2R, 2.0 *
PI);
79 const double ep2000[] = {2000, 1, 1, 12, 0, 0};
80 double t, f[5], eps, Ms, ls, rs, lm, pm, rm, sine, cose, sinp, cosp, sinl, cosl;
90 eps = 23.439291 - 0.0130042 * t;
91 sine = sin(eps *
D2R);
92 cose = cos(eps *
D2R);
96 Ms = 357.5277233 + 35999.05034 * t;
97 ls = 280.460 + 36000.770 * t + 1.914666471 * sin(Ms *
D2R) + 0.019994643 * sin(2.0 * Ms *
D2R);
98 rs =
AU * (1.000140612 - 0.016708617 * cos(Ms *
D2R) - 0.000139589 * cos(2.0 * Ms *
D2R));
100 cosl = cos(ls *
D2R);
102 rsun[1] = rs * cose * sinl;
103 rsun[2] = rs * sine * sinl;
105 trace(NULL, 5,
"rsun =%.3f %.3f %.3f\n", rsun[0], rsun[1], rsun[2]);
109 lm = 218.32 + 481267.883 * t + 6.29 * sin(f[0]) - 1.27 * sin(f[0] - 2.0 * f[3]) + 0.66 * sin(2.0 * f[3]) +
110 0.21 * sin(2.0 * f[0]) - 0.19 * sin(f[1]) - 0.11 * sin(2.0 * f[2]);
111 pm = 5.13 * sin(f[2]) + 0.28 * sin(f[0] + f[2]) - 0.28 * sin(f[2] - f[0]) - 0.17 * sin(f[2] - 2.0 * f[3]);
112 rm =
RE_WGS84 / sin((0.9508 + 0.0518 * cos(f[0]) + 0.0095 * cos(f[0] - 2.0 * f[3]) + 0.0078 * cos(2.0 * f[3]) +
113 0.0028 * cos(2.0 * f[0])) *
115 sinl = sin(lm *
D2R);
116 cosl = cos(lm *
D2R);
117 sinp = sin(pm *
D2R);
118 cosp = cos(pm *
D2R);
119 rmoon[0] = rm * cosp * cosl;
120 rmoon[1] = rm * (cose * cosp * sinl - sine * sinp);
121 rmoon[2] = rm * (sine * cosp * sinl + cose * sinp);
123 trace(NULL, 5,
"rmoon=%.3f %.3f %.3f\n", rmoon[0], rmoon[1], rmoon[2]);
135extern void sunmoonpos(
gtime_t tutc,
const double* erpv,
double* rsun,
double* rmoon,
double* gmst) {
137 double rs[3], rm[3], U[9], gmst_;
151 matmul(
"NN", 3, 1, 3, 1.0, U, rs, 0.0, rsun);
154 matmul(
"NN", 3, 1, 3, 1.0, U, rm, 0.0, rmoon);
void sunmoonpos(gtime_t tutc, const double *erpv, double *rsun, double *rmoon, double *gmst)
Compute sun and moon position in ECEF.
void eci2ecef(gtime_t tutc, const double *erpv, double *U, double *gmst)
Compute ECI to ECEF transformation matrix.
void matmul(const char *tr, int n, int k, int m, double alpha, const double *A, const double *B, double beta, double *C)
Multiply matrix by matrix (C = alpha*A*B + beta*C).