二维全波形建模和反演(TOY2DAC)
1. 背景
全波形反演指利用非线性寻优方法反演给定时窗内的波形记录以获取影响地震波传播的相关物性参数(如弹性参数、粘弹性参数、各向异性参数、密度等)的方法。
就是利用波场模拟和实际地震资料对比,通过多次迭代使预测波场和实际地震资料匹配一致,求取地下地质参数的一种地震反演方法。
从数学上来看,是要建立模型与现有地震数据的非线性关系,一般运用动力学知识。
TOY2DAC只包括各向同性的频域建模和反演
2. Package include
- bin 编译后的二进制文件
- doc 说明文档
- include 编译期间包含的文件
- src 所有的源代码,用Fortran语言和并行MPI指令编写
- 0README 包含说明如何运行代码的内容
3. 环境
Fortran语言和C语言编译器
MUMPS库:大型稀疏LU矩阵分解,同时该库需要安装METIS库
MKL库:计算标准顺序和并行线性代数问题
ATLAS库:矩阵线性代数运算库
4. 编译
- Makefile.inc文件包含的变量:CC,FC,FL分别是C语言编译器,Fortran语言编译器和链接调用;OPTF,OPTC,OPTL,OPTFF分别是调用Fortran编译,C编译,链接和Fortran90编译;OPT_PRE是预处理标志,只有设置标志才能实现双精度编译;INC是代码所有路径;LIB定义了库,ETX定义了二进制名称末尾扩展名。
- Makefile文件里面的变量全部定义完成后,只需make命令就可以完成编译工作
5. 理论
TOY2DAC从一个从猜测的m0初值开始,为了解决下式最小值的问题
公式(1)- m表示待恢复的地下参数 - S表示数据集的总数 - ds表示第s个数据集 - us(m)是频域波传播问题的解 - R是将波场us(m)映射到接收机位置的约束算子
公式(2)
- A(m)表示二维频域声学(an)各向同性波传播算子
在各向同性的情况下,上式被写作:
公式(3)w是角频率 vp(x)是压力波速度 p(x)是密度
在这种情况下,地下参数m可取以下的值:
1. vp(x):压力波速度的单参数反演 2. ρ(x): 密度的单参数反演 3. [vP (x),ρ(x)]集合:压力波和密度的多参数反演
5.1 正演问题
- 正演问题包含在公式2中
- TOY2DAC实现了一种四阶离散化方案
- 公式2相当于一个稀疏的大规模线性系统的解
- 当数据集变大时,只需要一个LU分解,S线性方程组可以通过正代和反代来求解
5.2 反演问题
反演问题基于一个局部下降函数
公式(4)αk是一个通过线性搜索的比例参数
∆mk为下降方向
这个下降方向取决于优化算法的选择,最基础的选择如下所示:
公式(5)
TOY2DAC实现的是截断式牛顿迭代法
5.3 频域选择问题
- 高效cpu频率域FWI通常是通过单个频率的连续反转来实现的,即从低频率到高频率
- 这定义了一个多分辨率框架,减轻了与高频跳周期人工制品相关的反问题的非线性。
- 高效cpu算法可以通过选择少量的粗采样频率来设计,这样可以减少频率和孔径角密集采样产生的波数冗余。
- TOY2DAC包含一个简单的框架,它只运行一组频率。如果需要多个组,TOY2DAC必须启动几次。
6.频域有限差分建模引擎的输入文件
6.1 介质参数文件
介质参数文件是包含介质物理属性的二进制文件(直接访问简单精度实数)。它是建模模式下的仿真介质或反演的起始模型。文件的名称应该放在输入文件中。包含的参数有:
各向同性粘声模拟的纵波速度、纵波质量因子、密度
这些文件应该包含nz×nx的值
6.2 acquisition文件
- 它是一个ASCII码文件,文件的格式如下:
- 第一列和第二列是z轴和x轴坐标,三四列用不到,第五列表示来自源还是接收器
6.3 mumps input 文件
这个文件是允许管理一些MUMPS处理器的优化选项,一共四个参数:
icntl 7:选择MUMPS中的排序算法,一般默认7
icntl 14:优化松弛因子,在4.9以后的版本就不用了
icntl 23:确定每个MPI进程上允许存储LU因子的表的大小
keep 84:一般取最大值16
6.4 toy2dac_input文件
- 优化该项目的主要文件
mode of the code:选择模式,一般就是1,FWI
forward modeling tool: 模式1提供各向同性介质的频域有限差分,模式2在TTI各向异性介质中提供了一个频域有限差分
acquisition:接收文件的名称
6.5 fdfd input文件
优化频域有限差分建模引擎的文件
nz,nx 是坐标
h 是步长
file name是各向同性输入模型文件的名称
pml tunning: pml振幅的值。取90一般
free surface是在介质顶部附加一个自由表面边界条件的附加参数
itypes为震源类型:爆炸(0)或垂直力(1)。ityper为接收机类型:水听器(0)(或垂直检波器(1),但尚未实现)。这个选项只有在使用Hicks插值时才有可能
slaplace是拉普拉斯常数,即。,用于随时间指数衰减地震波场的频率虚部
6.6 freq management文件
- 管理频率
- 第一行表示仿真或FWI频率组中涉及的频率数
- 第二行表示频率列表
7运行TOY2DAC
7.1输出文件在建模模式下
主要输出文件为接收端数据(复值频域)。接收机位置频域内的数据文件通常称为:data_modeling。这是一个直接访问二进制文件。这些文件的顺序如下:
data_bloc_frequency_1 data_bloc_frequency_2 … data_bloc_frequency_N
其中N号是由用户在文件freq management中的,
对于每个频段组数据块data_bloc_frequency_i,数据排序如下:
data_bloc_source_1 data_bloc_source_2 … data_bloc_source_L
最后,对于每个源块,数据排序如下:
data_receiver_1 data_receiver_2 … data_receiver_K
如果每个源有相同数量的接收方,可以使用
ximage < data_modeling n1=2*nrec 查看
其中nrec = 接收机数量。
7.2输出文件在FWI模式下
输出文件如下:
这里是列表文本输出日志的标准输出,其中包含几个信息,特别是在问题的情况下…;
invparinter : 包含反演过程中的所有中间模型。注意,注意,在用于反演的参数化过程中,模型是按顺序存储的;
invparfinal :包含用于反演的参数化的最终模型;
param XX inter : 包含所有按顺序存储的中间模型,用于参数XX。在各向同性中,XX代表vp、rho和qp;在各向异性中,XX是vp、rho、qp、epsilon、delta和 theta;
param XX final : 包含参数XX的最终模型。在各向同性中,XX代表vp、rho和qp;在各向异性中,XX是vp、rho、qp、epsilon、delta和 theta;
iterate *.dat : 包含收敛信息的优化例程输出日志。
文件invparinter, invparfinal, param XX inter和param XX final可以用一个ximage命令来查看:
ximage < param_vp_final n1=101
其中101是 nz 的大小。
8.示例
本部分介绍了TOY2DAC包中两个可用的模型。这些模板同时考虑了FWI(全波形反演)和建模问题。
高斯扰动模型
这个迷你模型非常适合是在用户平台上测试代码,因为它可以在几分钟内运行,并且只需要较小内存。它还可以让用户理解:为其预期结果,FWI在一个简单的类似于boxcard的配置是怎样工作的。此模型由1个目录组成:”run ball template”.
该目录包括了run ball模板包含在模式0下运行TOY2DAC所需的文件,以便计算同质背景下的频域数据和在V_P中有1个周期异常。一旦TOY2DAC编译完成,模型可以通过以下不同的操作来运行:
创建一个本地副本(以保持模板目录干净…)
介质的描述在”vp_ball,qp 和 rho“中。用户可以以ximage的形式绘制他们。例如:(这条指令官方给的不全)
1
ximage < vp_ball n1=101 d1=20 d2=20 label1=’depth in m’ label2=’distance in m’ &
查看输入文件后,检查文件”fdfd_input”的“vp_ball qp rho”和在”toy2dac_input”文件中的“mode=0”,然后用户可以运行模型。例如:
1
mpirun -n 4 ../bin/toy2dac
程序结束后(在4个处理器上所用时间为几秒钟),“观察到的数据“存储在文件”data_modeling “中,可以用于反演。
然后用户可以运行FWI程序:
- 介质的笛卡尔描述在文件”vp_homogeneous,qp and rho. “中。用户可以使用ximage来绘制它们。例如:(这条指令官方给的不全)
1 | ximage < vp\_homogeneous n1=101 d1=20 d2=20 label1=’depth in m’ label2=’distance in m |
查看输入文件后,检查文件”fdfd_input”的“vp homogeneous qp rho” ,观察到的数据文件在”fwi_input” 的第一行被设置为“data modeling”, “toy2dac_input”文件的“mode=1”,,然后用户可以运行模型。例如:
1
mpirun -n 4 ../bin/toy2dac
程序结束后(在4个处理器上所用时间为几分钟),用户可以查看最终的模型。例如:(这条指令官方给的不全)
1
2ximage < param_vp_final n1=101 d1=20 d2=20 label1=’depth in m’ \\
label2=’distance in m’ &其他二进制文件(中间文件等)也可以在文件terateXXX.dat中查看,其中XXX取决于所选择的优化方法。
Marmousi 模型
这个模型是一个简单的地球物理配置,并且在几分钟内就可以运行。此模板由1个目录组成”run marmousi template “
该目录包含在模式0中运行TOY2DAC所需的文件,以便在真正的marmousi模型中计算频域数据。一旦TOY2DAC编译完成,模型可以通过以下不同的操作来运行:
创建一个本地副本(以保持模板目录干净…)
介质的描述在”vp_Marmousi_exact,qp 和 rho“中。用户可以以ximage的形式绘制他们。例如:(这条指令官方给的不全)
1
ximage < vp_Marmousi_exact n1=141 d1=25 d2=25 label1=’depth in m’ label2=’distance in
查看输入文件后,检查文件”fdfd_input”的“vp_Marmousi_exact l qp rho”和在”toy2dac_input”文件中的“mode=0”,然后用户可以运行模型。例如:
1
mpirun -n 4 ../bin/toy2dac
程序结束后(在4个处理器),“观察到的数据“存储在文件”data_modeling “中,可以用于反演。
然后用户可以运行FWI程序:
介质的笛卡尔描述在文件”vp_Marmousi_init ,qp and rho. “中。用户可以使用ximage来绘制它们。例如:(这条指令官方给的不全)
1
ximage < vp_Marmousi_init n1=141 d1=25 d2=25 label1=’depth in m’ label2=’distance in
查看输入文件后,检查文件”fdfd_input”的“vp_Marmousi_init qp rho” ,观察到的数据文件在”fwi_input” 的第一行被设置为“data modeling”, “toy2dac_input”文件的“mode=1”,,然后用户可以运行模型。例如:
1
mpirun -n 4 ../bin/toy2dac
程序结束后(在4个处理器上所用时间为几分钟),用户可以查看最终的模型。例如:(这条指令官方给的不全)
1
2ximage < param_vp_final n1=141 d1=25 d2=25 label1=’depth in m’ \\
label2=’distance in m’ &其他二进制文件(中间文件等)也可以在文件terateXXX.dat中查看,其中XXX取决于所选择的优化方法。
Ubuntu设置和查看环境变量
查看环境变量有三个命令
env
env
命令是environment
的缩写,用于列出所有的环境变量export
单独使用
export
命令也可以像env
列出所有的环境变量,不过export
命令还有其他额外的功能echo $PATH
echo $PATH
用于列出变量PATH
的值,里面包含了已添加的目录
1 | <basedir> = /public/home/daizy_ or /public/home/pabebe/software/ |
安装intel编译器
下载网址:https://software.intel.com/en-us/qualify-for-free-software/student
安装包名:parallel_studio_xe_2020_update1_cluster_edition.tgz
参考:https://www.jianshu.com/p/d5895e1f836f
安装方法:
1 | tar -xzvf parallel_studio_xe_2020_update1_cluster_edition.tgz |
1 | cd ~/software/parallel_studio_xe_2020_update1_cluster_edition_online |
注意事项:1.该安装包中包含了Intel MKL,icc,impi的安装,无需进行这些库的另外安装
2.学生可用学校邮箱申请免费安装包,申请后1~2天会收到含有激活码的邮件。
3.无学校邮箱也可直接下载付费安装包,可以免费试用30天
安装parmetis
安装包名:parmetis-4.0.3.tar.gz
安装方法:
1 | tar -xzvf parmetis-4.0.3.tar.gz |
1 | #我的 |
安装scotch
下载网址:https://gforge.inria.fr/projects/scotch
安装包名:scotch_6.0.9.tar.gz
参考:https://blog.nickwhyy.top/scotch/
安装方法:
1 | 确认编译环境 |
编译scotch时的makefile.inc文件
1 | EXE = |
编译ptscotch时的makefile.inc文件
1 | EXE = |
bug
can’t find -lirc
导入他们自带的intel环境(先导杯曙光超算平台提供) 最好每次都检查一下
1 | module load compiler/intel/2017.5.239 |
安装MUMPS
下载网址:http://mumps.enseeiht.fr/
安装包名:MUMPS_5.3.1.tar.gz
参考:https://blog.csdn.net/jiangjjp2812/article/details/49632697
https://blog.csdn.net/weixin_30721899/article/details/96455694
https://www.cnblogs.com/Orien/p/5920285.html
https://zhuanlan.zhihu.com/p/136580603
安装方法:
1 | cd MUMPS_5.3.1 |
注意事项:Makefile.inc中路径的修改不仅仅是网上教程的几行,所有库的路径都需要根据自己的环境进行修改,可以根据报错来检查路径是否错误。MUMPS在make过程中基本所有的错误都源于库路径不正确。如果-openmp报错,将Makefile.inc的openmp改为qopenmp
编译MUMPS时的makefile.inc文件
1 |
|
bug
error: “METIS_ERROR” has already been declared in the current scope
将scotch_6.0.9/include/parmetis.h 里 第94-101注释掉,不然编译出错s
scotch_6.0.9/include/metis.h(90): error: identifier “SCOTCH_Num” is undefined
将第90行 typedef SCOTCH_Num idx_t;修改为typedef int idx_t;
/public/home/pabebe/software/scotch_6.0.9/lib/libptscotch.a(dgraph_band.o): In function _SCOTCHdgraphBand2Coll':
dgraph_band.c:(.text+0xf5): undefined reference to
_SCOTCHmemAllocGroup’
/public/home/pabebe/software/scotch_6.0.9/lib/libptscotch.a(dgraph_band.o): In function _SCOTCHdgraphBand2Ptop':
dgraph_band.c:(.text+0x7b8): undefined reference to
_SCOTCHmemAllocGroup’
/public/home/pabebe/software/scotch_6.0.9/lib/libptscotch.a(dgraph_band.o): In function `_SCOTCHdgraphBand’:
一大堆关于scotch未定义的错
Make.inc 在LSCOTCH = -L$(SCOTCHDIR)/lib -lptesmumps -lptscotch -lptscotcherr 后面添加这几个库 -lesmumps -lscotch -lscotcherr
ar: two different operation options specified,这个是因为多个库文件要链接时,一定要每个库文件前都有一个 -l 选项
提示缺少metis.h,将metis/include里的同名文件复制到MUMPS/PORD/include中
安装TOOLBOX_OPTIMIZATION
1 | cd TOOLBOX_OPTIMIZATION |
安装 toy2dac
下载:https://seiscope2.osug.fr/TOY2DAC,82?lang=fr
参考:https://zhuanlan.zhihu.com/p/136580603
http://bbs.fcode.cn/thread-1562-1-1.html
安装步骤:
1 | 将<basedir> src/MAKE.INC/Makefile.inc_THERA 复制到 src目录下,重命名问Makefile.inc |
注意事项:
1 | make过程中会频繁报错,基本都是路径不正确导致,请检查路径是否正确并手动添加库文件路径。 |
1 | #我的 |
编译toy2dac时的makefile.inc文件
1 | LADIR = /public/home/pabebe/software |
bug
gfortran 严格一些,默认情况下,不允许每行超过132列的长度。在Fortran中当程序代码中的一行超过132个字符时,至多可以有39个续行。续行标志固定为“&”。当一行代码的最后一个字符为“&”时,则表道示下一行与本行接续;当一行代码的第一个字符为“&”时,则表示本行与上一行接续。
/public/home/pabebe/software//MUMPS_5.3.1/lib/libcmumps.a(csol_aux.o): undefined reference to symbol ‘__svml_roundf4’
在makefile最后一行修改为
1 | $(FL) $(OPTL) $(SUBINV) toy2dac.o $(LIB) -lsvml -lintlc -o $(BIN)/toy2dac$(EXT) |
安装Ximage
下载:https://pypi.org/project/ximage/#files
运行toy2dac
1 | 以高斯扰动模型为例 |
vp_homogeneous qp rho epsilon delta theta
bug
出现无法连接到intel指定库的情况。
intel环境没有设置好