2013-10-22 6 views
6

ich einen Fortran-Code entwickelt haben, die folgende Merkmale aufweist:Professionelle Fortran Code-Entwicklung: Protokolldateierstellung

  1. Globale Variablen
  2. 13 Module mit mehreren Subroutinen
  3. Unabhängige Subroutinen
  4. Verwenden von Intel MKL Bibliothek für LAPACK-Bibliotheken (Lineare Algebra)
  5. Lesen und Schreiben von Textdateien

Der Code ist ziemlich groß geworden. Obwohl ich in diesem Stadium versuche, die richtige Antwort zu bekommen, ist die Geschwindigkeit der Ausführung des Codes erwünscht.

Ich schrieb bisher eine Textprotokolldatei mit Tags wie ERROR: message oder INFO: message. Aber zu viel Information zu schreiben verlangsamt den Code. Ich weiß in der Java-Entwicklung, dass wir log4j-Bibliothek verwenden, um Protokolldateien effizient zu schreiben, wo wir verschiedene Protokollebenen ein- oder ausschalten können. Sobald der Code also sauber ist, können wir Low-Level-Protokolle abschalten und nur die High-Level-Protokolle behalten.

Ich würde gerne von anderen Programmierern wissen, was der beste Weg ist, damit in Fortran 90+ umzugehen.

+2

Sie vielleicht einen Blick auf die [xError] haben möchte (http://people.sc.fsu.edu/~jburkardt /f_src/xerror/xerror.html) Bibliothek. –

+0

Sie haben nicht gesagt, ob Sie sie zur Laufzeit oder zur Kompilierzeit ausschalten wollten. Das macht beim Codieren einen großen Unterschied. – cup

Antwort

2

Der einfachste Weg wäre, eine Ganzzahlvariable verbose zu erstellen und ihren Wert bei der Ausführung einzulesen (aus der Datei oder über die Befehlszeile). Auf diese Weise können Sie verschiedene Ebenen erstellen:

  • verbose = 0 => keine Ausgabe
  • verbose = 1 => Fehler nur
  • verbose> = 2 => Fehler & info

Es wäre einfach zu implementieren:

und so weiter.

+0

Danke @Kyle für Ihre Vorschläge.Ich verstehe, dass ich eine Subroutine wie write_log (verbose, message) erstellen und in meinem Code zum Schreiben von Protokollen verwenden sollte. Ich wollte nur wissen, ob es eine Standardprozedur dafür gibt, die ich meinen Mitentwicklern später stellen kann, anstatt sie zu bitten, meiner Protokollierungsmethode zu folgen. – Amitava

+0

@Amitava: Es gibt keinen * Standard * Weg zu so etwas. Das Beste, was Sie tun könnten, wäre, die 'write_log'-Subroutine so zu schreiben, wie Sie sie in Ihrem Kopf haben, und Ihre Kollegen zu informieren, dass' write_log' die * bevorzugte * Methode der Protokollierung für Ihr spezielles Programm ist. –

0

Ich habe Leute gesehen, die Logging auf der Compiler-Ebene implementieren, ähnlich wie Kyle Kanos 'Methode mit Präprozessor-Direktiven. Kein Fortran-Standard, aber ich weiß, dass es mit einigen Fortran-Compilern gemacht werden kann.

2

Ich verwende die folgenden Präprozessormakros für genau diese Aufgabe (innen MACROS.h):

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

In meinem Code ich dann den folgenden Header haben:

#define DEBUG 
#include "MACROS.h" 

... 

dwrite 'An error occurred!' 

Das gibt mir die Datei und die Zeile, in der der Fehler aufgetreten ist, und durch Kommentieren der ersten Zeile kann ich die Nachricht einfach ein-/ausschalten.

Sie könnten leicht dies zu unterschiedlichen Debug-Level erweitern und Schreiben von Dateien ...

+0

Warum haben Sie den #else Block? – BHF

+0

Andernfalls wäre 'dwrite' nicht definiert und der Compiler würde einen Fehler ausgeben. Wenn 'DEBUG' nicht definiert ist, würde der Präprozessor einfach jede Zeile auskommentieren, die mit' dwrite' beginnt. Ich kann auf diese Weise noch mehr Sachen machen: Wenn 'DEBUG' eingestellt ist, kann ich' reine' Funktionen * unrein * machen und 'elementare' Funktionen' elemental' und 'unrein', und so weiter. –