声波方程有限差分正演

合集下载

声波方程有限元

声波方程有限元

声波方程有限元声波方程有限元方法是一种数值计算方法,用于模拟声波在介质中的传播和传输过程。

本文将介绍声波方程有限元方法的基本原理和应用。

声波方程是描述声波传播的方程,通常采用声压和粒子速度作为变量。

声波方程有限元方法是将声波方程离散化为有限个节点和单元,通过求解节点上的声压和粒子速度来模拟声波在空间中的传播。

声波方程有限元方法的基本原理是将连续的介质分割成有限个小单元,每个单元内部的声场可以用简单的函数进行逼近,从而将连续的声场离散化为有限个节点上的声场。

通过定义适当的边界条件和初始条件,可以建立起有限元方程组。

在声波方程有限元方法中,通常采用Galerkin方法对方程进行离散化。

Galerkin方法是将方程的解表示为一组基函数的线性组合,通过将方程两边与基函数进行内积得到离散方程。

常用的基函数包括分片线性函数和分片二次函数等。

一旦建立起有限元方程组,就可以通过求解方程组得到声波在空间中的传播。

常用的求解方法包括直接法和迭代法。

直接法是通过高斯消元法或LU分解等方法直接求解方程组,适用于规模较小的问题。

而迭代法则是通过迭代计算逼近方程组的解,适用于规模较大的问题。

声波方程有限元方法在声学领域有广泛的应用。

例如,可以用于模拟声波在海洋中的传播和反射,从而研究海洋声学现象;也可以用于模拟声波在地下中的传播和散射,从而研究地震勘探和岩石力学等问题。

声波方程有限元方法还可以用于声波在结构中的传播分析。

例如,可以用于模拟声波在建筑物中的传播和吸音效果,从而优化建筑物的声学设计;也可以用于模拟声波在机械设备中的传播和振动,从而优化机械设备的噪声控制。

声波方程有限元方法是一种重要的数值计算方法,可以用于模拟声波在介质中的传播和传输过程。

通过将声波方程离散化为有限个节点和单元,可以求解声波在空间中的传播并得到声场的分布。

声波方程有限元方法在声学领域和工程实践中有广泛的应用,对于研究声学现象和优化声学设计具有重要意义。

交错网格有限差分正演模拟的联合吸收边界

交错网格有限差分正演模拟的联合吸收边界

交错网格有限差分正演模拟的联合吸收边界胡建林;宋维琪;张建坤;邢文军;徐文会【摘要】三维声波方程交错网格有限差分正演模拟中的边界问题一直是热点问题.完全匹配层吸收边界(PML)具有较强且稳定的吸收效果,但必须具有一定的边界厚度才能吸收干净,这就增大了三维正演模拟的模型空间,即增加了运算量;Higdon边界能消除任意角度入射波的边界反射,也具有较强稳定性,但该高阶吸收边界离散化后过于复杂,而低阶时吸收效果不如PML边界.因此,基于对PML吸收层中的平面波传播规律的研究,重新推导PML最外层的Higdon吸收边界条件,得到含PML吸收系数的新的Higdon吸收边界条件.联合吸收边界不仅可使用较小厚度(相对于单纯PML边界)的PML层对分量进行衰减,而且在PML边界外层,能应用新推导的Higdon吸收边界条件对反射波进行匹配吸收.在相同吸收效果下,联合吸收边界大幅度降低了PML厚度,减小了运算量,得到精确的模拟结果.【期刊名称】《石油地球物理勘探》【年(卷),期】2018(053)005【总页数】7页(P914-920)【关键词】三维声波方程;交错网格有限差分;正演;PML边界;Higdon边界;联合吸收边界【作者】胡建林;宋维琪;张建坤;邢文军;徐文会【作者单位】中国石油大学(华东)地球科学与技术学院,山东青岛266555;中国石油大学(华东)地球科学与技术学院,山东青岛266555;中国石油冀东油田公司勘探开发研究院,河北唐山063004;中国石油冀东油田公司勘探开发研究院,河北唐山063004;中国石油冀东油田公司勘探开发研究院,河北唐山063004【正文语种】中文【中图分类】P6311 引言复杂地下介质中,地震波的传播过程繁冗,难以得到解析解,因此,一般是通过正演模拟探究地下地震波的传播。

