Gli Algoritmi della Libreria SOFA
Prev Next

3. Le 161 (adesso 220) Subroutine della libreria SOFA

Quando le subroutine sono tantissime, come nel nostro caso, non conviene richiamarle di volta in volta dal programma principale, in quanto il procedimento sarebbe molto dispersivo. Infatti molte di esse si collegano a loro volta ad altre funzioni (FUNCTION) e “sub” per cui potrebbero innescarsi degli errori di compilazione quolora ci si scordasse di elencarne qualcuna.

Lo stesso Working Group dell'IAU (che ha predisposto il 'pacchetto' SOFA) consiglia la formazione di una LIBRERIA che raggruppi tutte le 161 subroutine.

3.1. Come si crea la libreria SOFA

Innanzitutto scarichiamola dalla seguente pagina web, cliccando su “download”. Il file gzippato contiene, oltre ai 161 file (.for), parecchie note tecnico-esplicative (HOWTO) e un importante makefile di cui gli utilizzatori di Linux conoscono la grande potenza e versatilità.

Stavolta però seguiamo una via più pratica, “comune” alle due piattaforme Linux e DOS. Dopo aver dezippato il file suddetto, lasciamo nella directory di lavoro i 161 file .for e li “cuciamo” in un unico file, che per praticità mnemonica potremmo chiamare 161p.for. La ′p′ sta per “plus”, intendendo che vi abbiamo aggiunto il seguente file, molto pratico per assegnare i colori allo sfondo dello schermo quando si avviano gli eseguibili. In realtà i file raggruppati saranno così 162.

      subroutine CLRSCR
*-----------------------------------------------------------------------
      character*14 escscr
********* Colori: Giallo (33m) su sfondo blu (44m) ********
********* Colori: Bianco (37m) su sfondo blu (44m) ********
      escscr=char(27)//'[44m'//char(27)//'[37m'//char(27)//'[2J' ! Bianco su Blu
      write (*,'(2x,a)') escscr
      return
      end

I comandi per unire i 162 file .for sono questi:

  Ambiente Linux: $ cat *.for > 161p.for

  Ambiente   DOS: copy /B *.for 161p.for

Successivamente bisogna creare un file oggetto, ossia la vera e propria libreria SOFA in binario, che verrà richiamata in fase di compilazione dal programma principale. In questo modo si è sicurissimi che nessun 'link' tra le varie routines verrà tralasciato. Ecco i comandi per far ciò:

  Ambiente Linux: $ gfortran -c 161p.for  (si forma il file oggetto 161p.o)

  Ambiente   DOS:        g95 -c 161p.for  (come sopra, file 161p.o del DOS)

Passiamo infine alla compilazione di un programma, per es. aaa.f90 in cui sono richiamate le routine SOFA. Eccola:

  Ambiente Linux: $ gfortran -o aaa aaa.f90 161p.o (compilazione)
                  $ ./aaa (avvio programma)
                  $ ./aaa > risu.txt (avvio programma con risultati su file)

  Ambiente   DOS: g95 -o aaa.exe aaa.f90 161p.for (compilazione)
                  aaa (avvio)
                  aaa > risu.txt (avvio programma con risultati su file)

3.2. Le due librerie pronte per l'uso

Riepilogando le librerie da usare sono due, ognuna relativa al proprio sistema operativo.

      161p-linux.o    per il Linux
      161p-dos.o      per il DOS

Per usarle immediatamente si possono prelevare da questo file gzippato, facendo così risparmiare tempo allo studioso.

3.3. SOFA in Fortran 90 (aggiornamento 2010-12-1)

