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 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 ); }
void eraP2s(double p[3], double *theta, double *phi, double *r) /* ** - - - - - - - ** e r a P 2 s ** - - - - - - - ** ** P-vector to spherical polar coordinates. ** ** Given: ** p double[3] p-vector ** ** Returned: ** theta double longitude angle (radians) ** phi double latitude angle (radians) ** r double radial distance ** ** Notes: ** ** 1) If P is null, zero theta, phi and r are returned. ** ** 2) At either pole, zero theta is returned. ** ** Called: ** eraC2s p-vector to spherical ** eraPm modulus of p-vector ** ** Copyright (C) 2013-2016, NumFOCUS Foundation. ** Derived, with permission, from the SOFA library. See notes at end of file. */ { eraC2s(p, theta, phi); *r = eraPm(p); return; }
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 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 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 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 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; }
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); }
void palDcc2s ( double v[3], double *a, double *b ) { eraC2s( v, a, b ); }
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 ); }
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); }
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 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. */ }