在地震波正演模拟中,利用波动方程的正演模拟比用运动学的射线追踪法可获得更丰富的动力学信息,因此地震波场的数值模拟是地震波场传播研究中的重要手段之一[1-8]。

有限差分波动方程正演模拟中的吸收边界条件

有限差分波动方程正演模拟中的吸收边界条件

有限差分波动方程正演模拟中的吸收边界条件王开燕1,周妍1,刘丹1,郝菲2【摘要】在地震波传播的数值模拟过程中,在有限的区域内建立吸收边界条件是一个很重要的问题。

主要运用有限差分的方法对二维声波方程进行正演模拟,介绍并分析了利用有限差分的方法进行波动方程正演模拟过程中的几种吸收边界条件。

先通过理论阐述,然后通过建立均质模型和层状介质模型来研究不同吸收边界条件下的边界吸收效果,得到对应的波场快照和单炮记录,并加以比较。

通过实际验证得知当运用完全匹配层(PML)吸收边界条件时吸收效果最好,基本上不产生虚假反射。

【期刊名称】当代化工【年(卷),期】2014(000)005【总页数】4【关键词】关键词:有限差分法;正演模拟;吸收边界条件;二维声波方程;虚假反射模拟与计算地震数值模拟是地震勘探和地震学的重要基础,并已经在地震勘探和天然地震勘探中得到广泛的应用。

地震勘探过程中,我们只能得到地表和地下很少部分的数据,不可能得到波场的全部信息,只能通过波场正演模拟来获得波场的全部信息,从而全面地反映地震波在地下介质中的分布与传播情况。

地震数值模拟[1]是在已知地下介质结构情况下,研究地震波在地下各种介质中传播规律的一种地震模拟方法,其理论基础就是表征地震波在地下各种介质中传播的地震波传播理论。

本文主要采用有限差分的方法进行正演模拟[2],但实际地震波是在无限介质中传播的,由于受计算机内存和计算时间的限制,有限差分法只能得到有限数量网格点上的波场值,所有就必须截断计算空间并设置边界条件,得到有限的计算模型,所以边界吸收条件就非常重要,如果处理不好就会产生虚假反射,影响得到的结论。

近年来,国内外许多学者在吸收边界条件方面做了大量的工作,提出了各种边界条件[3-6]。

本文通过声波方程有限差分方法,验证不同吸收边界条件下的正演模拟效果,优选出效果好的吸收边界条件。

1 二维声波方程二阶精度有限差分算法二维声波波动方程的表达式为:其中:c—声波波速;u(x,z,t)—声波波场值;f(x,z,t)—震源项。

高精度傅里叶有限差分法模型正演

高精度傅里叶有限差分法模型正演

高精度傅里叶有限差分法模型正演刘文革 3 ① 贺振华 ①② 黄德济 ① 杜增利 ③( ①成都理工大学信息工程学院 ; ②成都理工大学“油气藏地质与开发工程”国家重点实验室 ; ③西南石油大学)刘文革 ,贺振华 , 黄 德 济 , 杜 增 利 . 高 精 度 傅 里 叶 有 限 差 分 法 模 型 正 演 . 石 油 地 球 物 理 勘 探 , 2007 , 42( 6 ) : 629~633摘要 波动方程数值模拟方法分为有限差分法和频率 —波数域法两类 ,其中有限差分法的计算精度取决于波场外推算子的近似程度 、离散网格间距及差分方程阶数 ,它能适应速度任意横向变化 ,但在大倾角处易出现频 散现象及背景噪声 。

频率 —波数域法算法简单 、精度高 、噪声小 ,能适应任意地层倾角情况 ,但不适于速度场的 任意横向变化 。

文中结合有限差分法和频率 —波数域法的优点 ,应用傅里叶有限差分法 ( F F D) 实现在多域用高 精度延拓算子对模型进行地震记录的数值模拟 ,其波场外推算子由相移项 、折射项 ( 时移项) 和有限差分补偿项 组成 。

对 F F D 法进行了理论与误差分析 ,并用单程声波方程分别进行了层状模型和 SE G / EA GE 盐丘模型的数 值模拟试验 。

