E.2 Nutzungsteil

Der Nutzungsteil wiederum bestehtzum einen aus Einträgen in der modul.ste, die angeben, welche der möglichen Daten genutzt werden sollen, welcher default-Wert zu verwenden ist, wenn keine externen Daten zur Verfügung stehen oder diese Lücken aufweisen und wie die Daten auf die im Modul erwartete Einheit umgerechnet werden sollen und zum anderen aus Subroutinen, die das Rahmenprogramm dem Modulentwickler zur effektiven Nutzung der externen Daten anbietet.

E.2.1 Einträgen in der modul.ste

In der modul.ste wird aus den verschiedenen Modellebenen über den jeweiligen Eintrag externeDaten eine Verknüpfung zu dem gleichnamigen Datenblock hergestellt, dessen Struktur in der Datei externeDaten.ste vorgegeben ist.

Die folgenden Einträge werden bis zur +++ Linie eingelesen und ausgewertet. Sie enthalten

– das Schlüsselwort für die Verknüpfung zu den Datenarten in der Steuerdatei ExterneDaten.ste, die in diesem Modul verwendet werden sollen (ACHTUNG: aber nicht der Attributname der einzulesenden Datenspalte aus der externen Datei selbst),

– die default-Werte, die zum Tragen kommen, wenn in der Datenbasis Lücken auftreten oder das genannte Attribut sich nicht in der Datenbasis befindet (erster Eintrag nach Schlüsselwort) und

– den Faktor, mit dem die Daten der externen Datenbasis auf die Einheit umgerechnet werden, die in dem aufrufenden Modul verwendet werden (zweiter Eintrag nach dem Schlüsselwort).

 

Auszug aus der modul.ste

externeDaten MONERIS_MET
ATMOSPHAERISCHE_DEPOSITION_N 30.0 4.5662E-08 /* trockene Deposition [kg N/(km²a)] */
ATMOSPHAERISCHE_DEPOSITION_P 1.0 4.5662E-08 /* in [g/m2*DTs] */
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
…
externeDaten MONERIS_RD
P_FRACHT_PARTIKULAER 2.0 4.56621E-08 /* [kg P/(km²a)] für RD_MODELL_STOFF */
N_FRACHT_PARTIKULAER 4.0 4.56621E-08 /* [kg N/(km²a)] für RD_MODELL_STOFF */
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
…
externeDaten MONERIS_GW
P_GRUNDLAST 5.0 4.56621E-08 /* [kg P/(km²a)] für GW_MODELL_STOFF */
N_GRUNDLAST 186.0 4.56621E-08 /* [kg N/(km²a)] für GW_MODELL_STOFF */

.

E.2.2 Routinen zur Nutzung der externen Daten

Für den Zugriff auf die externen Daten wurden verschiedene Routinen geschaffen, die im Rahmenprogramm das Öffnen und Einlesen, die Aktualisierung und das Freigeben und Schließen der Datendateien organisieren und in den Modellebenen und Teilprozessmodulen die Nutzung dieser Daten unterstützen.

int extDatenIni() öffnet die Steuerdatei externeDaten.ste, sofern diese vorhanden ist und legt Grundstruktur für die Verwaltung/Haltung der externen Daten an.

  • Aufruf im Rahmenprogramm
  • Rückgabewert:
    • 1, wenn erfolgreich,
    • 0, wenn keine Steuerdatei gefunden wurde

int extDatenBlockIni(char * extDatenName, int geo_typ_zu) öffnet die über extDatenName in der Datei externeDaten.ste angegebene Datenbasis (z.B. MONERIS, INVEKOS, INVEKOS_JJJJ in den vorangegangenen Beispielen), legt die die räumlichen Verknüpfungen mit den Modellierungsgeometrien an, legt fest, in welcher Frequenz aktualisiert wird usw. Auf welche Modellierungsgeometrie die Daten gebunden werden sollten, wird am besten über geo_typ_zu und damit im aufrufenden Programm angegeben, indem entweder direkt beim Aufruf der Subroutine für geo_typ_zu EFL, TG oder FGW eingetragen wird oder aber, was allgemeiner ist, die Raumauflösung der Modellebene, in der die Daten genutzt werden sollen über die Subroutine *Raumbezug(ABI)abgefragt wird. Wird der geo_typ_zu mit -1 an die Subroutine übergeben, wird wie im Kap. E1 beschrieben, der Eintrag ZUORDNUNG_AUF in der Steuerdatei externeDaten.ste ausgewertet.

  • Aufruf in der Ini-Routine des Moduls, das diese externen Daten nutzt,
  • Rückgabewert:
    •  DBNr als Nummer des Datenblockes, dient später zum Zugriff auf die Daten,
    • 0, wenn die angegeben Datenbasis nicht gefunden wurde oder die Datendatei nicht geöffnet werden konnte

