在超算机群上运行 OpenFOAM

有超算账号前,我觉得云计算简直就是 CFD 的未来,试用过超算后,发现这种需求10年前就被超算解决了。要论上手难度,各种平台的排序大概是:Windows 10 Subsystem for Linux > Linux物理机 > Windows+Linux 虚拟机 > 云计算服务器 > 超算。

举个例子好了,以下是 Compute Canada 官方支持的 OpenFOAM 版本,只需一条命令就可以配置好计算环境

➜  ~ module avail openfoam

--------------------------------- Global Aliases ---------------------------------
   allinea-cpu -> ddt-cpu    arm-forge-cpu -> ddt-cpu
   allinea-gpu -> ddt-gpu    arm-forge-gpu -> ddt-gpu

--------------------------- MPI-dependent avx2 modules ---------------------------
   openfoam/v1712 (phys)    openfoam/5.0        (phys)
   openfoam/3.0.1 (phys)    openfoam/6          (phys)
   openfoam/4.1   (phys)    openfoam/6.20180813 (L,phys,D)

  Where:
   L:     Module is loaded
   phys:  Physics libraries/apps / Logiciels de physique
   D:     Default Module

Use "module spider" to find all possible modules.
Use "module keyword key1 key2 ..." to search for all possible modules matching
any of the "keys".Code language: JavaScript (javascript)

此外,超算平台上的软件是非常全的,几乎不需要自己安装。比如我用 zsh 和 vim,只需两条命令就可以配置好 oh-my-zsh 和 spf-13-vim,完全不用担心没有 root 权限。htop 这种必备的系统监视工具自然也装好了,题图就是我在登录节点上运行 htop 的结果,这个节点使用双路 Intel E5-2683 v4,一共32个核心。

大多数超算使用 slurm 进行作业调度,这一系统也是非常简洁干净,很多情况下底层的东西都是透明的,可以像使用个人电脑那样,直接用 mpirun 调用几百几千个核心。看一个例子

#!/bin/sh

#SBATCH --time=00:01:00
#SBATCH --mem=2M
#SBATCH --job-name=serialTest
#SBATCH --output=job-%J.out
#SBATCH --account=def-phresher

echo "`pwd`"

cd $FOAM_RUN/damBreak || exit 1    # Run from this directory

blockMesh
setFields
interFoamCode language: PHP (php)

这就是一个基本的 bash 脚本,用来调用 blockMesh、setFields 和 interFoam。文件中 #SBATCH 开头的是作业调度系统 sbatch 的参数。这是一个串行程序,非常小,所以内存只申请了 2M。加拿大的超算对小用户非常友好,如果是天河二号的话,这样的串行程序非常浪费资源,因为天河二号上的作业会独占整个节点,哪怕这个作业是串行的。

近几天我将在 GitHub 更新更多的 sbatch 脚本和 OpenFOAM 测试算例,phresher/OpenFOAM_Tutorials_Plus,敬请 watch 和 star。

常恭

作者: 常恭

略懂 OpenFOAM

发表评论