叠加地震记录的相移波动方程正演模拟数值模拟实验共22页

合集下载

地震波波动方程数值模拟方法(严选优质)

地震波波动方程数值模拟方法(严选优质)

地震波波动方程数值模拟方法地震波波动方程数值模拟方法主要包括克希霍夫积分法、傅里叶变换法、有限元法和有限差分法等。

克希霍夫积分法引入射线追踪过程,本质上是波动方程积分解的一个数值计算,在某种程度上相当于绕射叠加。

该方法计算速度较快,但由于射线追踪中存在着诸如焦散、多重路径等问题,故其一般只能适合于较简单的模型,难以模拟复杂地层的波场信息。

傅里叶变换法是利用空间的全部信息对波场函数进行三角函数插值,能更加精确地模拟地震波的传播规律,同时,利用快速傅里叶变换(FFT)进行计算,还可以提高运算效率,其主要优点是精度高,占用内存小,但缺点是计算速度较慢,对模型的适用性差,尤其是不适应于速度横向变化剧烈的模型.波动方程有限元法的做法是:将变分法用于单元分析,得到单元矩阵,然后将单元矩阵总体求和得到总体矩阵,最后求解总体矩阵得到波动方程的数值解;其主要优点是理论上可适宜于任意地质体形态的模型,保证复杂地层形态模拟的逼真性,达到很高的计算精度,但有限元法的主要问题是占用内存和运算量均较大,不适用于大规模模拟,因此该方法在地震波勘探中尚未得到广泛地应用。

相对于上述几种方法,有限差分法是一种更为快速有效的方法。

虽然其精度比不上有限元法,但因其具有计算速度快,占用内存较小的优点,在地震学界受到广泛的重视与应用。

声波方程的有限差分法数值模拟对于二维速度-深度模型,地下介质中地震波的传播规律可以近似地用声波方程描述:)()(2222222t S zu x u v t u +∂∂+∂∂=∂∂ (4-1) (,)v x z 是介质在点(x , z )处的纵波速度,u 为描述速度位或者压力的波场,)(t s 为震源函数。

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

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

设x 、z 方向的网格间隔长度为h ∆,t ∆为时间采样步长,则有:z∆,i j1,i j +2,i j+1,i j-h i x ∆= (i 为正整数)h j z ∆= (j 为正整数)t n t =∆ (n 为正整数)k j i u , 表示在(i,j)点,k 时刻的波场值。

地震模型正演

地震模型正演

地震模型正演与反演简介一、地震模型正演(seismic forward modeling)的概念如果我们已知地下的地质模型,它的地震响应如何?地震模型正演就是通过室内模拟得到地质模型对于地震波的响应。

地震模型正演包括物理模拟和数值模拟,数值模拟就是应用相应的地球物理方程和数值计算求解已知的地质模型在假定激发源的作用下的地震相应。

通常,我们针对特定的勘探区块,应用期望或实际的采集参数通过地震正演模拟野外地震采集,得到单炮记录,再通过速度分析、动校正、叠加、偏移等处理得到成像数据。

图1为Marmousi速度模型,图2为正演得到的炮集记录,图3为正演得到的叠加剖面。

图1 Marmousi模型图2正演炮集图3 正演叠加剖面二、数值模型正演方法通常,我们提到的模型正演为数值模拟的模型正演,目前常用的数值模拟地震模型正演方法包括基于射线原理的射线追踪法,以及基于波动方程的有限差分法、有限元法、积分方程法、快速傅里叶变换法和拟谱法等。

射线追踪法主要反映地震波的运动学特征,有限差分、有限元法则适合复杂地质构造的正演模拟,积分方程法涉及复杂的数学推导,快速傅里叶变换法在频率域计算得到正演数据。

三、数值模型正演的步骤数值模拟求解地震模型正演问题的步骤主要包括以下三个方面:1) 地质建模,根据研究对象和问题建立地球物理或地质模型;2) 数学建模,根据应用的物理手段和地球物理模型建立相应的数学模型;3) 模拟计算,选择正演计算方法,编写计算程序进行数值模拟计算。

四、什么是地震反演地震反演技术就是充分利用测井、钻井、地质资料提供的丰富的构造、层位、岩性等信息,从常规的地震剖面推导出地下地层的波阻抗、密度、速度、孔隙度、渗透率、沙泥岩百分比、压力等地球物理信息。

