Neue Datenstrukturen
- Verteilungsklassen
- Aktivierung von verschieden Verteilungen
- Block-Verteilung implementiert
- Zyklische Verteilung implementiert
- Block-Zyklische Verteilung implementiert
- Erweiterung: Benutzer können eigene verteilte Klassen schreiben
- Verteilte Vektoren
- Parametrisierter lokaler Vektor (kann auch nutzerdefiniert sein)
- Parametrisierung mit Verteilungsklasse, jede Verteilung ist möglich
- Verteilte Matrizen
- Parametrisiert mit nicht-verteilter Matrixklasse
- Gleiche Implementierung von verteilten dichten und verteilten schwach besetzten Matrizen
- Klasse kann spezialisiert werden, für noch bessere Laufzeiten
- Parametrisierung mit zwei Verteilungsklassen
- Im Matrix-Vektor-Produkt v= A * w können die Vektoren v und w verschiedene Verteilungen haben (die einzelnen Verteilungen müssen aber mit A kompatibel sein)
- Migration von Vektoren und Matrizen kann dadurch als Matrixprodukt ausgeführt werden
- Parametrisiert mit nicht-verteilter Matrixklasse
- Verteilter Vektor-Inserter
- Werte können mit globalem Index eingefügt werden
- Lokale Einträge werden direkt eingefügt und entfernte Werte am Ende der Einfügungsphase kommuniziert (wenn das Inserter-Objekt zerstört wird)
- Parametrisierung mit Update-Funktion
- Bei mehrfachen Einfügungen in denselben Eintrag können die Werte addiert werden (oder multipliziert, maximiert,...)
- Verteilter Matrix-Inserter
- Gleiche Funktionalität wie der verteilte-Vektor Inserter
- Am Ende des Einfügens werden Puffer für das verteilte Matrix-Vektor-Produkt vorbereitet (wie in PETSc)
- Es wird vorab keine genaue Information benötigt, wie viele Nichtnull-Elemente existieren bzw. wo sie liegen (im Gegensatz zu PETSc). Ein einzelner Besetztheitsparameter ist ausreichend für den Matrix-Inserter.
- Generische verteilte Blockvorkonditionierer
- Diagonal
- ILU(0)
- IC(0)
- Migrationsklassen zur Umverteilung
- Zur Zeit ist die Implementierung nur von Block zu Block realisiert
- Sehr einfache Verwendung im Konstruktor:
- Sei ‘A’ eine Matrix vom Type ‘M’ und ‘m’ eine Migration Objekt, dann konstruiert der Ausdruck
M B(A, m);
eine neue Matrix ‘B’ mit den Werten von ‘A’ und der neuen Verteilung - Genauso können auch Vektoren migriert werden
- Sei ‘A’ eine Matrix vom Type ‘M’ und ‘m’ eine Migration Objekt, dann konstruiert der Ausdruck
- Umgekehrte Migration, z.B.:
M A2(B, reverse(m));
migriert die Werte von B zurück zur ursprünglichen Verteilung (natürlich nur nützlich, wenn sich B zwischenzeitlich geändert hat) - Um zum Beispiel die Ergebnisse zurück auf die Anfangsindizierung eines FEM-Werkzeugs abzubilden.
- Einfache Ausgabe
- Zum Beispiel:
sout << “Matrix A ist\n” << A << “v ist “ << v << ‘\n’;
gibt Matrix A und Vektor v einmal aus - Funktioniert auch mit verteilten Matrizen und Vektoren
- Kann auch für die Dateiausgabe verwendet werden
- Zum Beispiel:
- Mehrfache Ausgabe
- Zum Beispiel
rout << “alpha ist “ << alpha << ‘\n’;
gibt für jeden Prozessor eine Nachricht mit vorangestellter Prozessornummer aus
- Zum Beispiel