数值求解稳态反应扩散/亥姆霍兹方程

计算科学 有限元 有限差分 线性求解器 平流扩散 谱法
2021-12-23 00:40:37

我正在解决以下形式的问题:

u(x,y,t)t=2u(x,y,t)f(x,y,t)u(x,y,t)κ(x,y,t)

目前,我在每个时间步都通过假设准稳态来解决这个问题:

2u(x,y,t)=f(x,y,t)u(x,y,t)+κ(x,y,t)

为此,我使用有限差分,这意味着在每个时间步解决以下问题(暂时忘记边界条件,但作为参考,它们是 Neumann):

ui,j+1t+ui+1,jt+ui,j1t+ui1,jt4ui,jth2=fi,jtui,jt+κi,jt

这意味着我必须解决以下形式的线性系统:

Ax=b

其中是由拉普拉斯算子和项组成的矩阵。对于我的 100x100 系统(导致大小为 10000x10000 的拉普拉斯算子),使用 Eigen 的 C++ 库求解器:SimplicialLLT,每个时间步大约需要 0.4 秒。但是,我想以任何可能的方式加快解决速度。问题是我可以做的预处理有限,因为矩阵每个时间步都会发生变化。Afi,jtui,jtA

有没有人有任何想法?有限元、谱方法、非稳态近似都受到欢迎。

在任何人问之前,术语无法提前预测,因为它们取决于因此,我认为并行化是不可能的。fi,jtκi,jtui,jt1

最好的,

1个回答

一种加速方法如下:假设是您尝试求解的矩阵,即您正在寻求求解线性系统 让我假设,那么是一个对称的正定矩阵。(如果我的假设是错误的,那么它仍然是对称的,但可能不再是正定的。)鉴于此,您可以使用共轭梯度 (CG) 方法求解线性系统。当然,问题是如何对其进行预处理。At=A(ut)

Atxt=bt.
ft0At

我的方法是在第一个时间步计算的 Cholesky 分解,并将其用作下一个时间步的预处理器。由于预处理器是完美的,因此您将能够在一次 CG 迭代中求解时间步为零。在随后的时间步中,将开始偏离预处理器,您将需要更多的迭代。一旦迭代次数变得太大,您将在下一个时间步重新计算 Cholesky 分解。这是可行的,因为计算 Cholesky 分解的步骤是昂贵的,但您只能每隔几个时间步执行一次。A0At