165 static const double GK = 0.017202098950;
168 static const double SINEPS = 0.3977771559319137;
169 static const double COSEPS = 0.9174820620691818;
172 static const int KMAX = 10;
175 double t, da, dl, de, dp, di, dom, dmu, arga, argl, am,
176 ae, dae, ae2, at, r, v, si2, xq, xp, tl, xsw,
177 xcw, xm2, xf, ci2, xms, xmc, xpxq2, x, y, z;
180 static const double amas[] = { 6023600.0,
200 static const double a[][3] = {
201 { 0.3870983098, 0.0, 0.0 },
202 { 0.7233298200, 0.0, 0.0 },
203 { 1.0000010178, 0.0, 0.0 },
204 { 1.5236793419, 3e-10, 0.0 },
205 { 5.2026032092, 19132e-10, -39e-10 },
206 { 9.5549091915, -0.0000213896, 444e-10 },
207 { 19.2184460618, -3716e-10, 979e-10 },
208 { 30.1103868694, -16635e-10, 686e-10 }
211 static const double dlm[][3] = {
212 { 252.25090552, 5381016286.88982, -1.92789 },
213 { 181.97980085, 2106641364.33548, 0.59381 },
214 { 100.46645683, 1295977422.83429, -2.04411 },
215 { 355.43299958, 689050774.93988, 0.94264 },
216 { 34.35151874, 109256603.77991, -30.60378 },
217 { 50.07744430, 43996098.55732, 75.61614 },
218 { 314.05500511, 15424811.93933, -1.75083 },
219 { 304.34866548, 7865503.20744, 0.21103 }
222 static const double e[][3] = {
223 { 0.2056317526, 0.0002040653, -28349e-10 },
224 { 0.0067719164, -0.0004776521, 98127e-10 },
225 { 0.0167086342, -0.0004203654, -0.0000126734 },
226 { 0.0934006477, 0.0009048438, -80641e-10 },
227 { 0.0484979255, 0.0016322542, -0.0000471366 },
228 { 0.0555481426, -0.0034664062, -0.0000643639 },
229 { 0.0463812221, -0.0002729293, 0.0000078913 },
230 { 0.0094557470, 0.0000603263, 0.0 }
233 static const double pi[][3] = {
234 { 77.45611904, 5719.11590, -4.83016 },
235 { 131.56370300, 175.48640, -498.48184 },
236 { 102.93734808, 11612.35290, 53.27577 },
237 { 336.06023395, 15980.45908, -62.32800 },
238 { 14.33120687, 7758.75163, 259.95938 },
239 { 93.05723748, 20395.49439, 190.25952 },
240 { 173.00529106, 3215.56238, -34.09288 },
241 { 48.12027554, 1050.71912, 27.39717 }
244 static const double dinc[][3] = {
245 { 7.00498625, -214.25629, 0.28977 },
246 { 3.39466189, -30.84437, -11.67836 },
247 { 0.0, 469.97289, -3.35053 },
248 { 1.84972648, -293.31722, -8.11830 },
249 { 1.30326698, -71.55890, 11.95297 },
250 { 2.48887878, 91.85195, -17.66225 },
251 { 0.77319689, -60.72723, 1.25759 },
252 { 1.76995259, 8.12333, 0.08135 }
255 static const double omega[][3] = {
256 { 48.33089304, -4515.21727, -31.79892 },
257 { 76.67992019, -10008.48154, -51.32614 },
258 { 174.87317577, -8679.27034, 15.34191 },
259 { 49.55809321, -10620.90088, -230.57416 },
260 { 100.46440702, 6362.03561, 326.52178 },
261 { 113.66550252, -9240.19942, -66.23743 },
262 { 74.00595701, 2669.15033, 145.93964 },
263 { 131.78405702, -221.94322, -0.78728 }
269 static const double kp[][9] = {
270 { 69613, 75645, 88306, 59899, 15746, 71087, 142173, 3086, 0 },
271 { 21863, 32794, 26934, 10931, 26250, 43725, 53867, 28939, 0 },
272 { 16002, 21863, 32004, 10931, 14529, 16368, 15318, 32794, 0 },
273 { 6345, 7818, 15636, 7077, 8184, 14163, 1107, 4872, 0 },
274 { 1760, 1454, 1167, 880, 287, 2640, 19, 2047, 1454 },
275 { 574, 0, 880, 287, 19, 1760, 1167, 306, 574 },
276 { 204, 0, 177, 1265, 4, 385, 200, 208, 204 },
277 { 0, 102, 106, 4, 98, 1367, 487, 204, 0 }
280 static const double ca[][9] = {
281 { 4, -13, 11, -9, -9, -3, -1, 4, 0 },
282 { -156, 59, -42, 6, 19, -20, -10, -12, 0 },
283 { 64, -152, 62, -8, 32, -41, 19, -11, 0 },
284 { 124, 621, -145, 208, 54, -57, 30, 15, 0 },
285 { -23437, -2634, 6601, 6259, -1507,-1821, 2620, -2115, -1489 },
286 { 62911,-119919, 79336,17814,-24241,12068, 8306, -4893, 8902 },
287 { 389061,-262125,-44088, 8387,-22976,-2093, -615, -9720, 6633 },
288 { -412235,-157046,-31430,37817, -9740, -13, -7449, 9644, 0 }
291 static const double sa[][9] = {
292 { -29, -1, 9, 6, -6, 5, 4, 0, 0 },
293 { -48, -125, -26, -37, 18, -13, -20, -2, 0 },
294 { -150, -46, 68, 54, 14, 24, -28, 22, 0 },
295 { -621, 532, -694, -20, 192, -94, 71, -73, 0 },
296 { -14614,-19828, -5869, 1881, -4372, -2255, 782, 930, 913 },
297 { 139737, 0, 24667, 51123, -5102, 7429, -4095, -1976, -9566 },
298 { -138081, 0, 37205,-49039,-41901,-33872,-27037,-12474, 18797 },
299 { 0, 28492,133236, 69654, 52322,-49577,-26430, -3593, 0 }
305 static const double kq[][10] = {
306 { 3086,15746,69613,59899,75645,88306, 12661, 2658, 0, 0 },
307 { 21863,32794,10931, 73, 4387,26934, 1473, 2157, 0, 0 },
308 { 10,16002,21863,10931, 1473,32004, 4387, 73, 0, 0 },
309 { 10, 6345, 7818, 1107,15636, 7077, 8184, 532, 10, 0 },
310 { 19, 1760, 1454, 287, 1167, 880, 574, 2640, 19, 1454 },
311 { 19, 574, 287, 306, 1760, 12, 31, 38, 19, 574 },
312 { 4, 204, 177, 8, 31, 200, 1265, 102, 4, 204 },
313 { 4, 102, 106, 8, 98, 1367, 487, 204, 4, 102 }
316 static const double cl[][10] = {
317 { 21, -95, -157, 41, -5, 42, 23, 30, 0, 0 },
318 { -160, -313, -235, 60, -74, -76, -27, 34, 0, 0 },
319 { -325, -322, -79, 232, -52, 97, 55, -41, 0, 0 },
320 { 2268, -979, 802, 602, -668, -33, 345, 201, -55, 0 },
321 { 7610, -4997,-7689,-5841,-2617, 1115,-748,-607, 6074, 354 },
322 { -18549, 30125,20012, -730, 824, 23,1289,-352, -14767, -2062 },
323 { -135245,-14594, 4197,-4030,-5630,-2898,2540,-306, 2939, 1986 },
324 { 89948, 2103, 8963, 2695, 3682, 1648, 866,-154, -1963, -283 }
327 static const double sl[][10] = {
328 { -342, 136, -23, 62, 66, -52, -33, 17, 0, 0 },
329 { 524, -149, -35, 117, 151, 122, -71, -62, 0, 0 },
330 { -105, -137, 258, 35, -116, -88,-112, -80, 0, 0 },
331 { 854, -205, -936, -240, 140, -341, -97, -232, 536, 0 },
332 { -56980, 8016, 1012, 1448,-3024,-3710, 318, 503, 3767, 577 },
333 { 138606,-13478,-4964, 1441,-1319,-1482, 427, 1236, -9167, -1918 },
334 { 71234,-41116, 5334,-4935,-1848, 66, 434, -1748, 3780, -701 },
335 { -47645, 11647, 2166, 3194, 679, 0,-244, -419, -2531, 48 }
341 if ((np < 1) || (np > 8)) {
345 for (k = 0; k < 2; k++) {
346 for (i = 0; i < 3; i++) {
360 jstat = fabs(t) <= 1.0 ? 0 : 1;
366 dl = (3600.0 * dlm[np][0] +
372 dp =
eraAnpm((3600.0 * pi[np][0] +
375 di = (3600.0 * dinc[np][0] +
378 dom =
eraAnpm((3600.0 * omega[np][0] +
383 dmu = 0.35953620 *
t;
384 for (k = 0; k < 8; k++) {
385 arga = kp[np][k] * dmu;
386 argl = kq[np][k] * dmu;
387 da += (ca[np][k] * cos(arga) +
388 sa[np][k] * sin(arga)) * 1e-7;
389 dl += (cl[np][k] * cos(argl) +
390 sl[np][k] * sin(argl)) * 1e-7;
392 arga = kp[np][8] * dmu;
393 da += t * (ca[np][8] * cos(arga) +
394 sa[np][8] * sin(arga)) * 1e-7;
395 for (k = 8; k < 10; k++) {
396 argl = kq[np][k] * dmu;
397 dl += t * (cl[np][k] * cos(argl) +
398 sl[np][k] * sin(argl)) * 1e-7;
404 ae = am + de * sin(am);
407 while (k < KMAX && fabs(dae) > 1e-12) {
408 dae = (am - ae + de * sin(ae)) / (1.0 - de * cos(ae));
411 if (k == KMAX-1) jstat = 2;
416 at = 2.0 * atan2(sqrt((1.0 + de) / (1.0 - de)) * sin(ae2),
420 r = da * (1.0 - de * cos(ae));
421 v = GK * sqrt((1.0 + 1.0 / amas[np]) / (da * da * da));
429 xm2 = 2.0 * (xp * xcw - xq * xsw);
430 xf = da / sqrt(1 - de * de);
432 xms = (de * sin(dp) + xsw) * xf;
433 xmc = (de * cos(dp) + xcw) * xf;
437 x = r * (xcw - xm2 * xp);
438 y = r * (xsw + xm2 * xq);
439 z = r * (-xm2 * ci2);
443 pv[0][1] = y * COSEPS - z * SINEPS;
444 pv[0][2] = y * SINEPS + z * COSEPS;
447 x = v * (( -1.0 + 2.0 * xp * xp) * xms + xpxq2 * xmc);
448 y = v * (( 1.0 - 2.0 * xq * xq) * xmc - xpxq2 * xms);
449 z = v * (2.0 * ci2 * (xp * xms + xq * xmc));
453 pv[1][1] = y * COSEPS - z * SINEPS;
454 pv[1][2] = y * SINEPS + z * COSEPS;