GeophyAI

Python与地球物理数据处理

0%

Madagascrar之rsf/su/rsflab16

本文介绍的是Madagascrar源码book中的rsf/su/rsflab16示例程序,该源码程序主要介绍的是如何使用Madagascrar对地震数据进行动校正(sfnmo)、taup变换(sfradon)、速度分析(sfvscan)、去动校正(sfinmo)等。
如何在python中读取RSF文件/输出numpy数据到RSF文件,请参考《Madagascrar之RSF文件输入与输出》一文。

动校正(NMO)

rsf/su/rsflab16/SConstruct中有两处使用了nmo命令,第一处为动校正、第二处为去动校正。

动校正命令如下:

1
2
Flow('nmo','cdp265 offset265 vel',
'nmo half=n offset=${SOURCES[1]} velocity=${SOURCES[2]}')

通过以上Flow命令可以看出,Madagascrar中的动校正模块sfnmo需要有三个输入文件,也就是说,如果我们想要在Python中使用m8r.nmo,除了numpy格式的输入数据外,还需额外输入偏移距数据offset以及速度数据velocity《Madagascrar之RSF文件输入与输出》中我们提到,由于无法直接将numpy数据作为参数输入到m8r.command中,我们只能先将数据以规定的RSF文件格式输入到磁盘中,然后再将文件路径作为参数传入函数中。即m8r.nmo(offset=np.array(offset), velocity=np.array(offset))是不可行的,m8r.nmo(half=False, offset='./offset.rsf', velocity='./vel.rsf'.apply(np.array(cdp))才能得到正确结果。

为方便起见,我们仍旧使用之前封装的warpper函数来读取rsf文件,代码如下所示:

1
2
3
4
5
6
7
nmo_op = m8r.put(d1=0.004,
o1=0).nmo(half=False,
offset=warp.offset265.__file_path__,
velocity=warp.vel.__file_path__)
nmo = nmo_op.apply(warp.cdp265.data)
warp.__set_attr_by_name__('nmo')
print(np.all(nmo==warp.nmo.data))

上面的代码中,我们首先定义了一个动校正算子nmo_op,然后我们将需要的参数(时间采样间隔d1,起始时间o1)输入到put中,将nmo需要的参数输入到其函数中(offsetvelocity的参数分别为使用warp.__set_attr_by_name__('offset265')warp.__set_attr_by_name__('vel')读取的RSF文件路径,这些文件均可以通过执行scons命令来生成)。通过查看最后输出是否为True来判断所生成动校正数据与源码最终结果的异同。另外,这里动校正的速度为1500m/s
去动校正
去动校正命令如下:
1
Flow('sign','sign2 vel','inmo half=n velocity=${SOURCES[1]}')

使用方法与动校正相似,定义算子的时候需要将速度文件的路径作为参数传入,这里不做赘述。
去动校正

抛物线taup变换

Radon变换示例可参考《Madagascrar之线性Radon变换》。在sfradon中,由常规拉东变换到抛物线拉东变换,我们只需要将参数parab设置为y(默认为n,在python中则需要设置为True)即可。
SConstruct源码为:

1
2
Flow('taup','nmo offset265 ',
'radon parab=y x0=1000 np=251 dp=0.002 p0=-0.25 offset=${SOURCES[1]}')

对应的Python版实现为:
1
2
3
4
5
6
7
taup_op = m8r.put(d1=0.004).radon(parab=True,
x0=1000,
np=251,
dp=0.002,
p0=-0.25,
offset=warp.offset265.__file_path___)
taup = taup_op.apply(warp.nmo.data)

同样的,warp.nmo.data为通过warp.__set_attr_by_name__('nmo')读取的nmo.rsf文件中的数据。
taup变换
这里展示的图片为对原始炮集(即上面的动校正前数据)进行$taup$变换后的结果。

速度分析

速度分析也需要额外输出偏移距的RSF文件作为参数,所以我们要将偏移距数据按照格式写入文件。
脚本命令为:

1
2
3
4
5
# Velocity analysis
Flow('scan','cdp265 offset265',
'vscan semblance=y half=n offset=${SOURCES[1]} dv=15 v0=1450 nv=200')
Flow('scan2','sign',
'vscan semblance=y half=n dv=15 v0=1450 nv=200')

对应的Python版实现为:
1
2
3
4
5
6
7
8
9
vscan_op = m8r.put(o1=float(o1), 
d1=float(d1)).vscan(semblance=True,
half=False,
offset='./offset265_.rsf',
dv=15,
v0=1450,
nv=200)
vscan = vscan_op.apply(warp.cdp265.data)
vscan2 = vscan_op.apply(warp.sign.data)

taup变换

上图中,横轴表示速度(m/s),纵轴表示为时间(s)。