Filt *filt_find(char *name) { int i; if (nfilt==0) filt_init(); for (i=0; i<nfilt; i++) if (str_eq(name, filt[i].name)) return &filt[i]; return 0; }
int main_sites(int argc,char **argv){ #if 0 for(int i=0;i<argc;i++) fprintf(stderr,"argv[%d]:%s\n",i,argv[i]); #endif if(argc==1){ fprintf(stderr,"\tsites print filename\t\tPrint index file\n\tsites index filename [-r offset -compl doCompl]\tgenerate binary index file\n"); return 0; } --argc;++argv; if(!strcasecmp(*argv,"index")){ filt_init(--argc,++argv); }else if(!strcasecmp(*argv,"print")){ filt *f = filt_read(*++argv); filt_print(stdout,f,NULL); dalloc(f); }else fprintf(stderr,"Unknown option: \'%s\'\n",*argv); return 0; }
int main(int argc, char* argv[]) { bool verb; int it, nt, ih, nh, is, ns, nsg, nrg, left, right, ic, aper, shift, c, cc, hh; int ir, nr, jump, sleft, sright, tap; float datum, length, t0, dt, h0, dh, s0, ds, sg0, dsg, rg0, drg, dist, tau, delta; float r, dr, s, h, coef; float ***tr_in, ***tr_out, **stable, **rtable; sf_file in, out, sgreen, rgreen, interm; sf_init (argc,argv); in = sf_input("in"); out = sf_output("out"); if (!sf_getbool("verb",&verb)) verb=false; /* verbosity flag */ if (!sf_getfloat("datum",&datum)) sf_error("Need datum="); /* datum depth */ if (!sf_getint("aperture",&aper)) aper=50; /* aperture (number of traces) */ if (!sf_getint("taper",&tap)) tap=10; /* taper (number of traces) */ if (!sf_getfloat("length",&length)) length=0.025; /* filter length (in seconds) */ /* read input */ if (!sf_histint(in,"n1",&nt)) sf_error("No nt="); if (!sf_histint(in,"n2",&nh)) sf_error("No nh="); if (!sf_histint(in,"n3",&ns)) sf_error("No ns="); if (!sf_histfloat(in,"o1",&t0)) sf_error("No t0="); if (!sf_histfloat(in,"d1",&dt)) sf_error("No dt="); if (!sf_histfloat(in,"o2",&h0)) sf_error("No h0="); if (!sf_histfloat(in,"d2",&dh)) sf_error("No dh="); if (!sf_histfloat(in,"o3",&s0)) sf_error("No s0="); if (!sf_histfloat(in,"d3",&ds)) sf_error("No ds="); tr_in = sf_floatalloc3(nt,nh,ns); sf_floatread(tr_in[0][0],nt*nh*ns,in); /* allocate memory for output */ tr_out = sf_floatalloc3(nt,nh,ns); /* read Green's function (source) */ sgreen = sf_input("sgreen"); if (!sf_histint(sgreen,"n1",&nsg)) sf_error("No nsg="); if (!sf_histfloat(sgreen,"o1",&sg0)) sf_error("No sg0="); if (!sf_histfloat(sgreen,"d1",&dsg)) sf_error("No dsg="); stable = sf_floatalloc2(nsg,nsg); sf_floatread(stable[0],nsg*nsg,sgreen); sf_fileclose(sgreen); /* read Green's function (receiver) */ rgreen = sf_input("rgreen"); if (!sf_histint(rgreen,"n1",&nrg)) sf_error("No nrg="); if (!sf_histfloat(rgreen,"o1",&rg0)) sf_error("No rg0="); if (!sf_histfloat(rgreen,"d1",&drg)) sf_error("No drg="); rtable = sf_floatalloc2(nrg,nrg); sf_floatread(rtable[0],nrg*nrg,rgreen); sf_fileclose(rgreen); /* output intermediate traces */ if (NULL != sf_getstring("interm")) { interm = sf_output("interm"); } else { interm = NULL; } /* initialize */ filt_init(dt,length); /* common-shot gather */ #ifdef _OPENMP #pragma omp parallel for private(ih,c,left,right,ic,cc,coef,tau,dist,shift,it,delta) #endif for (is=0; is < ns; is++) { if (verb) sf_warning("Processing common-shot gather %d of %d.",is+1,ns); for (ih=0; ih < nh; ih++) { c = (s0+is*ds+h0+ih*dh-rg0)/drg+0.5; if (c < 0 || c > nrg-1) sf_error("Receiver table too small."); /* aperture */ left = (ih-aper < 0)? 0: ih-aper; right = (ih+aper > nh-1)? nh-1: ih+aper; for (ic=left; ic <= right; ic++) { cc = (s0+is*ds+h0+ic*dh-rg0)/drg+0.5; if (cc < 0 || cc > nrg-1) sf_error("Receiver table too small."); /* taper coefficient */ coef = 1.; coef *= (ic-left >= tap)? 1.: (ic-left)/tap; coef *= (right-ic >= tap)? 1.: (right-ic)/tap; /* time delay */ tau = rtable[cc][c]; /* distance */ dist = datum*datum+(ic-ih)*dh*(ic-ih)*dh; /* filter (tau dependent) */ filt_set(tau); shift = 0; delta = 0.; for (it=0; it < nt; it++) { if (((float)it)*dt < tau) continue; else if (shift == 0) delta = (((float)it*dt)-tau)/dt; tr_out[is][ih][it] += coef/SF_PI *dh*datum*tau/dist *pick(delta,tr_in[is][ic],shift); shift++; } } } } if (NULL != interm) sf_floatwrite(tr_out[0][0],nt*nh*ns,interm); /* zero input */ for (is=0; is < ns; is++) { for (ih=0; ih < nh; ih++) { for (it=0; it < nt; it++) { tr_in[is][ih][it] = 0.; } } } /* acquisition */ s = fabsf((ns-1)*ds); h = fabsf((nh-1)*dh); if (fabsf(ds) >= fabsf(dh)) { dr = fabsf(dh); jump = 1; } else { dr = fabsf(ds); jump = dh/ds+0.5; } nr = (s+h)/dr+1.5; /* common-receiver gather */ #ifdef _OPENMP #pragma omp parallel for private(r,sleft,sright,is,c,ih,left,right,ic,cc,hh,coef,tau,dist,shift,it,delta) #endif for (ir=0; ir < nr; ir++) { if (verb) sf_warning("Processing common-receiver gather %d of %d.",ir+1,nr); r = ir*dr+((ds<=0.)?-1.:0.)*s+((dh<=0.)?-1.:0.)*h; /* source receiver reciprocity */ sleft = (ir*dr+((ds<=0.)?-1.:0.)*s+((ds<=0.)?0.:-1.)*h)/ds+0.5; sright = (ir*dr+((ds<=0.)?-1.:0.)*s+((ds<=0.)?-1.:0.)*h)/ds+0.5; if (sleft < 0) sleft = 0; if (sright > ns-1) sright = ns-1; /* in case of fabsf(ds)>=fabsf(dh) */ left = (r-sleft*ds)/dh+0.5; if (left < 0 || left > nh-1) sleft++; right = (r-sright*ds)/dh+0.5; if (right < 0 || right > nh-1) sright--; for (is=sleft; is <= sright; is=is+jump) { c = (s0+is*ds-sg0)/dsg+0.5; if (c < 0 || c > nsg-1) sf_error("Source table too small."); ih = (r-is*ds)/dh+0.5; /* aperture */ left = (is-jump*aper < sleft)? sleft: is-jump*aper; right = (is+jump*aper > sright)? sright: is+jump*aper; for (ic=left; ic <= right; ic=ic+jump) { cc = (s0+ic*ds-sg0)/dsg+0.5; if (cc < 0 || cc > nsg-1) sf_error("Source table too small."); hh = (r-ic*ds)/dh+0.5; /* taper coefficient */ coef = 1.; coef *= (ic-left >= tap)? 1.: (ic-left)/jump/tap; coef *= (right-ic >= tap)? 1.: (right-ic)/jump/tap; /* time delay */ tau = stable[cc][c]; /* distance */ dist = datum*datum+(ic-is)*ds*(ic-is)*ds; /* filter (tau dependent) */ filt_set(tau); shift = 0; for (it=0; it < nt; it++) { if (((float)it)*dt < tau) continue; else if (shift == 0) delta = (((float)it*dt)-tau)/dt; tr_in[is][ih][it] += coef/SF_PI *ds*datum*tau/dist *pick(delta,tr_out[ic][hh],shift); shift++; } } } } /* write output */ sf_floatwrite(tr_in[0][0],nt*nh*ns,out); exit(0); }