11.2. Direkte Gleichungslöser#
Die FEM Matrix der Dimension hat nach geeignetem Umordnen (Nummerierung der Knoten, Dreiecke, etc.) oft eine Block-Struktur. Im Gegensatz zu direkten Löser basierend auf Faktorisierungsmethoden, wie z.B. die oben erwähnte LR-Zerlegung, können Block-eliminations Methoden noch effizienter sein.
Siehe auch
Wir teilen die Unbekannten in zwei Gruppen und schreiben die Gleichung \(A\,u = f\) neu als Blocksystem
Als erstes berechnen wir \(u_1\)
und die Schur-Komplement Gleichung um \(u_2\) zu bestimmen
(Schur-Komplement)
Die Matrix
heisst Schur-Komplement \(S_{11}\) in \(A\).
Diese Block-Faktorisierung wird in sub-structuring Algorithmen benutzt. Dabei zerlegt man das Gebiet in \(m\times m\) Untergebiete und teilt die Unbekannten in innere und koppelnde Unbekannte auf. Nun kann die Faktorisierung der Blöcke mit den inneren Unbekannten und die Berechnung des Schur-Komplements parallel berechnet werden. Die Eliminierung der internen Unbekannten kann mit sogenannten hierarchischen sub-structuring Algorithmen (z.B. nested dissection) durchgeführt werden.
Hierarchische Elimination funktioniert bei strukturierten Gitter sehr gut. Man kann sie jedoch auch unstrukturierten Gitter anwenden. In dem Fall basiert die Ordnung auf dem minimalen Grad der Kopplung. Nacheinander werden die Unbekannten mit den wenigsten Verbindungen im Matrixgraphen eliminiert.
In 2D ist eine direkte Methode mit optimaler Anordnung sehr effizient. In 3D ist die Situation für den direkten Löser schlechter.
Bemerkung
In der Praxis bedeutet das in aller Regel, dass 2D Probleme einfach mit direkten Löser berechnet werden können. Hingegen bei 3D Problemen benötigen wir zwingend einen anderen Ansatz.
Help on method Inverse in module ngsolve.la:
Inverse(...) method of ngsolve.la.SparseMatrixd instance
Inverse(self: ngsolve.la.BaseMatrix, freedofs: pyngcore.BitArray = None, inverse: str = '') -> BaseMatrix
Calculate inverse of sparse matrix
Parameters:
freedofs : BitArray
If set, invert only the rows/columns the matrix defined by the bit array, otherwise invert the whole matrix
inverse : string
Solver to use, allowed values are:
sparsecholesky - internal solver of NGSolve for symmetric matrices
umfpack - solver by Suitesparse/UMFPACK (if NGSolve was configured with USE_UMFPACK=ON)
pardiso - PARDISO, either provided by libpardiso (USE_PARDISO=ON) or Intel MKL (USE_MKL=ON).
If neither Pardiso nor Intel MKL was linked at compile-time, NGSolve will
look for libmkl_rt in LD_LIBRARY_PATH (Unix) or PATH (Windows) at run-time.