使用代数多重网格对对流-扩散算子进行预处理

计算科学 有限元 宠物 线性求解器 预处理
2021-11-25 12:16:13

我实现了基于 FEM 离散化和 PETSc 的 Navier Stokes,用于求解线性方程组。为了创建一个有效的求解过程,我遵循论文“Efficient preconditioning of the linearized Navier-Stokes equations for incompressible flow”(Silvester 等人),该论文提出了一种 Schur 补码方法。它工作得很好,因为我有一个几乎恒定的迭代次数,独立于网格大小和时间步长,用于本文中也介绍的简单基准(2D 驱动型腔流动和后向步长)。但目前,我使用并行直接求解器 (MUMPS) 求解上部速度块。压力 Schur 块使用论文中提出的不精确求解器求解。

在论文中,作者建议在每个外部迭代中运行一个单一的多重网格 V 循环,并使用点 Gauss-Seidel 平滑器来近似这种离散对流扩散算子的逆。由于我不能轻易使用几何多重网格方法,我想用一个代数多重网格 V 循环(来自 hypre 包的 boomeramg)替换直接求解器。但是,在使网格更精细的同时,我会丢失恒定的迭代次数。

你们中有人知道如何为基于代数多重网格的速度矩阵的逆创建一个光谱等效且有效的预处理器吗?在这种情况下,是否有一些固有的东西不允许使用代数多重网格?如果不是,那么失去恒定迭代缩放的原因可能是什么?


编辑:

我为速度块的不同求解器添加了一些基准。解决的问题是标准的 2D 驱动型腔流动、Taylor-Hood 离散化和单位盒的统一细化

Exakt 求解器 (MUMPS)

h=132: 25 迭代 h=164: 25 迭代 h=1128: 25 迭代 h=1256: 22 迭代

一个 V-AMG(代数,回旋镖)

h=132: 30 迭代 h=164: 30 迭代 h=1128: 39 迭代 h=1256: 48 迭代

FGMRES 与预调节器 V-AMG(代数,boomerang),rtol:106

h=132: 30 迭代 h=164: 29 迭代 h=1128: 30 迭代 h=1256: 47 迭代

FGMRES 与预调节器 V-AMG(代数,boomerang),atol:108

h=132: 27 迭代 h=164: 27 迭代 h=1128: 28 迭代 h=1256: 26 迭代

1个回答

您所做的是将左上角的精确(直接)求解器替换为仅执行单个 V 循环的求解器。可行的方法是使用迭代求解器(例如 GMRES)求解预处理器中的左上块,使用 V 循环 AMG 作为该内部求解器的预处理器。经验表明,如果您使用 F-GMRES 作为外部求解器,则内部 GMRES 求解器不需要非常准确。准确到足以让它产生几乎恒定数量的外部迭代。