各向异性VTI介质快速扫描算法FSM走时计算及其改进算法

(PDF) A shortest‐path‐aided fast‐sweeping method to improve the accuracy of traveltime calculation in vertically transverse isotropic media VTI介质最短路径辅助的快速扫描法提高走时计算精度 (researchgate.net)

代码:

#include<stdio.h>
#include<iostream>
#include<fstream>
#include<math.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
using namespace std;
float pi=3.1415926;
int nx =100;
int nz =100;
float dx= 10;
float dz =10;
float T_control(float a)
{
	if(a>0) return  a;
	else return 0;

}
float min(float a,float b)
{
	if (a>b) return b;
	else return a;
}
float max(float a,float b)
{
	if (a>b) return a;
	else return b;
}



void main()
{
	int i,j;
	int x0 = nx/2; int z0 = nz/2;
	float **s=new float*[nx],**T_old=new float*[nx],**T_old0=new float*[nx],**T_new=new float*[nx],**T=new float*[nx];
	float **Eps=new float*[nx],**Del=new float*[nx],**Eta=new float*[nx],**Vn=new float*[nx],**V0=new float*[nx];
	for(int i=0;i<nx;i++)
	{
		s[i]=new float[nz];T_old[i]=new float[nz];T_old0[i]=new float[nz];T_new[i]=new float[nz];T[i]=new float[nz];
		Eps[i]=new float[nz];Del[i]=new float[nz];Eta[i]=new float[nz];Vn[i]=new float[nz];V0[i]=new float[nz];
		for(int j=0;j<nz;j++)
		{	s[i][j]=0;T_old[i][j]=0;T_old0[i][j]=0;T_new[i][j]=0;T[i][j]=0;Eps[i][j]=0;Del[i][j]=0;Eta[i][j]=0;Vn[i][j]=0;}
	}
	/*ifstream Vnelin;
	  Vnelin.open("mar_140_501_h15");
	  if(!Vnelin)
	  {
	  cerr<< "open file failed" << endl;
	  exit(1);
	  }
	  else 
	  {
	  for(i=0;i<nx;i++)
	  for(j=0;j<nz;j++)
	  Vnelin>>Vn[i][j];
	  }
	  Vnelin.close();
	  */

	FILE *fp;FILE *filename;
	/*	FILE *fp;FILE *filename;
		filename=fopen("mar_140_501_h15","rb");
		for(i=0;i<nx;i++)
		for(j=0;j<nz;j++)
		fread(&Vn[i][j], sizeof(float), 1, filename);
		fclose(filename);
		*/	
	for(i=0;i<nx;i++)   
		for(j=0;j<nz;j++)   
		{   
			Eps[i][j]=0.0;
			Del[i][j]=0.0;
			Eta[i][j]=(Eps[i][j]-Del[i][j])/(1+2*Del[i][j]);
			V0[i][j]=1000;
			Vn[i][j]=1000*sqrt(1.0+2*Del[i][j]);
			s[i][j]=(1.0/Vn[i][j]);
			T_old[i][j]=10.0;
			T[i][j]=22.0;
		}  
	T_old[x0][z0]=0.0;

	float T_xmin=33.0; float T_zmin=33.0;float A=0.0;float B=0.0;float C=0.0,D=0.0;
	float T_xmin0=33.0; float T_zmin0=33.0;
	int loop=0,Max_loop=50;
	int sx,sz;
	int xa,xb,za,zb;

	for(loop=0;loop<Max_loop;loop++)
	{
		for(i=0;i<nx;i++)   
			for(j=0;j<nz;j++)   
			{   
				T_old[i][j]=1e5;
			}  
		T_old[x0][z0]=0.0;


		for(i=0;i<nx;i++)
			for(j=0;j<nz;j++)
			{
				xa=i+1;xb=i-1;za=j+1;zb=j-1;
				if(xa==nx) xa=i;
				if(xb==-1) xb=i;
				if(za==nz) za=j;
				if(zb==-1) zb=j;
				T_xmin=min(T_old[xa][j],T_old[xb][j]);
				T_zmin=min(T_old[i][za],T_old[i][zb]);
				T_xmin0=min(T_old0[xa][j],T_old0[xb][j]);
				T_zmin0=min(T_old0[i][za],T_old0[i][zb]);

				A=Vn[i][j]*Vn[i][j]*(1.0+2*Eta[i][j]);
				B=Vn[i][j]*Vn[i][j]/(1.0+2*Del[i][j]);
				C=2*Eta[i][j]*Vn[i][j]*Vn[i][j];
				if (loop==0) D=1.0;
				else
					D=1+B*C*(T_old0[i][j]-T_xmin0)*(T_old0[i][j]-T_xmin0)*(T_old0[i][j]-T_zmin0)*(T_old0[i][j]-T_zmin0)/dx/dx/dz/dz;
				//cout<<"D="<<D<<endl;
				//D=1+B*C*(T_old0[i][j]-T_old[xa][j])*(T_old0[i][j]-T_old[xa][j])*(T_old0[i][j]-T_old0[i][za])*(T_old0[i][j]-T_old0[i][za])/dx/dx/dz/dz;
				//if(T_xmin-T_zmin>=sqrt((D*dx*dx)/B))   T_old[i][j]=min(T_old[i][j],T_zmin+sqrt((D*dx*dx)/B));
				//else if(T_zmin-T_xmin>=sqrt((D*dx*dx)/A))   T_old[i][j]=min(T_old[i][j],T_xmin+sqrt((D*dx*dx)/A));
				T_old[i][j]=min(T_old[i][j],T_zmin+sqrt((D*dx*dx)/B));
				T_old[i][j]=min(T_old[i][j],T_xmin+sqrt((D*dx*dx)/A));
				if(T_old[i][j]>T_xmin&&T_old[i][j]>T_zmin)
				{
					T_old[i][j]=min(T_old[i][j],(A*T_xmin+B*T_zmin+sqrt((A*T_xmin+B*T_zmin)*(A*T_xmin+B*T_zmin)-(A+B)*(A*T_xmin*T_xmin+B*T_zmin*T_zmin-D*dx*dx)))/(A+B));
				}
				float	fi=pi/4;
				float	Q=1.0+2*(Eps[xb][zb]-Del[xb][zb])/(1.0+2*Del[xb][zb]);
				float	Ag=1.0/(V0[xb][zb]*V0[xb][zb])/(1.0+2*Eps[xb][zb]);
				float	Cg=1.0/(V0[xb][zb]*V0[xb][zb]);
				float	Eg=Ag*pow(sin(fi),2)+Cg*pow(cos(fi),2);
				float	Dg=sqrt(Eg*Eg+4*(Q*Q-1.0)*Ag*Cg*pow(sin(fi),2)*pow(cos(fi),2));
				float	Sg=sqrt((1.0+2*Q)/2.0/(1.0+Q)*Eg+1.0/2.0/(1.0+Q)*Dg);
				T_old[i][j]=min(T_old[xb][zb]+Sg*sqrt(dx*dx+dz*dz),T_old[i][j]);
			}


		for(i=nx-1;i>=0;i--)
			for(j=0;j<nz;j++)
			{
				xa=i+1;xb=i-1;za=j+1;zb=j-1;
				if(xa==nx) xa=i;
				if(xb==-1) xb=i;
				if(za==nz) za=j;
				if(zb==-1) zb=j;
				T_xmin=min(T_old[xa][j],T_old[xb][j]);
				T_zmin=min(T_old[i][za],T_old[i][zb]);
				T_xmin0=min(T_old0[xa][j],T_old0[xb][j]);
				T_zmin0=min(T_old0[i][za],T_old0[i][zb]);

				A=Vn[i][j]*Vn[i][j]*(1.0+2*Eta[i][j]);
				B=Vn[i][j]*Vn[i][j]/(1.0+2*Del[i][j]);
				C=2*Eta[i][j]*Vn[i][j]*Vn[i][j];
				if (loop==0) D=1.0;
				else
					D=1+B*C*(T_old0[i][j]-T_xmin0)*(T_old0[i][j]-T_xmin0)*(T_old0[i][j]-T_zmin0)*(T_old0[i][j]-T_zmin0)/dx/dx/dz/dz;
				//D=1+B*C*(T_old0[i][j]-T_old[xa][j])*(T_old0[i][j]-T_old[xa][j])*(T_old0[i][j]-T_old0[i][za])*(T_old0[i][j]-T_old0[i][za])/dx/dx/dz/dz;
				//if(T_xmin-T_zmin>=sqrt((D*dx*dx)/B))   T_old[i][j]=min(T_old[i][j],T_zmin+sqrt((D*dx*dx)/B));
				//else if(T_zmin-T_xmin>=sqrt((D*dx*dx)/A))   T_old[i][j]=min(T_old[i][j],T_xmin+sqrt((D*dx*dx)/A));
				T_old[i][j]=min(T_old[i][j],T_zmin+sqrt((D*dx*dx)/B));
				T_old[i][j]=min(T_old[i][j],T_xmin+sqrt((D*dx*dx)/A));
				if(T_old[i][j]>T_xmin&&T_old[i][j]>T_zmin)
				{
					T_old[i][j]=min(T_old[i][j],(A*T_xmin+B*T_zmin+sqrt((A*T_xmin+B*T_zmin)*(A*T_xmin+B*T_zmin)-(A+B)*(A*T_xmin*T_xmin+B*T_zmin*T_zmin-D*dx*dx)))/(A+B));
				}
				float	fi=pi/4;
				float	Q=1.0+2*(Eps[xa][zb]-Del[xa][zb])/(1.0+2*Del[xa][zb]);
				float	Ag=1.0/(V0[xa][zb]*V0[xa][zb])/(1.0+2*Eps[xa][zb]);
				float	Cg=1.0/(V0[xa][zb]*V0[xa][zb]);
				float	Eg=Ag*pow(sin(fi),2)+Cg*pow(cos(fi),2);
				float	Dg=sqrt(Eg*Eg+4*(Q*Q-1.0)*Ag*Cg*pow(sin(fi),2)*pow(cos(fi),2));
				float	Sg=sqrt((1.0+2*Q)/2.0/(1.0+Q)*Eg+1.0/2.0/(1.0+Q)*Dg);
				T_old[i][j]=min(T_old[xa][zb]+Sg*sqrt(dx*dx+dz*dz),T_old[i][j]);
			}

		for(i=nx-1;i>=0;i--)
			for(j=nz-1;j>=0;j--)
			{
				xa=i+1;xb=i-1;za=j+1;zb=j-1;
				if(xa==nx) xa=i;
				if(xb==-1) xb=i;
				if(za==nz) za=j;
				if(zb==-1) zb=j;
				T_xmin=min(T_old[xa][j],T_old[xb][j]);
				T_zmin=min(T_old[i][za],T_old[i][zb]);
				T_xmin0=min(T_old0[xa][j],T_old0[xb][j]);
				T_zmin0=min(T_old0[i][za],T_old0[i][zb]);

				A=Vn[i][j]*Vn[i][j]*(1.0+2*Eta[i][j]);
				B=Vn[i][j]*Vn[i][j]/(1.0+2*Del[i][j]);
				C=2*Eta[i][j]*Vn[i][j]*Vn[i][j];
				if (loop==0) D=1.0;
				else
					D=1+B*C*(T_old0[i][j]-T_xmin0)*(T_old0[i][j]-T_xmin0)*(T_old0[i][j]-T_zmin0)*(T_old0[i][j]-T_zmin0)/dx/dx/dz/dz;
				//D=1+B*C*(T_old0[i][j]-T_old[xa][j])*(T_old0[i][j]-T_old[xa][j])*(T_old0[i][j]-T_old0[i][za])*(T_old0[i][j]-T_old0[i][za])/dx/dx/dz/dz;
				//if(T_xmin-T_zmin>=sqrt((D*dx*dx)/B))   T_old[i][j]=min(T_old[i][j],T_zmin+sqrt((D*dx*dx)/B));
				//else if(T_zmin-T_xmin>=sqrt((D*dx*dx)/A))   T_old[i][j]=min(T_old[i][j],T_xmin+sqrt((D*dx*dx)/A));
				T_old[i][j]=min(T_old[i][j],T_zmin+sqrt((D*dx*dx)/B));
				T_old[i][j]=min(T_old[i][j],T_xmin+sqrt((D*dx*dx)/A));
				if(T_old[i][j]>T_xmin&&T_old[i][j]>T_zmin)
				{
					T_old[i][j]=min(T_old[i][j],(A*T_xmin+B*T_zmin+sqrt((A*T_xmin+B*T_zmin)*(A*T_xmin+B*T_zmin)-(A+B)*(A*T_xmin*T_xmin+B*T_zmin*T_zmin-D*dx*dx)))/(A+B));
				}
				float	fi=pi/4;
				float	Q=1.0+2*(Eps[xa][za]-Del[xa][za])/(1.0+2*Del[xa][za]);
				float	Ag=1.0/(V0[xa][za]*V0[xa][za])/(1.0+2*Eps[xa][za]);
				float	Cg=1.0/(V0[xa][za]*V0[xa][za]);
				float	Eg=Ag*pow(sin(fi),2)+Cg*pow(cos(fi),2);
				float	Dg=sqrt(Eg*Eg+4*(Q*Q-1.0)*Ag*Cg*pow(sin(fi),2)*pow(cos(fi),2));
				float	Sg=sqrt((1.0+2*Q)/2.0/(1.0+Q)*Eg+1.0/2.0/(1.0+Q)*Dg);
				T_old[i][j]=min(T_old[xa][za]+Sg*sqrt(dx*dx+dz*dz),T_old[i][j]);
			}

		for(i=0;i<nx;i++)
			for(j=nz-1;j>=0;j--)
			{
				xa=i+1;xb=i-1;za=j+1;zb=j-1;
				if(xa==nx) xa=i;
				if(xb==-1) xb=i;
				if(za==nz) za=j;
				if(zb==-1) zb=j;
				T_xmin=min(T_old[xa][j],T_old[xb][j]);
				T_zmin=min(T_old[i][za],T_old[i][zb]);
				T_xmin0=min(T_old0[xa][j],T_old0[xb][j]);
				T_zmin0=min(T_old0[i][za],T_old0[i][zb]);

				A=Vn[i][j]*Vn[i][j]*(1.0+2*Eta[i][j]);
				B=Vn[i][j]*Vn[i][j]/(1.0+2*Del[i][j]);
				C=2*Eta[i][j]*Vn[i][j]*Vn[i][j];
				if (loop==0) D=1.0;
				else
					D=1+B*C*(T_old0[i][j]-T_xmin0)*(T_old0[i][j]-T_xmin0)*(T_old0[i][j]-T_zmin0)*(T_old0[i][j]-T_zmin0)/dx/dx/dz/dz;
				//D=1+B*C*(T_old0[i][j]-T_old[xa][j])*(T_old0[i][j]-T_old[xa][j])*(T_old0[i][j]-T_old0[i][za])*(T_old0[i][j]-T_old0[i][za])/dx/dx/dz/dz;
				//if(T_xmin-T_zmin>=sqrt((D*dx*dx)/B))   T_old[i][j]=min(T_old[i][j],T_zmin+sqrt((D*dx*dx)/B));
				//else if(T_zmin-T_xmin>=sqrt((D*dx*dx)/A))   T_old[i][j]=min(T_old[i][j],T_xmin+sqrt((D*dx*dx)/A));
				T_old[i][j]=min(T_old[i][j],T_zmin+sqrt((D*dx*dx)/B));
				T_old[i][j]=min(T_old[i][j],T_xmin+sqrt((D*dx*dx)/A));
				if(T_old[i][j]>T_xmin&&T_old[i][j]>T_zmin)
				{
					T_old[i][j]=min(T_old[i][j],(A*T_xmin+B*T_zmin+sqrt((A*T_xmin+B*T_zmin)*(A*T_xmin+B*T_zmin)-(A+B)*(A*T_xmin*T_xmin+B*T_zmin*T_zmin-D*dx*dx)))/(A+B));
				}
				float	fi=pi/4;
				float	Q=1.0+2*(Eps[xb][za]-Del[xb][za])/(1.0+2*Del[xb][za]);
				float	Ag=1.0/(V0[xb][za]*V0[xb][za])/(1.0+2*Eps[xb][za]);
				float	Cg=1.0/(V0[xb][za]*V0[xb][za]);
				float	Eg=Ag*pow(sin(fi),2)+Cg*pow(cos(fi),2);
				float	Dg=sqrt(Eg*Eg+4*(Q*Q-1.0)*Ag*Cg*pow(sin(fi),2)*pow(cos(fi),2));
				float	Sg=sqrt((1.0+2*Q)/2.0/(1.0+Q)*Eg+1.0/2.0/(1.0+Q)*Dg);
				T_old[i][j]=min(T_old[xb][za]+Sg*sqrt(dx*dx+dz*dz),T_old[i][j]);
			}

		for(i=0;i<nx;i++)
			for(j=0;j<nz;j++)
			{
				T_old0[i][j]=T_old[i][j];
			}

		if(loop==0)
		{
			for(i=0;i<nx;i++)
				for(j=0;j<nz;j++)
				{
					T_new[i][j]=T_old[i][j];
				}
		}
	}


	fp=fopen("traveltime.dat","wb+");
	for(i=0;i<nx;i++)
		for(j=0;j<nz;j++)
		{
			//if(fabs(T_old[i][j]-0.6+0.033)<0.01) T_old[i][j]=1;
			//else T_old[i][j]=0;
			T_new[i][j]=dx*sqrt(pow((i-x0),2)+pow((j-z0),2))*s[i][j];
			float dt=T_old[i][j]-T_new[i][j];
			//fwrite(&dt,sizeof(float),1,fp);
			fwrite(&T_old[i][j],sizeof(float),1,fp);
		}
	fclose(fp);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值