From a2751086b42021384c8094e0192c1713c4b70786 Mon Sep 17 00:00:00 2001 From: Jan Thorbecke <janth@xs4all.nl> Date: Tue, 31 Oct 2017 12:20:29 +0100 Subject: [PATCH] clean of old files --- marchenko/marchenko.c.jan12_2017 | 1013 ------------------------------ 1 file changed, 1013 deletions(-) delete mode 100644 marchenko/marchenko.c.jan12_2017 diff --git a/marchenko/marchenko.c.jan12_2017 b/marchenko/marchenko.c.jan12_2017 deleted file mode 100644 index 634e5c3..0000000 --- a/marchenko/marchenko.c.jan12_2017 +++ /dev/null @@ -1,1013 +0,0 @@ -#include "par.h" -#include "segy.h" -#include <time.h> -#include <stdlib.h> -#include <stdio.h> -#include <math.h> -#include <assert.h> -#include <genfft.h> - -int omp_get_max_threads(void); -int omp_get_num_threads(void); -void omp_set_num_threads(int num_threads); - -#ifndef MAX -#define MAX(x,y) ((x) > (y) ? (x) : (y)) -#endif -#ifndef MIN -#define MIN(x,y) ((x) < (y) ? (x) : (y)) -#endif -#define NINT(x) ((int)((x)>0.0?(x)+0.5:(x)-0.5)) - -#ifndef COMPLEX -typedef struct _complexStruct { /* complex number */ - float r,i; -} complex; -#endif/* complex */ - -int readShotData(char *filename, float *xrcv, float *xsrc, float *zsrc, int *xnx, complex *cdata, int nw, int nw_low, int ngath, int nx, int nxm, int ntfft, int mode, float weight, int verbose); -int readTinvData(char *filename, float *xrcv, float *xsrc, float *zsrc, int *xnx, complex *cdata, int nw, int nw_low, int ngath, int nx, int ntfft, int mode, float *maxval, float *G_d, int hw, int verbose); -int writeDataIter(char *file_iter, float *data, segy *hdrs, int n1, int n2, float d2, float f2, int n2out, int Nsyn, float *xsyn, float *zsyn, int iter); -void name_ext(char *filename, char *extension); - -void applyMute( float *data, float *muteW, int smooth, int above, int Nsyn, int nxs, int nts, float *xsrc, int *xrcvsyn, int nx, int shift); - -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); -int disp_fileinfo(char *file, int n1, int n2, float f1, float f2, float d1, float d2, segy *hdrs); -double wallclock_time(void); - -void synthesis(complex *Refl, complex *Fop, float *iRN, int nx, int nt, int nxs, int nts, float dt, float *xsyn, int Nsyn, float *xrcv, float *xsrc, float fxs2, float fxs, float dxs, float dxsrc, float dx, int ixa, int ixb, int ntfft, int nw, int nw_low, int nw_high, int reci, int nshots, int verbose); - -void synthesisPosistions(int nx, int nt, int nxs, int nts, float dt, float *xsyn, int Nsyn, float *xrcv, float *xsrc, float fxs2, float fxs, float dxs, float dxsrc, float dx, int ixa, int ixb, int reci, int nshots, int *ixpossyn, int *npossyn, int verbose); - -/*********************** self documentation **********************/ -char *sdoc[] = { -" ", -" MARCHENKO - Iterative Green's functions retrieval in frequency domain", -" ", -" marchenko file_tinv= file_shot= nshots= [optional parameters]", -" ", -" Required parameters: ", -" ", -" file_tinv= ............... focusing operator(s)", -" file_shot= ............... shot records with Reflection data", -" ", -" Optional parameters: ", -" ", -" INTEGRATION ", -" tap=0 .................... lateral taper focusing(1), shot(2) or both(3)", -" ntap=0 ................... number of taper points at boundaries", -" fmin=0 ................... minimum frequency", -" fmax=70 .................. maximum frequency", -" MARCHENKO ITERATIONS ", -" niter=10 ................. number of iterations", -" MUTE WINDOW ", -" above=0 .................. mute above(1), around(0) or below(-1) the first travel times of file_tinv", -" shift=12 ................. number of points above(positive) / below(negative) travel time for mute", -" hw=8 ..................... window in time samples to look for maximum in next trace", -" smooth=5 ................. number of points to smooth mute with cosine window", -" weight=1 ................. weight factor for summation of muted field with Tinv", -" OUTPUT DEFINITION ", -" file_green= .............. output file with full Green function(s)", -" file_gplus= .............. output file with G+ ", -" file_gmin= ............... output file with G- ", -" file_f1plus= ............. output file with f1+ ", -" file_f1min= .............. output file with f1- ", -" file_pplus= .............. output file with p+ ", -" file_f2= ................. output file with f2 (=p+) ", -" file_pmin= ............... output file with p- ", -" file_iter= ............... output file with N for each iteration", -" verbose=0 ................ silent option; >0 displays info", -" ", -" ", -" author : Jan Thorbecke : 2016 (j.w.thorbecke@tudelft.nl)", -" ", -NULL}; -/**************** end self doc ***********************************/ - -int main (int argc, char **argv) -{ - FILE *fp_syn, *fp_shot, *fp_out, *fp_f1plus, *fp_f1min; - FILE *fp_gmin, *fp_gplus, *fp_f2, *fp_pmin; - int i, j, k, l, ret, nshots, Nsyn, nt, nx, nts, nxs, more, ngath; - int size, n1, n2, ntap, tap, di, ixrcv, ixsrc, ntraces; - int nf, nw, nw_low, nw_high, nfreq, *xnx, *xnxsyn; - int reci, mode, ixa, ixb, n2out, verbose, ntfft; - int iter, niter, iw, tracf; - int hw, smooth, above, shift, *ixpossyn, npossyn, ix; - float fmin, fmax, df, *tapersh, *tapersy, fxf, dxf, fxs2, *xsrc, *xrcv, *zsyn, *zsrc, *xrcvsyn; - double t0, t1, t2, t3, tsyn, tread, tfft; - float *shotdata, d1, d2, f1, f2, fts, fxs, ft, fx, *xsyn, dxsrc; - float *green, *pplus, *f2p, *pmin, *G_d, *muteW, dt, dx, dts, dxs, scl, mem; - float *f1plus, *f1min, *iRN, *Ni, *trace, *Gmin, *Gplus; - float max, scel, xmin, xmax, weight; - complex *Refl, *Fop, *ctrace; - char *file_tinv, *file_shot, *file_green, *file_iter; - char *file_f1plus, *file_f1min, *file_gmin, *file_gplus, *file_f2, *file_pmin; - char number[16], filename[1024]; - segy *hdrs, *hdrs_in, *hdrs_out; - - initargs(argc, argv); - requestdoc(1); - - tsyn = tread = tfft = 0.0; - t0 = wallclock_time(); - - if (!getparstring("file_shot", &file_shot)) file_shot = NULL; - if (!getparstring("file_tinv", &file_tinv)) file_tinv = NULL; - if (!getparstring("file_f1plus", &file_f1plus)) file_f1plus = NULL; - if (!getparstring("file_f1min", &file_f1min)) file_f1min = NULL; - if (!getparstring("file_gplus", &file_gplus)) file_gplus = NULL; - if (!getparstring("file_gmin", &file_gmin)) file_gmin = NULL; - if (!getparstring("file_pplus", &file_f2)) file_f2 = NULL; - if (!getparstring("file_f2", &file_f2)) file_f2 = NULL; - if (!getparstring("file_pmin", &file_pmin)) file_pmin = NULL; - if (!getparstring("file_iter", &file_iter)) file_iter = NULL; - if (!getparint("verbose", &verbose)) verbose = 0; - if (file_tinv == NULL && file_shot == NULL) - verr("file_tinv and file_shot cannot be both input pipe"); - if (!getparstring("file_green", &file_green)) { - if (verbose) vwarn("parameter file_green not found, assume pipe"); - file_green = NULL; - } - if (!getparfloat("fmin", &fmin)) fmin = 0.0; - if (!getparfloat("fmax", &fmax)) fmax = 70.0; - if (!getparint("ixa", &ixa)) ixa = 0; - if (!getparint("ixb", &ixb)) ixb = ixa; - if (!getparint("reci", &reci)) reci = 0; - if (!getparfloat("weight", &weight)) weight = 1.0; - if (!getparint("tap", &tap)) tap = 0; - if (!getparint("ntap", &ntap)) ntap = 0; - - if(!getparint("niter", &niter)) niter = 10; - if(!getparint("hw", &hw)) hw = 15; - if(!getparint("smooth", &smooth)) smooth = 5; - if(!getparint("above", &above)) above = 0; - if(!getparint("shift", &shift)) shift=12; - - if (reci && ntap) vwarn("tapering influences the reciprocal result"); - -/*================ Reading info about shot and initial operator sizes ================*/ - - ngath = 0; /* setting ngath=0 scans all traces; n2 contains maximum traces/gather */ - ret = getFileInfo(file_tinv, &n1, &n2, &ngath, &d1, &d2, &f1, &f2, &xmin, &xmax, &scl, &ntraces); - Nsyn = ngath; - nxs = n2; - nts = n1; - dxs = d2; dts = d1; - fxs = f2; fts = f1; - - ngath = 0; /* setting ngath=0 scans all traces; nx contains maximum traces/gather */ - ret = getFileInfo(file_shot, &nt, &nx, &ngath, &d1, &dx, &ft, &fx, &xmin, &xmax, &scl, &ntraces); - nshots = ngath; - assert (nxs >= nshots); - - if (!getparfloat("dt", &dt)) dt = d1; - - ntfft = optncr(MAX(nt, nts)); - nf = ntfft/2+1; - df = 1.0/(ntfft*dt); - nfreq = ntfft/2+1; - nw_low = (int)MIN((fmin*ntfft*dt), nfreq-1); - nw_low = MAX(nw_low, 1); - nw_high = MIN((int)(fmax*ntfft*dt), nfreq-1); - nw = nw_high - nw_low + 1; - scl = 1.0/((float)ntfft); - -/*================ Allocating all data arrays ================*/ - - Fop = (complex *)malloc(nxs*nw*Nsyn*sizeof(complex)); - xrcvsyn = (float *)calloc(Nsyn*nxs,sizeof(float)); - xsyn = (float *)malloc(Nsyn*sizeof(float)); - zsyn = (float *)malloc(Nsyn*sizeof(float)); - tapersy = (float *)malloc(nxs*sizeof(float)); - xnxsyn = (int *)calloc(Nsyn,sizeof(int)); - green = (float *)calloc(Nsyn*nxs*ntfft,sizeof(float)); - f2p = (float *)calloc(Nsyn*nxs*ntfft,sizeof(float)); - pmin = (float *)calloc(Nsyn*nxs*ntfft,sizeof(float)); - Gmin = (float *)calloc(Nsyn*nxs*ntfft,sizeof(float)); - Gplus = (float *)calloc(Nsyn*nxs*ntfft,sizeof(float)); - f1plus = (float *)calloc(Nsyn*nxs*ntfft,sizeof(float)); - f1min = (float *)calloc(Nsyn*nxs*ntfft,sizeof(float)); - iRN = (float *)calloc(Nsyn*nxs*ntfft,sizeof(float)); - Ni = (float *)calloc(Nsyn*nxs*ntfft,sizeof(float)); - ctrace = (complex *)malloc(ntfft*sizeof(complex)); - trace = (float *)malloc(ntfft*sizeof(float)); - muteW = (float *)calloc(Nsyn*nxs,sizeof(float)); - G_d = (float *)calloc(Nsyn*nxs*ntfft,sizeof(float)); - ixpossyn = (int *)malloc(nxs*sizeof(int)); - - Refl = (complex *)malloc(nw*nx*nshots*sizeof(complex)); - tapersh = (float *)malloc(nx*sizeof(float)); - xsrc = (float *)calloc(nshots,sizeof(float)); - zsrc = (float *)calloc(nshots,sizeof(float)); - xrcv = (float *)calloc(nshots*nx,sizeof(float)); - xnx = (int *)calloc(nshots,sizeof(int)); - -/*================ Read and define mute window based on focusing operator(s) ================*/ -/* Fop = p_0^+ = G_d (-t) ~ Tinv */ - - mode=-1; /* apply complex conjugate to read in data */ - readTinvData(file_tinv, xrcvsyn, xsyn, zsyn, xnxsyn, Fop, nw, nw_low, Nsyn, nxs, ntfft, - mode, muteW, G_d, hw, verbose); - /* reading data added zero's to the number of time samples to be the same as ntfft */ - nts = ntfft; - - /* define tapers to taper edges of acquisition */ - if (tap == 1 || tap == 3) { - for (j = 0; j < ntap; j++) - tapersy[j] = (cos(PI*(j-ntap)/ntap)+1)/2.0; - for (j = ntap; j < nxs-ntap; j++) - tapersy[j] = 1.0; - for (j = nxs-ntap; j < nxs; j++) - tapersy[j] =(cos(PI*(j-(nxs-ntap))/ntap)+1)/2.0; - } - else { - for (j = 0; j < nxs; j++) tapersy[j] = 1.0; - } - if (tap == 1 || tap == 3) { - if (verbose) vmess("Taper for operator applied ntap=%d", ntap); - for (l = 0; l < Nsyn; l++) { - for (j = 1; j < nw; j++) { - for (i = 0; i < nxs; i++) { - Fop[l*nxs*nw+j*nxs+i].r *= tapersy[i]; - Fop[l*nxs*nw+j*nxs+i].i *= tapersy[i]; - } - } - } - } - - /* check consistency of header values */ - if (xrcvsyn[0] != 0 || xrcvsyn[1] != 0 ) fxs = xrcvsyn[0]; - fxs2 = fxs + (float)(nxs-1)*dxs; - dxf = (xrcvsyn[nxs-1] - xrcvsyn[0])/(float)(nxs-1); - if (NINT(dxs*1e3) != NINT(fabs(dxf)*1e3)) { - vmess("dx in hdr.d1 (%.3f) and hdr.gx (%.3f) not equal",d2, dxf); - if (dxf != 0) dxs = fabs(dxf); - vmess("dx in operator => %f", dxs); - } - -/*================ Reading shot records ================*/ - - mode=1; - readShotData(file_shot, xrcv, xsrc, zsrc, xnx, Refl, nw, nw_low, ngath, nx, nx, ntfft, - mode, weight, verbose); - - tapersh = (float *)malloc(nx*sizeof(float)); - if (tap == 2 || tap == 3) { - for (j = 0; j < ntap; j++) - tapersh[j] = (cos(PI*(j-ntap)/ntap)+1)/2.0; - for (j = ntap; j < nx-ntap; j++) - tapersh[j] = 1.0; - for (j = nx-ntap; j < nx; j++) - tapersh[j] =(cos(PI*(j-(nx-ntap))/ntap)+1)/2.0; - } - else { - for (j = 0; j < nx; j++) tapersh[j] = 1.0; - } - if (tap == 2 || tap == 3) { - if (verbose) vmess("Taper for shots applied ntap=%d", ntap); - for (l = 0; l < nshots; l++) { - for (j = 1; j < nw; j++) { - for (i = 0; i < nx; i++) { - Refl[l*nx*nw+j*nx+i].r *= tapersh[i]; - Refl[l*nx*nw+j*nx+i].i *= tapersh[i]; - } - } - } - } - free(tapersh); - - /* check consistency of header values */ - fxf = xsrc[0]; - if (nx > 1) dxf = (xrcv[0] - xrcv[nx-1])/(float)(nx-1); - else dxf = d2; - if (NINT(dx*1e3) != NINT(fabs(dxf)*1e3)) { - vmess("dx in hdr.d1 (%.3f) and hdr.gx (%.3f) not equal",dx, dxf); - if (dxf != 0) dx = fabs(dxf); - else verr("gx hdrs not set"); - vmess("dx used => %f", dx); - } - - dxsrc = (float)xsrc[1] - xsrc[0]; - if (dxsrc == 0) { - vwarn("sx hdrs are not filled in!!"); - dxsrc = dx; - } - -/*================ Check the size of the files ================*/ - - if (NINT(dxsrc/dx)*dx != NINT(dxsrc)) { - vwarn("source (%.2f) and receiver step (%.2f) don't match",dxsrc,dx); - if (reci == 2) vwarn("step used from operator (%.2f) ",dxs); - } - di = NINT(dxf/dxs); - if ((NINT(di*dxs) != NINT(dxf)) && verbose) - vwarn("dx in receiver (%.2f) and operator (%.2f) don't match",dx,dxs); - if (nt != nts) - vmess("Time samples in shot (%d) and focusing operator (%d) are not equal",nt, nts); - if (verbose) { - vmess("Number of focusing operators = %d", Nsyn); - vmess("Number of receivers in focusop = %d", nxs); - vmess("number of shots = %d", nshots); - vmess("number of receiver/shot = %d", nx); - vmess("first model position = %.2f", fxs); - vmess("last model position = %.2f", fxs2); - vmess("first source position fxf = %.2f", fxf); - vmess("source distance dxsrc = %.2f", dxsrc); - vmess("last source position = %.2f", fxf+(nshots-1)*dxsrc); - vmess("receiver distance dxf = %.2f", dxf); - vmess("direction of increasing traces = %d", di); - vmess("number of time samples (nt,nts) = %d (%d,%d)", ntfft, nt, nts); - vmess("time sampling = %e ", dt); - if (file_green != NULL) vmess("Green output file = %s ", file_green); - if (file_gmin != NULL) vmess("Gmin output file = %s ", file_gmin); - if (file_gplus != NULL) vmess("Gplus output file = %s ", file_gplus); - if (file_pmin != NULL) vmess("Pmin output file = %s ", file_pmin); - if (file_f2 != NULL) vmess("f2 (=pplus) output file = %s ", file_f2); - if (file_f1min != NULL) vmess("f1min output file = %s ", file_f1min); - if (file_f1plus != NULL)vmess("f1plus output file = %s ", file_f1plus); - if (file_iter != NULL) vmess("Iterations output file = %s ", file_iter); - } - t1 = wallclock_time(); - tread = t1-t0; - -/*================ initializations ================*/ - - if (ixa || ixb) n2out = ixa + ixb + 1; - else if (reci) n2out = nxs; - else n2out = nshots; - mem = Nsyn*n2out*ntfft*sizeof(float)/1048576.0; - if (verbose) { - vmess("number of output traces = %d", n2out); - vmess("number of output samples = %d", ntfft); - vmess("Size of output data = %.1f Mb", mem); - } - - /* dry-run of synthesis to get all x-positions calcalated by the integration */ - synthesisPosistions(nx, nt, nxs, nts, dt, xsyn, Nsyn, xrcv, xsrc, fxs2, fxs, - dxs, dxsrc, dx, ixa, ixb, reci, nshots, ixpossyn, &npossyn, verbose); - if (verbose) { - vmess("synthesisPosistions: nshots=%d npossyn=%d", nshots, npossyn); - } - -/*================ set variables for output data ================*/ - - n1 = nts; n2 = n2out; - f1 = ft; f2 = fxs+dxs*ixpossyn[0]; - d1 = dt; - if (reci == 0) d2 = dxsrc; - else if (reci == 1) d2 = dxs; - else if (reci == 2) d2 = dx; - - hdrs_out = (segy *) calloc(n2,sizeof(segy)); - if (hdrs_out == NULL) verr("allocation for hdrs_out"); - size = nxs*nts; - - for (i = 0; i < n2; i++) { - hdrs_out[i].ns = n1; - hdrs_out[i].trid = 1; - hdrs_out[i].dt = dt*1000000; - hdrs_out[i].f1 = f1; - hdrs_out[i].f2 = f2; - hdrs_out[i].d1 = d1; - hdrs_out[i].d2 = d2; - hdrs_out[i].trwf = n2out; - hdrs_out[i].scalco = -1000; - hdrs_out[i].gx = NINT(1000*(f2+i*d2)); - hdrs_out[i].scalel = -1000; - hdrs_out[i].tracl = i+1; - } - -/*================ number of Marchenko iterations ================*/ - - for (iter=0; iter<niter; iter++) { - - t2 = wallclock_time(); - -/*================ construction of Ni(-t) = - \int R(x,t) Fop(t) ================*/ - - synthesis(Refl, Fop, iRN, nx, nt, nxs, nts, dt, xsyn, Nsyn, - xrcv, xsrc, fxs2, fxs, dxs, dxsrc, dx, ixa, ixb, ntfft, nw, nw_low, nw_high, - reci, nshots, verbose); - - /* set Fop to zero, so new operator can be defined within ixpossyn points */ - memset(&Fop[0].r, 0, Nsyn*nxs*nw*2*sizeof(float)); - - if (file_iter != NULL) { - writeDataIter(file_iter, iRN, hdrs_out, ntfft, nxs, d2, f2, n2out, Nsyn, xsyn, zsyn, iter); - } - /* N_k(x,t) = -N_(k-1)(x,-t) */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j = 0; - Ni[l*nxs*nts+i*nts+j] = -iRN[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - Ni[l*nxs*nts+i*nts+j] = -iRN[l*nxs*nts+i*nts+nts-j]; - } - } - } - /* initialization */ - if (iter==0) { - /* N_0(t) = M_0(t) = -p0^-(x,-t) = -(R * T_d^inv)(-t) */ - - /* p0^-(x,t) = iRN = (R * T_d^inv)(t) */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j = 0; - pmin[l*nxs*nts+i*nts+j] = iRN[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - pmin[l*nxs*nts+i*nts+j] = iRN[l*nxs*nts+i*nts+j]; - } - } - } - - applyMute(Ni, muteW, smooth, above, Nsyn, nxs, nts, xsrc, ixpossyn, npossyn, shift); - - /* even iterations: => - f_1^-(-t) = windowed(iRN) */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j = 0; - f1min[l*nxs*nts+i*nts+j] -= Ni[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - f1min[l*nxs*nts+i*nts+j] -= Ni[l*nxs*nts+i*nts+nts-j]; - } - } - } - - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j = 0; - //ix = NINT((xsrc[i]-fxs)/dxs); - ix = ixpossyn[i]; - //fprintf(stderr,"i=%d xsrc=%f ix=%d ixpossyn=%d\n", i, xsrc[i], ix, ixpossyn[i]); - f2p[l*nxs*nts+i*nts+j] = G_d[l*nxs*nts+ix*nts+j] + Ni[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - f2p[l*nxs*nts+i*nts+j] = G_d[l*nxs*nts+ix*nts+j] + Ni[l*nxs*nts+i*nts+j]; - } - } - } - /* Pressure based scheme */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j=0; - ix = ixpossyn[i]; - green[l*nxs*nts+i*nts+j] = G_d[l*nxs*nts+ix*nts+j] + pmin[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - green[l*nxs*nts+i*nts+j] = G_d[l*nxs*nts+ix*nts-j]+ pmin[l*nxs*nts+i*nts+j]; - } - } - } - } - else if (iter==1) { - /* Ni(x,t) = -\int R(x,t) M_0(x,-t) dxdt*/ - - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j = 0; - pmin[l*nxs*nts+i*nts+j] -= Ni[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - pmin[l*nxs*nts+i*nts+j] -= Ni[l*nxs*nts+i*nts+nts-j]; - } - } - } - applyMute(Ni, muteW, smooth, above, Nsyn, nxs, nts, xsrc, ixpossyn, npossyn, shift); - /* Pressure based scheme */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j=0; - green[l*nxs*nts+i*nts+j] = f2p[l*nxs*nts+i*nts+j] + pmin[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - green[l*nxs*nts+i*nts+j] = f2p[l*nxs*nts+i*nts+nts-j] + pmin[l*nxs*nts+i*nts+j]; - } - } - } - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j = 0; - f2p[l*nxs*nts+i*nts+j] += Ni[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - f2p[l*nxs*nts+i*nts+j] += Ni[l*nxs*nts+i*nts+j]; - } - } - } - /* odd iterations: M_m^+ */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j = 0; - ix = ixpossyn[i]; - f1plus[l*nxs*nts+i*nts+j] = G_d[l*nxs*nts+ix*nts+j] + Ni[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - f1plus[l*nxs*nts+i*nts+j] = G_d[l*nxs*nts+ix*nts+j] + Ni[l*nxs*nts+i*nts+j]; - } - } - } - } - else { - /* next iterations */ - /* N_k(x,t) = -N_(k-1)(x,-t) */ - - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j = 0; - pmin[l*nxs*nts+i*nts+j] -= Ni[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - pmin[l*nxs*nts+i*nts+j] -= Ni[l*nxs*nts+i*nts+nts-j]; - } - } - } - applyMute(Ni, muteW, smooth, above, Nsyn, nxs, nts, xsrc, ixpossyn, npossyn, shift); - - /* compute full Green's function G = p^+(-t) + p^-(t) */ - if (iter == niter-1) { - /* Pressure based scheme */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j=0; - green[l*nxs*nts+i*nts+j] = f2p[l*nxs*nts+i*nts+j] + pmin[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - green[l*nxs*nts+i*nts+j] = f2p[l*nxs*nts+i*nts+nts-j] + pmin[l*nxs*nts+i*nts+j]; - } - } - } - } /* end if for last iteration */ - - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j = 0; - f2p[l*nxs*nts+i*nts+j] += Ni[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - f2p[l*nxs*nts+i*nts+j] += Ni[l*nxs*nts+i*nts+j]; - } - } - } - - - if (iter % 2 == 0) { /* even iterations: => - f_1^- (-t) = pmin(t) */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j = 0; - f1min[l*nxs*nts+i*nts+j] -= Ni[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - f1min[l*nxs*nts+i*nts+j] -= Ni[l*nxs*nts+i*nts+nts-j]; - } - } - } - } - else {/* odd iterations: M_m^+ */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j = 0; - f1plus[l*nxs*nts+i*nts+j] += Ni[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - f1plus[l*nxs*nts+i*nts+j] += Ni[l*nxs*nts+i*nts+j]; - } - } - } - } - - } /* end else (iter!=0) branch */ - - - t3 = wallclock_time(); - tsyn += t3 - t2; - - /* compute up and downgoing Green's function G^+,- G^+,+ */ - /* f1 based scheme */ - if (iter == niter-1) { - /* transform f1+ to frequency domain */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - for (j = 0; j < nts; j++) { - trace[j] = f1plus[l*nxs*nts+i*nts+j]; - } - rc1fft(&trace[0],ctrace,ntfft,-1); - ix = ixpossyn[i]; - for (iw=0; iw<nw; iw++) { - Fop[l*nxs*nw+iw*nxs+ix].r = ctrace[nw_low+iw].r; - Fop[l*nxs*nw+iw*nxs+ix].i = ctrace[nw_low+iw].i; - } - } - } - - synthesis(Refl, Fop, iRN, nx, nt, nxs, nts, dt, xsyn, Nsyn, - xrcv, xsrc, fxs2, fxs, dxs, dxsrc, dx, ixa, ixb, ntfft, nw, nw_low, nw_high, - reci, nshots, verbose); - - /* compute upgoing Green's G^-,+ */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j=0; - Gmin[l*nxs*nts+i*nts+j] = iRN[l*nxs*nts+i*nts+j] - f1min[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - Gmin[l*nxs*nts+i*nts+j] = iRN[l*nxs*nts+i*nts+j] - f1min[l*nxs*nts+i*nts+j]; - } - } - } - /* Apply mute with window for Gmin */ - applyMute(Gmin, muteW, smooth, 1, Nsyn, nxs, nts, xsrc, ixpossyn, npossyn, shift); - - /* transform f1- to frequency domain */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - for (j = 0; j < nts; j++) { - trace[j] = f1min[l*nxs*nts+i*nts+j]; - } - rc1fft(&trace[0],ctrace,ntfft,-1); - ix = ixpossyn[i]; - for (iw=0; iw<nw; iw++) { - Fop[l*nxs*nw+iw*nxs+ix].r = ctrace[nw_low+iw].r; - Fop[l*nxs*nw+iw*nxs+ix].i = -ctrace[nw_low+iw].i; - } - } - } - - synthesis(Refl, Fop, iRN, nx, nt, nxs, nts, dt, xsyn, Nsyn, - xrcv, xsrc, fxs2, fxs, dxs, dxsrc, dx, ixa, ixb, ntfft, nw, nw_low, nw_high, - reci, nshots, verbose); - - /* compute downgoing Green's G^+,+ */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - j=0; - Gplus[l*nxs*nts+i*nts+j] = -iRN[l*nxs*nts+i*nts+j] + f1plus[l*nxs*nts+i*nts+j]; - for (j = 1; j < nts; j++) { - Gplus[l*nxs*nts+i*nts+j] = -iRN[l*nxs*nts+i*nts+j] + f1plus[l*nxs*nts+i*nts+nts-j]; - } - } - } - } /* end if for last iteration */ - - /* transform muted Ni to frequency domain */ - for (l = 0; l < Nsyn; l++) { - for (i = 0; i < npossyn; i++) { - rc1fft(&Ni[l*nxs*nts+i*nts],ctrace,ntfft,-1); - ix = ixpossyn[i]; - for (iw=0; iw<nw; iw++) { - Fop[l*nxs*nw+iw*nxs+ix].r = ctrace[nw_low+iw].r; - Fop[l*nxs*nw+iw*nxs+ix].i = ctrace[nw_low+iw].i; - } - } - } - t2 = wallclock_time(); - tfft += t2 - t3; - - if (verbose) vmess("*** Iteration %d finished ***", iter); - - } /* end of iterations */ - - t2 = wallclock_time(); - if (verbose) { - vmess("Total CPU-time marchenko = %.3f", t2-t0); - vmess("with CPU-time synthesis = %.3f", tsyn); - vmess("and CPU-time fft data = %.3f", tfft); - vmess("and CPU-time read data = %.3f", tread); - } - -/*================ write output files ================*/ - -/* - n1 = nts; n2 = n2out; - f1 = ft; f2 = fxs; - d1 = dt; - if (reci == 0) d2 = dxsrc; - else if (reci == 1) d2 = dxs; - else if (reci == 2) d2 = dx; - - hdrs_out = (segy *) calloc(n2,sizeof(segy)); - if (hdrs_out == NULL) verr("allocation for hdrs_out"); - size = nxs*nts; -*/ - - fp_out = fopen(file_green, "w+"); - if (fp_out==NULL) verr("error on creating output file %s", file_green); - if (file_gmin != NULL) { - fp_gmin = fopen(file_gmin, "w+"); - if (fp_gmin==NULL) verr("error on creating output file %s", file_gmin); - } - if (file_gplus != NULL) { - fp_gplus = fopen(file_gplus, "w+"); - if (fp_gplus==NULL) verr("error on creating output file %s", file_gplus); - } - if (file_f2 != NULL) { - fp_f2 = fopen(file_f2, "w+"); - if (fp_f2==NULL) verr("error on creating output file %s", file_f2); - } - if (file_pmin != NULL) { - fp_pmin = fopen(file_pmin, "w+"); - if (fp_pmin==NULL) verr("error on creating output file %s", file_pmin); - } - if (file_f1plus != NULL) { - fp_f1plus = fopen(file_f1plus, "w+"); - if (fp_f1plus==NULL) verr("error on creating output file %s", file_f1plus); - } - if (file_f1min != NULL) { - fp_f1min = fopen(file_f1min, "w+"); - if (fp_f1min==NULL) verr("error on creating output file %s", file_f1min); - } - - - tracf = 1; - for (l = 0; l < Nsyn; l++) { - if (ixa || ixb) f2 = xsyn[l]-ixb*d2; - else { - if (reci) f2 = fxs; - else f2 = fxf; - } - - for (i = 0; i < n2; i++) { - hdrs_out[i].fldr = l+1; - hdrs_out[i].sx = NINT(xsyn[l]*1000); - hdrs_out[i].offset = (long)NINT((f2+i*d2) - xsyn[l]); - hdrs_out[i].tracf = tracf++; - hdrs_out[i].selev = NINT(zsyn[l]*1000); - hdrs_out[i].sdepth = NINT(-zsyn[l]*1000); - hdrs_out[i].f1 = f1; - } - - ret = writeData(fp_out, (float *)&green[l*size], hdrs_out, n1, n2); - if (ret < 0 ) verr("error on writing output file."); - - if (file_gmin != NULL) { - ret = writeData(fp_gmin, (float *)&Gmin[l*size], hdrs_out, n1, n2); - if (ret < 0 ) verr("error on writing output file."); - } - if (file_gplus != NULL) { - ret = writeData(fp_gplus, (float *)&Gplus[l*size], hdrs_out, n1, n2); - if (ret < 0 ) verr("error on writing output file."); - } - if (file_f2 != NULL) { - ret = writeData(fp_f2, (float *)&f2p[l*size], hdrs_out, n1, n2); - if (ret < 0 ) verr("error on writing output file."); - } - if (file_pmin != NULL) { - ret = writeData(fp_pmin, (float *)&pmin[l*size], hdrs_out, n1, n2); - if (ret < 0 ) verr("error on writing output file."); - } - if (file_f1plus != NULL) { - /* rotate to get t=0 in the middle */ - for (i = 0; i < n2; i++) { - hdrs_out[i].f1 = -n1*0.5*dt; - memcpy(&trace[0],&f1plus[l*size+i*nts],nts*sizeof(float)); - for (j = 0; j < n1/2; j++) { - f1plus[l*size+i*nts+n1/2+j] = trace[j]; - } - for (j = n1/2; j < n1; j++) { - f1plus[l*size+i*nts+j-n1/2] = trace[j]; - } - } - ret = writeData(fp_f1plus, (float *)&f1plus[l*size], hdrs_out, n1, n2); - if (ret < 0 ) verr("error on writing output file."); - } - if (file_f1min != NULL) { - /* rotate to get t=0 in the middle */ - for (i = 0; i < n2; i++) { - hdrs_out[i].f1 = -n1*0.5*dt; - memcpy(&trace[0],&f1min[l*size+i*nts],nts*sizeof(float)); - for (j = 0; j < n1/2; j++) { - f1min[l*size+i*nts+n1/2+j] = trace[j]; - } - for (j = n1/2; j < n1; j++) { - f1min[l*size+i*nts+j-n1/2] = trace[j]; - } - } - ret = writeData(fp_f1min, (float *)&f1min[l*size], hdrs_out, n1, n2); - if (ret < 0 ) verr("error on writing output file."); - } - } - ret = fclose(fp_out); - if (file_gplus != NULL) {ret += fclose(fp_gplus);} - if (file_gmin != NULL) {ret += fclose(fp_gmin);} - if (file_f2 != NULL) {ret += fclose(fp_f2);} - if (file_pmin != NULL) {ret += fclose(fp_pmin);} - if (file_f1plus != NULL) {ret += fclose(fp_f1plus);} - if (file_f1min != NULL) {ret += fclose(fp_f1min);} - if (ret < 0) verr("err %d on closing output file",ret); - - if (verbose) { - t1 = wallclock_time(); - vmess("and CPU-time write data = %.3f", t1-t2); - } - -/*================ free memory ================*/ - - free(hdrs_out); - free(tapersy); - free(Ni); - - exit(0); -} - - -/*================ Convolution and Integration ================*/ - -void synthesis(complex *Refl, complex *Fop, float *iRN, int nx, int nt, int nxs, int nts, float dt, float *xsyn, int Nsyn, float *xrcv, float *xsrc, float fxs2, float fxs, float dxs, float dxsrc, float dx, int ixa, int ixb, int ntfft, int nw, int nw_low, int nw_high, int reci, int nshots, int verbose) -{ - int nfreq, size, iox, inx; - float scl; - int i, j, l, m, ixsrc, ix, ixrcv, dosrc, k; - float *rdata, *p, **dum, x0, x1; - static double t0, t1, tfft, t; - complex *sum, *cdata, tmp, ts, to; - int npe; - - size = nxs*nts; - nfreq = ntfft/2+1; - /* scale factor 1/N for backward FFT, - * scale dt for correlation/convolution along time, - * scale dx (or dxsrc) for integration over receiver (or shot) coordinates */ - scl = 1.0*dt/((float)ntfft); - - t0 = wallclock_time(); - - /* reset output data to zero */ - memset(&iRN[0], 0, Nsyn*nxs*nts*sizeof(float)); - - for (k=0; k<nshots; k++) { - - ixsrc = NINT((xsrc[k] - fxs)/dxs); -/* if (verbose>=3) { - vmess("source position: %.2f in operator %d", xsrc[k], ixsrc); - vmess("receiver positions: %.2f <--> %.2f", xrcv[k*nx+0], xrcv[k*nx+nx-1]); - } -*/ - if ((NINT(xsrc[k]-fxs2) > 0) || (NINT(xrcv[k*nx+nx-1]-fxs2) > 0) || - (NINT(xrcv[k*nx+nx-1]-fxs) < 0) || (NINT(xsrc[k]-fxs) < 0) || - (NINT(xrcv[k*nx+0]-fxs) < 0) || (NINT(xrcv[k*nx+0]-fxs2) > 0) ) { - vwarn("source/receiver positions are outside synthesis model"); - vwarn("integration calculation is stopped at gather %d", k); - vmess("xsrc = %.2f xrcv_1 = %.2f xrvc_N = %.2f", xsrc[k], xrcv[k*nx+0], xrcv[k*nx+nx-1]); - break; - } - - - iox = 0; inx = nx; - -/*================ SYNTHESIS ================*/ - -#ifdef _OPENMP - npe = omp_get_max_threads(); - /* parallelisation is over number of virtual source positions (Nsyn) */ - if (npe > Nsyn) { - vmess("Number of OpenMP threads set to %d (was %d)", Nsyn, npe); - omp_set_num_threads(Nsyn); - } -#endif - -#pragma omp parallel default(none) \ - shared(iRN, dx, npe, nw, verbose) \ - shared(Refl, Nsyn, reci, xrcv, xsrc, xsyn, fxs, nxs, dxs) \ - shared(nx, ixa, ixb, dxsrc, iox, inx, k, nfreq, nw_low, nw_high) \ - shared(Fop, size, nts, ntfft, scl, ixsrc, stderr) \ - private(l, x0, x1, ix, dosrc, j, m, i, ixrcv, sum, rdata, tmp, ts, to) - { /* start of parallel region */ - sum = (complex *)malloc(nfreq*sizeof(complex)); - rdata = (float *)calloc(ntfft,sizeof(float)); -#pragma omp for - for (l = 0; l < Nsyn; l++) { - - ix = k; - x0 = fxs; - x1 = fxs+dxs*nxs; - dosrc = 1; - for (j = 0; j < nfreq; j++) sum[j].r = sum[j].i = 0.0; - for (j = nw_low, m = 0; j <= nw_high; j++, m++) { - for (i = iox; i < inx; i++) { - ixrcv = NINT((xrcv[k*nx+i]-fxs)/dxs); - tmp = Fop[l*nw*nxs+m*nxs+ixrcv]; - sum[j].r += Refl[k*nw*nx+m*nx+i].r*tmp.r - - Refl[k*nw*nx+m*nx+i].i*tmp.i; - sum[j].i += Refl[k*nw*nx+m*nx+i].i*tmp.r + - Refl[k*nw*nx+m*nx+i].r*tmp.i; - } - } -#pragma omp critical -{ - cr1fft(sum, rdata, ntfft, 1); -} - /* dx = receiver distance */ - for (j = 0; j < nts; j++) - iRN[l*size+ix*nts+j] += rdata[j]*scl*dx; - - } /* end of parallel Nsyn loop */ - - free(sum); - free(rdata); - -#pragma omp single -{ -#ifdef _OPENMP - npe = omp_get_num_threads(); -#endif -} - } /* end of parallel region */ - - if (verbose>3) vmess("*** Shot gather %d processed ***", k); - - } /* end of nshots (k) loop */ - - t = wallclock_time() - t0; - if (verbose) { - vmess("OMP: parallel region = %f seconds (%d threads)", t, npe); - } - - return; -} - -void synthesisPosistions(int nx, int nt, int nxs, int nts, float dt, float *xsyn, int Nsyn, float *xrcv, float *xsrc, float fxs2, float fxs, float dxs, float dxsrc, float dx, int ixa, int ixb, int reci, int nshots, int *ixpossyn, int *npossyn, int verbose) -{ - int nfreq, size, iox, inx; - float scl; - int i, j, l, m, ixsrc, ix, ixrcv, dosrc, k; - float *rdata, *p, **dum, x0, x1; - static double t0, t1, tfft, t; - complex *sum, *cdata, tmp, ts, to; - int npe; - - -/*================ SYNTHESIS ================*/ - - for (l = 0; l < 1; l++) { /* assuming all synthesis operators cover the same lateral area */ -// for (l = 0; l < Nsyn; l++) { - *npossyn=0; - - for (k=0; k<nshots; k++) { - - ixsrc = NINT((xsrc[k] - fxs)/dxs); - if (verbose>=3) { - vmess("source position: %.2f in operator %d", xsrc[k], ixsrc); - vmess("receiver positions: %.2f <--> %.2f", xrcv[k*nx+0], xrcv[k*nx+nx-1]); - } - - if ((NINT(xsrc[k]-fxs2) > 0) || (NINT(xrcv[k*nx+nx-1]-fxs2) > 0) || - (NINT(xrcv[k*nx+nx-1]-fxs) < 0) || (NINT(xsrc[k]-fxs) < 0) || - (NINT(xrcv[k*nx+0]-fxs) < 0) || (NINT(xrcv[k*nx+0]-fxs2) > 0) ) { - vwarn("source/receiver positions are outside synthesis model"); - vwarn("integration calculation is stopped at gather %d", k); - vmess("xsrc = %.2f xrcv_1 = %.2f xrvc_N = %.2f", xsrc[k], xrcv[k*nx+0], xrcv[k*nx+nx-1]); - break; - } - - iox = 0; inx = nx; - - if (ixa || ixb) { - if (reci == 0) { - x0 = xsyn[l]-ixb*dxsrc; - x1 = xsyn[l]+ixa*dxsrc; - if ((xsrc[k] < x0) || (xsrc[k] > x1)) continue; - ix = NINT((xsrc[k]-x0)/dxsrc); - dosrc = 1; - } - else if (reci == 1) { - x0 = xsyn[l]-ixb*dxs; - x1 = xsyn[l]+ixa*dxs; - if (((xsrc[k] < x0) || (xsrc[k] > x1)) && - (xrcv[k*nx+0] < x0) && (xrcv[k*nx+nx-1] < x0)) continue; - if (((xsrc[k] < x0) || (xsrc[k] > x1)) && - (xrcv[k*nx+0] > x1) && (xrcv[k*nx+nx-1] > x1)) continue; - if ((xsrc[k] < x0) || (xsrc[k] > x1)) dosrc = 0; - else dosrc = 1; - ix = NINT((xsrc[k]-x0)/dxs); - } - else if (reci == 2) { - if (NINT(dxsrc/dx)*dx != NINT(dxsrc)) dx = dxs; - x0 = xsyn[l]-ixb*dx; - x1 = xsyn[l]+ixa*dx; - if ((xrcv[k*nx+0] < x0) && (xrcv[k*nx+nx-1] < x0)) continue; - if ((xrcv[k*nx+0] > x1) && (xrcv[k*nx+nx-1] > x1)) continue; - } - } - else { - ix = k; - x0 = fxs; - x1 = fxs+dxs*nxs; - dosrc = 1; - } - if (reci == 1 && dosrc) ix = NINT((xsrc[k]-x0)/dxs); - - if (reci < 2 && dosrc) { - ixpossyn[*npossyn]=ixsrc; - *npossyn += 1; - } -// fprintf(stderr,"ixpossyn[%d] = %d ixsrc=%d ix=%d\n", *npossyn-1, ixpossyn[*npossyn-1], ixsrc, ix); - - if (reci == 1 || reci == 2) { - for (i = iox; i < inx; i++) { - if ((xrcv[k*nx+i] < x0) || (xrcv[k*nx+i] > x1)) continue; - if (reci == 1) ix = NINT((xrcv[k*nx+i]-x0)/dxs); - else ix = NINT((xrcv[k*nx+i]-x0)/dx); - - ixpossyn[*npossyn]=ix; - *npossyn += 1; - - } - } - - } /* end of Nsyn loop */ - - } /* end of nshots (k) loop */ - - return; -} -- GitLab