void palGalsup ( double dl, double db, double *dsl, double *dsb ) { double v1[3]; double v2[3]; /* * System of supergalactic coordinates: * * SGL SGB L2 B2 (deg) * - +90 47.37 +6.32 * 0 0 - 0 * * Galactic to supergalactic rotation matrix: */ double rmat[3][3] = { { -0.735742574804,+0.677261296414,+0.000000000000 }, { -0.074553778365,-0.080991471307,+0.993922590400 }, { +0.673145302109,+0.731271165817,+0.110081262225 } }; /* Spherical to Cartesian */ eraS2c( dl, db, v1 ); /* Galactic to Supergalactic */ eraRxp( rmat, v1, v2 ); /* Cartesian to spherical */ eraC2s( v2, dsl, dsb ); /* Express in conventional ranges */ *dsl = eraAnp( *dsl ); *dsb = eraAnpm( *dsb ); }
void palGe50 ( double dl, double db, double * dr, double * dd ) { /* * L2,B2 system of galactic coordinates * * P = 192.25 RA of galactic north pole (mean B1950.0) * Q = 62.6 inclination of galactic to mean B1950.0 equator * R = 33 longitude of ascending node * * P,Q,R are degrees * * * Equatorial to galactic rotation matrix * * The Euler angles are P, Q, 90-R, about the z then y then * z axes. * * +CP.CQ.SR-SP.CR +SP.CQ.SR+CP.CR -SQ.SR * * -CP.CQ.CR-SP.SR -SP.CQ.CR+CP.SR +SQ.CR * * +CP.SQ +SP.SQ +CQ * */ double rmat[3][3] = { { -0.066988739415,-0.872755765852,-0.483538914632 }, { +0.492728466075,-0.450346958020,+0.744584633283 }, { -0.867600811151,-0.188374601723,+0.460199784784 } }; double v1[3], v2[3], r, d, re, de; /* Spherical to cartesian */ eraS2c( dl, db, v1 ); /* Rotate to mean B1950.0 */ eraTrxp( rmat, v1, v2 ); /* Cartesian to spherical */ eraC2s( v2, &r, &d ); /* Introduce E-terms */ palAddet( r, d, 1950.0, &re, &de ); /* Express in conventional ranges */ *dr = eraAnp( re ); *dd = eraAnpm( de ); }
void palDtp2s ( double xi, double eta, double raz, double decz, double *ra, double *dec ) { double cdecz; double denom; double sdecz; double d; sdecz = sin(decz); cdecz = cos(decz); denom = cdecz - eta * sdecz; d = atan2(xi, denom) + raz; *ra = eraAnp(d); *dec = atan2(sdecz + eta * cdecz, sqrt(xi * xi + denom * denom)); return; }
void palMapqkz ( double rm, double dm, double amprms[21], double *ra, double *da ){ /* Local Variables: */ int i; double ab1, abv[3], p[3], w, p1dv, p2[3], p3[3]; double gr2e, pde, pdep1, ehn[3], p1[3]; /* Unpack scalar and vector parameters. */ ab1 = amprms[11]; gr2e = amprms[7]; for( i = 0; i < 3; i++ ) { abv[i] = amprms[i+8]; ehn[i] = amprms[i+4]; } /* Spherical to x,y,z. */ eraS2c( rm, dm, p ); /* Light deflection (restrained within the Sun's disc) */ pde = eraPdp( p, ehn ); pdep1 = pde + 1.0; w = gr2e / ( pdep1 > 1.0e-5 ? pdep1 : 1.0e-5 ); for( i = 0; i < 3; i++) { p1[i] = p[i] + w * ( ehn[i] - pde * p[i] ); } /* Aberration. */ p1dv = eraPdp( p1, abv ); w = 1.0 + p1dv / ( ab1 + 1.0 ); for( i = 0; i < 3; i++ ) { p2[i] = ( ( ab1 * p1[i] ) + ( w * abv[i] ) ); } /* Precession and nutation. */ eraRxp( (double(*)[3]) &rms[12], p2, p3 ); /* Geocentric apparent RA,dec. */ eraC2s( p3, ra, da ); *ra = eraAnp( *ra ); }
void palEqecl ( double dr, double dd, double date, double *dl, double *db ) { double v1[3], v2[3]; double rmat[3][3]; /* Spherical to Cartesian */ eraS2c( dr, dd, v1 ); /* Mean J2000 to mean of date */ palPrec( 2000.0, palEpj(date), rmat ); eraRxp( rmat, v1, v2 ); /* Equatorial to ecliptic */ palEcmat( date, rmat ); eraRxp( rmat, v2, v1 ); /* Cartesian to spherical */ eraC2s( v1, dl, db ); /* Express in conventional range */ *dl = eraAnp( *dl ); *db = palDrange( *db ); }
double eraGmst06(double uta, double utb, double tta, double ttb) /* ** - - - - - - - - - - ** e r a G m s t 0 6 ** - - - - - - - - - - ** ** Greenwich mean sidereal time (consistent with IAU 2006 precession). ** ** Given: ** uta,utb double UT1 as a 2-part Julian Date (Notes 1,2) ** tta,ttb double TT as a 2-part Julian Date (Notes 1,2) ** ** Returned (function value): ** double Greenwich mean sidereal time (radians) ** ** Notes: ** ** 1) The UT1 and TT dates uta+utb and tta+ttb respectively, are both ** Julian Dates, apportioned in any convenient way between the ** argument pairs. For example, JD=2450123.7 could be expressed in ** any of these ways, among others: ** ** Part A Part B ** ** 2450123.7 0.0 (JD method) ** 2451545.0 -1421.3 (J2000 method) ** 2400000.5 50123.2 (MJD method) ** 2450123.5 0.2 (date & time method) ** ** The JD method is the most natural and convenient to use in ** cases where the loss of several decimal digits of resolution ** is acceptable (in the case of UT; the TT is not at all critical ** in this respect). The J2000 and MJD methods are good compromises ** between resolution and convenience. For UT, the date & time ** method is best matched to the algorithm that is used by the Earth ** rotation angle function, called internally: maximum precision is ** delivered when the uta argument is for 0hrs UT1 on the day in ** question and the utb argument lies in the range 0 to 1, or vice ** versa. ** ** 2) Both UT1 and TT are required, UT1 to predict the Earth rotation ** and TT to predict the effects of precession. If UT1 is used for ** both purposes, errors of order 100 microarcseconds result. ** ** 3) This GMST is compatible with the IAU 2006 precession and must not ** be used with other precession models. ** ** 4) The result is returned in the range 0 to 2pi. ** ** Called: ** eraEra00 Earth rotation angle, IAU 2000 ** eraAnp normalize angle into range 0 to 2pi ** ** Reference: ** ** Capitaine, N., Wallace, P.T. & Chapront, J., 2005, ** Astron.Astrophys. 432, 355 ** ** Copyright (C) 2013, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double t, gmst; /* TT Julian centuries since J2000.0. */ t = ((tta - DJ00) + ttb) / DJC; /* Greenwich mean sidereal time, IAU 2006. */ gmst = eraAnp(eraEra00(uta, utb) + ( 0.014506 + ( 4612.156534 + ( 1.3915817 + ( -0.00000044 + ( -0.000029956 + ( -0.0000000368 ) * t) * t) * t) * t) * t) * DAS2R); return gmst; }
double eraGmst00(double uta, double utb, double tta, double ttb) /* ** - - - - - - - - - - ** e r a G m s t 0 0 ** - - - - - - - - - - ** ** Greenwich mean sidereal time (model consistent with IAU 2000 ** resolutions). ** ** Given: ** uta,utb double UT1 as a 2-part Julian Date (Notes 1,2) ** tta,ttb double TT as a 2-part Julian Date (Notes 1,2) ** ** Returned (function value): ** double Greenwich mean sidereal time (radians) ** ** Notes: ** ** 1) The UT1 and TT dates uta+utb and tta+ttb respectively, are both ** Julian Dates, apportioned in any convenient way between the ** argument pairs. For example, JD=2450123.7 could be expressed in ** any of these ways, among others: ** ** Part A Part B ** ** 2450123.7 0.0 (JD method) ** 2451545.0 -1421.3 (J2000 method) ** 2400000.5 50123.2 (MJD method) ** 2450123.5 0.2 (date & time method) ** ** The JD method is the most natural and convenient to use in ** cases where the loss of several decimal digits of resolution ** is acceptable (in the case of UT; the TT is not at all critical ** in this respect). The J2000 and MJD methods are good compromises ** between resolution and convenience. For UT, the date & time ** method is best matched to the algorithm that is used by the Earth ** Rotation Angle function, called internally: maximum precision is ** delivered when the uta argument is for 0hrs UT1 on the day in ** question and the utb argument lies in the range 0 to 1, or vice ** versa. ** ** 2) Both UT1 and TT are required, UT1 to predict the Earth rotation ** and TT to predict the effects of precession. If UT1 is used for ** both purposes, errors of order 100 microarcseconds result. ** ** 3) This GMST is compatible with the IAU 2000 resolutions and must be ** used only in conjunction with other IAU 2000 compatible ** components such as precession-nutation and equation of the ** equinoxes. ** ** 4) The result is returned in the range 0 to 2pi. ** ** 5) The algorithm is from Capitaine et al. (2003) and IERS ** Conventions 2003. ** ** Called: ** eraEra00 Earth rotation angle, IAU 2000 ** eraAnp normalize angle into range 0 to 2pi ** ** References: ** ** Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to ** implement the IAU 2000 definition of UT1", Astronomy & ** Astrophysics, 406, 1135-1149 (2003) ** ** McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), ** IERS Technical Note No. 32, BKG (2004) ** ** Copyright (C) 2013, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double t, gmst; /* TT Julian centuries since J2000.0. */ t = ((tta - ERFA_DJ00) + ttb) / ERFA_DJC; /* Greenwich Mean Sidereal Time, IAU 2000. */ gmst = eraAnp(eraEra00(uta, utb) + ( 0.014506 + ( 4612.15739966 + ( 1.39667721 + ( -0.00009344 + ( 0.00001882 ) * t) * t) * t) * t) * ERFA_DAS2R); return gmst; }
void eraAtciq(double rc, double dc, double pr, double pd, double px, double rv, eraASTROM *astrom, double *ri, double *di) /* ** - - - - - - - - - ** e r a A t c i q ** - - - - - - - - - ** ** Quick ICRS, epoch J2000.0, to CIRS transformation, given precomputed ** star-independent astrometry parameters. ** ** Use of this function is appropriate when efficiency is important and ** where many star positions are to be transformed for one date. The ** star-independent parameters can be obtained by calling one of the ** functions eraApci[13], eraApcg[13], eraApco[13] or eraApcs[13]. ** ** If the parallax and proper motions are zero the eraAtciqz function ** can be used instead. ** ** Given: ** rc,dc double ICRS RA,Dec at J2000.0 (radians) ** pr double RA proper motion (radians/year; Note 3) ** pd double Dec proper motion (radians/year) ** px double parallax (arcsec) ** rv double radial velocity (km/s, +ve if receding) ** astrom eraASTROM* star-independent astrometry parameters: ** pmt double PM time interval (SSB, Julian years) ** eb double[3] SSB to observer (vector, au) ** eh double[3] Sun to observer (unit vector) ** em double distance from Sun to observer (au) ** v double[3] barycentric observer velocity (vector, c) ** bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor ** bpn double[3][3] bias-precession-nutation matrix ** along double longitude + s' (radians) ** xpl double polar motion xp wrt local meridian (radians) ** ypl double polar motion yp wrt local meridian (radians) ** sphi double sine of geodetic latitude ** cphi double cosine of geodetic latitude ** diurab double magnitude of diurnal aberration vector ** eral double "local" Earth rotation angle (radians) ** refa double refraction constant A (radians) ** refb double refraction constant B (radians) ** ** Returned: ** ri,di double CIRS RA,Dec (radians) ** ** Notes: ** ** 1) All the vectors are with respect to BCRS axes. ** ** 2) Star data for an epoch other than J2000.0 (for example from the ** Hipparcos catalog, which has an epoch of J1991.25) will require a ** preliminary call to eraPmsafe before use. ** ** 3) The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. ** ** Called: ** eraPmpx proper motion and parallax ** eraLdsun light deflection by the Sun ** eraAb stellar aberration ** eraRxp product of r-matrix and pv-vector ** eraC2s p-vector to spherical ** eraAnp normalize angle into range 0 to 2pi ** ** Copyright (C) 2013-2016, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double pco[3], pnat[3], ppr[3], pi[3], w; /* Proper motion and parallax, giving BCRS coordinate direction. */ eraPmpx(rc, dc, pr, pd, px, rv, astrom->pmt, astrom->eb, pco); /* Light deflection by the Sun, giving BCRS natural direction. */ eraLdsun(pco, astrom->eh, astrom->em, pnat); /* Aberration, giving GCRS proper direction. */ eraAb(pnat, astrom->v, astrom->em, astrom->bm1, ppr); /* Bias-precession-nutation, giving CIRS proper direction. */ eraRxp(astrom->bpn, ppr, pi); /* CIRS RA,Dec. */ eraC2s(pi, &w, di); *ri = eraAnp(w); /* Finished. */ }
void eraAtciqz(double rc, double dc, eraASTROM *astrom, double *ri, double *di) /* ** - - - - - - - - - - ** e r a A t c i q z ** - - - - - - - - - - ** ** Quick ICRS to CIRS transformation, given precomputed star- ** independent astrometry parameters, and assuming zero parallax and ** proper motion. ** ** Use of this function is appropriate when efficiency is important and ** where many star positions are to be transformed for one date. The ** star-independent parameters can be obtained by calling one of the ** functions eraApci[13], eraApcg[13], eraApco[13] or eraApcs[13]. ** ** The corresponding function for the case of non-zero parallax and ** proper motion is eraAtciq. ** ** Given: ** rc,dc double ICRS astrometric RA,Dec (radians) ** astrom eraASTROM* star-independent astrometry parameters: ** pmt double PM time interval (SSB, Julian years) ** eb double[3] SSB to observer (vector, au) ** eh double[3] Sun to observer (unit vector) ** em double distance from Sun to observer (au) ** v double[3] barycentric observer velocity (vector, c) ** bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor ** bpn double[3][3] bias-precession-nutation matrix ** along double longitude + s' (radians) ** xpl double polar motion xp wrt local meridian (radians) ** ypl double polar motion yp wrt local meridian (radians) ** sphi double sine of geodetic latitude ** cphi double cosine of geodetic latitude ** diurab double magnitude of diurnal aberration vector ** eral double "local" Earth rotation angle (radians) ** refa double refraction constant A (radians) ** refb double refraction constant B (radians) ** ** Returned: ** ri,di double CIRS RA,Dec (radians) ** ** Note: ** ** All the vectors are with respect to BCRS axes. ** ** References: ** ** Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to ** the Astronomical Almanac, 3rd ed., University Science Books ** (2013). ** ** Klioner, Sergei A., "A practical relativistic model for micro- ** arcsecond astrometry in space", Astr. J. 125, 1580-1597 (2003). ** ** Called: ** eraS2c spherical coordinates to unit vector ** eraLdsun light deflection due to Sun ** eraAb stellar aberration ** eraRxp product of r-matrix and p-vector ** eraC2s p-vector to spherical ** eraAnp normalize angle into range +/- pi ** ** Copyright (C) 2013-2015, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double pco[3], pnat[3], ppr[3], pi[3], w; /* BCRS coordinate direction (unit vector). */ eraS2c(rc, dc, pco); /* Light deflection by the Sun, giving BCRS natural direction. */ eraLdsun(pco, astrom->eh, astrom->em, pnat); /* Aberration, giving GCRS proper direction. */ eraAb(pnat, astrom->v, astrom->em, astrom->bm1, ppr); /* Bias-precession-nutation, giving CIRS proper direction. */ eraRxp(astrom->bpn, ppr, pi); /* CIRS RA,Dec. */ eraC2s(pi, &w, di); *ri = eraAnp(w); /* Finished. */ }
void palFk45z( double r1950, double d1950, double bepoch, double *r2000, double *d2000 ){ /* Local Variables: */ double w; int i; int j; double r0[3], a1[3], v1[3], v2[6]; /* Position and position+velocity vectors */ /* CANONICAL CONSTANTS (see references) */ /* Vector A. */ double a[3] = { -1.62557E-6, -0.31919E-6, -0.13843E-6 }; /* Vectors Adot. */ double ad[3] = { 1.245E-3, -1.580E-3, -0.659E-3 }; /* Matrix M (only half of which is needed here). */ double em[6][3] = { {0.9999256782, -0.0111820611, -0.0048579477}, {0.0111820610, 0.9999374784, -0.0000271765}, {0.0048579479, -0.0000271474, 0.9999881997}, {-0.000551, -0.238565, 0.435739}, {0.238514, -0.002667, -0.008541}, {-0.435623, 0.012254, 0.002117} }; /* Spherical to Cartesian. */ eraS2c( r1950, d1950, r0 ); /* Adjust vector A to give zero proper motion in FK5. */ w = ( bepoch - 1950.0 )/PAL__PMF; for( i = 0; i < 3; i++ ) { a1[ i ] = a[ i ] + w*ad[ i ]; } /* Remove e-terms. */ w = r0[ 0 ]*a1[ 0 ] + r0[ 1 ]*a1[ 1 ] + r0[ 2 ]*a1[ 2 ]; for( i = 0; i < 3; i++ ) { v1[ i ] = r0[ i ] - a1[ i ] + w*r0[ i ]; } /* Convert position vector to Fricke system. */ for( i = 0; i < 6; i++ ) { w = 0.0; for( j = 0; j < 3; j++ ) { w += em[ i ][ j ]*v1[ j ]; } v2[ i ] = w; } /* Allow for fictitious proper motion in FK4. */ w = ( palEpj( palEpb2d( bepoch ) ) - 2000.0 )/PAL__PMF; for( i = 0; i < 3; i++ ) { v2[ i ] += w*v2[ i + 3 ]; } /* Revert to spherical coordinates. */ eraC2s( v2, &w, d2000 ); *r2000 = eraAnp( w ); }
double eraGst94(double uta, double utb) /* ** - - - - - - - - - ** e r a G s t 9 4 ** - - - - - - - - - ** ** Greenwich apparent sidereal time (consistent with IAU 1982/94 ** resolutions). ** ** Given: ** uta,utb double UT1 as a 2-part Julian Date (Notes 1,2) ** ** Returned (function value): ** double Greenwich apparent sidereal time (radians) ** ** Notes: ** ** 1) The UT1 date uta+utb is a Julian Date, apportioned in any ** convenient way between the argument pair. For example, ** JD=2450123.7 could be expressed in any of these ways, among ** others: ** ** uta utb ** ** 2450123.7 0.0 (JD method) ** 2451545.0 -1421.3 (J2000 method) ** 2400000.5 50123.2 (MJD method) ** 2450123.5 0.2 (date & time method) ** ** The JD method is the most natural and convenient to use in cases ** where the loss of several decimal digits of resolution is ** acceptable. The J2000 and MJD methods are good compromises ** between resolution and convenience. For UT, the date & time ** method is best matched to the algorithm that is used by the Earth ** Rotation Angle function, called internally: maximum precision is ** delivered when the uta argument is for 0hrs UT1 on the day in ** question and the utb argument lies in the range 0 to 1, or vice ** versa. ** ** 2) The result is compatible with the IAU 1982 and 1994 resolutions, ** except that accuracy has been compromised for the sake of ** convenience in that UT is used instead of TDB (or TT) to compute ** the equation of the equinoxes. ** ** 3) This GAST must be used only in conjunction with contemporaneous ** IAU standards such as 1976 precession, 1980 obliquity and 1982 ** nutation. It is not compatible with the IAU 2000 resolutions. ** ** 4) The result is returned in the range 0 to 2pi. ** ** Called: ** eraGmst82 Greenwich mean sidereal time, IAU 1982 ** eraEqeq94 equation of the equinoxes, IAU 1994 ** eraAnp normalize angle into range 0 to 2pi ** ** References: ** ** Explanatory Supplement to the Astronomical Almanac, ** P. Kenneth Seidelmann (ed), University Science Books (1992) ** ** IAU Resolution C7, Recommendation 3 (1994) ** ** Copyright (C) 2013, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double gmst82, eqeq94, gst; gmst82 = eraGmst82(uta, utb); eqeq94 = eraEqeq94(uta, utb); gst = eraAnp(gmst82 + eqeq94); return gst; }
double eraGmst82(double dj1, double dj2) /* ** - - - - - - - - - - ** e r a G m s t 8 2 ** - - - - - - - - - - ** ** Universal Time to Greenwich mean sidereal time (IAU 1982 model). ** ** Given: ** dj1,dj2 double UT1 Julian Date (see note) ** ** Returned (function value): ** double Greenwich mean sidereal time (radians) ** ** Notes: ** ** 1) The UT1 date dj1+dj2 is a Julian Date, apportioned in any ** convenient way between the arguments dj1 and dj2. For example, ** JD(UT1)=2450123.7 could be expressed in any of these ways, ** among others: ** ** dj1 dj2 ** ** 2450123.7D0 0D0 (JD method) ** 2451545D0 -1421.3D0 (J2000 method) ** 2400000.5D0 50123.2D0 (MJD method) ** 2450123.5D0 0.2D0 (date & time method) ** ** The JD method is the most natural and convenient to use in ** cases where the loss of several decimal digits of resolution ** is acceptable. The J2000 and MJD methods are good compromises ** between resolution and convenience. The date & time method is ** best matched to the algorithm used: maximum accuracy (or, at ** least, minimum noise) is delivered when the dj1 argument is for ** 0hrs UT1 on the day in question and the dj2 argument lies in the ** range 0 to 1, or vice versa. ** ** 2) The algorithm is based on the IAU 1982 expression. This is ** always described as giving the GMST at 0 hours UT1. In fact, it ** gives the difference between the GMST and the UT, the steady ** 4-minutes-per-day drawing-ahead of ST with respect to UT. When ** whole days are ignored, the expression happens to equal the GMST ** at 0 hours UT1 each day. ** ** 3) In this function, the entire UT1 (the sum of the two arguments ** dj1 and dj2) is used directly as the argument for the standard ** formula, the constant term of which is adjusted by 12 hours to ** take account of the noon phasing of Julian Date. The UT1 is then ** added, but omitting whole days to conserve accuracy. ** ** Called: ** eraAnp normalize angle into range 0 to 2pi ** ** References: ** ** Transactions of the International Astronomical Union, ** XVIII B, 67 (1983). ** ** Aoki et al., Astron. Astrophys. 105, 359-361 (1982). ** ** Copyright (C) 2013, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { /* Coefficients of IAU 1982 GMST-UT1 model */ double A = 24110.54841 - DAYSEC / 2.0; double B = 8640184.812866; double C = 0.093104; double D = -6.2e-6; /* Note: the first constant, A, has to be adjusted by 12 hours */ /* because the UT1 is supplied as a Julian date, which begins */ /* at noon. */ double d1, d2, t, f, gmst; /* Julian centuries since fundamental epoch. */ if (dj1 < dj2) { d1 = dj1; d2 = dj2; } else { d1 = dj2; d2 = dj1; } t = (d1 + (d2 - DJ00)) / DJC; /* Fractional part of JD(UT1), in seconds. */ f = DAYSEC * (fmod(d1, 1.0) + fmod(d2, 1.0)); /* GMST at this UT1. */ gmst = eraAnp(DS2R * ((A + (B + (C + D * t) * t) * t) + f)); return gmst; }
void eraHfk5z(double rh, double dh, double date1, double date2, double *r5, double *d5, double *dr5, double *dd5) /* ** - - - - - - - - - ** e r a H f k 5 z ** - - - - - - - - - ** ** Transform a Hipparcos star position into FK5 J2000.0, assuming ** zero Hipparcos proper motion. ** ** Given: ** rh double Hipparcos RA (radians) ** dh double Hipparcos Dec (radians) ** date1,date2 double TDB date (Note 1) ** ** Returned (all FK5, equinox J2000.0, date date1+date2): ** r5 double RA (radians) ** d5 double Dec (radians) ** dr5 double FK5 RA proper motion (rad/year, Note 4) ** dd5 double Dec proper motion (rad/year, Note 4) ** ** Notes: ** ** 1) The TT date date1+date2 is a Julian Date, apportioned in any ** convenient way between the two arguments. For example, ** JD(TT)=2450123.7 could be expressed in any of these ways, ** among others: ** ** date1 date2 ** ** 2450123.7 0.0 (JD method) ** 2451545.0 -1421.3 (J2000 method) ** 2400000.5 50123.2 (MJD method) ** 2450123.5 0.2 (date & time method) ** ** The JD method is the most natural and convenient to use in ** cases where the loss of several decimal digits of resolution ** is acceptable. The J2000 method is best matched to the way ** the argument is handled internally and will deliver the ** optimum resolution. The MJD method and the date & time methods ** are both good compromises between resolution and convenience. ** ** 2) The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. ** ** 3) The FK5 to Hipparcos transformation is modeled as a pure rotation ** and spin; zonal errors in the FK5 catalogue are not taken into ** account. ** ** 4) It was the intention that Hipparcos should be a close ** approximation to an inertial frame, so that distant objects have ** zero proper motion; such objects have (in general) non-zero ** proper motion in FK5, and this function returns those fictitious ** proper motions. ** ** 5) The position returned by this function is in the FK5 J2000.0 ** reference system but at date date1+date2. ** ** 6) See also eraFk52h, eraH2fk5, eraFk5zhz. ** ** Called: ** eraS2c spherical coordinates to unit vector ** eraFk5hip FK5 to Hipparcos rotation and spin ** eraRxp product of r-matrix and p-vector ** eraSxp multiply p-vector by scalar ** eraRxr product of two r-matrices ** eraTrxp product of transpose of r-matrix and p-vector ** eraPxp vector product of two p-vectors ** eraPv2s pv-vector to spherical ** eraAnp normalize angle into range 0 to 2pi ** ** Reference: ** ** F.Mignard & M.Froeschle, 2000, Astron.Astrophys. 354, 732-739. ** ** Copyright (C) 2013, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double t, ph[3], r5h[3][3], s5h[3], sh[3], vst[3], rst[3][3], r5ht[3][3], pv5e[2][3], vv[3], w, r, v; /* Time interval from fundamental epoch J2000.0 to given date (JY). */ t = ((date1 - DJ00) + date2) / DJY; /* Hipparcos barycentric position vector (normalized). */ eraS2c(rh, dh, ph); /* FK5 to Hipparcos orientation matrix and spin vector. */ eraFk5hip(r5h, s5h); /* Rotate the spin into the Hipparcos system. */ eraRxp(r5h, s5h, sh); /* Accumulated Hipparcos wrt FK5 spin over that interval. */ eraSxp(t, s5h, vst); /* Express the accumulated spin as a rotation matrix. */ eraRv2m(vst, rst); /* Rotation matrix: accumulated spin, then FK5 to Hipparcos. */ eraRxr(r5h, rst, r5ht); /* De-orient & de-spin the Hipparcos position into FK5 J2000.0. */ eraTrxp(r5ht, ph, pv5e[0]); /* Apply spin to the position giving a space motion. */ eraPxp(sh, ph, vv); /* De-orient & de-spin the Hipparcos space motion into FK5 J2000.0. */ eraTrxp(r5ht, vv, pv5e[1]); /* FK5 position/velocity pv-vector to spherical. */ eraPv2s(pv5e, &w, d5, &r, dr5, dd5, &v); *r5 = eraAnp(w); return; }
void eraFk5hz(double r5, double d5, double date1, double date2, double *rh, double *dh) /* ** - - - - - - - - - ** e r a F k 5 h z ** - - - - - - - - - ** ** Transform an FK5 (J2000.0) star position into the system of the ** Hipparcos catalogue, assuming zero Hipparcos proper motion. ** ** Given: ** r5 double FK5 RA (radians), equinox J2000.0, at date ** d5 double FK5 Dec (radians), equinox J2000.0, at date ** date1,date2 double TDB date (Notes 1,2) ** ** Returned: ** rh double Hipparcos RA (radians) ** dh double Hipparcos Dec (radians) ** ** Notes: ** ** 1) This function converts a star position from the FK5 system to ** the Hipparcos system, in such a way that the Hipparcos proper ** motion is zero. Because such a star has, in general, a non-zero ** proper motion in the FK5 system, the function requires the date ** at which the position in the FK5 system was determined. ** ** 2) The TT date date1+date2 is a Julian Date, apportioned in any ** convenient way between the two arguments. For example, ** JD(TT)=2450123.7 could be expressed in any of these ways, ** among others: ** ** date1 date2 ** ** 2450123.7 0.0 (JD method) ** 2451545.0 -1421.3 (J2000 method) ** 2400000.5 50123.2 (MJD method) ** 2450123.5 0.2 (date & time method) ** ** The JD method is the most natural and convenient to use in ** cases where the loss of several decimal digits of resolution ** is acceptable. The J2000 method is best matched to the way ** the argument is handled internally and will deliver the ** optimum resolution. The MJD method and the date & time methods ** are both good compromises between resolution and convenience. ** ** 3) The FK5 to Hipparcos transformation is modeled as a pure ** rotation and spin; zonal errors in the FK5 catalogue are not ** taken into account. ** ** 4) The position returned by this function is in the Hipparcos ** reference system but at date date1+date2. ** ** 5) See also eraFk52h, eraH2fk5, eraHfk5z. ** ** Called: ** eraS2c spherical coordinates to unit vector ** eraFk5hip FK5 to Hipparcos rotation and spin ** eraSxp multiply p-vector by scalar ** eraRv2m r-vector to r-matrix ** eraTrxp product of transpose of r-matrix and p-vector ** eraPxp vector product of two p-vectors ** eraC2s p-vector to spherical ** eraAnp normalize angle into range 0 to 2pi ** ** Reference: ** ** F.Mignard & M.Froeschle, 2000, Astron.Astrophys. 354, 732-739. ** ** Copyright (C) 2013-2015, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double t, p5e[3], r5h[3][3], s5h[3], vst[3], rst[3][3], p5[3], ph[3], w; /* Interval from given date to fundamental epoch J2000.0 (JY). */ t = - ((date1 - ERFA_DJ00) + date2) / ERFA_DJY; /* FK5 barycentric position vector. */ eraS2c(r5, d5, p5e); /* FK5 to Hipparcos orientation matrix and spin vector. */ eraFk5hip(r5h, s5h); /* Accumulated Hipparcos wrt FK5 spin over that interval. */ eraSxp(t, s5h, vst); /* Express the accumulated spin as a rotation matrix. */ eraRv2m(vst, rst); /* Derotate the vector's FK5 axes back to date. */ eraTrxp(rst, p5e, p5); /* Rotate the vector into the Hipparcos system. */ eraRxp(r5h, p5, ph); /* Hipparcos vector to spherical. */ eraC2s(ph, &w, dh); *rh = eraAnp(w); return; }
int eraPvstar(double pv[2][3], double *ra, double *dec, double *pmr, double *pmd, double *px, double *rv) /* ** - - - - - - - - - - ** e r a P v s t a r ** - - - - - - - - - - ** ** Convert star position+velocity vector to catalog coordinates. ** ** Given (Note 1): ** pv double[2][3] pv-vector (AU, AU/day) ** ** Returned (Note 2): ** ra double right ascension (radians) ** dec double declination (radians) ** pmr double RA proper motion (radians/year) ** pmd double Dec proper motion (radians/year) ** px double parallax (arcsec) ** rv double radial velocity (km/s, positive = receding) ** ** Returned (function value): ** int status: ** 0 = OK ** -1 = superluminal speed (Note 5) ** -2 = null position vector ** ** Notes: ** ** 1) The specified pv-vector is the coordinate direction (and its rate ** of change) for the date at which the light leaving the star ** reached the solar-system barycenter. ** ** 2) The star data returned by this function are "observables" for an ** imaginary observer at the solar-system barycenter. Proper motion ** and radial velocity are, strictly, in terms of barycentric ** coordinate time, TCB. For most practical applications, it is ** permissible to neglect the distinction between TCB and ordinary ** "proper" time on Earth (TT/TAI). The result will, as a rule, be ** limited by the intrinsic accuracy of the proper-motion and ** radial-velocity data; moreover, the supplied pv-vector is likely ** to be merely an intermediate result (for example generated by the ** function eraStarpv), so that a change of time unit will cancel ** out overall. ** ** In accordance with normal star-catalog conventions, the object's ** right ascension and declination are freed from the effects of ** secular aberration. The frame, which is aligned to the catalog ** equator and equinox, is Lorentzian and centered on the SSB. ** ** Summarizing, the specified pv-vector is for most stars almost ** identical to the result of applying the standard geometrical ** "space motion" transformation to the catalog data. The ** differences, which are the subject of the Stumpff paper cited ** below, are: ** ** (i) In stars with significant radial velocity and proper motion, ** the constantly changing light-time distorts the apparent proper ** motion. Note that this is a classical, not a relativistic, ** effect. ** ** (ii) The transformation complies with special relativity. ** ** 3) Care is needed with units. The star coordinates are in radians ** and the proper motions in radians per Julian year, but the ** parallax is in arcseconds; the radial velocity is in km/s, but ** the pv-vector result is in AU and AU/day. ** ** 4) The proper motions are the rate of change of the right ascension ** and declination at the catalog epoch and are in radians per Julian ** year. The RA proper motion is in terms of coordinate angle, not ** true angle, and will thus be numerically larger at high ** declinations. ** ** 5) Straight-line motion at constant speed in the inertial frame is ** assumed. If the speed is greater than or equal to the speed of ** light, the function aborts with an error status. ** ** 6) The inverse transformation is performed by the function eraStarpv. ** ** Called: ** eraPn decompose p-vector into modulus and direction ** eraPdp scalar product of two p-vectors ** eraSxp multiply p-vector by scalar ** eraPmp p-vector minus p-vector ** eraPm modulus of p-vector ** eraPpp p-vector plus p-vector ** eraPv2s pv-vector to spherical ** eraAnp normalize angle into range 0 to 2pi ** ** Reference: ** ** Stumpff, P., 1985, Astron.Astrophys. 144, 232-240. ** ** Copyright (C) 2013-2016, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double r, x[3], vr, ur[3], vt, ut[3], bett, betr, d, w, del, usr[3], ust[3], a, rad, decd, rd; /* Isolate the radial component of the velocity (AU/day, inertial). */ eraPn(pv[0], &r, x); vr = eraPdp(x, pv[1]); eraSxp(vr, x, ur); /* Isolate the transverse component of the velocity (AU/day, inertial). */ eraPmp(pv[1], ur, ut); vt = eraPm(ut); /* Special-relativity dimensionless parameters. */ bett = vt / ERFA_DC; betr = vr / ERFA_DC; /* The inertial-to-observed correction terms. */ d = 1.0 + betr; w = 1.0 - betr*betr - bett*bett; if (d == 0.0 || w < 0) return -1; del = sqrt(w) - 1.0; /* Apply relativistic correction factor to radial velocity component. */ w = (betr != 0) ? (betr - del) / (betr * d) : 1.0; eraSxp(w, ur, usr); /* Apply relativistic correction factor to tangential velocity */ /* component. */ eraSxp(1.0/d, ut, ust); /* Combine the two to obtain the observed velocity vector (AU/day). */ eraPpp(usr, ust, pv[1]); /* Cartesian to spherical. */ eraPv2s(pv, &a, dec, &r, &rad, &decd, &rd); if (r == 0.0) return -2; /* Return RA in range 0 to 2pi. */ *ra = eraAnp(a); /* Return proper motions in radians per year. */ *pmr = rad * ERFA_DJY; *pmd = decd * ERFA_DJY; /* Return parallax in arcsec. */ *px = ERFA_DR2AS / r; /* Return radial velocity in km/s. */ *rv = 1e-3 * rd * ERFA_DAU / ERFA_DAYSEC; /* OK status. */ return 0; }
void eraAtoiq(const char *type, double ob1, double ob2, eraASTROM *astrom, double *ri, double *di) /* ** - - - - - - - - - ** e r a A t o i q ** - - - - - - - - - ** ** Quick observed place to CIRS, given the star-independent astrometry ** parameters. ** ** Use of this function is appropriate when efficiency is important and ** where many star positions are all to be transformed for one date. ** The star-independent astrometry parameters can be obtained by ** calling eraApio[13] or eraApco[13]. ** ** Given: ** type char[] type of coordinates: "R", "H" or "A" (Note 1) ** ob1 double observed Az, HA or RA (radians; Az is N=0,E=90) ** ob2 double observed ZD or Dec (radians) ** astrom eraASTROM* star-independent astrometry parameters: ** pmt double PM time interval (SSB, Julian years) ** eb double[3] SSB to observer (vector, au) ** eh double[3] Sun to observer (unit vector) ** em double distance from Sun to observer (au) ** v double[3] barycentric observer velocity (vector, c) ** bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor ** bpn double[3][3] bias-precession-nutation matrix ** along double longitude + s' (radians) ** xpl double polar motion xp wrt local meridian (radians) ** ypl double polar motion yp wrt local meridian (radians) ** sphi double sine of geodetic latitude ** cphi double cosine of geodetic latitude ** diurab double magnitude of diurnal aberration vector ** eral double "local" Earth rotation angle (radians) ** refa double refraction constant A (radians) ** refb double refraction constant B (radians) ** ** Returned: ** ri double* CIRS right ascension (CIO-based, radians) ** di double* CIRS declination (radians) ** ** Notes: ** ** 1) "Observed" Az,El means the position that would be seen by a ** perfect geodetically aligned theodolite. This is related to ** the observed HA,Dec via the standard rotation, using the geodetic ** latitude (corrected for polar motion), while the observed HA and ** RA are related simply through the Earth rotation angle and the ** site longitude. "Observed" RA,Dec or HA,Dec thus means the ** position that would be seen by a perfect equatorial with its ** polar axis aligned to the Earth's axis of rotation. By removing ** from the observed place the effects of atmospheric refraction and ** diurnal aberration, the CIRS RA,Dec is obtained. ** ** 2) Only the first character of the type argument is significant. ** "R" or "r" indicates that ob1 and ob2 are the observed right ** ascension and declination; "H" or "h" indicates that they are ** hour angle (west +ve) and declination; anything else ("A" or ** "a" is recommended) indicates that ob1 and ob2 are azimuth (north ** zero, east 90 deg) and zenith distance. (Zenith distance is used ** rather than altitude in order to reflect the fact that no ** allowance is made for depression of the horizon.) ** ** 3) The accuracy of the result is limited by the corrections for ** refraction, which use a simple A*tan(z) + B*tan^3(z) model. ** Providing the meteorological parameters are known accurately and ** there are no gross local effects, the predicted observed ** coordinates should be within 0.05 arcsec (optical) or 1 arcsec ** (radio) for a zenith distance of less than 70 degrees, better ** than 30 arcsec (optical or radio) at 85 degrees and better than ** 20 arcmin (optical) or 30 arcmin (radio) at the horizon. ** ** Without refraction, the complementary functions eraAtioq and ** eraAtoiq are self-consistent to better than 1 microarcsecond all ** over the celestial sphere. With refraction included, consistency ** falls off at high zenith distances, but is still better than ** 0.05 arcsec at 85 degrees. ** ** 4) It is advisable to take great care with units, as even unlikely ** values of the input parameters are accepted and processed in ** accordance with the models used. ** ** Called: ** eraS2c spherical coordinates to unit vector ** eraC2s p-vector to spherical ** eraAnp normalize angle into range 0 to 2pi ** ** Copyright (C) 2013-2015, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { int c; double c1, c2, sphi, cphi, ce, xaeo, yaeo, zaeo, v[3], xmhdo, ymhdo, zmhdo, az, sz, zdo, refa, refb, tz, dref, zdt, xaet, yaet, zaet, xmhda, ymhda, zmhda, f, xhd, yhd, zhd, xpl, ypl, w, hma; /* Coordinate type. */ c = (int) type[0]; /* Coordinates. */ c1 = ob1; c2 = ob2; /* Sin, cos of latitude. */ sphi = astrom->sphi; cphi = astrom->cphi; /* Standardize coordinate type. */ if ( c == 'r' || c == 'R' ) { c = 'R'; } else if ( c == 'h' || c == 'H' ) { c = 'H'; } else { c = 'A'; } /* If Az,ZD, convert to Cartesian (S=0,E=90). */ if ( c == 'A' ) { ce = sin(c2); xaeo = - cos(c1) * ce; yaeo = sin(c1) * ce; zaeo = cos(c2); } else { /* If RA,Dec, convert to HA,Dec. */ if ( c == 'R' ) c1 = astrom->eral - c1; /* To Cartesian -HA,Dec. */ eraS2c ( -c1, c2, v ); xmhdo = v[0]; ymhdo = v[1]; zmhdo = v[2]; /* To Cartesian Az,El (S=0,E=90). */ xaeo = sphi*xmhdo - cphi*zmhdo; yaeo = ymhdo; zaeo = cphi*xmhdo + sphi*zmhdo; } /* Azimuth (S=0,E=90). */ az = ( xaeo != 0.0 || yaeo != 0.0 ) ? atan2(yaeo,xaeo) : 0.0; /* Sine of observed ZD, and observed ZD. */ sz = sqrt ( xaeo*xaeo + yaeo*yaeo ); zdo = atan2 ( sz, zaeo ); /* ** Refraction ** ---------- */ /* Fast algorithm using two constant model. */ refa = astrom->refa; refb = astrom->refb; tz = sz / zaeo; dref = ( refa + refb*tz*tz ) * tz; zdt = zdo + dref; /* To Cartesian Az,ZD. */ ce = sin(zdt); xaet = cos(az) * ce; yaet = sin(az) * ce; zaet = cos(zdt); /* Cartesian Az,ZD to Cartesian -HA,Dec. */ xmhda = sphi*xaet + cphi*zaet; ymhda = yaet; zmhda = - cphi*xaet + sphi*zaet; /* Diurnal aberration. */ f = ( 1.0 + astrom->diurab*ymhda ); xhd = f * xmhda; yhd = f * ( ymhda - astrom->diurab ); zhd = f * zmhda; /* Polar motion. */ xpl = astrom->xpl; ypl = astrom->ypl; w = xpl*xhd - ypl*yhd + zhd; v[0] = xhd - xpl*w; v[1] = yhd + ypl*w; v[2] = w - ( xpl*xpl + ypl*ypl ) * zhd; /* To spherical -HA,Dec. */ eraC2s(v, &hma, di); /* Right ascension. */ *ri = eraAnp(astrom->eral + hma); /* Finished. */ }
void eraEqec06(double date1, double date2, double dr, double dd, double *dl, double *db) /* ** - - - - - - - - - - ** e r a E q e c 0 6 ** - - - - - - - - - - ** ** Transformation from ICRS equatorial coordinates to ecliptic ** coordinates (mean equinox and ecliptic of date) using IAU 2006 ** precession model. ** ** Given: ** date1,date2 double TT as a 2-part Julian date (Note 1) ** dr,dd double ICRS right ascension and declination (radians) ** ** Returned: ** dl,db double ecliptic longitude and latitude (radians) ** ** 1) The TT date date1+date2 is a Julian Date, apportioned in any ** convenient way between the two arguments. For example, ** JD(TT)=2450123.7 could be expressed in any of these ways, ** among others: ** ** date1 date2 ** ** 2450123.7 0.0 (JD method) ** 2451545.0 -1421.3 (J2000 method) ** 2400000.5 50123.2 (MJD method) ** 2450123.5 0.2 (date & time method) ** ** The JD method is the most natural and convenient to use in ** cases where the loss of several decimal digits of resolution ** is acceptable. The J2000 method is best matched to the way ** the argument is handled internally and will deliver the ** optimum resolution. The MJD method and the date & time methods ** are both good compromises between resolution and convenience. ** ** 2) No assumptions are made about whether the coordinates represent ** starlight and embody astrometric effects such as parallax or ** aberration. ** ** 3) The transformation is approximately that from mean J2000.0 right ** ascension and declination to ecliptic longitude and latitude ** (mean equinox and ecliptic of date), with only frame bias (always ** less than 25 mas) to disturb this classical picture. ** ** Called: ** eraS2c spherical coordinates to unit vector ** eraEcm06 J2000.0 to ecliptic rotation matrix, IAU 2006 ** eraRxp product of r-matrix and p-vector ** eraC2s unit vector to spherical coordinates ** eraAnp normalize angle into range 0 to 2pi ** eraAnpm normalize angle into range +/- pi ** ** Copyright (C) 2013-2016, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double rm[3][3], v1[3], v2[3], a, b; /* Spherical to Cartesian. */ eraS2c(dr, dd, v1); /* Rotation matrix, ICRS equatorial to ecliptic. */ eraEcm06(date1, date2, rm); /* The transformation from ICRS to ecliptic. */ eraRxp(rm, v1, v2); /* Cartesian to spherical. */ eraC2s(v2, &a, &b); /* Express in conventional ranges. */ *dl = eraAnp(a); *db = eraAnpm(b); }
double palDranrm ( double angle ) { return eraAnp( angle ); }
double eraEra00(double dj1, double dj2) /* ** - - - - - - - - - ** e r a E r a 0 0 ** - - - - - - - - - ** ** Earth rotation angle (IAU 2000 model). ** ** Given: ** dj1,dj2 double UT1 as a 2-part Julian Date (see note) ** ** Returned (function value): ** double Earth rotation angle (radians), range 0-2pi ** ** Notes: ** ** 1) The UT1 date dj1+dj2 is a Julian Date, apportioned in any ** convenient way between the arguments dj1 and dj2. For example, ** JD(UT1)=2450123.7 could be expressed in any of these ways, ** among others: ** ** dj1 dj2 ** ** 2450123.7 0.0 (JD method) ** 2451545.0 -1421.3 (J2000 method) ** 2400000.5 50123.2 (MJD method) ** 2450123.5 0.2 (date & time method) ** ** The JD method is the most natural and convenient to use in ** cases where the loss of several decimal digits of resolution ** is acceptable. The J2000 and MJD methods are good compromises ** between resolution and convenience. The date & time method is ** best matched to the algorithm used: maximum precision is ** delivered when the dj1 argument is for 0hrs UT1 on the day in ** question and the dj2 argument lies in the range 0 to 1, or vice ** versa. ** ** 2) The algorithm is adapted from Expression 22 of Capitaine et al. ** 2000. The time argument has been expressed in days directly, ** and, to retain precision, integer contributions have been ** eliminated. The same formulation is given in IERS Conventions ** (2003), Chap. 5, Eq. 14. ** ** Called: ** eraAnp normalize angle into range 0 to 2pi ** ** References: ** ** Capitaine N., Guinot B. and McCarthy D.D, 2000, Astron. ** Astrophys., 355, 398-405. ** ** McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), ** IERS Technical Note No. 32, BKG (2004) ** ** Copyright (C) 2013-2014, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double d1, d2, t, f, theta; /* Days since fundamental epoch. */ if (dj1 < dj2) { d1 = dj1; d2 = dj2; } else { d1 = dj2; d2 = dj1; } t = d1 + (d2- ERFA_DJ00); /* Fractional part of T (days). */ f = fmod(d1, 1.0) + fmod(d2, 1.0); /* Earth rotation angle at this UT1. */ theta = eraAnp(ERFA_D2PI * (f + 0.7790572732640 + 0.00273781191135448 * t)); return theta; }
double eraGst00b(double uta, double utb) /* ** - - - - - - - - - - ** e r a G s t 0 0 b ** - - - - - - - - - - ** ** Greenwich apparent sidereal time (consistent with IAU 2000 ** resolutions but using the truncated nutation model IAU 2000B). ** ** Given: ** uta,utb double UT1 as a 2-part Julian Date (Notes 1,2) ** ** Returned (function value): ** double Greenwich apparent sidereal time (radians) ** ** Notes: ** ** 1) The UT1 date uta+utb is a Julian Date, apportioned in any ** convenient way between the argument pair. For example, ** JD=2450123.7 could be expressed in any of these ways, among ** others: ** ** uta utb ** ** 2450123.7 0.0 (JD method) ** 2451545.0 -1421.3 (J2000 method) ** 2400000.5 50123.2 (MJD method) ** 2450123.5 0.2 (date & time method) ** ** The JD method is the most natural and convenient to use in cases ** where the loss of several decimal digits of resolution is ** acceptable. The J2000 and MJD methods are good compromises ** between resolution and convenience. For UT, the date & time ** method is best matched to the algorithm that is used by the Earth ** Rotation Angle function, called internally: maximum precision is ** delivered when the uta argument is for 0hrs UT1 on the day in ** question and the utb argument lies in the range 0 to 1, or vice ** versa. ** ** 2) The result is compatible with the IAU 2000 resolutions, except ** that accuracy has been compromised for the sake of speed and ** convenience in two respects: ** ** . UT is used instead of TDB (or TT) to compute the precession ** component of GMST and the equation of the equinoxes. This ** results in errors of order 0.1 mas at present. ** ** . The IAU 2000B abridged nutation model (McCarthy & Luzum, 2001) ** is used, introducing errors of up to 1 mas. ** ** 3) This GAST is compatible with the IAU 2000 resolutions and must be ** used only in conjunction with other IAU 2000 compatible ** components such as precession-nutation. ** ** 4) The result is returned in the range 0 to 2pi. ** ** 5) The algorithm is from Capitaine et al. (2003) and IERS ** Conventions 2003. ** ** Called: ** eraGmst00 Greenwich mean sidereal time, IAU 2000 ** eraEe00b equation of the equinoxes, IAU 2000B ** eraAnp normalize angle into range 0 to 2pi ** ** References: ** ** Capitaine, N., Wallace, P.T. and McCarthy, D.D., "Expressions to ** implement the IAU 2000 definition of UT1", Astronomy & ** Astrophysics, 406, 1135-1149 (2003) ** ** McCarthy, D.D. & Luzum, B.J., "An abridged model of the ** precession-nutation of the celestial pole", Celestial Mechanics & ** Dynamical Astronomy, 85, 37-49 (2003) ** ** McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), ** IERS Technical Note No. 32, BKG (2004) ** ** Copyright (C) 2013, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double gmst00, ee00b, gst; gmst00 = eraGmst00(uta, utb, uta, utb); ee00b = eraEe00b(uta, utb); gst = eraAnp(gmst00 + ee00b); return gst; }
void eraIcrs2g ( double dr, double dd, double *dl, double *db ) /* ** - - - - - - - - - - ** e r a I c r s 2 g ** - - - - - - - - - - ** ** Transformation from ICRS to Galactic Coordinates. ** ** Given: ** dr double ICRS right ascension (radians) ** dd double ICRS declination (radians) ** ** Returned: ** dl double galactic longitude (radians) ** db double galactic latitude (radians) ** ** Notes: ** ** 1) The IAU 1958 system of Galactic coordinates was defined with ** respect to the now obsolete reference system FK4 B1950.0. When ** interpreting the system in a modern context, several factors have ** to be taken into account: ** ** . The inclusion in FK4 positions of the E-terms of aberration. ** ** . The distortion of the FK4 proper motion system by differential ** Galactic rotation. ** ** . The use of the B1950.0 equinox rather than the now-standard ** J2000.0. ** ** . The frame bias between ICRS and the J2000.0 mean place system. ** ** The Hipparcos Catalogue (Perryman & ESA 1997) provides a rotation ** matrix that transforms directly between ICRS and Galactic ** coordinates with the above factors taken into account. The ** matrix is derived from three angles, namely the ICRS coordinates ** of the Galactic pole and the longitude of the ascending node of ** the galactic equator on the ICRS equator. They are given in ** degrees to five decimal places and for canonical purposes are ** regarded as exact. In the Hipparcos Catalogue the matrix ** elements are given to 10 decimal places (about 20 microarcsec). ** In the present ERFA function the matrix elements have been ** recomputed from the canonical three angles and are given to 30 ** decimal places. ** ** 2) The inverse transformation is performed by the function eraG2icrs. ** ** Called: ** eraAnp normalize angle into range 0 to 2pi ** eraAnpm normalize angle into range +/- pi ** eraS2c spherical coordinates to unit vector ** eraRxp product of r-matrix and p-vector ** eraC2s p-vector to spherical ** ** Reference: ** Perryman M.A.C. & ESA, 1997, ESA SP-1200, The Hipparcos and Tycho ** catalogues. Astrometric and photometric star catalogues ** derived from the ESA Hipparcos Space Astrometry Mission. ESA ** Publications Division, Noordwijk, Netherlands. ** ** Copyright (C) 2013-2016, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double v1[3], v2[3]; /* ** L2,B2 system of galactic coordinates in the form presented in the ** Hipparcos Catalogue. In degrees: ** ** P = 192.85948 right ascension of the Galactic north pole in ICRS ** Q = 27.12825 declination of the Galactic north pole in ICRS ** R = 32.93192 longitude of the ascending node of the Galactic ** plane on the ICRS equator ** ** ICRS to galactic rotation matrix, obtained by computing ** R_3(-R) R_1(pi/2-Q) R_3(pi/2+P) to the full precision shown: */ double r[3][3] = { { -0.054875560416215368492398900454, -0.873437090234885048760383168409, -0.483835015548713226831774175116 }, { +0.494109427875583673525222371358, -0.444829629960011178146614061616, +0.746982244497218890527388004556 }, { -0.867666149019004701181616534570, -0.198076373431201528180486091412, +0.455983776175066922272100478348 } }; /* Spherical to Cartesian. */ eraS2c(dr, dd, v1); /* ICRS to Galactic. */ eraRxp(r, v1, v2); /* Cartesian to spherical. */ eraC2s(v2, dl, db); /* Express in conventional ranges. */ *dl = eraAnp(*dl); *db = eraAnpm(*db); /* Finished. */ }
void eraAtioq(double ri, double di, eraASTROM *astrom, double *aob, double *zob, double *hob, double *dob, double *rob) /* ** - - - - - - - - - ** e r a A t i o q ** - - - - - - - - - ** ** Quick CIRS to observed place transformation. ** ** Use of this function is appropriate when efficiency is important and ** where many star positions are all to be transformed for one date. ** The star-independent astrometry parameters can be obtained by ** calling eraApio[13] or eraApco[13]. ** ** Given: ** ri double CIRS right ascension ** di double CIRS declination ** astrom eraASTROM* star-independent astrometry parameters: ** pmt double PM time interval (SSB, Julian years) ** eb double[3] SSB to observer (vector, au) ** eh double[3] Sun to observer (unit vector) ** em double distance from Sun to observer (au) ** v double[3] barycentric observer velocity (vector, c) ** bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor ** bpn double[3][3] bias-precession-nutation matrix ** along double longitude + s' (radians) ** xpl double polar motion xp wrt local meridian (radians) ** ypl double polar motion yp wrt local meridian (radians) ** sphi double sine of geodetic latitude ** cphi double cosine of geodetic latitude ** diurab double magnitude of diurnal aberration vector ** eral double "local" Earth rotation angle (radians) ** refa double refraction constant A (radians) ** refb double refraction constant B (radians) ** ** Returned: ** aob double* observed azimuth (radians: N=0,E=90) ** zob double* observed zenith distance (radians) ** hob double* observed hour angle (radians) ** dob double* observed declination (radians) ** rob double* observed right ascension (CIO-based, radians) ** ** Notes: ** ** 1) This function returns zenith distance rather than altitude in ** order to reflect the fact that no allowance is made for ** depression of the horizon. ** ** 2) The accuracy of the result is limited by the corrections for ** refraction, which use a simple A*tan(z) + B*tan^3(z) model. ** Providing the meteorological parameters are known accurately and ** there are no gross local effects, the predicted observed ** coordinates should be within 0.05 arcsec (optical) or 1 arcsec ** (radio) for a zenith distance of less than 70 degrees, better ** than 30 arcsec (optical or radio) at 85 degrees and better ** than 20 arcmin (optical) or 30 arcmin (radio) at the horizon. ** ** Without refraction, the complementary functions eraAtioq and ** eraAtoiq are self-consistent to better than 1 microarcsecond all ** over the celestial sphere. With refraction included, consistency ** falls off at high zenith distances, but is still better than ** 0.05 arcsec at 85 degrees. ** ** 3) It is advisable to take great care with units, as even unlikely ** values of the input parameters are accepted and processed in ** accordance with the models used. ** ** 4) The CIRS RA,Dec is obtained from a star catalog mean place by ** allowing for space motion, parallax, the Sun's gravitational lens ** effect, annual aberration and precession-nutation. For star ** positions in the ICRS, these effects can be applied by means of ** the eraAtci13 (etc.) functions. Starting from classical "mean ** place" systems, additional transformations will be needed first. ** ** 5) "Observed" Az,El means the position that would be seen by a ** perfect geodetically aligned theodolite. This is obtained from ** the CIRS RA,Dec by allowing for Earth orientation and diurnal ** aberration, rotating from equator to horizon coordinates, and ** then adjusting for refraction. The HA,Dec is obtained by ** rotating back into equatorial coordinates, and is the position ** that would be seen by a perfect equatorial with its polar axis ** aligned to the Earth's axis of rotation. Finally, the RA is ** obtained by subtracting the HA from the local ERA. ** ** 6) The star-independent CIRS-to-observed-place parameters in ASTROM ** may be computed with eraApio[13] or eraApco[13]. If nothing has ** changed significantly except the time, eraAper[13] may be used to ** perform the requisite adjustment to the astrom structure. ** ** Called: ** eraS2c spherical coordinates to unit vector ** eraC2s p-vector to spherical ** eraAnp normalize angle into range 0 to 2pi ** ** Copyright (C) 2013-2015, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { /* Minimum cos(alt) and sin(alt) for refraction purposes */ const double CELMIN = 1e-6; const double SELMIN = 0.05; double v[3], x, y, z, xhd, yhd, zhd, f, xhdt, yhdt, zhdt, xaet, yaet, zaet, azobs, r, tz, w, del, cosdel, xaeo, yaeo, zaeo, zdobs, hmobs, dcobs, raobs; /*--------------------------------------------------------------------*/ /* CIRS RA,Dec to Cartesian -HA,Dec. */ eraS2c(ri-astrom->eral, di, v); x = v[0]; y = v[1]; z = v[2]; /* Polar motion. */ xhd = x + astrom->xpl*z; yhd = y - astrom->ypl*z; zhd = z - astrom->xpl*x + astrom->ypl*y; /* Diurnal aberration. */ f = ( 1.0 - astrom->diurab*yhd ); xhdt = f * xhd; yhdt = f * ( yhd + astrom->diurab ); zhdt = f * zhd; /* Cartesian -HA,Dec to Cartesian Az,El (S=0,E=90). */ xaet = astrom->sphi*xhdt - astrom->cphi*zhdt; yaet = yhdt; zaet = astrom->cphi*xhdt + astrom->sphi*zhdt; /* Azimuth (N=0,E=90). */ azobs = ( xaet != 0.0 || yaet != 0.0 ) ? atan2(yaet,-xaet) : 0.0; /* ---------- */ /* Refraction */ /* ---------- */ /* Cosine and sine of altitude, with precautions. */ r = sqrt(xaet*xaet + yaet*yaet); r = r > CELMIN ? r : CELMIN; z = zaet > SELMIN ? zaet : SELMIN; /* A*tan(z)+B*tan^3(z) model, with Newton-Raphson correction. */ tz = r/z; w = astrom->refb*tz*tz; del = ( astrom->refa + w ) * tz / ( 1.0 + ( astrom->refa + 3.0*w ) / ( z*z ) ); /* Apply the change, giving observed vector. */ cosdel = 1.0 - del*del/2.0; f = cosdel - del*z/r; xaeo = xaet*f; yaeo = yaet*f; zaeo = cosdel*zaet + del*r; /* Observed ZD. */ zdobs = atan2(sqrt(xaeo*xaeo+yaeo*yaeo), zaeo); /* Az/El vector to HA,Dec vector (both right-handed). */ v[0] = astrom->sphi*xaeo + astrom->cphi*zaeo; v[1] = yaeo; v[2] = - astrom->cphi*xaeo + astrom->sphi*zaeo; /* To spherical -HA,Dec. */ eraC2s ( v, &hmobs, &dcobs ); /* Right ascension (with respect to CIO). */ raobs = astrom->eral + hmobs; /* Return the results. */ *aob = eraAnp(azobs); *zob = zdobs; *hob = -hmobs; *dob = dcobs; *rob = eraAnp(raobs); /* Finished. */ }
void eraAticq(double ri, double di, eraASTROM *astrom, double *rc, double *dc) /* ** - - - - - - - - - ** e r a A t i c q ** - - - - - - - - - ** ** Quick CIRS RA,Dec to ICRS astrometric place, given the star- ** independent astrometry parameters. ** ** Use of this function is appropriate when efficiency is important and ** where many star positions are all to be transformed for one date. ** The star-independent astrometry parameters can be obtained by ** calling one of the functions eraApci[13], eraApcg[13], eraApco[13] ** or eraApcs[13]. ** ** Given: ** ri,di double CIRS RA,Dec (radians) ** astrom eraASTROM* star-independent astrometry parameters: ** pmt double PM time interval (SSB, Julian years) ** eb double[3] SSB to observer (vector, au) ** eh double[3] Sun to observer (unit vector) ** em double distance from Sun to observer (au) ** v double[3] barycentric observer velocity (vector, c) ** bm1 double sqrt(1-|v|^2): reciprocal of Lorenz factor ** bpn double[3][3] bias-precession-nutation matrix ** along double longitude + s' (radians) ** xpl double polar motion xp wrt local meridian (radians) ** ypl double polar motion yp wrt local meridian (radians) ** sphi double sine of geodetic latitude ** cphi double cosine of geodetic latitude ** diurab double magnitude of diurnal aberration vector ** eral double "local" Earth rotation angle (radians) ** refa double refraction constant A (radians) ** refb double refraction constant B (radians) ** ** Returned: ** rc,dc double ICRS astrometric RA,Dec (radians) ** ** Notes: ** ** 1) Only the Sun is taken into account in the light deflection ** correction. ** ** 2) Iterative techniques are used for the aberration and light ** deflection corrections so that the functions eraAtic13 (or ** eraAticq) and eraAtci13 (or eraAtciq) are accurate inverses; ** even at the edge of the Sun's disk the discrepancy is only about ** 1 nanoarcsecond. ** ** Called: ** eraS2c spherical coordinates to unit vector ** eraTrxp product of transpose of r-matrix and p-vector ** eraZp zero p-vector ** eraAb stellar aberration ** eraLdsun light deflection by the Sun ** eraC2s p-vector to spherical ** eraAnp normalize angle into range +/- pi ** ** Copyright (C) 2013-2015, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { int j, i; double pi[3], ppr[3], pnat[3], pco[3], w, d[3], before[3], r2, r, after[3]; /* CIRS RA,Dec to Cartesian. */ eraS2c(ri, di, pi); /* Bias-precession-nutation, giving GCRS proper direction. */ eraTrxp(astrom->bpn, pi, ppr); /* Aberration, giving GCRS natural direction. */ eraZp(d); for (j = 0; j < 2; j++) { r2 = 0.0; for (i = 0; i < 3; i++) { w = ppr[i] - d[i]; before[i] = w; r2 += w*w; } r = sqrt(r2); for (i = 0; i < 3; i++) { before[i] /= r; } eraAb(before, astrom->v, astrom->em, astrom->bm1, after); r2 = 0.0; for (i = 0; i < 3; i++) { d[i] = after[i] - before[i]; w = ppr[i] - d[i]; pnat[i] = w; r2 += w*w; } r = sqrt(r2); for (i = 0; i < 3; i++) { pnat[i] /= r; } } /* Light deflection by the Sun, giving BCRS coordinate direction. */ eraZp(d); for (j = 0; j < 5; j++) { r2 = 0.0; for (i = 0; i < 3; i++) { w = pnat[i] - d[i]; before[i] = w; r2 += w*w; } r = sqrt(r2); for (i = 0; i < 3; i++) { before[i] /= r; } eraLdsun(before, astrom->eh, astrom->em, after); r2 = 0.0; for (i = 0; i < 3; i++) { d[i] = after[i] - before[i]; w = pnat[i] - d[i]; pco[i] = w; r2 += w*w; } r = sqrt(r2); for (i = 0; i < 3; i++) { pco[i] /= r; } } /* ICRS astrometric RA,Dec. */ eraC2s(pco, &w, dc); *rc = eraAnp(w); /* Finished. */ }
void eraLteqec(double epj, double dr, double dd, double *dl, double *db) /* ** - - - - - - - - - - ** e r a L t e q e c ** - - - - - - - - - - ** ** Transformation from ICRS equatorial coordinates to ecliptic ** coordinates (mean equinox and ecliptic of date) using a long-term ** precession model. ** ** Given: ** epj double Julian epoch (TT) ** dr,dd double ICRS right ascension and declination (radians) ** ** Returned: ** dl,db double ecliptic longitude and latitude (radians) ** ** 1) No assumptions are made about whether the coordinates represent ** starlight and embody astrometric effects such as parallax or ** aberration. ** ** 2) The transformation is approximately that from mean J2000.0 right ** ascension and declination to ecliptic longitude and latitude ** (mean equinox and ecliptic of date), with only frame bias (always ** less than 25 mas) to disturb this classical picture. ** ** 3) The Vondrak et al. (2011, 2012) 400 millennia precession model ** agrees with the IAU 2006 precession at J2000.0 and stays within ** 100 microarcseconds during the 20th and 21st centuries. It is ** accurate to a few arcseconds throughout the historical period, ** worsening to a few tenths of a degree at the end of the ** +/- 200,000 year time span. ** ** Called: ** eraS2c spherical coordinates to unit vector ** eraLtecm J2000.0 to ecliptic rotation matrix, long term ** eraRxp product of r-matrix and p-vector ** eraC2s unit vector to spherical coordinates ** eraAnp normalize angle into range 0 to 2pi ** eraAnpm normalize angle into range +/- pi ** ** References: ** ** Vondrak, J., Capitaine, N. and Wallace, P., 2011, New precession ** expressions, valid for long time intervals, Astron.Astrophys. 534, ** A22 ** ** Vondrak, J., Capitaine, N. and Wallace, P., 2012, New precession ** expressions, valid for long time intervals (Corrigendum), ** Astron.Astrophys. 541, C1 ** ** Copyright (C) 2013-2016, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double rm[3][3], v1[3], v2[3], a, b; /* Spherical to Cartesian. */ eraS2c(dr, dd, v1); /* Rotation matrix, ICRS equatorial to ecliptic. */ eraLtecm(epj, rm); /* The transformation from ICRS to ecliptic. */ eraRxp(rm, v1, v2); /* Cartesian to spherical. */ eraC2s(v2, &a, &b); /* Express in conventional ranges. */ *dl = eraAnp(a); *db = eraAnpm(b); }