Pergunta: Quais métodos estão disponíveis para calcular com precisão e eficiência a estrutura de esparsidade de uma matriz de elementos finitos?
Info: Estou trabalhando em um solucionador de equações de pressão de Poisson, usando o método de Galerkin com base em Lagrange quadrático, escrito em C, e usando o PETSc para armazenamento de matriz esparsa e rotinas KSP. Para usar o PETSc com eficiência, preciso pré-alocar memória para a matriz de rigidez global.
Atualmente, estou fazendo uma montagem simulada para estimar o número de não-zeros por linha da seguinte forma (pseudocódigo)
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]++
No entanto, isso superestima o nnz porque algumas interações nó-nó podem ocorrer em vários elementos.
Pensei em tentar rastrear quais interações j, eu encontrei, mas não tenho certeza de como fazer isso sem usar muita memória. Eu também poderia fazer um loop sobre os nós e encontrar o suporte da função base centralizada nesse nó, mas então eu teria que pesquisar todos os elementos para cada nó, o que parece ineficiente.
Encontrei esta pergunta recente, que continha algumas informações úteis, especialmente de Stefano M, que escreveu
meu conselho é implementá-lo em python ou C, aplicando alguns conceitos teóricos dos grafos, ou seja, considere os elementos da matriz como arestas em um gráfico e calcule a estrutura de esparsidade da matriz de adjacência. Lista de listas ou dicionário de chaves são escolhas comuns.
Estou procurando mais detalhes e recursos sobre isso. Admito que não conheço muita teoria dos grafos e não estou familiarizado com todos os truques de CS que podem ser úteis (estou abordando isso do lado matemático).
Obrigado!