反演就是由地震数据得到地质模型,进行储层、油藏研究。

地震资料反演可分为两部分:1)通过有井(绝对)、无井(相对)波阻抗反演得到波阻抗、速度数据体。

2)利用测井、测试资料结合波阻抗、速度数据进行岩性反演,得到孔隙度、渗透率、砂泥百分比、压力等物理数据。

叠加地震记录的相移波动方程正演模拟数值模拟实验word精品文档22页

叠加地震记录的相移波动方程正演模拟数值模拟实验word精品文档22页

《地震数值模拟》实验报告一、实验题目叠加地震记录的相移波动方程正演模拟二、实验目的1.掌握各向同性介质任意构造、水平层状速度结构地质模型的相移波动方程正演模拟基本理论2.实现方法与程序编制3.由正演记录初步分析地震信号的分辨率。

三、实验原理1、地震波传播的波动方程设(x,z)为空间坐标,t为时间,地震波传播速度为v(x,z),则二位介质中任意位置、任意时刻的地震波场为p(z,x,t):压缩波——纵波。

则二维各向同性均匀介质中地震波传播的遵循声波方程为2、傅里叶变换的微分性质p(t)与其傅里叶变换的P(w)的关系:3、地震波传播的相移外推公式令速度v不随x变化,只随z变化,则利用傅里叶变换微分性质把波动方程(变换到频率-波数域,得:4、初始条件和边界条件按照爆炸界面理论,反射界面震源在t=0时刻同时起爆,此时刻的波场就是震源。

根据不同情况,可直接使用反射系数脉冲或子波作震源。

如果直接使用反射系数作震源脉冲,则初始条件可表示为:5、边界处理(1)边界反射问题把实际无穷空间区域中求解波场的问题化为有穷区域求解时,左右两边使用零边界条件。

物理上假设探区距Xmin与Xmax两个端点很远,在两个端点上收到的反射波很弱。

但是,上述条件在实际中不能成立,造成零边界条件反而成为绝对阻止波通过的强反射面。

在正演模拟的剖面上出现了边界假反射干涉正常界面的反射。

(2)边界强反射的处理镶边法、削波法、吸收边界都能有效消除边界强反射。

削波法就是在波场延拓过程中,没延拓一次,在其两侧均匀衰减到零,从而消除边界强反射的影响。

假设横向总长度为NX,以两边Lx道吸波为例,有以下吸波公式:四、实验内容1、基本要求(1)点绕射构造和水平层状速度模型(参数如图1所示)的正演数值模拟;五、实验步骤1、参数初始化;2、形成边界削波数据;3、波场初始化;4、Zmax层波场延拓到深度Zmax-1;5、Zi+1层波场延拓到深度Zi;6、重复5,从Iz=Nz-1开始,直到Iz=1,得测线上的频率—空间域波场;7、频率-空间域波场对频率做反傅里叶变换,得时间-空间波场;8、使用Fimage软件显示所得结果。

数值模拟实验报告

数值模拟实验报告

一、实验题目地震记录数值模拟的这几模型法 二、实验目的掌握褶积模型基本理论、实现方法与程序编制,由褶积模型初步分析地震 信号的分辨率问题 三、实验原理 1、褶积原理地震勘探的震源往往是带宽很宽的脉冲,在地下传播、反射、绕射到测线,传播经过中 高频衰减,能量被吸收。

吸收过程可以看成滤波的过程,滤波可以用褶积完成。

在滤波中, 反射系数与震源强弱关联,吸收作用与子波关联。

最简单的地震记录数值模拟,可以看成反 射系数与子波的褶积。

通常,反射系数是脉冲,子波取雷克子波。

(1) 雷克子波Wave(t) = (1−2π2f 2t 2)e −2π2f 2t 2(2)反射系数:rflct(z)=1 z =z 反射界面0 z =others(3)褶积公式: 数值模拟地震记录trace(t): trace(t) =rflct(t)*wave(t)反射系数的参数由z 变成了t ,怎么实现?在简单水平层介质,分垂直和非垂直入射两 种实现,分别如图1 和图2 所示。

1) 垂直入射:t =2h v图一垂直入射2) 非垂直入射:t =2 h 2+x 2v图二非垂直入射2、褶积方法(1)离散化(数值化)计算机数值模拟要求首先必须针对连续信号离散化处理。

