From f7a17924f9d0a1d407482fe2411b1bbb78bd042a Mon Sep 17 00:00:00 2001 From: JBrackenhoff <J.A.Brackenhoff@tudelft.nl> Date: Wed, 22 Aug 2018 15:00:08 +0200 Subject: [PATCH] HOMG --- marchenko_applications/HomG.c | 57 +++++++++++-- marchenko_applications/homogeneousg.c | 118 ++++++++++++++++---------- 2 files changed, 125 insertions(+), 50 deletions(-) diff --git a/marchenko_applications/HomG.c b/marchenko_applications/HomG.c index a1825fc..3d855cb 100755 --- a/marchenko_applications/HomG.c +++ b/marchenko_applications/HomG.c @@ -27,6 +27,7 @@ double wallclock_time(void); int writeData(FILE *fp, float *data, segy *hdrs, int n1, int n2); int readSnapData(char *filename, float *data, segy *hdr, int ngath, int nx, int ntfft, int sx, int ex, int sz, int ez); int topdet(float *data, int nt); +void conjugate(float *data, int nsam, int nrec, float dt); void scl_data(float *data, int nsam, int nrec, float scl, float *datout, int nsamout); void pad_data(float *data, int nsam, int nrec, int nsamout, float *datout); @@ -180,6 +181,7 @@ int main (int argc, char **argv) shotdata_jkz[ix*nt+it] = shotdata[ix*nt+it]; } } + conjugate(shotdata_jkz, nt, nx, dt); depthDiff(shotdata_jkz, nt, nx, dt, dx, fmin, fmax, cp, 1); if (verbose) vmess("Applied jkz to source data"); } @@ -220,8 +222,8 @@ int main (int argc, char **argv) //Ghom[(it+nt/2)*nxs*nzs+is*nzs+ir] = -conv[ix*nt+it]; //Ghom[it*nxs*nzs+is*nzs+ir] = -conv[ix*nt+(it+nt/2)]; for (it=0; it<nt/2; it++) { - Ghom[(it+nt/2)*nxs*nzs+is*nzs+ir] -= conv[ix*nt+it]/rho; - Ghom[it*nxs*nzs+is*nzs+ir] -= conv[ix*nt+(it+nt/2)]/rho; + Ghom[(it+nt/2)*nxs*nzs+is*nzs+ir] += conv[ix*nt+it]/rho; + Ghom[it*nxs*nzs+is*nzs+ir] += conv[ix*nt+(it+nt/2)]/rho; } } } @@ -233,18 +235,18 @@ int main (int argc, char **argv) //it=0; //Ghom[(it+nt/2)*nxs*nzs+is*nzs+ir] -= 2*conv[ix*nt+it]; for (it=0; it<nt/2; it++) { - Ghom[(it+nt/2)*nxs*nzs+is*nzs+ir] -= 2*conv[ix*nt+it]/rho; - Ghom[it*nxs*nzs+is*nzs+ir] -= 2*conv[ix*nt+(it+nt/2)]/rho; + Ghom[(it+nt/2)*nxs*nzs+is*nzs+ir] += 2*conv[ix*nt+it]/rho; + Ghom[it*nxs*nzs+is*nzs+ir] += 2*conv[ix*nt+(it+nt/2)]/rho; } } } else if (scheme==2) { //classical representation - corr(&indata[is*nx*nt], shotdata_jkz, tmp1, nx, nt, dt, 0); + convol(&indata[is*nx*nt], shotdata_jkz, tmp1, nx, nt, dt, 0); depthDiff(&indata[is*nx*nt], nt, nx, dt, dx, fmin, fmax, cp, 1); corr(&indata[is*nx*nt], shotdata, tmp2, nx, nt, dt, 0); for (ix = 0; ix < nx; ix++) { for (it = 0; it < nt; it++) { - conv[ix*nt+it] = -(tmp2[ix*nt+it]-tmp1[ix*nt+it]); + conv[ix*nt+it] = (tmp2[ix*nt+it]+tmp1[ix*nt+it]); } } timeDiff(conv, nt, nx, dt, fmin, fmax, -1); @@ -718,3 +720,46 @@ void pad2d_data(float *data, int nsam, int nrec, int nsamout, int nrecout, float datout[ix*nsam+it]=0.0; } } +void conjugate(float *data, int nsam, int nrec, float dt) +{ + int optn, nfreq, j, ix, it, sign, ntdiff; + float *rdata, scl; + complex *cdata; + + optn = optncr(nsam); + ntdiff = optn-nsam; + nfreq = optn/2+1; + + cdata = (complex *)malloc(nfreq*nrec*sizeof(complex)); + if (cdata == NULL) verr("memory allocation error for cdata"); + + rdata = (float *)malloc(optn*nrec*sizeof(float)); + if (rdata == NULL) verr("memory allocation error for rdata"); + + /* pad zeroes until Fourier length is reached */ + pad_data(data,nsam,nrec,optn,rdata); + + /* Forward time-frequency FFT */ + sign = -1; + rcmfft(&rdata[0], &cdata[0], optn, nrec, optn, nfreq, sign); + + /* take complex conjugate */ + for(ix = 0; ix < nrec; ix++) { + for(j = 0; j < nfreq; j++) cdata[ix*nfreq+j].i = -cdata[ix*nfreq+j].i; + } + + /* Inverse frequency-time FFT and scale result */ + sign = 1; + scl = 1.0/(float)optn; + crmfft(&cdata[0], &rdata[0], optn, nrec, nfreq, optn, sign); + for (ix = 0; ix < nrec; ix++) { + for (it = 0 ; it < nsam ; it++) + data[ix*nsam+it] = scl*rdata[ix*optn+it+ntdiff]; + } + //scl_data(rdata,optn,nrec,scl,data,nsam); + + free(cdata); + free(rdata); + + return; +} diff --git a/marchenko_applications/homogeneousg.c b/marchenko_applications/homogeneousg.c index 62bbe70..bf5f7e7 100644 --- a/marchenko_applications/homogeneousg.c +++ b/marchenko_applications/homogeneousg.c @@ -17,6 +17,7 @@ void applyMute( float *data, int *mute, int smooth, int above, int Nsyn, int nxs int disp_fileinfo(char *file, int n1, int n2, float f1, float f2, float d1, float d2, segy *hdrs); double wallclock_time(void); int writeData(FILE *fp, float *data, segy *hdrs, int n1, int n2); +void conjugate(float *data, int nsam, int nrec, float dt); void scl_data(float *data, int nsam, int nrec, float scl, float *datout, int nsamout); void pad_data(float *data, int nsam, int nrec, int nsamout, float *datout); @@ -37,7 +38,7 @@ void homogeneousg(float *HomG, float *green, complex *Refl, int nx, int nt, int float scl, *conv, *greenf2, fmin, fmax, alpha, cp, rho, perc; float *greenjkz, *greenf2jkz, *tmp1, *tmp2; double t0, t2, tfft; - FILE *fp; + FILE *fp, *fp1, *fp2, *fp3; if (!getparint("scheme", &scheme)) scheme = 0; if (!getparint("kxwfilt", &kxwfilt)) kxwfilt = 0; @@ -59,46 +60,39 @@ void homogeneousg(float *HomG, float *green, complex *Refl, int nx, int nt, int greenf2jkz = (float *)calloc(Nsyn*nxs*ntfft,sizeof(float)); greenjkz = (float *)calloc(nxs*ntfft,sizeof(float)); + if (niter<1) { + vmess("Single event"); + } + else { + vmess("Multiple events"); + } + for (l = 0; l < Nsyn; l++) { - if (niter<1) { - for (i = 0; i < npossyn; i++) { - j = 0; - ix = ixpossyn[i]; - greenf2[l*nxs*nts+i*nts+j] = G_d[l*nxs*nts+ix*nts+j]; - greenf2jkz[l*nxs*nts+i*nts+j] = G_d[l*nxs*nts+ix*nts+j]; - for (j = 1; j < nts; j++) { - greenf2[l*nxs*nts+i*nts+j] = G_d[l*nxs*nts+ix*nts+nts-j]; - greenf2jkz[l*nxs*nts+i*nts+j] = G_d[l*nxs*nts+ix*nts+nts-j]; - } - } + for (i = 0; i < npossyn; i++) { + j = 0; + /* set green to zero if mute-window exceeds nt/2 */ + if (muteW[l*nxs+ixpossyn[i]] >= nts/2) { + memset(&greenf2[l*nxs*nts+i*nts],0, sizeof(float)*nt); + memset(&greenf2jkz[l*nxs*nts+i*nts],0, sizeof(float)*nt); + continue; + } + greenf2[l*nxs*nts+i*nts+j] = f2p[l*nxs*nts+i*nts+j] + pmin[l*nxs*nts+i*nts+j]; + greenf2jkz[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++) { + greenf2[l*nxs*nts+i*nts+j] = f2p[l*nxs*nts+i*nts+nts-j] + pmin[l*nxs*nts+i*nts+j]; + greenf2jkz[l*nxs*nts+i*nts+j] = f2p[l*nxs*nts+i*nts+nts-j] + pmin[l*nxs*nts+i*nts+j]; + } } - else { - for (i = 0; i < npossyn; i++) { - j = 0; - /* set green to zero if mute-window exceeds nt/2 */ - if (muteW[l*nxs+ixpossyn[i]] >= nts/2) { - memset(&greenf2[l*nxs*nts+i*nts],0, sizeof(float)*nt); - memset(&greenf2jkz[l*nxs*nts+i*nts],0, sizeof(float)*nt); - continue; - } - greenf2[l*nxs*nts+i*nts+j] = f2p[l*nxs*nts+i*nts+j] + pmin[l*nxs*nts+i*nts+j]; - greenf2jkz[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++) { - greenf2[l*nxs*nts+i*nts+j] = f2p[l*nxs*nts+i*nts+nts-j] + pmin[l*nxs*nts+i*nts+j]; - greenf2jkz[l*nxs*nts+i*nts+j] = f2p[l*nxs*nts+i*nts+nts-j] + pmin[l*nxs*nts+i*nts+j]; - } - } - } depthDiff(&greenf2jkz[l*nxs*nts], ntfft, nshots, dt, dx, fmin, fmax, cp, 1); } - applyMute(greenf2, muteW, smooth, 4, Nsyn, nxs, nts, ixpossyn, npossyn, shift, pad, nt0); - applyMute(greenf2jkz, muteW, smooth, 4, Nsyn, nxs, nts, ixpossyn, npossyn, shift, pad, nt0); for (i = 0; i < npossyn; i++) { for (j = 0; j < nts; j++) { greenjkz[i*nts+j] = green[i*nts+j]; } } + conjugate(greenjkz, ntfft, nshots, dt); + conjugate(green, ntfft, nshots, dt); depthDiff(greenjkz, ntfft, nshots, dt, dx, fmin, fmax, cp, 1); } else { @@ -128,30 +122,22 @@ void homogeneousg(float *HomG, float *green, complex *Refl, int nx, int nt, int kxwfilter(conv, ntfft, nshots, dt, dx, fmin, fmax, alpha, cp, perc); } for (i=0; i<npossyn; i++) { - //j=0; - //HomG[(j+nts/2)*Nsyn+synpos[l]] += scl*conv[i*nts+j]; for (j=0; j<nts/2; j++) { - //HomG[(j+nts/2)*Nsyn+synpos[l]] -= scl*(conv[i*nts+j] + conv[i*nts+nts-j]); - //HomG[j*Nsyn+synpos[l]] -= scl*(conv[i*nts+(j+nts/2)] + conv[i*nts+nts-(j+nts/2)]); - HomG[(j+nts/2)*Nsyn+synpos[l]] -= conv[i*nts+j]/rho; - HomG[j*Nsyn+synpos[l]] -= conv[i*nts+(j+nts/2)]/rho; + HomG[(j+nts/2)*Nsyn+synpos[l]] += conv[i*nts+j]/rho; + HomG[j*Nsyn+synpos[l]] += conv[i*nts+(j+nts/2)]/rho; } } } else if (scheme==1) { //classical representation - //corr(&greenf2[l*nxs*nts], greenjkz, tmp1, nxs, nts, dt, 0); - //corr(&greenf2jkz[l*nxs*nts], green, tmp2, nxs, nts, dt, 0); - corr(greenjkz, &greenf2[l*nxs*nts], tmp1, nxs, nts, dt, 0); - corr(green, &greenf2jkz[l*nxs*nts], tmp2, nxs, nts, dt, 0); + convol(&greenf2jkz[l*nxs*nts], green, tmp1, nxs, nts, dt, 0); + convol(&greenf2[l*nxs*nts], greenjkz, tmp2, nxs, nts, dt, 0); for (i = 0; i < npossyn; i++) { for (j = 0; j < nts; j++) { - conv[i*nts+j] = -(tmp1[i*nts+j]-tmp2[i*nts+j]); + conv[i*nts+j] = tmp1[i*nts+j]+tmp2[i*nts+j]; } } timeDiff(conv, ntfft, nshots, dt, fmin, fmax, -1); for (i=0; i<npossyn; i++) { - //j=0; - //HomG[(j+nts/2)*Nsyn+synpos[l]] += scl*(conv[i*nts+j]); for (j=0; j<nts/2; j++) { HomG[(j+nts/2)*Nsyn+synpos[l]] += conv[i*nts+j]/rho; HomG[j*Nsyn+synpos[l]] += conv[i*nts+(j+nts/2)]/rho; @@ -473,3 +459,47 @@ void pad2d_data(float *data, int nsam, int nrec, int nsamout, int nrecout, float datout[ix*nsam+it]=0.0; } } +void conjugate(float *data, int nsam, int nrec, float dt) +{ + int optn, nfreq, j, ix, it, sign, ntdiff; + float *rdata, scl; + complex *cdata; + + optn = optncr(nsam); + ntdiff = optn-nsam; + nfreq = optn/2+1; + + cdata = (complex *)malloc(nfreq*nrec*sizeof(complex)); + if (cdata == NULL) verr("memory allocation error for cdata"); + + rdata = (float *)malloc(optn*nrec*sizeof(float)); + if (rdata == NULL) verr("memory allocation error for rdata"); + + /* pad zeroes until Fourier length is reached */ + pad_data(data,nsam,nrec,optn,rdata); + + /* Forward time-frequency FFT */ + sign = -1; + rcmfft(&rdata[0], &cdata[0], optn, nrec, optn, nfreq, sign); + + /* take complex conjugate */ + for(ix = 0; ix < nrec; ix++) { + for(j = 0; j < nfreq; j++) cdata[ix*nfreq+j].i = -cdata[ix*nfreq+j].i; + } + + /* Inverse frequency-time FFT and scale result */ + sign = 1; + scl = 1.0/(float)optn; + crmfft(&cdata[0], &rdata[0], optn, nrec, nfreq, optn, sign); + for (ix = 0; ix < nrec; ix++) { + for (it = 0 ; it < nsam ; it++) + data[ix*nsam+it] = scl*rdata[ix*optn+it+ntdiff]; + } + //scl_data(rdata,optn,nrec,scl,data,nsam); + + free(cdata); + free(rdata); + + return; +} + -- GitLab