diff --git a/fdemmodc/demo/em.scr b/fdemmodc/demo/em.scr index 3565306571d3fd078c01705320dd17ac9cfb63f9..441956ffa2e97a4faf858e7294d42ed2722d7e41 100755 --- a/fdemmodc/demo/em.scr +++ b/fdemmodc/demo/em.scr @@ -40,12 +40,12 @@ makewave fp=250e+6 dt=$dt file_out=wave.su nt=4096 t0=6e-9 verbose=1 file_ks=syncl_ro.su \ file_src=wave.su \ file_rcv=shot_zsrc1150.su \ - src_type=1 \ + src_type=7 \ src_orient=1 \ src_injectionrate=1 \ dtrcv=1e-10 \ rec_delay=6e-9 \ - verbose=3 \ + verbose=6 \ tmod=2e-7 \ dt=$dt \ dxrcv=0.02 \ diff --git a/fdemmodc/em4.c b/fdemmodc/em4.c index 760399c1ea12f990e7959a404c40c8065efafaf5..98673278a357ea891e0035e204c0008cc711ee57 100644 --- a/fdemmodc/em4.c +++ b/fdemmodc/em4.c @@ -5,16 +5,15 @@ #include<assert.h> #include"fdelmodc.h" -int applySource(modPar mod, srcPar src, wavPar wav, bndPar bnd, int itime, int ixsrc, int izsrc, float *vx, float *vz, float *tzz, -float *txx, float *txz, float *rox, float *roz, float *l2m, float **src_nwav, int verbose); +int applySource(modPar mod, srcPar src, wavPar wav, bndPar bnd, int itime, int ixsrc, int izsrc, float *vx, float *vz, float *tzz, float *txx, float *txz, float *rox, float *roz, float *l2m, float **src_nwav, int verbose); int storeSourceOnSurface(modPar mod, srcPar src, bndPar bnd, int ixsrc, int izsrc, float *vx, float *vz, float *tzz, float *txx, float *txz, int verbose); int reStoreSourceOnSurface(modPar mod, srcPar src, bndPar bnd, int ixsrc, int izsrc, float *vx, float *vz, float *tzz, float *txx, float *txz, int verbose); -int boundariesP(modPar mod, bndPar bnd, float *vx, float *vz, float *tzz, float *txx, float *txz, float *rox, float *roz, float *l2m, float *lam, float *mul, int verbose); +int boundariesP(modPar mod, bndPar bnd, float *vx, float *vz, float *tzz, float *txx, float *txz, float *rox, float *roz, float *l2m, float *lam, float *mul, int itime, int verbose); -int boundariesV(modPar mod, bndPar bnd, float *vx, float *vz, float *tzz, float *txx, float *txz, float *rox, float *roz, float *l2m, float *lam, float *mul, int verbose); +int boundariesV(modPar mod, bndPar bnd, float *vx, float *vz, float *tzz, float *txx, float *txz, float *rox, float *roz, float *l2m, float *lam, float *mul, int itime, int verbose); int em4(modPar mod, srcPar src, wavPar wav, bndPar bnd, int itime, int ixsrc, int izsrc, float **src_nwav, float *hz, float *hx, float *Ey, float *eprs, float *ksigma, float *mu, int verbose) { @@ -93,6 +92,7 @@ int em4(modPar mod, srcPar src, wavPar wav, bndPar bnd, int itime, int ixsrc, in c1*(Ey[ix*n1+iz] - Ey[(ix-1)*n1+iz]) + c2*(Ey[(ix+1)*n1+iz] - Ey[(ix-2)*n1+iz])); //if (hz[ix*n1+iz] > 0.1*FLT_MAX) fprintf(stderr,"%d: hz[%d %d] = %e\n", itime, ix, iz, hz[ix*n1+iz]); + if (hz[ix*n1+iz] != 0.0) fprintf(stderr,"%d: hz[%d %d] = %e\n", itime, ix, iz, hz[ix*n1+iz]); } } @@ -105,16 +105,19 @@ int em4(modPar mod, srcPar src, wavPar wav, bndPar bnd, int itime, int ixsrc, in c1*(Ey[ix*n1+iz] - Ey[ix*n1+iz-1]) + c2*(Ey[ix*n1+iz+1] - Ey[ix*n1+iz-2])); //if (hx[ix*n1+iz] > 0.1*FLT_MAX) fprintf(stderr,"%d: hx[%d %d] = %e\n", itime, ix, iz, hx[ix*n1+iz]); + if (fabs(hx[ix*n1+iz]) != 0.0) fprintf(stderr,"%d: hx[%d %d] = %e\n", itime, ix, iz, hx[ix*n1+iz]); } } /* Add force source */ if (src.type > 5) { applySource(mod, src, wav, bnd, itime, ixsrc, izsrc, hz, hx, Ey, NULL, NULL, mu, mu, eprs, src_nwav, verbose); +// fprintf(stderr,"%d: hx[%d %d] = %e hz=%e \n", itime, ixsrc, izsrc, hx[ixsrc*n1+izsrc], hz[ixsrc*n1+izsrc]); +//fprintf(stderr,"src.n = %d\n", src.n); } /* boundary condition clears velocities on boundaries */ - boundariesP(mod, bnd, hz, hx, Ey, NULL, NULL, mu, mu, eprs, NULL, NULL, verbose); + boundariesP(mod, bnd, hz, hx, Ey, NULL, NULL, mu, mu, eprs, NULL, NULL, itime, verbose); /* calculate p/tzz for all grid points except on the virtual boundary */ for (ix=mod.ioPx; ix<mod.iePx; ix++) { @@ -137,6 +140,7 @@ int em4(modPar mod, srcPar src, wavPar wav, bndPar bnd, int itime, int ixsrc, in for (iz=mod.ioPz; iz<mod.iePz; iz++) { Ey[ix*n1+iz] -= eprs[ix*n1+iz]*(dzhx[iz]+dxhz[iz]) + ksigma[ix*n1+iz]*Ey[ix*n1+iz]; //if (Ey[ix*n1+iz] > 0.1*FLT_MAX) fprintf(stderr,"%d: Ey[%d %d] = %e\n", itime, ix, iz, Ey[ix*n1+iz]); + if (Ey[ix*n1+iz] != 0.0) fprintf(stderr,"%d: Ey[%d %d] = %e\n", itime, ix, iz, Ey[ix*n1+iz]); } } diff --git a/fdemmodc/fdemmodc.c b/fdemmodc/fdemmodc.c index fbd2ffb3f9a29ec3e8e275112161a6bbb525e9da..85d876c2f8dbd1aa164f4df4186b3c465dbdcff3 100644 --- a/fdemmodc/fdemmodc.c +++ b/fdemmodc/fdemmodc.c @@ -16,7 +16,7 @@ int getEmParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar * int readEmModel(modPar mod, bndPar bnd, float *eprs, float *ksigma, float *mu); -int defineSource(wavPar wav, srcPar src, float **src_nwav, int reverse, int verbose); +int defineSource(wavPar wav, srcPar src, modPar mod, float **src_nwav, int reverse, int verbose); int writeSrcRecPos(modPar *mod, recPar *rec, srcPar *src, shotPar *shot); @@ -273,7 +273,7 @@ int main(int argc, char **argv) } } - defineSource(wav, src, src_nwav, mod.grid_dir, verbose); + defineSource(wav, src, mod, src_nwav, mod.grid_dir, verbose); /* allocate arrays for wavefield and receiver arrays */ diff --git a/fdemmodc/getEmParameters.c b/fdemmodc/getEmParameters.c index 6e49d7eae143b782305953654b149198d8c3394b..95bb85f65b0034a34e7733e66568a95244c097c7 100644 --- a/fdemmodc/getEmParameters.c +++ b/fdemmodc/getEmParameters.c @@ -20,6 +20,8 @@ * The Netherlands **/ +int optncr(int n); + float gaussGen(); 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); @@ -36,7 +38,7 @@ int writesufile(char *filename, float *data, int n1, int n2, float f1, float f2, int getEmParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar *src, shotPar *shot, bndPar *bnd, int verbose) { int isnapmax1, isnapmax2, isnapmax, sna_nrsna; - int n1, n2, nx, nz, nsrc, ix, axis, ioPz, is0; + int n1, n2, nx, nz, nsrc, ix, axis, ioPz, is0, optn; int idzshot, idxshot; int src_ix0, src_iz0, src_ix1, src_iz1; int disable_check; @@ -49,7 +51,7 @@ int getEmParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar * float tsnap1, tsnap2, dtsnap, dxsnap, dzsnap, dtrcv; float xsnap1, xsnap2, zsnap1, zsnap2, xmax, zmax; float xsrc1, xsrc2, zsrc1, zsrc2, tsrc1, tsrc2, tlength, tactive; - float src_angle, src_velo, p, grad2rad, rdelay; + float src_angle, src_velo, p, grad2rad, rdelay, scaledt; float *xsrca, *zsrca, rrcv; float rsrc, oxsrc, ozsrc, dphisrc, ncsrc; size_t nsamp; @@ -102,13 +104,28 @@ int getEmParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar * /* define wavelet(s), modeling time and wavelet maximum frequency */ if (wav->file_src!=NULL) { - getWaveletInfo(wav->file_src, &wav->nt, &wav->nx, &wav->dt, &d2, &f1, &f2, &fmax, &ntraces, verbose); - if (wav->dt <= 0.0) { + getWaveletInfo(wav->file_src, &wav->ns, &wav->nx, &wav->ds, &d2, &f1, &f2, &fmax, &ntraces, verbose); + if (wav->ds <= 0.0) { vwarn("dt in wavelet (file_src) equal to 0.0 or negative."); vwarn("Use parameter dt= to overule dt from file_src."); } + wav->nt = wav->ns; + wav->dt = wav->ds; if(!getparfloat("tmod",&mod->tmod)) mod->tmod = (wav->nt-1)*wav->dt; if(!getparfloat("dt",&mod->dt)) mod->dt=wav->dt; + if (NINT(wav->ds*1000000) != NINT(mod->dt*1000000)) { + if (wav->dt > mod->dt) { + scaledt = wav->dt/mod->dt; + scaledt = floorf(wav->dt/mod->dt); + optn = optncr(wav->ns); + wav->nt = floorf(scaledt*optn); + vmess("file_src dt-scalefactor=%f : wav.dt=%e ==interpolated==> mod.dt=%e", scaledt, wav->dt, mod->dt); + wav->dt = mod->dt; + } + else { + wav->dt = mod->dt; /* in case if wav.dt is smaller than 1e-7 and can not be read by SU-getpar */ + } + } if(!getparfloat("fmax",&wav->fmax)) wav->fmax=fmax; } else { @@ -714,7 +731,7 @@ int getEmParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar * vmess("*******************************************"); vmess("************* wavelet info ****************"); vmess("*******************************************"); - vmess("wav_nt = %6d wav_nx = %d", wav->nt, wav->nx); + vmess("wav_nt = %6d wav_nx = %d", wav->ns, wav->nx); vmess("src_type = %6d src_orient = %d", src->type, src->orient); vmess("fmax = %10.3e", fmax); fprintf(stderr," %s: Source type : ",xargv[0]);