Beschreibung der Komponenten und Brücken


1. Allgemeines

1.1 Einführung

Zur Simulation mit DIBS werden zwei Grundtypen der verwendeten Elemente unterschieden:

  1. Komponenten
  2. Brücken
Die Komponenten bilden reale Elemente wie z.B. Rohre, Ventile und Druckmesser in die Welt von DIBS ab. Die Brücken hingegen sind Elemente, die nur in der Welt von DIBS vorkommen und erforderlich sind, um die Komponenten miteinander zu verbinden.
Jede Komponente hat ein unterschiedliches Verhalten. Dieses Verhalten wird in den von BasisKomponente abgeleiteten Klassen modelliert. Die Klassen müssen alle einer definierten Schnittstelle genügen, die im folgenden beschrieben ist. Brücken selber weisen kein eigenes Verhalten auf, allerdings werden sie verwendet, um das Verhalten einer Komponente auf eine andere zu übertragen.
Beispiel:
Rohr -- Brücke -- Rohr
In einem Syst3em bestehend aus Rohren gilt für zwei benachbarte Rohre, daß der Druck und der Fluß an den verbundenen Rohrenden gleich ist. Genau das muß die Brücke sicherstellen.

1.2 Komponente

Folgende Funktionen muß eine Komponente enthalten:

Folgende Funktionen sind entfallen und werden hier nicht mehr dokumentiert. Eventuell noch vorhandene Funktionen im Quelltext können ersatzlos gestrichen 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 muß eine Brücke muß enthalten:

  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


2. Die Methoden der Komponenten

2.1 Konstruktor

Der Konstruktor der Komponente <Komponente> hat folgende Form:

<Komponente>::<Komponente>(Netz* dad,instance* dual,long nr)
: BasisKomponente(dad,dual,nr,BasisKomponente::Leitung_t)
{
Anzahl_LGS_Zeilen = ...;
Anzahl_LGS_Spalten = ...;
Anzahl_Variablen = ...;
AnzahlAusgaben = ...;
// weitere Konstruktion der Klasse
}

Neben dem Konstruktor der Komponente wird also auch der Konstruktor der Klasse BasisKomponente aufgerufen. Dieser Konstruktor muß zur Verfügung gestellt werden, ein Standardkonstruktor ohne Parameter wird nicht benötigt.

2.2 Init

Prototyp
void Init( int FreieZeilenNummer, int FreieSpaltenNummer, int FreieAusgabeSpalte)

Parameter

FreieZeilenNummer Nummer der ersten Zeile, in die die Regeln Rule in die Matrix des zu lösenden Gleichungssystem eingetragen werden.
FreieSpaltenNummer Nummer der ersten Spalte, in die die Unknown_Quantities in das zu lösende Gleichungssystem eingetragen werden.
FreieAusgabeSpalte Nummer der ersten Spalte, in die die auszugebenden Werte eingetragen werden.

Funktion
Diese Funktion initialisiert die Komponente zur Simulation. An die Member-Variable ErsteAusgabeSpalte wird der Wert FreieAusgabeSpalte zugewiesen.
Für jede Regel Rule wird zunächst die Spaltennummer mit der Funktion <Regel>.SetzteZeilenNummer() gesetzt. Die erste Regel erhält hierbei die Zeilennummer FreieZeilenNummer, die zweite Regel erhält hierbei die Zeilennummer FreieZeilenNummer+1 usw.
Für jede Unknown_Quantity wird dann analog die Spaltennummer gesetzt.
Die Brücken der Komponente werden dann über die Funktion Verbinde initialisiert. Mit welchen Parametern die Brücke initialisiert werden muß, ergibt sich direkt aus der Beschreibung der Ports der Komponente.

Beispiel

