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


9

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

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

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

下:üH:=0bH:=一世HHbH-大号HüH

上:üH:=üH+一世HHüH

和FAS使用

下:üH:=一世HHüHbH:=一世HHbH+大号H一世HHüH-一世HH大号HüH

上:üH:=üH+一世HHüH-一世HHüH

我的测试设置来自Brigg的“ Multigrid教程,第二版”,第1页。64,有分析解决方案

üXÿ=X2-X4ÿ4-ÿ2Xÿ[01个]2

使用典型的线性五点模具作为Laplace-operator L,该方程式为Lv = \ Delta u =:b。最初的猜测是v = 0大号v=Δü=:b大号v=0

使用v = 1的初始猜测将测试设置更改为琐碎的üXÿ=0,会导致几乎相同的收敛因子。v=1个

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

在LDC和FAS中都存在一个奇怪的行为,我无法解释,但这仅在初始猜测不好的情况下才会发生(例如但在我的完整多网格实验中,对新的精细网格进行插值会使残差从到):如果我将后校正松弛的数量增加到很高的数量,从而解决了在粗网格上的机器精度问题的解决方案,那么在向上移动时,几乎所有数字都将丢失到下一个细格。=010-1510-1个

由于图片比文字更能说明问题:

// 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)

我不确定每个周期是否只能获得几位数字,或者这是否表示在对精细网格进行插值时出现错误。如果是后一种情况,那么在始终使用2个弛豫时,LDC如何实现约0.03的账面剩余比率?

Answers:


7

我不直接知道您的答案,因为我主要使用FAS而不是校正,因为我针对非线性问题使用了多重网格,但是您可以考虑以下几点:

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

  • 考虑您的边界条件:确保您正确地执行了边界条件,并注意复杂的BC在粗网格上看起来可能完全不同,因此在那里进行的校正就没有太大用处了。

  • 仔细检查您对源词的处理方式;我记得在为泊松写那个词时,在与该词有关的延长阶段中搞砸了一些东西。

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

  • 另外,对限制和延长算子尝试一个松弛因子,例如0.75。

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

资源历史


感谢您的答复,线性大小写和简单BC(正方形边框= 0)只是第一步,在“简单”设置工作之后将测试实际用例。我不确定我是否理解放松和限制和延长时间的含义。我目前使用双线性插值法进行延长,使用半加权法进行约束。
Silpion

放松是指您的延长阶段将其更改为: üH:=üH+α一世HHüH-一世HHüH 哪里 0<α<1个是一个放松因素。通常,解决方案越复杂,所需的因素就越低。在具有很多不连续性的解决方案中,有时我不得不将其降低到0.6,但通常在0.75-0.85的范围内有效。
Aurelius

很高兴知道。在我的设置中,这只会减慢收敛速度1个-α但是在测试更复杂的数据时,我会牢记这一点。
Silpion

@Aurelius,您提到不必在粗网格上收敛。我同意您的推理,但是文献中的收敛性证明(对于线性情况)确实假设粗网格求解是精确的。我不知道有任何引用(对于线性或非线性情况),其中粗网格求解不应该是精确的,并且想知道是否可以为此引用一个引用?我会很感兴趣自己看到这个
Keeran Brabazon

@KeeranBrabazon我也没有这个参考,老实说,我对多网格的融合证明的细节不是很熟悉。我建议您寻找任何介绍该松弛因子的早期文献。我见过的所有现代多网格实现中都存在这个因素,并且从直觉上来说,如果有必要/期望确切的课程解决方案,则不需要此因素。为了直观地证明,我只是想象最粗糙的网格与最精细的网格的边界条件是什么样的。可以想象他们创建了截然不同的解决方案。
Aurelius

6

如果您使用的是以顶点为中心的离散化,那么状态限制应该是注入,而不是您所使用的完全加权残差限制。也就是说,更换一世HH一世^HH限制状态时。对状态使用全权重限制会产生状态高频分量的混叠,该高频分量在应用后üHüHüH-一世HHüH会导致产生与粗校正之前相同级别的新噪声(边界条件很可能是造成这种影响的元凶)。使用注射一世^HHüH,这个问题应该消失了。

从频谱上讲,状态限制只需要高阶次阶(准确保留低频),但是主阶次(高频混叠)并不重要。注入具有主阶0和无限次阶。同时,残差限制需要主序和次序都为正(至少)。请参阅Achi Brandt的Multigrid Guide的 4.3节。

在设计MG方法时,也可以着眼于错误而不是残差,并确保适当地权衡标准。


好点,我没有提到类似的东西。多重网格实际使用的一个重要方面是选择更平滑的方法:您想要一个可以尽可能快地消除高频误差的方法,它可以解决您所描述的问题。
Aurelius

@Aurelius从提供的日志中,您可以看到平滑器不是问题。回想一下,Silpion正在使用与缺陷校正MG相同的平滑器,该平滑器可以正确收敛。
杰德·布朗

感谢您链接到Brandt的《 Multigrid Guide》,在完成Brigg的《 Multigrid Tutorial》之后,我将彻底阅读它。我现在解决了这个问题(请参阅其他答案),但是我目前正在对状态和残差限制使用全权重。在我的设置中似乎无法使用注射,残留比率变为>0.8并且残留和误差L2范数都将很快停止下降。您有什么想法为什么注射失败?
Silpion

1

我现在解决了问题。我储存了üØdH=一世HHüH 在V周期内下降并在以后重新使用时

üHüH+一世HHüH-一世HHüH=üH+一世HHüH-üØdH

问题出在从 H2HüØdH放松到位。在放松步骤之前存储副本会有所帮助。以来üØdH 仅在FAS中需要,而在线性计算中未显示。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.