在 3D FEM 中求解线性系统的迭代方法

计算科学 有限元 matlab 迭代法 预处理
2021-12-06 11:56:40

我在 MATLAB 中为 3D 泊松方程实现了 FEM 求解器,对拉普拉斯算子使用六面体和稀疏矩阵。我使用的是反斜杠,但现在我必须使用一些迭代方法(例如带有ilu的 GMRES)。Nx,NyNz(一般来说,N) 作为元素的数量(50、100 和 200 作为测试用例)我有一些问题。为了N=50它需要超过600使用带有不完整LU预处理器的cgs秒。为了N=100它需要超过 60 分钟,并且仍在运行。我没有设置公差或最大迭代次数,因为它似乎不会影响计时问题。这是可能的还是不应该花那么长时间?有没有办法加快速度?

这是代码:

[L,U] = ilu(Kb);
[u_h,flag,relres,iter,resvec] = cgs(Kb,fb,[],[],L,U);

其中Kb是拉普拉斯算子,fb是右手边。

谢谢你。

1个回答

您的刚度矩阵是对称的、正定的,因此该问题选择的基于 Krylov 的求解器是共轭梯度。你想要类似这样的代码

L = ichol(K);
u = pcg(K, b, tol, maxIter, L, L');

假设您想使用不完全分解作为前置条件。立方体上 Poisson 方程的刚度矩阵条件相对较好,因此您可能想尝试不使用预处理器或使用非常简单的预处理器(如对角缩放)。但是,既然你说 ichol 的 MATLAB 实现非常快,那可能是最好的选择。

其他基于 Krylov 的迭代算法,例如您提到的 cgs 和 GMRES,主要用于非对称或非正定系统。