是否可以在 Petsc 库中动态调整稀疏矩阵的大小?

计算科学 pde 线性代数 宠物
2021-12-04 13:25:41

这可能是 Petsc 新手的问题,但是...

我正在使用 Petsc 来解决大型稀疏线性系统。矩阵的初始创建相当慢,我理解这主要是由于内存分配;暂时可以忍受。我的问题是,随着模拟的进行,我的域/网格的结构会发生变化,因此需要增加结果矩阵的大小。我真的需要每次都为此创建一个全新的矩阵,还是有办法只调整现有矩阵的大小?(即为了避免从头开始重新分配整个矩阵的成本。)

我曾尝试调用 MatSetSizes,但它给了我一个错误:“无法将行大小更改/重置为 [...]”我做错了什么,还是这是一个基本限制?

2个回答

邮件列表中给出的一般建议通常是关于高效组装

最简洁的答案是不; 这是一个基本限制。更长的答案是,一方面,没有“全部结束”的稀疏矩阵实现。一般来说,它会更快:

  1. 遍历您的网格/域,计算组装矩阵中需要多少条目
  2. 创建/分配所述矩阵
  3. 组装矩阵

大部分时间将花费在线性/非线性求解器上,因此与计算解决方案相比,矩阵组件很小(嗯,至少这是目标)。

您可能想查看创建 VecScatter;甚至更好的是,尝试使用 PETSc 的 DMDA(用于结构化)或 Sieve(实验性,用于非结构化和主要是 FEM 域)来管理您的网格。这些 PETSc 网格对象将为您维护大部分细节划分、矩阵创建和 vec 散射,因此您不必自己编写 MPI 代码。

最简洁的答案是不。矩阵组装完成后,您无法调整其大小,MatSetSizes() 用于在组装前设置大小。

我会考虑使矩阵创建更快 - 如果您适当地预先分配矩阵,请参见例如PETSc FAQ 中的这个问题