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
#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
El valor de la presión (952 HPa ≡ mB) es la presión real en el lugar del observador, que los aviadores llaman QFE. Un error común es utilizar QNH, la presión actual extrapolada hasta el nivel del mar y, en consecuencia, cercana a 1013 hPa, independientemente de la altitud del sitio.
La longitud de onda está en el amarillo-verde. Para seleccionar el caso de radio, se puede utilizar cualquier número mayor que 100.
Al comenzar desde UTC, es importante utilizar la función SOFA iauDtf2, aunque el resultado se parezca a un SOFA JD normal de dos partes: esto se debe al manejo de segundos intercalares.
El movimiento polar x e y se puede considerar cero en muchas aplicaciones de baja precisión. Sin embargo, UT1−UTC es vital siempre que se calcule [h, δ] o [az, alt] topocéntrico u observado.
El ejemplo de movimiento propio especifica tanto µα como µδ en milisegundos de arco (por año), como en el catálogo de Hipparcos, por ejemplo. La unidad de miliarcosegundo identifica el componente de movimiento propio α como “distancia en el cielo” en lugar de “cambio en la coordenada de ascensión recta”. Todas las funciones SOFA utilizan este último, al igual que el catálogo FK5, por ejemplo, por lo que en el caso de prueba se requiere un escalado de cos δ.
La primera línea del informe:
14h 34m 16s.8118300 −12◦ 31′ 10′′.396500
... viene simplemente del catálogo suministrado [α, δ].
Primero, se llama a la función iauAtcc13 para demostrar la transformación de una entrada del catálogo ICRS a un lugar astrométrico en una sola llamada. El resultado es:
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.
Una vez obtenido el lugar astrométrico, las coordenadas CIRS geocéntricas actuales se pueden obtener aplicando la transformación ICRS a CIRS pero con movimiento espacial cero, con iauAtci13. El resultado es:
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.
En aplicaciones donde el lugar astrométrico no tiene interés, la entrada del catálogo se puede transformar directamente en CIRS (geocéntrico) llamando a iauAtci13. El resultado es nuevamente:
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.
A continuación, se demuestra la transformación de ICRS a CIRS (geocéntrico) utilizando el enfoque de “llamada única”, en este caso iauAtci13. El resultado es nuevamente:
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.
A continuación, la transformación inversa utiliza iauAtic13 para dar el lugar "astrométrico":
14h 34m 16s.4960283 −12◦ 31′ 02′′.523786
Esto difiere del catálogo [α, δ] en la primera línea del informe porque el lugar astrométrico incluye los efectos del movimiento propio de la estrella desde J2000.0 hasta la fecha (y también el paralaje).
Luego, el lugar astrométrico se transforma a CIRS llamando nuevamente a iauAtci13, pero esta vez con movimiento propio, paralaje y velocidad radial cero. El resultado...
14h 34m 20s.2370587 −12◦ 34′ 36′′.381654
...vuelve a ser el de antes.
A continuación, se obtiene el lugar aparente clásico (basado en el equinoccio), simplemente tomando la ecuación de los orígenes devuelta por la función iauAtci13 y restándola de CIRS α (basado en CIO), dejando δ sin cambios:
14h 35m 01s.7725802 −12◦ 34′ 36′′.381654
La posición CIRS se transforma en topocéntrica [α, δ ] llamando a la función CIRS →observada iauAtio13 con presión de aire cero:
14h 34m 20s.2570288 −12◦ 34′ 36′′.141207
Al llamar nuevamente a la función iauAtio13, pero esta vez con las condiciones ambientales especificadas, se obtiene el [α, δ observado]:
14h 34m 16s.9649101 −12◦ 34′ 44′′.643091
La transformación de dos etapas ICRS → CIRS → observada, aunque conveniente en muchas aplicaciones, implica correcciones diurnas que no son rigurosas. La función iauAtco13 realiza la transformación ICRS →observada directa para alcanzar este resultado ligeramente diferente:
14h 34m 16s.9649106 −12◦ 34′ 44′′.643094
A continuación, se repite la transformación de ICRS a CIRS que realizamos anteriormente, pero esta vez usando las efemérides del sistema solar JPL DE405 para obtener la posición y velocidad de la Tierra, en lugar de la función SOFA iauEpv00, y usando el CIP publicado en los boletines del IERS. Esto se logra realizando la transformación en dos pasos, primero completando el contexto de astrometría y luego usándolo en el objetivo de prueba. Esto involucra la función iauApci seguida de iauAciq. La función iauApcicall requerirá no sólo los vectores baricéntricos sino también la posición heliocéntrica, por lo que el primer paso es calcular las efemérides de la Tierra usando funciones SOFA y luego sustituir los componentes del vector baricéntrico DE405: consulte el código para los valores numéricos. Obtenemos el mejor CIP posible agregando correcciones dx, dy publicadas por el IERS a su modelo de referencia de sesgo-precesión-nutación, es decir, IAU 2000A, y finalmente usamos SOFA para obtener el localizador CIO s.
Luego podemos llamar a iauApci especificando la combinación de datos SOFA/JPL/IERS, seguido de iauAciq para realizar la transformación. El resultado es:
14h 34m 20s.2370639 −12◦ 34′ 36′′.381756
Casi toda la diferencia entre este y los resultados anteriores del CIRS se debe a las correcciones del IERS CIP, que en su mayor parte son para proporcionar la nutación central libre (no modelada). Una contribución muy pequeña proviene de la velocidad de la Tierra mejorada y su efecto sobre la aberración, pero ésta nunca supera los 5 µas.
Todas las transformaciones hasta ahora han tenido en cuenta la desviación de la luz del Sol, un refinamiento que por sí solo supera las exigencias de precisión de la mayoría de las aplicaciones. Sin embargo, las aplicaciones que requieran la máxima precisión deberían tener en cuenta además los planetas, y para ello el ejemplo incluye a Júpiter y Saturno. Para cada uno de estos cuerpos, más el Sol, el código especifica la masa y la posición baricéntrica y la velocidad en la época de observación; Como antes, se utilizan los valores de DE405. También se necesita un parámetro de corte, elegido para que esté dentro del disco del cuerpo visto por el observador, dentro del cual se suprime el cálculo para evitar dificultades numéricas.
La transformación de coordenadas de catálogo a CIRS se realiza mediante una forma extendida de la función iauAtciq, denominada iauAtciqncall. Esto requiere dos argumentos adicionales, a saber, el número de cuerpos del sistema solar que deben tenerse en cuenta y una serie de conjuntos de parámetros por cuerpo. En este ejemplo, el orden es Saturno, luego Júpiter y luego el Sol. El resultado de la transformación es:
14h 34m 20s.2370658 −12◦ 34′ 36′′.381784
Las pequeñas diferencias con respecto al cálculo del Sol se deben, en este caso, a Saturno, que está a unos 0°.38 de la estrella, en comparación con los 148° y 153° de Júpiter y el Sol, respectivamente.
Finalmente, ese resultado se transforma nuevamente en lugar astrométrico. El resultado concuerda con el obtenido anteriormente:
14h 34m 16s.4960283 −12◦ 31′ 02′′.523786