| 1 | #include "slalib.h"
|
|---|
| 2 | #include "slamac.h"
|
|---|
| 3 | void slaFk524 ( double r2000, double d2000, double dr2000,
|
|---|
| 4 | double dd2000, double p2000, double v2000,
|
|---|
| 5 | double *r1950, double *d1950, double *dr1950,
|
|---|
| 6 | double *dd1950, double *p1950, double *v1950 )
|
|---|
| 7 | /*
|
|---|
| 8 | ** - - - - - - - - -
|
|---|
| 9 | ** s l a F k 5 2 4
|
|---|
| 10 | ** - - - - - - - - -
|
|---|
| 11 | **
|
|---|
| 12 | ** Convert J2000.0 FK5 star data to B1950.0 FK4.
|
|---|
| 13 | **
|
|---|
| 14 | ** (double precision)
|
|---|
| 15 | **
|
|---|
| 16 | ** This routine converts stars from the new, IAU 1976, FK5, Fricke
|
|---|
| 17 | ** system, to the old, Bessel-Newcomb, FK4 system. The precepts
|
|---|
| 18 | ** of Smith et al (Ref 1) are followed, using the implementation
|
|---|
| 19 | ** by Yallop et al (Ref 2) of a matrix method due to Standish.
|
|---|
| 20 | ** Kinoshita's development of Andoyer's post-Newcomb precession is
|
|---|
| 21 | ** used. The numerical constants from Seidelmann et al (Ref 3) are
|
|---|
| 22 | ** used canonically.
|
|---|
| 23 | **
|
|---|
| 24 | ** Given: (all J2000.0,FK5)
|
|---|
| 25 | ** r2000,d2000 double J2000.0 RA,Dec (rad)
|
|---|
| 26 | ** dr2000,dd2000 double J2000.0 proper motions (rad/Jul.yr)
|
|---|
| 27 | ** p2000 double parallax (arcsec)
|
|---|
| 28 | ** v2000 double radial velocity (km/s, +ve = moving away)
|
|---|
| 29 | **
|
|---|
| 30 | ** Returned: (all B1950.0,FK4)
|
|---|
| 31 | ** *r1950,*d1950 double B1950.0 RA,Dec (rad)
|
|---|
| 32 | ** *dr1950,*dd1950 double B1950.0 proper motions (rad/trop.yr)
|
|---|
| 33 | ** *p1950 double parallax (arcsec)
|
|---|
| 34 | ** *v1950 double radial velocity (km/s, +ve = moving away)
|
|---|
| 35 | **
|
|---|
| 36 | ** Notes:
|
|---|
| 37 | **
|
|---|
| 38 | ** 1) The proper motions in RA are dRA/dt rather than
|
|---|
| 39 | ** cos(Dec)*dRA/dt, and are per year rather than per century.
|
|---|
| 40 | **
|
|---|
| 41 | ** 2) Note that conversion from Julian epoch 2000.0 to Besselian
|
|---|
| 42 | ** epoch 1950.0 only is provided for. Conversions involving
|
|---|
| 43 | ** other epochs will require use of the appropriate precession,
|
|---|
| 44 | ** proper motion, and E-terms routines before and/or after
|
|---|
| 45 | ** FK524 is called.
|
|---|
| 46 | **
|
|---|
| 47 | ** 3) In the FK4 catalogue the proper motions of stars within
|
|---|
| 48 | ** 10 degrees of the poles do not embody the differential
|
|---|
| 49 | ** E-term effect and should, strictly speaking, be handled
|
|---|
| 50 | ** in a different manner from stars outside these regions.
|
|---|
| 51 | ** However, given the general lack of homogeneity of the star
|
|---|
| 52 | ** data available for routine astrometry, the difficulties of
|
|---|
| 53 | ** handling positions that may have been determined from
|
|---|
| 54 | ** astrometric fields spanning the polar and non-polar regions,
|
|---|
| 55 | ** the likelihood that the differential E-terms effect was not
|
|---|
| 56 | ** taken into account when allowing for proper motion in past
|
|---|
| 57 | ** astrometry, and the undesirability of a discontinuity in
|
|---|
| 58 | ** the algorithm, the decision has been made in this routine to
|
|---|
| 59 | ** include the effect of differential E-terms on the proper
|
|---|
| 60 | ** motions for all stars, whether polar or not. At epoch 2000,
|
|---|
| 61 | ** and measuring on the sky rather than in terms of dRA, the
|
|---|
| 62 | ** errors resulting from this simplification are less than
|
|---|
| 63 | ** 1 milliarcsecond in position and 1 milliarcsecond per
|
|---|
| 64 | ** century in proper motion.
|
|---|
| 65 | **
|
|---|
| 66 | ** References:
|
|---|
| 67 | **
|
|---|
| 68 | ** 1 Smith, C.A. et al, 1989. "The transformation of astrometric
|
|---|
| 69 | ** catalog systems to the equinox J2000.0". Astron.J. 97, 265.
|
|---|
| 70 | **
|
|---|
| 71 | ** 2 Yallop, B.D. et al, 1989. "Transformation of mean star places
|
|---|
| 72 | ** from FK4 B1950.0 to FK5 J2000.0 using matrices in 6-space".
|
|---|
| 73 | ** Astron.J. 97, 274.
|
|---|
| 74 | **
|
|---|
| 75 | ** 3 Seidelmann, P.K. (ed), 1992. "Explanatory Supplement to
|
|---|
| 76 | ** the Astronomical Almanac", ISBN 0-935702-68-7.
|
|---|
| 77 | **
|
|---|
| 78 | ** Defined in slamac.h: D2PI
|
|---|
| 79 | **
|
|---|
| 80 | ** Last revision: 20 December 1993
|
|---|
| 81 | **
|
|---|
| 82 | ** Copyright P.T.Wallace. All rights reserved.
|
|---|
| 83 | */
|
|---|
| 84 | {
|
|---|
| 85 |
|
|---|
| 86 | /* Miscellaneous */
|
|---|
| 87 | double r, d, ur, ud, px, rv;
|
|---|
| 88 | double sr, cr, sd, cd, x, y, z, w;
|
|---|
| 89 | double v1[6], v2[6];
|
|---|
| 90 | double xd, yd, zd;
|
|---|
| 91 | double rxyz, wd, rxysq, rxy;
|
|---|
| 92 | int i,j;
|
|---|
| 93 |
|
|---|
| 94 | /* Radians per year to arcsec per century */
|
|---|
| 95 | static double pmf = 100.0 * 60.0 * 60.0 * 360.0 / D2PI;
|
|---|
| 96 |
|
|---|
| 97 | /* Small number to avoid arithmetic problems */
|
|---|
| 98 | static double tiny = 1.0e-30;
|
|---|
| 99 |
|
|---|
| 100 | /*
|
|---|
| 101 | ** Canonical constants (see references)
|
|---|
| 102 | */
|
|---|
| 103 |
|
|---|
| 104 | /*
|
|---|
| 105 | ** km per sec to AU per tropical century
|
|---|
| 106 | ** = 86400 * 36524.2198782 / 1.49597870e8
|
|---|
| 107 | */
|
|---|
| 108 | static double vf = 21.095;
|
|---|
| 109 |
|
|---|
| 110 | /* Constant vector and matrix (by rows) */
|
|---|
| 111 | static double a[6] = { -1.62557e-6, -0.31919e-6, -0.13843e-6,
|
|---|
| 112 | 1.245e-3, -1.580e-3, -0.659e-3 };
|
|---|
| 113 |
|
|---|
| 114 | static double emi[6][6] =
|
|---|
| 115 | {
|
|---|
| 116 | { 0.9999256795, /* emi[0][0] */
|
|---|
| 117 | 0.0111814828, /* emi[0][1] */
|
|---|
| 118 | 0.0048590039, /* emi[0][2] */
|
|---|
| 119 | -0.00000242389840, /* emi[0][3] */
|
|---|
| 120 | -0.00000002710544, /* emi[0][4] */
|
|---|
| 121 | -0.00000001177742 }, /* emi[0][5] */
|
|---|
| 122 |
|
|---|
| 123 | { -0.0111814828, /* emi[1][0] */
|
|---|
| 124 | 0.9999374849, /* emi[1][1] */
|
|---|
| 125 | -0.0000271771, /* emi[1][2] */
|
|---|
| 126 | 0.00000002710544, /* emi[1][3] */
|
|---|
| 127 | -0.00000242392702, /* emi[1][4] */
|
|---|
| 128 | 0.00000000006585 }, /* emi[1][5] */
|
|---|
| 129 |
|
|---|
| 130 | { -0.0048590040, /* emi[2][0] */
|
|---|
| 131 | -0.0000271557, /* emi[2][1] */
|
|---|
| 132 | 0.9999881946, /* emi[2][2] */
|
|---|
| 133 | 0.00000001177742, /* emi[2][3] */
|
|---|
| 134 | 0.00000000006585, /* emi[2][4] */
|
|---|
| 135 | -0.00000242404995 }, /* emi[2][5] */
|
|---|
| 136 |
|
|---|
| 137 | { -0.000551, /* emi[3][0] */
|
|---|
| 138 | 0.238509, /* emi[3][1] */
|
|---|
| 139 | -0.435614, /* emi[3][2] */
|
|---|
| 140 | 0.99990432, /* emi[3][3] */
|
|---|
| 141 | 0.01118145, /* emi[3][4] */
|
|---|
| 142 | 0.00485852 }, /* emi[3][5] */
|
|---|
| 143 |
|
|---|
| 144 | { -0.238560, /* emi[4][0] */
|
|---|
| 145 | -0.002667, /* emi[4][1] */
|
|---|
| 146 | 0.012254, /* emi[4][2] */
|
|---|
| 147 | -0.01118145, /* emi[4][3] */
|
|---|
| 148 | 0.99991613, /* emi[4][4] */
|
|---|
| 149 | -0.00002717 }, /* emi[4][5] */
|
|---|
| 150 |
|
|---|
| 151 | { 0.435730, /* emi[5][0] */
|
|---|
| 152 | -0.008541, /* emi[5][1] */
|
|---|
| 153 | 0.002117, /* emi[5][2] */
|
|---|
| 154 | -0.00485852, /* emi[5][3] */
|
|---|
| 155 | -0.00002716, /* emi[5][4] */
|
|---|
| 156 | 0.99996684 } /* emi[5][5] */
|
|---|
| 157 | };
|
|---|
| 158 |
|
|---|
| 159 | /* Pick up J2000 data (units radians and arcsec/JC) */
|
|---|
| 160 | r = r2000;
|
|---|
| 161 | d = d2000;
|
|---|
| 162 | ur = dr2000 * pmf;
|
|---|
| 163 | ud = dd2000 * pmf;
|
|---|
| 164 | px = p2000;
|
|---|
| 165 | rv = v2000;
|
|---|
| 166 |
|
|---|
| 167 | /* Spherical to Cartesian */
|
|---|
| 168 | sr = sin ( r );
|
|---|
| 169 | cr = cos ( r );
|
|---|
| 170 | sd = sin ( d );
|
|---|
| 171 | cd = cos ( d );
|
|---|
| 172 |
|
|---|
| 173 | x = cr * cd;
|
|---|
| 174 | y = sr * cd;
|
|---|
| 175 | z = sd;
|
|---|
| 176 |
|
|---|
| 177 | w = vf * rv * px;
|
|---|
| 178 |
|
|---|
| 179 | v1[0] = x;
|
|---|
| 180 | v1[1] = y;
|
|---|
| 181 | v1[2] = z;
|
|---|
| 182 |
|
|---|
| 183 | v1[3] = - ur * y - cr * sd * ud + w * x;
|
|---|
| 184 | v1[4] = ur * x - sr * sd * ud + w * y;
|
|---|
| 185 | v1[5] = cd * ud + w * z;
|
|---|
| 186 |
|
|---|
| 187 | /* Convert position+velocity vector to BN system */
|
|---|
| 188 | for ( i = 0; i < 6; i++ ) {
|
|---|
| 189 | w = 0.0;
|
|---|
| 190 | for ( j = 0; j < 6; j++ ) {
|
|---|
| 191 | w += emi[i][j] * v1[j];
|
|---|
| 192 | }
|
|---|
| 193 | v2[i] = w;
|
|---|
| 194 | }
|
|---|
| 195 |
|
|---|
| 196 | /* Position vector components and magnitude */
|
|---|
| 197 | x = v2[0];
|
|---|
| 198 | y = v2[1];
|
|---|
| 199 | z = v2[2];
|
|---|
| 200 | rxyz = sqrt ( x * x + y * y + z * z );
|
|---|
| 201 |
|
|---|
| 202 | /* Include e-terms */
|
|---|
| 203 | w = x * a[0] + y * a[1] + z * a[2];
|
|---|
| 204 | x += a[0] * rxyz - w * x;
|
|---|
| 205 | y += a[1] * rxyz - w * y;
|
|---|
| 206 | z += a[2] * rxyz - w * z;
|
|---|
| 207 |
|
|---|
| 208 | /* Recompute magnitude */
|
|---|
| 209 | rxyz = sqrt ( x * x + y * y + z * z );
|
|---|
| 210 |
|
|---|
| 211 | /* Apply E-terms to both position and velocity */
|
|---|
| 212 | x = v2[0];
|
|---|
| 213 | y = v2[1];
|
|---|
| 214 | z = v2[2];
|
|---|
| 215 | w = x * a[0] + y * a[1] + z * a[2];
|
|---|
| 216 | wd = x * a[3] + y * a[4] + z * a[5];
|
|---|
| 217 | x += a[0] * rxyz - w * x;
|
|---|
| 218 | y += a[1] * rxyz - w * y;
|
|---|
| 219 | z += a[2] * rxyz - w * z;
|
|---|
| 220 | xd = v2[3] + a[3] * rxyz - wd * x;
|
|---|
| 221 | yd = v2[4] + a[4] * rxyz - wd * y;
|
|---|
| 222 | zd = v2[5] + a[5] * rxyz - wd * z;
|
|---|
| 223 |
|
|---|
| 224 | /* Convert to spherical */
|
|---|
| 225 | rxysq = x * x + y * y;
|
|---|
| 226 | rxy = sqrt ( rxysq );
|
|---|
| 227 |
|
|---|
| 228 | if ( ( x == 0.0 ) && ( y == 0.0 ) ) {
|
|---|
| 229 | r = 0.0;
|
|---|
| 230 | } else {
|
|---|
| 231 | r = atan2 ( y, x );
|
|---|
| 232 | if ( r < 0.0 ) r += D2PI;
|
|---|
| 233 | }
|
|---|
| 234 | d = atan2 ( z, rxy );
|
|---|
| 235 |
|
|---|
| 236 | if (rxy > tiny) {
|
|---|
| 237 | ur = ( x * yd - y * xd ) / rxysq;
|
|---|
| 238 | ud = ( zd * rxysq - z * ( x * xd + y * yd ) ) /
|
|---|
| 239 | ( ( rxysq + z * z ) * rxy );
|
|---|
| 240 | }
|
|---|
| 241 |
|
|---|
| 242 | /* Radial velocity and parallax */
|
|---|
| 243 | if ( px > tiny )
|
|---|
| 244 | {
|
|---|
| 245 | rv = ( x * xd + y * yd + z * zd ) / ( px * vf * rxyz );
|
|---|
| 246 | px = px / rxyz;
|
|---|
| 247 | }
|
|---|
| 248 |
|
|---|
| 249 | /* Return results */
|
|---|
| 250 | *r1950 = r;
|
|---|
| 251 | *d1950 = d;
|
|---|
| 252 | *dr1950 = ur / pmf;
|
|---|
| 253 | *dd1950 = ud / pmf;
|
|---|
| 254 | *v1950 = rv;
|
|---|
| 255 | *p1950 = px;
|
|---|
| 256 | }
|
|---|