FAS-multigrid 比线性缺陷校正慢?

计算科学 多重网格
2021-12-11 05:25:49

我已经使用线性缺陷校正 (LDC) 和完全近似方案 (FAS) 实现了 V-Cycle 多重网格求解器。

我的问题如下:使用 LDC,每个周期的残差减少了约 0.03 倍。FAS 实现也确实与线性因子收敛,但该因子仅为 ~0.58。因此 FAS 需要大约 20 倍的周期数。

大部分代码是共享的,唯一的区别是向下/向上计算,LDC使用

向下:uH:=0,bH:=IhH(bhLhuh)

向上:uh:=uh+IHhuH

和 FAS 使用

向下:uH:=IhHuh,bH:=IhHbh+LHIhHuhIhHLhuh

向上:uh:=uh+IHh(uHIhHuh)

我的测试设置来自 Brigg 的“A Multigrid Tutorial, Second Edition”,p。64、有解析解

u(x,y)=(x2x4)(y4y2)x,y[0,1]2

方程是Lv=Δu=:b使用典型的线性 5 点模板作为拉普拉斯算子L. 最初的猜测是v=0.

更改测试设置,例如更改为微不足道的u(x,y)=0使用初始猜测v=1导致几乎相同的收敛因子。

由于只有向下/向上代码不同,LDC 结果与本书相符,而且 FAS 至少似乎也可以工作,我不知道为什么它在相同的线性设置中要慢得多。

在 LDC 和 FAS 中都有一个我无法解释的奇怪行为,只有在最初的猜测错误的情况下才会发生(例如=0而且在我的完整多网格实验中,对新细网格的插值会增加残差1015101):如果我将后校正松弛的数量增加到一个非常高的数量,以便解决方案在粗网格上解决机器精度问题,那么当进入下一个细网格时,它会丢失几乎所有数字。

因为一张照片胜过千言万语:

// first cycle, levels 0-4
// DOWN
VCycle top 4, start               res_norm 3.676520e+02 // initial residual
VCycle top 4, cycle 0, current 4, res_norm 3.676520e+02
VCycle top 4, cycle 0, current 4, res_norm 1.520312e+02 // relaxed (2 iterations)
VCycle tau_norm 2.148001e+01 (DEBUG calculation)
VCycle top 4, cycle 0, current 3, res_norm 1.049619e+02 // restricted
VCycle top 4, cycle 0, current 3, res_norm 5.050392e+01 // relaxed (2 iterations)
VCycle top 4, cycle 0, current 2, res_norm 3.518764e+01 // restricted
VCycle top 4, cycle 0, current 2, res_norm 1.759372e+01 // relaxed (2 iterations)
VCycle top 4, cycle 0, current 1, res_norm 1.234398e+01 // restricted
VCycle top 4, cycle 0, current 1, res_norm 4.728777e+00 // relaxed (2 iterations)
VCycle top 4, cycle 0, current 0, res_norm 3.343750e+00 // restricted
// coarsest grid
VCycle top 4, cycle 0, current 0, res_norm 0.000000e+00 // solved
// UP
VCycle top 4, cycle 0, current 1, res_norm 3.738426e+00 // prolonged
VCycle top 4, cycle 0, current 1, res_norm 0.000000e+00 // relaxed (many iterations)
VCycle top 4, cycle 0, current 2, res_norm 1.509429e+01 // prolonged (loosing digits)
VCycle top 4, cycle 0, current 2, res_norm 2.512148e-15 // relaxed (many iterations)
VCycle top 4, cycle 0, current 3, res_norm 4.695979e+01 // prolonged (loosing digits)
VCycle top 4, cycle 0, current 3, res_norm 0.000000e+00 // relaxed (many iterations)
VCycle top 4, cycle 0, current 4, res_norm 1.469312e+02 // prolonged (loosing digits)
VCycle top 4, cycle 0, current 4, res_norm 9.172812e-24 // relaxed (many iterations)

我不确定每个周期是否只能获得几位数字,或者这是否表明在细网格插值过程中出现错误。如果是后一种情况,LDC 如何在始终使用 2 个松弛时实现约 0.03 的账面残差率?

3个回答

我不直接知道您的答案,因为我主要使用 FAS 而不是校正,因为我对非线性问题进行了多重网格处理,但是您可以考虑一些想法:

  • 您正在将线性校正方案应用于线性问题,因此它做得很好并不令人震惊。

  • 考虑您的边界条件:确保您正确地执行它们,并且还要注意复杂的 BC 在粗网格上看起来可能完全不同,使得那里的校正不是那么有用。

  • 仔细检查您对源术语的处理;我记得当我为泊松写它时,在与该术语相关的延长阶段搞砸了一些东西。

  • 我从未见过需要迭代以在最粗糙的网格上收敛。那里的解决方案取决于精细网格残差是否正确,但事实并非如此。您正在尝试将这些错误排除在域之外/将它们消除。如果您在早期迭代中完全收敛于最粗网格,那么您的解决方案自然与正确的精细网格解决方案相去甚远,因为您的残差不是最新的。这几乎肯定是您看到残差在延长阶段上升的原因。

  • 此外,尝试为限制和延长运算符都设置一个松弛因子,例如 0.75。

如果有帮助,这就是我的 FAS 剩余历史对于使用单个网格通过完整 7V 周期的泊松问题的样子。我相信松弛因子是 0.75,并且我使用 3 阶段 RK 方案作为平滑器,在每个网格级别进行一次迭代。

水库历史

如果您正在使用以顶点为中心的离散化,那么状态限制应该是注入,而不是您使用的全加权残差限制。也就是说,更换IhHI^hH限制状态时。对状态使用全权限制会产生状态高频分量的混叠,在应用后uhuh(uHIhHuh)导致与粗校正前相同尺度的新噪声(边界条件尤其可能是造成这种影响的罪魁祸首)。使用注射,I^hHuh,这个问题应该会消失。

光谱上,状态限制只需要高二级(准确保存低频),但一级(高频混叠)无关紧要。注入具有初级阶 0 和无限次阶。同时,剩余限制需要初级和次级顺序都是正的(至少)。请参阅Achi Brandt 的 Multigrid Guide 的第 4.3 节

在设计 MG 方法时,最好关注误差而不是残差,并确保适当地加权规范。

我现在解决了问题。我存储了uoldH=IhHuh在 V 周期中下降并在稍后重用时

uhuh+IHh(uHIhHuh)=uh+IHh(uHuoldH).

问题是在再次下降之前H2H,uoldH很放松的地方在放松步骤之前存储一份副本会有所帮助。自从uoldH仅在 FAS 中需要,它没有出现在线性计算中。