数值试验的对比分析表明 , F F D 法适用于速度场横向剧烈变化情形 ,且具有精度高 、无频散 、背景 噪声弱等优点 ,模拟结果反射特征清楚 ,能对复杂地质构造进行准确的地震数值模拟 。

关键词 波动方程 地震数值模拟 有限差分法 频率 —波数域法 傅里叶有限差分法提高微分方程对单平方根算子的逼近程度 ,改善了 成像效果[ 3 ]; C lae r b o u t 在研究时 —空域和频率 —空间域中的有限差分法后 ,认为有限差分法可以适应横向速度的任意变化 ,但是单平方根算子展开引起 了高波数近似 ,使得对大倾角构造的成像误差较大 , 易出现频散现象及背景噪声[ 4 ] 。

有限差分法地震正演模拟程序

有限差分法地震正演模拟程序

有限差分法地震正演模拟程序一.二阶公式推导1.二维的弹性波动方程22222222x x x ZU U U U t x z x z λμμλμρρρ∂∂∂∂++=++∂∂∂∂∂ 22222222xz z z U U U U t z x x zλμμλμρρρ∂∂∂∂++=++∂∂∂∂∂ 2.对方程进行中间差分(1)首先对时间进行二阶差分()()()()()112,,,22222n n n xi k xi k xi kx x x x U U U U t t U t U t t U t t t +--++-+-∂==∂ ()()()()()112,,,22222n n n zi k zi k zi kz z z z U U U U t t U t U t t U t t t +--++-+-∂==∂ (2)对x 方向进行二阶差分()()()()()21,,1,22222n n n xi k xi k xi kx x x x U U U U x x U x U x x U x x x +--++-+-∂==∂ ()()()()()21,,1,22222n n n zi k zi k zi kz z z z U U U U x x U x U x x U x x x +--++-+-∂==∂ (3)对z 方向进行二阶差分()()()()()2,1,,122222n n nxi k xi k xi k x x x x U U U U z z U z U z z U z z z +--++-+-∂==∂ ()()()()()2,1,,122222n n nzi k zi k zi k z z z z U U U U z z U z U z z U z z z +--++-+-∂==∂ (4)对xz 进行差分2,1,11,11,11,11,111,11,11,11,122224n nzi k zi k z zn n n nzi k zi k zi k zi k n n n n zi k zi k zi k zi k U U U U x z x zx z U U U U U U U U x x z z x+-++-++--++-++---⎛⎫-∂∂∂∂⎛⎫== ⎪ ⎪ ⎪∂∂∂∂∂⎝⎭⎝⎭-----+==2,1,11,11,11,11,111,11,11,11,122224n nxi k xi k x x n n n n xi k xi k xi k xi k n n n n xi k xi k xi k xi k U U U U x z x z x z U U U U U U U U x x z z x+-++-++--++-++---⎛⎫-∂∂∂∂⎛⎫== ⎪ ⎪ ⎪∂∂∂∂∂⎝⎭⎝⎭-----+==(5)把(1)(2)(3)(4)得到的结果带入波动方程3.写出差分方程()()()11,,,1,,1,22,1,,11,11,11,11,12222=2++4n n n n n nxi k xi k xi kxi k xi k xi k nnnnnnnxi k xi k xi k zi k zi k zi k zi k U U U U U U t x U U UU UUUz xz λμρμλμρρ+-+-+-++-++----+-++-+--++()()()11,,,1,,1,22,1,,11,11,11,11,12222=2++4n n n nnnzi k zi k zi kzi k zi k zi knn n nnnnzi k zi k zi k xi k xi k xi k xi k U U U U U U t x U UUU UUUz xz λμρμλμρρ+-+-+-++-++----+-++-+--++即得到()()1,,1,,1,,122112,,,1,11,11,11,1222+=2-++4n n n n n nxi k xi k xi kxi k xi k xi k n n n xi k xi k xi k n n n nzi k zi k zi k zi k U U U U U U x z U U U t U U U U z x λμμρρλμρ+-+-+-++-++---⎛⎫-+-++ ⎪ ⎪ ⎪--++ ⎪ ⎪⎝⎭()()1,,1,,1,,122112,,,1,11,11,11,1222+=2-++4n n n n n nzi k zi k zi k zi k zi k zi k n n n zi k zi k zi k n n n nxi k xi k xi k xi k U U U U U U x z U U U t U U U U z x λμμρρλμρ+-+-+-++-++---⎛⎫-+-++ ⎪ ⎪ ⎪--++ ⎪ ⎪⎝⎭二.MATLAB 程序 clear; clc;Nx=200; Nz=300;fi=30;%%%主频t_step=300;%%%%时间采样点dx=10.0;%空间采样间隔——x 方向 dz=10.0;%空间采样间隔——z 方向 dt=0.001;%时间采样间隔——1mslambda=66*1e9;%砂岩拉梅常数lamdamu=44*1e9;%砂岩拉梅常数murho=2650;%砂岩密度%%%%%%模型扩展%%%%%vp=zeros(Nz+2,Nx+2);%纵波速度vs=zeros(Nz+2,Nx+2);%横波速度c=zeros(Nz+2,Nx+2);%交叉项系数for i=1:Nz+2for j=1:Nx+2vp(i,j)=sqrt((lambda+2*mu)/rho);vs(i,j)=sqrt((mu)/rho);c(i,j)=sqrt((lambda+mu)/rho);endend%%%%%% 震源%%%%%%%t_wavelet=[1:t_step]*dt-1.0/fi;source=((1-2*(pi*fi*t_wavelet).^2).*exp(-(pi*fi*t_wavelet).^2));% 雷克子波amp=sqrt(2.0);% 振幅source_x=floor(Nx/2)+1;% 震源位置——x坐标source_z=2;% 震源位置——z坐标source_amp=zeros(Nz+2,Nx+2);% 震源振幅初始化(所有点处均为0)source_amp(source_z,source_x)=amp;% 震源振幅,在位置source_z,source_x处振幅为amp,其它位置为0 %%%%%%%%%%%%%%%%%%%%%%%%%%%U=zeros(Nz,Nx);% 弹性波x分量V=zeros(Nz,Nx);% 弹性波z分量U0=zeros(Nz+2,Nx+2);% 前一时刻的UU1=zeros(Nz+2,Nx+2);% 当前时刻的UU2=zeros(Nz+2,Nx+2);% 下一时刻的UV0=zeros(Nz+2,Nx+2);% 前一时刻的VV1=zeros(Nz+2,Nx+2);% 当前时刻的VV2=zeros(Nz+2,Nx+2);% 下一时刻的Vrecord_u=zeros(t_step,Nx);% x方向接收到的地震记录——Urecord_v=zeros(t_step,Nx);% x方向接收到的地震记录——V%%%%%% 有限差分计算U V %%%%%%for it=1:t_stepfor x=2:Nx+1for z=2:Nz+1U2(z,x)=2*U1(z,x)-U0(z,x)+(dt*dt)*(vp(z,x)^2*(1.0/(dx*dx))*(U1(z,x+1)-2*U1(z,x) +U1(z,x-1))+vs(z,x)^2*(1.0/(dz*dz))*(U1(z+1,x)-2*U1(z,x)+U1(z-1,x))+c(z,x)^2*(1. 0/(4*dx*dz))*(V1(z+1,x+1)-V1(z+1,x-1)-V1(z-1,x+1)+V1(z-1,x-1)))+source(it)*sour ce_amp(z,x)*dt*dt;V2(z,x)=2*V1(z,x)-V0(z,x)+(dt*dt)*(vs(z,x)^2*(1.0/(dx*dx))*(V1(z,x+1)-2*V1(z,x) +V1(z,x-1))+vp(z,x)^2*(1.0/(dz*dz))*(V1(z+1,x)-2*V1(z,x)+V1(z-1,x))+c(z,x)^2*(1. 0/(4*dx*dz))*(U1(z+1,x+1)-U1(z+1,x-1)-U1(z-1,x+1)+U1(z-1,x-1)));endendU0=U1;U1=U2;V0=V1;V1=V2;record_u(it,:)=U2(2,[2:201]);record_v(it,:)=V2(2,[2:201]);U=U2(2:301,2:201);V=V2(2:301,2:201);end%%%%% 绘制U 和V 的波场图%%%%%%figureimagesc(U(1:300,1:200));title('U');xlabel('x');ylabel('z');figureimagesc(V(1:300,1:200));title('V');xlabel('x');ylabel('z');%%%%% 绘制U 和V 的地震记录%%%%%%figureimagesc(record_u(1:300,1:200));title('U');xlabel('x');ylabel('t_step');figureimagesc(record_v(1:300,1:200));title('V');xlabel('x');ylabel('t_step');U分量波场图V分量波场图U分量地震记录V分量地震记录。

波动方程有限差分

波动方程有限差分

波动方程有限差分一、引言波动方程是自然界中许多现象的数学模型,如声波、地震波等。

为了解决波动方程的数值解,有限差分方法是一种常用的数值计算方法。

本文将详细介绍波动方程有限差分的原理、方法和应用。

二、波动方程波动方程描述了介质中物理量随时间和空间变化的规律。

具体来说,假设介质中某个物理量为u(x, t),其中x表示空间坐标,t表示时间,则波动方程可以表示为:∂²u/∂t² = c²∇²u其中c表示介质中的传播速度,∇²表示拉普拉斯算子。

该方程描述了一个在介质中传播的二阶偏微分方程。

三、有限差分方法有限差分方法是一种常用的数值计算方法,其基本思想是将连续函数离散化为离散点上的函数值,并通过差商逼近导数或偏导数,从而得到原问题的近似解。

对于波动方程,在空间上进行网格剖分,并在每个网格点处离散化u(x, t)和其导数,可以得到如下形式的差分格式:(u(i, j+1) - 2u(i, j) + u(i, j-1)) / Δt² = c²((u(i+1, j) - 2u(i, j) + u(i-1, j)) / Δx² + (u(i, j+1) - 2u(i, j) + u(i, j-1)) / Δy²)其中i表示空间网格点的横坐标,j表示纵坐标,Δt、Δx和Δy分别为时间和空间上的步长。

这个差分方程可以通过迭代求解得到波动方程的数值解。

具体来说,可以使用显式差分法或隐式差分法进行求解。

四、应用波动方程有限差分方法在地震勘探、声学建模等领域得到广泛应用。

例如,在地震勘探中,可以通过模拟地震波传播过程得到地下岩层的结构信息;在声学建模中,可以计算音场传播过程,并预测噪声污染等问题。

五、总结本文介绍了波动方程有限差分方法的原理、方法和应用。

有限差分方法是一种常用的数值计算方法,在许多领域都有广泛应用。

对于波动方程这类偏微分方程,有限差分方法是一种有效的求解方法。

声波波动方程正演模拟程序总结

声波波动方程正演模拟程序总结

声波波动方程正演模拟程序程序介绍:第一部分:加载震源,此处选用雷克子波当作震源。

编写震源程序后,我将输出的数据复制,然后我用excel做成了图片,以检验程序编写是否正确。

以下为雷克子波公式部分的程序:for(it=0;it<Nt;it++){t1=it*dt;t2=t1-t0;source[it]=(1.0-2.0*pow(PI*fm*t1,2.0))*exp(-pow(PI*fm*t1,2.0));fprintf(fp,"%.8f %.8f\n",t1,source[it]);}此处,为了成图完整,我用的是t2,而不是t1,也就是把雷克子波向右移动了一段距离,使主要部分都显示出来。

(频率采用的是30hz)从图中可以看出程序是正确的,符合理论上雷克子波的波形。

第二部分:主程序,编写声波正演模拟算子。

首先定义了各种变量,然后指定震源位置,选择权系数,给速度赋值,然后是差分算子的编写,这是主要部分,最后再进行时间转换,即把n-1时刻的值给n时刻,把n时刻的值给n+1时刻。

此处,我编写的是均匀介质声波方程规则网格的正演模拟程序,时间导数采用二阶中心差分、空间导数为2N阶差分精度,网格大小为200*200,总时间为400。

第三部分:这一部分就是记录文件。

首先记录Un文件,然后记录record文件。

模型构建与试算:1、我首先建立了一个均匀介质模型,首先利用不同时间,进行了数值模拟,得到波场快照如图所示:100ms 200ms 300ms此处,纵波速度为v=3000m/s。

模型大小为200×200,空间采样间隔为dx=dz=10m。

