经过学习完整的正演模拟过程之后,可以得到波场快照,波场快照的含义是指在某时刻t下波的传播情况的展示。同时,也可以通过设置检波点来接收波,可以得到单炮数据。检波器可以放在地面称为地面检波器,也可以垂直地面排列放入地下,称为井中检波器。除此之外,检波器也可以水平方向放置在地下。
(1)地面检波器
如何获得地面检波器接收的信息,是由检波器位置x和检波器接收到波的时间t构成的,因此生成图像应为以x为横坐标,t为纵坐标的图像。与之前得到的波长快照不同的是,确定一个时间t不变,观察波形传播的位置,地面检波器接收到的则是,确定一行位置不变,观察何时t接收到波。
方法:由此我们可以知道,检波器得到的与波长快照的实际信息是一样的,只是表达方式不一样,因此我们可以再新开辟一个数组land[]用来存储检波器检测到波的信息,该数组包含检波器位置x和检波器接受到波的时间t。而检波器位置是固定的,因此可以从wf2[]数组中提取出检波器位置的波场信息即可。
由此设置一个函数copydata()用来实现以上操作,此处将检波器分别排列在水平界面上,范围与速度模型的水平长度相等。
void copydata(float *land,float *wf,int nt,int nz,int it,int N)
{
int iz=N/2,ix;//由于波动方程是从(N/2,N/2)位置开始计算,因此检波器也需放置在深度为N/2处的水平方向
for(ix=0;ix<nx;ix++)
{
land[ix*nt+it]=wf[ix*nz+iz];
}
}
此处要注意,由于copydata()引用了参数it,因此要将copydata()放在zhengyan()循环中如下:
void zhengyan_display(float *wf1,float *wf2,float *wf3,float *velocity,int nx,int nz,int nt,float dx,float dz,float dt,float *coe,int N)
{
int it;
for(it=0;it<nt;it++)
{
add_wavelet(wf2,wavelet,nx,nz,it,sx,sz);
exteapolation(wf1,wf2,wf3,velocity,nx,nz,dx,dz,dt,coe,N);
replace_wf(wf1,wf2,wf3,nx,nz);
copydata(land,wf2,nt,nz,it,N);
copydata2(well,wf2,nt,nz,it,N,Z);
if(it==400)
output("zhengyan.bin",wf2,nx,nz);
}
output("ricive_land.bin",land,nx,nt);//输出文件
output("ricive_well.bin",well,Z,nt);
编译并执行ximage<ricive_land.bin n1=501&运行之后得到如下结果
由于震源位置再sx=200,sz=150处,因此地面检波器得到如图结果。为了方便观测,我们将震源改为设置在地面中心上,并将nt设置为1001,输入命令ximage<ricive_land.bin n1=1001&得到如下结果
(2)井中检波器
与地面检波器原理相同,只不过改变了检波器的位置,并开辟新数组well[]用来存储信息,函数copydata2()函数来实现:
void copydata2(float *land,float *wf,int nt,int nz,int it,int N,int Z)
{
int iz,ix=150;//检波器位置是在ix=150处垂直水平面,深度由0—Z。
for(iz=0;iz<Z;iz++)
{
land[iz*nt+it]=wf[ix*nz+iz];
}
}
使Z=150得到如下结果(震源位置和nt与地面检波器设置相同)