问题:有哪些方法可以准确有效地计算有限元矩阵的稀疏结构?
信息:我正在研究泊松压力方程求解器,使用具有二次拉格朗日基础的 Galerkin 方法,用 C 编写,并使用 PETSc 进行稀疏矩阵存储和 KSP 例程。为了有效地使用 PETSc,我需要为全局刚度矩阵预先分配内存。
目前,我正在做一个模拟程序集来估计每行的非零数如下(伪代码)
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]++
然而,这高估了 nnz,因为一些节点-节点交互可能发生在多个元素中。
我考虑过尝试跟踪我发现的 i,j 交互,但我不确定如何在不使用大量内存的情况下做到这一点。我还可以遍历节点,并找到以该节点为中心的基函数的支持,但是我必须搜索每个节点的所有元素,这似乎效率低下。
我发现了这个最近的问题,其中包含一些有用的信息,尤其是来自 Stefano M,他写道
我的建议是在 python 或 C 中实现它,应用一些图论概念,即将矩阵中的元素视为图中的边并计算邻接矩阵的稀疏结构。列表列表或键字典是常见的选择。
我正在寻找有关此的更多详细信息和资源。诚然,我不太了解图论,而且我不熟悉所有可能有用的 CS 技巧(我从数学方面接近这一点)。
谢谢!