void Rohr::Init( int FreieZeilenNummer, int FreieSpaltenNummer,
int FreieAusgabeSpalte)
{
  ErsteAusgabeSpalte = FreieAusgabeSpalte;
  r1.SetzeZeilenNummer( FreieZeilenNummer );
  q_punkt.SetzeGlobaleSpaltenNummer( FreieSpaltenNummer );
  P1.SetzeGlobaleSpaltenNummer( FreieSpaltenNummer + 1 );
  P2.SetzeGlobaleSpaltenNummer( FreieSpaltenNummer + 2 );
  ((RohrEnde*)getBruecke(0))->Verbinde( P1, q_punkt, 1 );
  ((RohrEnde*)getBruecke(1))->Verbinde( P2, q_punkt, -1 ); 
}

2.3 ErzeugeBruecke

Prototyp
ErzeugeBruecke(Komponente* k0, long Index0, int Pin0, Komponente *k1, long Index1, int Pin1)

Parameter
k0,k1 Zeiger auf die durch die zu erzeugende Brücke verbundenen Komponenten. k0 stellt hierbei die Komponente dar, für die die Funktion ErzeugeBruecke aufgerufen wird, k1 zeigt auf die banachbarte Komponente. Es muß also gelten: k0 == this.
Index0, Index1 Sind die Indizes der Brücke in den Brücken-Zeiger-Feldern der verbundenen Komponenten. Siehe auch Beschreibung der Klasse Bruecke.
Pin0, Pin1 Nummern der Pins nach Cadic-Zählweise der beiden Komponenten, die durch die Brücke verbunden sind. Die Pin-Nummern geben den Pin der Komponente an, an dem die Brücke anliegt.

Funktion
Diese Funktion wird im Konstruktor des Expansions-Netz aufgerufen. Da DIBS möglichst flexibel mit anderen Systemen als Tankballastsystemen arbeiten soll, kennt das Grundsystem die verwendeten Komponenten und somit auch die benötigten Brücken nicht. Es muß also eine Möglichkeit geschaffen werden, wie ohne vorherige Kenntnis der genauen Brücken trotzdem die richtige Brücke verwendet werden kann, um die einwandfreie Simulation zu gewährleisten. Hierzu wird von DIBS zunächst eine allgemeine Struktur mit den richtigen Komponenten und allgemeinen Bruecken aufgebaut. Nach Aufbau dieser Struktur werden die Komponenten erneut bearbeitet, und mit Hilfe der Funktion ErzeugeBruecke die von der Komponente benötigte Brücke erzeugt. Vom Konstruktor der Klasse ExpansionsNetz wird hierzu zunächst die alte Brücke gelöscht und dann eine neue, die korrekte, Brücke erzeugt.

Querverweise

Beispiel

