在意识到 Gauss-Seidel 对我的模拟来说非常慢之后,我想尝试 GMRES 并幸运地在这里找到了 C++ 代码,而没有深入研究理论。在我的例子中,矩阵的大小是nxnwhere n=50,000。但是,我什至无法将矩阵初始化为零,因为计算机在初始化时会冻结。有没有记忆友好的 GMRES 版本?
GMRES 内存不足
计算科学
C++
内存管理
格瑞斯
2021-12-07 06:29:39
1个回答
据我所知,在普通机器上,如果您使用密集矩阵,您将耗尽内存。您在问题中指出的实现使用密集矩阵(存储所有矩阵条目)。一般来说,在大多数模拟中,每个元素都使用其相邻元素计算通量,并且生成的矩阵结构是稀疏的(矩阵中非零条目的数量仅与大小成线性比例)。因此,解决这个问题的一种方法是使用 GMRES 算法的稀疏矩阵实现。有几种可用的开源实现。我会推荐 PETSc - http://www.mcs.anl.gov/petsc/ PETSc 为您需要的数据结构和算法提供实现,除此之外,您还可以免费获得并行性。
如果您更喜欢独立代码,我可以将您指向此参考 - http://people.sc.fsu.edu/~jburkardt/cpp_src/mgmres/mgmres.html
如果您(出于某种原因)更喜欢坚持使用密集矩阵实现,则应该使用分布式内存 (MPI) 并行性。PETSc 再一次为您提供了相同的算法。
其它你可能感兴趣的问题