| 1 | #include <math.h> | 
|---|
| 2 |  | 
|---|
| 3 | #include "P_.h" | 
|---|
| 4 | #include "astro.h" | 
|---|
| 5 |  | 
|---|
| 6 | /* given a modified Julian date, mjd, and a set of heliocentric parabolic | 
|---|
| 7 | * orbital elements referred to the epoch of date (mjd): | 
|---|
| 8 | *   ep:   epoch of perihelion, | 
|---|
| 9 | *   inc:  inclination, | 
|---|
| 10 | *   ap:   argument of perihelion (equals the longitude of perihelion minus the | 
|---|
| 11 | *         longitude of ascending node) | 
|---|
| 12 | *   qp:   perihelion distance, | 
|---|
| 13 | *   om:   longitude of ascending node; | 
|---|
| 14 | * find: | 
|---|
| 15 | *   lpd:  heliocentric longitude, | 
|---|
| 16 | *   psi:  heliocentric latitude, | 
|---|
| 17 | *   rp:   distance from the sun to the planet, | 
|---|
| 18 | *   rho:  distance from the Earth to the planet, | 
|---|
| 19 | *   lam:  geocentric ecliptic longitude, | 
|---|
| 20 | *   bet:  geocentric ecliptic latitude, | 
|---|
| 21 | *         none are corrected for light time, ie, they are the true values for | 
|---|
| 22 | *         the given instant. | 
|---|
| 23 | * | 
|---|
| 24 | * all angles are in radians, all distances in AU. | 
|---|
| 25 | * mutual perturbation corrections with other solar system objects are not | 
|---|
| 26 | * applied. corrections for nutation and abberation must be made by the caller. | 
|---|
| 27 | * The RA and DEC calculated from the fully-corrected ecliptic coordinates are | 
|---|
| 28 | * then the apparent geocentric coordinates. Further corrections can be made, | 
|---|
| 29 | * if required, for atmospheric refraction and geocentric parallax. | 
|---|
| 30 | */ | 
|---|
| 31 | void | 
|---|
| 32 | comet (mjd, ep, inc, ap, qp, om, lpd, psi, rp, rho, lam, bet) | 
|---|
| 33 | double mjd; | 
|---|
| 34 | double ep, inc, ap, qp, om; | 
|---|
| 35 | double *lpd, *psi, *rp, *rho, *lam, *bet; | 
|---|
| 36 | { | 
|---|
| 37 | double w, s, s2; | 
|---|
| 38 | double l, sl, cl, y; | 
|---|
| 39 | double spsi, cpsi; | 
|---|
| 40 | double rd, lsn, rsn; | 
|---|
| 41 | double lg, re, ll; | 
|---|
| 42 | double cll, sll; | 
|---|
| 43 | double nu; | 
|---|
| 44 |  | 
|---|
| 45 | #define ERRLMT  0.0001 | 
|---|
| 46 | w = ((mjd-ep)*3.649116e-02)/(qp*sqrt(qp)); | 
|---|
| 47 | s = w/3; | 
|---|
| 48 | for (;;) { | 
|---|
| 49 | double d; | 
|---|
| 50 | s2 = s*s; | 
|---|
| 51 | d = (s2+3)*s-w; | 
|---|
| 52 | if (fabs(d) <= ERRLMT) | 
|---|
| 53 | break; | 
|---|
| 54 | s = ((2*s*s2)+w)/(3*(s2+1)); | 
|---|
| 55 | } | 
|---|
| 56 |  | 
|---|
| 57 | nu = 2*atan(s); | 
|---|
| 58 | *rp = qp*(1+s2); | 
|---|
| 59 | l = nu+ap; | 
|---|
| 60 | sl = sin(l); | 
|---|
| 61 | cl = cos(l); | 
|---|
| 62 | spsi = sl*sin(inc); | 
|---|
| 63 | *psi = asin(spsi); | 
|---|
| 64 | y = sl*cos(inc); | 
|---|
| 65 | *lpd = atan(y/cl)+om; | 
|---|
| 66 | cpsi = cos(*psi); | 
|---|
| 67 | if (cl<0) *lpd += PI; | 
|---|
| 68 | range (lpd, 2*PI); | 
|---|
| 69 | rd = *rp * cpsi; | 
|---|
| 70 | sunpos (mjd, &lsn, &rsn, 0); | 
|---|
| 71 | lg = lsn+PI; | 
|---|
| 72 | re = rsn; | 
|---|
| 73 | ll = *lpd - lg; | 
|---|
| 74 | cll = cos(ll); | 
|---|
| 75 | sll = sin(ll); | 
|---|
| 76 | *rho = sqrt((re * re)+(*rp * *rp)-(2*re*rd*cll)); | 
|---|
| 77 | if (rd<re) | 
|---|
| 78 | *lam = atan((-1*rd*sll)/(re-(rd*cll)))+lg+PI; | 
|---|
| 79 | else | 
|---|
| 80 | *lam = atan((re*sll)/(rd-(re*cll)))+*lpd; | 
|---|
| 81 | range (lam, 2*PI); | 
|---|
| 82 | *bet = atan((rd*spsi*sin(*lam-*lpd))/(cpsi*re*sll)); | 
|---|
| 83 | } | 
|---|
| 84 |  | 
|---|
| 85 | /* For RCS Only -- Do Not Edit */ | 
|---|
| 86 | static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: comet.c,v $ $Date: 2001-04-10 14:40:46 $ $Revision: 1.1.1.1 $ $Name: not supported by cvs2svn $"}; | 
|---|