“域分解”求解器是一种占用内存较少的迭代算法。利用这一方法,我们可以计算那些无法通过其他直接或迭代方法求解的大型建模问题。此求解器主要在服务器集群上运行,也可在笔记本电脑和工作站中用于求解计算量很大的问题。让我们看看如何在
COMSOL Multiphysics® 软件中使用此功能。
探索 Schwarz 型域分解求解器
“域分解”求解器的原理是将空间域分解为多个相互重叠的子域。相比于求解初始问题,求解子域显得更加简单,同时这种并行的计算方式还能更为有效地利用内存。
为了详细说明迭代空间“域分解”求解器的基本概念,我们采用了一个椭圆型偏微分方程(partial differential equation,简称 PDE)表示域
D
,并将域内空间分割为
{Di}i
,如此全域便可以被子域
Di
的并集完整覆盖,即
D
=
UiDi
。通过这一方法便无需再在全域上求解 PDE,算法只需对每一个子域
Di
的若干问题进行迭代求解即可。
在 Schwarz 型域分解方法中,通过子域间相互重叠的部分,即支撑区域来实现子域间的数据传递。在子域之间的界面上,相邻子域的解会被用来更新当前子域的解。举例来说,如果子域
Di
与一条边界相邻,那么它会使用此边界条件。为了加速收敛,迭代的域分解过程通常与较粗化网格上的全局求解器(指多重网格中的“粗化求解器”)配合使用。
由正三角形网格构成的二维域,其中域的自由度被分解为二次子域。
在演示如何分解空间域时,我们采用了二维正三角形网格。为简单起见,我们使用了线性有限元形函数,其自由度位于三角形单元的 3
个节点上。域(确切来说是它的自由度)被分解为多个二次子域,每个子域由 25 个自由度组成。所有内部子域均有 8
个相邻子域,且每个自由度与单个子域是一一对应的关系。单个子域中线性单元函数支撑的区域与其相邻子域的支撑区域重叠。
蓝色子域的线性单元函数的支撑区域。
为了提升迭代过程的收敛速度,我们需要引入更多的自由度,用于计算子域间大面积的重叠区域。如此一来,在迭代过程开始收敛之前,子域之间的耦合将变得更加高效,同时迭代次数也会降低。但由于子域面积变大,设置和求解阶段的内存使用量与计算量均会有所增加。
如果需要使额外重叠的宽度增大到 1,可以在现有的子域中额外添加一层自由度。在此案例中,我们向蓝色子域中添加了 22 个自由度(标记为蓝色矩形)。进而相应地增大了蓝色子域的支撑区域。
红、绿、黄三色子域的设置使用了同样的方法。在由此建立起来的子域配置中,一些自由度只属于某一个子域,而其他的自由度可能被两个、三个甚至四个子域共享。很明显,如果一个相邻子域对解进行了更新,被共享的自由度将随之变化。
扩展后拥有 47 个自由度的子域及其支撑区域。相邻子域会共享额外添加的 22 个自由度。
已知(参考文献 1)子域
Di
内的子域若干问题的迭代解,会逐渐收敛于全域
D
内的原始问题的解。考虑到这一点,我们可以通过以下方式获取全局解:保持其他域不变,单独对每一个子域问题进行反复求解,直到满足收敛标准。粗网格问题的方法能大大提高收敛速度。由于粗网格问题在全域
D
中进行求解,因此我们可以通过它大致估计
D
内细网格的解。此外,它还能更加迅速地传递全局信息。该方法的收敛速度取决于粗化网格单元的大小与细化网格上重叠区域的宽度之比。
当计算特定的子域
Di
时,相邻子域需要对
Di
的支撑区域相邻的自由度进行更新。关于如何处理子域重叠域全局粗网格的解,COMSOL Multiphysics 提供了四种方法。在域分解设置中,我们可以将选择器求解器 设置为加法 Schwarz、倍增 Schwarz(默认)、混合 Schwarz 与对称 Schwarz。在加法
Schwarz 方法中,子域之间不发生数据交换,在所有子域计算出全部结果之后,所有受到影响的自由度将同时更新。在这类方法中,子域解的排列顺序是任意的,并且子域在求解阶段相互独立。
倍增 Schwarz 方法与之相反:每个子域的求解完成之后,该方法将对相邻子域的重叠区域内的相关自由度进行更新。这种方式往往能加速迭代求解过程。然而,由于该方法中子域的解不再相互独立,因此我们需要额外指定子域的求解顺序。
至于混合 Schwarz 方法,它会先求解全局求解器的问题,再对解进行更新。随后在同一时刻对子域问题进行求解,这一点与加法 Schwarz 求解器相同。之后,该方法将再一次更新解,并第二次对全局求解器问题进行求解。对称 Schwarz 方法的机制类似于倍增 Schwarz 全局求解器问题求解器,它会按照给定的顺序求解子域问题,只不过将通过对称方式来实现。
直接求解器和预处理迭代求解器
与带有预处理器的迭代求解器相比,直接线性求解器通常更加稳定,且无需过多地调节物理场设置。然而,基于内存方面的考虑,直接求解器无法处理计算量较大的问题。通常情况下,迭代求解器对内存的需求较少,但是由于资源限制,它仍无法对某些模型进行求解。在之前发布的文章中,我们讨论了求解大型模型时的内存需求。由于系统矩阵的具体特性,迭代求解器中的其他预处理器也无法解决此类问题。在很多情况下,域分解预处理器比其他类型的预处理器需要的调节操作更少。
在可用内存有限的情况下,可以将求解过程转移到拥有大量内存的服务器集群。由于“域分解”求解器可以同时执行更多任务,因而我们可以使用域分解预处理器,并根据原始求解器的设置来设定域求解器。正如我们将要看到的,“域分解”求解器也可用于“重新计算并清除”模式,即使在工作站中运行求解器,也能看到内存占用显著降低。
若您不想额外添加粗化网格来构建全局求解器,还可以使用代数方法来进行求解。与“使用粗化级别”的“几何”选项相比,代数方法会增加 GMRES 迭代次数,但其优点在于:它采用最细化级别的系统矩阵来构建全局求解器,而不是通过额外添加较粗化的网格。额外的粗化网格不仅耗费内存,甚至可能根本无法生成;使用了“代数”选项后,我们便可以免去这样麻烦。
在集群上运行域分解预处理
在集群上,我们可在单个节点(或可用节点的单个子集上)上求解子域问题。我们可以通过设置“域分解”求解器来控制子域大小,由此也确定了每个节点占用的内存。加法 Schwarz 求解器能够同时对所有节点上的全部子域问题进行求解。之后在求解器外迭代的最后阶段,对子域界面上的解进行更新。