我一直在研究非结构化方法的有限元代码,我使用 Schur 补码方法对其进行了并行化。以下是我如何做到的摘要:
- 将网格的每个三角形分配给一个域
- 对于每个节点,确定它在哪个域中或是否在人工边界上
- 向每个处理器发送它的网格部分——它拥有的三角形以及它拥有的任何节点,即使它与其他域共享这些节点
- 在每个处理器上并行构建矩阵
- 解决一些问题,使用某种方式在处理器之间交换节点数据
我正在求解椭圆 PDE 的拟线性系统,因此每个线性求解只是 Picard 方法的迭代。特别是,我需要在每一步更改刚度矩阵的条目,因为它取决于解的梯度。(矩阵的非零结构不会改变。)
这一切都很好。但是,它与我看到的通常方法不一致。
我的代码在进程之间划分了三角形,其中一些必须共享节点。这意味着额外的存储空间,但刚度矩阵的条目可以完全并行填充。另一方面,像 PETSc 和 METIS 这样的库将所有节点划分为不相交的集合,并将它们与刚度矩阵中的相应行一起发送到每个过程。但是,您必须进行沟通以填充刚度矩阵。
那么:为什么大型科学图书馆对划分节点而不是元素有明显的偏好?我错过了什么吗?