From 98a6761d43ded555c2659dbec0badd4447acbc95 Mon Sep 17 00:00:00 2001 From: Jan Thorbecke <janth@xs4all.nl> Date: Thu, 2 Nov 2017 17:04:44 +0100 Subject: [PATCH] added OpenMP + more cleaning --- README | 6 ++- raytime/Makefile | 4 +- raytime/getParameters.c | 15 +----- raytime/raytime.c | 24 +++------ raytime/raytime.h | 103 --------------------------------------- raytime/readModel.c | 2 +- raytime/writeSrcRecPos.c | 7 +-- 7 files changed, 17 insertions(+), 144 deletions(-) diff --git a/README b/README index 904c6d4..cbeda68 100644 --- a/README +++ b/README @@ -19,11 +19,13 @@ REFERENCES Finite-difference modeling experiments for seismic interferometry Jan Thorbecke and Deyan Draganov -2011, Geophysics, Vol. 76, no 6 (November-December); p H1--H18, doi: 10.1190/GEO2010-0039.1 +2011, Geophysics, Vol. 76, no. 6 (November-December); p H1--H18, doi: 10.1190/GEO2010-0039.1 -2- If the Machenko code has helped you in your research please refer to our paper in your publications: -Hopefully, a published reference to the paper can be put here. +Implementation of the Marchenko method +Jan Thorbecke, Evert Slob, Joeri Brackenhoff, Joost van der Neut, and Kees Wapenaar +2017, Geophysics, Vol. 82, no. 6 (November-December); p. WB29--WB45, doi: 10.1190/GEO2017-0108.1 These papers can be downloaded from: diff --git a/raytime/Makefile b/raytime/Makefile index 0d70c1b..fdf35dd 100644 --- a/raytime/Makefile +++ b/raytime/Makefile @@ -7,8 +7,8 @@ include ../Make_include ALLINC = -I. LIBS += -L$L -lgenfft -lm $(LIBSM) #LIBS += -L$L -lgenfft -lm -lc -OPTC = -g -Wall -fsignaling-nans -O0 -#OPTC += -fopenmp -Waddress +#OPTC = -g -Wall -fsignaling-nans -O0 +OPTC += -fopenmp -Waddress #OPTC := $(subst -O3 -ffast-math, -O1 -g ,$(OPTC)) #PGI options for compiler feedback #OPTC += -Mprof=lines diff --git a/raytime/getParameters.c b/raytime/getParameters.c index 1651e1a..4970036 100644 --- a/raytime/getParameters.c +++ b/raytime/getParameters.c @@ -20,17 +20,11 @@ * The Netherlands **/ -float gaussGen(); - -int optncr(int n); - int getModelInfo(char *file_name, int *n1, int *n2, float *d1, float *d2, float *f1, float *f2, float *min, float *max, int *axis, int zeroch, int verbose); int recvPar(recPar *rec, float sub_x0, float sub_z0, float dx, float dz, int nx, int nz); -int writesufile(char *filename, float *data, int n1, int n2, float f1, float f2, float d1, float d2); - -int getParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar *src, shotPar *shot, bndPar *bnd, rayPar *ray, int verbose) +int getParameters(modPar *mod, recPar *rec, srcPar *src, shotPar *shot, rayPar *ray, int verbose) { int nx, nz, nsrc, ix, axis, is0; int idzshot, idxshot; @@ -42,7 +36,7 @@ int getParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar *sr float dxrcv,dzrcv,dxspread,dzspread; float xmax, zmax; float xsrc1, xsrc2, zsrc1, zsrc2; - float *xsrca, *zsrca, rrcv; + float *xsrca, *zsrca; float rsrc, oxsrc, ozsrc, dphisrc, ncsrc; size_t nsamp; int nxsrc, nzsrc; @@ -277,11 +271,6 @@ int getParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar *sr recvPar(rec, sub_x0, sub_z0, dx, dz, nx, nz); - /* receivers are on a circle, use default interpolation to real (not on a grid-point) receiver position */ - if (getparfloat("rrcv", &rrcv)) { - if (!getparint("rec_int_p",&rec->int_p)) rec->int_p=3; - } - if (verbose) { if (rec->n) { dxrcv = rec->xr[MIN(1,rec->n-1)]-rec->xr[0]; diff --git a/raytime/raytime.c b/raytime/raytime.c index 0626201..d38eaf4 100644 --- a/raytime/raytime.c +++ b/raytime/raytime.c @@ -29,11 +29,11 @@ void name_ext(char *filename, char *extension); void threadAffinity(void); -int getParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar *src, shotPar *shot, bndPar *bnd, rayPar *ray, int verbose); +int getParameters(modPar *mod, recPar *rec, srcPar *src, shotPar *shot, rayPar *ray, int verbose); int getWaveParameter(float *slowness, icoord size, float dgrid, fcoord s, fcoord r, rayPar ray, fcoord *T, float *Jr); -int readModel(modPar mod, bndPar bnd, float *velocity, float *slowness); +int readModel(modPar mod, float *velocity, float *slowness); int defineSource(wavPar wav, srcPar src, modPar mod, float **src_nwav, int reverse, int verbose); @@ -72,15 +72,11 @@ char *sdoc[] = { " xsrca= ............ defines source array x-positions", " zsrca= ............ defines source array z-positions", " wav_random=1 ...... 1 generates (band limited by fmax) noise signatures ", -" src_multiwav=0 .... use traces in file_src as areal source", " src_at_rcv=1 ...... inject wavefield at receiver coordinates (1), inject at source (0)", "" , " PLANE WAVE SOURCE DEFINITION:", " plane_wave=0 ...... model plane wave with nsrc= sources", " nsrc=1 ............ number of sources per (plane-wave) shot ", -" src_angle=0 ....... angle of plane source array", -" src_velo=1500 ..... velocity to use in src_angle definition", -" src_window=0 ...... length of taper at edges of source array", "", " RANDOM SOURCE DEFINITION FOR SEISMIC INTERFEROMTERY:", " src_random=0 ...... 1 enables nsrc random sources positions in one modeling", @@ -89,11 +85,6 @@ char *sdoc[] = { " xsrc2=0 ........... right bound for x-position of sources", " zsrc1=0 ........... left bound for z-position of sources", " zsrc2=0 ........... right bound for z-position of sources", -" tsrc1=0.0 ......... begin time interval for random sources being triggered", -" tsrc2=tmod ........ end time interval for random sources being triggered", -" tactive=tsrc2 ..... end time for random sources being active", -" tlength=tsrc2-tsrc1 average duration of random source signal", -" length_random=1 ... duration of source is rand*tlength", " amplitude=0 ....... distribution of source amplitudes", " distribution=0 .... random function for amplitude and tlength 0=flat 1=Gaussian ", " seed=10 ........... seed for start of random sequence ", @@ -126,10 +117,7 @@ int main(int argc, char **argv) { modPar mod; recPar rec; - snaPar sna; - wavPar wav; srcPar src; - bndPar bnd; shotPar shot; rayPar ray; float *velocity, *slowness; @@ -151,7 +139,7 @@ int main(int argc, char **argv) requestdoc(0); if (!getparint("verbose",&verbose)) verbose=0; - getParameters(&mod, &rec, &sna, &wav, &src, &shot, &bnd, &ray, verbose); + getParameters(&mod, &rec, &src, &shot, &ray, verbose); /* allocate arrays for model parameters: the different schemes use different arrays */ @@ -162,7 +150,7 @@ int main(int argc, char **argv) /* read velocity and density files */ - readModel(mod, bnd, velocity, slowness); + readModel(mod, velocity, slowness); /* read and/or define source wavelet(s) */ @@ -186,7 +174,6 @@ int main(int argc, char **argv) /* Sinking source and receiver arrays: If P-velocity==0 the source and receiver postions are placed deeper until the P-velocity changes. - The free-surface position is stored in bnd.surface[ix]. Setting the option rec.sinkvel only sinks the receiver position (not the source) and uses the velocity of the first receiver to sink through to the next layer. */ @@ -256,6 +243,9 @@ int main(int argc, char **argv) grid.z = mod.nz; grid.y = 1; +#pragma omp parallel for default(shared) \ +private (coordgx) \ +private (irec,Time,Jr) for (irec=0; irec<rec.n; irec++) { coordgx.x=mod.x0+rec.xr[irec]; coordgx.z=mod.z0+rec.zr[irec]; diff --git a/raytime/raytime.h b/raytime/raytime.h index 4645539..045e99e 100644 --- a/raytime/raytime.h +++ b/raytime/raytime.h @@ -2,33 +2,15 @@ #include<stdio.h> #include<math.h> -typedef struct _compType { /* Receiver Type */ - int vz; - int vx; - int p; - int txx; - int tzz; - int txz; - int pp; - int ss; - int ud; -} compType; - typedef struct _receiverPar { /* Receiver Parameters */ char *file_rcv; - compType type; int n; int nt; - int delay; - int skipdt; int max_nrec; int *z; int *x; float *zr; float *xr; - int int_p; - int int_vx; - int int_vz; int scale; int sinkdepth; int sinkvel; @@ -36,79 +18,19 @@ typedef struct _receiverPar { /* Receiver Parameters */ float rho; } recPar; -typedef struct _snapshotPar { /* Snapshot Parameters */ - char *file_snap; - char *file_beam; - compType type; - int nsnap; - int delay; - int skipdt; - int skipdz; - int skipdx; - int nz; - int nx; - int z1; - int z2; - int x1; - int x2; - int vxvztime; - int beam; - int withbnd; -} snaPar; - typedef struct _modelPar { /* Model Parameters */ - int iorder; - int ischeme; - int grid_dir; int sh; char *file_cp; - char *file_ro; - char *file_cs; - char *file_qp; - char *file_qs; float dz; float dx; float dt; - float tmod; - int nt; float z0; float x0; /* medium max/min values */ float cp_min; float cp_max; - float cs_min; - float cs_max; - float ro_min; - float ro_max; int nz; int nx; - int naz; - int nax; - /* Vx: rox */ - int ioXx; - int ioXz; - int ieXx; - int ieXz; - /* Vz: roz */ - int ioZx; - int ioZz; - int ieZx; - int ieZz; - /* P, Txx, Tzz: lam, l2m */ - int ioPx; - int ioPz; - int iePx; - int iePz; - /* Txz: muu */ - int ioTx; - int ioTz; - int ieTx; - int ieTz; - /* attenuation / dissipative medium */ - float Qp; - float Qs; - float fw; - float qr; } modPar; typedef struct _waveletPar { /* Wavelet Parameters */ @@ -137,8 +59,6 @@ typedef struct _sourcePar { /* Source Array Parameters */ int circle; int array; int random; - float *tbeg; - float *tend; int multiwav; float angle; float velo; @@ -158,29 +78,6 @@ typedef struct _shotPar { /* Shot Parameters */ int *x; } shotPar; -typedef struct _boundPar { /* Boundary Parameters */ - int top; - int bot; - int lef; - int rig; - float *tapz; - float *tapx; - float *tapxz; - int cfree; - int ntap; - int *surface; - int npml; - float R; /* reflection at side of model */ - float m; /* scaling order */ - float *pml_Vx; - float *pml_nzVx; - float *pml_nxVz; - float *pml_nzVz; - float *pml_nxP; - float *pml_nzP; - -} bndPar; - typedef struct _raypar { /* ray-tracing parameters */ int smoothwindow; int useT2; diff --git a/raytime/readModel.c b/raytime/readModel.c index e54c6d1..bed640a 100644 --- a/raytime/readModel.c +++ b/raytime/readModel.c @@ -26,7 +26,7 @@ **/ -int readModel(modPar mod, bndPar bnd, float *velocity, float *slowness) +int readModel(modPar mod, float *velocity, float *slowness) { FILE *fpcp; size_t nread; diff --git a/raytime/writeSrcRecPos.c b/raytime/writeSrcRecPos.c index 1fb1530..faf2978 100644 --- a/raytime/writeSrcRecPos.c +++ b/raytime/writeSrcRecPos.c @@ -126,12 +126,7 @@ int writeSrcRecPos(modPar *mod, recPar *rec, srcPar *src, shotPar *shot) dum[rec->x[is]*nz+MIN(nz-1,rec->z[is]+1)] = -1.0; // vmess("receiver position %d at grid[ix=%d, iz=%d] = (x=%f z=%f)", ir, ix+ioPx, rec.z[ir]+ioPz, rec.xr[ir]+mod.x0, rec.zr[ir]+mod.z0); - if (rec->int_vx==3) { - fprintf(fp, "(%f, %f)\n", rec->xr[is]*dx+sub_x0, rec->zr[is]*dz+sub_z0); - } - else { - fprintf(fp, "(%f, %f)\n", rec->x[is]*dx+sub_x0, rec->z[is]*dz+sub_z0); - } + fprintf(fp, "(%f, %f)\n", rec->x[is]*dx+sub_x0, rec->z[is]*dz+sub_z0); } fclose(fp); writesufile("SrcRecPositions.su", dum, nz, nx, sub_z0, sub_x0, dz, dx); -- GitLab