void eraC2t00a(double tta, double ttb, double uta, double utb, double xp, double yp, double rc2t[3][3]) /* ** - - - - - - - - - - ** e r a C 2 t 0 0 a ** - - - - - - - - - - ** ** Form the celestial to terrestrial matrix given the date, the UT1 and ** the polar motion, using the IAU 2000A nutation model. ** ** Given: ** tta,ttb double TT as a 2-part Julian Date (Note 1) ** uta,utb double UT1 as a 2-part Julian Date (Note 1) ** xp,yp double coordinates of the pole (radians, Note 2) ** ** Returned: ** rc2t double[3][3] celestial-to-terrestrial matrix (Note 3) ** ** Notes: ** ** 1) The TT and UT1 dates tta+ttb and uta+utb are Julian Dates, ** apportioned in any convenient way between the arguments uta and ** utb. For example, JD(UT1)=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. In the case of uta,utb, the ** date & time method is best matched to the Earth rotation angle ** algorithm used: 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 arguments xp and yp are the coordinates (in radians) of the ** Celestial Intermediate Pole with respect to the International ** Terrestrial Reference System (see IERS Conventions 2003), ** measured along the meridians to 0 and 90 deg west respectively. ** ** 3) The matrix rc2t transforms from celestial to terrestrial ** coordinates: ** ** [TRS] = RPOM * R_3(ERA) * RC2I * [CRS] ** ** = rc2t * [CRS] ** ** where [CRS] is a vector in the Geocentric Celestial Reference ** System and [TRS] is a vector in the International Terrestrial ** Reference System (see IERS Conventions 2003), RC2I is the ** celestial-to-intermediate matrix, ERA is the Earth rotation ** angle and RPOM is the polar motion matrix. ** ** 4) A faster, but slightly less accurate result (about 1 mas), can ** be obtained by using instead the eraC2t00b function. ** ** Called: ** eraC2i00a celestial-to-intermediate matrix, IAU 2000A ** eraEra00 Earth rotation angle, IAU 2000 ** eraSp00 the TIO locator s', IERS 2000 ** eraPom00 polar motion matrix ** eraC2tcio form CIO-based celestial-to-terrestrial matrix ** ** Reference: ** ** 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 rc2i[3][3], era, sp, rpom[3][3]; /* Form the celestial-to-intermediate matrix for this TT (IAU 2000A). */ eraC2i00a(tta, ttb, rc2i ); /* Predict the Earth rotation angle for this UT1. */ era = eraEra00(uta, utb); /* Estimate s'. */ sp = eraSp00(tta, ttb); /* Form the polar motion matrix. */ eraPom00(xp, yp, sp, rpom); /* Combine to form the celestial-to-terrestrial matrix. */ eraC2tcio(rc2i, era, rpom, rc2t); return; }
void eraPvtob(double elong, double phi, double hm, double xp, double yp, double sp, double theta, double pv[2][3]) /* ** - - - - - - - - - ** e r a P v t o b ** - - - - - - - - - ** ** Position and velocity of a terrestrial observing station. ** ** Given: ** elong double longitude (radians, east +ve, Note 1) ** phi double latitude (geodetic, radians, Note 1) ** hm double height above ref. ellipsoid (geodetic, m) ** xp,yp double coordinates of the pole (radians, Note 2) ** sp double the TIO locator s' (radians, Note 2) ** theta double Earth rotation angle (radians, Note 3) ** ** Returned: ** pv double[2][3] position/velocity vector (m, m/s, CIRS) ** ** Notes: ** ** 1) The terrestrial coordinates are with respect to the ERFA_WGS84 ** reference ellipsoid. ** ** 2) xp and yp are the coordinates (in radians) of the Celestial ** Intermediate Pole with respect to the International Terrestrial ** Reference System (see IERS Conventions), measured along the ** meridians 0 and 90 deg west respectively. sp is the TIO locator ** s', in radians, which positions the Terrestrial Intermediate ** Origin on the equator. For many applications, xp, yp and ** (especially) sp can be set to zero. ** ** 3) If theta is Greenwich apparent sidereal time instead of Earth ** rotation angle, the result is with respect to the true equator ** and equinox of date, i.e. with the x-axis at the equinox rather ** than the celestial intermediate origin. ** ** 4) The velocity units are meters per UT1 second, not per SI second. ** This is unlikely to have any practical consequences in the modern ** era. ** ** 5) No validation is performed on the arguments. Error cases that ** could lead to arithmetic exceptions are trapped by the eraGd2gc ** function, and the result set to zeros. ** ** References: ** ** McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), ** IERS Technical Note No. 32, BKG (2004) ** ** Urban, S. & Seidelmann, P. K. (eds), Explanatory Supplement to ** the Astronomical Almanac, 3rd ed., University Science Books ** (2013), Section 7.4.3.3. ** ** Called: ** eraGd2gc geodetic to geocentric transformation ** eraPom00 polar motion matrix ** eraTrxp product of transpose of r-matrix and p-vector ** ** Copyright (C) 2013-2014, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { /* Earth rotation rate in radians per UT1 second */ const double OM = 1.00273781191135448 * ERFA_D2PI / ERFA_DAYSEC; double xyzm[3], rpm[3][3], xyz[3], x, y, z, s, c; /* Geodetic to geocentric transformation (ERFA_WGS84). */ (void) eraGd2gc(1, elong, phi, hm, xyzm); /* Polar motion and TIO position. */ eraPom00(xp, yp, sp, rpm); eraTrxp(rpm, xyzm, xyz); x = xyz[0]; y = xyz[1]; z = xyz[2]; /* Functions of ERA. */ s = sin(theta); c = cos(theta); /* Position. */ pv[0][0] = c*x - s*y; pv[0][1] = s*x + c*y; pv[0][2] = z; /* Velocity. */ pv[1][0] = OM * ( -s*x - c*y ); pv[1][1] = OM * ( c*x - s*y ); pv[1][2] = 0.0; /* Finished. */ }
void eraC2tpe(double tta, double ttb, double uta, double utb, double dpsi, double deps, double xp, double yp, double rc2t[3][3]) /* ** - - - - - - - - - ** e r a C 2 t p e ** - - - - - - - - - ** ** Form the celestial to terrestrial matrix given the date, the UT1, ** the nutation and the polar motion. IAU 2000. ** ** Given: ** tta,ttb double TT as a 2-part Julian Date (Note 1) ** uta,utb double UT1 as a 2-part Julian Date (Note 1) ** dpsi,deps double nutation (Note 2) ** xp,yp double coordinates of the pole (radians, Note 3) ** ** Returned: ** rc2t double[3][3] celestial-to-terrestrial matrix (Note 4) ** ** Notes: ** ** 1) The TT and UT1 dates tta+ttb and uta+utb are Julian Dates, ** apportioned in any convenient way between the arguments uta and ** utb. For example, JD(UT1)=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. In the case of uta,utb, the ** date & time method is best matched to the Earth rotation angle ** algorithm used: 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 caller is responsible for providing the nutation components; ** they are in longitude and obliquity, in radians and are with ** respect to the equinox and ecliptic of date. For high-accuracy ** applications, free core nutation should be included as well as ** any other relevant corrections to the position of the CIP. ** ** 3) The arguments xp and yp are the coordinates (in radians) of the ** Celestial Intermediate Pole with respect to the International ** Terrestrial Reference System (see IERS Conventions 2003), ** measured along the meridians to 0 and 90 deg west respectively. ** ** 4) The matrix rc2t transforms from celestial to terrestrial ** coordinates: ** ** [TRS] = RPOM * R_3(GST) * RBPN * [CRS] ** ** = rc2t * [CRS] ** ** where [CRS] is a vector in the Geocentric Celestial Reference ** System and [TRS] is a vector in the International Terrestrial ** Reference System (see IERS Conventions 2003), RBPN is the ** bias-precession-nutation matrix, GST is the Greenwich (apparent) ** Sidereal Time and RPOM is the polar motion matrix. ** ** 5) Although its name does not include "00", This function is in fact ** specific to the IAU 2000 models. ** ** Called: ** eraPn00 bias/precession/nutation results, IAU 2000 ** eraGmst00 Greenwich mean sidereal time, IAU 2000 ** eraSp00 the TIO locator s', IERS 2000 ** eraEe00 equation of the equinoxes, IAU 2000 ** eraPom00 polar motion matrix ** eraC2teqx form equinox-based celestial-to-terrestrial matrix ** ** Reference: ** ** McCarthy, D. D., Petit, G. (eds.), IERS Conventions (2003), ** IERS Technical Note No. 32, BKG (2004) ** ** Copyright (C) 2013-2015, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { double epsa, rb[3][3], rp[3][3], rbp[3][3], rn[3][3], rbpn[3][3], gmst, ee, sp, rpom[3][3]; /* Form the celestial-to-true matrix for this TT. */ eraPn00(tta, ttb, dpsi, deps, &epsa, rb, rp, rbp, rn, rbpn); /* Predict the Greenwich Mean Sidereal Time for this UT1 and TT. */ gmst = eraGmst00(uta, utb, tta, ttb); /* Predict the equation of the equinoxes given TT and nutation. */ ee = eraEe00(tta, ttb, epsa, dpsi); /* Estimate s'. */ sp = eraSp00(tta, ttb); /* Form the polar motion matrix. */ eraPom00(xp, yp, sp, rpom); /* Combine to form the celestial-to-terrestrial matrix. */ eraC2teqx(rbpn, gmst + ee, rpom, rc2t); return; }