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

📄 suinvzco3d.c

📁 su 的源代码库
💻 C
📖 第 1 页 / 共 2 页
字号:
        {                temp1= sqrt((ix*dxo)*(ix*dxo)+(iy*dyo)*(iy*dyo))/dxo;                ix2=temp1;                temp1=temp1-ix2;                t3d[iy][ix][iz]= (1.0-temp1)*t2d[ix2][iz]+                        temp1*t2d[ix2+1][iz];		p3d[iy][ix][iz]= (1.0-temp1)*p2d[ix2][iz]+                        temp1*p2d[ix2+1][iz];		sigma3d[iy][ix][iz]= (1.0-temp1)*sigma2d[ix2][iz]+                        temp1*sigma2d[ix2+1][iz];		a23d[iy][ix][iz]= (1.0-temp1)*a2d[ix2][iz]+                        temp1*a2d[ix2+1][iz];		dzda23d[iy][ix][iz]= (1.0-temp1)*dzda2d[ix2][iz]+                        temp1*dzda2d[ix2+1][iz];	}	}void SingleRay(int nx,int nz,float a, float *v,float dx,float dz,float *x,float *p3,float *sigma,float *t,float *dzda2,int ray_end_iz)/*****************************************************************************Ray equation solution of one ray in v(z) medium in polar coordinate******************************************************************************Input:nx              number of x samplesnz              number of z smaplesa		polar anglev		array for v(z)               dx              x sample intervaldz              z sample intervalOutput:x		array for ray position of x p3		array for slowness p3sigma		array for sigmat		array for traveltimedzda2		array for the z derivative to propagation angle a2******************************************************************************Notes: Used internally in function: amplitude()******************************************************************************Author:  Meng Xu, Center for Wave Phenomena, 07/8/95******************************************************************************/{	int i,ii;	float fx,zx,tt,sig,temp,step;	sig=tt=temp=0;	fx=0;	zx=dx*nx;	for(i=0;i<nz;++i)	{	sigma[i]=0;	p3[i]=0;	x[i]=0;	t[i]=0;	dzda2[i]=0;	}		for(i=0;i<nz;++i)	{			if(1./v[i]/v[i]-sin(a)*sin(a)/v[0]/v[0]>0)  			{			p3[i]=sqrt(ABS(1./v[i]/v[i]-sin(a)*sin(a)/v[0]/v[0]));			sigma[i]=sig;			sig+=dz/p3[i];			x[i]=sigma[i]*sin(a)/v[0];			t[i]=tt;			tt+=dz/v[i]/v[i]/p3[i];			dzda2[i]=temp;			temp-=dz/p3[i]*sin(a)/v[0]*p3[0]/p3[i];			ray_end_iz=nz-1;			if(p3[i]<=TINY) 				{				fprintf(stderr,"\nTurning point: z=%f\n",i*dz);				continue;				}			if(x[i]<fx||x[i]>zx) {step=i;}			}		else			{			fprintf(stderr,"\nTurning point: ang=%f,z=%f",a,i*dz);			ray_end_iz=i;			for(ii=i; ii<nz; ++ii) 				{				sigma[i]=0;       		                x[i]=-1;       		                t[i]=0;                       		dzda2[i]=0;				}                        if(x[i]<fx||x[i]>zx) {step=i;}			i=nz;			}	}}			void para2d(int na,int nx,int nz,float dx,float dz,float *v,float **t2d,		float **sigma2d,float **p2d,float **dzda2d,float **a2d)/*****************************************************************************Calculate ray parameters on a 2D grid******************************************************************************Input:nx             number of output grids in xnz             number of output grids in zdx             output sample rate in xdz             output sample rate in zv	       velocity array v(z)	Output:t2d             2D array for traveltimesigma2d         2D array for sigmap2d             2D array for p3dzda2d          2D array for dz/daa2d             2D array for a2******************************************************************************Notes: Used internally in function: amplitude()******************************************************************************Author:  Meng Xu, Center for Wave Phenomena, 07/8/95******************************************************************************/{	int i,k,ii;	int iflag;	int i00=0;	int imax;	int *ray_end_iz;	float sx;	float x0;	float da;		float a,**p3,**sigma,**t,**x,**dzda2,**a2;	da=3.14159265/na/2.;	p3=ealloc2float(nz,na);	sigma=ealloc2float(nz,na);	t=ealloc2float(nz,na);	x=ealloc2float(nz,na);	dzda2=ealloc2float(nz,na);	a2=ealloc2float(nz,na);	ray_end_iz=ealloc1int(na);		for(i=0,a=0.;i<na;++i,a+=da)	{	SingleRay(nx,nz,a,v,dx,dz,x[i],p3[i],		sigma[i],t[i],dzda2[i],ray_end_iz[i]);	for(k=0;k<nz;++k) a2[i][k]=a;	}	/*interpolation from ray coordinate to (x,z) coordinate*/ 	for(k=1;k<nz;++k)	  for(i=0;i<nx;++i)		{		x0=dx*i;		iflag=0;		for(ii=0;ii<na;++ii)			{			if(ii==0) {i00=0;}			if(x[ii][k]>x0&&x[i00][k]<=x0)				{				iflag=ii; 				ii=na;				}			}		if(iflag==0) 			{			for(ii=0;ii<na;++ii)                        	{                        	if(ray_end_iz[ii]==k) {imax=ii;}				}			iflag=na-1;			sx=0;			}		else	{			sx=(x[iflag][k]-x0)/(x[iflag][k]-x[iflag-1][k]);			}						t2d[i][k]=(1.0-sx)*t[iflag][k] + 					sx*t[iflag-1][k];		sigma2d[i][k]=(1.0-sx)*sigma[iflag][k] +                                             sx*sigma[iflag-1][k];		p2d[i][k]=(1.0-sx)*p3[iflag][k] +                                             sx*p3[iflag-1][k];		a2d[i][k]=(1.0-sx)*a2[iflag][k] +                                        sx*a2[iflag-1][k];		dzda2d[i][k]=(1.0-sx)*dzda2[iflag][k] +                                        sx*dzda2[iflag-1][k];if(t2d[i][k]==0) fprintf(stderr,"z=%f\n",k*dz);		}		free2float(p3);	free2float(sigma);	free2float(t);	free2float(x);	free2float(dzda2);	free2float(a2);	}void amplitude(float fx, float fy, int nx, int ny, int nz, 	float dx, float dy, float dz,    	float fxo, float fyo, int nxo, int nyo, int nzo, 	float dxo, float dyo, float dzo,    	int na, float *v, float off, float ***t3d,float ***amp, float ***p3d)/*****************************************************************************Calculate Jacobian and Beylkin determinant to give the amplitude weight******************************************************************************Input:fx		first x position in input datafy		first y position in input datanx=nxo		number of velocity grids in xny=nyo		number of velocity grids in ynz		number of velocity grids in zfxo		first x position in outputfyo		first y position in output		nxo             number of output grids in xnyo             number of output grids in ynzo             number of output grids in zdxo             output sample rate in xdyo             output sample rate in ydzo             output sample rate in zoff		offsetna		number of ray anglesv		1D array of velocity v(z)Output:t3d             3D array for traveltimeamp         3D array for amplitude weightp3d		slowness  in z direction p_3******************************************************************************Author:  Meng Xu, Center for Wave Phenomena, 07/8/95******************************************************************************/{        int i,j,k;	int nxr;	int ix,jl,jr,il,ir;	float xi,sx;	float r,a1,a2,a1s,a1g,a2s,a2g,temp,temp1,temp2;	float det[3][3],ps[3],pg[3];        float **t2d,**p2d,**sigma2d,**dzda2d,**a2d;	float ***jacob,***asag,***h;	float ***sigma3d,***dzda23d,***a23d;	nxr = NINT(sqrt(nxo*dxo*nxo*dxo+nyo*dyo*nyo*dyo)/dxo)+1;        p2d=ealloc2float(nzo,nxr);        t2d=ealloc2float(nzo,nxr);        sigma2d=ealloc2float(nzo,nxr);        dzda2d=ealloc2float(nzo,nxr);        a2d=ealloc2float(nzo,nxr);	jacob=ealloc3float(nzo,nxo,nyo);	asag=ealloc3float(nzo,nxo,nyo);	h=ealloc3float(nzo,nxo,nyo);        sigma3d=ealloc3float(nzo,nxo,nyo);        dzda23d=ealloc3float(nzo,nxo,nyo);        a23d=ealloc3float(nzo,nxo,nyo);	para2d(na,nxr,nzo,dxo,dzo,v,t2d,                sigma2d,p2d,dzda2d,a2d);/*	for(i=0;i<nx;++i)        for(k=0;k<nz;++k)	{        fprintf(stderr,"%f\n",t2d[i][k]);		r=sqrt(i*dx*i*dx+k*dz*k*dz);	fprintf(stderr,"%f\n",r/v[0]);	}*/	para3d(                nxo,nyo,nzo,                dxo,dyo,dzo,                t3d,sigma3d,p3d,                dzda23d,a23d,                t2d,sigma2d,p2d,dzda2d,a2d);	/*compute J and thus A*/	xi=off/dxo;	ix=xi;	sx=xi-ix;		for(i=0;i<nyo;++i)	 for(j=0;j<nxo;++j)	  for(k=1;k<nzo;++k) {		if(j==0)			a1=3.14159265/2.;		else 		    a1=atan(i*dyo/j*dxo);		a2=a23d[i][j][k];		det[0][0]=sin(a2)*cos(a1)/v[0];		det[0][1]=sin(a1)*sin(a2)/v[0];		det[0][2]=p3d[i][j][k];		det[1][0]=-sigma3d[i][j][k]*sin(a1)*sin(a2)/v[0];		det[1][1]=sigma3d[i][j][k]*cos(a1)*sin(a2)/v[0];		det[1][2]=0.0;		det[2][0]=sigma3d[i][j][k]*cos(a1)*cos(a2)/v[0];		det[2][1]=sigma3d[i][j][k]*sin(a1)*cos(a2)/v[0];		det[2][2]=dzda23d[i][j][k];		temp=4.*PI*sqrt(v[0]*ABS(determ(det)));		if(temp>0.0){			jacob[i][j][k]=100.*sqrt(sin(a2))/temp;		}		}	for(i=0;i<nyo;++i)         for(j=0;j<nxo;++j)          for(k=0;k<nzo;++k)		asag[i][j][k]=jacob[i][j][k]*jacob[i][ABS(j-ix)][k];	/*compute h*/	for(i=1;i<nyo;++i)         for(j=0;j<nxo;++j)          for(k=1;k<nzo;++k)		{		if(t3d[i][j][k]==0)                        {                        amp[i][j][k]=0;                        }                else{		if(j==0) a1s=PI/2.;		else a1s=atan(i*dyo/j/dxo);		if(ABS(j*dxo-off)==0) a1g=PI/2;		else a1g=atan(i*dyo/ABS(j*dxo-off));		a2s=a23d[i][j][k];		a2g=a23d[i][ABS(j-ix)][k];		if(j==nxo-1){jl=j-1; jr=j;}		else {jl=j-1; jr=j+1;}		temp1=(sigma3d[i][jl][k]-sigma3d[i][jr][k])/dxo/2.;			if(ABS(j-ix)==0){jl=ABS(j-ix); jr=jl+1;}                 else {jl=ABS(j-ix)-1; jr=jl+1;}                    temp2=(sigma3d[i][jl][k]-sigma3d[i][jr][k])/dxo;				ps[0]=1./v[0]*cos(a1s)*sin(a2s);		ps[1]=1./v[0]*sin(a1s)*sin(a2s);		ps[2]=p3d[i][j][k];		pg[0]=1./v[0]*cos(a1g)*sin(a2g);		pg[1]=1./v[0]*sin(a1g)*sin(a2g);                pg[2]=p3d[i][ABS(j-ix)][k];		det[0][0]=ps[0]+pg[0];		det[0][1]=ps[1]+pg[1];		det[0][2]=ps[2]+pg[2];		det[1][0]=-(1.+ps[0]*temp1)/sigma3d[i][j][k]			-(1.+pg[0]*temp2)/sigma3d[i][ABS(j-ix)][k];		det[1][1]=-(ps[1]*temp1)/sigma3d[i][j][k]			-(pg[1]*temp2)/sigma3d[i][ABS(j-ix)][k];		det[1][2]=(ps[0]*(1.+ps[0]*temp1)/sigma3d[i][j][k]			+ps[1]*(ps[1]*temp1)/sigma3d[i][j][k])/ps[2]			+(pg[0]*(1.+pg[0]*temp2)/sigma3d[i][ABS(j-ix)][k]                        +pg[1]*(pg[1]*temp2)/sigma3d[i][ABS(j-ix)][k])/pg[2];		if(i==nyo-1){il=i-1; ir=i;}                else {il=i-1; ir=i+1;}                temp1=(sigma3d[il][j][k]-sigma3d[ir][j][k])/dyo/2.;                temp2=(sigma3d[il][ABS(j-ix)][k]-sigma3d[ir][ABS(j-ix)][k])			/2./dyo;		det[2][0]=-(ps[0]*temp1)/sigma3d[i][j][k]                        -(pg[0]*temp2)/sigma3d[i][ABS(j-ix)][k];                det[2][1]=-(1.+ps[1]*temp1)/sigma3d[i][j][k]                        -(1.+pg[1]*temp2)/sigma3d[i][ABS(j-ix)][k];                det[2][2]=(ps[0]*(ps[0]*temp1)/sigma3d[i][j][k]                        +ps[1]*(1.+ps[1]*temp1)/sigma3d[i][j][k])/ps[2]                        +(pg[0]*(pg[0]*temp2)/sigma3d[i][ABS(j-ix)][k]                        +pg[1]*(1.+pg[1]*temp2)/sigma3d[i][ABS(j-ix)][k])/pg[2];		h[i][j][k]=determ(det);		r=sqrt((ps[0]+pg[0])*(ps[0]+pg[0])+(ps[1]+pg[1])*(ps[1]+pg[1])		   +(ps[2]+pg[2])*(ps[2]+pg[2]));		amp[i][j][k]=h[i][j][k]/asag[i][j][k]/r;		}	}	 for(i=1;i<nxo;++i)          for(k=1;k<nzo;++k)		amp[0][i][k]=amp[1][i][k]; 	free2float(p2d);        free2float(t2d);        free2float(sigma2d);        free2float(dzda2d);        free2float(a2d);}	

⌨️ 快捷键说明

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