Anforderungen an den Compiler zur Übertragung der DDL (Data Definition Language) in C++-Dateien


1. Allgemeines

1.1 Einführung

Der DDL-Compiler übersetzt die in DDL gegebenen Beschreibungen der einzelnen Basiskomponenten sowie Brücken in C++-Dateien. Alle Basiskomponenten werden von der Basisklasse BasisKomponente abgeleitet, die selbst von der Klasse Komponente abgleitet ist. Alle Brücken werden von der Klasse Bruecke abgeleitet. Im Folgenden sind die Anforderungen an die Komponenten und Brücken genauer spezifiziert.

1.2 Komponente

Die folgenden Funktionen muß der DDL-Compiler erzeugen:

Folgende Funktionen sind entfallen und werden hier nicht mehr dokumentiert. Eventuell noch vorhandene Funktionen im Quelltext können ersatzlos gestrichen werden. Diese Funktionen müssen auch vom Compiler nicht mehr definiert werden.

  1. putBruecke()
  2. getBruecke()
  3. GetBrueckenTyp()

Außerdem muß eine Komponente folgende Datenfelder zur Verfügung stellen:

  1. 3.1 Anzahl_LGS _Zeilen
  2. 3.2 Anzahl_LGS_Spalten
  3. 3.3 Anzahl_Variablen
  4. 3.4 AnzahlAusgaben
  5. 3.5 ErsteAusgabeSpalte
  6. 3.6 Anzahl_FehlerParameter
  7. 3.7 PositionFehlerParameter
  8. 3.8 FehlerStatus

1.3 Brücke

Diese Funktionen einer Brücke muß der DDL-Compiler erzeugen:

  1. 4.1 Konstruktor
  2. 4.2 Verbinde
  3. 4.3 Init
  4. 4.4 Setzte_LGS_Zeilen
  5. 4.5 GetAnzahlLGSZeilen

Außerdem muß eine Brücke folgende Datenfelder zur Verfügung stellen:

  1. 5.1 Anzahl_LGS_Zeilen
  2. 5.2 Verbindungen
  3. 5.3 int d1, d2

1.4 Datentypen

Die weiteren Datenfelder der Komponenten und Brücken ergeben sich unmittelbar aus der Beschreibung der Komponenten in der DDL.

Die DDL sollte jedoch mindestens folgende Datentypen zur Verfügung stellen:

  1. 6.1 Port
  2. 6.2 Constant
  3. 6.3 Variable
  4. 6.4 Unknown_Quantity
  5. 6.5 Rule


Die Beschreibung der Komponenten und Brücken findet sich in der Datei komponenten.html.


6. Die Typen für Datenfelder der Komponenten

6.1 Port

Ein Port beschreibt die Verbindung dieser Komponente zu einer anderen Komponente. Jeder Port besitzt einen Typ sowie eine Beschreibung der Übergänge. Jeder Port wird in der Funktion Init der Komponente initialisiert wie in der Beschreibung des Ports angegeben ist.

6.2 Constant

Konstanten werden übersetzt in Werte des Typs "double" und im Konstruktor der Komponente auf den angegeben Wert gesetzt.

Beispiel:
Die Deklaration

Constant d;
Name_of_Constant d is "Rohrdurchmesser";
Value_of_Constant d is 0.5;

in der DDL ergibt

1. in der Klassendefinition:
double d;

2. im Konstruktor:
d = 0.5;

6.3 Variable

Eine Variable ist eine Klasse, deren einziges Member eine Zahl vom Typ double ist.

Beispiel:
Die Deklaration

Variable q;
Name_of_Variable q is "Fluss";
Derivative_of_Variable q is q_punkt;

in der DDL ergibt

  1. in der Klassendefinition:
    Variable q;
  2. in der Funktion ZeitSchritt
    q.IntegriereUeber( q_punkt );

Außerdem muß beachtet werden, daß die Ableitung als Typ Unknown_Quantity auch tatsächlich irgendwo in der Komponente deklariert ist.

6.4 Unknown_Quantity

Eine Unknown_Quantity selbst hat keinen Wert, sie referenziert lediglich den Ergebnisvektor des zu lösenden Gleichungssystems.

Beispiel:
Die Deklaration

Unknown_Quantity P1;
Name_of_Unknown_Quantity P1 is "Druck am ersten Rohrende";

in der DDL ergibt

  1. in der Klassendefinition:
    Unknown_Quantity P1;
  2. in der Funktion Init
    P1.SetzeGlobaleSpaltenNummer(FreieSpaltenNummer);

6.5 Rule

Eine Regel beschreibt eine Zeile des Gleichungssystems.

Beispiel:
Die Deklaration

Rule r1;
Define_Rule r1: q_punkt = k * (P_add + P2 - P1 - R * q * |q|);

in der DDL ergibt

  1. in der Klassendefinition:
    LGSZeile r1;
  2. in der Funktion Init
    r1.SetzeZeilenNummer( FreieZeilenNummer );
  3. in der Funktion Setze_LGS_Zeilen
    r1.clear(A);
    r1.MatrizenElement(A, q_punkt.GlobaleSpaltenNummer ) = 1+Simulation.GetDeltaT()*k*R*fabs(q.GetValue());
    r1.MatrizenElement(A, P1.GlobaleSpaltenNummer ) = -k;
    r1.MatrizenElement(A, P2.GlobaleSpaltenNummer ) = k;
    r1.VektorElement = &b[r1.ZeilenNr];
    *r1.VektorElement = -k*R*q.GetValue()*fabs(q.GetValue());