From 6acb6d353a7ee110bda440a0be0ae0245eddf946 Mon Sep 17 00:00:00 2001 From: Jan Thorbecke <janth@xs4all.nl> Date: Thu, 9 Aug 2018 16:35:28 +0200 Subject: [PATCH] added option to output frequency slices --- extrap3d/lib/dataFileIO.c | 91 ++++++++++++++++++++++++----------- extrap3d/main/cfpmod3d.c | 8 +-- extrap3d/main/extrap3d.c | 8 +-- extrap3d/main/zomodel3d.c | 11 +++-- fdelmodc/demo/modelOilGas.scr | 8 +-- 5 files changed, 85 insertions(+), 41 deletions(-) diff --git a/extrap3d/lib/dataFileIO.c b/extrap3d/lib/dataFileIO.c index 84b910c..4612557 100644 --- a/extrap3d/lib/dataFileIO.c +++ b/extrap3d/lib/dataFileIO.c @@ -107,7 +107,7 @@ int read_FFT_DataFile(FILE *fp, complex *data, Area vel_area, int nfft, int nw, } -int write_FFT_DataFile(FILE *fp, complex *data, Area data_area, int fldr, int nt, int nfft, int nw, int nw_low, float dt, int out_su, int conjg, int verbose) +int write_FFT_DataFile(FILE *fp, complex *data, Area data_area, int fldr, int nt, int nfft, int nw, int nw_low, float dt, int out_su, int conjg, int freq, int verbose) { int ix, iy, iw, i, nx, ny, sxy, nfreq, pos, sign; int xvmin, yvmin; @@ -142,37 +142,72 @@ int write_FFT_DataFile(FILE *fp, complex *data, Area data_area, int fldr, int nt hdr[0].d2 = dx; hdr[0].scalco = -1000; - for (iy=0; iy<ny; iy++) { - for (ix=0; ix<nx; ix++) { - pos = iy*nx+ix; - for (i=0; i<nfreq; i++) - ctrace[i].r = ctrace[i].i = 0.0; - for (iw=0; iw<nw; iw++) { - ctrace[iw+nw_low].r = data[iw*sxy+pos].r; - ctrace[iw+nw_low].i = conjg*data[iw*sxy+pos].i; - } - /* transform back to time */ - cr1fft(ctrace, trace, nfft, sign); - - /* write to output file */ - if (out_su) { - hdr[0].gx = (int)(xvmin+ix*dx)*1000; - hdr[0].gy = (int)(yvmin+iy*dy)*1000; - hdr[0].f2 = xvmin+ix*dx; - hdr[0].tracf = ix+1; - hdr[0].tracl = iy*nx+ix+1; - nwrite = fwrite(hdr, 1, TRCBYTES, fp); - assert( nwrite == TRCBYTES ); - nwrite = fwrite(trace, sizeof(float), nt, fp); - assert( nwrite == nt ); + if (freq==0) { + for (iy=0; iy<ny; iy++) { + for (ix=0; ix<nx; ix++) { + pos = iy*nx+ix; + for (i=0; i<nfreq; i++) + ctrace[i].r = ctrace[i].i = 0.0; + for (iw=0; iw<nw; iw++) { + ctrace[iw+nw_low].r = data[iw*sxy+pos].r; + ctrace[iw+nw_low].i = conjg*data[iw*sxy+pos].i; + } + + /* transform back to time */ + cr1fft(ctrace, trace, nfft, sign); + + /* write to output file */ + if (out_su) { + hdr[0].gx = (int)(xvmin+ix*dx)*1000; + hdr[0].gy = (int)(yvmin+iy*dy)*1000; + hdr[0].f2 = xvmin+ix*dx; + hdr[0].tracf = ix+1; + hdr[0].tracl = iy*nx+ix+1; + nwrite = fwrite(hdr, 1, TRCBYTES, fp); + assert( nwrite == TRCBYTES ); + nwrite = fwrite(trace, sizeof(float), nt, fp); + assert( nwrite == nt ); + } + else { + nwrite = fwrite(trace, sizeof(float), nt, fp); + assert( nwrite == nt ); + } } - else { - nwrite = fwrite(trace, sizeof(float), nt, fp); - assert( nwrite == nt ); + } + } + else { /* Frequency output slices */ + hdr[0].trid = 122; + hdr[0].fldr = fldr; + hdr[0].trwf = ny; + hdr[0].ntr = nw*ny; + hdr[0].ns = nx; + hdr[0].dt = 1000000*dt; + hdr[0].f1 = 0.0; + hdr[0].f2 = yvmin; + + for (iw=0; iw<nw; iw++) { + for (iy=0; iy<ny; iy++) { + /* write to output file */ + if (out_su) { + hdr[0].gx = (int)(xvmin)*1000; + hdr[0].gy = (int)(yvmin+iy*dy)*1000; + hdr[0].f1 = xvmin+ix*dx; + hdr[0].f2 = yvmin+iy*dy; + hdr[0].tracf = iy+1; + hdr[0].tracl = iw*ny+iy+1; + nwrite = fwrite(hdr, 1, TRCBYTES, fp); + assert( nwrite == TRCBYTES ); + nwrite = fwrite(&data[iw*sxy+iy*nx], sizeof(complex), nx, fp); + assert( nwrite == nx ); + } + else { + nwrite = fwrite(&data[iw*sxy+iy*nx], sizeof(complex), nx, fp); + assert( nwrite == nx ); + } } } - } + } fflush(fp); free(trace); diff --git a/extrap3d/main/cfpmod3d.c b/extrap3d/main/cfpmod3d.c index 6882e55..2eb38af 100644 --- a/extrap3d/main/cfpmod3d.c +++ b/extrap3d/main/cfpmod3d.c @@ -24,7 +24,7 @@ void cr1fft(complex *cdata, float *rdata, int n, int sign); /****** IO routines *******/ int openVelocityFile(char *file_vel, FILE **fp, Area *vel_area, int verbose); void readVelocitySlice(FILE *fp, float *velocity, int iz, int nyv, int nxv); -int write_FFT_DataFile(FILE *fp, complex *data, Area data_area, int fldr, int nt, int nfft, int nw, int nw_low, float dt, int out_su, int conjg, int verbose); +int write_FFT_DataFile(FILE *fp, complex *data, Area data_area, int fldr, int nt, int nfft, int nw, int nw_low, float dt, int out_su, int conjg, int freq, int verbose); int write_ImageFile(FILE *fp, float *data, Area data_area, int fldr, int d, int out_su, int verbose); @@ -129,6 +129,7 @@ char *sdoc[] = { " filter_inc=1 ............. the increment in dz for the Li filter (0=off)", " nterms=1 ................. the number of terms in the paraxial expansion", " OUTPUT DEFINITION ", +" freq=0 ................... output in frequency slices", " snap=0 ................... snapshots (not yet implemented)", " beam=0 ................... beams ", " verbose=0 ................ >1: shows various parameters and results", @@ -152,7 +153,7 @@ int main(int argc, char *argv[]) { FILE *out_file, *vel_file, *src_file, *beam_file; size_t nread, size, size_out; - int verbose, method, ntraces, oper_opt, MB, out_su, verb_root; + int verbose, method, ntraces, oper_opt, MB, out_su, out_freq, verb_root; int nxv, nyv, nzv, dstep, fldr; int nt, err; int ntap, tap_opt, order, McC, oplx, oply, fine; @@ -239,6 +240,7 @@ int main(int argc, char *argv[]) if(!getparint("fine", &fine)) fine = 2; if(!getparint("beam", &beam)) beam = 0; if(!getparint("add", &add)) add = 0; + if(!getparint("freq", &out_freq)) out_freq = 0; if(!getparint("verbose", &verbose)) verbose = 0; if(!ISODD(oplx)) oplx += 1; @@ -651,7 +653,7 @@ int main(int argc, char *argv[]) fldr = is+1; write_FFT_DataFile(out_file, rec_all, shot_area, fldr, - nt, nfft, nw, nw_low, dt, out_su, conjg, verbose); + nt, nfft, nw, nw_low, dt, out_su, conjg, out_freq, verbose); fclose(out_file); if (verbose) diff --git a/extrap3d/main/extrap3d.c b/extrap3d/main/extrap3d.c index 17f6dab..6a4d6d3 100644 --- a/extrap3d/main/extrap3d.c +++ b/extrap3d/main/extrap3d.c @@ -22,7 +22,7 @@ int openVelocityFile(char *file_vel, FILE **fp, Area *vel_area, int verbose); void readVelocitySlice(FILE *fp, float *velocity, int iz, int nyv, int nxv); -int write_FFT_DataFile(FILE *fp, complex *data, Area data_area, int fldr, int nt, int nfft, int nw, int nw_low, float dt, int out_su, int conjg, int verbose); +int write_FFT_DataFile(FILE *fp, complex *data, Area data_area, int fldr, int nt, int nfft, int nw, int nw_low, float dt, int out_su, int conjg, int freq, int verbose); int read_FFT_DataFile(FILE *fp, complex *data, Area vel_area, int nfft, int nw, int nw_low, int *tr_read_in, int *tr_shot, int *ixmin, int *ixmax, int *iymin, int *iymax, int *sx, int *sy, int conjg, int verbose); @@ -107,6 +107,7 @@ char *sdoc[] = { " filter_inc=1 ............. the increment in dz for the Li filter (0=off)", " nterms=1 ................. the number of terms in the paraxial expansion", " OUTPUT DEFINITION ", +" freq=0 ................... output in frequency slices", " snap=0 ................... snapshots (not yet implemented)", " beam=0 ................... beams ", " verbose=0 ................ >1: shows various parameters and results", @@ -136,7 +137,7 @@ int main(int argc, char *argv[]) size_t nread, bytes, size, trace_sz, size_out; int verbose, method, ntraces, verb_root; int nxv, nyv, nzv, binary_file, dstep, id, id1, id2; - int d, nt, ndepth, i, j, conjg, conjgs, mode, out_su; + int d, nt, ndepth, i, j, conjg, conjgs, mode, out_su, out_freq; int ntap, tap_opt, order, McC, oplx, oply, fine, MB; int stackmigr, imc, area, ixmin, ixmax, iymin, iymax, ns; int nfft, nfreq, nw_high, nw_low, nw, sx, sy, ix, iy; @@ -206,6 +207,7 @@ int main(int argc, char *argv[]) if(!getparfloat("weights", &weights)) weights = 1e-2; if(!getparint("fine", &fine)) fine = 2; if(!getparint("beam", &beam)) beam = 0; + if(!getparint("freq", &out_freq)) out_freq = 0; if(!getparint("verbose", &verbose)) verbose = 0; if(!ISODD(oplx)) oplx += 1; @@ -602,7 +604,7 @@ int main(int argc, char *argv[]) assert( out_file ); write_FFT_DataFile(out_file, rec_all, shot_area, (is+1), - nt, nfft, nw, nw_low, dt, out_su, conjg, verb_root); + nt, nfft, nw, nw_low, dt, out_su, conjg, out_freq, verb_root); fclose(out_file); } diff --git a/extrap3d/main/zomodel3d.c b/extrap3d/main/zomodel3d.c index 39f66a2..1bb9a53 100644 --- a/extrap3d/main/zomodel3d.c +++ b/extrap3d/main/zomodel3d.c @@ -24,7 +24,7 @@ void cr1fft(complex *cdata, float *rdata, int n, int sign); /****** IO routines *******/ int openVelocityFile(char *file_vel, FILE **fp, Area *vel_area, int verbose); void readVelocitySlice(FILE *fp, float *velocity, int iz, int nyv, int nxv); -int write_FFT_DataFile(FILE *fp, complex *data, Area data_area, int fldr, int nt, int nfft, int nw, int nw_low, float dt, int out_su, int conjg, int verbose); +int write_FFT_DataFile(FILE *fp, complex *data, Area data_area, int fldr, int nt, int nfft, int nw, int nw_low, float dt, int out_su, int conjg, int freq, int verbose); /***** Operator tables *****/ void tablecalc_2D(int oplx, int oply, int nx, float dx, int ny, float dy, @@ -64,7 +64,6 @@ char *sdoc[] = { " Optional parameters:", " ", " conjg=0 .................. 1: take complex conjugate of input data", -" verbose=0 ................ >1: shows various parameters and results", " VELOCITY MODEL ", " dxv=dxv .................. stepsize in x-direction of velocity model ", " dyv=dyv .................. stepsize in y-direction of velocity model ", @@ -113,6 +112,9 @@ char *sdoc[] = { " fine=2 ................... fine sampling in operator table", " filter_inc=1 ............. the increment in dz for the Li filter (0=off)", " nterms=1 ................. the number of terms in the paraxial expansion", +" OUTPUT DEFINITION ", +" freq=0 ................... output in frequency slices", +" verbose=0 ................ >1: shows various parameters and results", " ", " Options for method:", " - 1 = Direct 2D convolution (Walter's scheme)", @@ -148,7 +150,7 @@ int main(int argc, char *argv[]) int nfft, nfreq, nw_high, nw_low, nw, ix, iy; int sxy, iw, sign, ixv, iyv; int nxy, pos, id, idp, oper_opt; - int out_su, nterms, filter_inc, interpol; + int out_freq, out_su, nterms, filter_inc, interpol; Area shot_area; float alpha, weight; float depth1,depth2; @@ -217,6 +219,7 @@ int main(int argc, char *argv[]) if(!getparint("fine", &fine)) fine = 2; if(!getparfloat("dt", &dt)) dt = 0.004; if(!getparint("nt", &nt)) nt = 512; + if(!getparint("freq", &out_freq)) out_freq = 0; if(!getparint("verbose", &verbose)) verbose = 0; if(!ISODD(oplx)) oplx += 1; @@ -699,7 +702,7 @@ int main(int argc, char *argv[]) out_file = fopen( file_out, "w+" ); assert( out_file ); write_FFT_DataFile(out_file, rec_field, shot_area, 1, - nt, nfft, nw, nw_low, dt, out_su, conjg, verbose); + nt, nfft, nw, nw_low, dt, out_su, conjg, out_freq, verbose); fclose(out_file); } diff --git a/fdelmodc/demo/modelOilGas.scr b/fdelmodc/demo/modelOilGas.scr index 5005543..5fa2690 100755 --- a/fdelmodc/demo/modelOilGas.scr +++ b/fdelmodc/demo/modelOilGas.scr @@ -1,6 +1,6 @@ #!/bin/bash -#export PATH=$HOME/bin:$HOME/src/OpenSource/utils:$PATH: +export PATH=$HOME/bin:$HOME/src/OpenSource/utils:$PATH: cp=2000 rho=2500 @@ -16,12 +16,14 @@ makemod sizex=5000 sizez=2500 dx=$dx dz=$dx cp0=$cp ro0=$rho \ makewave w=g1 fp=20 dt=$dt file_out=wave.su nt=4096 t0=0.1 -export OMP_NUM_THREADS=8 +export OMP_NUM_THREADS=1 zsrc=1100 zsrc=0 -~/bin/fdelmodc \ +which fdelmodc + +fdelmodc \ file_cp=syncl_cp.su ischeme=1 iorder=4 \ file_den=syncl_ro.su \ file_src=wave.su \ -- GitLab