C++编译时不报错 但是运行时显示停止工作 怎么检查错误在哪
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <conio.h>
#define PI 3.1415926535
float **space2d(int nr,int nc);
float ***space3d(int nr, int ny, int nc);
void free_space2d(float **a, int nr);
void free_space3d(float ***b,int nr,int ny);
void wfile(char filename[], float **data, int nr, int nc);
void wfile3d(char filename[],float ***data,int nr,int ny,int nc);
void create_model(float ***vp, float ***vs, float ***rho,float ***vf,float ***rhof, float ***lamda, float ***lamda2u, float ***mu,float***por,int nr,int ny, int nc);
float ***extmodel(float ***init_model,int nr,int ny,int nc,int np);
int main()
{
//给定参数
int NX=400; //x方向网格点数%%%%%
int NY=600; //y方向网格点数%%%%%
int NZ=800; //z方向网格点数%%%%
int NP=20; //pml层网格点数
int sx=NX/2+NP; //震源坐标点号
int sy=NY/2+NP;
int sz=NZ/2+NP;
int NX_ext=NX+2*NP; //
int NY_ext=NY+2*NP;
int NZ_ext=NZ+2*NP;
int NT=7000; //时间层数%%%%
// double H=1.0; //空间步长5%%%%
double H=0.005;
double RC=0.0001;
double DP=NP*H;
// double DT=0.0002; //时间步长
double DT=0.5*pow(10,-6); //时间步长%%%%
// double F0=30.0; //震源主频
double F0=3.0*pow(10,3); //震源主频,主频太高会造成频散
double T0=1.2/F0;
double Vpmax=4270.0; //模型最大纵波速度,用于稳定性计算
double Vpmin=1500.0; //模型最小纵波速度,用于控制数值频散
double Vsmax=2650.0;
double Vsmin=1500.0;
float ***vs; //初始模型横波速度
float ***vp; //初始模型纵波速度
float ***rho; //初始模型密度
float ***vf; //孔隙流体速度
float ***rhof; //孔隙流体密度
float ***mu; //剪切模量
float ***lamda; //拉梅系数
float ***lamda2u;
//float **Q;
//float **R;
float ***por;
// float **D11,**D12,**D22;
// float **b;
float **sis_x; //地震记录x分量 波形记录-二维数据
float **sis_y; //地震记录y分量
float **sis_z; //地震记录z分量
float ***vx_x;//速度分量
float ***vx_y;
float ***vx_z;
float ***vx;
float ***vy_x;
float ***vy_y;
float ***vy_z;
float ***vy;
float ***vz_x;
float ***vz_y;
float ***vz_z;
float ***vz;
/*float **Vx_x;//流相速度
float **Vx_z;
float **Vx;
float **Vz_x;
float **Vz_z;
float **Vz;
*/
float ***txx_x;//应力分量
float ***txx_y;
float ***txx_z;
float ***tyy_x;//应力分量
float ***tyy_y;
float ***tyy_z;
float ***tzz_x;
float ***tzz_y;
float ***tzz_z;
float ***txy_x;
float ***txy_y;
float ***txz_x;
float ***txz_z;
float ***tyz_y;
float ***tyz_z;
/*float **ssx;//流体应力
float **ssz;
float **dxi,**dxi2;
float **dzj,**dzj2;
*/
// double Kb,Ks,Kf,a,D;
double tt,x,y,z,xoleft,xoright,yoleft,yoright,zoleft,zoright,d0;
double v0,y5,y6,y7,y8,y9,y10,y11,y12,y13,rho_tempx,rho_tempy,rho_tempz,muxz,muxy,muyz,lamda2u_temp,lamda_temp;
// double D11_tempx,D12_tempx,D22_tempx,R_temp,D11_tempz,D12_tempz,D22_tempz;
double xx1,xy1,xz1,yx2,yy2,yz2,zx3,zy3,zz3,best_dt;
int ix,iy,iz,it;
vs=space3d(NZ,NY,NX);
vp=space3d(NZ,NY,NX);
rho=space3d(NZ,NY,NX);
vf=space3d(NZ,NY,NX);
rhof=space3d(NZ,NY,NX);
//Q=space2d(NZ,NX);
//R=space2d(NZ,NX);
por=space3d(NZ,NY,NX);
//D11=space2d(NZ,NX);D12=space2d(NZ,NX);D22=space2d(NZ,NX);
// b=space2d(NZ,NX);
mu=space3d(NZ,NY,NX);
lamda=space3d(NZ,NY,NX);
lamda2u=space3d(NZ,NY,NX);
create_model(vp, vs, rho, vf, rhof, lamda, lamda2u, mu,por, NZ,NY, NX);
char vs_name[]="vs_ext.dat";
float ***vs_ext;
float ***vp_ext;
float ***rho_ext;
float ***mu_ext;
float ***lamda_ext;
float ***lamda2u_ext;
// float ***Q_ext;
// float ***R_ext;
float ***vf_ext;
float ***rhof_ext;
float ***por_ext;
float ***dxi;
float ***dxi2;
float ***dyj;
float ***dyj2;
float ***dzk;
float ***dzk2;
//float ***b_ext;
// float **D11_ext,**D12_ext,**D22_ext;
//数据扩充,加上吸收边界
vs_ext=extmodel(vs,NZ,NY,NX,NP);
vp_ext=extmodel(vp,NZ,NY,NX,NP);
rho_ext=extmodel(rho,NZ,NY,NX,NP);
mu_ext=extmodel(mu,NZ,NY,NX,NP);
lamda_ext=extmodel(lamda,NZ,NY,NX,NP);
lamda2u_ext=extmodel(lamda2u,NZ,NY,NX,NP);
vf_ext=extmodel(vf,NZ,NY,NX,NP);
rhof_ext=extmodel(rhof,NZ,NY,NX,NP);
//Q_ext=extmodel(Q,NZ,NX,NP);
//R_ext=extmodel(R,NZ,NX,NP);
por_ext=extmodel(por,NZ,NY,NX,NP);
// b_ext=extmodel(b,NZ,NX,NP);
// D11_ext=extmodel(D11,NZ,NX,NP);D12_ext=extmodel(D12,NZ,NX,NP);
// D22_ext=extmodel(D22,NZ,NX,NP);
wfile3d(vs_name, vs_ext, NZ_ext, NY_ext, NX_ext); //建立文件
//申请空间
vx_x=space3d(NZ_ext,NY_ext,NX_ext);
vx_y=space3d(NZ_ext,NY_ext,NX_ext);
vx_z=space3d(NZ_ext,NY_ext,NX_ext);
vx=space3d(NZ_ext,NY_ext,NX_ext);
vy_x=space3d(NZ_ext,NY_ext,NX_ext);
vy_y=space3d(NZ_ext,NY_ext,NX_ext);
vy_z=space3d(NZ_ext,NY_ext,NX_ext);
vy=space3d(NZ_ext,NY_ext,NX_ext);
vz_x=space3d(NZ_ext,NY_ext,NX_ext);
vz_y=space3d(NZ_ext,NY_ext,NX_ext);
vz_z=space3d(NZ_ext,NY_ext,NX_ext);
vz=space3d(NZ_ext,NY_ext,NX_ext);
/*Vx_x=space2d(NZ_ext,NX_ext);
Vx_z=space2d(NZ_ext,NX_ext);
Vx=space2d(NZ_ext,NX_ext);
Vz_x=space2d(NZ_ext,NX_ext);
Vz_z=space2d(NZ_ext,NX_ext);
Vz=space2d(NZ_ext,NX_ext);*/
txx_x=space3d(NZ_ext,NY_ext,NX_ext);
txx_y=space3d(NZ_ext,NY_ext,NX_ext);
txx_z=space3d(NZ_ext,NY_ext,NX_ext);
tyy_x=space3d(NZ_ext,NY_ext,NX_ext);
tyy_y=space3d(NZ_ext,NY_ext,NX_ext);
tyy_z=space3d(NZ_ext,NY_ext,NX_ext);
tzz_x=space3d(NZ_ext,NY_ext,NX_ext);
tzz_y=space3d(NZ_ext,NY_ext,NX_ext);
tzz_z=space3d(NZ_ext,NY_ext,NX_ext);
txy_x=space3d(NZ_ext,NY_ext,NX_ext);
txy_y=space3d(NZ_ext,NY_ext,NX_ext);
txz_x=space3d(NZ_ext,NY_ext,NX_ext);
txz_z=space3d(NZ_ext,NY_ext,NX_ext);
tyz_y=space3d(NZ_ext,NY_ext,NX_ext);
tyz_z=space3d(NZ_ext,NY_ext,NX_ext);
/* tzz_x=space2d(NZ_ext,NX_ext);
tzz_z=space2d(NZ_ext,NX_ext);
txz_x=space2d(NZ_ext,NX_ext);
txz_z=space2d(NZ_ext,NX_ext);
ssx=space2d(NZ_ext,NX_ext);
ssz=space2d(NZ_ext,NX_ext);*/
dxi=space3d(NZ_ext,NY_ext,NX_ext);
dxi2=space3d(NZ_ext,NY_ext,NX_ext);
dyj=space3d(NZ_ext,NY_ext,NX_ext);
dyj2=space3d(NZ_ext,NY_ext,NX_ext);
dzk=space3d(NZ_ext,NY_ext,NX_ext);
dzk2=space3d(NZ_ext,NY_ext,NX_ext);
//(xoleft,xoright)模型的物理边界—不算PML
xoleft=DP;
xoright=(NX_ext-1)*H-DP;
yoleft=DP;
yoright=(NY_ext-1)*H-DP;
zoleft=DP;
zoright=(NZ_ext-1)*H-DP;
//用于对vx_x[iz][ix]等的求解,加入吸收边界,使数值衰减
for(iz=0; iz<NZ_ext; iz++)
{
for(iy=0;iy<NY_ext;iy++)
{
for (ix=0; ix<NX_ext; ix++)
{
x=ix*H;
if (x < xoleft)
{
v0=vp_ext[iz][iy][0];
d0=3.0*v0*log(1.0/RC)/(2.0*DP);
dxi[iz][iy][ix]=d0*pow(((xoleft-x)/DP),2);
dxi2[iz][iy][ix]=d0*pow(((xoleft-x-0.5*H)/DP),2);
}
else if (x >=0.9999*xoright )
{
v0=vp_ext[iz][iy][NX_ext-1];
d0=3.0*v0*log(1.0/RC)/(2.0*DP);
dxi[iz][iy][ix]=d0*pow(((x-xoright)/DP),2);
dxi2[iz][iy][ix]=d0*pow(((x+0.5*H-xoright)/DP),2);
}
else
{
dxi[iz][iy][ix]=0.; dxi2[iz][iy][ix]=0.;
}
}
}
}
for (iz=0; iz<NZ_ext; iz++)
{
for(iy=0;iy<NY_ext;iy++)
{
y=iy*H;
for(ix=0; ix<NX_ext; ix++)
{
if (y < yoleft)
{
v0=vp_ext[iz][0][ix];
d0=3.0*v0*log(1.0/RC)/(2.0*DP);
//d0=3.0*v0*(8.0/15.0-3.0/100.0*NP+NP*NP/1500.0)/H;
dyj[iz][iy][ix]=d0*pow(((yoleft-y)/DP),2);
dyj2[iz][iy][ix]=d0*pow(((yoleft-y-0.5*H)/DP),2);
}
else if (y >=0.9999*yoright )
{
v0=vp_ext[iz][NY_ext-1][ix];
d0=3.0*v0*log(1.0/RC)/(2.0*DP);
dyj[iz][iy][ix]=d0*pow(((y-yoright)/DP),2);
dyj2[iz][iy][ix]=d0*pow(((y+0.5*H-yoright)/DP),2);
}
else
{
dyj[iz][iy][ix]=0.; dyj2[iz][iy][ix]=0.;
}
}
}
}
for (iz=0; iz<NZ_ext; iz++)
{
z=iz*H;
for(iy=0;iy<NY_ext;iy++)
{
for(ix=0; ix<NX_ext; ix++)
{
if (z < zoleft)
{
v0=vp_ext[0][iy][ix];
d0=3.0*v0*log(1.0/RC)/(2.0*DP);
//d0=3.0*v0*(8.0/15.0-3.0/100.0*NP+NP*NP/1500.0)/H;
dzk[iz][iy][ix]=d0*pow(((zoleft-z)/DP),2);
dzk2[iz][iy][ix]=d0*pow(((zoleft-z-0.5*H)/DP),2);
}
else if (z >=0.9999*zoright )
{
v0=vp_ext[NZ_ext-1][iy][ix];
d0=3.0*v0*log(1.0/RC)/(2.0*DP);
dzk[iz][iy][ix]=d0*pow(((z-zoright)/DP),2);
dzk2[iz][iy][ix]=d0*pow(((z+0.5*H-zoright)/DP),2);
}
else
{
dzk[iz][iy][ix]=0.; dzk2[iz][iy][ix]=0.;
}
}
}
}
//开始时间递推
double a1=9.0/8.0;
double a2= -1.0/24.0;
//这里的代码应该修正一下,应该从数据里面提取最大最小速度
//控制网格频散
if (Vsmin / (F0*H) < 15)
printf("空间步长太大,可能引起明显的网格频散\n");
//检查稳定性条件
best_dt=6.0*H/(7.0*sqrt(2.0)*Vpmax);
if (DT >= best_dt)
printf("时间步长过大,应该小于 %f\n",best_dt);
clock_t start,finish;
start=clock();
sis_x=space2d(NZ,NT);
sis_y=space2d(NZ,NT);
sis_z=space2d(NZ,NT);
for (it=0; it<NT; it++)
{
tt=it*DT;
if(it % 100 == 0) printf("it=%d\n",it);
//计算质点速度v
for (iz=2; iz<NZ_ext-2; iz++)
for(iy=2; iy<NY_ext-2; iy++)
for (ix=2; ix<NX_ext-2; ix++)
{
rho_tempx=2/(rho_ext[iz][iy][ix]+rho_ext[iz][iy][ix+1]);
rho_tempy=2/(rho_ext[iz][iy][ix]+rho_ext[iz][iy+1][ix]);
rho_tempz=2/(rho_ext[iz][iy][ix]+rho_ext[iz+1][iy][ix]);
xx1=(a1*(txx_x[iz][iy][ix+1]-txx_x[iz][iy][ix]+txx_y[iz][iy][ix+1]-txx_y[iz][iy][ix]+txx_z[iz][iy][ix+1]-txx_z[iz][iy][ix])+
a2*(txx_x[iz][iy][ix+2]-txx_x[iz][iy][ix-1]+txx_y[iz][iy][ix+2]-txx_y[iz][iy][ix-1]+txx_z[iz][iy][ix+2]-txx_z[iz][iy][ix-1]));
xy1=(a1*(txy_x[iz][iy][ix]-txy_x[iz][iy-1][ix]+txy_y[iz][iy][ix]-txy_y[iz][iy-1][ix])+
a2*(txy_x[iz][iy+1][ix]-txy_x[iz][iy-2][ix]+txy_y[iz][iy+1][ix]-txy_y[iz][iy-2][ix]));
xz1=(a1*(txz_x[iz][iy][ix]-txz_x[iz-1][iy][ix]+txz_z[iz][iy][ix]-txz_z[iz-1][iy][ix])+
a2*(txz_x[iz+1][iy][ix]-txz_x[iz-2][iy][ix]+txz_z[iz+1][iy][ix]-txz_z[iz-2][iy][ix]));
yx2=(a1*(txy_x[iz][iy][ix]-txy_x[iz][iy][ix-1]+txy_y[iz][iy][ix]-txy_y[iz][iy][ix-1])+
a2*(txy_x[iz][iy][ix+1]-txy_x[iz][iy][ix-2]+txy_y[iz][iy][ix+1]-txy_y[iz][iy][ix-2]));
yy2=(a1*(tyy_x[iz][iy+1][ix]-tyy_x[iz][iy][ix]+tyy_y[iz][iy+1][ix]-tyy_y[iz][iy][ix]+tyy_z[iz][iy+1][ix]-tyy_z[iz][iy][ix])+
a2*(tyy_x[iz][iy+2][ix]-tyy_x[iz][iy-1][ix]+tyy_y[iz][iy+2][ix]-tyy_y[iz][iy-1][ix]+tyy_z[iz][iy+2][ix]-tyy_z[iz][iy-1][ix]));
yz2=(a1*(tyz_y[iz][iy][ix]-tyz_y[iz-1][iy][ix]+tyz_z[iz][iy][ix]-tyz_z[iz-1][iy][ix])+
a2*(tyz_y[iz+1][iy][ix]-tyz_y[iz-2][iy][ix]+tyz_z[iz+1][iy][ix]-tyz_z[iz-2][iy][ix]));
zx3=(a1*(txz_x[iz][iy][ix]-txz_x[iz][iy][ix-1]+txz_z[iz][iy][ix]-txz_z[iz][iy][ix-1])+
a2*(txz_x[iz][iy][ix+1]-txz_x[iz][iy][ix-2]+txz_z[iz][iy][ix+1]-txz_z[iz][iy][ix-2]));
zy3=(a1*(tyz_y[iz][iy][ix]-tyz_y[iz][iy-1][ix]+tyz_z[iz][iy][ix]-tyz_z[iz][iy-1][ix])+
a2*(tyz_y[iz][iy+1][ix]-tyz_y[iz][iy-2][ix]+tyz_z[iz][iy+1][ix]-tyz_z[iz][iy-2][ix]));
zz3=(a1*(tzz_x[iz+1][iy][ix]-tzz_x[iz][iy][ix]+tzz_y[iz+1][iy][ix]-tzz_y[iz][iy][ix]+tzz_z[iz+1][iy][ix]-tzz_z[iz][iy][ix])+
a2*(tzz_x[iz+2][iy][ix]-tzz_x[iz-1