Bruecke* Rohr_131::ErzeugeBruecke(Komponente* k0, long Index0, int Pin0, Komponente *k1, long Index1, int Pin1)
{ Bruecke *retval; // Schritt 1: Neue Bruecke erzeugen switch(Pin0) { case 0: retval = new RohrEnde_12(k0, Index0, (long)Pin0, k1, Index1, (long)Pin1); ASSERT(retval); break; case 1: retval = new RohrEnde_12(k0, Index0, (long)Pin0, k1, Index1, (long)Pin1); ASSERT(retval); break; default: ASSERT(NULL); } // Schritt 2: BrueckenZeigerFeld der benachbarten Komponenten aendern this->putBruecke((int)Index0, retval); k1->putBruecke((int)Index1, retval); return retval; }

2.4 GetAnzahlAusgaben

Prototyp
int GetAnzahlAusgaben();

Parameter

Funktion
Liefert den Wert AnzahlAusgaben zurück. Diese Funktion kann direkt in die Header-Datei der Klassen geschrieben werden und als inline deklariert werden.

Querverweise

Beispiel

inline int Rohr::GetAnzahlAusgaben()
{
  return AnzahlAusgaben;
}

2.5 GetAnzahlFehlerParameter

Prototyp
void Default(a,b)

Parameter
a a hat keine Bedeutung
b b hat auch keine Bedeutung

Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.

Querverweise

Beispiel

void KeineKomponente::Default(a,b)
{
  a = a;
  b = b;
}

2.6 GetAnzahlLGSZeilen

Prototyp
int GetAnzahlLGSZeilen();

Parameter
keine

Funktion
Liefert den Wert Anzahl_LGS_Zeilen zurück. Diese Funktion kann direkt in die Header-Datei der Klassen geschrieben werden und als inline deklariert werden.

Beispiel

inline int Rohr::GetAnzahlLGSZeilen()
{
  return Anzahl_LGS_Zeilen;
}

2.7 GetAnzahlLGSSpalten

Prototyp
int GetAnzahlLGSZeilen();

Parameter
keine

Funktion
Liefert den Wert Anzahl_LGS_Spalten zurück. Diese Funktion kann direkt in die Header-Datei der Klassen geschrieben werden und als inline deklariert werden.

Beispiel

inline int Rohr::GetAnzahlLGSSpalten()
{
  return Anzahl_LGS_Spalten;
}

2.8 GetAnzahlVariablen

Prototyp
int GetAnzahlVariablen();

Parameter
keine

Funktion
Liefert die Anzahl der in der Komponente vorhandenen Variablen zurück, die im Wert Anzahl_Variablen gespeichert ist. Diese Funktion kann direkt in die Header-Datei der Klassen geschrieben werden und als inline deklariert werden.

Beispiel

inline int Rohr::GetAnzahlVariablen()
{
  return Anzahl_Variablen;
}

2.9 GetVariablen

Prototyp
void GetVariablen(Variable* kompVariablen,int* next);

Parameter

kompVariablen Feld, das die Variablen aufnehmen soll
next zeigt auf den Index des Felds, an dessen Stelle die erste Variable geschrieben werden soll.

Funktion
Diese Funktion speichert die Variablen der Komponente in das Feld kompVaraiablen. Die erste Variable der Komponente wird dabei an die Stelle kompVariablen[*next] geschrieben, die zweite an kompVariablen[(*next)+1] usw.

*next wird letztlich um die Anzahl der in der Komponente enthaltenen Variablen (Anzahl_Variablen) erhöht.

Querverweise

Beispiel

void Rohr::GetVariablen(Variable* kompVariablen,int* next)
{
  kompVariablen[*next] = q1;
  kompVariablen[(*next)+1] = q2;
  *next += Anzahl_Variablen;
}

2.10 PutVariablen

Prototyp
void PutVariablen(Variable* kompVariablen,int* next);

Parameter

kompVariablen Feld, das die zu setzenden Variablen enthält.
next zeigt auf den Index des Felds, an dessen Stelle die erste zu setzende Variable steht.

Funktion
Diese Funktion ist das Gegenstück zu GetVariablen() und schreibt die in kompVariable gespeicherten Variablen zurück. Zu beachten ist, daß GetVariablen() und PutVariablen() die Variablen auch tatsächlich an die gleiche Stelle des Feldes schreiben und auch auslesen. In welcher Reihenfolge das geschieht, ist jedoch egal, nur müssen beide Funktionen die gleiche Reihenfolge benutzen.
*next wird letztlich um die Anzahl der in der Komponente enthaltenen Variablen (Anzahl_Variablen) erhöht.

Querverweise

Beispiel

void Rohr::PutVariablen(Variable* kompVariablen,int* next)
{
  q1 = kompVariablen[*next];
  q2 = kompVariablen[(*next)+1];
  *next += Anzahl_Variablen;
}

2.11 Setze_LGS_Zeilen

Prototyp
void Setze_LGS_Zeilen (CMatrix& A, CVector& b);

Parameter

AReferenz auf die Matrix des zu lösenden Gleichungssystems.
bReferenz auf den Ergebnisvektor des zu lösenden Gleichungssystems.

Funktion
Diese Funktion setzt die Zeilen des Gleichungssystems. Die Gleichungen werden in der DDL-Beschreibung angegeben unter Rule <Regel>. Für jede Regel <Regel> wird zunächst
<Regel>.Clear(A);
sowie ein oder mehrmals die Zuweisung
<Regel>.MatrizenElement(A, <Variable>.GlobaleSpaltenNummer) = <Wert>;
durchgeführt. Die Anzahl der durchzuführenden Zuweisungen ergibt sich direkt aus der angegebenen Regel.

Anschließend wird die Zuweisung
*<Regel>.VektorElement = <Wert>;
einmal ausgeführt.

Querverweise

Beispiel
void Rohr::Setze_LGS_Zeilen(CMatrix& A, CVector& b)
{
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());
}

