 |
 |
 |
 | Madagascar Programming Reference Manual |  |
 |
![[pdf]](data:image/png;base64,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) |
 |
Next: Explanation of the code
Up: An example: Finite-Difference modeling
Previous: Introduction
1 /* time-domain acoustic FD modeling */
2 #include <rsf.h>
3
4 int main(int argc, char* argv[])
5 {
6 /* Laplacian coefficients */
7 float c0=-30./12.,c1=+16./12.,c2=- 1./12.;
8
9 bool verb; /* verbose flag */
10 sf_file Fw=NULL,Fv=NULL,Fr=NULL,Fo=NULL; /* I/O files */
11 sf_axis at,az,ax; /* cube axes */
12 int it,iz,ix; /* index variables */
13 int nt,nz,nx;
14 float dt,dz,dx,idx,idz,dt2;
15
16 float *ww,**vv,**rr; /* I/O arrays*/
17 float **um,**uo,**up,**ud;/* tmp arrays */
18
19 sf_init(argc,argv);
20 if(! sf_getbool("verb",&verb)) verb=0;
21
22 /* setup I/O files */
23 Fw = sf_input ("in" );
24 Fo = sf_output("out");
25 Fv = sf_input ("vel");
26 Fr = sf_input ("ref");
27
28 /* Read/Write axes */
29 at = sf_iaxa(Fw,1); nt = sf_n(at); dt = sf_d(at);
30 az = sf_iaxa(Fv,1); nz = sf_n(az); dz = sf_d(az);
31 ax = sf_iaxa(Fv,2); nx = sf_n(ax); dx = sf_d(ax);
32
33 sf_oaxa(Fo,az,1);
34 sf_oaxa(Fo,ax,2);
35 sf_oaxa(Fo,at,3);
36
37 dt2 = dt*dt;
38 idz = 1/(dz*dz);
39 idx = 1/(dx*dx);
40
41 /* read wavelet, velocity & reflectivity */
42 ww = sf_floatalloc(nt); sf_floatread(ww ,nt ,Fw);
43 vv = sf_floatalloc2(nz,nx); sf_floatread(vv[0],nz*nx,Fv);
44 rr = sf_floatalloc2(nz,nx); sf_floatread(rr[0],nz*nx,Fr);
45
46 /* allocate temporary arrays */
47 um = sf_floatalloc2(nz,nx);
48 uo = sf_floatalloc2(nz,nx);
49 up = sf_floatalloc2(nz,nx);
50 ud = sf_floatalloc2(nz,nx);
51
52 for (iz=0; iz<nz; iz++) {
53 for (ix=0; ix<nx; ix++) {
54 um[ix][iz]=0;
55 uo[ix][iz]=0;
56 up[ix][iz]=0;
57 ud[ix][iz]=0;
58 }
59 }
60
61 /* MAIN LOOP */
62 if(verb) fprintf(stderr,"\n");
63 for (it=0; it<nt; it++) {
64 if(verb) fprintf(stderr,"\b\b\b\b\b%d",it);
65
66 /* 4th order laplacian */
67 for (iz=2; iz<nz-2; iz++) {
68 for (ix=2; ix<nx-2; ix++) {
69 ud[ix][iz] =
70 c0* uo[ix ][iz ] * (idx+idz) +
71 c1*(uo[ix-1][iz ] + uo[ix+1][iz ])*idx +
72 c2*(uo[ix-2][iz ] + uo[ix+2][iz ])*idx +
73 c1*(uo[ix ][iz-1] + uo[ix ][iz+1])*idz +
74 c2*(uo[ix ][iz-2] + uo[ix ][iz+2])*idz;
75 }
76 }
77
78 /* inject wavelet */
79 for (iz=0; iz<nz; iz++) {
80 for (ix=0; ix<nx; ix++) {
81 ud[ix][iz] -= ww[it] * rr[ix][iz];
82 }
83 }
84
85 /* scale by velocity */
86 for (iz=0; iz<nz; iz++) {
87 for (ix=0; ix<nx; ix++) {
88 ud[ix][iz] *= vv[ix][iz]*vv[ix][iz];
89 }
90 }
91
92 /* time step */
93 for (iz=0; iz<nz; iz++) {
94 for (ix=0; ix<nx; ix++) {
95 up[ix][iz] = 2*uo[ix][iz]
96 - um[ix][iz]
97 + ud[ix][iz] * dt2;
98
99 um[ix][iz] = uo[ix][iz];
100 uo[ix][iz] = up[ix][iz];
101 }
102 }
103
104 /* write wavefield to output */
105 sf_floatwrite(uo[0],nz*nx,Fo);
106 }
107 if(verb) fprintf(stderr,"\n");
108 sf_close()
109 exit(0);
110 }
2011-07-02