Skip to content

CGFDM

代码介绍

CGFDM简介

曲线网格坐标系有限差分方法(CGFDM)克服了传统有限差分方法仅能用于规则区域的限制,能够成功进行复杂地形下的地震模拟,在神威·太湖之光以及新一代神威超级计算机上成功进行了千万核的大规模并行,模拟了汶川地震与土耳其地震,相关工作发表在SC18以及SC23上。

相关论文

B. Chen et al., "Simulating the Wenchuan Earthquake with Accurate Surface Topography on Sunway TaihuLight," SC18: International Conference for High Performance Computing, Networking, Storage and Analysis, Dallas, TX, USA, 2018, pp. 517-528, doi: 10.1109/SC.2018.00043.

Wubing Wan, Lin Gan, Wenqiang Wang, Zekun Yin, Haodong Tian, Zhenguo Zhang, Yinuo Wang, Mengyuan Hua, Xiaohui Liu, Shengye Xiang, Zhongqiu He, Zijia Wang, Ping Gao, Xiaohui Duan, Weiguo Liu, Wei Xue, Haohuan Fu, Guangwen Yang, Xiaofei Chen, Zeyu Song, Yaojian Chen, Xin Liu, and Wei Zhang. 2023. 69.7-PFlops Extreme Scale Earthquake Simulation with Crossing Multi-faults and Topography on Sunway. In Proceedings of the International Conference for High Performance Computing, Networking, Storage and Analysis (SC '23). Association for Computing Machinery, New York, NY, USA, Article 10, 1–15. https://doi.org/10.1145/3581784.3613209

Wenqiang Wang, Zhenguo Zhang, Wenqiang Zhang, Houyun Yu, Qi Liu, Wei Zhang, Xiaofei Chen; CGFDM3D‐EQR: A Platform for Rapid Response to Earthquake Disasters in 3D Complex Media. Seismological Research Letters 2022;; 93 (4): 2320–2334. doi: https://doi.org/10.1785/0220210172

Wan, J., Wang, W., and Zhang, Z.: The optimization with half-precision floating-point numbers for 3-D seismic simulation based on the curved grid finite-difference method, EGU General Assembly 2023, Vienna, Austria, 24–28 Apr 2023, EGU23-15141, https://doi.org/10.5194/egusphere-egu23-15141, 2023.

仓库结构

Source

本目录为代码对应目录,其中关心的主要函数为:

  • run.cpp: 初始化地震介质模型与地形等相关信息,调用propagate函数
  • propagate.cpp: 进行弹性波波场的初始化工作,并包含偏微分方程主体时间循环迭代部分
  • wave_deriv.cpp: 根据曲线网格坐标系有限差分方法计算波场变量的时间导数
  • freeSurface.cpp: 根据牵引力镜像法处理波场到自由表面时的边界条件
  • pml_deriv.pp: 为了模拟无限的地下空间设置的人工吸波层,防止地震波传播到边界后非自然反弹
  • wave_rk.cpp: 根据波场的时间导数进行时间上4阶Runge-Kutta积分迭代

Case-Ricker

本目录为一个简单的测试用例,用于检查实现是否有误,同时可以以相对较低规模和代价测试优化策略,重要文件有:

  • params.json: 存储了波场模拟的相关参数
  • plotXY.py, plotXZ.py: 绘制XY平面以及XZ平面波场快照
  • RunDir/runCGFDM: 运行模拟软件的脚本,通过sbatch提交
  • bin/: 存储软件的可执行文件等
  • LogDir/: 保存了运行时输出的信息
  • CompareData/: 保存了软件的输出

Case-Wenchuan

本目录为一个1050x1000x200的中等规模汶川地震模拟用例,为最终的比赛测试用例,基本文件夹结构与Ricker相同,多出如下内容需要注意:

  • params_large.json: 2100x2000x400的模拟规模测例,作为奖励项
  • TerrainDir/: 存储地形相关模型文件
  • plotPGV.py: 绘制地震烈级图的脚本

运行程序

编译

进入Source目录,看到Makefile如下:

GPU_CUDA := #是否使用GPU,为否


LayerMedium := ON #默认打开


FREE_SURFACE := ON #是否开启自由表面边界条件
PML := ON #是否设置边界吸波层
SOLVE_DISPLACEMENT := ON #默认打开

CFLAGS := -c -O2 -std=c++11 #编译选项,可调
LFLAGS := -O2

GCFLAGS := 

SRCDIR := src_ #源文件目录
DSTDIR := ../Case-Wenchuan #目标测例文件夹

若希望编译软件至汶川测例,则将DSTDIR设置为../Case-Wenchuan运行make clean && make即可,一种可行的编译环境如下

module load compilers/gcc/v12.2.0
module load mpi/openmpi-gcc12/v4.1.4

运行Ricker测例

params.json文件关键信息如下:

    "TMAX": 120.0, //模拟时间
    "DT": 7.6e-3, //离散时间间隔
    "DH": 300.0, //空间网格点间距
    "NX": 1050, //X方向网格点数量
    "NY": 1000,
    "NZ": 200,
    "Depth(km)": 60, //模拟深度
    "centerX": 525, 
    "centerY": 500,
    "IT_SKIP": 500, //保存波场快照时间隔迭代步数
    "sliceX": -1, 
    "sliceY": -1,
    "sliceZ": 199, //保存XY平面波场快照的z轴坐标,-1为不需要保存
    "sliceFreeSurf": 1, //保存自由表面处的波场快照
    "PX": 20,  //X方向进程数量
    "PY": 20, 
    "PZ": 6,
    "sourceX": 525, //Ricker震源的X坐标,若为破裂震源(汶川)则此参数无意义
    "sourceY": 500,
    "sourceZ": 199,

仅PXPYPZ允许修改

直接运行sbatch RunDir/runCGFDM3D即可

波场快照(python3 plotXZ.py)的参考结果如下:

迭代步=500:

CGFDM3DVx_500

迭代步=1000:

CGFDM3DVx_500

迭代步=1500:

CGFDM3DVx_500

运行汶川测例

(若想进行大规模测试,则将params.json改为params_large.json即可)

将params.json中TerrainTif一项修改为/WORK/sccomp/wenchuandata/terrainTif

将params.json中TerrainDir一项修改为本地自定义目录

将params.json中source一项同样修改为/WORK/sccomp/wenchuandata/中对应子目录

将群文件的MediumDir.tar.gz解压放入自己目录并修改params.json中对应位置

运行python3 transTif2Bin.py得到处理后的地形数据

运行sbatch RunDir/runCGFDM3D

运行结束后可通过python3 plotPGV.py得到地震灾害分布图

运行结果的参考结果如下:

(python3 plotXY.py)迭代步=4000:

Vy_4000

迭代步=8000:

Vy_4000

迭代步=12000:

Vy_4000

PGV:

PGVh

优化提示

多线程+多进程混合并行、进程级任务负载划分、可尝试混合精度方法