Usando SOFA, la biblioteca de la IAU
Data de publicació, 27 de setembre de 2023
Standards Of Fundamental Astronomy (SOFA) es un una librería publicada periódicamente por la IAU que incluye las subrutinas en ANSI C y Fortran para movernos a lo largo de la cadena de transformaciones astrométricas.
Cadena de transformaciones astrométricas de la IAU.
Se menciona la función SOFA atco13, que pasa de ICRS RA, Dec a lugar observado, a partir de UTC, coordenadas del observatorio, condiciones ambientales y frecuencia de observación. La función llama a modelos SOFA para el cálculo de efemérides terrestres, sesgo-precesión-nutación, orientación terrestre y refracción.
Sin embargo, para ser usada primero debe ser compilada por el usuario según el sistema operativo que use, lo que puede ser complicado si no tenemos experiencia.
En este ejemplo, vamos a describir paso a paso cómo bajar la versión en ANSI C, compilarla para Microsoft Windows y finalmente ejecutar un archivo ejecutable de demostración.
Instalación del compilador en Windows
Descarga el gestor de paquetes de MinGW, mingw-get-setup.exe desde https://sourceforge.net/projects/mingw/ e instala.
Se abrirá una selección de paquetes. Marcamos para instalación mingw32-base, que incluye el compilador C, y aplicamos los cambios.
Al acabar la instalación, habrá aparecido C:\mingw.
Para permitir la ejecución de sus ejecutables presentes en la carpeta C:\mingw\bin sin necesidad de escribir la ruta entera, vamos a Configuración → Sistema → Acerca de → Configuración avanzada del sistema → Opciones avanzadas → Variables de entorno → Variables del sistema → Path → Editar, y añadimos C:\mingw\bin.
Instalación de la librería SOFA
Descarga la librería desde https://www.iausofa.org/current_C.html#Downloads en formato zip. Al descomprimir el archivo, aparecen varios niveles. Crea la carpeta C:/sofa y añádele únicamente la carpeta /src que viene en el archivo zip con los archivos fuente, los únicos que te interesan. Elimina el resto si quieres. Como referencia, en la versión 20231011 para ANSI C que vamos a usar aquí, esta carpeta contiene 248 archivos del tipo .c, 2 archivos del tipo .h, y el archivo makefile. No usarás el archivo makefile suministrado porque esta diseñado para Linux y no merece la pena perder el tiempo en adaptarlo a Windows. Tampoco usarás t_sofa_c.c, que se incluye sólo para comprobar todas las demás funciones, por lo que no es necesario compilarlo. Además, al tener más de 10.000 líneas puede darte problemas.
En lugar de usar makefile, abre un símbolo del sistema con cmd, desplázate a C:\sofa\src y escribe un comando para compilar cada archivo fuente .c en archivo objeto .o, con las opciones de optimización -O2, advertencias -Wall y generación de código de posición independiente -fPIC.
for %f in (*.c) do gcc -O2 -Wall -fPIC -c "%f" -o "%~nf.o"
Después de un rato, se habrán generado 247 archivos tipo .o.
Crea la biblioteca estática libsofa.a a partir de todos los archivos objeto en el directorio, escribiendo el comando:
ar rcs libsofa.a *.o
Creación de un archivo ejecutable de demostración de SOFA
Copia el texto del programa de demostración proporcionado por la propia IAU en un archivo de texto al que llamarás por ejemplo sofademo con la extensión .c.
Compila sofademo.c enlazando con la biblioteca libsofa.a y creando un archivo ejecutable llamado sofademo.exe. La opción -IC:\sofa\src especifica el directorio que contiene los archivos de encabezado de la biblioteca SOFA, y la opción -LC:\sofa\src especifica el directorio que contiene la biblioteca libsofa.a. Para ello, escribe el comando:
gcc -o sofademo.exe sofademo.c -IC:\sofa\src -LC:\sofa\src -lsofa
Ejecuta sofademo.exe. Si las bibliotecas están bien instaladas, obtienes esta salida:
C:\>sofademo
ICRS, epoch J2000.0: 14 34 16.8118300 -12 31 10.396500
catalog -> astrometric: 14 34 16.4960283 -12 31 02.523786
astrometric -> CIRS: 14 34 20.2370587 -12 34 36.381654
catalog -> CIRS: 14 34 20.2370587 -12 34 36.381654
geocentric apparent: 14 35 01.7725802 -12 34 36.381654
CIRS -> topocentric: 14 34 20.2570287 -12 34 36.141207
CIRS -> observed: 14 34 16.9649101 -12 34 44.643091
ICRS -> observed: 14 34 16.9649106 -12 34 44.643094
ICRS -> CIRS (JPL, IERS): 14 34 20.2370639 -12 34 36.381756
ICRS -> CIRS (+ planets): 14 34 20.2370658 -12 34 36.381784
CIRS -> astrometric: 14 34 16.4960283 -12 31 02.523786
¡Enhorabuena, ya puedes usar sofademo.c como modelo para tus propios desarrollos!