-
Joeri Brackenhoff authoredJoeri Brackenhoff authored
imaging_backup.c 5.70 KiB
#include "par.h"
#include "segy.h"
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <assert.h>
#include <genfft.h>
#include "marchenko.h"
#include "raytime.h"
int omp_get_max_threads(void);
int omp_get_num_threads(void);
void omp_set_num_threads(int num_threads);
void applyMute( float *data, int *mute, int smooth, int above, int Nsyn, int nxs, int nt, int *xrcvsyn, int npossyn, int shift, int pad, int nt0);
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 synthesis(complex *Refl, complex *Fop, float *Top, 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 mode, int reci, int nshots, int *ixpossyn, int npossyn, double *tfft, int verbose);
void imaging(float *Image, WavePar WP, complex *Refl, 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 mode, int reci, int nshots, int *ixpossyn, int npossyn, float *pmin, float *f1min, float *f1plus, float *f2p, float *G_d, int *muteW, int smooth, int shift, int above, int pad, int nt0, int *synpos, int verbose)
{
FILE *fp;
int i, j, l, ret;
int iter, niter, ix, nfreq;
float *iRN, *rtrace, *Gmin, *wavelet;
complex *Fop, *cmin, *cplus, *cIm, *cwav, cmw;
double t0, t2, tfft;
segy *hdrs;
tfft = 0.0;
ret = 0;
t0 = wallclock_time();
nfreq = ntfft/2+1;
//Image = (float *)malloc(Nsyn*sizeof(float));
Fop = (complex *)calloc(nxs*nw*Nsyn,sizeof(complex));
iRN = (float *)calloc(Nsyn*nxs*ntfft,sizeof(float));
Gmin = (float *)calloc(Nsyn*nxs*ntfft,sizeof(float));
if (WP.wav) {
wavelet = (float *)calloc(ntfft,sizeof(float));
cwav = (complex *)calloc(nfreq,sizeof(complex));
if (verbose>3) vmess("Modeling wavelet for Image");
freqwave(wavelet, WP.nt, WP.dt, WP.fp, WP.fmin, WP.flef, WP.frig, WP.fmax,
WP.t0, WP.db, WP.shift, WP.cm, WP.cn, WP.w, WP.scale, WP.scfft, WP.inv, WP.eps, verbose);
rc1fft(wavelet,cwav,ntfft,-1);
free(wavelet);
}
/* use f1+ as operator on R in frequency domain */
mode=1;
synthesis(Refl, Fop, f1plus, iRN, nx, nt, nxs, nts, dt, xsyn, Nsyn,
xrcv, xsrc, fxs2, fxs, dxs, dxsrc, dx, ixa, ixb, ntfft, nw, nw_low, nw_high, mode,
reci, nshots, ixpossyn, npossyn, &tfft, 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];
}
}
}
free(Fop);free(iRN);
/* Apply mute with window for Gmin */
applyMute(Gmin, muteW, smooth, 4, Nsyn, nxs, nts, ixpossyn, npossyn, shift, pad, nt0);
#pragma omp parallel default(shared) \
private(i,j,cmin,cplus,cIm,rtrace,cmw)
{
cmin = (complex *)calloc(nfreq,sizeof(complex));
cplus = (complex *)calloc(nfreq,sizeof(complex));
cIm = (complex *)calloc(nfreq,sizeof(complex));
rtrace = (float *)calloc(ntfft,sizeof(float));
#pragma omp for
for (l = 0; l < Nsyn; l++) {
if (verbose > 2) vmess("Imaging location %d out of %d",l+1,Nsyn);
/* Construct the image */
for (i = 0; i < npossyn; i++) {
rc1fft(&Gmin[l*nxs*nts+i*nts],cmin,ntfft,-1);
rc1fft(&f1plus[l*nxs*nts+i*nts],cplus,ntfft,-1);
if (WP.wav) {
for (j = 0; j < nfreq; j++) {
cmw.r = cmin[j].r*cwav[j].r - cmin[j].i*cwav[j].i;
cmw.i = cmin[j].r*cwav[j].i + cmin[j].i*cwav[j].r;
cIm[j].r += cmw.r*cplus[j].r - cmw.i*cplus[j].i;
cIm[j].i += cmw.r*cplus[j].i + cmw.i*cplus[j].r;
}
}
else {
for (j = 0; j < nfreq; j++) {
cIm[j].r += cmin[j].r*cplus[j].r - cmin[j].i*cplus[j].i;
cIm[j].i += cmin[j].r*cplus[j].i + cmin[j].i*cplus[j].r;
}
}
}
cr1fft(&cIm[0],rtrace,ntfft,1);
Image[synpos[l]] = rtrace[0]/((float)(ntfft));
//Image[synpos[l]] = rtrace[0];
//Image[l] = synpos[l];
}
free(rtrace);free(cmin);
free(cplus);free(cIm);
}
if (WP.wav) free(cwav);
//free(Gmin);
t2 = wallclock_time();
if (verbose) {
vmess("Total Imaging time = %.3f", t2-t0);
}
hdrs = (segy *) calloc(Nsyn*nxs,sizeof(segy));
for (i = 0; i < Nsyn; i++) {
for (l=0; l<nxs; l++) {
hdrs[i*nxs+l].ns = ntfft;
hdrs[i*nxs+l].trid = 1;
hdrs[i*nxs+l].dt = dt*1000000;
hdrs[i*nxs+l].f1 = 0;
hdrs[i*nxs+l].f2 = 7000;
hdrs[i*nxs+l].d1 = dt;
hdrs[i*nxs+l].d2 = dx;
hdrs[i*nxs+l].trwf = Nsyn*nxs;
hdrs[i*nxs+l].scalco = -1000;
hdrs[i*nxs+l].gx = NINT(1000*(7000+l*dx));
hdrs[i*nxs+l].scalel = -1000;
hdrs[i*nxs+l].tracl = l+1;
hdrs[i*nxs+l].fldr = i+1;
hdrs[i*nxs+l].sx = NINT(1000*(7000+l*dx));
hdrs[i*nxs+l].offset = 0;
hdrs[i*nxs+l].tracf = i+1;
hdrs[i*nxs+l].selev = -1200;
hdrs[i*nxs+l].sdepth = 1200;
hdrs[i*nxs+l].f1 = 1200;
}
}
fp = fopen("Gmin.su","w+");
l = writeData(fp, &Gmin[0], hdrs, ntfft, Nsyn*nxs);
fclose(fp);
vmess("Wrote Gmin");
fp = fopen("f1plus.su","w+");
l = writeData(fp, &f1plus[0], hdrs, ntfft, Nsyn*nxs);
fclose(fp);
vmess("Wrote f1plus");
return;
}