diff --git a/fdelmodc/.DS_Store b/fdelmodc/.DS_Store index c0cb59e77110d2339cdcace7ece85b15b8ff66a3..f32ee3de07f0d73c742fdadceb960e8afa6cc66c 100644 Binary files a/fdelmodc/.DS_Store and b/fdelmodc/.DS_Store differ diff --git a/fdelmodc/demo/demoStaircase.scr b/fdelmodc/demo/demoStaircase.scr new file mode 100755 index 0000000000000000000000000000000000000000..4fd328a3cc41f996de5639e46763e2894db0341b --- /dev/null +++ b/fdelmodc/demo/demoStaircase.scr @@ -0,0 +1,85 @@ +#!/bin/bash + +#export PATH=$HOME/bin:$HOME/src/OpenSource/utils:$PATH: + +cp=2000 +rho=2500 +dx=2.5 +dt=0.0005 + +#dx=5 +#dt=0.0005 + +makemod sizex=5000 sizez=2500 dx=$dx dz=$dx cp0=$cp ro0=$rho \ + orig=-2500,0 file_base=tilt.su \ + intt=def x=-2500,0,2500 z=2000,1200,400 cp=2500 ro=5500 + +makemod sizex=5000 sizez=2500 dx=$dx dz=$dx cp0=$cp ro0=$rho \ + orig=-2500,0 file_base=hom.su + +makewave w=g1 fp=20 dt=$dt file_out=wave.su nt=4096 t0=0.1 + +export OMP_NUM_THREADS=2 + +zsrc=1100 +zsrc=0 + +../fdelmodc \ + file_cp=tilt_cp.su ischeme=1 iorder=4 \ + file_den=tilt_ro.su \ + file_src=wave.su \ + file_rcv=shot_fd.su \ + src_type=7 \ + src_orient=1 \ + src_injectionrate=0 \ + rec_type_vz=1 \ + rec_type_p=1 \ + rec_int_vz=2 \ + dtrcv=0.004 \ + rec_delay=0.1 \ + verbose=2 \ + tmod=2.01 \ + dxrcv=10.0 \ + xrcv1=-2250 xrcv2=2250 \ + zrcv1=0 zrcv2=0 \ + xsrc=0 zsrc=$zsrc \ + file_snap=snapF_$zsrc \ + tsnap1=0.1 tsnap2=2.0 dtsnap=0.05 dxsnap=5 dzsnap=5 \ + ntaper=101 \ + snapwithbnd=1 \ + left=2 right=2 top=2 bottom=2 + +#suxmovie < snapF_${zsrc}_svz.su loop=1 clip=1e-13 +sugain scale=-1 < snapF_0_svz.su | sustrip > snapF_0_dx${dx}_svz.bin + +exit; +../fdelmodc \ + file_cp=hom_cp.su ischeme=1 iorder=4 \ + file_den=hom_ro.su \ + file_src=wave.su \ + file_rcv=shoth_fd.su \ + src_type=7 \ + src_orient=1 \ + src_injectionrate=0 \ + rec_type_vz=1 \ + rec_type_p=1 \ + rec_int_vz=2 \ + dtrcv=0.004 \ + rec_delay=0.1 \ + verbose=2 \ + tmod=2.01 \ + dxrcv=10.0 \ + xrcv1=-2250 xrcv2=2250 \ + zrcv1=0 zrcv2=0 \ + xsrc=0 zsrc=$zsrc \ + file_snap=snapH_$zsrc \ + tsnap1=0.1 tsnap2=2.0 dtsnap=0.05 dxsnap=5 dzsnap=5 \ + ntaper=101 \ + snapwithbnd=1 \ + left=2 right=2 top=2 bottom=2 + +sudiff snapF_${zsrc}_svz.su snapH_${zsrc}_svz.su > snap_svz.su + +sugain scale=-1 < snap_svz.su | sustrip > snap_svz.bin + +suxmovie < snap_svz.su loop=1 clip=1e-13 diff --git a/fdelmodc/demo/fdelmodc_taper.scr b/fdelmodc/demo/fdelmodc_taper.scr index e6dfeeaf79cebdd597bca0e25e5fcbe9222299ed..cdb8aed52b6996561755ac5a171097d9becb81d4 100755 --- a/fdelmodc/demo/fdelmodc_taper.scr +++ b/fdelmodc/demo/fdelmodc_taper.scr @@ -11,6 +11,7 @@ dt=0.0002 dx=1 cp=1500 +clip=1 makewave file_out=wavelet.su dt=$dt nt=1024 fp=85 shift=1 w=g2 verbose=1 @@ -22,7 +23,36 @@ export filecp=model_cp.su export filecs=model_cs.su export filero=model_ro.su -for ntaper in 0 200; +ntaper=0 +../fdelmodc \ + file_cp=$filecp file_cs=$filecs file_den=$filero \ + ischeme=1 \ + file_src=wavelet.su verbose=4 \ + file_rcv=rec.su \ + file_snap=snap_nodisp.su \ + xrcv1=0 xrcv2=1000 dxrcv=5 \ + zrcv1=300 zrcv2=300 \ + rec_type_vx=1 rec_type_pp=1 rec_type_ss=1 rec_int_vx=1 \ + dtrcv=0.004 \ + xsrc=500 zsrc=500 nshot=1 \ + src_type=1 tmod=1.0 \ + ntaper=$ntaper \ + left=3 right=3 bottom=3 top=3 \ + tsnap1=0.2 tsnap2=1.0 dtsnap=0.1 \ + sna_type_ss=1 sna_type_pp=1 fmax=25 + +suwind key=fldr min=3 max=3 < snap_nodisp_sp.su | \ + supsimage \ + wbox=4 hbox=4 titlesize=-1 labelsize=10 verbose=1 \ + d2=$dx f2=0 clip=$clip \ + label1="depth [m]" label2="lateral position [m]" > snap_tap${ntaper}.eps + +supsimage < rec_rp.su \ + wbox=3 hbox=4 titlesize=-1 labelsize=10 clip=$clip verbose=1 \ + label1="time [s]" label2="lateral position [m]" > rec_tap${ntaper}_rp.eps + + +for ntaper in 50 100; do ../fdelmodc \ file_cp=$filecp file_cs=$filecs file_den=$filero \ @@ -44,14 +74,46 @@ do suwind key=fldr min=3 max=3 < snap_nodisp_sp.su | \ supsimage \ wbox=4 hbox=4 titlesize=-1 labelsize=10 verbose=1 \ - d2=$dx f2=0 clip=0.003 \ + d2=$dx f2=0 clip=$clip \ label1="depth [m]" label2="lateral position [m]" > snap_tap${ntaper}.eps supsimage < rec_rp.su \ - wbox=3 hbox=4 titlesize=-1 labelsize=10 clip=0.003 verbose=1 \ + wbox=3 hbox=4 titlesize=-1 labelsize=10 clip=$clip verbose=1 \ label1="time [s]" label2="lateral position [m]" > rec_tap${ntaper}_rp.eps done + +for npml in 5 10 20; +do +../fdelmodc \ + file_cp=$filecp file_cs=$filecs file_den=$filero \ + ischeme=1 \ + file_src=wavelet.su verbose=4 \ + file_rcv=rec.su \ + file_snap=snap_nodisp.su \ + xrcv1=0 xrcv2=1000 dxrcv=5 \ + zrcv1=300 zrcv2=300 \ + rec_type_vx=1 rec_type_pp=1 rec_type_ss=1 rec_int_vx=1 \ + dtrcv=0.004 \ + xsrc=500 zsrc=500 nshot=1 \ + src_type=1 tmod=1.0 \ + npml=$npml \ + left=2 right=2 bottom=2 top=2 \ + tsnap1=0.2 tsnap2=1.0 dtsnap=0.1 \ + sna_type_ss=1 sna_type_pp=1 fmax=25 + +suwind key=fldr min=3 max=3 < snap_nodisp_sp.su | \ + supsimage \ + wbox=4 hbox=4 titlesize=-1 labelsize=10 verbose=1 \ + d2=$dx f2=0 clip=$clip \ + label1="depth [m]" label2="lateral position [m]" > snap_pml${npml}.eps + +supsimage < rec_rp.su \ + wbox=3 hbox=4 titlesize=-1 labelsize=10 clip=$clip verbose=1 \ + label1="time [s]" label2="lateral position [m]" > rec_pml${npml}_rp.eps + +done + exit; diff --git a/fdemmodc/em4.c b/fdemmodc/em4.c index 760399c1ea12f990e7959a404c40c8065efafaf5..fb6e6475bc17aa5fb373ff6fef485ed666113015 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]); diff --git a/raytime/Makefile b/raytime/Makefile index 11948fc94c7a5e51bcb170adc4bca2f9d2dbe801..bc429087cf0e991413e7a471300071241132b0e5 100644 --- a/raytime/Makefile +++ b/raytime/Makefile @@ -26,6 +26,7 @@ PRG = raytime SRCC = $(PRG).c \ JespersRayTracer.c \ vidale.c \ + Grid2Time1.c \ getParameters.c \ getWaveletInfo.c \ writeSrcRecPos.c \ diff --git a/utils/Makefile b/utils/Makefile index 8f6b1a5670dd97e30248a9c8780a61751851fd71..3b59b4f71f844acc56c9b9851deba24861d82e5b 100644 --- a/utils/Makefile +++ b/utils/Makefile @@ -86,6 +86,7 @@ SRCG = green.c \ SRCB = basop.c \ getFileInfo.c \ + kxwfilter.c \ readData.c \ writeData.c \ wallclock_time.c \ diff --git a/utils/basop.c b/utils/basop.c index 98a10f82e53cf667e53e0982ac7d76be2d23426d..4456acbaaf94921101fd404e8eef7307690a6ee5 100644 --- a/utils/basop.c +++ b/utils/basop.c @@ -39,6 +39,7 @@ void timeRotate(float *data, int nsam, int nrec, int nrot); void rma(float *data, int nsam, int nrec); void rmat(float *data, int nsam, int nrec); void decompAcoustic(float *data, int nsam, int nrec, float dt, float dx, float fmin, float fmax, float c, float rho, int opt); +void kxwfilter(float *data, int nt, int nx, float dt, float dx, float fmin, float fmax, float angle, float cp, float perc); int getFileInfo(char *filename, int *n1, int *n2, int *ngath, float *d1, float *d2, float *f1, float *f2, float *xmin, float *xmax, float *sclsxgx, int *nxm); int readData(FILE *fp, float *data, segy *hdrs, int n1); int writeData(FILE *fp, float *data, segy *hdrs, int n1, int n2); @@ -70,6 +71,7 @@ char *sdoc[] = { " shift=0 .................. time shift in seconds", " rot=0 .................... phase rotation in parts of PI", " c=1500 ................... velocity of the medium (for kz and ghost)", +" alpha=65 ................. angle for kfilt option: k > (w/c)*cos(alpha) is filtered out", " rho=1000 ................. density in kg/m^3 of the medium (for decomposition operator)", " dz=9 ..................... depth of receivers for deghosting (m)", " eps=0.01 ................. stabilization for deghosting", @@ -105,6 +107,7 @@ char *sdoc[] = { " - 23 - som = multiply with sqrt(w) in frequency domain", " - 24 - deca1 = acoustic decompostion multiply with sqrt(2 kz/(w rho)) in kx-w domain", " - 25 - deca2 = acoustic decompostion multiply with sqrt((2 w rho)/(kz)) in kx-w domain", +" - 26 - kfilt = dipfilter in the kx-w domain given alpha and cp", " ", " author : Jan Thorbecke : 12-12-1994 (janth@xs4all.nl)", " Alexander Koek (E.A.Koek@CTG.TuDelft.NL)", @@ -124,7 +127,7 @@ int main(int argc, char **argv) float dt, dx, dy, c, rho, d1, d2, f1, f2; float scl, xmin, xmax, trot; double t0, t1, t2; - float fmin, fmax, *data, shift, rot, dz, eps, *tmpdata; + float fmin, fmax, *data, shift, rot, alpha, perc, dz, eps, *tmpdata; char *file_in, *file_out; char choice[10], *choicepar; segy *hdrs; @@ -148,6 +151,7 @@ int main(int argc, char **argv) if(!getparfloat("fmin", &fmin)) fmin = 0.0; if(!getparfloat("shift", &shift)) shift = 0.0; if(!getparfloat("c", &c)) c = 1500.0; + if(!getparfloat("alpha", &alpha)) alpha = 65.0; if(!getparfloat("rho", &rho)) rho = 1000.0; if(!getparfloat("dz", &dz)) dz = 9; if(!getparfloat("eps", &eps)) eps = 0.01; @@ -379,7 +383,11 @@ int main(int argc, char **argv) opt = 2; decompAcoustic(data, nsam, nrec, dt, dx, fmin, fmax, c, rho, opt); } - + else if (!strcmp(choice, "kfilt") || !strcmp(choice, "26")) { + if (verbose) vmess("kx-w filtering for angles > alpha"); + perc=0.15; + kxwfilter(data, nsam, nrec, dt, dx, fmin, fmax, alpha, c, perc); + } t2 = wallclock_time(); diff --git a/utils/demo/green.scr b/utils/demo/green.scr index 36d4c6d2d98599858f26c4efda6c1c1e986f6397..d573a519748a84172d608704f3ef5633a8c57f6d 100755 --- a/utils/demo/green.scr +++ b/utils/demo/green.scr @@ -1,9 +1,9 @@ #!/bin/bash -makewave nt=512 w=g2 file_out=wave.su w=g2 dt=0.004 +makewave nt=512 file_out=wave.su w=g2 dt=0.004 green c=2000 nt=512 dt=0.004 zsrc1=500 xsrc1=0 file_src=wave.su file_out=green.su -fconv file_in1=green.su file_in2=wave.su mode=dec eps=0.0 reps=0.01 file_out=dec.su mode=dec verbose=1 +../fconv file_in2=green.su file_in1=wave.su eps=0.01 reps=0.01 file_out=dec.su mode=dec verbose=2 diff --git a/utils/fconv.c b/utils/fconv.c index ed409fbbb60ea0db6a7497da7a724493575d1d49..6afc67774ad68e9bf7c6a7d9fee23be0df667765 100644 --- a/utils/fconv.c +++ b/utils/fconv.c @@ -647,9 +647,11 @@ void deconv(float *data1, float *data2, float *decon, int nrec, int nsam, qr = (float *) &cdec[0].r; p1i = p1r + 1; p2i = p2r + 1; + qi = qr + 1; leps = reps*maxden+eps; // fprintf(stderr,"eps=%e reps=%e max=%e => leps=%e\n", eps, reps, maxden, leps); for (j = 0; j < n; j++) { + if (fabs(*p2r)>=fabs(*p2i)) { *qr = (*p2r**p1r+*p2i**p1i)/(den[j]+leps); *qi = (*p2r**p1i-*p2i**p1r)/(den[j]+leps); diff --git a/utils/kxwfilter.c b/utils/kxwfilter.c new file mode 100644 index 0000000000000000000000000000000000000000..30396ec31f8ca29348ac7d42f0af9d553a8939d3 --- /dev/null +++ b/utils/kxwfilter.c @@ -0,0 +1,137 @@ +#include <math.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <genfft.h> + +#define ISODD(n) ((n) & 01) +#define MAX(x,y) ((x) > (y) ? (x) : (y)) +#define MIN(x,y) ((x) < (y) ? (x) : (y)) + +void kxwfilt(complex *data, float k, float dx, int nkx, float a1, float perc); + +void kxwfilter(float *data, int nt, int nx, float dt, float dx, float fmin, float fmax, float angle, float cp, float perc) +{ + int ntfft, nfreq, nkx, ix, it, iomin, iomax, xorig, iom, ikx; + float df, dkx, deltom, omin, omax, kp, om; + float *pdata, *filter; + complex *cdata; + + ntfft = optncr(nt); + nfreq = ntfft/2+1; + nkx = optncc(2*nx); + + df = 1.0/((float)ntfft*dt); + dkx = 2.0*M_PI/(nkx*dx); + deltom = 2.*M_PI*df; + omin = 2.*M_PI*fmin; + omax = 2.*M_PI*fmax; + + iomin = (int)MIN((omin/deltom), (nfreq-1)); + iomin = MAX(iomin, 1); + iomax = MIN((int)(omax/deltom), (nfreq-1)); + + pdata = (float *)calloc(ntfft*nkx,sizeof(float)); + cdata = (complex *)malloc(nfreq*nkx*sizeof(complex)); + filter = (float *)malloc(nkx*sizeof(float)); + + /* copy input data into extended arrays with padded zeroes */ + for (ix=0; ix<nx; ix++) { + memcpy(&pdata[ix*ntfft],&data[ix*nt],nt*sizeof(float)); + } + + /* transform from t-x to kx-w */ + xorig = nkx/2; + xt2wkx(pdata, cdata, ntfft, nkx, ntfft, nkx, xorig); + + + for (iom = iomin; iom <= iomax; iom++) { + om = iom*deltom; + kp = om/cp; + + kxwfilt(&cdata[iom*nkx], kp, dx, nkx, angle, perc); + + for (ikx = 0; ikx < nkx; ikx++) { + cdata[ikx].r *= filter[ikx]; + cdata[ikx].i *= filter[ikx]; + } + } + + /* transform back to t-x */ + wkx2xt(cdata, pdata, ntfft, nkx, nkx, ntfft, xorig); + + /* reduce array to nt samples nx traces */ + for (ix=0; ix<nx; ix++) { + memcpy(&data[ix*nt],&pdata[ix*ntfft],nt*sizeof(float)); + } + + free(pdata); + free(cdata); + + return; +} + + +void kxwfilt(complex *data, float k, float dx, int nkx, float a1, float perc) +{ + int ikx, ik1, ik2, ntap; + float kxnyq, dkx, kxfmax, kfilt; + float kpos, band, li, *filter; + + kxnyq = M_PI/dx; + dkx = 2.0*M_PI/(nkx*dx); + if (a1 > 90.0) kpos = kxnyq; + else kpos = k*sin(M_PI*a1/180.0); + + filter = (float *)malloc(nkx*sizeof(float)); + + band = fabs(2*kpos); + ntap = (int)fabs((int)(perc*band/dkx)); + kfilt = fabs(dkx*ntap); + + if (perc > 0) { + if (kpos+kfilt < kxnyq) { + kxfmax = kpos+kfilt; + } + else { + kxfmax = kxnyq; + ntap = (int)(0.15*nkx/2); + } + } + else { + kxfmax = MIN(kpos, kxnyq); + } + + ik1 = (int)(kxfmax/dkx); + ik2 = ik1 - ntap; + + if (perc < -0.5 || perc > 1.0) { + if (kpos > 0.85*kxnyq) { + kpos = 0.85*kxnyq; + } + ik1 = nkx/2-1; + ik2 = (int)(kpos/dkx); + } + + li = 1.0/(ik1-ik2); + for (ikx = 0; ikx < ik2; ikx++) + filter[ikx] = 1.0; + for (ikx = ik2; ikx < ik1; ikx++) + filter[ikx] = 0.5*(cos(M_PI*(ikx-ik2)*li)+1); + for (ikx = ik1; ikx <= nkx/2; ikx++) + filter[ikx] = 0.0; + + for (ikx = 0; ikx <= (nkx/2); ikx++) { + data[ikx].r *= filter[ikx]; + data[ikx].i *= filter[ikx]; + } + for (ikx = (nkx/2+1); ikx < nkx; ikx++) { + data[ikx].r *= filter[nkx-ikx]; + data[ikx].i *= filter[nkx-ikx]; + } + + free(filter); + return; +} + +