| [1457] | 1 | /* rewritten for Bureau des Longitude theories by Bretagnon and Chapront | 
|---|
|  | 2 | * Michael Sternberg <sternberg@physik.tu-chemnitz.de> | 
|---|
|  | 3 | */ | 
|---|
|  | 4 | #include <stdio.h> | 
|---|
|  | 5 | #include <math.h> | 
|---|
|  | 6 |  | 
|---|
|  | 7 | #include "astro.h" | 
|---|
|  | 8 | #include "vsop87.h" | 
|---|
|  | 9 | #include "chap95.h" | 
|---|
|  | 10 |  | 
|---|
| [2551] | 11 | static void pluto_ell (double mj, double *ret); | 
|---|
|  | 12 | static void chap_trans (double mj, double *ret); | 
|---|
|  | 13 | static void planpos (double mj, int obj, double prec, double *ret); | 
|---|
| [1457] | 14 |  | 
|---|
|  | 15 | /* coordinate transformation | 
|---|
|  | 16 | * from: | 
|---|
|  | 17 | *      J2000.0 rectangular equatoreal                  ret[{0,1,2}] = {x,y,z} | 
|---|
|  | 18 | * to: | 
|---|
|  | 19 | *      mean equinox of date spherical ecliptical       ret[{0,1,2}] = {l,b,r} | 
|---|
|  | 20 | */ | 
|---|
|  | 21 | static void | 
|---|
| [2551] | 22 | chap_trans ( | 
|---|
|  | 23 | double mj,      /* destination epoch */ | 
|---|
|  | 24 | double *ret)    /* vector to be transformed _IN PLACE_ */ | 
|---|
| [1457] | 25 | { | 
|---|
|  | 26 | double ra, dec, r, eps; | 
|---|
|  | 27 | double sr, cr, sd, cd, se, ce; | 
|---|
|  | 28 |  | 
|---|
|  | 29 | cartsph(ret[0], ret[1], ret[2], &ra, &dec, &r); | 
|---|
| [2551] | 30 | precess(J2000, mj, &ra, &dec); | 
|---|
|  | 31 | obliquity(mj, &eps); | 
|---|
| [1457] | 32 | sr = sin(ra); cr = cos(ra); | 
|---|
|  | 33 | sd = sin(dec); cd = cos(dec); | 
|---|
|  | 34 | se = sin(eps); ce = cos(eps); | 
|---|
|  | 35 | ret[0] = atan2( sr * ce + sd/cd * se, cr);      /* long */ | 
|---|
|  | 36 | ret[1] = asin( sd * ce - cd * se * sr);         /* lat */ | 
|---|
|  | 37 | ret[2] = r;                                     /* radius */ | 
|---|
|  | 38 | } | 
|---|
|  | 39 |  | 
|---|
|  | 40 | /* low precision ecliptic coordinates of Pluto from mean orbit. | 
|---|
|  | 41 | * Only for sake of completeness outside available perturbation theories. | 
|---|
|  | 42 | */ | 
|---|
|  | 43 | static void | 
|---|
| [2551] | 44 | pluto_ell ( | 
|---|
|  | 45 | double mj,      /* epoch */ | 
|---|
|  | 46 | double *ret)    /* ecliptic coordinates {l,b,r} at equinox of date */ | 
|---|
| [1457] | 47 | { | 
|---|
|  | 48 | /* mean orbital elements of Pluto. | 
|---|
|  | 49 | * The origin of these is somewhat obscure. | 
|---|
|  | 50 | */ | 
|---|
|  | 51 | double  a = 39.543,                     /* semimajor axis, au */ | 
|---|
|  | 52 | e = 0.2490,                     /* excentricity */ | 
|---|
|  | 53 | inc0 = 17.140,                  /* inclination, deg */ | 
|---|
|  | 54 | Om0 = 110.307,                  /* long asc node, deg */ | 
|---|
|  | 55 | omeg0 = 113.768,                /* arg of perihel, deg */ | 
|---|
| [2551] | 56 | mjp = 2448045.539 - MJD0,       /* epoch of perihel */ | 
|---|
|  | 57 | mjeq = J2000,                   /* equinox of elements */ | 
|---|
| [1457] | 58 | n = 144.9600/36525.;            /* daily motion, deg */ | 
|---|
|  | 59 |  | 
|---|
|  | 60 | double inc, Om, omeg;   /* orbital elements at epoch of date */ | 
|---|
|  | 61 | double ma, ea, nu;      /* mean, excentric and true anomaly */ | 
|---|
|  | 62 | double lo, slo, clo;    /* longitude in orbit from asc node */ | 
|---|
|  | 63 |  | 
|---|
| [2551] | 64 | reduce_elements(mjeq, mj, degrad(inc0), degrad(omeg0), degrad(Om0), | 
|---|
| [1457] | 65 | &inc, &omeg, &Om); | 
|---|
| [2551] | 66 | ma = degrad((mj - mjp) * n); | 
|---|
| [1457] | 67 | anomaly(ma, e, &nu, &ea); | 
|---|
|  | 68 | ret[2] = a * (1.0 - e*cos(ea));                 /* r */ | 
|---|
|  | 69 | lo = omeg + nu; | 
|---|
|  | 70 | slo = sin(lo); | 
|---|
|  | 71 | clo = cos(lo); | 
|---|
|  | 72 | ret[1] = asin(slo * sin(inc));                  /* b */ | 
|---|
|  | 73 | ret[0] = atan2(slo * cos(inc), clo) + Om;       /* l */ | 
|---|
|  | 74 | } | 
|---|
|  | 75 |  | 
|---|
|  | 76 | /*************************************************************/ | 
|---|
|  | 77 |  | 
|---|
|  | 78 | /* geometric heliocentric position of planet, mean ecliptic of date | 
|---|
|  | 79 | * (not corrected for light-time) | 
|---|
|  | 80 | */ | 
|---|
|  | 81 | static void | 
|---|
| [2551] | 82 | planpos (double mj, int obj, double prec, double *ret) | 
|---|
| [1457] | 83 | { | 
|---|
| [2551] | 84 | if (mj >= CHAP_BEGIN && mj <= CHAP_END) { | 
|---|
| [1457] | 85 | if (obj >= JUPITER) {               /* prefer Chapront */ | 
|---|
| [2551] | 86 | chap95(mj, obj, prec, ret); | 
|---|
|  | 87 | chap_trans (mj, ret); | 
|---|
| [1457] | 88 | } else {                            /* VSOP for inner planets */ | 
|---|
| [2551] | 89 | vsop87(mj, obj, prec, ret); | 
|---|
| [1457] | 90 | } | 
|---|
|  | 91 | } else {                                /* outside Chapront time: */ | 
|---|
|  | 92 | if (obj != PLUTO) {                 /* VSOP for all but Pluto */ | 
|---|
| [2551] | 93 | vsop87(mj, obj, prec, ret); | 
|---|
| [1457] | 94 | } else {                            /* Pluto mean elliptic orbit */ | 
|---|
| [2551] | 95 | pluto_ell(mj, ret); | 
|---|
| [1457] | 96 | } | 
|---|
|  | 97 | } | 
|---|
|  | 98 | } | 
|---|
|  | 99 |  | 
|---|
|  | 100 | /*************************************************************/ | 
|---|
|  | 101 |  | 
|---|
|  | 102 | /* visual elements of planets | 
|---|
|  | 103 | * [planet][0] = angular size at 1 AU | 
|---|
|  | 104 | * [planet][1] = magnitude at 1 AU from sun and earth and 0 deg phase angle | 
|---|
| [1719] | 105 | * [planet][2] = A | 
|---|
|  | 106 | * [planet][3] = B | 
|---|
|  | 107 | * [planet][4] = C | 
|---|
|  | 108 | *   where mag correction = A*(i/100) + B*(i/100)^2 + C*(i/100)^3 | 
|---|
|  | 109 | *      i = angle between sun and earth from planet, degrees | 
|---|
|  | 110 | * from Explanatory Supplement, 1992 | 
|---|
| [1457] | 111 | */ | 
|---|
| [1719] | 112 | static double vis_elements[8][5] = { | 
|---|
|  | 113 | /* Mercury */   { 6.74, -0.36, 3.8, -2.73, 2.00}, | 
|---|
|  | 114 | /* Venus */     { 16.92, -4.29, 0.09, 2.39, -.65}, | 
|---|
|  | 115 | /* Mars */      { 9.36, -1.52, 1.60, 0., 0.}, | 
|---|
|  | 116 | /* Jupiter */   { 196.74, -9.25, 0.50, 0., 0.}, | 
|---|
|  | 117 | /* Saturn */    { 165.6, -8.88, 4.40, 0., 0.}, | 
|---|
|  | 118 | /* Uranus */    { 65.8, -7.19, 0.28, 0., 0.}, | 
|---|
|  | 119 | /* Neptune */   { 62.2, -6.87, 0., 0., 0.}, | 
|---|
|  | 120 | /* Pluto */     { 8.2, -1.01, 4.1, 0., 0.} | 
|---|
| [1457] | 121 | }; | 
|---|
|  | 122 |  | 
|---|
| [2551] | 123 | /* given a modified Julian date, mj, and a planet, p, find: | 
|---|
| [1457] | 124 | *   lpd0: heliocentric longitude, | 
|---|
|  | 125 | *   psi0: heliocentric latitude, | 
|---|
|  | 126 | *   rp0:  distance from the sun to the planet, | 
|---|
|  | 127 | *   rho0: distance from the Earth to the planet, | 
|---|
|  | 128 | *         none corrected for light time, ie, they are the true values for the | 
|---|
|  | 129 | *         given instant. | 
|---|
|  | 130 | *   lam:  geocentric ecliptic longitude, | 
|---|
|  | 131 | *   bet:  geocentric ecliptic latitude, | 
|---|
|  | 132 | *         each corrected for light time, ie, they are the apparent values as | 
|---|
|  | 133 | *         seen from the center of the Earth for the given instant. | 
|---|
|  | 134 | *   dia:  angular diameter in arcsec at 1 AU, | 
|---|
| [1719] | 135 | *   mag:  visual magnitude | 
|---|
| [1457] | 136 | * | 
|---|
|  | 137 | * all angles are in radians, all distances in AU. | 
|---|
|  | 138 | * | 
|---|
|  | 139 | * corrections for nutation and abberation must be made by the caller. The RA | 
|---|
|  | 140 | *   and DEC calculated from the fully-corrected ecliptic coordinates are then | 
|---|
|  | 141 | *   the apparent geocentric coordinates. Further corrections can be made, if | 
|---|
|  | 142 | *   required, for atmospheric refraction and geocentric parallax. | 
|---|
|  | 143 | */ | 
|---|
|  | 144 | void | 
|---|
| [2551] | 145 | plans (double mj, PLCode p, double *lpd0, double *psi0, double *rp0, | 
|---|
|  | 146 | double *rho0, double *lam, double *bet, double *dia, double *mag) | 
|---|
| [1457] | 147 | { | 
|---|
| [2551] | 148 | static double lastmj = -10000; | 
|---|
| [1719] | 149 | static double lsn, bsn, rsn;    /* geocentric coords of sun */ | 
|---|
|  | 150 | static double xsn, ysn, zsn;    /* cartesian " */ | 
|---|
| [1457] | 151 | double lp, bp, rp;              /* heliocentric coords of planet */ | 
|---|
|  | 152 | double xp, yp, zp, rho;         /* rect. coords and geocentric dist. */ | 
|---|
|  | 153 | double dt;                      /* light time */ | 
|---|
| [1719] | 154 | double *vp;                     /* vis_elements[p] */ | 
|---|
|  | 155 | double ci, i;                   /* sun/earth angle: cos, degrees */ | 
|---|
| [1457] | 156 | int pass; | 
|---|
|  | 157 |  | 
|---|
| [2551] | 158 | /* get sun cartesian; needed only once at mj */ | 
|---|
|  | 159 | if (mj != lastmj) { | 
|---|
|  | 160 | sunpos (mj, &lsn, &rsn, &bsn); | 
|---|
| [1457] | 161 | sphcart (lsn, bsn, rsn, &xsn, &ysn, &zsn); | 
|---|
| [2551] | 162 | lastmj = mj; | 
|---|
| [1457] | 163 | } | 
|---|
|  | 164 |  | 
|---|
| [2551] | 165 | /* first find the true position of the planet at mj. | 
|---|
| [1457] | 166 | * then repeat a second time for a slightly different time based | 
|---|
|  | 167 | * on the position found in the first pass to account for light-travel | 
|---|
|  | 168 | * time. | 
|---|
|  | 169 | */ | 
|---|
|  | 170 | dt = 0.0; | 
|---|
|  | 171 | for (pass = 0; pass < 2; pass++) { | 
|---|
|  | 172 | double ret[6]; | 
|---|
|  | 173 |  | 
|---|
|  | 174 | /* get spherical coordinates of planet from precision routines, | 
|---|
|  | 175 | * retarded for light time in second pass; | 
|---|
|  | 176 | * alternative option:  vsop allows calculating rates. | 
|---|
|  | 177 | */ | 
|---|
| [2551] | 178 | planpos(mj - dt, p, 0.0, ret); | 
|---|
| [1457] | 179 |  | 
|---|
|  | 180 | lp = ret[0]; | 
|---|
|  | 181 | bp = ret[1]; | 
|---|
|  | 182 | rp = ret[2]; | 
|---|
|  | 183 |  | 
|---|
|  | 184 | sphcart (lp, bp, rp, &xp, &yp, &zp); | 
|---|
|  | 185 | cartsph (xp + xsn, yp + ysn, zp + zsn, lam, bet, &rho); | 
|---|
|  | 186 |  | 
|---|
|  | 187 | if (pass == 0) { | 
|---|
|  | 188 | /* save heliocentric coordinates at first pass since, being | 
|---|
|  | 189 | * true, they are NOT to be corrected for light-travel time. | 
|---|
|  | 190 | */ | 
|---|
|  | 191 | *lpd0 = lp; | 
|---|
|  | 192 | range (lpd0, 2.*PI); | 
|---|
|  | 193 | *psi0 = bp; | 
|---|
|  | 194 | *rp0 = rp; | 
|---|
|  | 195 | *rho0 = rho; | 
|---|
|  | 196 | } | 
|---|
|  | 197 |  | 
|---|
|  | 198 | /* when we view a planet we see it in the position it occupied | 
|---|
|  | 199 | * dt days ago, where rho is the distance between it and earth, | 
|---|
|  | 200 | * in AU. use this as the new time for the next pass. | 
|---|
|  | 201 | */ | 
|---|
|  | 202 | dt = rho * 5.7755183e-3; | 
|---|
|  | 203 | } | 
|---|
|  | 204 |  | 
|---|
| [1719] | 205 | vp = vis_elements[p]; | 
|---|
|  | 206 | *dia = vp[0]; | 
|---|
|  | 207 |  | 
|---|
|  | 208 | /* solve plane triangle, assume sun/earth dist == 1 */ | 
|---|
|  | 209 | ci = (rp*rp + rho*rho - 1)/(2*rp*rho); | 
|---|
|  | 210 |  | 
|---|
|  | 211 | /* expl supp equation for mag */ | 
|---|
|  | 212 | if (ci < -1) ci = -1; | 
|---|
|  | 213 | if (ci >  1) ci =  1; | 
|---|
|  | 214 | i = raddeg(acos(ci))/100.; | 
|---|
|  | 215 | *mag = vp[1] + 5*log10(rho*rp) + i*(vp[2] + i*(vp[3] + i*vp[4])); | 
|---|
|  | 216 |  | 
|---|
|  | 217 | /* rings contribution if SATURN */ | 
|---|
|  | 218 | if (p == SATURN) { | 
|---|
|  | 219 | double et, st, set; | 
|---|
| [2551] | 220 | satrings (bp, lp, rp, lsn+PI, rsn, mj+MJD0, &et, &st); | 
|---|
| [1719] | 221 | set = sin(fabs(et)); | 
|---|
|  | 222 | *mag += (-2.60 + 1.25*set)*set; | 
|---|
|  | 223 | } | 
|---|
| [1457] | 224 | } | 
|---|
|  | 225 |  | 
|---|
|  | 226 | /* For RCS Only -- Do Not Edit */ | 
|---|
| [2818] | 227 | static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: plans.c,v $ $Date: 2005-08-21 10:02:39 $ $Revision: 1.5 $ $Name: not supported by cvs2svn $"}; | 
|---|