int extDatenIni4modul (char * BlockName, int geo_typ_zu) öffnet die im benannten Block BlockName der modul.ste über den Eintrag externeDaten angegebene Datenbasis (extDatenName). Intern wird dazu die Routine extDatenBlockIni genutzt.

  • Aufruf in der Ini-Routine des Moduls, das diese externen Daten nutzt,
  • Rückgabewert:
    •  DBNr als Nummer des Datenblockes, dient später zum Zugriff auf die Daten,
    • 0, wenn die angegeben Datenbasis nicht gefunden wurde oder die Datendatei nicht geöffnet werden konnte

int extDatenartIni(int DBNr , char * attrSchluessel, double fak) liest im Block DBNr ein über das Schlüsselwort attrSchluessel definiertes Datenfeld ein und rechnet es unter Nutzung des über fak angegebenen Umrechnungsfaktors in die gewünschte Einheit um.

  • Aufruf in der Ini-Routine des Moduls, das diese externen Daten nutzt,
  • Rückgabewert:
    •  DNr als Nummer der Datenart, dient später zum Zugriff auf die Daten,
    • 0, wenn der angegebene Eintrag attrSchluessel oder das darüber definierte Attribut (=Datenart) in der Datendatei nicht gefunden wurde.

int extDatenartIni4modul (int DBNr , char * BlockName, char * attrSchluessel, double * v_glob, double v_def) liest für den Datenblock DBNr das über den benannten Block BlockName und das Schlüsselwort attrSchluessel in der modul.ste definierte Datenfeld ein und rechnet es unter Nutzung des ebenfalls in der modul.ste angegebenen Umrechnungsfaktors in die gewünschte Einheit um. Wird das Attribut nicht gefunden, wird der Wert v_glob als globaler Wert ohne räumliche Differenzierung belegt. Dazu wird der vom aufrufenden Programm bereitgestellte default-Wert v_def verwendet oder der in der modul.ste angegebene default-Wert.

  • Aufruf in der Ini-Routine des Moduls, das diese externen Daten nutzt,
  • Rückgabewert:
    •  DNr als Nummer der Datenart, dient später zum Zugriff auf die Daten,
    • 0, wenn der angegebene Eintrag attrSchluessel oder das darüber definierte Attribut (=Datenart) in der Datendatei nicht gefunden wurde.

double ** extDatenGetFieldPointer (int DBNr , int DNr) gibt den Pointer auf ein double-Feld, das die aktuellen Daten enthält. Bei Nutzung dieser Routine obliegt es dem Modul-Entwickler, die Daten zu verwalten und die korrekte räumliche Zuordnung vorzunehmen. Die zeitliche Aktualisierung der Daten in dem Datenfeld ist gegeben. Der Nutzer sollte also die Werte dieses Feldes nicht auf lokale Werte oder Felder kopieren, sondern mit Pointern arbeiten.

  • Aufruf in der Ini-Routine des Moduls, das diese externen Daten nutzt,
  • Rückgabewert:
    • Pointer auf das Datenfeld
    • oder NULL, wenn DBNr oder DNr 0 sind, d.h. die Datenbasis oder der Datentyp nicht existieren

double ** extDatenGetFieldPointerNext (int DBNr , int DNr) gibt den Pointer auf ein double-Feld, das die zeitlich nachfolgenden Daten enthält.

void extDatenBlockIniEnd(int DBNr) schließt die über die Blocknummer DBNr definierte externe Datendatei, so dass die gleiche Datei wieder z.B. von einem anderen Modul aus geöffnet werden kann.

  • Aufruf in der Ini-Routine des Moduls, das diese externen Daten nutzt,

void extDatenIniEnd() beendet die Initialisierung der externen Daten ab und schließt die Steuerdatei externeDaten.ste.
Aufruf im Rahmenprogramm

