Programa de demostración de SOFA

Comenzando con los datos del catálogo de una estrella, el programa de demostración que se enumera a continuación realiza toda una serie de transformaciones, a saber:


1. Entrada del catálogo ICRS a CIRS, tanto directamente como mediante lugar astrométrico.

2. Lugar aparente geocéntrico mediante la ecuación de los orígenes.

3. CIRS a topocéntrico, es decir, CIRS a observado pero con presión de aire cero.

4. CIRS a observado.

5. ICRS a observado en una sola llamada.

6. ICRS a CIRS usando JPL DE405 para las efemérides de la Tierra.

7. Lo mismo pero incluyendo la desviación de la luz por parte de Júpiter y Saturno.

8. Lo contrario, para comprobar la concordancia con el Paso 2.


El código está completo, listo para compilar y ejecutar y puede ser una plantilla útil para futuros experimentos. 


Por supuesto, una aplicación de la vida real sería mucho más simple que esta demostración bastante complicada, con el uso de las funciones de astrometría SOFA limitado a quizás una sola llamada. Las circunstancias de la prueba son las siguientes. Hay que subrayar que todos los números han sido adoptados únicamente por motivos de demostración y no tienen ningún otro significado. Aunque son bastante representativos de los datos reales, se debe suponer que todos los valores utilizados son ficticios.


Las coordenadas del sitio son: 


Latitud y longitud = S 15◦ 57′ 42′.8 W 5◦ 41′ 54′.2

Altura sobre el elipsoide de referencia = 625 m


Aquí están los datos del catálogo de la estrella de prueba:


ICRS [α,δ ] = 14h 34m 16s.81183 −12◦ 31′ 10′′.3965

movimientos propios: µα = −354,45 mas/y, µδ = +595,35 mas/y 

paralaje = 0′.16499

velocidad radial (velocidad de recesión) = 0 km/s


La fecha y hora son:


2 de abril de 2013, 23h 15m 43s.55 UTC


Los parámetros de orientación de la Tierra son:


movimiento polar: x = +50,995 mas, y = +376,723 mas

UT1-UTC = +155,0675 ms


y también:


correcciones al CIP IAU 2000A: dx = +0,269 mas, dy = −0,274 mas


Código


Si no deseas copiarlo, puedes obtener aquí el archivo sofademo.c.

#include <sofa.h>

void reprd ( char*, double, double ); int main ()

