Tuesday, August 8, 2017

Coordinate eclittiche con JPL Toolkit - reference frame e file FK

NB: Questa pagina è stata interamente riscritta in data 25-03-2019, alcune delle considerazioni fatte all'epoca della scrittura erano inesatte e fuorvianti, me ne scuso con i lettori

L'astrologia non usa un sistema di riferimento inerziale. Inerziale vuol dire che gli oggetti, se non sono sottoposti a forze esterne, mantengono la loro velocità iniziale. Se compaiono accelerazioni, quindi forze impresse agli oggetti, il sistema di riferimento NON è inerziale. Il più inerziale fra quelli disponibili è il International Celestial Reference Frame (ICRF), adottato dall'International Astroniomical Union dal 1 gennaio 1998, in sostituzione del precedente FK5. E' quasi inerziale perchè basato sulla misura di più di 200 sorgenti extragalattiche nello spazio profondo.

Precisiamo inoltre che gli astrologi usano un sistema di riferimento che è assolutamente non inerziale, perchè non è basato su punti fissi dello spazio profondo, ma su un punto di origine nel cerchio dell'eclittica, il punto vernale o 0° di Ariete, dato dall'intersezione di equatore ed eclittica, nell'istante in cui la declinazione solare (in termini di coordinate equatoriali) torna ad essere positiva. Questo vale per tutta la superficie terrestre, anche se i cicli stagionali variano da emisfero nord a emisfero sud, creando espressioni climatiche differenti.

Il punto vernale è dato dall' intersezione dell'equatore (che esprime il moto di rotazione terrestre) e dell'eclittica (cioè dal moto di rivoluzione della Terra intorno al Sole), ma risente di almeno altre due componenti del moto. Le quattro principali sono la rotazione, la rivoluzione, la precessione (che è un moto periodico di circa 26000 anni in cui il Polo Nord celeste descrive un cerchio nel riferimento inerziale) e la nutazione, che è un'ondulazione di quest'ultimo cerchio, come appare come nella figura seguente:

Nel post precedente abbiamo utilizzato il frame J2000, che la documentazione di SPICE descrive come "Earth mean equator, dynamical equinox of J2000. The root reference frame for SPICE". Ai fini astrologici dobbiamo passare ad un sistema di riferimento eclittico, dinamico, cioè tempo dipendente, che integri tutte le componenti principali del moto. Il JPL toolkit ci dà la possibilità di costruire un kernel su misura, che costruiremo secondo le regole indicate nella documentazione. In primo luogo renderemo dinamico il frame, riferito pero' al sistema di riferimento eclittico.

Usiamo un template che ci fornisce la documentazione:

   FRAME_             =  
   FRAME__NAME          =  
   FRAME__CLASS         =  5
   FRAME__CLASS_ID      =  
   FRAME__CENTER        =  399
   FRAME__RELATIVE      = 'ECLIPJ2000'
   FRAME__DEF_STYLE     = 'PARAMETERIZED'
   FRAME__FAMILY        = 'MEAN_ECLIPTIC_AND_EQUINOX_OF_DATE'
   FRAME__PREC_MODEL    = 'EARTH_IAU_1976'
   FRAME__OBLIQ_MODEL   = 'EARTH_IAU_1980'
   FRAME__ROTATION_STATE= 'ROTATING'

In primo luogo, essendo un frame kernel, sarà un file con estensione .tf:

NAIF recommends kernel names use only lower case letters. 
NAIF further recommends one follows the conventions established for kernel 
name extensions, shown below.

            .bc    binary CK
            .bes   binary Sequence Component EK
            .bpc   binary PCK
            .bsp   binary SPK
            .tf    text FK
            .ti    text IK
            .tls   text LSK
            .tm    text meta-kernel (FURNSH kernel)
            .tpc   text PCK
            .tsc   text SCLK
 

quindi lo salveremo, per esempio, come "trueepoch.tf".

Quindi assegneremo un frame_ID, che dovrà essere tra quelli consentiti da NAIF: "If the frame is a TK frame, the class ID must match the frame ID. For both ID codes you should use a positive integer in the range from 1400000 to 2000000 (unless you are working in an official project capacity in which case you should ask NAIF to provide a CLASS_ID for you)". Potremo scegliere un numero come 1987654, e sostituirlo nel template dove previsto.

   FRAME_             =  1987654
   FRAME_1987654_NAME          =  
   FRAME_1987654_CLASS         =  5
   FRAME_1987654_CLASS_ID      =  1987654
   FRAME_1987654_CENTER        =  399
   FRAME_1987654_RELATIVE      = 'ECLIPJ2000'
   FRAME_1987654_DEF_STYLE     = 'PARAMETERIZED'
   FRAME_1987654_FAMILY        = 'MEAN_ECLIPTIC_AND_EQUINOX_OF_DATE'
   FRAME_1987654_PREC_MODEL    = 'EARTH_IAU_1976'
   FRAME_1987654_OBLIQ_MODEL   = 'EARTH_IAU_1980'
   FRAME_1987654_ROTATION_STATE= 'ROTATING'

Per il frame name sceglieremo qualcosa di indicativo, da richiamare nella funzione spkezr_c già tradotta in Python in un post precedente, per esempio "MYTRUEEPOCH"

   FRAME_MYTRUEEPOCH             =  1987654
   FRAME_1987654_NAME          =  'MYTRUEEPOCH'
   FRAME_1987654_CLASS         =  5
   FRAME_1987654_CLASS_ID      =  1987654
   FRAME_1987654_CENTER        =  399
   FRAME_1987654_RELATIVE      = 'ECLIPJ2000'
   FRAME_1987654_DEF_STYLE     = 'PARAMETERIZED'
   FRAME_1987654_FAMILY        = 'MEAN_ECLIPTIC_AND_EQUINOX_OF_DATE'
   FRAME_1987654_PREC_MODEL    = 'EARTH_IAU_1976'
   FRAME_1987654_OBLIQ_MODEL   = 'EARTH_IAU_1980'
   FRAME_1987654_ROTATION_STATE= 'ROTATING'

