赞
踩
之前快速扫描法的帖子中提供的二维代码稍显凌乱,为此追加提供一个新的三维的代码,更加清楚直观地展示三维FSM的过程,便于初学者学习
- /****************************************************************************************/
- /*********** 3D Fast Sweeping Method **********/
- /**************************Written By Zhang Jianming, 2020.10.10****************/
- /***************************************CopyRight************************************/
-
- #include<stdio.h>
- #include<iostream>
- #include<fstream>
- #include<math.h>
- #include<stdlib.h>
- #include<malloc.h>
- #include<string.h>
- #include<ctime>
- using namespace std;
- float pi=3.1415926;
- int nx =101;
- int ny=101;
- int nz =101;
- float dx= 10;
- float dy= 10;
- float dz =10;
- int T_max=1e3;
- int T_min=0;
- float T_control(float a);
- float min(float a,float b);
- float max(float a,float b);
- void BubbleSort(float* h, size_t len);
- void Swap(float& a, float& b);
-
-
- int main()
- {
- int i,j,k;
- int x0 = nx/2;int y0=ny/2; int z0 = nz/2;
- float ***s3=new float** [nx];
- float ***T_old3=new float** [nx];
- float ***T3=new float** [nx];
- float ***v3=new float** [nx];
- for(int i=0;i<nx;i++)
- {
- s3[i]=new float *[ny];
- T_old3[i]=new float *[ny];
- T3[i]=new float *[ny];
- v3[i]=new float *[ny];
- for(int j=0;j<ny;j++)
- {
- s3[i][j]=new float[nz];
- T_old3[i][j]=new float[nz];
- v3[i][j]=new float[nz];
- T3[i][j]=new float[nz];
- }
- }
-
-
-
- //initial for 3D
- for(i=0;i<nx;i++)
- for(j=0;j<ny;j++)
- for(k=0;k<nz;k++)
- {
- v3[i][j][k]=1000;
- s3[i][j][k]=(1.0/v3[i][j][k]);
- T3[i][j][k]=22.0;
- T_old3[i][j][k]=22.0;
- }
- int sx=x0;int sy=y0;int sz=z0;
- T_old3[sx][sy][sz]=0.0;
-
- float T_xmin=33.0;float T_ymin=33.0; float T_zmin=33.0;float A=0.0;float B=0.0;float C=0.0,D=0.0;
- int loop=0,Max_loop=1;
- /***********FP FSM for 3D*****************/
- float tt1=clock();
- for(loop=0;loop<Max_loop;loop++)
- {
- for(i=sx;i<nx;i++)
- for(j=sy;j<ny;j++)
- for(k=sz;k<nz;k++)
- {
- int xa=i+1;if(xa==nx) xa=nx-1;
- int xb=i-1;if(xb==-1) xb=0;
- int ya=j+1;if(ya==ny) ya=ny-1;
- int yb=j-1;if(yb==-1) yb=0;
- int za=k+1;if(za==nz) za=nz-1;
- int zb=k-1;if(zb==-1) zb=0;
- T_xmin=min(T_old3[xa][j][k],T_old3[xb][j][k]);
- T_ymin=min(T_old3[i][ya][k],T_old3[i][yb][k]);
- T_zmin=min(T_old3[i][j][za],T_old3[i][j][zb]);
- float a[3]={T_xmin,T_ymin,T_zmin};
- BubbleSort(a, 3);
- float W=a[0];float V=a[1];float U=a[2];
- T3[i][j][k]=W+s3[i][j][k]*dx;
- if(T3[i][j][k]>V)
- {
- T3[i][j][k]=((V+W+sqrt(2.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2))))/2.0;
- //T3[i][j][k]=((V+W+sqrt(-pow(V,2)-pow(W,2)+2.0*V*W))/(2.0*s3[i][j][k]*dx*s3[i][j][k]*dx))/2.0;
- }
- if(T3[i][j][k]>U)
- {
- T3[i][j][k]=(V+W+U+sqrt(3.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2)-pow(V-U,2)-pow(U-W,2)))/3.0;
- float tssp=T3[xb][yb][zb]+s3[xb][yb][zb]*dx*sqrt(3);
- T3[i][j][k]=min(T3[i][j][k],tssp);
- //float b=-2.0*(W+V+U);
- //T3[i][j][k]=(2.0*(W+V+U)+sqrt(b*b-12*(W*W+V*V+U*U-pow(s3[i][j][k]*dx,2))))/6.0;
- //T3[i][j][k]=((2.0*pow(V+W+U,2)+sqrt(4.0*pow(V+W+U,2)))/(12.0*pow(W*W+V*V+U*U-s3[i][j][k]*dx,2)))/2.0;
- }
- T_old3[i][j][k]=min(T_old3[i][j][k],T3[i][j][k]);
- }
- /**/
- for(i=sx;i>=0;i--)
- for(j=sy;j<ny;j++)
- for(k=sz;k<nz;k++)
- {
- int xa=i+1;if(xa==nx) xa=nx-1;
- int xb=i-1;if(xb==-1) xb=0;
- int ya=j+1;if(ya==ny) ya=ny-1;
- int yb=j-1;if(yb==-1) yb=0;
- int za=k+1;if(za==nz) za=nz-1;
- int zb=k-1;if(zb==-1) zb=0;
- T_xmin=min(T_old3[xa][j][k],T_old3[xb][j][k]);
- T_ymin=min(T_old3[i][ya][k],T_old3[i][yb][k]);
- T_zmin=min(T_old3[i][j][za],T_old3[i][j][zb]);
- float a[3]={T_xmin,T_ymin,T_zmin};
- BubbleSort(a, 3);
- float W=a[0];float V=a[1];float U=a[2];
- T3[i][j][k]=W+s3[i][j][k]*dx;
- if(T3[i][j][k]>V)
- {
- T3[i][j][k]=((V+W+sqrt(2.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2))))/2.0;
- //T3[i][j][k]=((V+W+sqrt(-pow(V,2)-pow(W,2)+2.0*V*W))/(2.0*s3[i][j][k]*dx*s3[i][j][k]*dx))/2.0;
- }
- if(T3[i][j][k]>U)
- {
- T3[i][j][k]=(V+W+U+sqrt(3.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2)-pow(V-U,2)-pow(U-W,2)))/3.0;
- float tssp=T3[xa][yb][zb]+s3[xa][yb][zb]*dx*sqrt(3);
- T3[i][j][k]=min(T3[i][j][k],tssp);
- //float b=-2.0*(W+V+U);
- //T3[i][j][k]=(2.0*(W+V+U)+sqrt(b*b-12*(W*W+V*V+U*U-pow(s3[i][j][k]*dx,2))))/6.0;
- //T3[i][j][k]=((2.0*pow(V+W+U,2)+sqrt(4.0*pow(V+W+U,2)))/(12.0*pow(W*W+V*V+U*U-s3[i][j][k]*dx,2)))/2.0;
- }
- T_old3[i][j][k]=min(T_old3[i][j][k],T3[i][j][k]);
- }
-
- for(i=sx;i<nx;i++)
- for(j=sy;j>=0;j--)
- for(k=sz;k<nz;k++)
- {
- int xa=i+1;if(xa==nx) xa=nx-1;
- int xb=i-1;if(xb==-1) xb=0;
- int ya=j+1;if(ya==ny) ya=ny-1;
- int yb=j-1;if(yb==-1) yb=0;
- int za=k+1;if(za==nz) za=nz-1;
- int zb=k-1;if(zb==-1) zb=0;
- T_xmin=min(T_old3[xa][j][k],T_old3[xb][j][k]);
- T_ymin=min(T_old3[i][ya][k],T_old3[i][yb][k]);
- T_zmin=min(T_old3[i][j][za],T_old3[i][j][zb]);
- float a[3]={T_xmin,T_ymin,T_zmin};
- BubbleSort(a, 3);
- float W=a[0];float V=a[1];float U=a[2];
- T3[i][j][k]=W+s3[i][j][k]*dx;
- if(T3[i][j][k]>V)
- {
- T3[i][j][k]=((V+W+sqrt(2.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2))))/2.0;
- //T3[i][j][k]=((V+W+sqrt(-pow(V,2)-pow(W,2)+2.0*V*W))/(2.0*s3[i][j][k]*dx*s3[i][j][k]*dx))/2.0;
- }
- if(T3[i][j][k]>U)
- {
- T3[i][j][k]=(V+W+U+sqrt(3.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2)-pow(V-U,2)-pow(U-W,2)))/3.0;
- float tssp=T3[xb][ya][zb]+s3[xb][ya][zb]*dx*sqrt(3);
- T3[i][j][k]=min(T3[i][j][k],tssp);
- //float b=-2.0*(W+V+U);
- //T3[i][j][k]=(2.0*(W+V+U)+sqrt(b*b-12*(W*W+V*V+U*U-pow(s3[i][j][k]*dx,2))))/6.0;
- //T3[i][j][k]=((2.0*pow(V+W+U,2)+sqrt(4.0*pow(V+W+U,2)))/(12.0*pow(W*W+V*V+U*U-s3[i][j][k]*dx,2)))/2.0;
- }
- T_old3[i][j][k]=min(T_old3[i][j][k],T3[i][j][k]);
- }
-
- for(i=sx;i>=0;i--)
- for(j=sy;j>=0;j--)
- for(k=sz;k<nz;k++)
- {
- int xa=i+1;if(xa==nx) xa=nx-1;
- int xb=i-1;if(xb==-1) xb=0;
- int ya=j+1;if(ya==ny) ya=ny-1;
- int yb=j-1;if(yb==-1) yb=0;
- int za=k+1;if(za==nz) za=nz-1;
- int zb=k-1;if(zb==-1) zb=0;
- T_xmin=min(T_old3[xa][j][k],T_old3[xb][j][k]);
- T_ymin=min(T_old3[i][ya][k],T_old3[i][yb][k]);
- T_zmin=min(T_old3[i][j][za],T_old3[i][j][zb]);
- float a[3]={T_xmin,T_ymin,T_zmin};
- BubbleSort(a, 3);
- float W=a[0];float V=a[1];float U=a[2];
- T3[i][j][k]=W+s3[i][j][k]*dx;
- if(T3[i][j][k]>V)
- {
- T3[i][j][k]=((V+W+sqrt(2.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2))))/2.0;
- //T3[i][j][k]=((V+W+sqrt(-pow(V,2)-pow(W,2)+2.0*V*W))/(2.0*s3[i][j][k]*dx*s3[i][j][k]*dx))/2.0;
- }
- if(T3[i][j][k]>U)
- {
- T3[i][j][k]=(V+W+U+sqrt(3.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2)-pow(V-U,2)-pow(U-W,2)))/3.0;
- float tssp=T3[xa][ya][zb]+s3[xa][ya][zb]*dx*sqrt(3);
- T3[i][j][k]=min(T3[i][j][k],tssp);
- //float b=-2.0*(W+V+U);
- //T3[i][j][k]=(2.0*(W+V+U)+sqrt(b*b-12*(W*W+V*V+U*U-pow(s3[i][j][k]*dx,2))))/6.0;
- //T3[i][j][k]=((2.0*pow(V+W+U,2)+sqrt(4.0*pow(V+W+U,2)))/(12.0*pow(W*W+V*V+U*U-s3[i][j][k]*dx,2)))/2.0;
- }
- T_old3[i][j][k]=min(T_old3[i][j][k],T3[i][j][k]);
- }
-
- for(i=sx;i<nx;i++)
- for(j=sy;j<ny;j++)
- for(k=sz;k>=0;k--)
- {
- int xa=i+1;if(xa==nx) xa=nx-1;
- int xb=i-1;if(xb==-1) xb=0;
- int ya=j+1;if(ya==ny) ya=ny-1;
- int yb=j-1;if(yb==-1) yb=0;
- int za=k+1;if(za==nz) za=nz-1;
- int zb=k-1;if(zb==-1) zb=0;
- T_xmin=min(T_old3[xa][j][k],T_old3[xb][j][k]);
- T_ymin=min(T_old3[i][ya][k],T_old3[i][yb][k]);
- T_zmin=min(T_old3[i][j][za],T_old3[i][j][zb]);
- float a[3]={T_xmin,T_ymin,T_zmin};
- BubbleSort(a, 3);
- float W=a[0];float V=a[1];float U=a[2];
- T3[i][j][k]=W+s3[i][j][k]*dx;
- if(T3[i][j][k]>V)
- {
- T3[i][j][k]=((V+W+sqrt(2.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2))))/2.0;
- //T3[i][j][k]=((V+W+sqrt(-pow(V,2)-pow(W,2)+2.0*V*W))/(2.0*s3[i][j][k]*dx*s3[i][j][k]*dx))/2.0;
- }
- if(T3[i][j][k]>U)
- {
- T3[i][j][k]=(V+W+U+sqrt(3.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2)-pow(V-U,2)-pow(U-W,2)))/3.0;
- float tssp=T3[xb][yb][za]+s3[xb][yb][za]*dx*sqrt(3);
- T3[i][j][k]=min(T3[i][j][k],tssp);
- //float b=-2.0*(W+V+U);
- //T3[i][j][k]=(2.0*(W+V+U)+sqrt(b*b-12*(W*W+V*V+U*U-pow(s3[i][j][k]*dx,2))))/6.0;
- //T3[i][j][k]=((2.0*pow(V+W+U,2)+sqrt(4.0*pow(V+W+U,2)))/(12.0*pow(W*W+V*V+U*U-s3[i][j][k]*dx,2)))/2.0;
- }
- T_old3[i][j][k]=min(T_old3[i][j][k],T3[i][j][k]);
- }
-
- for(i=sx;i>=0;i--)
- for(j=sy;j<ny;j++)
- for(k=sz;k>=0;k--)
- {
- int xa=i+1;if(xa==nx) xa=nx-1;
- int xb=i-1;if(xb==-1) xb=0;
- int ya=j+1;if(ya==ny) ya=ny-1;
- int yb=j-1;if(yb==-1) yb=0;
- int za=k+1;if(za==nz) za=nz-1;
- int zb=k-1;if(zb==-1) zb=0;
- T_xmin=min(T_old3[xa][j][k],T_old3[xb][j][k]);
- T_ymin=min(T_old3[i][ya][k],T_old3[i][yb][k]);
- T_zmin=min(T_old3[i][j][za],T_old3[i][j][zb]);
- float a[3]={T_xmin,T_ymin,T_zmin};
- BubbleSort(a, 3);
- float W=a[0];float V=a[1];float U=a[2];
- T3[i][j][k]=W+s3[i][j][k]*dx;
- if(T3[i][j][k]>V)
- {
- T3[i][j][k]=((V+W+sqrt(2.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2))))/2.0;
- //T3[i][j][k]=((V+W+sqrt(-pow(V,2)-pow(W,2)+2.0*V*W))/(2.0*s3[i][j][k]*dx*s3[i][j][k]*dx))/2.0;
- }
- if(T3[i][j][k]>U)
- {
- T3[i][j][k]=(V+W+U+sqrt(3.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2)-pow(V-U,2)-pow(U-W,2)))/3.0;
- float tssp=T3[xa][yb][za]+s3[xa][yb][za]*dx*sqrt(3);
- T3[i][j][k]=min(T3[i][j][k],tssp);
- //float b=-2.0*(W+V+U);
- //T3[i][j][k]=(2.0*(W+V+U)+sqrt(b*b-12*(W*W+V*V+U*U-pow(s3[i][j][k]*dx,2))))/6.0;
- //T3[i][j][k]=((2.0*pow(V+W+U,2)+sqrt(4.0*pow(V+W+U,2)))/(12.0*pow(W*W+V*V+U*U-s3[i][j][k]*dx,2)))/2.0;
- }
- T_old3[i][j][k]=min(T_old3[i][j][k],T3[i][j][k]);
- }
-
- for(i=sx;i<nx;i++)
- for(j=sy;j>=0;j--)
- for(k=sz;k>=0;k--)
- {
- int xa=i+1;if(xa==nx) xa=nx-1;
- int xb=i-1;if(xb==-1) xb=0;
- int ya=j+1;if(ya==ny) ya=ny-1;
- int yb=j-1;if(yb==-1) yb=0;
- int za=k+1;if(za==nz) za=nz-1;
- int zb=k-1;if(zb==-1) zb=0;
- T_xmin=min(T_old3[xa][j][k],T_old3[xb][j][k]);
- T_ymin=min(T_old3[i][ya][k],T_old3[i][yb][k]);
- T_zmin=min(T_old3[i][j][za],T_old3[i][j][zb]);
- float a[3]={T_xmin,T_ymin,T_zmin};
- BubbleSort(a, 3);
- float W=a[0];float V=a[1];float U=a[2];
- T3[i][j][k]=W+s3[i][j][k]*dx;
- if(T3[i][j][k]>V)
- {
- T3[i][j][k]=((V+W+sqrt(2.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2))))/2.0;
- //T3[i][j][k]=((V+W+sqrt(-pow(V,2)-pow(W,2)+2.0*V*W))/(2.0*s3[i][j][k]*dx*s3[i][j][k]*dx))/2.0;
- }
- if(T3[i][j][k]>U)
- {
- T3[i][j][k]=(V+W+U+sqrt(3.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2)-pow(V-U,2)-pow(U-W,2)))/3.0;
- float tssp=T3[xb][ya][za]+s3[xb][ya][za]*dx*sqrt(3);
- T3[i][j][k]=min(T3[i][j][k],tssp);
- //float b=-2.0*(W+V+U);
- //T3[i][j][k]=(2.0*(W+V+U)+sqrt(b*b-12*(W*W+V*V+U*U-pow(s3[i][j][k]*dx,2))))/6.0;
- //T3[i][j][k]=((2.0*pow(V+W+U,2)+sqrt(4.0*pow(V+W+U,2)))/(12.0*pow(W*W+V*V+U*U-s3[i][j][k]*dx,2)))/2.0;
- }
- T_old3[i][j][k]=min(T_old3[i][j][k],T3[i][j][k]);
- }
-
- for(i=sx;i>=0;i--)
- for(j=sy;j>=0;j--)
- for(k=sz;k>=0;k--)
- {
- int xa=i+1;if(xa==nx) xa=nx-1;
- int xb=i-1;if(xb==-1) xb=0;
- int ya=j+1;if(ya==ny) ya=ny-1;
- int yb=j-1;if(yb==-1) yb=0;
- int za=k+1;if(za==nz) za=nz-1;
- int zb=k-1;if(zb==-1) zb=0;
- T_xmin=min(T_old3[xa][j][k],T_old3[xb][j][k]);
- T_ymin=min(T_old3[i][ya][k],T_old3[i][yb][k]);
- T_zmin=min(T_old3[i][j][za],T_old3[i][j][zb]);
- float a[3]={T_xmin,T_ymin,T_zmin};
- BubbleSort(a, 3);
- float W=a[0];float V=a[1];float U=a[2];
- T3[i][j][k]=W+s3[i][j][k]*dx;
- if(T3[i][j][k]>V)
- {
- T3[i][j][k]=((V+W+sqrt(2.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2))))/2.0;
- //T3[i][j][k]=((V+W+sqrt(-pow(V,2)-pow(W,2)+2.0*V*W))/(2.0*s3[i][j][k]*dx*s3[i][j][k]*dx))/2.0;
- }
- if(T3[i][j][k]>U)
- {
- T3[i][j][k]=(V+W+U+sqrt(3.0*pow(s3[i][j][k]*dx,2)-pow(V-W,2)-pow(V-U,2)-pow(U-W,2)))/3.0;
- float tssp=T3[xa][ya][za]+s3[xa][ya][za]*dx*sqrt(3);
- T3[i][j][k]=min(T3[i][j][k],tssp);
- //float b=-2.0*(W+V+U);
- //T3[i][j][k]=(2.0*(W+V+U)+sqrt(b*b-12*(W*W+V*V+U*U-pow(s3[i][j][k]*dx,2))))/6.0;
- //T3[i][j][k]=((2.0*pow(V+W+U,2)+sqrt(4.0*pow(V+W+U,2)))/(12.0*pow(W*W+V*V+U*U-s3[i][j][k]*dx,2)))/2.0;
- }
- T_old3[i][j][k]=min(T_old3[i][j][k],T3[i][j][k]);
- }
- }
- float tt2=clock();
- cout<<"One shot modeling for 3DFSM is "<<(double)(tt2-tt1)/CLOCKS_PER_SEC<<" s."<<endl;
- float *Rdep=new float[nx];
-
-
- ofstream T3out("T3.dat");
- for(int i=0;i<nx;i++)
- {
- for(int j=0;j<ny;j++)
- {
- for(int k=0;k<nz;k++)
- {
- //T_old3[i][j][k]=sqrt(pow(i-nx/2,2)+pow(j-ny/2,2)+pow(k-0,2))*dx*1.0/2000.0;
- T_old3[i][j][k]-=sqrt(pow(i-x0,2)+pow(j-y0,2)+pow(k-z0,2))*dx*1.0/1000.0;
- T3out.write((char*)&T_old3[i][j][k],sizeof(float));
- }
- }
- }
- cout<<T_old3[nx-1][ny-1][nz-1]<<endl;;
- T3out.close();
-
- for(int i=0;i<nx;i++)
- {
- for(int j=0;j<ny;j++)
- {
- delete [] s3[i][j];
- delete [] T_old3[i][j];
- delete [] v3[i][j];
- delete [] T3[i][j];
- }
- delete []s3[i];
- delete [] T_old3[i];
- delete []v3[i];
- delete [] T3[i];
- }
- delete []s3;
- delete [] T_old3;
- delete []v3;
- delete [] T3;
- return 0;
- }//end of main
- 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 BubbleSort(float* h, size_t len)
- {
- if(h==NULL) return;
- if(len<=1) return;
- //i是次数,j是具体下标
- for(int i=0;i<len-1;++i)
- for(int j=0;j<len-1-i;++j)
- if(h[j]>h[j+1])
- Swap(h[j],h[j+1]);
- return;
- }
- void Swap(float& a, float& b)
- {
- float t=a;
- a=b;
- b=t;
- return;
- }
-
走时场(震源位于上表面的中心位置)
整体走时误差
下底面走时误差
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。