Question: Quelles méthodes sont disponibles pour calculer avec précision et efficacité la structure de rareté d'une matrice d'éléments finis?
Info: Je travaille sur un solveur d'équation de pression de Poisson, en utilisant la méthode de Galerkin avec une base de Lagrange quadratique, écrite en C, et en utilisant PETSc pour le stockage matriciel clairsemé et les routines KSP. Pour utiliser PETSc efficacement, j'ai besoin de pré-allouer de la mémoire pour la matrice de rigidité globale.
Actuellement, je fais un faux assemblage pour estimer le nombre de non-zéros par ligne comme suit (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]++
Cela surestime toutefois nnz car certaines interactions nœud-nœud peuvent se produire dans plusieurs éléments.
J'ai envisagé de garder une trace des interactions i, j que j'ai trouvées, mais je ne sais pas comment faire cela sans utiliser beaucoup de mémoire. Je pourrais également faire une boucle sur les nœuds et trouver le support de la fonction de base centrée sur ce nœud, mais je devrais alors rechercher tous les éléments de chaque nœud, ce qui semble inefficace.
J'ai trouvé cette question récente, qui contenait des informations utiles, en particulier de Stefano M, qui a écrit
mon conseil est de l'implémenter en python ou C, en appliquant certains concepts théoriques des graphes, c'est-à-dire considérer les éléments de la matrice comme des arêtes dans un graphe et calculer la structure de rareté de la matrice d'adjacence. La liste des listes ou le dictionnaire des clés sont des choix courants.
Je cherche plus de détails et de ressources à ce sujet. Certes, je ne connais pas beaucoup la théorie des graphes, et je ne connais pas toutes les astuces CS qui pourraient être utiles (j'aborde cela du côté mathématique).
Merci!