声波有限差分法正演模拟c语言程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include

#define fm 30

#define dt 0.001

#define PI 3.1415926

#define Nt 401

#define Nx 200

#define Nz 200

//---------------加载震源,雷克子波-----------------------------

void fun(float source[])

{

FILE *fp;

int it,i;

float t1,t2,t0;

for(i=0;i

source[i]=0.0;

t0 = 1.0/fm;

printf("t0 = %f\n", t0);

fp=fopen("ricker.txt","w");

for(it=0;it

{

t1=it*dt;

t2=t1-t0;

source[it]=(1.0-2.0*pow(PI*fm*t1,2.0))*exp(-pow(PI*fm*t1,2.0));

fprintf(fp,"%.8f %.8f\n",t1,source[it]);

}

fclose(fp);

}

//--------------------主程序,差分算子----------------------------------------

void main()

{ FILE *fp, *fpwf;

int it,ix,iz, order,N;

int nsx,nsz;

float a0,a1,a2,a3,a4,a5,a6;

int flag;

float dx,dz;

float Un[Nx][Nz], Unm[Nx][Nz], Unp[Nx][Nz], v[Nx][Nz],record[Nx][Nt];//Un表示n时刻,Unm表示n-1时刻,Unp表示n+1时刻波场

float source[Nt];

nsx=Nx/2;

nsz=0.0;//震源位置

N=6;

order=2*N;//精度

if(order == 2)

{

a0=-2.00000;a1=1.00000;a2=0;a3=0;a4=0;a5=0;a6=0;

}

if(order == 4)

{

a0=-2.50000;a1=1.33333;a2=-8.33333e-2;a3=0;a4=0;a5=0;a6=0;

}

if(order == 6)

{

a0=-2.72222;a1=1.50000;a2=-1.50000e-1;a3=1.11111e-2;a4=0;a5=0;a6=0;

}

if(order == 8)

{

a0=-2.84722;a1=1.60000;a2=-2.00000e-1;a3=2.53968e-2;a4=-1.78571e-3;a5=0;a6=0;

}

if(order == 10)

{

a0=-2.92722;a1=1.66667;a2=-2.38095e-1;a3=3.96825e-2;a4=-4.96032e-3;a5=3.17460e-4;a6=0;

}

if(order == 12)

{

a0=-2.98278;a1=1.71429;a2=-2.67857e-1;a3=5.29101e-2;a4=-8.92857e-3;a5=1.03896e-3;a6=-6.01251e-5;

}

/*for (ix=0;ix

{ for (iz=0;iz<(Nz*2/5);iz++)

v[ix][iz]=2000;

for (iz=(Nz*2/5);iz<(Nz*3/5);iz++)

v[ix][iz]=3000;

for (iz=(Nz*3/5);iz

v[ix][iz]=4000;//给速度赋值

}

*/

for (ix=0;ix

{ for (iz=0;iz

v[ix][iz]=4000;

for (iz=Nz/2;iz

v[ix][iz]=4000;

}

dx=10.0;

dz=10.0;//赋值

for(ix=0;ix

{

for(iz=0;iz

{

Un[ix][iz]=0.0;

Unm[ix][iz]=0.0;

Unp[ix][iz]=0.0;

}

}

fun(source);

fpwf = fopen("Wavefieldall.dat", "wb");

for(it=0;it

{

for(ix=6;ix<(Nx-6);ix++)

for(iz=6;iz<(Nz-6);iz++)

{

Unp[ix][iz]=2*Un[ix][iz]-

Unm[ix][iz]+0.5*v[ix][iz]*v[ix][iz]*dt*dt/(dx*dx)*(a0*Un[ix][iz]+a1*(Un[ix+1][iz]+Un[ix-1][iz])+a2*(Un[ix+2][iz]+Un[ix-2][iz])+a3*(Un[ix+3][iz]+Un[ix-3][iz])+a4*(Un[ix+4][iz]+Un[ix-4][iz])+a5*(Un[ix+5][iz]+Un[ix-5][iz])+a6*(Un[ix+6][iz]+Un[ix-6][iz]))

+0.5*v[ix][iz]*v[ix][iz]*dt*dt/(dz*dz)*(a0*Un[ix][iz]+a1*(Un[ix][iz+1]+Un[ix][iz-

1])+a2*(Un[ix][iz+2]+Un[ix][iz-2])+a3*(Un[ix][iz+3]+Un[ix][iz-3])+a4*(Un[ix][iz+4]+Un[ix][iz-4])+a5*(Un[ix][iz+5]+Un[ix][iz-5])+a6*(Un[ix][iz+6]+Un[ix][iz-6]));

}

Unp[nsx][nsz]+=source[it];

for(ix=0;ix

相关文档
最新文档