在 PETSC 中为泊松方程组装稀疏矩阵

计算科学 有限差分 宠物 稀疏矩阵 有限体积 泊松
2021-12-04 08:50:13

我是 PETSC 的新手,我一直在尝试使用 PETSC(正方形、规则网格、Dirichlet 边界)编写 FVM 代码以实现 2D 中的稳定热传导

由于大矩阵,比如 A,将是稀疏的,我声明每行 5 个非零并使用MatCreateSeqAIJ()

我的问题是关于组装矩阵的条目。在每份简历中,我都会打电话给MatSetValues()

并使用局部数组 II、JJ 和 Values_IJ 将 5 个系数添加到 A

1)这是做到这一点的“正确”还是“通常”的方式?我问是因为,在我看来,是通过在我的循环中隐式使用COO 类型的稀疏表示来组装的,而 PETSC 中的矩阵表示是CSR

2) 如果没有,有没有办法创建局部数组 II、JJ 和 Values_IJ 以适应矩阵的 CSR 格式,然后调用MatSetValues()

1个回答

PETSc 不会立即创建您的稀疏矩阵表示。因此,当您调用 时MatSetValues(),通常会将值放在中间缓存中,中间缓存偶尔会“转储”到真正的稀疏矩阵存储中。因此,插入矩阵元素的顺序的影响是有限的。

使用缓存的事实允许在实际创建矩阵期间进行多次优化,并在组装过程中提供更大的灵活性(您可以利用这一点)。这就是为什么你会在你能够使用你的矩阵之前MatAssemblyBegin()打电话。MatAssemblyEnd()

因此,按照您在 PETSc 中描述的方式创建矩阵是很自然的。如有疑问,请参阅通常显示最佳实践的相关 PETSc 示例。

您还可以选择自己创建三阵列 CSR 并使用MatCreateSeqAIJWithArrays().