【OpenCFD学习】超算上运行OpenCFD

环境配置

超算:并行云:济南超算
Makefile编译:只加载intel编译器及其mpi模块,其他不动,不然makefile报错

source /es01/paratera/parasoft/module.sh # 加载module命令
module load mpi/intel/17 # 加载intel编译器及其对应mpi环境

程序编译

  • 版本opencfd2d-1.5.5
  • unzip解压缩,进入对应目录,make编译,正确加载module时编译不报错,opencfd2d-1.5.5.out即为可执行文件。
  • ./util/目录:常用工具
文件名作用
Jac2d-v1.1.f90读入 PLOT3D 格式的网格文件,生成 opencfdsc 格式的网格文件
init2d-freestream-1.1.f90用来流值生成初值
read-flow2d.f90读入opencfd-sc格式流场,输出tecplot 格式流场
read-flat2d.f90
init2d-tunnel.f90

应用实例

  • 示例文件sc2d/cylinder/,二维圆柱绕流, M a = 1.5 Ma=1.5 Ma=1.5 R e = 1 0 4 Re=10^4 Re=104
  • opencfd2d.in:控制文件
  1. 编译并运行 mesh-cylinder-sc2d-1.0.f90 生成网格,得到网格文件mesh2d.dat
mpif90 mesh-cylinder-sc2d-1.0.f90 -o mesh-cylinder # 编译
./mesh-cylinder # 运行
  1. 编译并运行 Jac2d-v1.1.f90 生成Jocabian变换数据(需要输入flag=1,nx=101, ny=400),得到OCFD2d-Jacobi.datgrid-tec.dat
mpif90 Jac2d-v1.1.f90 -o Jac2d
./Jac2d
  1. 编译并运行 init2d-freestream-1.1.f90 生成初值(需要输入nx=101, ny=400,攻角0)
mpif90 init2d-freestream-1.1.f90 -o init2d-freestream
./init2d-freestream
  1. ln –s flow2d0.dat opencfd2d.dat,创建软链接
  2. opencfd2d-1.5.5.out复制到当前路径,mpirun –n 16 ./opencfd2d-1.5.5.out。超算提交作业见下文。
  3. 后处理:
    opencfd2d.dat由初值文件重新链接为所需时刻的文件
rm opencfd2d.dat
ln -s OCFD2d-0100000.dat opencfd2d.dat

编译并运行 read-cylinder.f90 生成 tecplot 格式的流场文件flow2d.dat, 可用 tecplot 绘图。

ifort read-cylinder.f90 -o read-cylinder # mpif90可能句子太长会报错
./read-cylinder

contour

超算命令

登录节点仅供编译软件、 拷贝数据,勿在登录节点运行程序。

命令功能
lfs quota -uh $USER ~ 查看存储情况
sinfo系统资源使用
squeue作业运行状态
srun -p 分区交互式提交作业,有屏幕输出,受网络波动影响
sbatch -p 分区后台提交作业
scancel取消已提交的作业
scontrol查看正在运行的作业信息
sacct -D -X -j jobnum查看历史作业信息

提交作业

1. sbatch + mpirun

编写脚本文件cylinder.sh-n指定进程数,一般希望是单结点核数56的整数倍,但是要和程序所需的核数匹配,见opencfd2d.in

#!/bin/bash
#SBATCH -N 1
#SBATCH -n 16
mpirun -n 16 ./opencfd2d-1.5.5.out

这边用mpirun可以正常运行,但是mpirun虽然-n 16,但是scontrol show jobsacct -D -X -j jobnum查看作业的话只分配了一个核。原因是#SBATCH中间不能有空格,不能写成# SBATCH
命令行提交脚本作业,-p指定分区。

sbatch -p G1Part_sce cylinder.sh

sbatch默认输出日志为提交目录下的slurm-xxx.out文件,tail -f slurm-xxx.out实时查看日志。

2. 直接srun提交

而用srun会报MPI相关错误。

$ srun -p G1Part_sce -N 1 -n 16 opencfd2d-1.5.5.out
Fatal error in MPI_Init: Other MPI error, error stack:
MPIR_Init_thread(805).....: fail failed
MPID_Init(1832)...........: channel initialization failed
MPIDI_CH3_Init(126).......: fail failed
MPID_nem_init_ckpt(836)...: fail failed
MPIDI_CH3I_Seg_commit(427): PMI_KVS_Get returned -1
......

原因可能是srun对Intel MPI的调度问题。Intel MPI支持pmi2,所以加--mpi=pmi2即可调用多核。

$ srun --mpi=list
srun: MPI types are...
srun: openmpi
srun: pmi2
srun: none
$ srun --mpi=pmi2 -p G1Part_sce -N 1 -n 16 opencfd2d-1.5.5.out

3. sbatch + srun

但是--mpi=pmi2选项放到.sh文件后运行sbatch仍不行。设置PMI库的环境变量

$ echo $I_MPI_PMI_LIBRARY
/usr/lib64/libpmi.so
$ export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi2.so

sbatch.sh文件中使用srun调用mpirun,但仍无法运行。

#!/bin/bash
#SBATCH -N 1
#SBATCH -n 16
srun -n 16 opencfd2d-1.5.5.out

在把PMI这个变量改回去就可以了,很怪,但是实验2次都是这样。

$ export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi.so
$ sbatch -p G1Part_sce cylinder.sh

参考:

https://stackoverflow.com/questions/62502324/job-fails-while-using-srun-or-mpirun-in-slurm
https://slurm.schedmd.com/mpi_guide.html#intel_mpi
https://hpclib.com/hpc/Scheduler/Slurm/mpi_guide.html


注意:设置的核数需要和控制文件中需要的核数npx0*npy0相同,不然报错

srun: error: nable to create step for job 11412745: More processors reuested than permitted

参考

http://pan.baidu.com/s/1slfC5Yl
OpenCFD使用手册、理论手册
《OpenCFD2d教学示例》
《并行科技用户济南超算使用手册》

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值