Hace unos meses escribí esta entrada explicando cómo calcular el lugar en el que hay que ponerse para conseguir una imagen de la Luna Llena con el complejo de las 4 Torres de Madrid (o cualquier otro objeto sobre el horizonte).
El método que describí es muy manual y se basa en acudir a una serie de páginas web y la herramienta de Google Earth.
Hoy voy a empezar una laaaaarga serie de entradas que nos permitan automatizar el proceso. Pero no me voy a limitar a pasarte un código fuente. Vamos a compaginar código fuente, servicios web con matemáticas astronómicas e Historia.
Y no esperes bajarte el programa. Voy a utilizar un lenguaje poco usado hoy día para que utilices el procedimiento descrito y lo escribas en el lenguaje que conozcas.
Yo voy a usar FORTRAN90 como homenaje a aquellas mujeres calculadoras de la NASA y en especial a la afroamericana Dorothy Vaughan que pasó de coordinadora (sin cobrar por esa responsabilidad) de las «calculadoras» humanas a una de las primeras expertas programadoras en las primeras versiones del lenguaje. Si no has visto la película «Figuras Ocultas» te la recomiendo encarecidamente.

Pero lo importante no es el lenguaje utilizado en escribir el programa. Lo importante es el algoritmo utilizado y sobre todo, divertirse.
En las próximas semanas habrá una serie de entradas que describirán el código fuente necesario para
Dada un fecha de entrada (la de un plenilunio)
- Calculará a qué hora sale y se pone sobre el horizonte.
- Calculará el azimuth (ángulo desde la dirección Norte) de ambos eventos.
- Calculará cuáles son las posiciones óptimas sobre la superficie terrestre para que se vea alineada la Luna respecto a un objeto cualquiera (del que se sepan las coordenadas geográficas). Para ello tendremos en cuenta el perfil de elevación terrestre llamando a las APIS de Google Earth y analizaremos si hay colinas que nos impidan la visión (Si hay edificios o Toros de Osborne todavía no sé hacerlo).
- Con esa información, generaremos un fichero kml (de google earth) con los puntos calculados ( y dejaré al trabajo del lector generar los landmarks de los bares más cercanos para que una vez hecha la foto lo celebremos convenientemente con una caña, sin alcohol, por supuesto).
- Para el caso particular de la 4 Torres de Madrid generaremos una simulación de la foto teniendo en cuenta la refracción atmosférica y la imagen de la luna (sin tener en cuenta libraciones) y usaremos un modelo 3D de los edificios para generar la composicion.
- Cada entrada irá acompañada con historias de la ciencia o explicaciones que ayuden a entender el código fuente asociado.
Un objetivo ambicioso sin duda.
Este proyecto esta originado por el trabajo que realicé para final del curso «Cálculo Astronómico» de la Universidad Autónoma de Madrid y que fue impartido por el profesor Enrique Velasco al que agradezco el soporte en las dudas que me fueron surgiendo.
Me he apoyado también la biblia de los algoritmos astronómicos

