具有 LBB 稳定单元的混合有限元公式需要两个不同的网格用于主要变量和约束变量,例如位移和压力。随着压力场的连续逼近,我发现分布式内存架构很难并行化。
我有兴趣学习一些针对此类问题的常用并行化策略。我非常感谢有关此主题的任何有用资源。
请注意,我使用 PETSc 库在我的 C++ 代码中求解矩阵系统。
具有 LBB 稳定单元的混合有限元公式需要两个不同的网格用于主要变量和约束变量,例如位移和压力。随着压力场的连续逼近,我发现分布式内存架构很难并行化。
我有兴趣学习一些针对此类问题的常用并行化策略。我非常感谢有关此主题的任何有用资源。
请注意,我使用 PETSc 库在我的 C++ 代码中求解矩阵系统。
您需要两个不同的网格是一种误解:查看事物的正确方法是您使用相同的网格,但两个变量的多项式空间不同。例如,对于斯托克斯方程,您将有速度的二次多项式和压力的线性多项式。
然后适当的并行化策略是在处理器之间划分网格。这也导致了自由度的划分,因此导致了每个处理器存储的矩阵(和向量元素)的那些行。这实际上与您遇到标量问题没有什么不同。
你不喜欢有两个或更多不同的网格,不同的分区。这将进行大规模的沟通。多个域的自由度在邻接树中应尽可能接近,以使处理器间的通信降至最低。
您有一个网格,但您有与不同实体相关联的自由度,例如,对于 H1 空间,分段线性连续的自由度在节点上,而 L2 空间的自由度,价格线性不连续,自由度在单元格上。对于简单的情况,对于向量空间,如 H-div 或 H-curl,事情要复杂一些。对于核心,例如分层空间,您可以在顶点、边、面和单元格上设置自由度。
所以你划分单元格。分区表皮上的子实体,即节点、边、面是共享的。共享实体上的自由度通常由具有较低等级的分区拥有。在其他分区上,共享实体上的自由度是所谓的幽灵自由度。您可以使用幽灵自由度创建特殊矢量;你在 PETSc 中有这样的向量。
要对单元格进行分区,您需要构建一个图;那么你可以使用metis,或者参数来对它进行分区。就其本身而言,您有许多关于如何对图进行分区的策略。您也可以以不同的方式构建图表。您可以通过单元格编号来完成,然后通过桥实体查找相邻单元格来制作相邻矩阵。桥实体可以是节点、边或面。对于经典 FEM,您将使用桥接邻接实体作为顶点。对于 H-div - L2 制定桥邻接实体应该面对。因为对于 H-div 空间,自由度在面(和体积)上。当您使用 H-curl 空间时,桥邻接实体将是一条边。对于不连续的 Petrov-Galerkin,桥邻接实体将在面上,因为自由度在骨架上。
此外,如果您采用异质近似顺序,则每个单元格都可以具有权重。这是负载平衡所需要的,以便在处理器之间平均分配工作。
最后,有很多解决方案,很多策略。
但是为什么要自己做呢,我可以给你指点 FEM 代码,它为你做这一切。