{

#define DAS2R (4.848136811095359935899141e-6) /* arcsec to radians */

 

   iauASTROM astrom;

   iauLDBODY b[3];

   double phi, elong, hm, phpa, tc, rh, wl, utc1, utc2, tai1, tai2, 

          tt1, tt2, xp, yp, dut1, dx, dy, rc, dc, pr, pd, px, rv, ç

          rca, dca, ri, di, eo, ra, da, aot, zot, hot, dot, rot,

          aob, zob, hob, dob, rob, pvh[2][3], pvb[2][3], r[3][3], 

          x, y, s;

 

/* Site longitude, latitude (radians) and height above the geoid (m). */

   iauAf2a ( '-', 5, 41, 54.2, &elong );

   iauAf2a ( '-', 15, 57, 42.8, &phi );

   hm = 625.0;

 

/* Ambient pressure (HPa), temperature (C) and rel. humidity (frac). */

   phpa = 952.0;

   tc = 18.5;

   rh = 0.83;


/* Effective color (microns). */

   wl = 0.55;

 

/* UTC date. */

   if ( iauDtf2d ( "UTC", 2013, 4, 2, 23, 15, 43.55,

                   &utc1, &utc2 ) ) return -1;

 

/* TT date. */

   if ( iauUtctai ( utc1, utc2, &tai1, &tai2 ) ) return -1;

   if ( iauTaitt ( tai1, tai2, &tt1, &tt2 ) ) return -1;

 

/* EOPs: polar motion in radians, UT1-UTC in seconds. */

   xp = 50.995e-3 * DAS2R;

   yp = 376.723e-3 * DAS2R;

   dut1 = 155.0675e-3;

 

/* Corrections to IAU 2000A CIP (radians). */

   dx = 0.269e-3 * DAS2R;

   dy = -0.274e-3 * DAS2R;

 

/* Star ICRS RA,Dec (radians). */

   if ( iauTf2a ( ' ', 14, 34, 16.81183, &rc ) ) return -1;

   if ( iauAf2a ( '-', 12, 31, 10.3965, &dc ) ) return -1; 

   reprd ( "ICRS, epoch J2000.0:", rc, dc );

 

/* Annual proper motion: RA/Dec derivatives, epoch J2000.0. */

   pr = atan2 ( -354.45e-3 * DAS2R, cos(dc) );

   pd = 595.35e-3 * DAS2R;

 

/* Parallax (arcsec) and recession speed (km/s). */

   px = 164.99e-3;

   rv = 0.0;

 

/* ICRS catalog to astrometric place... */

   iauAtcc13 ( rc, dc, pr, pd, px, rv, tt1, tt2, &rca, &dca );

   reprd ( "catalog -> astrometric:", rca, dca );

 

/* ...then to CIRS (geocentric observer). */

   iauAtci13 ( rca, dca, 0.0, 0.0, 0.0, 0.0, tt1, tt2, &ri, &di, &eo );

   reprd ( "astrometric -> CIRS:", ri, di );

 

/* ICRS catalog directly to CIRS (geocentric observer). */ iauAtci13 ( rc, dc, pr, pd, px, rv, tt1, tt2, &ri, &di, &eo );

   reprd ( "catalog -> CIRS:", ri, di );

 

/* Apparent place. */

   ra = iauAnp ( ri - eo );

   da = di;

   reprd ( "geocentric apparent:", ra, da );

 

/* CIRS to topocentric. */

   if ( iauAtio13 ( ri, di, utc1, utc2, dut1, elong, phi, hm, xp, yp,

                    0.0, 0.0, 0.0, 0.0,

                    &aot, &zot, &hot, &dot, &rot ) ) return -1;

   reprd ( "CIRS -> topocentric:", rot, dot );

 

/* CIRS to observed. */

   if ( iauAtio13 ( ri, di, utc1, utc2, dut1, elong, phi, hm, xp, yp,

                    phpa, tc, rh, wl,

&aob, &zob, &hob, &dob, &rob ) ) return -1;

   reprd ( "CIRS -> observed:", rob, dob );

 

/* ICRS to observed. */

   if ( iauAtco13 ( rc, dc, pr, pd, px, rv, utc1, utc2, dut1,

                    elong, phi, hm, xp, yp, phpa, tc, rh, wl,

                    &aob, &zob, &hob, &dob, &rob, &eo ) ) return -1;

   reprd ( "ICRS -> observed:", rob, dob );

 

/* ICRS to CIRS using some user-supplied parameters. */

 

/* SOFA heliocentric Earth ephemeris. */

   if ( iauEpv00 ( tt1, tt2, pvh, pvb ) ) return -1;

 

/* JPL DE405 barycentric Earth ephemeris. */

   pvb[0][0] = -0.9741704366519668;

   pvb[0][1] = -0.2115201000882231;

   pvb[0][2] = -0.0917583114068277;

   pvb[1][0] = 0.0036436589347388;

   pvb[1][1] = -0.0154287318503146;

   pvb[1][2] = -0.0066892203821059;

 

/* IAU 2000A CIP. */

   iauPnm00a ( tt1, tt2, r );

   iauBpn2xy ( r, &x, &y );

 

/* Apply IERS corrections. */

   x += dx;

   y += dy;

 

/* SOFA CIO locator. */

   s = iauS06 ( tt1, tt2, x, y );

 

/* Populate the context. */

   iauApci ( tt1, tt2, pvb, pvh[0], x, y, s, &astrom );

 

/* Carry out the transformation and report the results. */ iauAtciq ( rc, dc, pr, pd, px, rv, &astrom, &ri, &di ); reprd ( "ICRS -> CIRS (JPL, IERS):", ri, di );

 

/* The same but with Saturn then Jupiter then Sun light deflection. */

 

   b[0].bm = 0.00028574;

   b[0].dl = 3e-10;

   b[0].pv[0][0] = -7.8101442680818964;

   b[0].pv[0][1] = -5.6095668114887358;

   b[0].pv[0][2] = -1.9807981923749924;

   b[0].pv[1][0] = 0.0030723248971152;

   b[0].pv[1][1] = -0.0040699547707598;

   b[0].pv[1][2] = -0.0018133584165345;

 

   b[1].bm = 0.00095435;

   b[1].dl = 3e-9;

   b[1].pv[0][0] = 0.7380987962351833;

   b[1].pv[0][1] = 4.6365869247538951;

   b[1].pv[0][2] = 1.9693136030111202;

   b[1].pv[1][0] = -0.0075581692172088;

   b[1].pv[1][1] = 0.0012691372216750;

   b[1].pv[1][2] = 0.0007279990012801;

 

   b[2].bm = 1.0;

   b[2].dl = 6e-6;

   b[2].pv[0][0] = -0.0007121743770509;

   b[2].pv[0][1] = -0.0023047830339257;

   b[2].pv[0][2] = -0.0010586596574639;

   b[2].pv[1][0] = 0.0000062923521264;

   b[2].pv[1][1] = -0.0000003308883872;

   b[2].pv[1][2] = -0.0000002964866231;

 

   iauAtciqn ( rc, dc, pr, pd, px, rv, &astrom, 3, b, &ri, &di );

   reprd ( "ICRS -> CIRS (+ planets):", ri, di );

 

/* CIRS to ICRS (astrometric). */

   iauAticqn ( ri, di, &astrom, 3, b, &rca, &dca );

   reprd ( "CIRS -> astrometric:", rca, dca );


   return 0;

}


