static void mean_elements() { double fracT = fmod(T, 1); /* Mean anomaly of sun = l' (J. Laskar) */ /*M = mods3600(129596581.038354 * T + 1287104.76154);*/ M = mods3600(129600000.0 * fracT - 3418.961646 * T + 1287104.76154); M += (((((((( 1.62e-20 * T - 1.0390e-17 ) * T - 3.83508e-15 ) * T + 4.237343e-13 ) * T + 8.8555011e-11 ) * T - 4.77258489e-8 ) * T - 1.1297037031e-5 ) * T + 1.4732069041e-4 ) * T - 0.552891801772 ) * T2; #ifdef MOSH_MOON_200 /* Mean distance of moon from its ascending node = F */ NF = mods3600( 1739527263.0983 * T + 335779.55755 ); /* Mean anomaly of moon = l */ MP = mods3600( 1717915923.4728 * T + 485868.28096 ); /* Mean elongation of moon = D */ D = mods3600( 1602961601.4603 * T + 1072260.73512 ); /* Mean longitude of moon */ LP = mods3600( 1732564372.83264 * T + 785939.95571 ); /* Higher degree secular terms found by least squares fit */ NF += (((((z[5] *T+z[4] )*T + z[3] )*T + z[2] )*T + z[1] )*T + z[0] )*T2; MP += (((((z[11]*T+z[10])*T + z[9] )*T + z[8] )*T + z[7] )*T + z[6] )*T2; D += (((((z[17]*T+z[16])*T + z[15])*T + z[14])*T + z[13])*T + z[12])*T2; LP += (((((z[23]*T+z[22])*T + z[21])*T + z[20])*T + z[19])*T + z[18])*T2; #else /* Mean distance of moon from its ascending node = F */ /*NF = mods3600((1739527263.0983 - 2.079419901760e-01) * T + 335779.55755);*/ NF = mods3600(1739232000.0 * fracT + 295263.0983 * T - 2.079419901760e-01 * T + 335779.55755); /* Mean anomaly of moon = l */ /*MP = mods3600((1717915923.4728 - 2.035946368532e-01) * T + 485868.28096);*/ MP = mods3600(1717200000.0 * fracT + 715923.4728 * T - 2.035946368532e-01 * T + 485868.28096); /* Mean elongation of moon = D */ /*D = mods3600((1602961601.4603 + 3.962893294503e-01) * T + 1072260.73512);*/ D = mods3600(1601856000.0 * fracT + 1105601.4603 * T + 3.962893294503e-01 * T + 1072260.73512); /* Mean longitude of moon, referred to the mean ecliptic and equinox of date */ /*LP = mods3600((1732564372.83264 - 6.784914260953e-01) * T + 785939.95571);*/ LP = mods3600(1731456000.0 * fracT + 1108372.83264 * T - 6.784914260953e-01 * T + 785939.95571); /* Higher degree secular terms found by least squares fit */ NF += ((z[2]*T + z[1])*T + z[0])*T2; MP += ((z[5]*T + z[4])*T + z[3])*T2; D += ((z[8]*T + z[7])*T + z[6])*T2; LP += ((z[11]*T + z[10])*T + z[9])*T2; #endif /* ! MOSH_MOON_200 */ /* sensitivity of mean elements * delta argument = scale factor times delta amplitude (arcsec) * cos l 9.0019 = mean eccentricity * cos 2D 43.6 * cos F 11.2 (latitude term) */ }
int swi_moshplan2 (double J, int iplm, double *pobj) { int i, j, k, m, k1, ip, np, nt; signed char FAR *p; double FAR *pl, *pb, *pr; double su, cu, sv, cv, T; double t, sl, sb, sr; struct plantbl *plan = planets[iplm]; T = (J - J2000) / TIMESCALE; /* Calculate sin( i*MM ), etc. for needed multiple angles. */ for (i = 0; i < 9; i++) { if ((j = plan->max_harmonic[i]) > 0) { sr = (mods3600 (freqs[i] * T) + phases[i]) * STR; sscc (i, sr, j); } } /* Point to start of table of arguments. */ p = plan->arg_tbl; /* Point to tabulated cosine and sine amplitudes. */ pl = plan->lon_tbl; pb = plan->lat_tbl; pr = plan->rad_tbl; sl = 0.0; sb = 0.0; sr = 0.0; for (;;) { /* argument of sine and cosine */ /* Number of periodic arguments. */ np = *p++; if (np < 0) break; if (np == 0) { /* It is a polynomial term. */ nt = *p++; /* Longitude polynomial. */ cu = *pl++; for (ip = 0; ip < nt; ip++) { cu = cu * T + *pl++; } sl += mods3600 (cu); /* Latitude polynomial. */ cu = *pb++; for (ip = 0; ip < nt; ip++) { cu = cu * T + *pb++; } sb += cu; /* Radius polynomial. */ cu = *pr++; for (ip = 0; ip < nt; ip++) { cu = cu * T + *pr++; } sr += cu; continue; } k1 = 0; cv = 0.0; sv = 0.0; for (ip = 0; ip < np; ip++) { /* What harmonic. */ j = *p++; /* Which planet. */ m = *p++ - 1; if (j) { k = j; if (j < 0) k = -k; k -= 1; su = ss[m][k]; /* sin(k*angle) */ if (j < 0) su = -su; cu = cc[m][k]; if (k1 == 0) { /* set first angle */ sv = su; cv = cu; k1 = 1; } else { /* combine angles */ t = su * cv + cu * sv; cv = cu * cv - su * sv; sv = t; } } } /* Highest power of T. */ nt = *p++; /* Longitude. */ cu = *pl++; su = *pl++; for (ip = 0; ip < nt; ip++) { cu = cu * T + *pl++; su = su * T + *pl++; } sl += cu * cv + su * sv; /* Latitiude. */ cu = *pb++; su = *pb++; for (ip = 0; ip < nt; ip++) { cu = cu * T + *pb++; su = su * T + *pb++; } sb += cu * cv + su * sv; /* Radius. */ cu = *pr++; su = *pr++; for (ip = 0; ip < nt; ip++) { cu = cu * T + *pr++; su = su * T + *pr++; } sr += cu * cv + su * sv; } pobj[0] = STR * sl; pobj[1] = STR * sb; pobj[2] = STR * plan->distance * sr + plan->distance; return OK; }
static int dargs (double J, struct plantbl *plan) { double T2, w; if (J == Jlast) return 0; T = (J - JD2000) / 36525.0; T2 = T * T; /* Mean anomaly of sun = l' (J. Laskar) */ w = mods3600 (129596581.038354 * T + 1287104.76154); w += (((((((( 1.62e-20 * T - 1.0390e-17) * T - 3.83508e-15) * T + 4.237343e-13) * T + 8.8555011e-11) * T - 4.77258489e-8) * T - 1.1297037031e-5) * T + 1.4732069041e-4) * T - 0.552891801772) * T2; sscc (10, STR * w, plan->max_harmonic[10]); /* Mean distance of moon from its ascending node = F */ w = mods3600 ((1739527263.0983 - 2.079419901760e-01) * T + 335779.55755); w = w + ((-9.646018347184e-06 * T2 /* F, t^4 */ - 1.138215912580e-03) * T /* F, t^3 */ - 1.312045233711e+01) * T; /* F, t^2 */ sscc (11, STR * w, plan->max_harmonic[11]); /* Mean anomaly of moon = l */ w = mods3600 ((1717915923.4728 - 2.035946368532e-01) * T + 485868.28096); w = w + ((-3.421689790404e-04 * T2 /* l, t^4 */ + 4.768357585780e-02) * T /* l, t^3 */ + 3.146734198839e+01) * T; /* l, t^2 */ sscc (9, STR * w, plan->max_harmonic[9]); /* Mean elongation of moon = D */ w = mods3600 ((1602961601.4603 + 3.962893294503e-01) * T + 1072260.73512); w = w + ((-2.905334122698e-04 * T2 /* D, t^4 */ - 5.834100476561e-03) * T /* D, t^3 */ - 6.847070905410e+00) * T; /* D, t^2 */ sscc (12, STR * w, plan->max_harmonic[12]); /* Mean longitude of moon, re mean ecliptic and equinox of date */ w = mods3600 ((1732564372.83264 - 6.784914260953e-01) * T + 785939.95571); w = w + ((-8.466472828815e-05 * T2 /* L, t^4 */ + 5.722859298199e-03) * T /* L, t^3 */ - 5.663161722088e+00) * T; /* L, t^2 */ sscc (13, STR * w, plan->max_harmonic[13]); /* Mean longitudes of planets (Laskar, Bretagnon) */ /* Venus. */ w = mods3600 (210664136.4335482 * T + 655127.283046); w += (((((((( -9.36e-023 * T - 1.95e-20) * T + 6.097e-18) * T + 4.43201e-15) * T + 2.509418e-13) * T - 3.0622898e-10) * T - 2.26602516e-9) * T - 1.4244812531e-5) * T + 0.005871373088) * T2; sscc (1, STR * w, plan->max_harmonic[1]); /* Earth. */ w = mods3600 (129597742.26669231 * T + 361679.214649); w += ((((((((-1.16e-22 * T + 2.976e-19) * T + 2.8460e-17) * T - 1.08402e-14) * T - 1.226182e-12) * T + 1.7228268e-10) * T + 1.515912254e-7) * T + 8.863982531e-6) * T - 2.0199859001e-2) * T2; sscc (2, STR * w, plan->max_harmonic[2]); /* Mars. */ w = mods3600 (68905077.59284 * T + 1279559.78866); w += (-1.043e-5 * T + 9.38012e-3) * T2; sscc (3, STR * w, plan->max_harmonic[3]); /* Jupiter. */ w = mods3600 (10925660.428608 * T + 123665.342120); w += (1.543273e-5 * T - 3.06037836351e-1) * T2; sscc (4, STR * w, plan->max_harmonic[4]); /* Saturn. */ w = mods3600 (4399609.65932 * T + 180278.89694); w += ((4.475946e-8 * T - 6.874806E-5) * T + 7.56161437443E-1) * T2; sscc (5, STR * w, plan->max_harmonic[5]); return 0; }
static void moon1() { double a; /* Mean longitudes of planets (Laskar, Bretagnon) */ Ve = mods3600( 210664136.4335482 * T + 655127.283046 ); Ve += (((((((( -9.36e-023 * T - 1.95e-20 ) * T + 6.097e-18 ) * T + 4.43201e-15 ) * T + 2.509418e-13 ) * T - 3.0622898e-10 ) * T - 2.26602516e-9 ) * T - 1.4244812531e-5 ) * T + 0.005871373088 ) * T2; Ea = mods3600( 129597742.26669231 * T + 361679.214649 ); Ea += (((((((( -1.16e-22 * T + 2.976e-19 ) * T + 2.8460e-17 ) * T - 1.08402e-14 ) * T - 1.226182e-12 ) * T + 1.7228268e-10 ) * T + 1.515912254e-7 ) * T + 8.863982531e-6 ) * T - 2.0199859001e-2 ) * T2; Ma = mods3600( 68905077.59284 * T + 1279559.78866 ); Ma += (-1.043e-5*T + 9.38012e-3)*T2; Ju = mods3600( 10925660.428608 * T + 123665.342120 ); Ju += (1.543273e-5*T - 3.06037836351e-1)*T2; Sa = mods3600( 4399609.65932 * T + 180278.89694 ); Sa += (( 4.475946e-8*T - 6.874806E-5 ) * T + 7.56161437443E-1)*T2; sscc( 0, STR*D, 6 ); sscc( 1, STR*M, 4 ); sscc( 2, STR*MP, 4 ); sscc( 3, STR*NF, 4 ); moonpol[0] = 0.0; moonpol[1] = 0.0; moonpol[2] = 0.0; /* terms in T^2, scale 1.0 = 10^-5" */ chewm( LRT2, NLRT2, 4, 2, moonpol ); chewm( BT2, NBT2, 4, 4, moonpol ); f = 18 * Ve - 16 * Ea; g = STR*(f - MP ); /* 18V - 16E - l */ cg = cos(g); sg = sin(g); l = 6.367278 * cg + 12.747036 * sg; /* t^0 */ l1 = 23123.70 * cg - 10570.02 * sg; /* t^1 */ l2 = z[24] * cg + z[25] * sg; /* t^2 */ l3 = z[26] * cg + z[27] * sg; /* t^3 */ l4 = z[28] * cg + z[29] * sg; /* t^4 */ moonpol[2] += 5.01 * cg + 2.72 * sg; g = STR * (10.*Ve - 3.*Ea - MP); cg = cos(g); sg = sin(g); l += -0.253102 * cg + 0.503359 * sg; l1 += 1258.46 * cg + 707.29 * sg; l2 += z[30] * cg + z[31] * sg; l3 += z[32] * cg + z[33] * sg; l4 += z[34] * cg + z[35] * sg; g = STR*(8.*Ve - 13.*Ea); cg = cos(g); sg = sin(g); l += -0.187231 * cg - 0.127481 * sg; l1 += -319.87 * cg - 18.34 * sg; l2 += z[36] * cg + z[37] * sg; l3 += z[38] * cg + z[39] * sg; l4 += z[40] * cg + z[41] * sg; a = 4.0*Ea - 8.0*Ma + 3.0*Ju; g = STR * a; cg = cos(g); sg = sin(g); l += -0.866287 * cg + 0.248192 * sg; l1 += 41.87 * cg + 1053.97 * sg; l2 += z[42] * cg + z[43] * sg; g = STR*(a - MP); cg = cos(g); sg = sin(g); l += -0.165009 * cg + 0.044176 * sg; l1 += 4.67 * cg + 201.55 * sg; g = STR*f; /* 18V - 16E */ cg = cos(g); sg = sin(g); l += 0.330401 * cg + 0.661362 * sg; l1 += 1202.67 * cg - 555.59 * sg; l2 += z[44] * cg + z[45] * sg; l3 += z[46] * cg + z[47] * sg; g = STR*(f - 2.0*MP ); /* 18V - 16E - 2l */ cg = cos(g); sg = sin(g); l += 0.352185 * cg + 0.705041 * sg; l1 += 1283.59 * cg - 586.43 * sg; l2 += z[48] * cg + z[49] * sg; l3 += z[50] * cg + z[51] * sg; g = STR * (2.0*Ju - 5.0*Sa); cg = cos(g); sg = sin(g); l += -0.034700 * cg + 0.160041 * sg; l2 += z[52] * cg + z[53] * sg; g = STR * (LP - NF); cg = cos(g); sg = sin(g); l += 0.000116 * cg + 7.063040 * sg; l1 += 298.8 * sg; l2 += z[54] * cg + z[55] * sg; /* T^3 terms */ sg = sin( STR * M ); l3 += z[56] * sg; l4 += z[57] * sg; g = STR * (2.0*D - M); sg = sin(g); cg = cos(g); l3 += z[58] * sg; l4 += z[59] * sg; moonpol[2] += -0.2655 * cg * T; g = g - STR * MP; sg = sin(g); l3 += z[60] * sg; l4 += z[61] * sg; g = STR * (M - MP); l3 += z[62] * sin( g ); moonpol[2] += -0.1568 * cos( g ) * T; g = STR * (M + MP); l3 += z[63] * sin( g ); moonpol[2] += 0.1309 * cos( g ) * T; g = STR * 2.0 * (D - M); sg = sin(g); l3 += z[64] * sg; l4 += z[65] * sg; g = STR * 2.0 * M; sg = sin(g); l3 += z[66] * sg; l4 += z[67] * sg; g = STR * (2.0*D - MP); sg = sin(g); l3 += z[68] * sg; g = STR * (2.0*(D - M) - MP); sg = sin(g); l3 += z[69] * sg; g = STR * (2.0*(D + M) - MP); sg = sin(g); cg = cos(g); l3 += z[70] * sg; moonpol[2] += 0.5568 * cg * T; l2 += moonpol[0]; g = STR*(2.0*D - M - MP); moonpol[2] += -0.1910 * cos( g ) * T; moonpol[1] *= T; moonpol[2] *= T; /* terms in T */ moonpol[0] = 0.0; chewm( BT, NBT, 4, 4, moonpol ); chewm( LRT, NLRT, 4, 1, moonpol ); g = STR*(f - MP - NF - 2355767.6); /* 18V - 16E - l - F */ moonpol[1] += -1127. * sin(g); g = STR*(f - MP + NF - 235353.6); /* 18V - 16E - l + F */ moonpol[1] += -1123. * sin(g); g = STR*(Ea + D + 51987.6); moonpol[1] += 1303. * sin(g); g = STR*LP; moonpol[1] += 342. * sin(g); g = STR*(2.*Ve - 3.*Ea); cg = cos(g); sg = sin(g); l += -0.343550 * cg - 0.000276 * sg; l1 += 105.90 * cg + 336.53 * sg; g = STR*(f - 2.*D); /* 18V - 16E - 2D */ cg = cos(g); sg = sin(g); l += 0.074668 * cg + 0.149501 * sg; l1 += 271.77 * cg - 124.20 * sg; g = STR*(f - 2.*D - MP); cg = cos(g); sg = sin(g); l += 0.073444 * cg + 0.147094 * sg; l1 += 265.24 * cg - 121.16 * sg; g = STR*(f + 2.*D - MP); cg = cos(g); sg = sin(g); l += 0.072844 * cg + 0.145829 * sg; l1 += 265.18 * cg - 121.29 * sg; g = STR*(f + 2.*(D - MP)); cg = cos(g); sg = sin(g); l += 0.070201 * cg + 0.140542 * sg; l1 += 255.36 * cg - 116.79 * sg; g = STR*(Ea + D - NF); cg = cos(g); sg = sin(g); l += 0.288209 * cg - 0.025901 * sg; l1 += -63.51 * cg - 240.14 * sg; g = STR*(2.*Ea - 3.*Ju + 2.*D - MP); cg = cos(g); sg = sin(g); l += 0.077865 * cg + 0.438460 * sg; l1 += 210.57 * cg + 124.84 * sg; g = STR*(Ea - 2.*Ma); cg = cos(g); sg = sin(g); l += -0.216579 * cg + 0.241702 * sg; l1 += 197.67 * cg + 125.23 * sg; g = STR*(a + MP); cg = cos(g); sg = sin(g); l += -0.165009 * cg + 0.044176 * sg; l1 += 4.67 * cg + 201.55 * sg; g = STR*(a + 2.*D - MP); cg = cos(g); sg = sin(g); l += -0.133533 * cg + 0.041116 * sg; l1 += 6.95 * cg + 187.07 * sg; g = STR*(a - 2.*D + MP); cg = cos(g); sg = sin(g); l += -0.133430 * cg + 0.041079 * sg; l1 += 6.28 * cg + 169.08 * sg; g = STR*(3.*Ve - 4.*Ea); cg = cos(g); sg = sin(g); l += -0.175074 * cg + 0.003035 * sg; l1 += 49.17 * cg + 150.57 * sg; g = STR*(2.*(Ea + D - MP) - 3.*Ju + 213534.); l1 += 158.4 * sin(g); l1 += moonpol[0]; a = 0.1 * T; /* set amplitude scale of 1.0 = 10^-4 arcsec */ moonpol[1] *= a; moonpol[2] *= a; }
/* Compute final ecliptic polar coordinates */ static void moon4() { moonpol[2] /= AUNIT / 1000; moonpol[0] = STR * mods3600( moonpol[0] ); moonpol[1] = STR * moonpol[1]; }