void extDatenAk()t aktualisiert die Daten sämtlicher Datenblöcke und Datenarten in Abhängigkeit von der datenblockspezifisch vorgegebenen Aktualisierungsfrequenz. Wenn aktualisiert werden muss, werden die Datendateien geöffnet, die Daten auf die schon angelegten Datenfelder gelesen und die Datendateien wieder geschlossen. Es wird vorausgesetzt, dass die neu eingelesenen Datendateien exakt die selben räumlichen Strukturen abbilden wie die im Zuge der Dateninitialisierung verwendeten, da bei der Aktualisierung keine erneute räumliche Zuordnung zu den Basisgeometzrien erfolgt.

  • Aufruf im Rahmenprogramm am Beginn der Zeitschleife und außerhalb der Ortsschleife

double extDatenGet(int DBNr , int DNr, int rb) liefert den aktuellen Datenwert für die über DNr definierte Datenart in der externen Datenbasis DBNr für den Raumbezug rb. Rb ist die Adresse (nicht die ID) der aktuellen Raumgeometrie. Das kann z.B. der Laufindex der EFL innerhalb der Raumschleife über alle EFL-Flächen sein. Wichtig ist, dass die Adresse sich auf den Raumbezug bezieht, der über ZUORDNUNG_AUF für die Adressierung der Datenbasis DBNr verwendet wurde. Wurde (aus welchen Gründen auch immer) eine Zuordnung auf Teilgebiete vorgenommen, die Nutzung der Daten soll aber innerhalb der EFL-Schleife erfolgen, ist für rb die Adresse des dieser EFL übergeordneten Teileinzugsgebietes anzugeben (*Efl_tg_id(i_efl)).

  • Aufruf in der Run-Routine (innerhalb der Ortsschleife) des Moduls, das diese externen Daten nutzt,
  • Rückgabewert:
    • Datenwert oder VAL_NUL, wenn DBNr oder DNr 0 sind, d.h. die Datenbasis oder der Datentyp nicht existiert oder der Raumbezug rb nicht existiert.

double extDatenGetNext(int DBNr , int DNr, int rb) liefert den zeitlich nachfolgenden Datenwert analog extDatenGet, sofern dieser existiert, ansonsten ebenfalls VAL_NUL als Rückgabewert.

void extDatenSet_d (int DBNr , int DNr, int rb, double * value) überschreibt den übergebenen Datenwert value, sofern der aktuelle Datenwert (intern genutzt wird die Routine extDatenGet) mit dem aktuellen Datenwert. Das Handling der Fehlwerte wird damit aus dem Modul ausgelagert. Mit dieser Routine kann z.B. das Wertefeld im Modul z.B. mit default-Werten belegt werden und nur die Geometrien, für die externe Daten vorliegen, werden modifiziert.

  • Aufruf in der Run-Routine (innerhalb der Ortsschleife) des Moduls, das diese externen Daten nutzt,
  • Rückgabewert:
    •  Datenwert oder VAL_NUL, wenn DBNr oder DNr 0 sind, d.h. die Datenbasis oder der Datentyp nicht existiert oder der Raumbezug rb nicht existiert.

void extDatenSet_i (int DBNr , int DNr, int rb, int * value) arbeitet analog zu extDatenSet_d , ist aber für Integer-Werte ausgelegt.

void extDatenSetNext_d und extDatenSetNext_i liefern die Datenwerte für den zeitlichen Nachfolger. Sämtliche externe Daten werden als Double-Werte eingelesen und vorgehalten. Bei Verwendung der Get-Routinen muss deshalb ein type-cast erfolgen, wenn die externen Werte als Integer genutzt werden sollen. In den Set-i- Routinen erfolgt der type-cast intern.

void extDatenFree() gibt sämtliche Datenstrukturen, d.h. alle Datenblöcke und alle Datenarten frei

  • Aufruf im Rahmenprogramm nach der Zeitschleife Programmauszug mit einem Aufruf der externen Daten als Beispiel für die Nutzung innerhalb des ProgrammCodes

 

if( moneris = extDatenIni4modul("MET_MODELL_STOFF", *Raumbezug(ABI))) { /* Aufruf im Ini-Teil des diese Daten nutzenden Moduls */
ath_dep_p = extDatenartIni4modul(moneris,"MET_MODELL_STOFF","ATMOSPHAERISCHE_DEPOSITION_P", &v_ath_dep_p, default_value);

ath_dep_n = extDatenartIni4modul(moneris,"MET_MODELL_STOFF","ATMOSPHAERISCHE_DEPOSITION_N", &v_ath_dep_n, default_value);

extDatenBlockIniEnd(moneris);

}
Nach oben scrollen