声波方程数值模拟实验报告.docx

上传人:b****5 文档编号:11767274 上传时间:2023-04-01 格式:DOCX 页数:34 大小:747.06KB
下载 相关 举报
声波方程数值模拟实验报告.docx_第1页
第1页 / 共34页
声波方程数值模拟实验报告.docx_第2页
第2页 / 共34页
声波方程数值模拟实验报告.docx_第3页
第3页 / 共34页
声波方程数值模拟实验报告.docx_第4页
第4页 / 共34页
声波方程数值模拟实验报告.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

声波方程数值模拟实验报告.docx

《声波方程数值模拟实验报告.docx》由会员分享,可在线阅读,更多相关《声波方程数值模拟实验报告.docx(34页珍藏版)》请在冰豆网上搜索。

声波方程数值模拟实验报告.docx

声波方程数值模拟实验报告

 

声波方程数值模拟实验报告

 

学号:

201107010230

姓名:

包灵

指导老师:

程冰洁老师

 

完成时间:

2014年11月26日星期三

实验要求:

1、应用声波方程作为正演模拟的波动方程;

2、将所提供震源函数离散后绘图;

3、给定两个二维速度-深度模型(一个小模型;一个大模型),绘出图形来;

4、对于小模型,整个区域的速度值可设为常数,即只有一种介质,将震源点放在模型中间,分别记录两个时刻的波前快照(即该时刻区域内所有网格点的波场值)。

第一时刻为地震波还未传播到边界上的某时刻,第二时刻为地震波已经传播到边界上的某时刻,体会其人工边界反射;

5、对于大模型,定义为水平层状速度模型(至少两层);做两个实验,一是将震源点放在区域表层任一点,记录下某些时刻的波前快照,体会地震波在两种介质的分界面上传播规律;二是合成一个地震记录,即记录下与震源同一深度点的各点所有时刻的波场值,并指出记录上的同向轴分别对应哪些波。

实验目的:

1.通过本次作业,加深对波动方程的理解,明白波动方程所代表的物理意义。

2.通过模拟地震波在介质中的传播,理解实际勘探中地震波在地层中的传播规律。

3.通过模拟水平层状速度模型,体会地震波在两种介质分界面的传播规律,并能够从地震记录中识别出反射波,透射波,多次波,折射波和绕射波。

4.通过模拟人工合成的地震记录,体会地震勘探基本原理和方法,验证地震波传播能量波形变化趋势。

需要的已知条件包括:

1)震源函数

2)地层速度(波速)

3)边界条件

2.弹性波方程:

声波方程的有限差分法数值模拟

对于二维速度-深度模型,地下介质中地震波的传播规律可以近似地用声波方程描述:

(4-1)

是介质在点(x,z)处的纵波速度,

为描述速度位或者压力的波场,

为震源函数。

为求式(4-1)的数值解,必须将此式离散化,即用有限差分来逼近导数,用差商代替微商。

为此,先把空间模型网格化(如图4-1所示)。

设x、z方向的网格间隔长度为

为时间采样步长,则有:

 (i为正整数)

 (j为正整数)

 (n为正整数)

表示在(i,j)点,k时刻的波场值。

在(i,j)点k时刻用Taylor展式展开:

(4-2)

在(i,j)点k时刻用Taylor展式展开:

(4-3)

将上两式相加,略去高阶小量,整理得(i,j)点k时刻的二阶时间微商为:

(4-4)

对于空间微分,采用四阶精度差分格式,(以X方向为例)即将

分别在(i,j)点k时刻展开到四阶小量,消除四阶小量并解出二阶微分得:

(4-5)

同理可得:

(4-6)

这就实现了用网格点波场值的差商代替了偏微分方程的微商,将上三个式子代入(4-1)式中得:

}

(4-7)

式中

为介质速度的空间离散值,

是空间离散步长,

为时间离散步长,

为震源函数,关于

一般使用一个理论的雷克型子波代替,即:

(1)

(4-8)

(2)

(4-9)

上式中,

为时间,

为中心频率,一般取为20-40HZ,

为控制频带宽度的参数,一般取3-5。

在实际计算过程中,需把此震源函数离散,参与波场计算。

确定震源位置。

稳定性条件:

(4-10)

这里

表示的是地下介质的最大波速;若地下介质网格间隔、最大速度及时间采样间隔不符合(4-8)式时,递推求解(4-7)式,波场值会出现误差(高阶小量)累积,出现不稳定现象。

频散关系式:

(4-11)

式中

为最小速度,

为Nyquist(奈奎斯特)频率。

一般取震源子波中的主频

的2倍值参与计算,G为每个波长所占的网格点数,对于空间二阶差分、时间二阶差分

