石油软件概论报告.docx

上传人:b****5 文档编号:4967296 上传时间:2022-12-12 格式:DOCX 页数:29 大小:464.72KB
下载 相关 举报
石油软件概论报告.docx_第1页
第1页 / 共29页
石油软件概论报告.docx_第2页
第2页 / 共29页
石油软件概论报告.docx_第3页
第3页 / 共29页
石油软件概论报告.docx_第4页
第4页 / 共29页
石油软件概论报告.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

石油软件概论报告.docx

《石油软件概论报告.docx》由会员分享,可在线阅读,更多相关《石油软件概论报告.docx(29页珍藏版)》请在冰豆网上搜索。

石油软件概论报告.docx

石油软件概论报告

 

本科生实验报告

实验课程石油地球物理软件技术概论

学院名称地球物理学院

专业名称勘查技术与工程

学生姓名

学生学号201105060416

指导教师赵宪生

实验地点地球物理学院5419

实验成绩

 

二〇一四年十一月二〇一四年十二月

资料处理软件与交互软件设计

摘要

地球物理软件技术发展表现出的先进性,开放性一体化,自由化,网络化,普遍化等特征。

利用地震资料的横向相关性的特点,从分频处理的思想出发,把小波分析原理应用于提高地震资料信噪比和分辨率的处理上.通过对实际资料的处理表明,使用小波变换方法对地震资料进行处理,具有更为精细的特点,处理效果有明显的改善.该文的重点在于小波变换地震资料处理软件包的设计与实现.采用自顶向下逐步求精的结构化方法,按照功能特点逐步细化,得出整个软件包的系统流程图、数据流图、层次结构图,最终将软件结构转化为软件过程化描述,实现每个模块的算法,使它们有机地结合成为一个高效系统伴随石油地球物理不断地向前发展,我们对于数据的收集量和处理量都急剧攀升,不论是科研还是实际勘探都面临着数据资料处理效率带来的压力。

目前市面上的数据资料处理软件类目繁杂、价格昂贵,且软件与软件之间几乎无法实现数据的共享。

关键词:

石油地球物理软件;地震资料;数据整理;数据流图

第1章segy数据滤波

1.1方法

segy是指“segy格式地震数据”。

标准SEG-Y文件一般包括三部分,第一部分是EBCDIC文件头(3200字节),由40个卡组成(例如:

每行80个字符*40行),用来保存一些对地震数据体进行描述的信息;第二部分是二进制文件头(400字节)用来存储描述SEG-Y文件的一些关键信息,包括SEG-Y文件的数据格式、采样点数、采样间隔、测量单位等一些信息,这些信息一般存储在二进制文件头的固定位置上;第三部分是实际的地震道,每条地震道都包含240字节的道头信息和地震道数据。

道头数据中一般保存该地震道对应的线号、道号、采样点数、大地坐标等信息,但一些关键的参数位置(如线号、道号在道头中的位置)并不固定。

地震道数据是对地震信号的波形按一定时间间隔Δt进行取样,再把这一系列的离散振幅值以某种方式记录下来[1]。

地震数据格式可以是IBM浮点型、IEEE浮点型、整型、长整型等,一个三维地震工区同一次处理的地震数据格式是唯一的。

地震道采样点数由该地震道道头中采样点数决定,大部分SEG-Y文件的所有地震道采样点数是一致的,但也存在不同地震道采样点数不同得情况,一般称这种SEG-Y文件为变道长格式的SEG-Y文件。

1.2程序

//++++++++++++++++++++++++++++++++++++++++++++++++++++//

//读segy数据方法//

//++++++++++++++++++++++++++++++++++++++++++++++++++++//

#include

#include

#include

#include

#defineLEN3200

#defineNQ230000

voidfilter(float*h,intn)

{

inti;

floatt,f=40.,dt=0.001,pi=3.14;

for(i=1;i<=n/2;i++)

{

t=i*dt;

h[i]=sin(2*pi*f*t)/(t*pi);//算出滤波函数的右半边

h[i+n/2]=h[i];//将右半边向右移动25

}

h[25]=2*f;//定义在零点的值

for(i=0;i<=n/2;i++)

{

h[n/2-i]=h[n/2+i];//左半边由右半边翻转定义

}

}

voidcvbx0(float*ki,float*h,float*ko,intn,intlen1)

{

inti,j,k;

floats;

for(i=0;i

ko[i]=0;//ko赋零值

for(j=0;j

{

s=0;

for(i=0;i<51;i++)//内循环

{

k=j-25+i;

if(k<0||k>=len1)continue;//当j为0到24和len1-24到len1时,褶积不完全当(k<0||k>=len1)时ki没有数与h褶积

s=s+h[i]*ki[k];//褶积

}

ko[j]=s;//i每循环完一次赋给ko

}

}

voidcvbx0(float*ki,float*h,float*ko,intn,intlen1)

{

inti,j,k;

floats;

for(i=0;i

ko[i]=0;//ko赋零值

for(j=0;j

{

s=0;

for(i=0;i<51;i++)

{

k=j-25+i;

if(k<0||k>=len1)continue;//当j为0到24和len1-24到len1时,褶积不完全。

这时当(k<0||k>=len1)时ki没有数与h褶积

s=s+h[i]*ki[k];//褶积

}

ko[j]=s;//i每循环完一次赋给ko

}

}

//===============================================================//

voidfft(float*xr,float*xi,intnr,floatT)

{

inti,j,k,l,n,n2,nr1,i1,j1,k2,k1n2;

floatc,s,p,tr,ti,trc,tic,ars;

n=(int)(pow(2,nr));

n2=n/2;

nr1=nr-1;

k=0;

for(l=1;l<=nr;l++)

{

loop1:

for(j=1;j<=n2;j++)

{

k2=k/(int)(pow(2,nr1));

p=(float)(IBIT(k2,nr));

ars=(float)(6.2831852*p/(float)(n));

c=(float)(cos(ars));

s=(float)(sin(ars));

k1n2=k+n2;

tr=xr[k1n2]*c+xi[k1n2]*s*T;

ti=xi[k1n2]*c-xr[k1n2]*s*T;

xr[k1n2]=xr[k]-tr;

xi[k1n2]=xi[k]-ti;

xr[k]=xr[k]+tr;

xi[k]=xi[k]+ti;

k++;

}

k+=n2;

if(k

{gotoloop1;}

else

{

k=0;

nr1=nr1-1;

n2/=2;

}

}

for(j=1;j<=n;j++)

{

i=IBIT(j-1,nr)+1;

if(i>j)

{

j1=j-1;

i1=i-1;

trc=xr[j1];

tic=xi[j1];

xr[j1]=xr[i1];

xi[j1]=xi[i1];

xr[i1]=trc;

xi[i1]=tic;

}

}

if(T<0.0)

{

for(j=0;j<=n;j++)

{

xr[j]/=n;

xi[j]/=n;

}

}

}

intIBIT(intj,intm)

{

inti,it,j1,j2;

it=0;

j1=j;

for(i=1;i<=m;i++)

{

j2=j1/2;

it=it*2+(j1-2*j2);

j1=j2;

}

returnit;

}

//***************************************************************************/

voidmain()

{

floatki[NQ2],ko[NQ2],xi[128],ri[128],r[128];

floath[51],dt,si,f=25;

intnflg,n,j,m,l,k,i;

intlen,len1,key,jhd,number,nta,ntb,nt,lz;

charnamei[50],nameo[50];

//***************************************************************************/

FILE*fp1,*fp2,*fp3,*fp4,*fp5;

union

{

inthd[NQ2];

floatdata[NQ2];

charbuf[NQ2];

shortintshd[NQ2];

}dat;

//***************************************************************************/

printf("inputfilename:

");

scanf("%s",&namei);

printf("outputfilename:

");

scanf("%s",&nameo);

fp1=fopen(namei,"rb");

if(fp1==NULL){printf("can'topeninputsegyfile\n");exit(0);}

fp2=fopen(nameo,"wb");

if(fp2==NULL){printf("can'topenoutputsegyfile\n");exit(0);}

fread(&dat.buf[0],1,LEN,fp1);

fwrite(&dat.buf[0],1,LEN,fp2);

fread(&dat.buf[0],1,400,fp1);

len1=dat.shd[10];

printf("samplenumbers:

%d\n",len1);

printf("samplerate(ms):

%u\n",dat.shd[8]/1000);

printf("seg_yflag:

%d\n",dat.shd[12]);

/****************************************************************************/

fwrite(&dat.buf[0],1,400,fp2);

nflg=dat.shd[12];

if(nflg==1)len=len1*4+240;

if(nflg==2)len=len1*4+240;

if(nflg==3)len=len1*2+240;

printf("\ninputrecordlength:

%d\n",len);

n=0;

jhd=60;

//==========================================================/

fp3=fopen("lvboyinzi.csv","w");

filter(h,51);

for(i=0;i<51;i++)

{

fprintf(fp3,"%f\n",h[i]);

}

/************************************************************/

fp4=fopen("ko.csv","w");

fp5=fopen("FFt.csv","w");

while((l=fread(&dat.buf[0],1,len,fp1))>0)

{

for(i=0;i

ki[i]=dat.data[i+jhd];//dat.hd[],dat.shd[]

cvbx0(ki,h,ko,51,len1);//对数据进行各种处理

for(i=0;i

dat.data[i+jhd]=ko[i];//dat.hd[],dat.shd[]

fwrite(&dat.buf[0],1,len,fp2);

n++;

if(n==100)

{

for(i=0;i<512;i++)

{

ri[i]=ki[i];

xi[i]=0.;

}

fft(ri,xi,9,1);

for(i=0;i<512;i++)

{

r[i]=sqrt(ri[i]*ri[i]+xi[i]*xi[i]);

fprintf(fp5,"%f\n",r[i]);

}

fft(ri,xi,9,-1);

}

//printf("tracenumber:

%d\n",n);

}

for(i=0;i

fprintf(fp4,"%f\n",ko[i]);

fclose(fp1);

fclose(fp2);

fclose(fp3);

fclose(fp4);

fclose(fp5);

}

1.3结果分析

调用filter(h,51)后输出的滤波因子波形,fm=40

滤波前滤波后

用Fimage成图显示

第2章时差校正

2.1方法

倾角时差校正(DMO)方法对于复杂地质构造条件下的纵波反射波(P-P)的多次覆盖地震数据的叠加具有显著的提高信噪比的效果.把共反射点道集中某个波,按水平界面一次反射波的公式计算动校正量,进行动校正后残留下来...对多次波等干扰波,则动校正后必然会存在剩余时差,共反射点叠加技术能利用这点来压制多次波。

在采用共中点(CMP)道集波有限慢度和精确常速极限情况下,这些准则具有互换性。

其最终方程是具有三个参数的位移双曲线NMO方程。

在比较近偏移距和远偏移距位移双曲线NMO方程和层状介质结果后,可赋予这些参数以地球物理意义。

这些参数中的零偏移距时间和NMO速度为常数,它控制了近偏移特性。

2.2程序

#include

#include

#include

#include

#include

#defineN20

#defineLEN100

voidmodel(floata[][100],floatb[100]);

voidcvbx0(floatki[][100],floatz[],floatko[][100]);

voidjida(floatko[][100],intu[20],int*max);

voidjiaozheng(intu[20],floatg[][100],floath[][100]);

voidmain()

{

inti;

intmax;

intu[20];//时差

charnamei[50],nameo[50];

floatg[20][100],h[20][100],ko[20][100];//h为原始数据,ko为相关函数

floatb[100];//b为模型道

//***************************************************************************/

FILE*fp1,*fp2;

//***************************************************************************/

printf("inputfilename:

");

scanf("%s",&namei);

printf("outputfilename:

");

scanf("%s",&nameo);

fp1=fopen(namei,"rb");

if(fp1==NULL){printf("can'topeninput20-100file\n");exit(0);}

fp2=fopen(nameo,"wb");

if(fp2==NULL){printf("can'topenoutput20-100file\n");exit(0);}

for(i=0;i<20;i++)

fread(h[i],4,100,fp1);

//循环控制方法1

rp:

model(h,b);//求模型道

cvbx0(h,b,ko);//相关

//system("pause");

jida(ko,u,&max);//求时差

jiaozheng(u,g,h);//校正

printf("max=%d\n",max);

if(max>1)gotorp;

/*方法2

max=2;

while(max>1)

{

model(h,b);//求模型道

cvbx0(h,b,ko);//相关

jida(ko,u,&max);//求时差

jiaozheng(u,g,h);//校正

printf("max=%d\n",max);

}

*/

for(i=0;i<20;i++)

{

printf("%d\n",u[i]);

fwrite(h[i],4,LEN,fp2);

}

fclose(fp1);

fclose(fp2);

}

//***************************************************************************/

voidmodel(floata[][100],floatb[100])

{

inti,j;

for(i=0;i<100;i++)

{

b[i]=0.;

for(j=0;j<20;j++)

{

b[i]+=a[j][i];

}

b[i]=b[i]/20;

}

}

//***************************************************************************/

voidcvbx0(floatki[][100],floatz[],floatko[][100])

{

inti,j,k,q;

floats;

for(i=0;i<20;i++)

for(j=0;j<100;j++)

ko[i][j]=0.;

for(i=0;i<20;i++)

{

for(j=0;j<100;j++)

{

s=0.;

for(k=0;k<100;k++)

{

q=j+k-50;

if(q<0||q>=100)continue;

s=s+z[k]*ki[i][q];

}

ko[i][j]=s;

}

}

}

//***************************************************************************/

voidjida(floatko[][100],intu[20],int*max)//求时差

{

inti,j;

floatd;

for(i=0;i<20;i++)

{

u[i]=0;

d=ko[i][0];

for(j=0;j<100;j++)

if(d

{

d=ko[i][j];

u[i]=j;

}

u[i]=50-u[i];

//printf("%d\n",u[i]);

}

*max=abs(u[0]);

for(i=0;i<20;i++)

if(*max

*max=abs(u[i]);

}

//***************************************************************************/

voidjiaozheng(intu[20],floatg[][100],floath[][100])

{

inti,j,q;

for(i=0;i<20;i++)

{

q=u[i];

for(j=0;j<100;j++)

{

g[i][j]=0.;

if((j-q)>=0&&(j-q)<100)

g[i][j]=h[i][j-q];

}

}

for(i=0;i<20;i++)

for(j=0;j<100;j++)

h[i][j]=g[i][j];

}

2.3结果分析

波形图

波形变面积图

20-100数据处理图

 

波形变面积图

nose20-100数据处理图(第一次校正后)

 

波形变面积图

nose20-100数据处理图(循环校正后)

第3章交互集成软件

3.1方法

1:

、建立工程

2、在menu中做好菜单,本实验中设计了一个滤波下的雷克子波显示(函数on1),该菜单下具有对话框功能,可以输入频率。

菜单还包含实验二中的静校正功能(函数on3,on4)。

3、建立类向导,添加函数,头文件,对对话框添加变量,创建新类等。

4编译运行。

实验主要程序代码都在视图类下编制,主要包括,1读任意文件程序,2画图程序,3,雷克子波和剩余时差静校正程序。

3.2程序

voidCZxsView:

:

On1()

{

//TODO:

Addyourcommandhandlercodehere

CClientDC*pdc=newCClientDC(this);

CPenpen;

pen.CreatePen(PS_SOLID,5,RGB(250,0,0));

CPen*oldpen=(CPen*)pdc->SelectObject(&pen);

constdoublePI=3.14159;

inti,cx=10,x2=50,y2,m=35,k;

doublef,dt,t,q,a[100];

k=m/2;

f=30.0;

zxsqdlg;

if(dlg.DoModal()==IDOK)f=dlg.m_1;

dt=0.004;

for(i=1;i<=k;i++)

{

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

当前位置:首页 > 高等教育 > 军事

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

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