FEM 计算的并行化

计算科学 有限元 并行计算
2021-12-19 06:42:43

我需要进行一些 FEM 计算,我想知道并行化是否是一个好主意。问题是我的模型不是特别大,所以在我的笔记本电脑上解决一个问题需要几秒钟。但是我需要进行优化(有很多不同的几何参数要测试),所以我需要多次运行求解器来处理略有不同的几何模型。据我所知,大多数可用的免费软件(Elmer、Fenics、OpenFOAM 等)只有在将域划分为子域之后才能启用并行计算。以这种方式,为单独的子域组装矩阵和求解方程组是单独处理器/内核的任务。我怀疑现阶段的并行化是否会补偿开销。

问题1:我的想法正确吗?

因为最终会有很多计算(不同的参数,不同的频率),我认为某种并行化毕竟是有益的。我正在考虑在其他语言中嵌入 FE 代码,以便在更高级别上为单独的任务进行并行拆分。

问题 2:这个工作流程是否正确?有没有更好的方法?

问题 3:如果没有更好的方法,那么做这些事情的首选语言是什么?Python?C?还有什么?我正在考虑将 Elmer 用于 FE 的东西,但我还没有决定。

我主要在 Octave/Matlab 中编程,之前从未编写过并行程序,所以我在这个领域没有足够的经验。不幸的是,我没有足够的时间自己做实验,所以我非常感谢您的提示。

1个回答

由于您的计算只需要几秒钟,因此并行化 FEM 计算本身几乎没有任何好处。但是由于您需要进行许多单独的模拟,您可以并行化该部分。您可以并行运行模拟,而不是串联运行每个模拟每个可用内核进行一次仿真。

Python 是处理流程的好选择。我最近不得不实现类似的东西。subprocess 包非常方便。

import subprocess

# parallel process
processes = []
for i in range(0, N):
    command = "yourCommand"
    processes.append(subprocess.Popen(command, shell=True))
    print("process started: ", command)
for p in processes[:]:
    processes[i].wait()
print("done.")

上面的代码并行启动 N 个进程并等待所有进程完成。