取8,而对于空间为四阶差分的情况则

取4方能有效减少频散。

同理:

对于空间微分,采用二阶精度差分格式为

(4-12)

考虑Reynolds边界条件(详细推到见文献“基于Marmousi模型的声波方程有限差分正演算法”),差分格式如下:

(4-13)

注:

其中参数的设置:

借用以前实验的数据,当然可以根据限制条件4-10、4-11计算得到;至于震源放于[101*5,101*5]的矩形中心,根据速度与位移可以计算传播到边界时的时间,此处忽略。

二.实验步骤

1、应用声波方程作为正演模拟的波动方程,忽略转换波的产生、传播;

2、将所提供震源函数离散后绘图;

震源函数为雷克子波,离散绘图如下:

fm=30;

r=3;

t=0.002;

forn=1:

50

w(n)=exp(-(2*pi*fm/r)^2*(t*n)^2)*cos(2*pi*fm*t*n);

end

subplot(211)

plot(w)

t1=0.002;

forn=1:

50

w1(n)=(1-2*(pi*fm*(t1*n-1/fm))^2)*exp(-(pi*fm*(t1*n-1/fm))^2);

end

subplot(212)

plot(w1)

3、对于小模型,整个区域的速度值可设为常数,即只有一种介质,将震源点放在模型中间,分别记录两个时刻的波前快照(即区域内所有网格点的波场值)。

第一时刻为地震波还未传播到边界上的某时刻。

由稳定条件,设v为2000,可以令DT=0.001,DH=5,此时精度较高,且满足频散关系

程序,图形如下:

#include

#include

#include

#definePI3.141593

#defineFM30

#defineR3

#defineKN200

#defineXN101

#defineZN101

#defineDH5

#defineDT0.001

voidfunction(constintflag1,constintflag2)