I primi 6-8 byte del file sono dedicati all'identificazione del tipo di kernel, per un kernel FK la dicitura prevista è KPL/FK, in una riga a se stante, seguito da una breve descrizione. Inoltre il blocco di definizioni deve essere compreso fra le istruzioni escaped \begindata e \begintext. Il risultato finale potrebbe essere:

KPL/FK

private Kernel FK,  dynamic, geocentric, time-based. It integrates precession, nutation and ecliptic obliquity models


\begindata

   FRAME_MYTRUEEPOCH           =  1987654
   FRAME_1987654_NAME          =  'MYTRUEEPOCH'
   FRAME_1987654_CLASS         =  5
   FRAME_1987654_CLASS_ID      =  1987654
   FRAME_1987654_CENTER        =  399
   FRAME_1987654_RELATIVE      = 'ECLIPJ2000'
   FRAME_1987654_DEF_STYLE     = 'PARAMETERIZED'
   FRAME_1987654_FAMILY        = 'MEAN_ECLIPTIC_AND_EQUINOX_OF_DATE'
   FRAME_1987654_PREC_MODEL    = 'EARTH_IAU_1976'
   FRAME_1987654_OBLIQ_MODEL   = 'EARTH_IAU_1980'
   FRAME_1987654_ROTATION_STATE= 'ROTATING'

\begintext

La classe 5 è prevista per i modelli dinamici, 'PARAMETERIZED' è una definizione di default, 'ROTATING' significa non inerziale. Non prevedo ulteriori informazioni testuali, per cui lascio vuoto lo spazio oltre \begintext.

Salviamo tutto come trueepoch.tf e cominciamo a usare il kernel.

Scriviamo un breve programma python che calcola le posizioni eclittiche di Sole, Luna e pianeti usando il nuovo modello per la data di oggi e per il mezzogiorno della data in cui sto scrivendo: 8-Ago-2017.

Codice e risultati riferiti a tale data:

from tools import *
import jpltoolkit as jpl

lista = [b"SUN", b"MOON", b"MERCURY", b"VENUS", b"MARS",
         b"JUPITER_BARYCENTER", b"SATURN_BARYCENTER", b"URANUS_BARYCENTER",
         b"NEPTUNE_BARYCENTER", b"PLUTO_BARYCENTER"]
# kernels load
jpl.furnsh_c(b'./de421.bsp')
jpl.furnsh_c(b'./naif0012.tls')

# calculate geocentric ecliptic coordinates
jpl.furnsh_c(b'./trueepoch.tf')
timestring = b"2013-08-08T12:00:00"
ref = b"MYTRUEEPOCH"
abcorr = b"NONE"

print ("ecliptic coordinates (earthtrueeopch) 2013-08-08 12:00:00 UTC")
for i in lista:
    target = i
    observer = b"EARTH"
    # first equatorial
    xyz = jpl.spkezr_c(target, ref, timestring, abcorr, observer)
    x = xyz[0]; y = xyz[1]; z = xyz[2]
    rec_vector = (x,y,z)
    result = jpl.reclat_c(rec_vector)
    a = result[1]
    while a < 0:
        a += math.pi*2
    print ("reclat", i, result[0], ddd2dms(a * jpl.dpr_c()), ddd2dms(result[2] * jpl.dpr_c()))
print("\n")
print("\n")
print("\n")
---------------------------
ecliptic coordinates (earthtrueeopch) 2013-08-08 12:00:00 UTC
('reclat', 'SUN', 151683411.43760258, (136, 6, 25), (0, 0, 1))
('reclat', 'MOON', 396667.3758218271, (154, 9, 47), (-4, 37, 28))
('reclat', 'MERCURY', 165672145.9315892, (119, 59, 32), (0, 14, 9))
('reclat', 'VENUS', 191961492.69616985, (170, 19, 16), (1, 4, 57))
('reclat', 'MARS', 355674573.1827142, (107, 18, 15), (0, 46, 30))
('reclat', 'JUPITER_BARYCENTER', 885254140.6884873, (99, 32, 37), (0, 9, 16))
('reclat', 'SATURN_BARYCENTER', 1493132563.8426943, (215, 36, 25), (2, 20, 15))
('reclat', 'URANUS_BARYCENTER', 2911577405.9178605, (12, 19, 43), (0, 42, 57))
('reclat', 'NEPTUNE_BARYCENTER', 4341288355.286687, (334, 27, 18), (0, 40, 55))
('reclat', 'PLUTO_BARYCENTER', 4737631830.616889, (279, 25, 10), (3, 8, 39))

Per confronto allego una copia della pagina corrispondente delle Rosycrucian Ephemeris 2000-2100 12h TDT (noon)- International Edition The Rosicrucian Felloship - Publisher - Oceanside). Si tenga comunque conto delle differenze di impostazione (TDT anzichè UTC, JPL DE102 anzichè JPL DE421, rotazione alla J2000 standard epoch, riduzione alle coordinate apparenti, deflessione della luce nel campo gravitazionale del Sole ecc.):

No comments:

Post a Comment

How to create a virtual linux machine with qemu under Debian or Ubuntu with near native graphics performance

It's been a long time since my latest post. I know, I'm lazy. But every now and then I like to publish something that other people c...