home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume11 / starchart / part15 < prev    next >
Encoding:
Text File  |  1990-03-25  |  30.9 KB  |  1,131 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v11i043: starchart 3.2 Part 15/32
  3. from: ccount@ATHENA.MIT.EDU
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 11, Issue 43
  7. Submitted-by: ccount@ATHENA.MIT.EDU
  8. Archive-name: starchart/part15
  9.  
  10. #! /bin/sh
  11. # This is a shell archive.  Remove anything before this line, then unpack
  12. # it by saving it into a file and typing "sh file".  To overwrite existing
  13. # files, type "sh file -c".  You can also feed this as standard input via
  14. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  15. # will see the following message at the end:
  16. #        "End of archive 15 (of 32)."
  17. # Contents:  observe/planetcalc.c
  18. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  19. if test -f 'observe/planetcalc.c' -a "${1}" != "-c" ; then 
  20.   echo shar: Will not clobber existing file \"'observe/planetcalc.c'\"
  21. else
  22. echo shar: Extracting \"'observe/planetcalc.c'\" \(28915 characters\)
  23. sed "s/^X//" >'observe/planetcalc.c' <<'END_OF_FILE'
  24. X/*
  25. X * planetcalc.c
  26. X * planetary positions calculations
  27. X *
  28. X * Copyright (c) 1990 by Craig Counterman. All rights reserved.
  29. X *
  30. X * This software may be redistributed freely, not sold.
  31. X * This copyright notice and disclaimer of warranty must remain
  32. X *    unchanged. 
  33. X *
  34. X * No representation is made about the suitability of this
  35. X * software for any purpose.  It is provided "as is" without express or
  36. X * implied warranty, to the extent permitted by applicable law.
  37. X *
  38. X */
  39. X
  40. X#ifndef  lint
  41. Xstatic char rcsid[] =
  42. X  "$Header: planetcalc.c,v 1.7 90/02/19 17:21:21 ccount Exp $";
  43. X#endif
  44. X
  45. X
  46. X#include <stdio.h>
  47. X#include <math.h>
  48. X#include "observe.h"
  49. X#include "degree.h"
  50. X
  51. Xstatic double M_sun(), M_1(), M_2(), M_4(), M_5(), M_6();
  52. X
  53. X/* Approximate M for each planet 
  54. X   from Meeus, chapter 25 */
  55. X
  56. Xstatic double M_sun(jd)
  57. Xdouble jd;
  58. X{
  59. X  double T;
  60. X
  61. X  T = (jd - 2415020.0)/36525.0;
  62. X
  63. X  return into_range(358.47583 + 35999.04975*T - 0.000150*T*T -0.0000033*T*T*T);
  64. X}
  65. X
  66. Xstatic double M_1(jd)
  67. Xdouble jd;
  68. X{
  69. X  double T;
  70. X
  71. X  T = (jd - 2415020.0)/36525.0;
  72. X
  73. X  return into_range(102.27938 + 149472.51529*T + 0.000007*T*T);
  74. X}
  75. X
  76. Xstatic double M_2(jd)
  77. Xdouble jd;
  78. X{
  79. X  double T;
  80. X
  81. X  T = (jd - 2415020.0)/36525.0;
  82. X
  83. X  return into_range(212.60322 + 58517.80387*T +0.001286*T*T);
  84. X}
  85. X
  86. Xstatic double M_4(jd)
  87. Xdouble jd;
  88. X{
  89. X  double T;
  90. X
  91. X  T = (jd - 2415020.0)/36525.0;
  92. X
  93. X  return into_range(319.51913 + 19139.85475*T + 0.000181*T*T);
  94. X}
  95. X
  96. Xstatic double M_5(jd)
  97. Xdouble jd;
  98. X{
  99. X  double T;
  100. X
  101. X  T = (jd - 2415020.0)/36525.0;
  102. X
  103. X  return into_range(225.32833 + 3034.69202*T - 0.000722*T*T);
  104. X}
  105. X
  106. Xstatic double M_6(jd)
  107. Xdouble jd;
  108. X{
  109. X  double T;
  110. X
  111. X  T = (jd - 2415020.0)/36525.0;
  112. X
  113. X  return into_range(175.46622 +1221.55147*T - 0.000502*T*T);
  114. X}
  115. X
  116. Xstatic char *planet_name[] = {
  117. X  "Mercury",
  118. X  "Venus",
  119. X  "Mars",
  120. X  "Jupiter",
  121. X  "Saturn",
  122. X  "Uranus",
  123. X  "Neptune"
  124. X};
  125. X
  126. Xstatic char *planet_type[] = {
  127. X  "PM",
  128. X  "PV",
  129. X  "Pm",
  130. X  "PJ",
  131. X  "Ps",
  132. X  "PU",
  133. X  "PN"
  134. X};
  135. X
  136. Xstatic char *planet_colr[] = {
  137. X  "r9",
  138. X  "w9",
  139. X  "r9",
  140. X  "w9",
  141. X  "y9",
  142. X  "g9",
  143. X  "c9"
  144. X};
  145. X
  146. Xtypedef struct {
  147. X  double L[4];
  148. X  double a;
  149. X  double e[4];
  150. X  double i[4];
  151. X  double omega[4];
  152. X  double Omega[4];
  153. X  double size_1au;
  154. X  double mag0;
  155. X} pelements;
  156. X
  157. Xpelements peles[] = {
  158. X  {   /* Mercury */
  159. X    {178.179078, 149474.07078, 3.011e-4, 0.0},
  160. X    0.3870986,
  161. X    {.20561421, 2.046e-5, 3e-8,  0.0},
  162. X    {7.002881, 1.8608e-3, -1.83e-5, 0.0},
  163. X    {28.753753, 0.3702806, 0.0001208, 0.0},
  164. X    {47.145944, 1.1852083, 1.739e-4, 0.0},
  165. X    6.74,
  166. X    -0.42
  167. X    },
  168. X  {   /* Venus */
  169. X    {342.767053, 58519.21191, 0.0003097, 0.0},
  170. X    0.7233316,
  171. X    {0.00682069, -0.00004774, 0.000000091, 0.0},
  172. X    {3.393631, 0.0010058, -0.0000010, 0.0},
  173. X    {54.384186, 0.5081861, -0.0013864, 0.0},
  174. X    {75.779647, 0.8998500, 0.0004100, 0.0},
  175. X    16.92,
  176. X    -4.4
  177. X    },
  178. X  {   /* Mars */
  179. X    {293.737334, 19141.69551, 0.0003107, 0.0},
  180. X    1.5236883,
  181. X    {0.09331290, 0.000092064, -0.000000077, 0.0},
  182. X    {1.850333, -0.0006750, 0.0000126, 0.0},
  183. X    {285.431761, 1.0697667, 0.0001313, 0.00000414},
  184. X    {48.786442, 0.7709917, -0.0000014, -0.00000533},
  185. X    9.36,
  186. X    -1.52
  187. X    },
  188. X  {   /* Jupiter */
  189. X    {238.049257, 3036.301986, 0.0003347, -0.00000165},
  190. X    5.202561,
  191. X    {0.04833475, 0.000164180, -0.0000004676, -0.0000000017},
  192. X    {1.308736, -0.0056961, 0.0000039, 0.0},
  193. X    {273.277558, 0.5994317, 0.00070405, 0.00000508},
  194. X    {99.443414, 1.0105300, 0.00035222, -0.00000851},
  195. X    196.74,
  196. X    -9.4
  197. X    },
  198. X  {   /* Saturn */
  199. X    {266.564377, 1223.509884, 0.0003245, -0.0000058},
  200. X    9.554747,
  201. X    {0.05589232, -0.00034550, -0.000000728, 0.00000000074},
  202. X    {2.492519, -0.0039189, -0.00001549, 0.00000004},
  203. X    {338.307800, 1.0852207, 0.00097854, 0.00000992},
  204. X    {112.790414, 0.8731951, -0.00015218, -0.00000531},
  205. X    165.6,
  206. X    -8.88
  207. X    },
  208. X  {   /* Uranus */
  209. X    {244.197470, 429.863546, 0.0003160, -0.00000060},
  210. X    19.21814,
  211. X    {0.0463444, -0.00002658, 0.000000077, 0.0},
  212. X    {0.772464, 0.0006253, 0.0000395, 0.0},
  213. X    {98.071581, 0.9857650, -0.0010745, -0.00000061},
  214. X    {73.477111, 0.4986678, 0.0013117, 0.0},
  215. X    65.8,
  216. X    -7.19
  217. X    },
  218. X  {   /* Neptune */
  219. X    {84.457994, 219.885914, 0.0003205, -0.00000060},
  220. X    30.10957,
  221. X    {0.00899704, 0.000006330, -0.000000002, 0.0},
  222. X    {1.779242, -0.0095436, -0.0000091, 0.0},
  223. X    {276.045975, 0.3256394, 0.00014095, 0.000004113},
  224. X    {130.681389, 1.0989350, 0.00024987, -0.000004718},
  225. X    62.2,
  226. X    -6.87
  227. X    }
  228. X};
  229. X
  230. Xtypedef struct {
  231. X  double alpha_1, delta_1;
  232. X  double W_0, W_dot;
  233. X} rot_els_t;
  234. Xrot_els_t rot_els[] = {
  235. X  {                /* Mercury */
  236. X    280.98, 61.44,
  237. X    142.14, 6.13850
  238. X    },
  239. X  {                /* Venus */
  240. X    272.78, 67.21,
  241. X    353.00, -1.48142
  242. X    },
  243. X  {                /* Mars */
  244. X    317.61, 52.85,
  245. X    237.21, 350.89198
  246. X    },
  247. X  {                /* Jupiter III */
  248. X    268.04, 64.49,
  249. X    156.03, 870.53600
  250. X    },
  251. X  {                /* Saturn III */
  252. X    40.09, 83.49,
  253. X    223.60, 810.79390
  254. X    },
  255. X  {                /* Uranus */
  256. X    257.27, -15.09,
  257. X    287.17, -499.42197
  258. X    },
  259. X  {                /* Neptune */
  260. X    295.24, 40.62,
  261. X    315.33, 468.75000
  262. X    }
  263. X};
  264. X
  265. Xstatic double polynom(jd, a)
  266. X     double jd;
  267. X     double a[4];
  268. X{
  269. X  double T;
  270. X
  271. X  T = (jd - 2415020.0)/36525.0;
  272. X
  273. X  return (a[0] + a[1]*T + a[2]*T*T + a[3]*T*T*T);
  274. X}
  275. X
  276. Xstatic void mercury(), venus(), mars(),
  277. X  jupiter(), saturn(), uranus(), neptune();
  278. X
  279. X
  280. X/* Calculate alpha and delta
  281. X   from lambda and beta (and epsilon)
  282. X   which are from r, Delta, psi, b, l, and Theta (in sun_data)
  283. X   which are from u, i (given), and Omega (given)
  284. X   u is from L (given), nu, and M
  285. X   nu and M are calculated.
  286. X   r is from E, a (given) and e (given)
  287. X   E is calculated
  288. X
  289. X   calculate mag from Delta, size form Delta, phase (== beta).
  290. X */
  291. X
  292. Xvoid planet_pos(jd, sun_data, nplanet, data)
  293. X     double jd;            /* time, jd */
  294. X     sun_data_t sun_data;
  295. X     int nplanet;        /* Planet number, 0 = mercury */
  296. X     planet_data_t *data;
  297. X{
  298. X  double L_, a_, e_, i_, omega_, Omega_, M_;
  299. X  double r;            /* radius distance to sun */
  300. X  double l, b;            /* ecliptical longitude and latitude */
  301. X  double Delta;            /* Distance to earth */
  302. X  double lambda, beta;        /* geocentric longitude and latitude */
  303. X  double alpha, delta;        /* R.A. and dec. both degrees */
  304. X  double alpha2000, delta2000;    /* R.A. and dec. both degrees equin 2000.0 */
  305. X  double psi;            /* elongation */
  306. X  double N, D;            /* temporary variables */
  307. X  double Theta;            /* Theta of the sun */
  308. X  double epsilon;        /* obliquity */
  309. X  double Cen;            /* center */
  310. X  double A, B;            /* used in calculating p_n */
  311. X  double W_1, K;        /* Used in calculating lambda_e */
  312. X
  313. X  L_ = into_range(polynom(jd, peles[nplanet].L));
  314. X  a_ = peles[nplanet].a;
  315. X  e_ = polynom(jd, peles[nplanet].e);
  316. X  i_ = polynom(jd, peles[nplanet].i);
  317. X  omega_ = into_range(polynom(jd, peles[nplanet].omega));
  318. X  Omega_ = into_range(polynom(jd, peles[nplanet].Omega));
  319. X  M_ = into_range(L_ - omega_ - Omega_);
  320. X
  321. X  /* Perturb */
  322. X  switch (nplanet) {
  323. X  case 0:
  324. X    mercury(jd, L_, a_, e_, i_, omega_, Omega_, M_, &r, &l, &b, &Cen);
  325. X    break;
  326. X  case 1:
  327. X    venus(jd, L_, a_, e_, i_, omega_, Omega_, M_, &r, &l, &b, &Cen);
  328. X    break;
  329. X  case 2:
  330. X    mars(jd, L_, a_, e_, i_, omega_, Omega_, M_, &r, &l, &b, &Cen);
  331. X    break;
  332. X  case 3:
  333. X    jupiter(jd, L_, a_, e_, i_, omega_, Omega_, M_, &r, &l, &b, &Cen);
  334. X    break;
  335. X  case 4:
  336. X    saturn(jd, L_, a_, e_, i_, omega_, Omega_, M_, &r, &l, &b, &Cen);
  337. X    break;
  338. X  case 5:
  339. X    uranus(jd, L_, a_, e_, i_, omega_, Omega_, M_, &r, &l, &b, &Cen);
  340. X    break;
  341. X  case 6:
  342. X    neptune(jd, L_, a_, e_, i_, omega_, Omega_, M_, &r, &l, &b, &Cen);
  343. X    break;
  344. X  default:
  345. X    break;
  346. X  };
  347. X
  348. X  Theta = sun_data.Theta;
  349. X  N = r * DCOS(b) * DSIN(l - Theta);
  350. X  D = r * DCOS(b) * DCOS(l - Theta) + sun_data.R;
  351. X
  352. X  epsilon = obl_jd(jd);
  353. X
  354. X  lambda = into_range(RAD_TO_DEG * atan2(N, D)) + Theta;
  355. X  Delta = sqrt(N*N + D*D + (r * DSIN(b))*(r * DSIN(b)));
  356. X  beta = RAD_TO_DEG * asin(r * DSIN(b) / Delta);
  357. X  psi = RAD_TO_DEG * acos(DCOS(beta) * DCOS(lambda - Theta));
  358. X  if (into_range(lambda - Theta) > 180.0)
  359. X    psi = -psi;
  360. X  alpha = RAD_TO_DEG * atan2(DSIN(lambda)*DCOS(epsilon)
  361. X                 - DTAN(beta) * DSIN(epsilon),
  362. X                 DCOS(lambda));
  363. X  delta = RAD_TO_DEG * asin(DSIN(beta)*DCOS(epsilon)
  364. X                + DCOS(beta)*DSIN(epsilon)*DSIN(lambda));
  365. X  alpha = into_range(alpha);
  366. X
  367. X/* should correct for nutation and aberration */
  368. X  data->name = planet_name[nplanet];
  369. X  data->type = planet_type[nplanet];
  370. X  data->color = planet_colr[nplanet];
  371. X  data->alpha = alpha;
  372. X  data->delta = delta;
  373. X  precess(2000.0 - (2451545.0 - jd) / 365.25,
  374. X      2000.0, alpha, delta, &alpha2000, &delta2000);
  375. X  data->alpha2000 = alpha2000;
  376. X  data->delta2000 = delta2000;
  377. X  data->l = l;
  378. X  data->b = b;
  379. X  data->lambda = lambda;
  380. X  data->beta = beta;
  381. X  data->psi = psi;
  382. X  data->phase =
  383. X    DACOS((r*r + Delta*Delta - sun_data.R*sun_data.R) / (2*r*Delta));
  384. X  if (psi < 0) data->phase = -data->phase;
  385. X  data->r = r;
  386. X  data->Delta = Delta;
  387. X  data->illum_frac = ((r+Delta)*(r+Delta) - sun_data.R*sun_data.R)/(4*r*Delta);
  388. X  data->chi = /* position angle of bright limb */
  389. X    DATAN2(DCOS(sun_data.delta) * DSIN(sun_data.alpha - alpha),
  390. X      DCOS(delta) * DSIN(sun_data.delta)
  391. X      - DSIN(delta) * DCOS(sun_data.delta) * DCOS(sun_data.alpha - alpha));
  392. X  data->Cen = Cen;
  393. X
  394. X  data->mag = 5.0 * log10(r*Delta)
  395. X    - 2.5 * log10(data->illum_frac)
  396. X    + peles[nplanet].mag0;
  397. X
  398. X  data->size = peles[nplanet].size_1au / Delta;
  399. X
  400. X  data->rotation_elements.beta_e =
  401. X    DASIN(-DSIN(rot_els[nplanet].delta_1)*DSIN(delta)
  402. X      - DCOS(rot_els[nplanet].delta_1) * DCOS(delta)
  403. X          * DCOS(rot_els[nplanet].alpha_1 - alpha));
  404. X
  405. X  A = DCOS(rot_els[nplanet].delta_1) * DSIN(rot_els[nplanet].alpha_1 - alpha);
  406. X  A /= DCOS(data->rotation_elements.beta_e);
  407. X  B = DSIN(rot_els[nplanet].delta_1) * DCOS(delta)
  408. X    - DCOS(rot_els[nplanet].delta_1) * DSIN(delta)
  409. X      * DCOS(rot_els[nplanet].alpha_1 - alpha);
  410. X  B /= DCOS(data->rotation_elements.beta_e);
  411. X  data->rotation_elements.p_n = DATAN2(A, B);
  412. X
  413. X  W_1 = into_range(rot_els[nplanet].W_0
  414. X           + rot_els[nplanet].W_dot
  415. X             * (jd - 2447526.5 - 0.0057755 * Delta));
  416. X
  417. X  A = -DCOS(rot_els[nplanet].delta_1) * DSIN(delta)
  418. X    + DSIN(rot_els[nplanet].delta_1) * DCOS(delta)
  419. X      * DCOS(rot_els[nplanet].alpha_1 - alpha);
  420. X  A /= DCOS(data->rotation_elements.beta_e);
  421. X  B = DCOS(delta) * DSIN(rot_els[nplanet].alpha_1 - alpha);
  422. X  B /= DCOS(data->rotation_elements.beta_e);
  423. X  K = DATAN2(A, B);
  424. X  if (rot_els[nplanet].W_dot < 0.0)
  425. X    data->rotation_elements.lambda_e = into_range(K - W_1);
  426. X  else
  427. X    data->rotation_elements.lambda_e = into_range(W_1 - K);
  428. X}
  429. X
  430. X
  431. Xstatic void mercury(jd, L_, a_, e_, i_, omega_, Omega_, M_, r_p, l_p, b_p, C_p)
  432. Xdouble jd, L_, a_, e_, i_, omega_, Omega_, M_;
  433. Xdouble *r_p, *l_p, *b_p, *C_p;
  434. X{
  435. X  double E, nu;
  436. X  double M1, M2, M4, M5, M6;
  437. X  double r, l, b;
  438. X
  439. X  double u;            /* argument of latitude */
  440. X  double r_pert, l_pert;
  441. X
  442. X  M1 = M_1(jd);
  443. X  M2 = M_2(jd);
  444. X  M4 = M_4(jd);
  445. X  M5 = M_5(jd);
  446. X  M6 = M_6(jd);
  447. X
  448. X
  449. X  /* Calculate E and nu */
  450. X  anom_calc(M_, e_, &E, &nu);
  451. X  r = a_ * (1 - e_ * DCOS(E));
  452. X
  453. X  u = L_ + nu - M_ - Omega_;
  454. X  *C_p = nu - M_;
  455. X  l = into_range(RAD_TO_DEG * atan2(DCOS(i_) * DSIN(u), DCOS(u)) + Omega_);
  456. X  b = RAD_TO_DEG * asin(DSIN(u)*DSIN(i_));
  457. X
  458. X  /* Perturbations */
  459. X  l_pert = 0.00204*DCOS(5*M2-2*M1+12.220)
  460. X    +0.00103*DCOS(2*M2-M1-160.692)
  461. X      +0.00091*DCOS(2*M5-M1-37.003)
  462. X    +0.00078*DCOS(5*M2-3*M1+10.137);
  463. X  r_pert = 0.000007525*DCOS(2*M5-M1+53.013)
  464. X    +0.000006802*DCOS(5*M2-3*M1-259.918)
  465. X      +0.000005457*DCOS(2*M2-2*M1-71.188)
  466. X    +0.000003569*DCOS(5*M2-M1-77.75);
  467. X
  468. X  *r_p = r + r_pert;
  469. X  *l_p = l + l_pert;
  470. X  *b_p = b;
  471. X}
  472. X
  473. Xstatic void venus(jd, L_, a_, e_, i_, omega_, Omega_, M_, r_p, l_p, b_p, C_p)
  474. Xdouble jd, L_, a_, e_, i_, omega_, Omega_, M_;
  475. Xdouble *r_p, *l_p, *b_p, *C_p;
  476. X{
  477. X  double E, nu;
  478. X  double M, M1, M2, M4, M5, M6;
  479. X  double r, l, b;
  480. X
  481. X  double u;            /* argument of latitude */
  482. X  double T;
  483. X  double r_pert, l_pert;
  484. X
  485. X  M = M_sun(jd);
  486. X  M1 = M_1(jd);
  487. X  M2 = M_2(jd);
  488. X  M4 = M_4(jd);
  489. X  M5 = M_5(jd);
  490. X  M6 = M_6(jd);
  491. X
  492. X
  493. X  /* Long term perturbation */
  494. X  T = (jd - 2415020.0)/36525.0;
  495. X  l_pert = 0.00077 * DSIN(237.24 + 150.27*T);
  496. X  M_ += l_pert;
  497. X  L_ += l_pert;
  498. X
  499. X  /* Calculate E and nu */
  500. X  anom_calc(M_, e_, &E, &nu);
  501. X  r = a_ * (1 - e_ * DCOS(E));
  502. X
  503. X
  504. X  u = L_ + nu - M_ - Omega_;
  505. X  *C_p = nu - M_;
  506. X  l = into_range(RAD_TO_DEG * atan2(DCOS(i_) * DSIN(u), DCOS(u)) + Omega_);
  507. X  b = RAD_TO_DEG * asin(DSIN(u)*DSIN(i_));
  508. X
  509. X  /* Perturbations */
  510. X  l_pert = 0.00313*DCOS(2*M-2*M2 -148.225)
  511. X    +0.00198*DCOS(3*M-3*M2 +2.565)
  512. X      +0.00136*DCOS(M-M2-119.107)
  513. X    +0.00096*DCOS(3*M-2*M2-135.912)
  514. X      +0.00082*DCOS(M5-M2-208.087);
  515. X  r_pert = 0.000022501 * DCOS(2*M-2*M2-58.208)
  516. X    +0.000019045 * DCOS(3*M-3*M2+92.577)
  517. X      +0.000006887 * DCOS(M5-M2-118.090)
  518. X    +0.000005172 * DCOS(M-M2-29.110)
  519. X      +0.000003620 * DCOS(5*M-4*M2-104.208)
  520. X        +0.000003283 * DCOS(4*M-4*M2+63.513)
  521. X          +0.000003074 * DCOS(2*M5-2*M2-55.167);
  522. X
  523. X  *r_p = r + r_pert;
  524. X  *l_p = l + l_pert;
  525. X  *b_p = b;
  526. X}
  527. X
  528. Xstatic void mars(jd, L_, a_, e_, i_, omega_, Omega_, M_, r_p, l_p, b_p, C_p)
  529. Xdouble jd, L_, a_, e_, i_, omega_, Omega_, M_;
  530. Xdouble *r_p, *l_p, *b_p, *C_p;
  531. X{
  532. X  double E, nu;
  533. X  double M, M1, M2, M4, M5, M6;
  534. X  double r, l, b;
  535. X
  536. X  double u;            /* argument of latitude */
  537. X  double T;
  538. X  double r_pert, l_pert;
  539. X
  540. X  M = M_sun(jd);
  541. X  M1 = M_1(jd);
  542. X  M2 = M_2(jd);
  543. X  M4 = M_4(jd);
  544. X  M5 = M_5(jd);
  545. X  M6 = M_6(jd);
  546. X
  547. X
  548. X  /* Long term perturbation */
  549. X  T = (jd - 2415020.0)/36525.0;
  550. X  l_pert = -0.01133*DSIN(3*M5-8*M4 +4*M) - 0.00933*DCOS(3*M5-8*M4 +4*M);
  551. X
  552. X  M_ += l_pert;
  553. X  L_ += l_pert;
  554. X
  555. X  /* Calculate E and nu */
  556. X  anom_calc(M_, e_, &E, &nu);
  557. X  r = a_ * (1 - e_ * DCOS(E));
  558. X
  559. X
  560. X  u = L_ + nu - M_ - Omega_;
  561. X  *C_p = nu - M_;
  562. X  l = into_range(RAD_TO_DEG * atan2(DCOS(i_) * DSIN(u), DCOS(u)) + Omega_);
  563. X  b = RAD_TO_DEG * asin(DSIN(u)*DSIN(i_));
  564. X
  565. X  /* Perturbations */
  566. X  l_pert = 0.00705*DCOS(M5-M4-48.958)
  567. X    +0.00607*DCOS(2*M5-M4-188.350)
  568. X      +0.00445*DCOS(2*M5-2*M4-191.897)
  569. X    +0.00388*DCOS(M-2*M4+20.495)
  570. X      +0.00238*DCOS(M-M4+35.097)
  571. X        +0.00204*DCOS(2*M-3*M4+158.638)
  572. X          +0.00177*DCOS(3*M4-M2-57.602)
  573. X        +0.00136*DCOS(2*M-4*M4+154.093)
  574. X          +0.00104*DCOS(M5+17.618);
  575. X  r_pert = 0.000053227*DCOS(M5-M4+41.1306)
  576. X    +0.000050989*DCOS(2*M5-2*M4-101.9847)
  577. X      +0.000038278*DCOS(2*M5-M4-98.3292)
  578. X    +0.000015996*DCOS(M-M4-55.555)
  579. X      +0.000014764*DCOS(2*M-3*M4+68.622)
  580. X        +0.000008966*DCOS(M5-2*M4+43.615);
  581. X  r_pert += 0.000007914*DCOS(3*M5-2*M4-139.737)
  582. X    +0.000007004*DCOS(2*M5-3*M4-102.888)
  583. X      +0.000006620*DCOS(M-2*M4+113.202)
  584. X    +0.000004930*DCOS(3*M5-3*M4-76.243)
  585. X      +0.000004693*DCOS(3*M-5*M4+190.603)
  586. X        +0.000004571*DCOS(2*M-4*M4+244.702)
  587. X          +0.000004409*DCOS(3*M5-M4-115.828);
  588. X
  589. X  *r_p = r + r_pert;
  590. X  *l_p = l + l_pert;
  591. X  *b_p = b;
  592. X}
  593. X
  594. X
  595. Xstatic void jupiter(jd, L_, a_, e_, i_, omega_, Omega_, M_, r_p, l_p, b_p, C_p)
  596. Xdouble jd, L_, a_, e_, i_, omega_, Omega_, M_;
  597. Xdouble *r_p, *l_p, *b_p, *C_p;
  598. X{
  599. X  double E, nu;
  600. X  double M, M1, M2, M4, M5, M6;
  601. X  double r, l, b;
  602. X
  603. X  double u;            /* argument of latitude */
  604. X  double T;
  605. X  double A, B, e_pert, a_pert, v, zeta;
  606. X  double P, Q, S, V, W;
  607. X
  608. X  M = M_sun(jd);
  609. X  M1 = M_1(jd);
  610. X  M2 = M_2(jd);
  611. X  M4 = M_4(jd);
  612. X  M5 = M_5(jd);
  613. X  M6 = M_6(jd);
  614. X
  615. X  /* for perturbations */
  616. X  T = (jd - 2415020.0)/36525.0;
  617. X
  618. X  v = T/5.0 + 0.1;
  619. X  P = 237.47555 +3034.9061*T;
  620. X  Q = 265.91650 + 1222.1139*T;
  621. X  S = 243.51721 + 428.4677*T;
  622. X  V = 5.0*Q -2.0*P;
  623. X  W = 2.0*P - 6.0*Q +3.0*S;
  624. X  zeta = Q - P;
  625. X
  626. X
  627. X  A = (0.331364 - 0.010281*v - 0.004692*v*v)*DSIN(V)
  628. X    +(0.003228 - 0.064436*v + 0.002075*v*v)*DCOS(V)
  629. X      -(0.003083 + 0.000275*v - 0.000489*v*v)*DSIN(2*V)
  630. X    +0.002472*DSIN(W)
  631. X      +0.013619*DSIN(zeta)
  632. X        +0.018472*DSIN(2*zeta)
  633. X          +0.006717*DSIN(3*zeta)
  634. X        +0.002775*DSIN(4*zeta)
  635. X          +(0.007275 - 0.001253*v)*DSIN(zeta)*DSIN(Q)
  636. X            +0.006417*DSIN(2*zeta)*DSIN(Q)
  637. X              +0.002439*DSIN(3*zeta)*DSIN(Q);
  638. X  A += -(0.033839 + 0.001125*v)*DCOS(zeta)*DSIN(Q)
  639. X    -0.003767*DCOS(2*zeta)*DSIN(Q)
  640. X      -(0.035681 + 0.001208*v)*DSIN(zeta)*DCOS(Q)
  641. X    -0.004261*DSIN(2*zeta)*DCOS(Q)
  642. X      +0.002178*DCOS(Q)
  643. X        +(-0.006333 + 0.001161*v)*DCOS(zeta)*DCOS(Q)
  644. X          -0.006675*DCOS(2*zeta)*DCOS(Q)
  645. X        -0.002664*DCOS(3*zeta)*DCOS(Q)
  646. X          -0.002572*DSIN(zeta)*DSIN(2*Q)
  647. X            -0.003567*DSIN(2*zeta)*DSIN(2*Q)
  648. X              +0.002094*DCOS(zeta)*DCOS(2*Q)
  649. X            +0.003342*DCOS(2*zeta)*DCOS(2*Q);
  650. X
  651. X  e_pert = (.0003606 + .0000130*v - .0000043*v*v)*DSIN(V)
  652. X    +(.0001289 - .0000580*v)*DCOS(V)
  653. X      -.0006764*DSIN(zeta)*DSIN(Q)
  654. X    -.0001110*DSIN(2*zeta)*DSIN(Q)
  655. X      -.0000224*DSIN(3*zeta)*DSIN(Q)
  656. X        -.0000204*DSIN(Q)
  657. X          +(.0001284 + .0000116*v)*DCOS(zeta)*DSIN(Q)
  658. X        +.0000188*DCOS(2*zeta)*DSIN(Q)
  659. X          +(.0001460 + .0000130*v)*DSIN(zeta)*DCOS(Q)
  660. X            +.0000224*DSIN(2*zeta)*DCOS(Q)
  661. X              -.0000817*DCOS(Q);
  662. X
  663. X  e_pert += .0006074*DCOS(zeta)*DCOS(Q)
  664. X    +.0000992*DCOS(2*zeta)*DCOS(Q)
  665. X      +.0000508*DCOS(3*zeta)*DCOS(Q)
  666. X    +.0000230*DCOS(4*zeta)*DCOS(Q)
  667. X      +.0000108*DCOS(5*zeta)*DCOS(Q);
  668. X
  669. X  e_pert += -(.0000956 + .0000073*v)*DSIN(zeta)*DSIN(2*Q)
  670. X    +.0000448*DSIN(2*zeta)*DSIN(2*Q)
  671. X      +.0000137*DSIN(3*zeta)*DSIN(2*Q)
  672. X    +(-.0000997 + .0000108*v)*DCOS(zeta)*DSIN(2*Q)
  673. X      +.0000480*DCOS(2*zeta)*DSIN(2*Q);
  674. X
  675. X  e_pert += .0000148*DCOS(3*zeta)*DSIN(2*Q)
  676. X    +(-.0000956 +.0000099*v)*DSIN(zeta)*DCOS(2*Q)
  677. X      +.0000490*DSIN(2*zeta)*DCOS(2*Q)
  678. X    +.0000158*DSIN(3*zeta)*DCOS(2*Q);
  679. X
  680. X  e_pert += .0000179*DCOS(2*Q)
  681. X    +(.0001024 + .0000075*v)*DCOS(zeta)*DCOS(2*Q)
  682. X      -.0000437*DCOS(2*zeta)*DCOS(2*Q)
  683. X    -.0000132*DCOS(3*zeta)*DCOS(2*Q);
  684. X
  685. X  B = (0.007192 - 0.003147*v)*DSIN(V)
  686. X    +(-0.020428 - 0.000675*v + 0.000197*v*v)*DCOS(V)
  687. X      +(0.007269 + 0.000672*v)*DSIN(zeta)*DSIN(Q)
  688. X    -0.004344*DSIN(Q)
  689. X      +0.034036*DCOS(zeta)*DSIN(Q)
  690. X        +0.005614*DCOS(2*zeta)*DSIN(Q)
  691. X          +0.002964*DCOS(3*zeta)*DSIN(Q)
  692. X        +0.037761*DSIN(zeta)*DCOS(Q);
  693. X
  694. X  B += 0.006158*DSIN(2*zeta)*DCOS(Q)
  695. X      -0.006603*DCOS(zeta)*DCOS(Q)
  696. X    -0.005356*DSIN(zeta)*DSIN(2*Q)
  697. X      +0.002722*DSIN(2*zeta)*DSIN(2*Q)
  698. X        +0.004483*DCOS(zeta)*DSIN(2*Q);
  699. X
  700. X  B += -0.002642*DCOS(2*zeta)*DSIN(2*Q)
  701. X    +0.004403*DSIN(zeta)*DCOS(2*Q)
  702. X      -0.002536*DSIN(2*zeta)*DCOS(2*Q)
  703. X    +0.005547*DCOS(zeta)*DCOS(2*Q)
  704. X      -0.002689*DCOS(2*zeta)*DCOS(2*Q);
  705. X
  706. X  a_pert = -.000263*DCOS(V)
  707. X    +.000205*DCOS(zeta)
  708. X      +.000693*DCOS(2*zeta)
  709. X    +.000312*DCOS(3*zeta)
  710. X      +.000147*DCOS(4*zeta)
  711. X        +.000299*DSIN(zeta)*DSIN(Q)
  712. X          +.000181*DCOS(2*zeta)*DSIN(Q)
  713. X        +.000204*DSIN(2*zeta)*DCOS(Q)
  714. X          +.000111*DSIN(3*zeta)*DCOS(Q)
  715. X            -.000337*DCOS(zeta)*DCOS(Q)
  716. X              -.000111*DCOS(2*zeta)*DCOS(Q);
  717. X
  718. X  L_ += A;
  719. X  M_ += A - B / e_;
  720. X  e_ += e_pert;
  721. X  a_ += a_pert;
  722. X  omega_ += B;
  723. X
  724. X  /* Calculate E and nu */
  725. X  anom_calc(M_, e_, &E, &nu);
  726. X  r = a_ * (1 - e_ * DCOS(E));
  727. X
  728. X
  729. X  u = L_ + nu - M_ - Omega_;
  730. X  *C_p = nu - M_;
  731. X  l = into_range(RAD_TO_DEG * atan2(DCOS(i_) * DSIN(u), DCOS(u)) + Omega_);
  732. X  b = RAD_TO_DEG * asin(DSIN(u)*DSIN(i_));
  733. X
  734. X  *r_p = r;
  735. X  *l_p = l;
  736. X  *b_p = b;
  737. X}
  738. X
  739. X
  740. Xstatic void saturn(jd, L_, a_, e_, i_, omega_, Omega_, M_, r_p, l_p, b_p, C_p)
  741. Xdouble jd, L_, a_, e_, i_, omega_, Omega_, M_;
  742. Xdouble *r_p, *l_p, *b_p, *C_p;
  743. X{
  744. X  double E, nu;
  745. X  double M, M1, M2, M4, M5, M6;
  746. X  double r, l, b;
  747. X
  748. X  double u;            /* argument of latitude */
  749. X  double T;
  750. X  double A, B, e_pert, a_pert, b_pert, v, zeta, psi;
  751. X  double P, Q, S, V, W;
  752. X
  753. X  M = M_sun(jd);
  754. X  M1 = M_1(jd);
  755. X  M2 = M_2(jd);
  756. X  M4 = M_4(jd);
  757. X  M5 = M_5(jd);
  758. X  M6 = M_6(jd);
  759. X
  760. X  /* for perturbations */
  761. X  T = (jd - 2415020.0)/36525.0;
  762. X
  763. X  v = T/5.0 + 0.1;
  764. X  P = 237.47555 +3034.9061*T;
  765. X  Q = 265.91650 + 1222.1139*T;
  766. X  S = 243.51721 + 428.4677*T;
  767. X  V = 5.0*Q -2.0*P;
  768. X  W = 2.0*P - 6.0*Q +3.0*S;
  769. X  zeta = Q - P;
  770. X  psi = S - Q;
  771. X
  772. X  A = (-0.814181 + 0.018150*v + 0.016714*v*v)*DSIN(V)
  773. X    +(-0.010497 + 0.160906*v - 0.004100*v*v)*DCOS(V)
  774. X      +0.007581*DSIN(2*V)
  775. X    -0.007986*DSIN(W)
  776. X      -0.148811*DSIN(zeta)
  777. X        -0.040786*DSIN(2*zeta)
  778. X          -0.015208*DSIN(3*zeta)
  779. X        -0.006339*DSIN(4*zeta)
  780. X          -0.006244*DSIN(Q);
  781. X  A += (0.008931 + 0.002728*v)*DSIN(zeta)*DSIN(Q)
  782. X      -0.016500*DSIN(2*zeta)*DSIN(Q)
  783. X    -0.005775*DSIN(3*zeta)*DSIN(Q)
  784. X      +(0.081344 + 0.003206*v)*DCOS(zeta)*DSIN(Q)
  785. X        +0.015019*DCOS(2*zeta)*DSIN(Q)
  786. X          +(0.085581 + 0.002494*v)*DSIN(zeta)*DCOS(Q)
  787. X        +(0.025328 - 0.003117*v)*DCOS(zeta)*DCOS(Q);
  788. X  A += 0.014394*DCOS(2*zeta)*DCOS(Q)
  789. X      +0.006319*DCOS(3*zeta)*DCOS(Q)
  790. X    +0.006369*DSIN(zeta)*DSIN(2*Q)
  791. X      +0.009156*DSIN(2*zeta)*DSIN(2*Q)
  792. X        +0.007525*DSIN(3*psi)*DSIN(2*Q)
  793. X          -0.005236*DCOS(zeta)*DCOS(2*Q)
  794. X        -0.007736*DCOS(2*zeta)*DCOS(2*Q)
  795. X          -0.007528*DCOS(3*psi)*DCOS(2*Q);
  796. X
  797. X  e_pert = (-.0007927 + .0002548*v +.0000091*v*v)*DSIN(V)
  798. X    +(.0013381 + .0001226*v -.0000253*v*v)*DCOS(V)
  799. X      +(.0000248 - .0000121*v)*DSIN(2*V)
  800. X    -(.0000305 + .0000091*v)*DCOS(2*V)
  801. X      +.0000412*DSIN(2*zeta)
  802. X        +.0012415*DSIN(Q)
  803. X          +(.0000390 -.0000617*v)*DSIN(zeta)*DSIN(Q)
  804. X        +(.0000165 - .0000204*v)*DSIN(2*zeta)*DSIN(Q)
  805. X          +.0026599*DCOS(zeta)*DSIN(Q)
  806. X            -.0004687*DCOS(2*zeta)*DSIN(Q);
  807. X  e_pert += -.0001870*DCOS(3*zeta)*DSIN(Q)
  808. X      -.0000821*DCOS(4*zeta)*DSIN(Q)
  809. X    -.0000377*DCOS(5*zeta)*DSIN(Q)
  810. X      +.0000497*DCOS(2*psi)*DSIN(Q)
  811. X        +(.0000163 - .0000611*v)*DCOS(Q)
  812. X          -.0012696*DSIN(zeta)*DCOS(Q)
  813. X        -.0004200*DSIN(2*zeta)*DCOS(Q)
  814. X          -.0001503*DSIN(3*zeta)*DCOS(Q)
  815. X            -.0000619*DSIN(4*zeta)*DCOS(Q)
  816. X              -.0000268*DSIN(5*zeta)*DCOS(Q);
  817. X  e_pert += -(.0000282 + .0001306*v)*DCOS(zeta)*DCOS(Q)
  818. X      +(-.0000086 + .0000230*v)*DCOS(2*zeta)*DCOS(Q)
  819. X    +.0000461*DSIN(2*psi)*DCOS(Q)
  820. X      -.0000350*DSIN(2*Q)
  821. X        +(.0002211 - .0000286*v)*DSIN(zeta)*DSIN(2*Q)
  822. X          -.0002208*DSIN(2*zeta)*DSIN(2*Q)
  823. X        -.0000568*DSIN(3*zeta)*DSIN(2*Q)
  824. X          -.0000346*DSIN(4*zeta)*DSIN(2*Q)
  825. X            -(.0002780 + .0000222*v)*DCOS(zeta)*DSIN(2*Q)
  826. X              +(.0002022 + .0000263*v)*DCOS(2*zeta)*DSIN(2*Q);
  827. X  e_pert += .0000248*DCOS(3*zeta)*DSIN(2*Q)
  828. X      +.0000242*DSIN(3*psi)*DSIN(2*Q)
  829. X    +.0000467*DCOS(3*psi)*DSIN(2*Q)
  830. X      -.0000490*DCOS(2*Q)
  831. X        -(.0002842 + .0000279*v)*DSIN(zeta)*DCOS(2*Q)
  832. X          +(.0000128 + .0000226*v)*DSIN(2*zeta)*DCOS(2*Q)
  833. X        +.0000224*DSIN(3*zeta)*DCOS(2*Q)
  834. X          +(-.0001594 + .0000282*v)*DCOS(zeta)*DCOS(2*Q)
  835. X            +(.0002162 - .0000207*v)*DCOS(2*zeta)*DCOS(2*Q)
  836. X              +.0000561*DCOS(3*zeta)*DCOS(2*Q);
  837. X  e_pert += .0000343*DCOS(4*zeta)*DCOS(2*Q)
  838. X      +.0000469*DSIN(3*psi)*DCOS(2*Q)
  839. X    -.0000242*DCOS(3*psi)*DCOS(2*Q)
  840. X      -.0000205*DSIN(zeta)*DSIN(3*Q)
  841. X        +.0000262*DSIN(3*zeta)*DSIN(3*Q)
  842. X          +.0000208*DCOS(zeta)*DCOS(3*Q)
  843. X        -.0000271*DCOS(3*zeta)*DCOS(3*Q)
  844. X          -.0000382*DCOS(3*zeta)*DSIN(4*Q)
  845. X            -.0000376*DSIN(3*zeta)*DCOS(4*Q);
  846. X  B = (0.077108 + 0.007186*v - 0.001533*v*v)*DSIN(V)
  847. X    +(0.045803 - 0.014766*v - 0.000536*v*v)*DCOS(V)
  848. X      -0.007075*DSIN(zeta)
  849. X    -0.075825*DSIN(zeta)*DSIN(Q)
  850. X      -0.024839*DSIN(2*zeta)*DSIN(Q)
  851. X        -0.008631*DSIN(3*zeta)*DSIN(Q)
  852. X          -0.072586*DCOS(Q)
  853. X        -0.150383*DCOS(zeta)*DCOS(Q)
  854. X          +0.026897*DCOS(2*zeta)*DCOS(Q)
  855. X            +0.010053*DCOS(3*zeta)*DCOS(Q);
  856. X  B += -(0.013597 +0.001719*v)*DSIN(zeta)*DSIN(2*Q)
  857. X      +(-0.007742 + 0.001517*v)*DCOS(zeta)*DSIN(2*Q)
  858. X    +(0.013586 - 0.001375*v)*DCOS(2*zeta)*DSIN(2*Q)
  859. X      +(-0.013667 + 0.001239*v)*DSIN(zeta)*DCOS(2*Q)
  860. X        +0.011981*DSIN(2*zeta)*DCOS(2*Q)
  861. X          +(0.014861 + 0.001136*v)*DCOS(zeta)*DCOS(2*Q)
  862. X        -(0.013064 + 0.001628*v)*DCOS(2*zeta)*DCOS(2*Q);
  863. X
  864. X  a_pert = .000572*DSIN(V) -.001590*DSIN(2*zeta)*DCOS(Q)
  865. X    +.002933*DCOS(V) -.000647*DSIN(3*zeta)*DCOS(Q)
  866. X      +.033629*DCOS(zeta) -.000344*DSIN(4*zeta)*DCOS(Q)
  867. X    -.003081*DCOS(2*zeta) +.002885*DCOS(zeta)*DCOS(Q)
  868. X      -.001423*DCOS(3*zeta) +(.002172 + .000102*v)*DCOS(2*zeta)*DCOS(Q)
  869. X        -.000671*DCOS(4*zeta) +.000296*DCOS(3*zeta)*DCOS(Q)
  870. X          -.000320*DCOS(5*zeta) -.000267*DSIN(2*zeta)*DSIN(2*Q);
  871. X  a_pert += .001098*DSIN(Q) -.000778*DCOS(zeta)*DSIN(2*Q)
  872. X      -.002812*DSIN(zeta)*DSIN(Q) +.000495*DCOS(2*zeta)*DSIN(2*Q)
  873. X    +.000688*DSIN(2*zeta)*DSIN(Q) +.000250*DCOS(3*zeta)*DSIN(2*Q);
  874. X  a_pert += -.000393*DSIN(3*zeta)*DSIN(Q)
  875. X      -.000228*DSIN(4*zeta)*DSIN(Q)
  876. X    +.002138*DCOS(zeta)*DSIN(Q)
  877. X      -.000999*DCOS(2*zeta)*DSIN(Q)
  878. X        -.000642*DCOS(3*zeta)*DSIN(Q)
  879. X          -.000325*DCOS(4*zeta)*DSIN(Q)
  880. X        -.000890*DCOS(Q)
  881. X          +.002206*DSIN(zeta)*DCOS(Q);
  882. X  a_pert += -.000856*DSIN(zeta)*DCOS(2*Q)
  883. X      +.000441*DSIN(2*zeta)*DCOS(2*Q)
  884. X    +.000296*DCOS(2*zeta)*DCOS(2*Q)
  885. X      +.000211*DCOS(3*zeta)*DCOS(2*Q)
  886. X        -.000427*DSIN(zeta)*DSIN(3*Q)
  887. X          +.000398*DSIN(3*zeta)*DSIN(3*Q)
  888. X        +.000344*DCOS(zeta)*DCOS(3*Q)
  889. X          -.000427*DCOS(3*zeta)*DCOS(3*Q);
  890. X
  891. X  L_ += A;
  892. X  M_ += A - B / e_;
  893. X  e_ += e_pert;
  894. X  a_ += a_pert;
  895. X  omega_ += B;
  896. X
  897. X  /* Calculate E and nu */
  898. X  anom_calc(M_, e_, &E, &nu);
  899. X  r = a_ * (1 - e_ * DCOS(E));
  900. X
  901. X
  902. X  u = L_ + nu - M_ - Omega_;
  903. X  *C_p = nu - M_;
  904. X  l = into_range(RAD_TO_DEG * atan2(DCOS(i_) * DSIN(u), DCOS(u)) + Omega_);
  905. X  b = RAD_TO_DEG * asin(DSIN(u)*DSIN(i_));
  906. X
  907. X  b_pert = 0.000747*DCOS(zeta)*DSIN(Q)
  908. X      +0.001069*DCOS(zeta)*DCOS(Q)
  909. X    +0.002108*DSIN(2*zeta)*DSIN(2*Q)
  910. X      +0.001261*DCOS(2*zeta)*DSIN(2*Q)
  911. X        +0.001236*DSIN(2*zeta)*DCOS(2*Q)
  912. X          -0.002075*DCOS(2*zeta)*DCOS(2*Q);
  913. X
  914. X
  915. X  *r_p = r;
  916. X  *l_p = l;
  917. X  *b_p = b + b_pert;
  918. X}
  919. X
  920. Xstatic void uranus(jd, L_, a_, e_, i_, omega_, Omega_, M_, r_p, l_p, b_p, C_p)
  921. Xdouble jd, L_, a_, e_, i_, omega_, Omega_, M_;
  922. Xdouble *r_p, *l_p, *b_p, *C_p;
  923. X{
  924. X  double E, nu;
  925. X  double M, M1, M2, M4, M5, M6;
  926. X  double r, l, b;
  927. X
  928. X  double u;            /* argument of latitude */
  929. X  double T;
  930. X  double A, B, e_pert, a_pert, b_pert, v, zeta, eta, theta;
  931. X  double P, Q, S, V, W, G, H;
  932. X  double r_pert, l_pert;
  933. X
  934. X  M = M_sun(jd);
  935. X  M1 = M_1(jd);
  936. X  M2 = M_2(jd);
  937. X  M4 = M_4(jd);
  938. X  M5 = M_5(jd);
  939. X  M6 = M_6(jd);
  940. X
  941. X  /* for perturbations */
  942. X  T = (jd - 2415020.0)/36525.0;
  943. X
  944. X  v = T/5.0 + 0.1;
  945. X  P = 237.47555 +3034.9061*T;
  946. X  Q = 265.91650 + 1222.1139*T;
  947. X  S = 243.51721 + 428.4677*T;
  948. X  V = 5.0*Q -2.0*P;
  949. X  W = 2.0*P - 6.0*Q +3.0*S;
  950. X  G = 83.76922 + 218.4901*T;
  951. X  H = 2.0*G - S;
  952. X  zeta = S - P;
  953. X  eta = S - Q;
  954. X  theta = G - S;
  955. X
  956. X  A = (0.864319 - 0.001583*v)*DSIN(H)
  957. X    +(0.082222 - 0.006833*v)*DCOS(H)
  958. X      +0.036017*DSIN(2*H)
  959. X    -0.003019*DCOS(2*H)
  960. X      +0.008122*DSIN(W);
  961. X
  962. X  e_pert = (-.0003349 + .0000163*v)*DSIN(H)
  963. X    +.0020981*DCOS(H)
  964. X      +.0001311*DCOS(H);
  965. X
  966. X  B = 0.120303*DSIN(H)
  967. X    +(0.019472 - 0.000947*v)*DCOS(H)
  968. X      +0.006197*DSIN(2*H);
  969. X
  970. X  a_pert = - 0.003825*DCOS(H);
  971. X
  972. X  L_ += A;
  973. X  M_ += A - B / e_;
  974. X  e_ += e_pert;
  975. X  a_ += a_pert;
  976. X  omega_ += B;
  977. X
  978. X  /* Calculate E and nu */
  979. X  anom_calc(M_, e_, &E, &nu);
  980. X  r = a_ * (1 - e_ * DCOS(E));
  981. X
  982. X
  983. X  u = L_ + nu - M_ - Omega_;
  984. X  *C_p = nu - M_;
  985. X  l = into_range(RAD_TO_DEG * atan2(DCOS(i_) * DSIN(u), DCOS(u)) + Omega_);
  986. X  b = RAD_TO_DEG * asin(DSIN(u)*DSIN(i_));
  987. X
  988. X  l_pert = (0.010122 - 0.000988*v)*DSIN(S+eta)
  989. X      +(-0.038581 + 0.002031*v - 0.001910*v*v)*DCOS(S+eta)
  990. X    +(0.034964 - 0.001038*v + 0.000868*v*v)*DCOS(2*S+eta)
  991. X      +0.005594*DSIN(S +3*theta);
  992. X  l_pert += -0.014808*DSIN(zeta)
  993. X      -0.005794*DSIN(eta)
  994. X    +0.002347*DCOS(eta)
  995. X      +0.009872*DSIN(theta)
  996. X        +0.008803*DSIN(2*theta)
  997. X          -0.004308*DSIN(3*theta);
  998. X  b_pert = (0.000458*DSIN(eta) - 0.000642*DCOS(eta) - 0.000517*DCOS(4*theta))
  999. X      *DSIN(S)
  1000. X    -(0.000347*DSIN(eta) + 0.000853*DCOS(eta) + 0.000517*DSIN(4*eta))
  1001. X      *DCOS(S)
  1002. X        +0.000403*(DCOS(2*theta)*DSIN(2*S) + DSIN(2*theta)*DCOS(2*S));
  1003. X  r_pert = -.025948
  1004. X      +.004985*DCOS(zeta)
  1005. X    -.001230*DCOS(S)
  1006. X      +.003354*DCOS(eta)
  1007. X        +(.005795*DCOS(S) - .001165*DSIN(S) + .001388*DCOS(2*S))*DSIN(eta)
  1008. X          +(.001351*DCOS(S) + .005702*DSIN(S) + .001388*DSIN(2*S))*DCOS(eta)
  1009. X        +.000904*DCOS(2*theta)
  1010. X          +.000894*(DCOS(theta) - DCOS(3*theta));
  1011. X
  1012. X  *r_p = r + r_pert;
  1013. X  *l_p = l + l_pert;
  1014. X  *b_p = b + b_pert;
  1015. X}
  1016. X
  1017. Xstatic void neptune(jd, L_, a_, e_, i_, omega_, Omega_, M_, r_p, l_p, b_p, C_p)
  1018. Xdouble jd, L_, a_, e_, i_, omega_, Omega_, M_;
  1019. Xdouble *r_p, *l_p, *b_p, *C_p;
  1020. X{
  1021. X  double E, nu;
  1022. X  double M, M1, M2, M4, M5, M6;
  1023. X  double r, l, b;
  1024. X
  1025. X  double u;            /* argument of latitude */
  1026. X  double T;
  1027. X  double A, B, e_pert, a_pert, b_pert, v, zeta, eta, theta;
  1028. X  double P, Q, S, V, W, G, H;
  1029. X  double r_pert, l_pert;
  1030. X
  1031. X  M = M_sun(jd);
  1032. X  M1 = M_1(jd);
  1033. X  M2 = M_2(jd);
  1034. X  M4 = M_4(jd);
  1035. X  M5 = M_5(jd);
  1036. X  M6 = M_6(jd);
  1037. X
  1038. X  /* for perturbations */
  1039. X  T = (jd - 2415020.0)/36525.0;
  1040. X
  1041. X  v = T/5.0 + 0.1;
  1042. X  P = 237.47555 +3034.9061*T;
  1043. X  Q = 265.91650 + 1222.1139*T;
  1044. X  S = 243.51721 + 428.4677*T;
  1045. X  V = 5.0*Q -2.0*P;
  1046. X  W = 2.0*P - 6.0*Q +3.0*S;
  1047. X  G = 83.76922 + 218.4901*T;
  1048. X  H = 2.0*G - S;
  1049. X  zeta = S - P;
  1050. X  eta = S - Q;
  1051. X  theta = G - S;
  1052. X
  1053. X  A = (-0.589833 + 0.001089*v)*DSIN(H)
  1054. X    +(-0.056094 + 0.004658*v)*DCOS(H)
  1055. X      -0.024286*DSIN(2*H);
  1056. X
  1057. X  e_pert = .0004389*DSIN(H)
  1058. X    +.0004262*DCOS(H)
  1059. X      +.0001129*DSIN(2*H)
  1060. X    +.0001089*DCOS(2*H);
  1061. X
  1062. X  B = 0.024039*DSIN(H)
  1063. X    -0.025303*DCOS(H)
  1064. X      +0.006206*DSIN(2*H)
  1065. X    -0.005992*DCOS(2*H);
  1066. X
  1067. X  a_pert = -0.000817*DSIN(H)
  1068. X    +0.008189*DCOS(H)
  1069. X      +0.000781*DCOS(2*H);
  1070. X
  1071. X  L_ += A;
  1072. X  M_ += A - B / e_;
  1073. X  e_ += e_pert;
  1074. X  a_ += a_pert;
  1075. X  omega_ += B;
  1076. X
  1077. X  /* Calculate E and nu */
  1078. X  anom_calc(M_, e_, &E, &nu);
  1079. X  r = a_ * (1 - e_ * DCOS(E));
  1080. X
  1081. X
  1082. X  u = L_ + nu - M_ - Omega_;
  1083. X  *C_p = nu - M_;
  1084. X  l = into_range(RAD_TO_DEG * atan2(DCOS(i_) * DSIN(u), DCOS(u)) + Omega_);
  1085. X  b = RAD_TO_DEG * asin(DSIN(u)*DSIN(i_));
  1086. X
  1087. X  l_pert = -0.009556*DSIN(zeta)
  1088. X      -0.005178*DSIN(eta)
  1089. X    +0.002572*DSIN(2*theta)
  1090. X      -0.002972*DCOS(2*theta)*DSIN(G)
  1091. X        -0.002833*DSIN(2*theta)*DCOS(G);
  1092. X
  1093. X  b_pert = 0.000336*DCOS(2*theta)*DSIN(G)
  1094. X      +0.000364*DSIN(2*theta)*DCOS(G);
  1095. X
  1096. X  r_pert = -.040596
  1097. X      +.004992*DCOS(zeta)
  1098. X    +.002744*DCOS(eta)
  1099. X      +.002044*DCOS(theta)
  1100. X        +.001051*DCOS(2*theta);
  1101. X
  1102. X  *r_p = r + r_pert;
  1103. X  *l_p = l + l_pert;
  1104. X  *b_p = b + b_pert;
  1105. X}
  1106. X
  1107. END_OF_FILE
  1108. if test 28915 -ne `wc -c <'observe/planetcalc.c'`; then
  1109.     echo shar: \"'observe/planetcalc.c'\" unpacked with wrong size!
  1110. fi
  1111. # end of 'observe/planetcalc.c'
  1112. fi
  1113. echo shar: End of archive 15 \(of 32\).
  1114. cp /dev/null ark15isdone
  1115. MISSING=""
  1116. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ; do
  1117.     if test ! -f ark${I}isdone ; then
  1118.     MISSING="${MISSING} ${I}"
  1119.     fi
  1120. done
  1121. if test "${MISSING}" = "" ; then
  1122.     echo You have unpacked all 32 archives.
  1123.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1124. else
  1125.     echo You still need to unpack the following archives:
  1126.     echo "        " ${MISSING}
  1127. fi
  1128. ##  End of shell archive.
  1129. exit 0
  1130.  
  1131.