采用30Hz的雷克子波作为震源子波,时间采样间隔为1ms,图中可以看出,波场快照中的同相轴是圆形的,说明在均匀各向同性介质中,点源激发的波前面是一个圆,这与理论也是吻合的。

并且随着时间的增大,波前面的面积逐渐增大,说明地震波从震源中心向外传播。

声波方程正演模拟 (2)优秀课件

声波方程正演模拟 (2)优秀课件

傅里叶变换法是利用空间的全部信息对波场函数 进行三角函数插值,能更加精确地模拟地震波的传播 规律,同时,利用快速傅里叶变换(FFT)进行计算,还 可以提高运算效率,其主要优点是精度高,占用内存 小,但缺点是计算速度较慢,对模型的适用性差,尤 其是不适应于速度横向变化剧烈的模型。
波动方程有限元法的做法是:将变分法用于单元分 析,得到单元矩阵,然后将单元矩阵总体求和得到总体 矩阵,最后求解总体矩阵得到波动方程的数值解;其主 要优点是理论上可适宜于任意地质体形态的模型,保证 复杂地层形态模拟的逼真性,达到很高的计算精度,但 有限元法的主要问题是占用内存和运算量均较大,不适 用于大规模模拟,因此该方法在地震波勘探中尚未得到 广泛地应用。
i 1, i, j 2 j 2
i 2, j2
x
图4-1 差分网格划分示意图
网格间隔长度
h
时间采,样步长
t
x ih
z jh
t kt
uk
uk i, j
i, j
表示(i,j)点k时刻的波场值
时间二阶、空间二阶差分格式推导如下:
将 uik,在j1 (i,j)点k时刻用Taylor展式展开:
u k 1 i, j
(4-8)
s(k为) 震源函数,
一般使用一个理论的雷克型子波代替,即:
e s(t) (2f / )2t2 cos 2ft
t 为时间
f 为中心频率,一般取为20-40HZ
为控制频带宽度的参数,一般取2-5
(i i0 ) * ( j j0 ) 确定震源位置
4.1 稳定性条件
对于特定的偏微分方程只有特定的几种有限差分 格式是无条件或有条件稳定的,(4-7)、(4-8)式即 是已被证明的有条件稳定格式,其稳定性条件分别为:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目:使用Ricker 子波,刚性边界条件,并且初值为零,在均匀各向同性介质条件下,利用交错网格法求解一阶二维声波方程数值解。

解:一阶二维声波方程:22222221zPx P t P c ∂∂+∂∂=∂∂ (1)将其分解为:21P c t Px P z x z x z V V x z V tV t ∂∂∂⎧=+⎪∂∂∂⎪∂∂⎪=⎨∂∂⎪∂∂⎪=⎪∂∂⎩(2)对分解后的声波方程进行离散,可得到:112211,-1,,,122[]N n n n n m i m j i m j xi j xi j m t VVc P P h +-+---=∆=+-∑ 112211,1,,,122[]Nn n n n m i j m i j m zi j zi j m t VV c P P h +-++---=∆=+-∑ 1111212222,,m 1,,,,11[]Nn n n n n n i ji jmxi j xi m j zi j m zi j m m tc PP cVVVVh+++++++-+--=∆=+-+-∑h z x =∆=∆针对公式(1),使用二阶中心差商公式:2P(,,1)2(,,)(,,1)i j n P i j n P i j n t +-+-∆222(1,,)2(,,)(1,,)(,1,)2(,,)(,1,)P i j n P i j n P i j n xc P i j n P i j n P i j n z +-+-⎧⎫+⎪⎪⎪⎪∆=⎨⎬+-+-⎪⎪⎪⎪⎩∆⎭(3)变形:P(,,1)=2(,,)(,,1)i j n P i j n P i j n +--2222(1,,)2(,,)(1,,)t (,1,)2(,,)(,1,)P i j n P i j n P i j n xc P i j n P i j n P i j n z +-+-⎧⎫+⎪⎪⎪⎪∆+∆⎨⎬+-+-⎪⎪⎪⎪⎩∆⎭(4)对离散格式作时间和空间三重Fourier 变换:0P(,,)(,,)x z i j n P k k w ↔ ,0P(,,1)(,,)*exp()x z i j n P k k w iw t +↔∆0P(1,,)(,,)*exp(k )x z x i j n P k k w i x +↔-∆,0z P(,1,)(,,)*exp(k )x z i j n P k k w i z +↔-∆对公式(4)进行Fourier 变换:2222exp()2exp()h exp()2()exp()2exp()h x x z z ik x ik x iw t iw t t c ik z ik z -∆-+∆⎡⎤+⎢⎥∆=--∆+∆⎢⎥-∆-+∆⎢⎥⎢⎥⎣⎦2222exp()2exp()h exp()2()=exp()2exp()h x x z z ik x ik x iw t iw t t c ik z ik z -∆-+∆⎡⎤+⎢⎥∆-+-∆∆⎢⎥-∆-+∆⎢⎥⎢⎥⎣⎦222222sin sin 22sin (2x z k x k zw tt c h∆∆+∆=∆) (5) 公式(5)右端必须满足下列条件:22222sin sin 220(x z k x k zt c h∆∆+≤∆≤)1 取x k 和z k 最大值,即=x x k π∆,z =k z π∆,则有:22220t c h≤∆≤1因此tc ∆≤即为所求得的稳定性条件。