#include <stdio.h>

void reprd ( char* s, double ra, double dc )

{

   char pm;

   int i[4];

 

   printf ( "%25s", s );

   iauA2tf ( 7, ra, &pm, i );

   if ( pm == (char) '+' ) pm = (char) ' ';

   printf ( "%c%2.2d %2.2d %2.2d.%7.7d ", pm, i[0],i[1],i[2],i[3] );

   iauA2af ( 6, dc, &pm, i );

   printf ( "%c%2.2d %2.2d %2.2d.%6.6d\n", pm, i[0],i[1],i[2],i[3] );

} 


Notas







14h 34m 16s.8118300 −12◦ 31′ 10′′.396500


... viene simplemente del catálogo suministrado [α, δ].



14h 34m 16s.4960283 −12◦ 31′ 02′′.523786 


La transformación elimina el movimiento espacial y el paralaje de una estrella del catálogo y la coloca en la esfera celeste. En aplicaciones típicas, esto evita un nuevo cálculo innecesario de estos efectos que cambian lentamente. Si hay varias estrellas involucradas, el coste computacional se puede reducir aún más llamando a iauApci13 una vez, seguido de múltiples llamadas a iauAtccq.



14h 34m 20s.2370587 −12◦ 34′ 36′′.381654


Nuevamente, si hay múltiples estrellas involucradas, es más eficiente llamar a iauApci13 una vez, seguido de múltiples llamadas a iauAtciq.



14h 34m 20s.2370587 −12◦ 34′ 36′.381654


Si hay múltiples estrellas involucradas y la eficiencia computacional es importante, sería mejor llamar a iauApci13 una vez, seguido de múltiples llamadas a iauAtciq.



14h 34m 20s.2370587 −12◦ 34′ 36′.381654




14h 34m 16s.4960283 −12◦ 31′ 02′.523786




14h 34m 20s.2370587 −12◦ 34′ 36′.381654


...vuelve a ser el de antes.



14h 35m 01s.7725802 −12◦ 34′ 36′.381654



14h 34m 20s.2570288 −12◦ 34′ 36′.141207



14h 34m 16s.9649101 −12◦ 34′ 44′.643091



14h 34m 16s.9649106 −12◦ 34′ 44′.643094




14h 34m 20s.2370639 −12◦ 34′ 36′′.381756





14h 34m 20s.2370658 −12◦ 34′ 36′′.381784




14h 34m 16s.4960283 −12◦ 31′ 02′′.523786