Y en la parte de interfaz con Google Earth pues… echándole imaginación 🙂
¡Manos a la obra!
Contando días
He comentado que la entrada del programa va a ser una fecha.
Estás acostumbrado a usar el formato día-mes-año. Pero ese formato no es muy útil para operar con días. Ya solo saber los días transcurridos entre dos fechas es complicado pues tienes que tener en cuenta los días de cada mes, si hay años bisiestos, etc.
Afortunadamente un astrónomo-historiador (¡qué fantástica mezcla de actividades!) del siglo XVI, Joseph Justus Scaligero tuvo una idea maravillosa.
Propuso un método continuo de contar días. De modo que hubiera un día primero y a partir de él contar los días transcurridos. (Así que para saber los días entre dos fechas solo hubiera que restar las fechas).
Puede parecer una tontería el método y muy influenciado por la religión judeocristiana (el día 1 sería la creación del mundo).
Pero, claro ¿cómo saber cuándo fue ese primer día?
Aquí Scaligero utilizo un método que sin ser científico, al menos fue lógico.
El historiador eligió la fecha de 1 de Enero del año 4713 antes de Cristo como el día primero. Al mediodía, para más señas.
¿Por qué eligió esa fecha?
Quizás el principal motivo fue que en los tiempos de Scaligero no se conocían hechos históricos anteriores a esa fecha. De modo que al elegir es origen de tiempos no existirían fechas negativas.
Pero también utilizó motivos astronómicos al elegir un año en el que tres ciclos astronómicos coincidían:
- Ciclo solar de 28 años: Ciclo en el que se repite para todos los días del año el día de la semana en el que cae. Por ejemplo si hoy 9 de Abril de 2017 es Lunes, el 9 de Abril de 2045 será Lunes.
- Ciclo Metónico de 19 años: Mínimo común múltiplo de los períodos orbitales terrestre y lunar.
- Ciclo de Indición romana de 15 años: Es un ciclo utilizado desde el Edicto de Milán e impuesto por el Emperador Constantino para asuntos del pecunio (impuestos, vamos). El Vaticano utilizo esta numeración para sus documentos (además rara vez un Papa duraba más que un ciclo indiciario).
Esos 3 números se descomponen en factores primos entre sí (28=2*2*7, 19, 15=5*3)
Así que para que se complete un ciclo conjunto hay que multiplicar sus valores:
28 * 19 * 15 = 7980 años
Son muchos años y desde luego toda la historia de hechos conocidos y escritos de la humanidad caben dentro de ese periodo.
Pero para elegir la fecha del tiempo cero hacía falta poner unas condiciones:
- En el último año de un ciclo solar, el 1 de enero es un domingo.
- En el primer año de un Ciclo Metónico, la Luna Nueva cae el 1 de enero.
- El primer ciclo de indición comenzó el 1 de septiembre del año 327.
Según la tradición arrastrada desde el siglo VI, el año del nacimiento de Cristo fue el noveno año del ciclo solar, el primer año de un ciclo metónico y el tercer año de un ciclo de la indición. Si se hacen coincidir el primer día del año de cada uno de los ciclos entonces el nacimiento de Cristo tendría lugar 4713 años después del origen.
Scaligero denominó Fecha Juliana a este modo de contar el tiempo.
Casi podría apostar que crees que se llamó Fecha Juliana por Julio César, el dictador romano.
Pero no.
El nombre de «Juliana» tiene origen en el nombre del padre de Joseph Justus, Giulio Cesare Scaligero, que si bien era un Julio César, no es en el que estabas pensando.
No fue hasta 1849 cuando John Herschell hizo que este sistema fuera el que se impusiera para calcular la efemérides astronómicas.

También estableció que el día juliano comenzara al mediodía, algo aparentemente poco intuitivo, salvo que te guste pasar las noches observando estrellas. Al hacer coincidir el comienzo del día justo al mediodía no hay cambio de fecha durante una observación nocturna 🙂
Así que ya tenemos nuestro año origen de tiempos: 1 De Enero del año 4713 antes de Cristo.
Y también los requisitos para hacer nuestra primera subrutina. Una subrutina a la que pasaremos la fecha gregoriana (vamos, la del calendario actual) y nos devolverá la fecha Juliana.
FUNCTION julian_date(a, m, d, h) ! FUNCION: julian_date ! OBJETIVO: Obtener Fecha Juliano ! ARGUMENTOS: ! ENTRADA ! a : INTEGER. año ! m : INTEGER. mes ! d : INTEGER. día ! h : DOUBLE. hora ! SALIDA ! julian_date : SALIDA. DOUBLE. día juliano implicit none REAL(kind=8):: h, jd, julian_date INTEGER(kind=4):: a, m, d, aa ! Si el mes m es enero o febrero, poner el origen en el 1 de marzo ! (restando 1 al año) IF (m.LT.3) THEN a = a - 1 m = m + 12 END IF ! Calcular días desde cierto origen hasta el 1º del mes jd = INT(365.25 * a) + INT(30.6001 * (m + 1)) ! Sumar días desde 1º del mes, d, JD del origen y hora h jd = jd + d + 1720994.5d0 + h / 24.0d0 ! Implementar Reforma Gregoriana ! Para leer sobre esa reforma puedes leer en ! la entrada sobre NEWTON IF (a + m / 100 + d / 10000 .GT. 1582.1014) THEN aa = INT(a / 100.0) julian_date = jd + 2 - aa + INT(aa / 4.0) END IF END FUNCTION julian_date
Creo que el lenguaje es fácilmente comprensible para cualquier programador en cualquier lenguaje. Aquí no vamos a emplear nada más que operaciones matemáticas. Cuando haya algo que crea que pueda resultar «extraño» lo comentaré.
Por ejemplo,».GT.», es «Greater Than» (es decir, «>»).
Habrás visto en el código que los números reales se escriben en una notación exponencial
24.0d0 es 24.0 + 100
la d viene de números en doble precisión. Es muy importante que emplees un programa que pueda manejar muchas cifras significativas en los decimales.
Para comprobar que es correcta tu implementación en el lenguaje que hayas elegido puedes probar con estos datos:
Fecha Gregoriana : 10-4-2018 hora: 10.000000000
la salida debería ser ésta:
Fecha Juliana : 2458218.916666667
En la próxima entrada hablaremos de cambio de coordenadas. Prepárate a girar en 3 Dimensiones…
NOTA: No prometo una entrada a la semana… Y de vez en cuando intercalaré otros temas para no aburrir (me) porque nadie lee esto 🙂