反射系数在空间模型中存在,不同深度反射系数不同,是深度的 函数。

子波是在时间记录上一延续定时间的信号,是时间的概念。

在离散化时,通过深度采 样完成反射系数的离散化,通过时间采样完成子波的离散化。

如果记录是Trace(t),则记录 是时间的函数,以时间采样离散化。

时间采样间距以∆t 表示,深度采样间距以∆z 表示。

在 做多道的数值模拟时,还有横向x 的概念,横向采样间隔以∆x 表示。

离散化的实现:t=It×∆t ;x=Ix×∆x ;z=Iz×∆z或:It=t/∆t; Ix=x/∆x; Iz=z/∆z (2)离散序列的褶积 trace It = rflct(Itao) ×wave(It −Itao)∞Itao =−∞ 四、实验内容1、垂直入射地震记录数值模拟的褶积模型;2、非垂直入射地震记录数值模拟的褶积模型;3、点绕射的地震记录数值模拟的褶积模型;五、方法路线根据褶积模型的实验原理编写C++程序,完成对于垂直入射波的褶积。

模拟地震演示实验报告(3篇)

模拟地震演示实验报告(3篇)

第1篇一、实验背景地震作为一种自然灾害,给人类带来了巨大的生命财产损失。

为了提高人们对地震的认识和应对能力,我们进行了模拟地震演示实验。

本次实验旨在通过模拟地震现象,让学生直观地了解地震成因、传播过程及地表变化,增强他们的防灾减灾意识。

二、实验目的1. 了解地震成因及传播过程;2. 熟悉地震波对地表的影响;3. 增强学生的防灾减灾意识。

三、实验原理地震是地壳内部岩石层在内外力作用下发生变形或断裂,产生的地震波传到地表引起地表震动的过程。

本实验采用模拟地震的方法,通过搭建模拟地震装置,模拟地震成因、传播过程及地表变化。

四、实验器材1. 模拟地震装置:由支架、模型岩石层、弹簧、传感器等组成;2. 计时器;3. 地震波记录仪;4. 地表模型;5. 地震波模拟软件。

五、实验步骤1. 搭建模拟地震装置:将支架固定在地面上,将模型岩石层放置在支架上,将弹簧连接在岩石层两端,确保弹簧处于拉伸状态;2. 连接传感器:将传感器安装在岩石层上,连接地震波记录仪;3. 地震波模拟:启动地震波模拟软件,模拟地震波传播过程;4. 观察现象:观察岩石层变形、弹簧伸缩、传感器数据变化及地表模型变化;5. 记录实验数据:记录岩石层变形程度、弹簧伸缩长度、传感器数据及地表模型变化情况。

六、实验结果与分析1. 实验结果显示,模拟地震装置在地震波模拟软件的驱动下,岩石层发生了变形,弹簧伸缩,传感器数据发生明显变化,地表模型也发生了相应的变化;2. 通过实验数据,可以得出以下结论:(1)地震波在传播过程中,会使得岩石层发生变形,弹簧伸缩,导致地表发生变化;(2)地震波传播速度与岩石层性质、地震波频率等因素有关;(3)地震波传播过程中,能量逐渐衰减,地表变化程度与地震波传播距离有关。

七、实验总结本次模拟地震演示实验,使学生直观地了解了地震成因、传播过程及地表变化,提高了他们的防灾减灾意识。

实验过程中,学生积极参与,认真观察,对地震现象有了更深入的认识。

复杂地质体波动方程地震波场模拟与偏移成像

复杂地质体波动方程地震波场模拟与偏移成像

图3-1四川盆地邛西qx4井区域无裂缝岩性构造剖面模型及层速度分布图3—2四川盆地邛西qx4井区域无裂缝岩性构造地质模型的地震正演(pspzt=3350m.vl=3800m/s.dx=25m,dz=4m.80×128)其中pspi代表纵横向速度可变的波场延拓方法,ps代表纵向速度可变的波场延拓方法,z1表示模型的其始深度,d)【为道间距(米),dz为深度延拓步长(米)(以下同)。

