Pregunta: ¿Qué métodos están disponibles para calcular con precisión y eficiencia la estructura de dispersión de una matriz de elementos finitos?
Información: estoy trabajando en un solucionador de ecuaciones de presión de Poisson, usando el método de Galerkin con una base cuadrática de Lagrange, escrito en C, y usando PETSc para el almacenamiento de matriz dispersa y las rutinas KSP. Para usar PETSc de manera eficiente, necesito preasignar memoria para la matriz de rigidez global.
Actualmente, estoy haciendo un montaje simulado para estimar el número de nonzeros por fila de la siguiente manera (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]++
Sin embargo, esto sobreestima nnz porque algunas interacciones nodo-nodo pueden ocurrir en múltiples elementos.
He considerado intentar hacer un seguimiento de las interacciones i, j que he encontrado, pero no estoy seguro de cómo hacerlo sin utilizar mucha memoria. También podría recorrer los nodos y encontrar el soporte de la función base centrada en ese nodo, pero luego tendría que buscar a través de todos los elementos para cada nodo, lo que parece ineficiente.
Encontré esta pregunta reciente, que contenía información útil, especialmente de Stefano M, quien escribió
mi consejo es implementarlo en python o C, aplicando algunos conceptos teóricos de gráficos, es decir, considerar los elementos en la matriz como bordes en un gráfico y calcular la estructura de dispersión de la matriz de adyacencia. La lista de listas o el diccionario de claves son opciones comunes.
Estoy buscando más detalles y recursos sobre esto. Es cierto que no conozco mucha teoría de gráficos, y no estoy familiarizado con todos los trucos de CS que podrían ser útiles (me estoy acercando a esto desde el lado matemático).
¡Gracias!