{

FILE*fp;

inti,j,k,m,n;

floatu1[XN][ZN],u2[XN][ZN],u3[XN][ZN],u4[XN][ZN],f[XN][ZN];//不能直接初值为0

floatv[XN][ZN],w[KN],uu0,uu1,uu2;

for(i=0;i

for(j=0;j

{if(i==50&&j==50)

f[i][j]=1;

else

f[i][j]=0;

}

for(i=0;i

for(j=0;j

{

u1[i][j]=0.0;

u2[i][j]=0.0;

u3[i][j]=0.0;

u4[i][j]=0.0;

v[i][j]=2000;//速度相同表示同一介质

}

if(0==flag1)

{

for(k=0;k

w[k]=exp(-(2*PI*FM/R)*(2*PI*FM/R)*(k*DT)*(k*DT))*cos(2*PI*FM*k*DT);

}

elseif(1==flag1)

{

for(k=0;k

w[k]=(1-2*pow((PI*FM*(k*DT-1./FM)),2))*exp(-2*pow((PI*FM*(k*DT-1./FM)),2));

}

for(k=0;k

{

if(0==flag2)//时间二阶差分格式、空间四阶差分格式

{

for(i=2;i

for(j=2;j

{

uu0=(v[i][j])*(v[i][j])*(DT/DH)*(DT/DH);

uu1=-1.0/12*(u2[i-2][j]+u2[i+2][j])+4.0/3*(u2[i-1][j]+u2[i+1][j])-5.0/2*u2[i][j];

uu2=-1.0/12*(u2[i][j-2]+u2[i][j+2])+4.0/3*(u2[i][j-1]+u2[i][j+1])-5.0/2*u2[i][j];

u3[i][j]=2*u2[i][j]-u1[i][j]+uu0*uu1+uu0*uu2+w[k]*f[i][j];

}

}

elseif(1==flag2)//时间二阶差分格式、空间二阶差分格式

{

for(i=2;i

for(j=2;j

{

uu0=(v[i][j])*(v[i][j])*(DT/DH)*(DT/DH);

uu1=u2[i+1][j]-2*u2[i][j]+u2[i-1][j];

uu2=u2[i][j+1]-2*u2[i][j]+u2[i][j-1];

u3[i][j]=2*u2[i][j]-u1[i][j]+uu0*uu1+uu0*uu2+w[k]*f[i][j];

}

}

for(m=0;m

for(n=0;n

{

u1[m][n]=u2[m][n];

u2[m][n]=u3[m][n];

}

if(k==100)

for(m=0;m

for(n=0;n

u4[m][n]=u3[m][n];//记录波前快照,中间点

}

if(0==flag1&&0==flag2)

fp=fopen("wavefront14.dat","w");

elseif(1==flag1&&0==flag2)

fp=fopen("wavefront24.dat","w");

elseif(0==flag1&&1==flag2)

fp=fopen("wavefront12.dat","w");

elseif(1==flag1&&1==flag2)

fp=fopen("wavefront22.dat","w");

if(fp!

=NULL)

{

for(i=0;i

for(j=0;j

fprintf(fp,"%d%d%f\n",i,j,u4[i][j]);

fclose(fp);

}

}

voidmain()

{

function(0,0);//时间二阶差分格式、空间四阶差分格式、震源1

function(0,1);//时间二阶差分格式、空间二阶差分格式、震源1

function(1,0);//时间二阶差分格式、空间四阶差分格式、震源2

function(1,1);//时间二阶差分格式、空间二阶差分格式、震源2

}

 

(1)时间二阶差分格式、空间四阶差分格式、震源1

(2)时间二阶差分格式、空间二阶差分格式、震源1

 

(3)时间二阶差分格式、空间四阶差分格式、震源2

(4)时间二阶差分格式、空间二阶差分格式、震源2

第二时刻为地震波已经传播到边界上的某时刻,体会其人工边界反射(此处用Reynolds边界条件);

程序图形如下:

#include

#include

#include

#definePI3.141593

#defineFM30

#defineR3

#defineKN200

#defineXN101

#defineZN101

#defineDH5

#defineDT0.001

voidfunction(constintflag1,constintflag2)

{

FILE*fp;

inti,j,k,m,n;

floatu1[XN][ZN],u2[XN][ZN],u3[XN][ZN],u4[XN][ZN],f[XN][ZN];//不能直接初值为0

floatv[XN][ZN],w[KN],uu0,uu1,uu2,uu3;

for(i=0;i

for(j=0;j

{if(i==50&&j==50)

f[i][j]=1;

else

f[i][j]=0;

}

for(i=0;i

for(j=0;j

{

u1[i][j]=0.0;

u2[i][j]=0.0;

u3[i][j]=0.0;

u4[i][j]=0.0;

v[i][j]=2000;//速度相同表示同一介质

}

if(0==flag1)

{

for(k=0;k

w[k]=exp(-(2*PI*FM/R)*(2*PI*FM/R)*(k*DT)*(k*DT))*cos(2*PI*FM*k*DT);

}

elseif(1==flag1)

{

for(k=0;k

w[k]=(1-2*pow((PI*FM*(k*DT-1./FM)),2))*exp(-2*pow((PI*FM*(k*DT-1./FM)),2));

}

for(k=0;k

{

if(0==flag2)//时间二阶差分格式、空间四阶差分格式

{

for(i=2;i

for(j=2;j

{

uu0=(v[i][j])*(v[i][j])*(DT/DH)*(DT/DH);

uu1=-1.0/12*(u2[i-2][j]+u2[i+2][j])+4.0/3*(u2[i-1][j]+u2[i+1][j])-5.0/2*u2[i][j];

uu2=-1.0/12*(u2[i][j-2]+u2[i][j+2])+4.0/3*(u2[i][j-1]+u2[i][j+1])-5.0/2*u2[i][j];

u3[i][j]=2*u2[i][j]-u1[i][j]+uu0*uu1+uu0*uu2+w[k]*f[i][j];

}

}

elseif(1==flag2)//时间二阶差分格式、空间二阶差分格式

{

for(i=2;i

for(j=2;j

{

uu0=(v[i][j])*(v[i][j])*(DT/DH)*(DT/DH);

uu1=u2[i+1][j]-2*u2[i][j]+u2[i-1][j];

uu2=u2[i][j+1]-2*u2[i][j]+u2[i][j-1];

u3[i][j]=2*u2[i][j]-u1[i][j]+uu0*uu1+uu0*uu2+w[k]*f[i][j];

}

}

for(m=0;m

for(n=0;n

{

u1[m][n]=u2[m][n];

u2[m][n]=u3[m][n];

}

//Reynolds边界条件

uu3=v[i][j]*(DT/DH);

u3[0][j]=u2[0][j]+u2[1][j]-u1[1][j]+uu3*(u2[1][j]-u2[0][j]-u1[2][j]+u1[1][j]);//左边界

u3[XN][j]=u2[XN][j]+u2[XN-1][j]-u1[XN-1][j]+uu3*(u2[XN-1][j]-u2[XN][j]-u1[XN-2][j]+u1[XN-1][j]);//右边界

u3[i][0]=u2[i][0]+u2[i][1]-u1[i][1]+uu3*(u2[i][1]-u2[i][0]-u1[i][2]+u1[i][1]);//下边界

u3[i][ZN]=u2[i][ZN]+u2[i][ZN-1]-u1[i][ZN-1]+uu3*(u2[i][ZN-1]-u2[i][ZN]-u1[i][ZN-2]+u1[i][ZN-1]);//上边界

if(k==180)//只需改动K值,即显示边界反射

for(m=0;m

for(n=0;n

u4[m][n]=u3[m][n];//记录波前快照,边界

}

if(0==flag1&&0==flag2)

fp=fopen("wavefront14.dat","w");

elseif(1==flag1&&0==flag2)

fp=fopen("wavefront24.dat","w");

elseif(0==flag1&&1==flag2)

fp=fopen("wavefront12.dat","w");

elseif(1==flag1&&1==flag2)

fp=fopen("wavefront22.dat","w");

if(fp!

=NULL)

{

for(i=0;i

for(j=0;j

fprintf(fp,"%d%d%f\n",i,j,u4[i][j]);

fclose(fp);

}

}

voidmain()

{

function(0,0);//时间二阶差分格式、空间四阶差分格式、震源1

function(0,1);//时间二阶差分格式、空间二阶差分格式、震源1

function(1,0);//时间二阶差分格式、空间四阶差分格式、震源2

function(1,1);//时间二阶差分格式、空间二阶差分格式、震源2

}

 

(1)时间二阶差分格式、空间四阶差分格式、震源1

(2)时间二阶差分格式、空间二阶差分格式、震源1

 

(3)时间二阶差分格式、空间四阶差分格式、震源2

(4)时间二阶差分格式、空间二阶差分格式、震源2

4、对于大模型,定义为水平层状速度模型;做两个实验,一是将震源点放在区域表层任一点,记录下某些时刻的波前快照,体会地震波在两种介质的分界面上传播规律,指出哪是反射波,哪是透射波;

这时取小模型的常量,为减少频散,速度v至少为2400

程序图形如下:

#include

#include

#include

#definePI3.141593

#defineFM30

#defineR3

#defineKN200

#defineXN200

#defineZN100

#defineDH5

#defineDT0.001

voidfunction(constintflag1,constintflag2)

{

FILE*fp;

inti,j,k,m,n;

floatu1[XN][ZN],u2[XN][ZN],u3[XN][ZN],u4[XN][ZN];//不能直接初值为0

floatf[XN][ZN],v[XN][ZN],w[KN],uu0,uu1,uu2;

if(0==flag1)

{

for(k=0;k

w[k]=exp(-(2*PI*FM/R)*(2*PI*FM/R)*(k*DT)*(k*DT))*cos(2*PI*FM*k*DT);

}

elseif(1==flag1)

{

for(k=0;k

w[k]=(1-2*pow((PI*FM*(k*DT-1./FM)),2))*exp(-2*pow((PI*FM*(k*DT-1./FM)),2));

}

for(i=0;i

for(j=0;j

{

u1[i][j]=0.0;

u2[i][j]=0.0;

u3[i][j]=0.0;

u4[i][j]=0.0;

f[i][j]=0.0;

if(j<=30)

v[i][j]=2400;//第一层速度为2400

else

v[i][j]=3000;//第二层速度为3000

}

 

f[100][10]=1;//定义f函数,在100,10为1

 

for(k=0;k

{

if(0==flag2)//时间二阶差分格式、空间四阶差分格式

{

for(i=2;i

for(j=2;j

{

uu0=(v[i][j])*(v[i][j])*(DT/DH)*(DT/DH);

uu1=-1.0/12*(u2[i-2][j]+u2[i+2][j])+4.0/3*(u2[i-1][j]+u2[i+1][j])-5.0/2*u2[i][j];

uu2=-1.0/12*(u2[i][j-2]+u2[i][j+2])+4.0/3*(u2[i][j-1]+u2[i][j+1])-5.0/2*u2[i][j];

u3[i][j]=2*u2[i][j]-u1[i][j]+uu0*uu1+uu0*uu2+w[k]*f[i][j];

}

}

elseif(1==flag2)//时间二阶差分格式、空间二阶差分格式

{

for(i=2;i

for(j=2;j

{

uu0=(v[i][j])*(v[i][j])*(DT/DH)*(DT/DH);

uu1=u2[i+1][j]-2*u2[i][j]+u2[i-1][j];

uu2=u2[i][j+1]-2*u2[i][j]+u2[i][j-1];

u3[i][j]=2*u2[i][j]-u1[i][j]+uu0*uu1+uu0*uu2+w[k]*f[i][j];

}

}

for(m=0;m

for(n=0;n

{

u1[m][n]=u2[m][n];

u2[m][n]=u3[m][n];

}

if(k==100)

for(m=0;m

for(n=0;n

u4[m][n]=u3[m][n];//记录波前快照

}

if(0==flag1&&0==flag2)

fp=fopen("wa

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1