Der Graph-Manager stellt sich vor

Die Hauptaufgabe des GraphManagers besteht in der Optimierung der Jacobischen Knoten-Matrix.
Er sortiert die Knoten-Nummern so um, dass alle Elemente möglichst benachbarte Knoten-Nummern
zugewiesen bekommen. Das führt dann dazu, dass die Knoten-Matrix hauptsächlich um die Diagonale
herum besetzt wird, was zu einer enormen Rechenzeit-Ersparniss bei Substitution und Elimination des
Gauss-Algorithmus führen kann.
Zum Abschluss wird der gesamte Gauss-Algorithmus in reinen Maschinen-Code compiliert, was die
Rechen-Geschwindigkeit nocheinmal erhöht.

Schauen wir uns folgende Schaltung an:

Die blauen Ziffern sind die Knoten-Nummern, die jedem Element von ToneCirc vorher zugewiesen worden
sind (L1: 2,4 / L2: 4,1 / L3: 1,3 usw.). Die Knoten-Nummern sind also alles andere als benachbart.
Um die Knoten-Nummern besser zuweisen zu können, erzeugt der Graph-Manager aus der Schaltung einen
Graphen in folgender Form:

Die Rechtecke repräsentieren jeweils ein Element (Graph-Element). Für jedes Pin eines Elements wird im
Graph-Element eine Struktur gespeichert, welche die aktuelle Knoten-Nummer und Referenzen auf andere
Graph-Elemente enthält. Eine Referenz (Grün) zeigt auf das Graph-Element und den Pin-Eintrag mit dem
die Verbindung besteht. Verbindungen (und damit Referenzen) sind logischerweise immer bidirektional
(deswegen Pfeile in beide Richtungen). Pin-Einträge für den 0-Knoten werden vorher gestrichen.
Das neu durchnummerieren der Knoten-Nummern, geschieht dann mit einem rekursiven Algorithmus
folgendermaßen: Der Graph-Manager fängt bei einem Graph-Element an, das nur eine Referenz besitzt
(z. Bsp. bei Sig1). Dann schlängelt sich der Algo von Graph-Element zu Graph-Element den Referenzen 
entlang und nummeriert dabei neu durch. Alle bearbeiteten Pin-Einträge werden markiert, so dass der 
Rekursions-Stack irgendwan zurückkehren kann. Sind dann noch unmarkierte Einträge vorhanden, wird 
der ganze Prozess nocheinmal, bei einem unmarkierten Pin-Eintrag, gestartet. Das passiert immer dann,
wenn unabhängige Netzwerke vorliegen (Teilschaltungen).
Am Ende hätten wir in diesem Beispiel das Ergebniss: L1: 1,2 / L2: 2,3 / L3: 3,4 usw.

Die Arbeit des Graph-Managers kann man sich anschauen, wenn man nach erfolgter Schaltungseingabe
Menü: Tools/Ask the GraphManager ausführt. Es öffnet sich dann ein Texteditor, der die Ergebnisse als
Text-Dump anzeigt.

Mit dieser Beispielschaltung:

wird dann folgender Dump ausgeben:

Origin Node Matrix
X . . . . . X .
. X . . . . . X
. . X X . . X .
. . X X . . . .
. . . . X X . X
. . . . X X . .
X . X . . . X .
. X . . X . . X

Origin Network List
Sig2: 1,0
Sig1: 2,0
L6: 3,4
L4: 5,6
L3: 1,7
L1: 2,8
L5: 7,3
C3: 7,0
C4: 6,0
L2: 8,5
C2: 5,0
C1: 8,0
C6: 4,0
C5: 3,0

ExChange-Table:
Node 1 <--> 1
Node 2 <--> 5
Node 3 <--> 3
Node 4 <--> 4
Node 5 <--> 7
Node 6 <--> 8
Node 7 <--> 2
Node 8 <--> 6

Optimate Network List
Sig2: 1,0
Sig1: 5,0
L6: 3,4
L4: 7,8
L3: 1,2
L1: 5,6
L5: 2,3
C3: 2,0
C4: 8,0
L2: 6,7
C2: 7,0
C1: 6,0
C6: 4,0
C5: 3,0

Optimate Matrix:
X X . . . . . .
X X X . . . . .
. X X X . . . .
. . X X . . . .
. . . . X X . .
. . . . X X X .
. . . . . X X X
. . . . . . X X

Used Matrix:
X X . . . . . .
X X X . . . . .
. X X X . . . .
. . X X . . . .
. . . . X X . .
. . . . X X X .
. . . . . X X X
. . . . . . X X

Number of Operations = 50
Buffer Size of Code  = 637
Independent Networks = 2

Wie man sieht, wird die Original-Matrix erheblich optimiert. Die Matrix-Elemente der Optimate Matrix
sind um die Diagonale herum angeordnet. Da wir zwei Teilschaltungen haben, entstehen auch zwei unabhängige
Teil-Matrizen (und damit zwei unabhängig voneinander lösbare Gleichungs-Systeme).

Wie schon oben erwähnt, compiliert der Graph-Manager den Lösungs-Algorithmus in Maschinen-Code, so
dass bei der Berechnung nur die wirklich notwendigen Operationen ausgeführt werden. Es werden nur die
Matrix-Elemente, die in Used Matrix angekreuzt sind, angefasst. Außerdem müssen keinerlei Indexierungs-,
Schleifen- und Sprunganweisungen mehr ausgeführt werden.
Wie ToneCirc den Maschinen-Code ausführt, wurde schon hier besprochen.

zur Hauptseite