2.12 SetzeFehlerStatus

Prototyp
void Default(a,b)

Parameter
a a hat keine Bedeutung
b b hat auch keine Bedeutung

Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.

Querverweise

Beispiel

void KeineKomponente::Default(a,b)
{
  a = a;
  b = b;
}

2.13 SetzeFehlerParameter

Prototyp
void Default(a,b)

Parameter
a a hat keine Bedeutung
b b hat auch keine Bedeutung

Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.

Querverweise

Beispiel

void KeineKomponente::Default(a,b)
{
  a = a;
  b = b;
}

2.14 VariablenAusgabe

Prototyp
int VariablenAusgabe (double t, CSystemverhalten *pVerhalten)

Parameter

t Zeitpunkt, zu dem die Ausgabe erfolgt
pVerhalten Zeiger auf das Systemverhalten, in dem die Ausgabe abgelegt wird.

Funktion
Diese Funktion schreibt die auszugebenden Werte in die Ausgabe pVerhalten. Welche Werte auszugeben sind und deren Anzahl muß der Compiler bestimmen. Hierzu kann z.B. in der DDL nach Deklaration der Konstanten, Unknown_Quantity oder Variablen ein weiteres Flag angegeben werden.
Die auszugebenden Werte werden nacheinander über die Funktion pVerhalten->SetValue() ausgegeben. Der erste Parameter gibt hierbei die Spalte an, in der die Variable ausgegeben wird (also ErsteAusgabeSpalte, ErsteAusgabeSpalte+1 usw.), der zweite Parameter ist der Auszugebende Wert vom Typ CEinzelmessung, der aus dem Zeitpunkt der Ausgabe, der über t gegeben ist sowie aus dem auszugebenden Wert gebildet wird.

Querverweise

Beispiel

int Rohr::VariablenAusgabe (double t, CSystemverhalten *pVerhalten)
{
  pVerhalten->SetValue(ErsteAusgabeSpalte, CEinzelmessung(t,q1.GetValue()));
  pVerhalten->SetValue(ErsteAusgabeSpalte+1, CEinzelmessung(t,q2.GetValue()));
  return 2; // Anzahl ausgegebener Variablen
}

2.15 ZeitSchritt

Prototyp
void ZeitSchritt ();

Parameter
keine

Funktion
Für jede Unknown_Quantity, die eine Ableitung einer Variablen ist, wird integriert. Dies wird durch die Anweisung
<Variable>.IntegriereUeber(<Ableitung>);
erledigt.

Querverweise

Beispiel

void Rohr::ZeitSchritt()
{
  q.IntegriereUeber( q_punkt);
}

2.16 Eingabemaske

Prototyp
void Eingabemaske ();

Parameter
keine

Funktion
Diese Funktion bestimmt alle zusätzlichen Parameter einer Komponente, die sich nicht aus dem Gleichungssystem ergeben, wie z.B. spezielle numerische Parameter (z.B. der Durchmesser eines Rohres). Hierzu wird zunächst für jeden Wert die Cadic-Funktion read_text aufgerufen, deren Ergebnis in eine Zahl vom Typ double gewandelt wird. Im zweiten Schritt werden die Parameter berechnet, für die in der DDL eine Berechnungsformel angegeben ist.