图3_3四川盆地邛西Ox4井区域无裂缝地质构造模型记录的偏移剖面(pspz1=3350m.vl=3800m/s,dx=25m.dz=4m.80x128)图3-4四川盆地邛西qx4井区域无裂缝地质构造模型加密型(dx,dz缩减一倍)的偏移剖面(pspi.zl=335()la,vl=3800m/s,dx=12.5m.dz=2Jn.160x256)图3—3和图3-4的偏移剖面中,均能清晰地分辨出地层、岩性和构造、断层存在的空间位置,也能可靠地分辨出薄层,能与原始地质模型图3-1全面对比,说明波动方程正演和偏移的质量正确、可靠,在此基础上做裂缝模拟具有良好的条件。

偏移剖面中,界面的台阶形状是与离散采样后的输入地质剖面一致的,这进一步说明所用正演和偏移方法的高质量。

(2)有裂缝的复杂岩性构造模型(裂缝带在图中部透镜体之下)裂缝充填物的性质由裂缝带的散射系数确定,散射系数大,代表充填物为流体,散射系数小,代表充填物为刚性系数大的物质,散射系数的正负,由充填物和围岩之间的性质决定。

下面分别采用了0.2,0.05和.0.10的散射系数。

图3_5四川盆地邛西qx4井区域有裂缝地质构造模型及层速度分布(裂缝等效散射系数0.2)圈3-6四川盆地邛西qx4井区域裂缝地质构造模型正演(pspi.zl=3350m.vl=3800nVs,dx=25m.dz=4m.80×128裂缝散射系数0.2)图3-7POIII盆地邛西qx4并区域裂缝地质构造模型正演(ps,z1=3350m,v1=3800m/s.dx=25m。

数值模型模拟实验报告

数值模型模拟实验报告
(1 2 2Vm t 2 )e Vm t
2
2
2 2
二:实验内容(程序)
三:实验结果(图形)
四:实验结果解释
上图的五个子波图形的频率分别是 10Hz、 20Hz、 30 Hz、 40 Hz 和 50 Hz。 数据输出格式为 1 到 70。
实验二:一维褶积
一:实验原理(公式) 褶积的定义: C ( ) x( ) * y( )
五:实验结果验算
其中 T1、T2 是在 Fimage 上直接读出的时间域的时间 T1’、T2’是根据深度域速度模型计算出来的时间

n
x(n) y( n)
褶积的基本步骤:褶迭、时移、对应项相乘相加。 地震记录=反射系数与子波褶积 根据实验一得到的雷克子波与假设的反射系数进行褶积,得到实际地震记录。 单道地震记录是由若干个反射界面的反射波叠加而成。 二:实验内容(程序)
三:实验结果(图形)
四:实验结果解释
Ti=Ti-1+2(Hi-Hi-1)/V 其中 H 为深度。
反射系数 ref=(P2V2-P1V1)/(P1V1+P2V2) 界面产生反射的条件是存在波阻抗差,即 P1V1≠P2V2 二:实验内容(程序)
三:实验思路: 步骤 1:首先建立一个二维的速度模型
步骤 2:读取二进制深度域速度文件 步骤 3:通过深时转换,把深度域速度转换为时间域速度 步骤 4:计算观测系统中界面处的反射系数 步骤 5:在实验二的基础上,计算二维褶积 步骤 6:用 Fimage 绘图,根据深度域速度模型图和时间域速度模型图验算到达 每层地层界面的时间是否相等 四:实验结果(图形)
合成记录是在程序中把四个界面的反射系数都输入进去, 手算叠加记 录是在电子表格中算出来的。

第四章-动校正及叠加

第四章-动校正及叠加
2
2
非零炮检距
零炮检距
动校正之后同相轴变胖
第四章 动校正及叠加
第一节 动校正
五、数字动校正方法和动校正拉伸
1
T 2 1 2 2 1 1 T 1 2
1
T
1
T
2
T T
2
x 1000 x 2000
第四章 动校正及叠加
第一节 动校正
一、动校正的概念
x t x t x t 0 t 0 t 0 v
2 2
速度越小、动校正时差越大
上抛
校平 下拉
CMP道集
正确速度
速度偏大
速度偏低
速度误差对动校正的影响
不在整数样点上
第四章 动校正及叠加
第一节 动校正
五、数字动校正方法和动校正拉伸
数字动校正 插值函数:
y x y x it
i 1
N
sin

t
it
不在采样点上

t
it
动校正之后的样点由动校正 之前的样点插值得到
第四章 动校正及叠加
第一节 动校正
五、数字动校正方法和动校正拉伸
动校正拉伸:地震记录上的子波由
若干离散点组成,在动校正过程中,各 个离散点动校正量不同,动校正之后的
1
1
T
子波将不再保持原来的形态,子波形态 发生相对畸变 。
1
T
2
2
2
x t x t x t 0 t 0 t 0 v
第二节 水平叠加
二、自适应水平叠加
权系数的确定:与标准道相关 确定第j道第i时刻的相关值
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《地震数值模拟》实验报告一、实验题目叠加地震记录的相移波动方程正演模拟二、实验目的1.掌握各向同性介质任意构造、水平层状速度结构地质模型的相移波动方程正演模拟基本理论2.实现方法与程序编制3.由正演记录初步分析地震信号的分辨率。

三、实验原理1、地震波传播的波动方程设(x,z)为空间坐标,t为时间,地震波传播速度为v(x,z),则二位介质中任意位置、任意时刻的地震波场为p(z,x,t):压缩波——纵波。

则二维各向同性均匀介质中地震波传播的遵循声波方程为2、傅里叶变换的微分性质p(t)与其傅里叶变换的P(w)的关系:3、地震波传播的相移外推公式令速度v不随x变化,只随z变化,则利用傅里叶变换微分性质把波动方程(变换到频率-波数域,得:4、初始条件和边界条件按照爆炸界面理论,反射界面震源在t=0时刻同时起爆,此时刻的波场就是震源。

根据不同情况,可直接使用反射系数脉冲或子波作震源。

如果直接使用反射系数作震源脉冲,则初始条件可表示为:5、边界处理(1)边界反射问题把实际无穷空间区域中求解波场的问题化为有穷区域求解时,左右两边使用零边界条件。

物理上假设探区距Xmin与Xmax两个端点很远,在两个端点上收到的反射波很弱。

但是,上述条件在实际中不能成立,造成零边界条件反而成为绝对阻止波通过的强反射面。

在正演模拟的剖面上出现了边界假反射干涉正常界面的反射。

(2)边界强反射的处理镶边法、削波法、吸收边界都能有效消除边界强反射。

削波法就是在波场延拓过程中,没延拓一次,在其两侧均匀衰减到零,从而消除边界强反射的影响。

假设横向总长度为NX,以两边Lx道吸波为例,有以下吸波公式:四、实验内容1、基本要求(1)点绕射构造和水平层状速度模型(参数如图1所示)的正演数值模拟;五、实验步骤1、参数初始化;2、形成边界削波数据;3、波场初始化;4、Zmax层波场延拓到深度Zmax-1;5、Zi+1层波场延拓到深度Zi;6、重复5,从Iz=Nz-1开始,直到Iz=1,得测线上的频率—空间域波场;7、频率-空间域波场对频率做反傅里叶变换,得时间-空间波场;8、使用Fimage软件显示所得结果。

六、实验编程/*******1.头文件********/#include<stdio.h>#include<math.h>#include<conio.h>#include<stdlib.h>#include<string.h>//---2.Function Request功能要求函数说明------int kkfft(float *,float *,int,int);int Absorb(int); //削波函数int Rflct(); //反射函数int Vlcty(); //速度函数int WvFld0(); //波长函数int exp_ikzDz(float *,int,float,int,float,float);//int PsFrwd();//int Po2Judge(int);//-#define Nx 128 //---3.参数设置定义符号--- --#define Nt 256#define Nz 100#define Dx 20#define Dt 0.004#define Dz 20#define pai 3.1415926int main()int Labs=10; //定义削波边界范围if(Po2Judge(Nt) !=1) { printf("Nt=%d is not the Power of2\n",Nt);exit(0); }if(Po2Judge(Nx) !=1) { printf("Nx=%d is not the Power of2\n",Nt);exit(0); }if(Absorb(Labs) !=1) { printf("Absorb is error\n"); exit(0); }if(Rflct() !=1) { printf("Rflction is error\n"); exit(0); }if(Vlcty() !=1) { printf("Vlcty is error\n"); exit(0); }if(WvFld0() !=1) { printf("WvFld is error\n"); exit(0); }if(PsFrwd() !=1) { printf("PsFrwd is error\n"); exit(0); }return 1;int Po2Judge(int N) //////////判断是否是2的倍数/////////////////int k=0;long Ln=0;for(k=0;N-Ln>0;k++)Ln=(long)pow(2,k);Ln=(long)pow(2,k-1);if (fabs(Ln-N)>=1)return (0);return 1;//////////定义快速傅立叶函数///////////////int kkfft(float pr[],float pi[],int n,int l)int it,m,is,i,j,nv,l0,il=0;float p,q,s,vr,vi,poddr,poddi;float fr[4096],fi[4096];int k=0;long Ln=0;for(k=0;n-Ln>0;k++)Ln=(long)pow(2,k);k=k-1;for (it=0; it<=n-1; it++)m = it;is = 0;for(i=0; i<=k-1; i++)j = m/2;is = 2*is+(m-2*j);m = j;fr[it] =pr[is];fi[it] = pi[is];pr[0] = 1.0;pi[0] = 0.0;p = 6.283185306/(1.0*n);pr[1] = (float) cos(p);pi[1] = -(float)sin(p);if (l!=0)pi[1]=-pi[1];for (i=2; i<=n-1; i++)p = pr[i-1]*pr[1];q = pi[i-1]*pi[1];s = (pr[i-1]+pi[i-1])*(pr[1]+pi[1]);pr[i] = p-q;pi[i] = s-p-q;for (it=0; it<=n-2; it=it+2)vr = fr[it];vi = fi[it];fr[it] = vr+fr[it+1];fi[it] = vi+fi[it+1];fr[it+1] = vr-fr[it+1];fi[it+1] = vi-fi[it+1];m = n/2;nv = 2;for (l0=k-2; l0>=0; l0--)m = m/2;nv = 2*nv;for(it=0; it<=(m-1)*nv; it=it+nv)for (j=0; j<=(nv/2)-1; j++)p = pr[m*j]*fr[it+j+nv/2];q = pi[m*j]*fi[it+j+nv/2];s = pr[m*j]+pi[m*j];s = s*(fr[it+j+nv/2]+fi[it+j+nv/2]);poddr = p-q;poddi = s-p-q;fr[it+j+nv/2] = fr[it+j]-poddr;fi[it+j+nv/2] = fi[it+j]-poddi;fr[it+j] = fr[it+j]+poddr;fi[it+j] = fi[it+j]+poddi;if(l!=0)for(i=0; i<=n-1; i++)fr[i] = fr[i]/(1.0*n);fi[i] = fi[i]/(1.0*n);if(il!=0)for(i=0; i<=n-1; i++)pr[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i]);if(fabs(fr[i])<0.000001*fabs(fi[i]))if ((fi[i]*fr[i])>0)pi[i] = 90.0;elsepi[i] = -90.0;elsepi[i] = atan(fi[i]/fr[i])*360.0/6.283185306;for(i=0;i<n;i++)pr[i]=fr[i];pi[i]=fi[i];return(1);//***调用削波函数,形成削波数据存入一个文件**/int Absorb(int Lx) //Nx已为全局变量不参与传递FILE *fp_Abs;int Ix;float Abs[Nx];if((fp_Abs=fopen("Absb.dat","wb"))==NULL) {printf("Connot open file""Absb"""); }for(Ix=0;Ix<Nx;Ix++)Abs[Ix]=1;//*****for(Ix=0;Ix<Lx-1;Ix++)Abs[Ix]=sqrt(sin((pai/2)*(Ix/(Lx-1))));Abs[Nx-Ix-1]=Abs[Ix];//*****for(Ix=0;Ix<Nx;Ix++)fwrite(&Abs[Ix],sizeof(Abs[Ix]),1,fp_Abs);fclose(fp_Abs);return 1;/******反射系数_构造形态模型的生成*****/int Rflct()FILE *fp_Rflct;int Ix,Iz;float Rflct[Nz];if((fp_Rflct=fopen("Rflct.dat","wb"))==NULL){printf("Connot open file""Reflection""");}for(Ix=0;Ix<Nx;Ix++)for(Iz=0;Iz<Nz;Iz++)Rflct[Iz]=0;//*****if(Ix==Nx/2-1&&Iz==Nz/2-1)//*****Rflct[Iz]=1;//*****fwrite(&Rflct[Iz],sizeof(Rflct[Iz]),1,fp_Rflct);fclose(fp_Rflct);return 1;int Vlcty() /********速度模型的生成*********/FILE *fp_Vlcty;int Ix,Iz;float Vlcty[Nz];if((fp_Vlcty=fopen("Vlcty.dat","wb"))==NULL){printf("Connot open file""Vlcty""");}for(Ix=0;Ix<Nx;Ix++)for(Iz=0;Iz<Nz;Iz++)if(Iz<=3*Nz/4-1)//*****Vlcty[Iz]=5000;//*****elseVlcty[Iz]=5500;//*****fwrite(&Vlcty[Iz],sizeof(Vlcty[Iz]),1,fp_Vlcty);fclose(fp_Vlcty);return 1;/********爆炸反射界面的生成,并调用FFT函数变换到频率域储存*******/int WvFld0()FILE *fp_Rflct,*fp_Wfld0r,*fp_Wfld0i;int Ix,Iz,It;float Rflct[Nz],Wfld0r[Nt],Wfld0i[Nt];if((fp_Wfld0r=fopen("Wfld0r.dat","wb"))==NULL){printf("Connot open Wfld0r.dat");}if((fp_Wfld0i=fopen("Wfld0i.dat","wb"))==NULL){printf("Connot open Wfld0i.dat");}if((fp_Rflct =fopen("Rflct.dat" ,"rb"))==NULL){printf("Connot open Rflct.dat");}for(Ix=0;Ix<Nx;Ix++)printf("Wavefield0_FFT: Ix=%d\n",Ix);for(Iz=0;Iz<Nz;Iz++) //赋值,爆炸反射界面t=0时刻起爆fread(&Rflct[Iz],sizeof(Rflct[Iz]),1,fp_Rflct);for(It=0;It<Nt;It++)Wfld0r[It]=0;Wfld0i[It]=0;if(It==0) Wfld0r[It]=Rflct[Iz];//*****if(kkfft(Wfld0r,Wfld0i,Nt,0)!=1) {printf("FFT is error");exit(0);}for(It=0;It<Nt/2+1;It++) //利用付氏变换的对称性,保存一半的数据fwrite(&Wfld0r[It],sizeof(Wfld0r[It]),1,fp_Wfld0r);//*****fwrite(&Wfld0i[It],sizeof(Wfld0i[It]),1,fp_Wfld0i);//*****fclose(fp_Rflct);fclose(fp_Wfld0r);fclose(fp_Wfld0i);return 1;/////**********PhaseShift Forward Modeling **********/////int PsFrwd() //--波场相移延拓int PhaseShift( ); // Requset Function:PhaseShift调用波长函数相移延拓计算函数int Frqcy2Time( ); //调用波场做IFFT从频率域变换到时间域函数if ( PhaseShift( ) !=1 ) {printf("PhaseShift is error\n"); exit(0); }// Call Functionif ( Frqcy2Time( ) !=1 ) {printf("Frqcy2Time is error\n"); exit(0); }// Call Functionreturn 1;int PhaseShift()// 1. Prepprocedure预处理FILE*fp_Wfldr,*fp_Wfldi,*fp_Wfld0r,*fp_Wfld0i,*fp_Vlcty,*fp_Absb;float kz[2];int Ix,Ikx,Nkx=Nx,Iz,Iw,Nw=Nt;long Mgrtn;float Vlcty[Nz];float Absb[Nx],Wfld0r[Nx],Wfld0i[Nx],Wfldr[Nx],Wfldi[Nx];float Wfld_r,Wfld_i;float Kxmax,Dkx,Wmax,Dw;Wmax = pai/0.004;Dw = Wmax/Nt;Kxmax = pai/20.;Dkx = Kxmax/Nx;// 2. Read in Velocity and Absorbing Boundary Date速度与削波数据读入if((fp_Vlcty = fopen("Vlcty.dat","rb"))==NULL){printf("Cann't open file Vlcty.dat\n");}for(Iz=0;Iz<Nz;Iz++)fread(&Vlcty[Iz],sizeof(Vlcty[Iz]),1,fp_Vlcty);fclose(fp_Vlcty);if((fp_Absb = fopen("Absb.dat","rb"))==NULL) {printf("Cann't open file Absb.dat\n");}for(Ix=0;Ix<Nx;Ix++)fread(&Absb[Ix],sizeof(Absb[Ix]),1,fp_Absb);fclose(fp_Absb);// 3. Open Initial Wave Field File and Current Wave Field File using In Wave Fied Extrapolating波场文件打开if((fp_Wfld0r = fopen("Wfld0r.dat","rb"))==NULL){printf("Cann't open file Wfld0r.dat\n");}if((fp_Wfld0i = fopen("Wfld0i.dat","rb"))==NULL){printf("Cann't open file Wfld0i.dat\n");}if((fp_Wfldr = fopen("Wfldr.dat","wb")) ==NULL){printf("Cann't open file Wfldr.dat \n");}if((fp_Wfldi = fopen("Wfldi.dat","wb")) ==NULL){printf("Cann't open file Wfldi.dat \n");}// 4. 每个频率的波场延拓for(Iw=0;Iw<Nw/2+1;Iw++)// 4.1初始化当前波场for(Ix=0;Ix<Nx;Ix++)Wfldr[Ix]=0.;Wfldi[Ix]=0.;// 4.2波场从Iz=Nz-1最深处开始,延拓到Iz=1测线深度for(Iz=Nz-1;Iz>0;Iz--)// 4.2.1形成新波场for(Ix=0;Ix<Nx;Ix++)// 1. Take out Initial Wave Field Data With every Depth取出当前深度的初始波场Mgrtn=(Ix*Nz+1+Iz)*(Nt/2+1)+Iw;fseek(fp_Wfld0r,sizeof(Wfld0r[Ix])*Mgrtn,SEEK_SET);fseek(fp_Wfld0i,sizeof(Wfld0i[Ix])*Mgrtn,SEEK_SET);fread(&Wfld0r[Ix],sizeof(Wfld0r[Ix]),1,fp_Wfld0r);fread(&Wfld0i[Ix],sizeof(Wfld0i[Ix]),1,fp_Wfld0i);// 2.新波场=初始波场+从下面延拓到此处的波场Wfldr[Ix] = Wfldr[Ix]+Wfld0r[Ix];Wfldi[Ix] = Wfldi[Ix]+Wfld0i[Ix];// 3.边界削波:新波场=新波场×削波因子Wfldr[Ix] = Wfldr[Ix]*Absb[Ix];Wfldi[Ix] = Wfldi[Ix]*Absb[Ix];// 4.2.2 新波场FFT到波数域if( kkfft(Wfldr,Wfldi,Nx,0) !=1 ) { printf("FFT is error\n");exit(0); }// 4.2.3频率-波数域波场在从Iz+1延拓到Izfor(Ikx=0;Ikx<Nx/2+1;Ikx++)// 1.计算相移数据expikzdz(实部、虚部if( exp_ikzDz(kz,Ix, (float)(Vlcty[Iz]/2.),Iw,Dw,Dkx) !=1) { printf("exp_ikzDz is error\n");exit(0); };// 2.波场延拓:波场=波场×相移数据Wfld_r = Wfldr[Ikx]*kz[0]-Wfldi[Ikx]*kz[1];Wfld_i = Wfldi[Ikx]*kz[0]+Wfldr[Ikx]*kz[1];Wfldr[Ikx] = Wfld_r;Wfldi[Ikx] = Wfld_i;if(Ikx!=0&&Ikx!=Nkx/2)Wfld_r =kz[0]*Wfldr[Nkx-Ikx]-kz[1]*Wfldi[Nkx-Ikx];Wfld_i =kz[1]*Wfldr[Nkx-Ikx]+kz[0]*Wfldi[Nkx-Ikx];Wfldr[Nkx-Ikx] = Wfld_r;Wfldi[Nkx-Ikx] = Wfld_i;// 4.2.4 波场反FFT到空间域if( kkfft(Wfldr,Wfldi,Nkx,1) !=1 ) { printf("FFT is error\n");exit(0); }// 4.3 存储延拓到了测线的波场for(Ix=0;Ix<Nx;Ix++)fwrite(&Wfldr[Ix],sizeof(Wfldr[Ix]),1,fp_Wfldr);fwrite(&Wfldi[Ix],sizeof(Wfldi[Ix]),1,fp_Wfldi);// 5.关闭文件,删除中间文件。

相关文档
最新文档