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