2013-10-22 23 views
6

ho sviluppato un codice Fortran, che ha le seguenti caratteristiche:professionale sviluppo di codice Fortran: Log creazione di file

  1. variabili globali
  2. 13 moduli con più subroutine
  3. subroutine indipendenti
  4. Uso di Intel MKL libreria per librerie LAPACK (Linear Algebra)
  5. Lettura e scrittura di file di testo

Il codice è diventato abbastanza grande. Anche se in questa fase sto cercando di ottenere la risposta corretta, la velocità di esecuzione del codice è desiderata.

Stavo scrivendo un file di registro di testo con tag come ERROR: message o INFO: message finora. Ma scrivere troppe informazioni rallenta il codice. So che nello sviluppo di Java usiamo la libreria log4j per scrivere in modo efficiente file di log in cui possiamo attivare o disattivare vari livelli di registrazione. Quindi, una volta che il codice è pulito, possiamo disattivare i registri di basso livello e mantenere solo i registri di alto livello.

Mi piacerebbe sapere da altri programmatori qual è il modo migliore per gestirlo in Fortran 90+.

+2

come si potrebbe avere uno sguardo alla [xError] (http://people.sc.fsu.edu/~jburkardt /f_src/xerror/xerror.html) libreria. –

+0

Non hai detto se volevi spegnerli in fase di esecuzione o in fase di compilazione. Questo fa molta differenza quando stai programmando. – cup

risposta

2

Il modo più semplice sarebbe creare una variabile intera verbose e leggere il suo valore all'esecuzione (da file o tramite riga di comando). In questo modo, è possibile creare diversi livelli:

  • verbose = 0 => nessuna uscita
  • verbose = 1 => Solo errori
  • verbose> = 2 => errori & informazioni

sarebbe semplice da implementare:

IF(verbose >= 1) CALL OutputError(message) 
IF(verbose >= 2) CALL OutputInfo(message) 

e così via.

+0

Grazie a @Kyle per i tuoi suggerimenti.Capisco che dovrei creare una subroutine come write_log (verbose, message) e usarla nel mio codice per scrivere i log. Volevo solo sapere se esiste una procedura standard per ciò che posso chiedere al mio co-sviluppatore di seguire più tardi di chiedere loro di seguire il mio metodo di registrazione. – Amitava

+0

@Amitava: non esiste un metodo * standard * per qualcosa di simile. Il meglio che potresti fare sarebbe scrivere la subroutine 'write_log' come hai nella testa e informare i tuoi colleghi che l'uso di' write_log' è il metodo * preferito * di logging per il tuo particolare programma. –

0

Ho visto persone implementare la registrazione a livello di compilatore in un modo simile al metodo di Kyle Kanos con le direttive del preprocessore. Non fortran standard, ma so che può essere fatto con alcuni compilatori fortran.

2

sto utilizzando le seguenti macro preprocessore per esattamente questo compito (all'interno): MACROS.h

#ifdef DEBUG 
#define DWRITE write(*,*) __FILE__,__LINE__, 
#define dwrite write(*,*) __FILE__,__LINE__, 
#else 
#define DWRITE ! 
#define dwrite ! 
#endif 

nel mio codice ho quindi avere la seguente intestazione:

#define DEBUG 
#include "MACROS.h" 

... 

dwrite 'An error occurred!' 

Questo dà il mio file e la riga in cui si è verificato l'errore, e commentando la prima riga posso facilmente accendere/spegnere il messaggio.

Si potrebbe facilmente estendere questo a diversi livelli di debug e scrittura di file ...

+0

Perché hai il blocco #else? – BHF

+0

Altrimenti 'dwrite' non verrebbe definito e il compilatore emetterebbe un errore. Se 'DEBUG' non è definito, il preprocessore commenta semplicemente ogni riga che inizia con' dwrite'. Posso fare ancora più cose in questo modo: se è impostato DEBUG, posso creare funzioni 'pure' * impure * e' elemental' 'elemental' e' impure', e così via. –