下面结合PSDM(Pre-Stack Depth Migration,叠前深度偏移)模型,从**走时计算(Travel Time)和迁移计算(Migration)**两个角度解释这个程序的计算目的、物理意义以及大概流程。由于你没有贴具体代码,我先按典型 PSDM 程序(类似 FWIY/地震成像程序中的 travel time + migration 模块)讲解。
PSDM 的核心思想是:
已知地下速度模型,通过计算地震波从震源到地下成像点、再返回检波器的传播时间,把地表采集到的地震数据重新放回地下真实位置。
PSDM 一般包含三个关键部分:
- 速度模型(Velocity Model)
- 走时计算(Travel Time Calculation)
- 偏移成像(Migration Imaging)
其中走时是迁移的基础,走时误差会直接导致地下结构位置错误。(J-STAGE)
1. 为什么要计算走时?
地震采集过程:
地面:
Shot S Receiver R * * | | | | ----------------------------------------- 地表 \ / \ / \ / \ / \ / \ / \ / \/ Reflector *震源发射地震波:
[
S \rightarrow 地下反射点 \rightarrow R
]
仪器记录的是:
[
t_{obs}
]
也就是:
波从震源走到地下,再返回接收点花费的时间。
但是我们真正想知道:
地下哪里发生反射?所以需要反推:
时间域数据 | | ↓ 空间位置 (x,y,z)这个反推过程就是迁移。
2. 走时计算的目的
假设地下速度模型:
Velocity Model z ↓ 0m ---------------- v=1500m/s 500m ---------------- v=2500m/s 1000m--------------- v=4000m/s程序首先计算:
震源到地下任意点的时间
[
\tau_s(x,y,z)
]
例如:
Source * /| / | / | / | ↓ ↓ P(x,y,z)计算:
[
\tau_s=
\int \frac{ds}{v(s)}
]
即:
沿传播路径:
[
时间=\frac{距离}{速度}
]
同理:
计算接收点到地下点:
[
\tau_r(x,y,z)
]
最终得到:
双程走时
[
T(x,y,z)=\tau_s+\tau_r
]
也就是:
Source * \ \ \ X 成像点 / / / * Receiver T = source到X时间 + X到receiver时间程序里面通常会生成:
Travel Time Table
类似:
shot001_tt.bin x方向 0 1 2 3 z=0 0 1 2 3 z=1 2 3 4 5 z=2 5 6 7 8 每个位置保存: τ(x,y,z)后面迁移直接查表。
3. PSDM迁移计算目的
走时计算完成以后:
程序知道:
某个地下点P 对应地震数据中的哪个时间例如:
地下点:
P *计算:
[
T_p=2.5s
]
那么:
去地震记录:
Trace time 0s | | 1s | | 2.5s <-------取这里的数据 | | 4s取出这个振幅:
[
A(t=2.5s)
]
累加到地下点:
[
Image(x,y,z)
]
数学形式:
Kirchhoff PSDM:
[
I(x,y,z)
\sum_{s,r}
W(s,r)
D(s,r,T)
]
含义:
- (I(x,y,z))
地下成像结果
- (D(s,r,T))
炮检记录里面对应时间的数据
- (W)
振幅补偿权重
简单理解:
就是:
大量地表记录 ↓ 按照传播时间 ↓ 重新投影回地下 ↓ 地下图片4. 一个二维PSD模型计算流程图
程序大概:
输入 地震炮集数据 | | ↓ Velocity Model | | ↓ +----------------+ | Travel Time | | Calculation | +----------------+ | | ↓ Travel Time Table | | ↓ +----------------+ | Migration | | Imaging | +----------------+ | | ↓ Depth Image5. PSDM里面走时和迁移为什么重要?
(1)确定地下结构位置
没有迁移:
原始地震记录 时间 | | | \\\\\ \\\\ \\\\反射点被放错位置。
迁移:
真实地下结构 /\ / \(2)处理复杂地质结构
简单水平层:
PSTM 可以。
但是:
断层 / -----/------ / ---/-------- 盐丘 /\ / \ ___/ \___速度变化剧烈:
需要 PSDM。
PSDM 使用深度速度模型,因此可以处理横向速度变化。(J-STAGE)
6. 如果对应到 C++/CUDA 程序里面
通常结构类似:
Step 1
读取模型
velocity[ix][iy][iz]Step 2
计算走时
CPU:
for(z){for(y){for(x){travel_time[x][y][z]=solve_eikonal(velocity);}}}GPU:
__global__voidcomputeTravelTime(){intix=blockIdx.x*blockDim.x+threadIdx.x;tt[ix]=...}Step 3
迁移
for(image_point){time=tt_source+tt_receiver;amplitude=seismic_data[time];image[x][y][z]+=amplitude;}GPU里面:
每个线程负责:
一个地下成像点 thread 0 ---> P0 thread 1 ---> P1 thread 2 ---> P27. 和 FWI 的关系
你之前看的 FWIY 代码,其实也是类似思想。
区别:
| PSDM | FWI | |
|---|---|---|
| 目的 | 成像 | 反演速度 |
| 输入 | 地震数据+速度模型 | 地震数据 |
| 输出 | 地下图片 | 新的速度模型 |
| 核心 | 一次传播+成像 | 正演+梯度优化 |
关系:
初始速度模型 | ↓ PSDM | ↓ 检查结构 | ↓ FWI更新速度 | ↓ 更准确PSDM所以这个程序里面:
走时计算 = 找到地下点对应的时间位置
迁移计算 = 把时间域地震能量搬回真实地下位置
PSDM 的最终目标:
利用速度模型和波传播规律,把地表采集的地震波数据转换成地下高分辨率结构图像,为油气勘探、断层解释、储层定位提供依据。(J-STAGE)
如果结合你之前看的FWIY/CUDA kernel()代码,里面的travel time / migration kernel基本可以对应到上面的走时表生成 + Kirchhoff积分成像两部分。