⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avo_2正演模型实验_加噪音_角度区域.cpp

📁 AVO正演模型实验
💻 CPP
字号:
//---------------------------------------------------------------//
//                 AVO 技术正演模型实验                          //
//                 3 层模型(一)                                //
//                 AVO 技术正演模型实验                          //
//                 40炮24道                                       //
//                 地层倾角为0度                                 //
//---------------------------------------------------------------//
//---------------------------------------------------------------//
#include <stdio.h>
#include<math.h>
#define  PI   3.1415926
#define nc 3             //地层层数
#define np 4             //地层参数个数
#define  dt   0.002      //采样间隔 
#define  zbn   51        //子波长度
#define  zf   30         //子波主频
#define  zA   1.0        //子波最大振幅

//——————————观测系统参数————————————//
#define  Nd   24         //迭加次数
#define  dx   20         //道间距
#define  ds   20         //炮间距//
#define  x_0  40        //最小偏移距
#define  L    48         //接收道数
#define  Ns   40         //炮数
#define  tl   300        //采样点数
#define  ncdp  30        //cdp道数

void main()
{
	int   i,j,k;
	float par[nc][np];
	float x[Ns][L],zb[zbn];
	float par0[np]={0.0};
	FILE *fp1;
	FILE *fp2;
	FILE *fp3;
	FILE *fp4;
	FILE *fp5;
    FILE *fp6;
	FILE *fp7;
    //====  子程序说明  ====//
	void fzb(float zb[zbn]);
	void flljl(float x[Ns][L],float zb[zbn],float par[nc][np]);
	printf("程序运行请稍后......\n\n");
    //=======================  程序主体  =====================//
	if((fp1=fopen("地层模型参数表2-1.txt","r"))==NULL)
		printf("地层参数文件没有找到!\n");
	else
		printf("参数文件打开成功!\n");
	fp3=fopen("含油气层参数.txt","r");
//	for(i=0;i<np;i++)
	//{
		//fscanf(fp7,"%f\n",&par_0[i]);
		fscanf(fp3,"%f\t%f\t%f\t%f\n",&par0[0],&par0[1],&par0[2],&par0[3]);
     	printf("%f\t%f\t%f\t%f\n",par0[0],par0[1],par0[2],par0[3]);
	//}
	for(i=0;i<nc;i++)
	{
		fscanf(fp1,"%f\t%f\t%f\t%f\n",&par[i][0],&par[i][1],&par[i][2],&par[i][3]);
		printf("%f m/s\t%f m/s\t%f g/cm3\t%f m\n",par[i][0],par[i][1],par[i][2],par[i][3]);
		if(i>=0)
			printf("-R-----------------------------------------------------------R-\n");
	}
    //========  子波  =====//
	fzb(zb);
	fp2=fopen("子波.txt","w+");
	for(i=0;i<zbn;i++)
		fprintf(fp2,"%f\t%f\n",dt*i,zb[i]);
    //====  计算各道反射系数,形成理论记录,抽道集  ====//
	flljl(x,zb,par);
	fclose(fp1);
	fclose(fp2);
	fclose(fp3);
}
//=======================  子波子程序  =====================//
void fzb(float zb[zbn])
{
	int i,j;
	float t;
	for(i=0;i<=zbn/2;i++)
	{
		t=dt*i;
		zb[zbn/2+i]=zA*cos(2*PI*zf*t)*exp(-0.5*pow(PI*zf*t,2));
		zb[zbn/2-i]=zA*cos(2*PI*zf*t)*exp(-0.5*pow(PI*zf*t,2));
	}
}

