Frage: Mit welchen Methoden kann die Sparsity-Struktur einer Finite-Elemente-Matrix genau und effizient berechnet werden?
Info: Ich arbeite an einem Poisson-Druckgleichungslöser nach der Methode von Galerkin auf quadratischer Lagrange-Basis, geschrieben in C, und verwende PETSc für die Speicherung von spärlicher Matrix und KSP-Routinen. Um PETSc effizient zu nutzen, muss der globalen Steifheitsmatrix Speicher zugewiesen werden.
Momentan mache ich eine Mock-Assembly, um die Anzahl der Nonzeros pro Zeile wie folgt zu schätzen (Pseudocode)
int nnz[global_dim]
for E=1 to NUM_ELTS
for i=1 to 6
gi = global index of i
if node gi is free
for j=1 to 6
gj = global index of j
if node gj is free
nnz[i]++
Dies überschätzt jedoch nnz, da einige Knoten-Knoten-Interaktionen in mehreren Elementen auftreten können.
Ich habe überlegt, welche Interaktionen ich gefunden habe, aber ich bin mir nicht sicher, wie ich dies tun soll, ohne viel Speicherplatz zu verbrauchen. Ich könnte auch die Knoten durchlaufen und die Unterstützung der Basisfunktion finden, die auf diesen Knoten zentriert ist, aber dann müsste ich alle Elemente für jeden Knoten durchsuchen, was ineffizient zu sein scheint.
Ich fand diese kürzlich gestellte Frage, die einige nützliche Informationen enthielt, insbesondere von Stefano M., der schrieb
Mein Rat ist, es in Python oder C zu implementieren, einige graphentheoretische Konzepte anzuwenden, dh Elemente in der Matrix als Kanten in einem Graphen zu betrachten und die Sparsity-Struktur der Adjazenzmatrix zu berechnen. Eine Liste von Listen oder ein Wörterbuch von Schlüsseln sind häufige Auswahlmöglichkeiten.
Ich bin auf der Suche nach weiteren Details und Ressourcen. Zugegebenermaßen kenne ich nicht viel Graphentheorie und kenne nicht alle CS-Tricks, die nützlich sein könnten (ich gehe dies von der mathematischen Seite aus an).
Vielen Dank!