使用GMT的grdinterpolate模块获得地震成像的任意纵切面结果
(更新于2025-05-20)grdinterpolate模块属于还在发展中的模块,我修复了-E单位问题以及-S不能和-T使用的问题,已给官方提交了PR(相关PR已合并),可能在下个版本(6.6?)会推出。如果现在想使用grdinterpolate模块这些功能,请下载dev版本从源码编译使用,编译教程详见GMT中文文档。
地震成像结果往往是三维空间(经度、纬度、深度)中的单/多变量文件(Vp, Vs),而gmt中大多数模块都是处理二维网格。为了获得任意纵切面的结果,目前常做的处理是在定义了水平测线后,不同深度层逐一插值处理,即逐层使用grdtrack模块进行插值,最后拼成一个二维网格。
gmt官网介绍了grdinterpolate模块可以进行3D网格插值,但似乎使用没那么广。大概浏览了grdinterpolate模块的C代码,最后也是调用了grdtrack模块。这里我进行了初步测试后,成功插值得到任意纵切面的2D网格,以下是使用流程:
准备3D成像网格文件
假设有一个文本格式的成像结果文件result.txt,如下
| |
四列分别表示经度、纬度、深度和速度(数值不代表真实情况,仅做测试)。然后我们使用Python的netcdf4库处理得到3D成像网格文件,其中有一些细节要注意:
| |
检查文件
可以使用ncdump -c result.nc和gmt grdinfo result.nc来查看网格文件的基本信息,例如
| |
| |
其中xyz变量的数值范围能正确对应到期望维度的范围。
使用grdinterpolate切片
例如给定测线和深度层范围,即可得到任意纵切面的2D网格:
| |
若3D网格中存在多个速度变量,使用filename?varname的形式即可选择变量:
| |