//=======================  计算各道反射系数,形成理论记录,抽道集子程序  =====================//
void flljl(float x[Ns][L],float zb[zbn],float par[nc][np])
{
	int i,i1,i2,j,k,kn,r1,r2,l2,flag,flag2;
	int j1;
	float y[tl+zbn-1],yy[tl];
	float t_0[nc-1]={0.0},t[nc-1],vr,sum=0.0;
	float R1[nc-1],x1,sa2[nc-1],ta2,vp[2],vs[2],ro[2],K,da,a,A,B,C;//sina2->sa2和一些过渡参数
	float R[tl]={0.0};
	float par_0[np]={1896.0,50.0,1.50,100.0};//含油气层参数
	int X,k2;
	float sa2_j,sa_j,ti0,t00,vi;
	float cdp_1[tl][ncdp]={0.0},cdp_2[tl][ncdp]={0.0},cdp_3[tl][ncdp]={0.0},tp1[tl]={0.0};//角度叠加约束
	float cdp[tl][ncdp]={0.0},cdp0[tl][ncdp*Nd],tp[tl];
	double zx[tl],zc=2045.0,zza=-0.06 ,zzb=0.06,zN[tl];
	FILE *fp1;
	FILE *fp2;
	FILE *fp3;
	FILE *fp4;
	FILE *fp5;
	FILE *fp6;
	FILE *fp7;
	FILE *fp8;
	FILE *fp9;
    //===== 计算基本参数 =====//
	fp1=fopen("反射系数.txt","w+");
	fp2=fopen("地震记录.dat","wb+");
	fp3=fopen("地震记录(文本).dat","w+");
	fp4=fopen("抽道得的道集.dat","wb+");
	fp5=fopen("抽道叠加后30个cdp点.dat","wb+");
	fp6=fopen("抽道得的道集(文本).dat","w+");
	fp7=fopen("含油气层参数.txt","r");
	fp8=fopen("角度叠加(3组角度范围+全角度叠加共4个30CDP).dat","wb+");
	fp9=fopen("查_角度叠加(3组角度范围+全角度叠加共4个30CDP).dat","w+");
	//===== 读取含油气参数 =====//
	for(i=0;i<np;i++)
	{
		fscanf(fp7,"%f\n",&par_0[i]);printf("%f\n",par_0[i]);
	}
	//fscanf(fp7,"%f\t%f\t%f\t%f ",&par_0[0],&par_0[1],&par_0[2],&par_0[3]);
	//——————————噪音———————————//
	zx[0]=8388607.0/8388608.0;
	for(i=1;i<tl;i++)
		zx[i]=zc*zx[i-1]-int(zc*zx[i-1]);
    for(i=0;i<tl;i++)
		zN[i]=float(zza+(zzb-zza)*zx[i]);
	//——————————噪音———————————//
	for(i=0;i<Ns;i++)
		for(j=0;j<L;j++)
		{
			x1=x_0+dx*j;
			X=ds*i+x1;
			//if(X/dx>=30&&X/dx<40)//含油气参数替换
			if((X+ds*i)/dx/2.0>=30&&(X+ds*i)/dx/2.0<32)
			{
				printf("炮:%d\n",i);
				for(k2=0;k2<np;k2++)
				{
					par[1][k2]=par_0[k2];
				//	if(i==0)printf("****%d\t%f\n",j,par_0[k2]);
				}
				flag2=1;
			}
			else 
				flag2=0;
			for(i1=0;i1<nc-1;i1++)
			{
				t_0[i1]=0.0;//注意清零!!
			}
			sum=0.0;
			for(i1=0;i1<nc-1;i1++)
			{
	        	t[i1]=par[i1][3]/par[i1][0];
	        	for(i2=0;i2<=i1;i2++)
					t_0[i1]+=2*(t[i2]);
	        	sum+=t[i1]*par[i1][0]*par[i1][0];
				if(i==5&&j==0)printf("i=%d\tt[i1]=%f\tt_0[i1]=%f\n",i,t[i1],t_0[i1]);
			}
        	vr=sqrt((sum*2)/t_0[nc-2]);
			//if(i==0)printf("%d\t%f\n",j,t_0[nc-2]);
			for(i1=0;i1<tl+zbn-1;i1++)//每道地震记录前归零!
				y[i1]=0.0;
			for(i1=0;i1<tl;i1++)
				R[i1]=0.0;
			for(k=0;k<nc-1;k++)
			{
				sa2[k]=pow(x1*par[k][0],2)/pow(vr,2)/(pow(vr*t_0[k],2)+pow(x1,2));
				//sa2[k]=pow(par[k][0],2)*(x1-vr*t_0[k]*atan(x1/(vr*t_0[k])))/(x1*pow(vr,2));
				//if(i==0&&k==1)printf("%d\t%f\n",j,vr);
				if(sa2[k]<0)printf("%d\t,%d\t,%d\tsa2[]=%f\n",i,j,k,sa2[k]);
				ta2=sa2[k]/(1-sa2[k]);
				vp[0]=(par[k+1][0]+par[k][0])/2.0;
				vp[1]=par[k+1][0]-par[k][0];
				vs[0]=(par[k+1][1]+par[k][1])/2.0;
				vs[1]=par[k+1][1]-par[k][1];
				ro[0]=(par[k+1][2]+par[k][2])/2.0;
				ro[1]=par[k+1][2]-par[k][2];
				K=(pow(par[k+1][1],2)/pow(par[k+1][0],2)+pow(par[k][1],2)/pow(par[k][0],2));//K=vs2/vp2
				//过渡参数计算↑↓……
				A=(vp[1]/vp[0]+ro[1]/ro[0])/2.0;
				B=vp[1]/(vp[0]*2.0)-4*K*vs[1]/vs[0]-2*K*ro[1]/ro[0];
				C=vp[1]/(2*vp[0]);
				R1[k]=A+B*sa2[k]+C*sa2[k]*ta2;
				//printf("%d,%d,%d\n",i,j,k);
				kn=t_0[k]/dt;
				R[kn]=R1[k];
				
			}
			if(i==0)
			{
				fprintf(fp1,"%f\t%f\t%f\t%f\n",asin(sqrt(sa2[0]))*180/PI,R1[0],asin(sqrt(sa2[1]))*180/PI,R1[1]);
			//	printf("%d\t%f\t%f\tcha=%f\n",j,asin(sqrt(sa2[0]))*180/PI,R1[0],par[0][0]);
			}
            //查!!反射系数计算
			for(i1=0;i1<tl;i1++)
				for(j1=0;j1<zbn;j1++)
				{
					y[i1+j1]+=R[i1]*zb[j1];
				}
			for(i1=0;i1<tl;i1++)
			{
				yy[i1]=y[i1+zbn/2]+zN[i1];//;
				fprintf(fp3,"%f\t",yy[i1]+0.005*i1);
			}
			fwrite(yy,4,tl,fp2);
			fprintf(fp3,"\n");
			//———  抽道、迭加求和↓  ———//
			for(r1=0;r1<ncdp;r1++)//选道是flag=1,否flag=0
			{
				flag=r1/2;
				if(i>=flag)
					if(j+L/Nd*i-L+L/Nd==r1)//?
					{
						l2=r1*Nd+i-flag;//-r1%Nd;//因该是除以叠加次数的余数!!
					    if(r1+1==1)printf("CDP道:i=%d\tj=%d\tcdp=%d\tl2=%d\n",i+1,j+1,r1+1,l2+1);		
						//if(r1==0)printf("X=%d\t%d\n",X,X/dx);
						//if(flag2==1)printf("**&&&cdp=%d,X=%dpar=%f\n",r1+1,X,par[1][1]);
						for(r2=0;r2<tl;r2++) 
						{
					    	cdp0[r2][l2]=yy[r2];
							//———  角度叠加~~确定角度范围↓...———//
							t00=r2*dt;
							for(k=0;k<nc-1;k++)
							{
								if(t00<=t_0[k])
								{
									vi=par[k][0];
									break;
								}
								else
									vi=par[nc-2][0];
							}
							sa2_j=pow(vi,2)*(x1-vr*t00*atan(x1/(vr*t00)))/(x1*pow(vr,2));
							sa_j=asin(sqrt(sa2_j))*180/PI;
							//三组角度范围角度叠加//
							if(sa_j>=0&&sa_j<5)
								cdp_1[r2][r1]+=yy[r2];
							else
								cdp_1[r2][r1]+=0.0;
							if(sa_j>=5&&sa_j<19)
								cdp_2[r2][r1]+=yy[r2];
							else
								cdp_2[r2][r1]+=0.0;
						    if(sa_j>=19&&sa_j<35)
								cdp_3[r2][r1]+=yy[r2];
							else
								cdp_3[r2][r1]+=0.0;
						    //———  角度叠加~~确定角度范围↑...———//
					    	cdp[r2][r1]+=yy[r2];						
						}
					}
			}
	        //———  抽道、迭加求和↑  ———//
		}//6炮24道循环结束
		printf("X总测线长度:%d\t总炮数:%d\n",X,X/ds);
	/*for(j=0;j<ncdp;j++) 
		for(i=0;i<tl;i++) 
		{
			cdp[i][j]=cdp[i][j]/Nd;//振幅平均
			cdp_1[i][j]=cdp[i][j]/Nd;
			cdp_2[i][j]=cdp[i][j]/Nd;
			cdp_3[i][j]=cdp[i][j]/Nd;
		}*/
/*	for(j=0;j<ncdp*Nd;j++)
	{
		for(i=0;i<tl;i++)
			tp[i]=cdp0[i][j];
		fwrite(tp,4,tl,fp4);   
	}*/
	for(j=0;j<ncdp*Nd;j++)
	{
		for(i=0;i<tl;i++)
		{
			tp[i]=cdp0[i][j];
			fprintf(fp6,"%f\t",tp[i]+0.005*i);
		}
		fprintf(fp6,"\n");
		fwrite(tp,4,tl,fp4);   
	}
	for(j=0;j<ncdp;j++) 
	{
		for(i=0;i<tl;i++)
		{
			tp[i]=cdp[i][j];
		}
		fwrite(tp,4,tl,fp5);
	}
	//角度叠加写入数据
	flag=1;
    while(flag<5)
	{
		for(j=0;j<ncdp;j++) 
		{
			for(i=0;i<tl;i++)
			{
				if(flag==1) { tp[i]=cdp_1[i][j];fprintf(fp9,"%f\t",tp[i]+0.005*i);}
				if(flag==2) tp[i]=cdp_2[i][j];
				if(flag==3) tp[i]=cdp_3[i][j];
				if(flag==4) tp[i]=cdp[i][j];
			}
			if(flag==1)fprintf(fp9,"\n");
			fwrite(tp,4,tl,fp8);
		}
		fwrite(tp1,4,tl,fp8);
		printf("%d\n",flag);
		flag++;
	}


	fclose(fp1);
	fclose(fp2);
	fclose(fp3);
	fclose(fp4);
	fclose(fp5);
	fclose(fp6);
	fclose(fp7);
	fclose(fp8);
	fclose(fp9);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -