Domanda: quali metodi sono disponibili per calcolare in modo accurato ed efficiente la struttura di sparsità di una matrice di elementi finiti?
Info: sto lavorando su un risolutore di equazioni di pressione di Poisson, usando il metodo di Galerkin con una base quadratica di Lagrange, scritto in C, e usando PETSc per l'archiviazione di matrici sparse e routine KSP. Per usare PETSc in modo efficiente, devo pre-allocare memoria per la matrice di rigidità globale.
Attualmente, sto facendo un gruppo finto per stimare il numero di nonzeros per riga come segue (pseudocodice)
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]++
Questo, tuttavia sopravvaluta nnz perché alcune interazioni nodo-nodo possono verificarsi in più elementi.
Ho considerato di provare a tenere traccia delle interazioni che ho trovato, ma non sono sicuro su come farlo senza usare molta memoria. Potrei anche passare in rassegna i nodi e trovare il supporto della funzione base centrata su quel nodo, ma poi dovrei cercare tutti gli elementi per ciascun nodo, il che sembra inefficiente.
Ho trovato questa recente domanda, che conteneva alcune informazioni utili, soprattutto da Stefano M, che ha scritto
il mio consiglio è di implementarlo in Python o C, applicando alcuni concetti teorici del grafico, cioè considerare gli elementi della matrice come spigoli in un grafico e calcolare la struttura di sparsità della matrice di adiacenza. Elenco di elenchi o dizionario di chiavi sono scelte comuni.
Sto cercando maggiori dettagli e risorse su questo. Devo ammettere che non conosco molta teoria dei grafi e non ho familiarità con tutti i trucchi CS che potrebbero essere utili (mi sto avvicinando dal punto di vista matematico).
Grazie!