快速扫描法(Fast Sweeping Method,FSM)及最短路径辅助的快速扫描法SPAFSM走时计算

概述:

代码包含快速扫描法FSM走时计算的基本方法(Zhao 2005)以及高阶FSM方法和对FSM方法的一点改进:添加最短路径辅助解提高计算精度SPAFSM(Zhang 2023)。该方法及其改进方法,仅供初学者参考,也很容易向高维和各向异性走时计算推广,如有疑问,欢迎随时交流讨论。

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

(PDF) A shortest-path-aided fast sweeping method to improve the accuracy of travel time calculation (researchgate.net)

(PDF) A shortest-path-aided fast sweeping method to improve the accuracy of travel time calculation (researchgate.net)

1. 源码:

/****************************************************************************************/
/***********                          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>
using namespace std;
float pi=3.1415926;
int nx = 101;
int nz = 101;
float dx = 10;
float dz = 10;
void BubbleSort(float* h, size_t len);
void Swap(float& a, float& b);
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;
}

void main()
{
    int i,j;
    int x0 = nx/2; int z0 = nz/2;
    //int x0 = 20; int z0 = 20;
    //int x0 = 0; int z0 = 0;
    //int x0 = 375; int z0 = 0;
    float **s=new float*[nx],**T_old=new float*[nx],**T_new=new float*[nx],**T=new float*[nx],**delta=new float*[nx],**eta=new float*[nx],**v=new float*[nx],**vt=new float*[nx];
    for(int i=0;i<nx;i++)
    {
        s[i]=new float[nz];T_old[i]=new float[nz];T_new[i]=new float[nz];T[i]=new float[nz];delta[i]=new float[nz];eta[i]=new float[nz];v[i]=new float[nz];vt[i]=new float[nz];
        for(int j=0;j<nz;j++)
        {    s[i][j]=0;T_old[i][j]=0;T_new[i][j]=0;T[i][j]=0;delta[i][j]=0;eta[i][j]=0;v[i][j]=0;vt[i][j]=0;}
    }
    


    char name[256];
    FILE *fp;
    FILE *filename;
    //filename=fopen("mar_140_501_h15s","rb");
    //for(i=0;i<nx;i++)
    //    for(j=0;j<nz;j++)
    //    fread(&v[i][j], sizeof(float), 1, filename);
    //fclose(filename);
    
    for(i=0;i<nx;i++)   
        for(j=0;j<nz;j++)   
        {
            v[i][j]=1000.0;
            //v[i][j]=1000.0+1*sqrt((i-x0)*dx*(i-x0)*dx+(j-z0)*dz*(j-z0)*dz);
            //if(j>60) v[i][j]=2000.0;
            s[i][j]=(1.0/v[i][j]);
            T_old[i][j]=10.0;
            T[i][j]=22.0;
            delta[i][j]=0.0;
            vt[i][j]=0.0;
            eta[i][j]=0.0;
        }  
    T_old[x0][z0]=0.0;
    //T_old[0][0]=0.0;
    //T_old[x0-1][z0]=dx*s[x0][z0];
    //T_old[x0+1][z0]=dx*s[x0][z0];
    //T_old[x0][z0-1]=dx*s[x0][z0];
    //T_old[x0][z0+1]=dx*s[x0][z0];
    //T_old[x0-1][z0-1]=sqrt(2.0)*dx*s[x0][z0];
    //T_old[x0+1][z0+1]=sqrt(2.0)*dx*s[x0][z0];
    //T_old[x0+1][z0-1]=sqrt(2.0)*dx*s[x0][z0];
    //T_old[x0-1][z0+1]=sqrt(2.0)*dx*s[x0][z0];

    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 tmp;
    int loop=0,Max_loop=25;
    int sx,sz;
    int xa,xb,za,zb;
    int xa1,xb1,za1,zb1;

    //SGFSM, notice: it is not an orthogonal coordinate system when dx!=dz
    float tt1=clock();
    for(loop=0;loop<Max_loop;loop++)
    {
        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;

                1stFD
                //T_xmin=min(T_old[xa][j],T_old[xb][j]);
                //T_zmin=min(T_old[i][za],T_old[i][zb]);
                //if (fabs(T_xmin-T_zmin)>=s[i][j]*dx) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx;
                //else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*dx*s[i][j]*dx-pow(T_xmin-T_zmin,2)))/2;
                else T[i][j]=(sqrt(2.0)/2.0*T_xmin+T_zmin+sqrt(2*s[i][j]*dx*s[i][j]*dx-pow(T_xmin-T_zmin,2)))/2;
                //T_old[i][j]=min(T[i][j],T_old[i][j]);
                
                //T_xmin=min(T_old[xa][za],T_old[xb][zb]);
                //T_zmin=min(T_old[xb][za],T_old[xa][zb]);
                //if (fabs(T_xmin-T_zmin)>=s[i][j]*dx) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx*sqrt(2.0);
                //else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*sqrt(2.0)*dx*s[i][j]*sqrt(2.0)*dx-pow(T_xmin-T_zmin,2)))/2;
                //T_old[i][j]=min(T[i][j],T_old[i][j]);
            

                //float a[3]={T_xmin,T_zmin,min(T_xmin,T_zmin)};
                //BubbleSort(a, 3);
                //float W=a[0];float V=a[1];float U=a[2];
                //T[i][j]=W+s[i][j]*dx;
                //if(T[i][j]>V) 
                //{
                //    T[i][j]=((V+W+sqrt(2.0*pow(s[i][j]*dx,2)-pow(V-W,2))))/2.0;
                //}
                //if(T[i][j]>U)
                //{
                //    T[i][j]=(V+W+U+sqrt(3.0*pow(s[i][j]*dx,2)-pow(V-W,2)-pow(V-U,2)-pow(U-W,2)))/3.0;
                //}
                //T_old[i][j]=min(T[i][j],T_old[i][j]);

                //T_old[i][j]=min(T_old[xb][zb]+s[i][j]*dx*sqrt(2),T_old[i][j]);
                //xa1=i+2;xb1=i-2;za1=j+2;zb1=j-2;
                //if(xa1==nx) xa1=xa;
                //if(xb1==-1) xb1=xb;
                //if(za1==nz) za1=za;
                //if(zb1==-1) zb1=zb;
                //if(xa1==nx+1) xa1=i;
                //if(xb1==-2) xb1=i;
                //if(za1==nz+1) za1=j;
                //if(zb1==-2) zb1=j;
                //T_old[i][j]=min(T_old[xb1][zb]+s[i][j]*dx*sqrt(5),T_old[i][j]);
                //T_old[i][j]=min(T_old[xb][zb1]+s[i][j]*dx*sqrt(5),T_old[i][j]);


                if(T_old[i][j]>=T_old[xb][zb]&&T_old[i][j]>=T_old[i][zb]&&T_old[i][j]>=T_old[xb][j])
                //if(i>=x0&&j>=z0)
                {
                    //T_old[i][zb]=min(T_old[xb][zb]+s[i][j]*dx,T_old[i][zb]);
                    //T_old[xb][j]=min(T_old[xb][zb]+s[i][j]*dx,T_old[xb][j]);
                    //T_old[i][zb]=min(T_old[xb][zb]+s[i][zb]*dx,T_old[i][zb]);
                    //T_old[xb][j]=min(T_old[xb][zb]+s[xb][j]*dx,T_old[xb][j]);
                    //T_old[i][zb]=min(T_old[xb][zb]+s[xb][zb]*dx,T_old[i][zb]);
                    //T_old[xb][j]=min(T_old[xb][zb]+s[xb][zb]*dx,T_old[xb][j]);
                    T_old[i][zb]=min(T_old[xb][zb]+0.5*(s[xb][zb]+s[i][zb])*dx,T_old[i][zb]);
                    T_old[xb][j]=min(T_old[xb][zb]+0.5*(s[xb][zb]+s[xb][j])*dx,T_old[xb][j]);
                    //tmp=pow(s[i][j]*dx*sqrt(2),2)-pow(T_old[i][zb]-T_old[xb][j],2);
                    //tmp=pow(s[xb][zb]*dx*sqrt(2),2)-pow(T_old[i][zb]-T_old[xb][j],2);
                    tmp=pow(0.5*(s[i][j]+s[xb][zb])*dx*sqrt(2),2)-pow(T_old[i][zb]-T_old[xb][j],2);
                    //tmp=pow(0.25*(s[i][j]+s[xb][zb]+s[i][zb]+s[xb][j])*dx*sqrt(2),2)-pow(T_old[i][zb]-T_old[xb][j],2);
                    if(tmp>=0) T_old[i][j]=min(T_old[xb][zb]+sqrt(tmp),T_old[i][j]);
                    
                    //T_old[i][j]=min(T_old[xb][zb]+s[xb][za]*dx*sqrt(2),T_old[i][j]);
                    //tmp=2*s[i][j]*dx*s[i][j]*dx-pow(T_old[i][zb]-T_old[xb][j],2);
                    //if(tmp>0) T_old[i][j]=min((T_old[xb][j]+T_old[i][zb]+sqrt(tmp))/2,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]);
                //if (fabs(T_xmin-T_zmin)>=s[i][j]*dx) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx;
                //else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*dx*s[i][j]*dx-pow(T_xmin-T_zmin,2)))/2;
                else T[i][j]=(sqrt(2.0)/2.0*T_xmin+T_zmin+sqrt(2*s[i][j]*dx*s[i][j]*dx-pow(T_xmin-T_zmin,2)))/2;
                //T_old[i][j]=min(T[i][j],T_old[i][j]);
                
                //T_xmin=min(T_old[xa][za],T_old[xb][zb]);
                //T_zmin=min(T_old[xb][za],T_old[xa][zb]);
                //if (fabs(T_xmin-T_zmin)>=s[i][j]*dx) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx*sqrt(2.0);
                //else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*sqrt(2.0)*dx*s[i][j]*sqrt(2.0)*dx-pow(T_xmin-T_zmin,2)))/2;
                //T_old[i][j]=min(T[i][j],T_old[i][j]);
                
                //T_old[i][j]=min(T_old[xa][zb]+s[i][j]*dx*sqrt(2),T_old[i][j]);
                //xa1=i+2;xb1=i-2;za1=j+2;zb1=j-2;
                //if(xa1==nx) xa1=xa;
                //if(xb1==-1) xb1=xb;
                //if(za1==nz) za1=za;
                //if(zb1==-1) zb1=zb;
                //if(xa1==nx+1) xa1=i;
                //if(xb1==-2) xb1=i;
                //if(za1==nz+1) za1=j;
                //if(zb1==-2) zb1=j;
                //T_old[i][j]=min(T_old[xa1][zb]+s[i][j]*dx*sqrt(5),T_old[i][j]);
                //T_old[i][j]=min(T_old[xa][zb1]+s[i][j]*dx*sqrt(5),T_old[i][j]);

                if(T_old[i][j]>=T_old[xa][zb]&&T_old[i][j]>=T_old[xa][j]&&T_old[i][j]>=T_old[i][zb])
                //if(i<=x0&&j>=z0)
                {
                    //T_old[xa][j]=min(T_old[xa][zb]+s[i][j]*dx,T_old[xa][j]);
                    //T_old[i][zb]=min(T_old[xa][zb]+s[i][j]*dx,T_old[i][zb]);
                    //T_old[xa][j]=min(T_old[xa][zb]+s[xa][j]*dx,T_old[xa][j]);
                    //T_old[i][zb]=min(T_old[xa][zb]+s[i][zb]*dx,T_old[i][zb]);
                    //T_old[xa][j]=min(T_old[xa][zb]+s[xa][zb]*dx,T_old[xa][j]);
                    //T_old[i][zb]=min(T_old[xa][zb]+s[xa][zb]*dx,T_old[i][zb]);
                    T_old[xa][j]=min(T_old[xa][zb]+0.5*(s[xa][zb]+s[xa][j])*dx,T_old[xa][j]);
                    T_old[i][zb]=min(T_old[xa][zb]+0.5*(s[xa][zb]+s[i][zb])*dx,T_old[i][zb]);
                    //tmp=pow(s[i][j]*dx*sqrt(2),2)-pow(T_old[i][zb]-T_old[xa][j],2);
                    //tmp=pow(s[xa][zb]*dx*sqrt(2),2)-pow(T_old[i][zb]-T_old[xa][j],2);
                    tmp=pow(0.5*(s[i][j]+s[xa][zb])*dx*sqrt(2),2)-pow(T_old[i][zb]-T_old[xa][j],2);
                    //tmp=pow(0.25*(s[i][j]+s[xa][zb]+s[xa][j]+s[i][zb])*dx*sqrt(2),2)-pow(T_old[i][zb]-T_old[xa][j],2);
                    if(tmp>=0) T_old[i][j]=min(T_old[xa][zb]+sqrt(tmp),T_old[i][j]);
                    
                    //T_old[i][j]=min(T_old[xa][zb]+s[xb][za]*dx*sqrt(2),T_old[i][j]);
                    //tmp=2*s[i][j]*dx*s[i][j]*dx-pow(T_old[i][zb]-T_old[xa][j],2);
                    //if(tmp>0) T_old[i][j]=min((T_old[xa][j]+T_old[i][zb]+sqrt(tmp))/2,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]);
                //if (fabs(T_xmin-T_zmin)>=s[i][j]*dx) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx;
                //else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*dx*s[i][j]*dx-pow(T_xmin-T_zmin,2)))/2;
                else T[i][j]=(sqrt(2.0)/2.0*T_xmin+T_zmin+sqrt(2*s[i][j]*dx*s[i][j]*dx-pow(T_xmin-T_zmin,2)))/2;
                //T_old[i][j]=min(T[i][j],T_old[i][j]);
                
                //T_xmin=min(T_old[xa][za],T_old[xb][zb]);
                //T_zmin=min(T_old[xb][za],T_old[xa][zb]);
                //if (fabs(T_xmin-T_zmin)>=s[i][j]*dx) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx*sqrt(2.0);
                //else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*sqrt(2.0)*dx*s[i][j]*sqrt(2.0)*dx-pow(T_xmin-T_zmin,2)))/2;
                //T_old[i][j]=min(T[i][j],T_old[i][j]);
                
                //T_old[i][j]=min(T_old[xa][za]+s[i][j]*dx*sqrt(2),T_old[i][j]);
                //xa1=i+2;xb1=i-2;za1=j+2;zb1=j-2;
                //if(xa1==nx) xa1=xa;
                //if(xb1==-1) xb1=xb;
                //if(za1==nz) za1=za;
                //if(zb1==-1) zb1=zb;
                //if(xa1==nx+1) xa1=i;
                //if(xb1==-2) xb1=i;
                //if(za1==nz+1) za1=j;
                //if(zb1==-2) zb1=j;
                //T_old[i][j]=min(T_old[xa1][za]+s[i][j]*dx*sqrt(5),T_old[i][j]);
                //T_old[i][j]=min(T_old[xa][za1]+s[i][j]*dx*sqrt(5),T_old[i][j]);

                if(T_old[i][j]>=T_old[xa][za]&&T_old[i][j]>=T_old[xa][j]&&T_old[i][j]>=T_old[i][za])
                //if(i<=x0&&j<=z0)
                {
                    //T_old[xa][j]=min(T_old[xa][za]+s[i][j]*dx,T_old[xa][j]);
                    //T_old[i][za]=min(T_old[xa][za]+s[i][j]*dx,T_old[i][za]);
                    //T_old[xa][j]=min(T_old[xa][za]+s[xa][j]*dx,T_old[xa][j]);
                    //T_old[i][za]=min(T_old[xa][za]+s[i][za]*dx,T_old[i][za]);
                    //T_old[xa][j]=min(T_old[xa][za]+s[xa][za]*dx,T_old[xa][j]);
                    //T_old[i][za]=min(T_old[xa][za]+s[xa][za]*dx,T_old[i][za]);
                    T_old[xa][j]=min(T_old[xa][za]+0.5*(s[xa][za]+s[xa][j])*dx,T_old[xa][j]);
                    T_old[i][za]=min(T_old[xa][za]+0.5*(s[xa][za]+s[i][za])*dx,T_old[i][za]);
                    //tmp=pow(s[i][j]*dx*sqrt(2),2)-pow(T_old[i][za]-T_old[xa][j],2);
                    //tmp=pow(s[xa][za]*dx*sqrt(2),2)-pow(T_old[i][za]-T_old[xa][j],2);
                    tmp=pow(0.5*(s[i][j]+s[xa][za])*dx*sqrt(2),2)-pow(T_old[i][za]-T_old[xa][j],2);
                    //tmp=pow(0.25*(s[i][j]+s[xa][za]+s[xa][j]+s[i][za])*dx*sqrt(2),2)-pow(T_old[i][za]-T_old[xa][j],2);
                    if(tmp>=0) T_old[i][j]=min(T_old[xa][za]+sqrt(tmp),T_old[i][j]);
                    
                    //T_old[i][j]=min(T_old[xa][za]+s[xb][za]*dx*sqrt(2),T_old[i][j]);
                    //tmp=2*s[i][j]*dx*s[i][j]*dx-pow(T_old[i][za]-T_old[xa][j],2);
                    //if(tmp>0) T_old[i][j]=min((T_old[xa][j]+T_old[i][za]+sqrt(tmp))/2,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]);
                //if (fabs(T_xmin-T_zmin)>=s[i][j]*dx) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx;
                //else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*dx*s[i][j]*dx-pow(T_xmin-T_zmin,2)))/2;
                else T[i][j]=(sqrt(2.0)/2.0*T_xmin+T_zmin+sqrt(2*s[i][j]*dx*s[i][j]*dx-pow(T_xmin-T_zmin,2)))/2;
                //T_old[i][j]=min(T[i][j],T_old[i][j]);
                
                //T_xmin=min(T_old[xa][za],T_old[xb][zb]);
                //T_zmin=min(T_old[xb][za],T_old[xa][zb]);
                //if (fabs(T_xmin-T_zmin)>=s[i][j]*dx) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx*sqrt(2.0);
                //else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*sqrt(2.0)*dx*s[i][j]*sqrt(2.0)*dx-pow(T_xmin-T_zmin,2)))/2;
                //T_old[i][j]=min(T[i][j],T_old[i][j]);
                
                //T_old[i][j]=min(T_old[xb][za]+s[i][j]*dx*sqrt(2),T_old[i][j]);
                //xa1=i+2;xb1=i-2;za1=j+2;zb1=j-2;
                //if(xa1==nx) xa1=xa;
                //if(xb1==-1) xb1=xb;
                //if(za1==nz) za1=za;
                //if(zb1==-1) zb1=zb;
                //if(xa1==nx+1) xa1=i;
                //if(xb1==-2) xb1=i;
                //if(za1==nz+1) za1=j;
                //if(zb1==-2) zb1=j;
                //T_old[i][j]=min(T_old[xb1][za]+s[i][j]*dx*sqrt(5),T_old[i][j]);
                //T_old[i][j]=min(T_old[xb][za1]+s[i][j]*dx*sqrt(5),T_old[i][j]);
            
                if(T_old[i][j]>=T_old[xb][za]&&T_old[i][j]>=T_old[xb][j]&&T_old[i][j]>=T_old[i][za])
                //if(i>=x0&&j<=z0)
                {
                    //T_old[xb][j]=min(T_old[xb][za]+s[i][j]*dx,T_old[xb][j]);
                    //T_old[i][za]=min(T_old[xb][za]+s[i][j]*dx,T_old[i][za]);
                    //T_old[xb][j]=min(T_old[xb][za]+s[xb][j]*dx,T_old[xb][j]);
                    //T_old[i][za]=min(T_old[xb][za]+s[i][za]*dx,T_old[i][za]);
                    //T_old[xb][j]=min(T_old[xb][za]+s[xb][za]*dx,T_old[xb][j]);
                    //T_old[i][za]=min(T_old[xb][za]+s[xb][za]*dx,T_old[i][za]);
                    T_old[xb][j]=min(T_old[xb][za]+0.5*(s[xb][za]+s[xb][j])*dx,T_old[xb][j]);
                    T_old[i][za]=min(T_old[xb][za]+0.5*(s[xb][za]+s[i][za])*dx,T_old[i][za]);
                    //tmp=pow(s[i][j]*dx*sqrt(2),2)-pow(T_old[i][za]-T_old[xb][j],2);
                    //tmp=pow(s[xb][za]*dx*sqrt(2),2)-pow(T_old[i][za]-T_old[xb][j],2);
                    tmp=pow(0.5*(s[i][j]+s[xb][za])*dx*sqrt(2),2)-pow(T_old[i][za]-T_old[xb][j],2);
                    //tmp=pow(0.25*(s[i][j]+s[xb][za]+s[xb][j]+s[i][za])*dx*sqrt(2),2)-pow(T_old[i][za]-T_old[xb][j],2);
                    if(tmp>=0) T_old[i][j]=min(T_old[xb][za]+sqrt(tmp),T_old[i][j]);
                    
                    //T_old[i][j]=min(T_old[xb][za]+s[xb][za]*dx*sqrt(2),T_old[i][j]);
                    //tmp=2*s[i][j]*dx*s[i][j]*dx-pow(T_old[i][za]-T_old[xb][j],2);
                    //if(tmp>0) T_old[i][j]=min((T_old[xb][j]+T_old[i][za]+sqrt(tmp))/2,T_old[i][j]);
                }
            }
    }//end of loop of 1st FSM 
    float tt2=clock();
    cout<<"One shot modeling for 1stFSM is "<<(double)(tt2-tt1)/CLOCKS_PER_SEC<<" s."<<endl;
    

#if 0
    //2nd order FSM
    float Txf;float Txz;float Tzf; float Tzz;
    float wxf,wxz,wzf,wzz,rxf,rxz,rzf,rzz; float epsi=1e-6;
    //int xa1,xb1,za1,zb1;
    for(loop=0;loop<Max_loop;loop++)
    //for(loop=0;loop<25;loop++)
    {
        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;
                
                xa1=i+2;xb1=i-2;za1=j+2;zb1=j-2;
                if(xa1==nx) xa1=xa;
                if(xb1==-1) xb1=xb;
                if(za1==nz) za1=za;
                if(zb1==-1) zb1=zb;
                if(xa1==nx+1) xa1=i;
                if(xb1==-2) xb1=i;
                if(za1==nz+1) za1=j;
                if(zb1==-2) zb1=j;
            
                rxf=(epsi+pow(T_old[i][j]-2*T_old[xb][j]+T_old[xb1][j],2))/(epsi+pow(T_old[xa][j]-2*T_old[i][j]+T_old[xb][j],2));
                rxz=(epsi+pow(T_old[xa1][j]-2*T_old[xa][j]+T_old[i][j],2))/(epsi+pow(T_old[xa][j]-2*T_old[i][j]+T_old[xb][j],2));
                rzf=(epsi+pow(T_old[i][j]-2*T_old[i][zb]+T_old[i][zb1],2))/(epsi+pow(T_old[i][za]-2*T_old[i][j]+T_old[i][zb],2));
                rzz=(epsi+pow(T_old[i][za1]-2*T_old[i][za]+T_old[i][j],2))/(epsi+pow(T_old[i][za]-2*T_old[i][j]+T_old[i][zb],2));
                wxf=1.0/(1.0+2.0*pow(rxf,2));
                wxz=1.0/(1.0+2.0*pow(rxz,2));
                wzf=1.0/(1.0+2.0*pow(rzf,2));
                wzz=1.0/(1.0+2.0*pow(rzz,2));
                Txf=(1.0-wxf)*(T_old[xa][j]-T_old[xb][j])/2.0/dx+wxf*(3.0*T_old[i][j]-4.0*T_old[xb][j]+T_old[xb1][j])/2.0/dx;
                Txz=(1.0-wxz)*(T_old[xa][j]-T_old[xb][j])/2.0/dx+wxz*(-3.0*T_old[i][j]+4.0*T_old[xa][j]-T_old[xa1][j])/2.0/dx;
                Tzf=(1.0-wzf)*(T_old[i][za]-T_old[i][zb])/2.0/dz+wzf*(3.0*T_old[i][j]-4.0*T_old[i][zb]+T_old[i][zb1])/2.0/dz;
                Tzz=(1.0-wzz)*(T_old[i][za]-T_old[i][zb])/2.0/dz+wzz*(-3.0*T_old[i][j]+4.0*T_old[i][za]-T_old[i][za1])/2.0/dz;
                T_xmin=min(T_old[i][j]-dx*Txf,T_old[i][j]+dx*Txz);
                T_zmin=min(T_old[i][j]-dz*Tzf,T_old[i][j]+dz*Tzz);
                if (fabs(T_xmin-T_zmin)>=s[i][j]*dx) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx;
                else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*dx*s[i][j]*dx-pow(T_xmin-T_zmin,2)))/2;
                T_old[i][j]=min(T[i][j],T_old[i][j]);
                
                //rxf=(epsi+pow(T_old[i][j]-2*T_old[xb][zb]+T_old[xb1][zb1],2))/(epsi+pow(T_old[xa][za]-2*T_old[i][j]+T_old[xb][zb],2));
                //wxf=1.0/(1.0+2.0*pow(rxf,2));
                //Txf=(1.0-wxf)*(T_old[xa][za]-T_old[xb][zb])/2.0/sqrt(2)/dx+wxf*(3.0*T_old[i][j]-4.0*T_old[xb][zb]+T_old[xb1][zb1])/2.0/sqrt(2)/dx;
                //T_old[i][j]=min(T_old[i][j]-sqrt(2)*dx*Txf+s[i][j]*dx*sqrt(2),T_old[i][j]);
                
                //rxf=(epsi+pow(T_old[i][j]-2*T_old[xb][zb]+T_old[xb1][zb1],2))/(epsi+pow(T_old[xa][za]-2*T_old[i][j]+T_old[xb][zb],2));
                //rxz=(epsi+pow(T_old[xa1][za1]-2*T_old[xa][za]+T_old[i][j],2))/(epsi+pow(T_old[xa][za]-2*T_old[i][j]+T_old[xb][zb],2));
                //rzf=(epsi+pow(T_old[i][j]-2*T_old[xa][zb]+T_old[xa1][zb1],2))/(epsi+pow(T_old[xb][za]-2*T_old[i][j]+T_old[xa][zb],2));
                //rzz=(epsi+pow(T_old[xb1][za1]-2*T_old[xb][za]+T_old[i][j],2))/(epsi+pow(T_old[xb][za]-2*T_old[i][j]+T_old[xa][zb],2));
                //wxf=1.0/(1.0+2.0*pow(rxf,2));
                //wxz=1.0/(1.0+2.0*pow(rxz,2));
                //wzf=1.0/(1.0+2.0*pow(rzf,2));
                //wzz=1.0/(1.0+2.0*pow(rzz,2));
                //Txf=(1.0-wxf)*(T_old[xa][za]-T_old[xb][zb])/2.0/sqrt(2)/dx+wxf*(3.0*T_old[i][j]-4.0*T_old[xb][zb]+T_old[xb1][zb1])/2.0/sqrt(2)/dx;
                //Txz=(1.0-wxz)*(T_old[xa][za]-T_old[xb][zb])/2.0/sqrt(2)/dx+wxz*(-3.0*T_old[i][j]+4.0*T_old[xa][za]-T_old[xa1][za1])/2.0/sqrt(2)/dx;
                //Tzf=(1.0-wzf)*(T_old[xb][za]-T_old[xa][zb])/2.0/sqrt(2)/dz+wzf*(3.0*T_old[i][j]-4.0*T_old[xa][zb]+T_old[xa1][zb1])/2.0/sqrt(2)/dz;
                //Tzz=(1.0-wzz)*(T_old[xb][za]-T_old[xa][zb])/2.0/sqrt(2)/dz+wzz*(-3.0*T_old[i][j]+4.0*T_old[xb][za]-T_old[xb1][za1])/2.0/sqrt(2)/dz;
                //T_xmin=min(T_old[i][j]-dx*sqrt(2)*Txf,T_old[i][j]+dx*sqrt(2)*Txz);
                //T_zmin=min(T_old[i][j]-dz*sqrt(2)*Tzf,T_old[i][j]+dz*sqrt(2)*Tzz);
                cout<<"i="<<i<<",  j="<<j<<"  "<<Txf<<"  "<<Txz<<"  "<<Tzf<<"  "<<Tzz<<endl;
                //if (fabs(T_xmin-T_zmin)>=s[i][j]*dx*sqrt(2)) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx*sqrt(2);
                //else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*dx*sqrt(2)*s[i][j]*dx*sqrt(2)-pow(T_xmin-T_zmin,2)))/2;
                //T_old[i][j]=min(T[i][j],T_old[i][j]);
            }

        //#if 0
        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;
                
                xa1=i+2;xb1=i-2;za1=j+2;zb1=j-2;
                if(xa1==nx) xa1=xa;
                if(xb1==-1) xb1=xb;
                if(za1==nz) za1=za;
                if(zb1==-1) zb1=zb;
                if(xa1==nx+1) xa1=i;
                if(xb1==-2) xb1=i;
                if(za1==nz+1) za1=j;
                if(zb1==-2) zb1=j;
            
                rxf=(epsi+pow(T_old[i][j]-2*T_old[xb][j]+T_old[xb1][j],2))/(epsi+pow(T_old[xa][j]-2*T_old[i][j]+T_old[xb][j],2));
                rxz=(epsi+pow(T_old[xa1][j]-2*T_old[xa][j]+T_old[i][j],2))/(epsi+pow(T_old[xa][j]-2*T_old[i][j]+T_old[xb][j],2));
                rzf=(epsi+pow(T_old[i][j]-2*T_old[i][zb]+T_old[i][zb1],2))/(epsi+pow(T_old[i][za]-2*T_old[i][j]+T_old[i][zb],2));
                rzz=(epsi+pow(T_old[i][za1]-2*T_old[i][za]+T_old[i][j],2))/(epsi+pow(T_old[i][za]-2*T_old[i][j]+T_old[i][zb],2));
                wxf=1.0/(1.0+2.0*pow(rxf,2));
                wxz=1.0/(1.0+2.0*pow(rxz,2));
                wzf=1.0/(1.0+2.0*pow(rzf,2));
                wzz=1.0/(1.0+2.0*pow(rzz,2));
                Txf=(1.0-wxf)*(T_old[xa][j]-T_old[xb][j])/2.0/dx+wxf*(3.0*T_old[i][j]-4.0*T_old[xb][j]+T_old[xb1][j])/2.0/dx;
                Txz=(1.0-wxz)*(T_old[xa][j]-T_old[xb][j])/2.0/dx+wxz*(-3.0*T_old[i][j]+4.0*T_old[xa][j]-T_old[xa1][j])/2.0/dx;
                Tzf=(1.0-wzf)*(T_old[i][za]-T_old[i][zb])/2.0/dz+wzf*(3.0*T_old[i][j]-4.0*T_old[i][zb]+T_old[i][zb1])/2.0/dz;
                Tzz=(1.0-wzz)*(T_old[i][za]-T_old[i][zb])/2.0/dz+wzz*(-3.0*T_old[i][j]+4.0*T_old[i][za]-T_old[i][za1])/2.0/dz;
                T_xmin=min(T_old[i][j]-dx*Txf,T_old[i][j]+dx*Txz);
                T_zmin=min(T_old[i][j]-dz*Tzf,T_old[i][j]+dz*Tzz);
                if (fabs(T_xmin-T_zmin)>=s[i][j]*dx) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx;
                else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*dx*s[i][j]*dx-pow(T_xmin-T_zmin,2)))/2;
                T_old[i][j]=min(T[i][j],T_old[i][j]);
                
                //rxf=(epsi+pow(T_old[i][j]-2*T_old[xb][zb]+T_old[xb1][zb1],2))/(epsi+pow(T_old[xa][za]-2*T_old[i][j]+T_old[xb][zb],2));
                //rxz=(epsi+pow(T_old[xa1][za1]-2*T_old[xa][za]+T_old[i][j],2))/(epsi+pow(T_old[xa][za]-2*T_old[i][j]+T_old[xb][zb],2));
                //rzf=(epsi+pow(T_old[i][j]-2*T_old[xa][zb]+T_old[xa1][zb1],2))/(epsi+pow(T_old[xb][za]-2*T_old[i][j]+T_old[xa][zb],2));
                //rzz=(epsi+pow(T_old[xb1][za1]-2*T_old[xb][za]+T_old[i][j],2))/(epsi+pow(T_old[xb][za]-2*T_old[i][j]+T_old[xa][zb],2));
                //wxf=1.0/(1.0+2.0*pow(rxf,2));
                //wxz=1.0/(1.0+2.0*pow(rxz,2));
                //wzf=1.0/(1.0+2.0*pow(rzf,2));
                //wzz=1.0/(1.0+2.0*pow(rzz,2));
                //Txf=(1.0-wxf)*(T_old[xa][za]-T_old[xb][zb])/2.0/sqrt(2)/dx+wxf*(3.0*T_old[i][j]-4.0*T_old[xb][zb]+T_old[xb1][zb1])/2.0/sqrt(2)/dx;
                //Txz=(1.0-wxz)*(T_old[xa][za]-T_old[xb][zb])/2.0/sqrt(2)/dx+wxz*(-3.0*T_old[i][j]+4.0*T_old[xa][za]-T_old[xa1][za1])/2.0/sqrt(2)/dx;
                //Tzf=(1.0-wzf)*(T_old[xb][za]-T_old[xa][zb])/2.0/sqrt(2)/dz+wzf*(3.0*T_old[i][j]-4.0*T_old[xa][zb]+T_old[xa1][zb1])/2.0/sqrt(2)/dz;
                //Tzz=(1.0-wzz)*(T_old[xb][za]-T_old[xa][zb])/2.0/sqrt(2)/dz+wzz*(-3.0*T_old[i][j]+4.0*T_old[xb][za]-T_old[xb1][za1])/2.0/sqrt(2)/dz;
                //T_xmin=min(T_old[i][j]-dx*sqrt(2)*Txf,T_old[i][j]+dx*sqrt(2)*Txz);
                //T_zmin=min(T_old[i][j]-dz*sqrt(2)*Tzf,T_old[i][j]+dz*sqrt(2)*Tzz);
                //if (fabs(T_xmin-T_zmin)>=s[i][j]*dx*sqrt(2)) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx*sqrt(2);
                //else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*dx*sqrt(2)*s[i][j]*dx*sqrt(2)-pow(T_xmin-T_zmin,2)))/2;
                //T_old[i][j]=min(T[i][j],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;
                
                xa1=i+2;xb1=i-2;za1=j+2;zb1=j-2;
                if(xa1==nx) xa1=xa;
                if(xb1==-1) xb1=xb;
                if(za1==nz) za1=za;
                if(zb1==-1) zb1=zb;
                if(xa1==nx+1) xa1=i;
                if(xb1==-2) xb1=i;
                if(za1==nz+1) za1=j;
                if(zb1==-2) zb1=j;
            
                rxf=(epsi+pow(T_old[i][j]-2*T_old[xb][j]+T_old[xb1][j],2))/(epsi+pow(T_old[xa][j]-2*T_old[i][j]+T_old[xb][j],2));
                rxz=(epsi+pow(T_old[xa1][j]-2*T_old[xa][j]+T_old[i][j],2))/(epsi+pow(T_old[xa][j]-2*T_old[i][j]+T_old[xb][j],2));
                rzf=(epsi+pow(T_old[i][j]-2*T_old[i][zb]+T_old[i][zb1],2))/(epsi+pow(T_old[i][za]-2*T_old[i][j]+T_old[i][zb],2));
                rzz=(epsi+pow(T_old[i][za1]-2*T_old[i][za]+T_old[i][j],2))/(epsi+pow(T_old[i][za]-2*T_old[i][j]+T_old[i][zb],2));
                wxf=1.0/(1.0+2.0*pow(rxf,2));
                wxz=1.0/(1.0+2.0*pow(rxz,2));
                wzf=1.0/(1.0+2.0*pow(rzf,2));
                wzz=1.0/(1.0+2.0*pow(rzz,2));
                Txf=(1.0-wxf)*(T_old[xa][j]-T_old[xb][j])/2.0/dx+wxf*(3.0*T_old[i][j]-4.0*T_old[xb][j]+T_old[xb1][j])/2.0/dx;
                Txz=(1.0-wxz)*(T_old[xa][j]-T_old[xb][j])/2.0/dx+wxz*(-3.0*T_old[i][j]+4.0*T_old[xa][j]-T_old[xa1][j])/2.0/dx;
                Tzf=(1.0-wzf)*(T_old[i][za]-T_old[i][zb])/2.0/dz+wzf*(3.0*T_old[i][j]-4.0*T_old[i][zb]+T_old[i][zb1])/2.0/dz;
                Tzz=(1.0-wzz)*(T_old[i][za]-T_old[i][zb])/2.0/dz+wzz*(-3.0*T_old[i][j]+4.0*T_old[i][za]-T_old[i][za1])/2.0/dz;
                T_xmin=min(T_old[i][j]-dx*Txf,T_old[i][j]+dx*Txz);
                T_zmin=min(T_old[i][j]-dz*Tzf,T_old[i][j]+dz*Tzz);
                if (fabs(T_xmin-T_zmin)>=s[i][j]*dx) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx;
                else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*dx*s[i][j]*dx-pow(T_xmin-T_zmin,2)))/2;
                T_old[i][j]=min(T[i][j],T_old[i][j]);
                
                //rxf=(epsi+pow(T_old[i][j]-2*T_old[xb][zb]+T_old[xb1][zb1],2))/(epsi+pow(T_old[xa][za]-2*T_old[i][j]+T_old[xb][zb],2));
                //rxz=(epsi+pow(T_old[xa1][za1]-2*T_old[xa][za]+T_old[i][j],2))/(epsi+pow(T_old[xa][za]-2*T_old[i][j]+T_old[xb][zb],2));
                //rzf=(epsi+pow(T_old[i][j]-2*T_old[xa][zb]+T_old[xa1][zb1],2))/(epsi+pow(T_old[xb][za]-2*T_old[i][j]+T_old[xa][zb],2));
                //rzz=(epsi+pow(T_old[xb1][za1]-2*T_old[xb][za]+T_old[i][j],2))/(epsi+pow(T_old[xb][za]-2*T_old[i][j]+T_old[xa][zb],2));
                //wxf=1.0/(1.0+2.0*pow(rxf,2));
                //wxz=1.0/(1.0+2.0*pow(rxz,2));
                //wzf=1.0/(1.0+2.0*pow(rzf,2));
                //wzz=1.0/(1.0+2.0*pow(rzz,2));
                //Txf=(1.0-wxf)*(T_old[xa][za]-T_old[xb][zb])/2.0/sqrt(2)/dx+wxf*(3.0*T_old[i][j]-4.0*T_old[xb][zb]+T_old[xb1][zb1])/2.0/sqrt(2)/dx;
                //Txz=(1.0-wxz)*(T_old[xa][za]-T_old[xb][zb])/2.0/sqrt(2)/dx+wxz*(-3.0*T_old[i][j]+4.0*T_old[xa][za]-T_old[xa1][za1])/2.0/sqrt(2)/dx;
                //Tzf=(1.0-wzf)*(T_old[xb][za]-T_old[xa][zb])/2.0/sqrt(2)/dz+wzf*(3.0*T_old[i][j]-4.0*T_old[xa][zb]+T_old[xa1][zb1])/2.0/sqrt(2)/dz;
                //Tzz=(1.0-wzz)*(T_old[xb][za]-T_old[xa][zb])/2.0/sqrt(2)/dz+wzz*(-3.0*T_old[i][j]+4.0*T_old[xb][za]-T_old[xb1][za1])/2.0/sqrt(2)/dz;
                //T_xmin=min(T_old[i][j]-dx*sqrt(2)*Txf,T_old[i][j]+dx*sqrt(2)*Txz);
                //T_zmin=min(T_old[i][j]-dz*sqrt(2)*Tzf,T_old[i][j]+dz*sqrt(2)*Tzz);
                //if (fabs(T_xmin-T_zmin)>=s[i][j]*dx*sqrt(2)) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx*sqrt(2);
                //else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*dx*sqrt(2)*s[i][j]*dx*sqrt(2)-pow(T_xmin-T_zmin,2)))/2;
                //T_old[i][j]=min(T[i][j],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;
                
                xa1=i+2;xb1=i-2;za1=j+2;zb1=j-2;
                if(xa1==nx) xa1=xa;
                if(xb1==-1) xb1=xb;
                if(za1==nz) za1=za;
                if(zb1==-1) zb1=zb;
                if(xa1==nx+1) xa1=i;
                if(xb1==-2) xb1=i;
                if(za1==nz+1) za1=j;
                if(zb1==-2) zb1=j;
            
                rxf=(epsi+pow(T_old[i][j]-2*T_old[xb][j]+T_old[xb1][j],2))/(epsi+pow(T_old[xa][j]-2*T_old[i][j]+T_old[xb][j],2));
                rxz=(epsi+pow(T_old[xa1][j]-2*T_old[xa][j]+T_old[i][j],2))/(epsi+pow(T_old[xa][j]-2*T_old[i][j]+T_old[xb][j],2));
                rzf=(epsi+pow(T_old[i][j]-2*T_old[i][zb]+T_old[i][zb1],2))/(epsi+pow(T_old[i][za]-2*T_old[i][j]+T_old[i][zb],2));
                rzz=(epsi+pow(T_old[i][za1]-2*T_old[i][za]+T_old[i][j],2))/(epsi+pow(T_old[i][za]-2*T_old[i][j]+T_old[i][zb],2));
                wxf=1.0/(1.0+2.0*pow(rxf,2));
                wxz=1.0/(1.0+2.0*pow(rxz,2));
                wzf=1.0/(1.0+2.0*pow(rzf,2));
                wzz=1.0/(1.0+2.0*pow(rzz,2));
                Txf=(1.0-wxf)*(T_old[xa][j]-T_old[xb][j])/2.0/dx+wxf*(3.0*T_old[i][j]-4.0*T_old[xb][j]+T_old[xb1][j])/2.0/dx;
                Txz=(1.0-wxz)*(T_old[xa][j]-T_old[xb][j])/2.0/dx+wxz*(-3.0*T_old[i][j]+4.0*T_old[xa][j]-T_old[xa1][j])/2.0/dx;
                Tzf=(1.0-wzf)*(T_old[i][za]-T_old[i][zb])/2.0/dz+wzf*(3.0*T_old[i][j]-4.0*T_old[i][zb]+T_old[i][zb1])/2.0/dz;
                Tzz=(1.0-wzz)*(T_old[i][za]-T_old[i][zb])/2.0/dz+wzz*(-3.0*T_old[i][j]+4.0*T_old[i][za]-T_old[i][za1])/2.0/dz;
                T_xmin=min(T_old[i][j]-dx*Txf,T_old[i][j]+dx*Txz);
                T_zmin=min(T_old[i][j]-dz*Tzf,T_old[i][j]+dz*Tzz);
                if (fabs(T_xmin-T_zmin)>=s[i][j]*dx) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx;
                else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*dx*s[i][j]*dx-pow(T_xmin-T_zmin,2)))/2;
                T_old[i][j]=min(T[i][j],T_old[i][j]);
                
                //rxf=(epsi+pow(T_old[i][j]-2*T_old[xb][zb]+T_old[xb1][zb1],2))/(epsi+pow(T_old[xa][za]-2*T_old[i][j]+T_old[xb][zb],2));
                //rxz=(epsi+pow(T_old[xa1][za1]-2*T_old[xa][za]+T_old[i][j],2))/(epsi+pow(T_old[xa][za]-2*T_old[i][j]+T_old[xb][zb],2));
                //rzf=(epsi+pow(T_old[i][j]-2*T_old[xa][zb]+T_old[xa1][zb1],2))/(epsi+pow(T_old[xb][za]-2*T_old[i][j]+T_old[xa][zb],2));
                //rzz=(epsi+pow(T_old[xb1][za1]-2*T_old[xb][za]+T_old[i][j],2))/(epsi+pow(T_old[xb][za]-2*T_old[i][j]+T_old[xa][zb],2));
                //wxf=1.0/(1.0+2.0*pow(rxf,2));
                //wxz=1.0/(1.0+2.0*pow(rxz,2));
                //wzf=1.0/(1.0+2.0*pow(rzf,2));
                //wzz=1.0/(1.0+2.0*pow(rzz,2));
                //Txf=(1.0-wxf)*(T_old[xa][za]-T_old[xb][zb])/2.0/sqrt(2)/dx+wxf*(3.0*T_old[i][j]-4.0*T_old[xb][zb]+T_old[xb1][zb1])/2.0/sqrt(2)/dx;
                //Txz=(1.0-wxz)*(T_old[xa][za]-T_old[xb][zb])/2.0/sqrt(2)/dx+wxz*(-3.0*T_old[i][j]+4.0*T_old[xa][za]-T_old[xa1][za1])/2.0/sqrt(2)/dx;
                //Tzf=(1.0-wzf)*(T_old[xb][za]-T_old[xa][zb])/2.0/sqrt(2)/dz+wzf*(3.0*T_old[i][j]-4.0*T_old[xa][zb]+T_old[xa1][zb1])/2.0/sqrt(2)/dz;
                //Tzz=(1.0-wzz)*(T_old[xb][za]-T_old[xa][zb])/2.0/sqrt(2)/dz+wzz*(-3.0*T_old[i][j]+4.0*T_old[xb][za]-T_old[xb1][za1])/2.0/sqrt(2)/dz;
                //T_xmin=min(T_old[i][j]-dx*sqrt(2)*Txf,T_old[i][j]+dx*sqrt(2)*Txz);
                //T_zmin=min(T_old[i][j]-dz*sqrt(2)*Tzf,T_old[i][j]+dz*sqrt(2)*Tzz);
                //if (fabs(T_xmin-T_zmin)>=s[i][j]*dx*sqrt(2)) T[i][j]=min(T_xmin,T_zmin)+s[i][j]*dx*sqrt(2);
                //else T[i][j]=(T_xmin+T_zmin+sqrt(2*s[i][j]*dx*sqrt(2)*s[i][j]*dx*sqrt(2)-pow(T_xmin-T_zmin,2)))/2;
                //T_old[i][j]=min(T[i][j],T_old[i][j]);
            }
    }//end of 2nd order FSM
    float tt3=clock();
    cout<<"One shot modeling for 2ndFSM is "<<(double)(tt3-tt1)/CLOCKS_PER_SEC<<" s."<<endl;
#endif


    //sprintf(name,"V.dat");
    //sprintf(name,"traveltime_cgv_SGFSM.dat");
    sprintf(name,"traveltime_SGFSM.dats");
    //sprintf(name,"traveltime_stagered_FSM.dat");
    //sprintf(name,"traveltime_FSM.dat");
    //sprintf(name,"traveltime_True.dat");
    //fp=fopen("traveltime.dat","wb+");
    //sprintf(name,"traveltime_Mar_stagered_FSM.dat");
    fp=fopen(name,"wb+");
    for(i=0;i<nx;i++)
        for(j=0;j<nz;j++)
        {
            //T_new[i][j]=dx*sqrt(pow((i-x0),2)+pow((j-z0),2))*s[i][j];
            float z=(1.0+1.0/2.0*s[i][j]/1000.0*1.0*((i-x0)*dx*(i-x0)*dx+(j-z0)*dz*(j-z0)*dz));
            T_new[i][j]=log(z+sqrt(z*z-1));
            //T_old[i][j]=T_old[i][j]-T_new[i][j];
            fwrite(&T_old[i][j],sizeof(float),1,fp);
            //fwrite(&T_new[i][j],sizeof(float),1,fp);
            //fwrite(&v[i][j],sizeof(float),1,fp);
        }
    fclose(fp);

    for(i=0;i<nx;i++)
    {
        delete [] s[i];delete [] T_old[i];delete [] T_new[i];delete [] T[i];delete [] delta[i];delete [] eta[i];delete [] v[i];delete [] vt[i];
    }
    delete [] s;delete [] T_old;delete [] T_new;delete [] T;delete [] delta;delete [] eta;delete [] v;delete [] vt;

}

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;
}

2. 数值算例

2.1 均匀速度模型计算的走时场对比:

1阶:

高阶:

2.2 复杂模型(Marmousi)的算例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值