Beispiel

void <Komponente>::Eingabemaske()
{
  // lokale Konstanten
  char dummy[21];
  read_text("Rohrlaenge",20,dummy,FLOAT);
  l_21 = a2d(dummy);
  read_text("Rohrdurchmesser",20,dummy,FLOAT);
  d_25 = a2d(dummy);

  // Instantiierung der lokalen Konstanten
  Q_23 = (((Pi_4)*(d_25))*(d_25))/(4);
  k_39 = (Q_23)/((rho_7)*(l_21));
  K_37 = ((Lambda_10)*(l_21))/(d_25);
  R_add_45 = 100;
  delta_h_43 = 0;
  R_58 = (R_add_45)+(((K_37)*(rho_7))/(((2)*(Q_23))*(Q_23)));
  P_add_65 = ((rho_7)*(g_2))*(delta_h_43);
}

2.17 ShowData

Prototyp
void Default(a,b)

Parameter
a a hat keine Bedeutung
b b hat auch keine Bedeutung

Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.

Querverweise

Beispiel

void KeineKomponente::Default(a,b)
{
  a = a;
  b = b;
}

2.18 LoadData

Prototyp
void Default(a,b)

Parameter
a a hat keine Bedeutung
b b hat auch keine Bedeutung

Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.

Querverweise

Beispiel

void KeineKomponente::Default(a,b)
{
  a = a;
  b = b;
}

2.19 SaveData

Prototyp
void Default(a,b)

Parameter
a a hat keine Bedeutung
b b hat auch keine Bedeutung

Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.

Querverweise

2.20 EnterFehler

Prototyp
void Default(a,b)

Parameter
a a hat keine Bedeutung
b b hat auch keine Bedeutung

Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.

Querverweise

Beispiel

void KeineKomponente::Default(a,b)
{
  a = a;
  b = b;
}

2.21 ShowFehler

Prototyp
void Default(a,b)

Parameter
a a hat keine Bedeutung
b b hat auch keine Bedeutung

Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.

Querverweise

Beispiel

void KeineKomponente::Default(a,b)
{
  a = a;
  b = b;
}

Beispiel

void KeineKomponente::Default(a,b)
{
  a = a;
  b = b;
}

2.22 LoadFehler

Prototyp
void Default(a,b)

Parameter
a a hat keine Bedeutung
b b hat auch keine Bedeutung

Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.

Querverweise

Beispiel

void KeineKomponente::Default(a,b)
{
  a = a;
  b = b;
}

2.23 SaveFehler

Prototyp
void Default(a,b)

Parameter
a a hat keine Bedeutung
b b hat auch keine Bedeutung

Funktion
Ich werde das Gefühl nicht los, daß diese Funktion nichts macht und auch sonst keinen Sinn hat.

Querverweise

Beispiel

void KeineKomponente::Default(a,b)
{
  a = a;
  b = b;
}


3. Die Datenfelder der Komponenten

Diese Felder müssen in allen Komponenten vorhanden sein.

3.1 Anzahl_LGS_Zeilen

Beschreibt die Anzahl der Zeilen, die die Komponente zum Gleichungssystem beiträgt. Der Wert dieses Feldes ergibt sich aus der Anzahl der in der Komponente vorhandenen Regeln.
Der Wert ist im Konstruktor der Komponente festzulegen.

3.2 Anzahl_LGS_Spalten

Beschreibt die Anzahl der Spalten, die die Komponente zum Gleichungssystem beiträgt. Der Wert ergibt ich aus der Anzahl der vorhandenen Unknown_Quantities. Dieser Wert wird im Konstruktor gesetzt.

3.3 Anzahl_Variablen

Gibt die Anzahl der in der Komponente vorhandenen Variablen an. Dieser Wert wird im Konstruktor gesetzt.

3.4 AnzahlAusgaben

Gibt die Anzahl der in der Komponente vorhandenen auszugebenden Werte an. Ein auszugebender Wert kann von jedem Typ sein, der sich auf ein double zurückführen läßt, also eine Variable, eine Unknown_Quantity oder eine Konstante. Dieser Wert wird im Konstruktor gesetzt.

3.5 ErsteAusgabeSpalte

ErsteAusgabeSpalte beschreibt die Spalte des Systemverhaltens, in das die erste Ausgabe erfolgt. Dieser Wert wird in der Init-Funktion der Komponente gesetzt.

3.6 Anzahl_FehlerParameter

Anzahl_FehlerParameter beschreibt die Anzahl der möglichen Parameter einer Komponente, die einen Fehler charakteriesieren.

3.5 PositionFehlerParameter

PositionFehlerParameter beschreibt ???.

3.5 FehlerStatus

FehlerStatus beschreibt ???.


4. Die Methoden der Brücken

4.1 Konstruktor

Der Konstruktor der Komponente <Komponente> hat folgende Form:

<Bruecke>::<Bruecke>(Komponente *k0,long i0,long pin0, Komponente* k1,long i1,long pin1)
: Bruecke(k0,i0,pin0,k1,i1,pin1)
{
Verbindungen = 0;
Anzahl_LGS_Zeilen = ...;
x1 = y1 = ... = xn = yn = NULL;
// weitere Konstruktion der Brücke
}

Neben dem Konstruktor der Brücke wird also auch der Konstruktor der Klasse Bruecke aufgerufen. Dieser Konstruktor muß zur Verfügung gestellt werden, ein Standardkonstruktor ohne Parameter wird nicht benötigt.

4.2 Verbinde

Prototyp
void Verbinde (Unknown_Quantity& u1, ..., Unknown_Quantity& un, int direction);

Parameter

u1 .. un Unknown_Quantities, die die Brücke übertragen soll.
direction Richtung der Brücke: 1 oder -1

Funktion
Diese Funktion definiert die Unknown_Quantities, die die Brücke übertragen soll. Jede Unknown_Quantity, die übertragen wird, trägt eine Zeile zum Gleichungssystem in der Form x1 = y1 bei. Dadurch wird sichergestellt, daß die verbundenen Komponenten mit den gleichen Werten operieren. Eine Brücke verbindet maximal zwei Komponenten und Verbinde wird daher maximal zweimal aufgerufen. Bei jedem Aufruf zählt die Funktion die interne Variable Verbindungen um eins hoch. Is Verbindungen größer als eins und wird dennoch die Funktion verbinde aufgerufen, so wird ein noch zu definierender interner Fehler ausgegeben.

Beim ersten Aufruf werden die übergebenen Werte den X-Werten zugewiesen, beim zweiten Durchlauf den Y-Werten. In welcher Reihenfolge die Zuweisung erfolgt, ist egal, nur sollte in beiden Durchläufen die gleiche Zuweisung erfolgen.

Beispiel


void RohrEnde::Verbinde( UnknownQuantity& u1, UnknownQuantity&v1, int direction )
{
  switch(Verbindungen)
  {
    case 0: x1 = &u; // P
      y1 = &v; // q_punkt
      d1 = direction;
      break;
    case 1: x2 = &u; y2 = &v;
      d2 = direction;
      break;
    default:
      internal_error( "#217" );
  }
  Verbindungen++;
} 

Bemerkung
In der Form, in der die Funktion verbinde zur Zeit implementiert ist, funktioniert das nicht, da nur ZWEI Unknown_Quantities übergeben werden können. Man müßte hierzu auf ein Feld ausweichen, um eine Variable Anzahl von Unknown_Quantities übergeben zu können (eine Brücke kann bestimmt mehr als zwei Werte übertragen)

4.3 Init

Prototyp
void Init (int FreieZeilennummer);

Parameter

FreieZeilennummer Gibt die erste freie Zeile des LGS an, in die die erste Regel geschrieben wird.

Funktion
Diese Funktion setzt für alle Regeln r1 bis rn die Zeilennummer. Hierzu wird für jede Regel die Funktion Rule::SetzteZeilenNummer() mit dem Wert der jeweils ersten freien Zeile aufgerufen.

Beispiel
void RohrEnde::Init( int FreieZeilenNummer )
{
r1.SetzeZeilenNummer( FreieZeilenNummer );
r2.SetzeZeilenNummer( FreieZeilenNummer + 1);
}

4.4 Setze_LGS_Zeilen

Prototyp
void Setze_LGS_Zeilen (CMatrix& A, CVector& b);

Parameter

A Referenz auf die Matrix des zu lösenden Gleichungssystems.
b Referenz auf den Ergebnisvektor des zu lösenden Gleichungssystems.

Funktion
Diese Funktion setzt die Zeilen des Gleichungssystems. Die Gleichungen sind aller der Form x = y. Für jede Regel <Regel> wird zunächst
<Regel>.Clear(A);
sowie zweimal die Zuweisung
<Regel>.MatrizenElement(A, x1->GlobaleSpaltenNummer) = <Wert>;

<Regel>.MatrizenElement(A, y1->GlobaleSpaltenNummer) = <Wert>;

durchgeführt. Die Anzahl der durchzuführenden Zuweisungen ergibt sich direkt aus der angegebenen Regel.

Anschließend wird die Zuweisung
*<Regel>.VektorElement = 0;
einmal ausgeführt.

Beispiel
void RohrEnde::Setze_LGS_Zeilen(CMatrix& A, CVector& b)
{
r1.clear(A);
r1.MatrizenElement(A, x1->GlobaleSpaltenNummer ) = 1;
r1.MatrizenElement(A, y1->GlobaleSpaltenNummer ) = -1;
r1.VektorElement = &b[r1.ZeilenNr];
*r1.VektorElement = 0;
r2.clear(A);
r2.MatrizenElement(A, x2->GlobaleSpaltenNummer ) = d1;
r2.MatrizenElement(A, y2->GlobaleSpaltenNummer ) = d2;
r2.VektorElement = &b[r2.ZeilenNr];
*r2.VektorElement = 0;
};

4.5 GetAnzahlLGSZeilen

Prototyp
int GetAnzahlLGSZeilen();

Parameter
keine

Funktion
Liefert den Wert Anzahl_LGS_Zeilen zurück. Diese Funktion kann direkt in die Header-Datei der Klassen geschrieben werden und als inline deklariert werden.

Beispiel
inline int RohrEnde::GetAnzahlLGSZeilen()
{
return Anzahl_LGS_Zeilen;
}


5. Die Datenfelder der Brücken

Diese Felder müssen in allen Brücken vorhanden sein.

5.1 Anzahl_LGS_Zeilen

Beschreibt die Anzahl der Zeilen, die die Brücke zum Gleichungssystem beiträgt. Der Wert dieses Feldes ergibt sich aus der Anzahl der in der Brücke vorhandenen Regeln.
Der Wert ist im Konstruktor der Brücke festzulegen.

5.2 Verbindungen

Verbindungen ist eine interne Variable, die verwendet wird, um die korrekte initialiserung des Systems sicherzustellen. Jedesmal, wenn die Fuktion Bruecke::Verbinde aufgerufen wird, wird die Variable um eins erhöht. Da eine Brücke nur zwei Komponenten miteinander verbinden kann, liegt ein Fehler vor, sobald Verbindungen den Wert eins übersteigt. In diesem Fall wird versucht, eine Bruecke mit mehr als zwei Komponenten zu verbinden, was zu einem nicht behebbarem Fehler im System führt.

5.3 int d1, d2

Definieren die Richtung der Brücke aus Sicht der jeweiligen Komponente.