Erweiterungen programmieren

  • Programmstruktur
  • Parsermodul
  • Fehlerbehandlung
  • neuen Befehl einbauen

  • In diesem Abschnitt ist das nötigste zusammengefaßt, das man braucht um eigene Erweiterungen für das EAS3-Programm zu schreiben.



    Programmstruktur (nur sehr grob)

    Hauptprogramm: eas3

    Variablenverwaltung: eas3varmod

    Hilfsmodule:

    Modulname Kommentar Funktion
    eas3typedef exportiert eas3ks_t grundlegende Typdefinitionen des EAS3-Systems
    eas3constdef systemweite Konstanten grundlegende Konstantendefinitionen des EAS3-Systems
    eas3rwmod exportiert alle Symbole von eas3iomod (bis auf eas3ks_t) EAS-IO-Modul (Schreib-/Leseroutinen)
    iso_vst Strings variabler Länge Modul für Stringverarbeitung in FORTRAN90
    errormod (v.a. für eas3rwmod und eas3) Fehlerbehandlung bei unbedingtem Abbruch
    messagemod Fehlerbehandlungsroutinen für Bearbeitung der Rückgabestatusflags Fehlerbehandlung für die Module
    parsermod Hilfsroutinen für Kommandointerpreter Parsermodul (Integer, Real, usw. aus Strings extrahieren)
    eas3cmdlinemod Hilfsroutinen für Benutzerinterface (hier wird auch die readline-Bibliothek eingebunden) Kommandozeileninterface für Benutzer
    eas3toolmod Routinensammlung von mehrfach in verschiedenen Modulen verwendeten Routinen Dateinummern bzw. TMP-Bezeichner einlesen, Eingabefenster vervollständigen, Speicherbedarfsausgabe, ...
    eas3fttoolmod Routinensammlung von mehrfach in verschiedenen Modulen verwendeten Routinen Verwaltung und Verarbeitung der Zusatzinformationen für die Datenstruktur ft

    Kommando- und Programm-Module:

    Diese Module enthalten die eigentliche Funktionalität von EAS3. Jedes dieser Module enthält mindestens Routinen zur Interpretation der Kommandozeile des entsprechenden Befehls (*_cmd), einen Fehlerstring (*_msg), der sämtliche Fehlermeldungen dieses Moduls enthält und gegebenenfalls Routinen der ausführbaren Programme (*_prg), die erst durch AUSFUEHREN gestartet werden. Außerdem werden lokale Typdefinitionen, soweit sie in eas3varmod benötigt werden, exportiert. Von diesen Modulen werden aber keine weiteren Symbole exportiert (alles was sonst noch in diesen Modulen deklariert wird sollte PRIVATE sein).

    Modulname Funktionalität EAS3-Befehle
    eas3basecmdmod EAS3 Grundbefehle FILES, INFILE, OUTFILE, SCHREIBFORMAT, INTERAKTIV, FENSTER, PARAMETER, ZEITINDEX, ZEITSCHRITT
    eas3printmod EAS3 Ausgabebefehle (direkt ausgeführt) KENNSATZ, DRUCKEN, WERTEBEREICH
    eas3ableitennmod Berechnung von ableitungen ABLEITEN
    eas3scalaropmod skalare Operationen KOPIEREN, ABS, LN, LOG, FT_SCALERE, SCALETRANS
    eas3convertmod Konvertierung in verschiedene Dateiformate CONVERT
    tecpltmod Tecplot-Ausgaberoutinen und entsprechende Hilfsprogramme Tecplot-Ausgabemodul (Hilfsmodul f. eas3convertmod)
    eas3intpolmod Lagrange-Interpolation INTERPOLIEREN
    eas3integrmod Integration INTEGRIEREN
    eas3meanmod Mittelungen MITTELUNG, FMITTELUNG
    eas3umordnenmod umordnen verschiedener Dimensionen UMORDNEN, PAR2D_PAR3D, PAR3D_PAR2D
    eas3verkettenmod verketten verschiedener Dateien VERKETTEN
    eas3verknuepfenmod verknüpfen verschiedener Dateien VERKNUEPFEN
    eas3ksmod Kennsatzbearbeitung KSSCHREIB
    eas3intpolmod Interpolation, Gitterverfeinerung INTERPOLIEREN
    eas3ttrafomod Fourieranalyse über der Zeit P2FT, F2PT, PHASGLATT
    eas3ztrafomod inverse Fouriertransformation in z-Richtung F2PZ
    eas3ftrealmod Fourier Transformation für die Datenstruktur ft FT2PHYS, PHYS2FT
    eas3ftconvmod Konversion zwischen verschieden Formulierungen der Fourierkoeffizienten für die Datenstruktur ft FTREAL2FTFTZH, FTFTZHK2MODPH, FTREAL2MODPH
    eas3ftdrehefeldmod Darstellung eines gedrehetes 3D-Feld. FT_DREHEFLED
    eas3ftdrehesmod Drehung zur Strömlinienkoordinatesystem FT_DREHE_S
    eas3ftlambda2mod Berechnugn des zweiten Eigenwertes der Geschwindigkeitsgradient FT_LAMBDA2
    eas3ftverkngrundmod Binäre Verknüpfungen zwischen Grund- und Stör/Gesamtströmung FT_VERKN_GRUND
    eas3scalaropdirmod Skalere Operationen mit Einbeziehung der Koordinaten aus dem Geometrie-Feld. WINDOW, FT_SCALEGEO
    eas3ftadimmod Änderung der Adimensionalisierungen für daten im ft Formata FT_ADIM
    eas3ftcorrelationmod Berechnung von zwei-Punkten-Korrelationen FT_CORRELATION
    eas3geommod Setzen modifizieren der Geometrieinfo im Kennsatz GEOM

    Parsermodul

    Im Parsermodul sind sämtliche Hilfsroutinen zusammengefaßt, die zur Interpretation der eingegebenen Kommandozeile benötigt werden. Dies sind einerseits Routinenen, welche nur in der Hauptschleife von eas3 benutzt werden, um die Eingabe zu lesen und einen eindeutig definierten String bestehend aus Kommandowort und Argumentliste zu generieren, und andererseits handelt es sich um Routinen zum Wandeln der Characterdaten der einzelnen Argumente in das gewünschte interne Format (Integer (get_unit, get_int), Real (get_real), Dateinamensstring (get_string), Indexintervall (get_range), Schlüsselwort (get_key)) oder zum Zählen (counttoken) oder Manipulieren (get_token, tocapital) der Befehlsargumente. Die Funktionalität der in parsermod abgelegten Routinen ist im Kopf des Moduls kurz erklärt. Der genaue Aufruf der Routinen ist den bereits bestehenden Beispielen bzw. der Definition der Subroutinen/Funktionen in pasermod zu entnehmen.

    Grundsätzlich ist folgendes Vorgehen zu empfehlen:

    Eine Kommandointerpreterroutine (*_cmd) wird vom eas3_dispatcher aufgerufen und bekommt die Argumentliste des jeweiligen Befehls übergeben. Daraufhin kann mit counttoken festgestellt werden, ob die geforderte Argumentanzahl (durch Komma getrennte Token) vorliegen. Anschließend kann schrittweise (mit get_token) immer ein Token von links von der Argumentliste abgeschnitten werden und je nach erwartetem Argumenttyp an die entsprechende Parserroutine zur Umwandlung weitergegeben werden.

    Fehlerbehandlung

    Die Fehlerbehandlung erfolgt auf zwei grundsätzlich verschiedene Methoden:

    1. Methode mit errormod: Durch Aufruf der Routine fterr('Routinenname: Fehlerstring') wird die Programmausführung sofort mit der Fehlermeldung abgebrochen. Diese Methode wird nur im Hauptprogramm und im IO-Modul eas3rwmod benutzt.
    2. Methode mit messagemod: Wenn in einer Routine ein Fehler auftritt bricht nicht die Routine selbst die Programmausführung ab, sondern die Routine setzt eine Statusvariable, welche anzeigt was für ein Fehler aufgetreten ist. Die Fehlermeldungen sind in einem String definiert der von dem Modul in dem die Routine definiert ist exportiert wird. Negative Statuswerte bedeuten Fehler, positive Statuswerte bedeuten Warnungen, während der Statuswert 0 für eine fehlerfreie Ausführung der Subroutine steht. Direkt nach dem Aufruf der Routine wird mit call message_check("routinenname",status,...) diese Statusvariable überprüft und gegebenenfalls eine entsprechende Fehlermeldung oder Warnung generiert. Der Programmabbruch erfolgt dann zentral gesteuert innerhalb der Routine message_check. (Diese Methode wird benutzt, um mit dem INTERAKTIV-Kommando auch beim Auftreten von Fehlern nicht das Programm abzubrechen, sondern nur eine Fehlermeldung auszugeben.)

    neuen Befehl einbauen

    Zunächst muß ein Kommandointerpreter (*_cmd) geschrieben werden und bei einem ausführbaren Programm auch die entsprechende ausführbare Routine (*_prg), welche dann von AUSFUEHREN aufgerufen wird. Die (*_cmd)-Routine eines ausführbaren Programmes muß am Ende den Programmzähler prg%nprg hochsetzen und sicherstellen, daß wirklich nur eine ausführbare Routine innerhalb eines AUSFUEHREN-Blockes vom Benutzer aufgerufen wird. Die Routinen werden zusammen mit einem entsprechenden Fehlerstring (*_msg), der alle notwendigen Fehlermeldungen enthält, und den notwendigen Konstanten- und Typdefinitionen in ein Modul gepackt. Das neue Modul muß dann vom eas3varmod eingebunden werden. Im Hauptprogramm ist der Gesamtfehlerstring um den Modulfehlerstring zu erweitern (verketten der entsprechenden Modulvariable (modulname_msg) mit dem Gesamtfehlerstring). Variablen zur Verwaltung der Befehlsoptionen werden in eas3varmod angelegt, initialisiert (eas3var_init) und in die Ausgaberoutine (eas3var_print) eingetragen.

    Anschließend muß das neue Kommandowort im Hauptprogramm in der eas3cmdlist hinzugefügt und der Zähler CMDLISTLEN entsprechend erhöht werden. Der Aufruf für die Kommandointerpreterroutine mit den entsprechenden Argumenten muß in eas3_dispatcher hinzugefügt werden, während der Aufruf des ausführbaren Programmes in der Routine ausfuehren im Hauptprogramm hinzugefügt werden muß. Zum Schluß muß noch das Makefile angepaßt werden.

    Wenn das neue Kommando funktioniert sollte natürlich auch die Dokumentation erweitert werden.

    Und schon nach wenigen Stunden / Wochen wird man viel Freude an dem neuen Kommando haben! ;-)