Ultimo aggiornamento (Dic.10) delle routine Sofa (#188): eccole raggruppate in un file mnemonicamente facile da ricordare (111.for) che come al solito deve essere richiamato dal compilatore. È stato creato un apposito Time Scale Cookbook dove vengono descritte le nuove routine introdotte da SOFA con schemi di esempi in Fortran.

Il Fortran 90 consente molta più flessibilità del Fortran 77 con cui è stata scritta la “big” libreria del pacchetto SOFA. Per la conversione da F77 a F90 è stato adottato un programma molto snello che consigliamo di scaricare da qui; nel file gzippato sono stati inseriti, oltre al codice 'fixcon.f90', anche gli eseguibili linux e DOS.

In quest'altro file sono stati compressi un esempio applicativo (zset8.f90) e la libreria Sofa trasformata in Fortran 90, desinenza .f90. Come detto nel paragrafo 3.1, il compilatore Fortran 90 in DOS si chiama (g95) e le modalità di esecuzione sono analoghe, basta stare attenti a compilare la libreria Sofa con la nuova estensione .f90.

Aggiornamento librerie SOFA al 2009-02-01. Niente di particolarmente importante, eccezion fatta per alcuni file in cui è stato introdotto il leap-second del 2008. L'intera libreria all161.for è stata deliberatamente lasciata in formato F77 e la compilazione dei listati in Fortran 90 avviene lo stesso. Con questo semplice comando linux:

$ gfortran nomefile.f90 all161.for -o nomefile   // per compilare
$ ./nomefile                                     // per avviare il programma
    

Infine, per un problema di 'copyright', in ognuna delle 161 sub/funzioni è stata aggiunta questa doverosa nota, richiesta dal punto 5. della licenza:

!+----------------------------------------------------------------------
!
!  Copyright (C) 2008
!  Standards Of Fundamental Astronomy Review Board
!  of the International Astronomical Union.
!
!  =====================
!  SOFA Software License (Software code converted in Fortran 90
!  by Giuseppe Matarazzo - Subroutines/Functions prefix changed
!  from `iau` to `zau` - March 2008)
!  =====================
!
!  NOTICE TO USER:
!  ............
!
!  5. The user may modify the Software for his/her own purposes.  The
!     user may distribute the modified software provided that the Board
!     is informed and that a copy of the modified software is made
!     available to the Board on request.  All modifications made by the
!     user shall be clearly identified to show how the modified software
!     differs from the original Software, and the name(s) of the
!     affected routine(s) shall be changed.  The original SOFA Software
!     License text must be present.
!
!  ............
!+----------------------------------------------------------------------

Due aggiornamenti importanti (2010): il nuovo sito di SOFA e le routine/funzioni (upd: 31-Dic-2009) arrivate a 165 e prelevabili da qui. Esse sono state raggruppate in un file mnemonicamente facile da ricordare (000.for), che come al solito deve essere richiamato dal compilatore. Al file gzippato sono stati aggiunti un sorgente di riferimento (cookbook.f90) e un file batch (FORT.BAT) per una rapida compilazione con g95 di Windows.

3.4. SOFA in C (v.2009 con l'aggiornamento del 2010-12-1)

Da un paio d'anni il pacchetto SOFA è stato tradotto in ANSI-C, a beneficio dei programmatori del più completo dei linguaggi evoluti per computer e può essere scaricato da qui (cliccare su gzipped).

C'è da dire, però, che il grande rigore dell'originario Fortran non è stato garantito dagli estensori del pacchetto, che considerano il Fortran come il programma di riferimento principale dei potentissimi algoritmi astronomici SOFA. Infatti, lo stesso manuale d'uso, denominato cookbook, è rimasto invariato con la parte principale degli esempi scritti ancora in Fortran.

Ciononostante, per i cultori del C i cui commenti saranno molto apprezzati, presentiamo un conciso howto di SOFA in C applicando l'esempio di pp.26-27 del cookbook. Le librerie per i due ambienti Linux/Windows possono essere prelevati da qui, mentre codice (9e.c) e risultati dell'esempio sono zippati in questo file.

    Ambiente Linux
    % gcc -o 9e 9e.c libsofa_c.a -lm (invio)    // *.a è la libreria
    ----------------------------------------       generata da 'make' 

    Ambiente Windows (compilatore MinGW)        // 000.c è la libreria
    gcc -o 9e.exe 9e.c 000.c (invio)               da usare qui.
    --------------------------------
    (La cartella di lavoro deve contenere pure i due file
     sofa.h e sofam.h altrimenti la compilazione non riesce
    

[6-luglio-2010] La compilazione di uno stesso programma (set8) effettuata utilizzando le SOFA routines in Fortran e in C ha dato il formidabile risultato di due matrici, calcolate in modo diverso, uguali (a due a due) fino alla cifra decimale prescelta, la 17.ma. Ecco il link per scaricare listati, output e script di compilazione.

[3-dicembre-2010] Il seguente file gzippato contiene la libreria 111.c con le nuove routine e i relativi header (sofa.h, sofam.h), che devono essere copiati nella cartella di lavoro. È stato creato un apposito Time Scale Cookbook dove vengono descritte le nuove routine introdotte da SOFA con schemi di esempi in Ansi-C.

3.5. SOFA in Fortran 90 (aggiornamento 2012-03-1 + ritocco 2012-07-10)

Aggiornamento (Mar.12) delle routine Sofa (#187): eccole raggruppate in un file mnemonicamente facile da ricordare (333.for) che come al solito deve essere richiamato dal compilatore. L'unico cambiamento è avvenuto nel file dat.for con l'aggiunta del leap second del 30 Giugno 2012.

Il "ritocco" recente (Lug.2012) riguarda solo il comando IF di una riga dello stesso file dat.for

	* If invalid fraction of a day, set error status and give up.
	         Prima:  IF ( FD.LT.0D0 .OR. FD.GE.1D0 ) THEN ...
	          Dopo:  IF ( FD.LT.0D0 .OR. FD.GT.1D0 ) THEN ...
                                      [.GT. al posto di .GE.]

3.6. SOFA in Fortran 90 (aggiornamento 2013-12-02)

Updating (Dic.13) delle routine Sofa (adesso sono 220): eccole raggruppate nel solito file "mnemonico" (444.for), che, come al solito, deve essere inserito nel comando del compilatore. L'aggiunta di 32 file .for riguarda software di astrometria.

3.7. SOFA in Fortran 90 (aggiornamento 2015-02-09)

Ultimo upadating (Feb.15) delle routine Sofa, raggruppate nel solito file "mnemonico" (1515.for), da richiamare in fase di compilazione.

Valid XHTML 1.0 Strict