在程序试算中,选中相关参数如下:dt 0.001()10()3000/20010030N m s x z m v m s x z msx sz m f Hz=⎧⎪∆=∆=⎪⎪=⎪==⎪⎨⎪⎪==⎪=⎪⎪⎩时间网格空间网格(速度)(模型范围)t=1s(采样长度)(震源位置)(主频)=15(空间精度)因为v 3000*0.0013t ∆==<=,满足稳定性条件。

波长v 3000=100m 30f λ==,空间采样间隔h=10m ,一个波长内的空间采样点数 100m=1010hλ==,基本满足网格色散条件。

程序运行输出P(,,)x z t 波场快照:(a) 200ms (b) 300ms(c) 400ms (d) 500ms(e) 600ms (f) 700ms(g) 800ms (h) 900ms图1 波场快照主要程序代码附录:震源Ricker子波函数float f(float t1, float f0){float t00=1/f0,y;y=((1.0-2.0*pow(pi*f0*(t1-t00),2))*exp(-pow(pi*f0*(t1-t00),2)));return y;}计算交错网格有限差分系数void Cal_1D_FdCoff(float *c1,int n){float **A = new float * [n];for (int i = 0; i < n; i++){A[i] = new float [n];}float *x = new float [n];float *b = new float [n];//for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){A[i][j] = pow( 2.0*(j+1)-1, 2.0*(i+1)-1 );}}for (int i = 0; i < n; i++){if (i < 1)b[i] = 1.0;elseb[i]=0;}//Gauss(A,n,b,x);for (int i = 1; i <= n; i++){c1[i] = x[i-1];}for (int i = 0; i < n; i++){delete[] A[i];}delete A;delete x;delete b;}主函数:void main(){FILE *fp;char name[1000];float dt, h;float Ts, f0;int NX, NZ, NT, s_x, s_z, nPoints;fp=fopen("2D_Parameters.txt", "r");fscanf(fp, "%[^\n]\n", name);fscanf(fp, "%f\n", &dt); //Time Intervalfscanf(fp, "%[^\n]\n", name);fscanf(fp, "%d\n", &NX); //X Grid Dimensionfscanf(fp, "%[^\n]\n", name);fscanf(fp, "%d\n", &NZ); //Z Grid Dimensionfscanf(fp, "%[^\n]\n", name);fscanf(fp,"%d\n",&s_x); //Source Xfscanf(fp, "%[^\n]\n", name);fscanf(fp, "%d\n", &s_z); //Source Zfscanf(fp, "%[^\n]\n", name);fscanf(fp,"%f\n",&h); //Space Intervalfscanf(fp, "%[^\n]\n", name);fscanf(fp, "%f\n", &Ts); //Total Timefscanf(fp, "%[^\n]\n", name);fscanf(fp, "%f\n", &f0); //Dominant Frequencyfscanf(fp, "%[^\n]\n", name);fscanf(fp, "%d\n", &nPoints); //Accuracy of FD methodint model;fscanf(fp, "%[^\n]\n", name);fscanf(fp, "%d\n", &model); //modelfclose(fp);NT = (int)((Ts + 1e-6)/dt);///////////////////////////////////////////////////////////////// //The process of opening the arrayfloat **U1, **U2;float **Txx1, **Txx2;float **Tzz1, **Tzz2;float **Vp;U1 = Create2DActivityArray(NZ,NX);U2 = Create2DActivityArray(NZ,NX);Txx1 = Create2DActivityArray(NZ,NX);Txx2 = Create2DActivityArray(NZ,NX);Tzz1 = Create2DActivityArray(NZ,NX);Tzz2 = Create2DActivityArray(NZ,NX);Vp = Create2DActivityArray(NZ,NX);// Set ModelVelocity_Model(model, Vp, NX, NZ);float *c1;c1 = (float*)malloc( sizeof(float) * (nPoints+1) );Cal_1D_FdCoff(c1, nPoints); // Compute FD Coefficient// Print Coefficientfor (int i = 1; i <= nPoints; i++){printf("%e\n", c1[i]);}///////////////////////////////////////////////////////////////// printf("***********Forward Calculation starts!************\n");float sum1, sum3;for (int k = 0; k < NT; k++){for (int j = 0; j < NZ; j++){for (int i = 0; i < NX; i++){sum1 = 0.0;sum3 = 0.0;for (int m = 0; m < nPoints; m++){// U/Xif ( i-m-1 < 0 ){sum1 += (float)c1[m+1] * Txx1[j][i+m];}else if ( i+m > NX-1 ){sum1 -= (float)c1[m+1] * Txx1[j][i-m-1];}else{sum1 += (float)c1[m+1] * (Txx1[j][i+m] -Txx1[j][i-m-1]);}// U/Zif ( j-m < 0 ){sum3 += (float)c1[m+1] * Tzz1[j+m+1][i];}else if ( j+m+1 > NZ-1 ){sum3 -= (float)c1[m+1] * Tzz1[j-m][i];}else{sum3 += (float)c1[m+1] * (Tzz1[j+m+1][i] -Tzz1[j-m][i]);}}//U2[j][i] = -Vp[j][i]*Vp[j][i] * (dt/h) * (sum1 + sum3) + U1[j][i];}//for i}//for j///////////////////////////////////////////////////////////////// for (int j = 0; j < NZ; j++){for (int i = 0; i < NX; i++){sum1 = 0.0;sum3 = 0.0;for (int m = 0; m < nPoints; m++){// V/Xif ( i-m < 0 ){sum1 += (float)c1[m+1] * U2[j][i+m+1];}else if ( i+m+1 > NX-1 ){sum1 -= (float)c1[m+1] * U2[j][i-m];}else{sum1 += (float)c1[m+1] * (U2[j][i+m+1] -U2[j][i-m]);}// V/Zif ( j-m-1 < 0 ){sum3 += (float)c1[m+1] * U2[j+m][i];}else if ( j+m > NZ-1 ){sum3 -= (float)c1[m+1] * U2[j-m-1][i];}else{sum3 += (float)c1[m+1] * (U2[j+m][i] - U2[j-m-1][i]);}}//Txx2[j][i] = -(dt/h) * sum1 + Txx1[j][i];Tzz2[j][i] = -(dt/h) * sum3 + Tzz1[j][i];//添加震源项if ( i==s_x && j==s_z ){Txx2[j][i]+=f(k*dt, f0);}}//for i}//for j////////////////////////////////////////////////////////////////Tranfer the value.////for (int j = 0; j < NZ; j++) {for (int i = 0; i < NX; i++){U1[j][i] = U2[j][i];Txx1[j][i] = Txx2[j][i];Tzz1[j][i] = Tzz2[j][i];}}////////////////////////////////////////////////////////////if (k > 0){Fwrite_Snapshot_U(U2, NX, NZ, k, 50);}printf("The %d ms Forward file has finished!\n",k);//Finish the circulation of K.}Release2DActivityArray(U1,NZ);Release2DActivityArray(U2,NZ);Release2DActivityArray(Txx1,NZ);Release2DActivityArray(Txx2,NZ);Release2DActivityArray(Tzz1,NZ);Release2DActivityArray(Tzz2,NZ);Release2DActivityArray(Vp,NZ);}。

相关文档
最新文档