int main (int argc, char *argv[]) { bool both; int ir, nr, n1,n2,n3,n4, m1, m2, m3, n12, n123, nw, nj1, nj2, i3; float *u1, *u2, *p; sf_file in, out, dip; off_t pos=0; allpass ap; sf_init(argc,argv); in = sf_input ("in"); dip = sf_input ("dip"); out = sf_output ("out"); if (SF_FLOAT != sf_gettype(in) || SF_FLOAT != sf_gettype(dip)) sf_error("Need float type"); if (!sf_histint(in,"n1",&n1)) sf_error("Need n1= in input"); if (!sf_histint(in,"n2",&n2)) n2=1; if (!sf_histint(in,"n3",&n3)) n3=1; n12 = n1*n2; n123 = n12*n3; nr = sf_leftsize(in,3); if (!sf_histint(dip,"n1",&m1) || m1 != n1) sf_error("Need n1=%d in dip",n1); if (1 != n2 && (!sf_histint(dip,"n2",&m2) || m2 != n2)) sf_error("Need n2=%d in dip",n2); if (1 != n3 && (!sf_histint(dip,"n3",&m3) || m3 != n3)) sf_error("Need n3=%d in dip",n3); if (!sf_getbool("both",&both)) both=false; /* if y, compute both left and right predictions */ if (1 == n3) { n4=0; if (both) sf_putint(out,"n3",2); } else { if (!sf_getint("n4",&n4)) n4=2; /* what to compute in 3-D. 0: in-line, 1: cross-line, 2: both */ if (n4 > 2) n4=2; if (2==n4) sf_putint(out,"n4",both? 4:2); if (0 != n4 || both) { sf_unpipe(in,(off_t) n123*sizeof(float)); pos = sf_tell(in); } } if (!sf_getint("order",&nw)) nw=1; /* accuracy */ if (!sf_getint("nj1",&nj1)) nj1=1; /* in-line aliasing */ if (!sf_getint("nj2",&nj2)) nj2=1; /* cross-line aliasing */ for (ir=0; ir < nr; ir++) { if (1 != n4) { /* in-line */ u1 = sf_floatalloc(n12); u2 = sf_floatalloc(n12); p = sf_floatalloc(n12); for (i3=0; i3 < n3; i3++) { /* read data */ sf_floatread(u1,n12,in); /* read t-x dip */ sf_floatread(p,n12,dip); ap = allpass_init (nw,nj1,n1,n2,1,p); /* apply */ allpass1(false, false, ap, u1, u2); /* write t-x destruction */ sf_floatwrite(u2,n12,out); } free(u1); free(u2); free(p); } if (0 != n4) { /* cross-line */ u1 = sf_floatalloc(n123); u2 = sf_floatalloc(n123); p = sf_floatalloc(n123); /* read data */ sf_seek(in,pos,SEEK_SET); sf_floatread(u1,n123,in); /* read t-y dip */ sf_floatread(p,n123,dip); ap = allpass_init(nw,nj2,n1,n2,n3,p); /* apply */ allpass2(false, false, ap, u1, u2); /* write t-y destruction */ sf_floatwrite(u2,n123,out); } if (!both) continue; if (1 != n4) { /* in-line */ u1 = sf_floatalloc(n12); u2 = sf_floatalloc(n12); p = sf_floatalloc(n12); sf_seek(in,pos,SEEK_SET); for (i3=0; i3 < n3; i3++) { /* read data */ sf_floatread(u1,n12,in); /* read t-x dip */ sf_floatread(p,n12,dip); ap = allpass_init (nw,nj1,n1,n2,1,p); /* apply */ allpass1(true, false, ap, u1, u2); /* write t-x destruction */ sf_floatwrite(u2,n12,out); } free(u1); free(u2); free(p); } if (0 != n4) { /* cross-line */ u1 = sf_floatalloc(n123); u2 = sf_floatalloc(n123); p = sf_floatalloc(n123); /* read data */ sf_seek(in,pos,SEEK_SET); sf_floatread(u1,n123,in); /* read t-y dip */ sf_floatread(p,n123,dip); ap = allpass_init(nw,nj2,n1,n2,n3,p); /* apply */ allpass2(true, false, ap, u1, u2); /* write t-y destruction */ sf_floatwrite(u2,n123,out); } } exit (0); }
int main (int argc, char *argv[]) { int ir, nr, n1,n2,n3, m1, m2, m3, n12, nw, nj1, i3; float *u1, *u2, *p; sf_file in, out, dip; bool verb; allpass ap; sf_init(argc,argv); in = sf_input ("in"); dip = sf_input ("dip"); out = sf_output ("out"); if (SF_FLOAT != sf_gettype(in) || SF_FLOAT != sf_gettype(dip)) sf_error("Need float type"); if (!sf_histint(in,"n1",&n1)) sf_error("Need n1= in input"); if (!sf_histint(in,"n2",&n2)) n2=1; if (!sf_histint(in,"n3",&n3)) n3=1; n12 = n1*n2; nr = sf_leftsize(in,2); if (!sf_histint(dip,"n1",&m1) || m1 != n1) sf_error("Need n1=%d in dip",n1); if (1 != n2 && (!sf_histint(dip,"n2",&m2) || m2 != n2)) sf_error("Need n2=%d in dip",n2); if (1 != n3 && (!sf_histint(dip,"n3",&m3) || m3 != n3)) sf_error("Need n3=%d in dip",n3); if (!sf_getint("order",&nw)) nw=1; /* accuracy */ if (!sf_getbool("verb",&verb)) verb = false; /* verbosity flag */ if (!sf_getint("nj1",&nj1)) nj1=1; /* aliasing */ n3 = 1; for (ir=0; ir < nr; ir++) { if (verb) sf_warning("slice %d of %d", ir+1, nr); u1 = sf_floatalloc(n12); u2 = sf_floatalloc(n12); p = sf_floatalloc(n12); for (i3=0; i3 < n3; i3++) { /* read data */ sf_floatread(u1,n12,in); /* read t-x dip */ sf_floatread(p,n12,dip); ap = allpass_init (nw,nj1,n1,n2,1,p); /* apply */ allpass1(false, false, ap, u1, u2); /* write t-x destruction */ sf_floatwrite(u2,n12,out); } free(u1); free(u2); free(p); } exit (0); }
void dip3(bool left /* left or right prediction */, int dip /* 1 - inline, 2 - crossline */, int niter /* number of nonlinear iterations */, int nw /* filter size */, int nj /* filter stretch for aliasing */, bool verb /* verbosity */, float *u /* input data */, float* p /* output dip */, bool* mask /* input mask for known data */, float pmin, float pmax /* minimum and maximum dip */) /*< estimate local dip >*/ { int i, iter, k; float usum, usum2, pi, lam; allpass ap; ap = allpass_init (nw,nj,n1,n2,n3,p); if (dip == 1) { allpass1 (left, false, ap, u,u2); } else { allpass2 (left, false, ap, u,u2); } for (iter =0; iter < niter; iter++) { if (dip == 1) { allpass1 (left, true, ap, u,u1); } else { allpass2 (left, true, ap, u,u1); } usum = 0.0; for(i=0; i < n; i++) { p0[i] = p[i]; usum += u2[i]*u2[i]; } if (NULL != mask) { for(i=0; i < n; i++) { if (mask[i]) { u1[i] = 0.; u2[i] = 0.; } } } sf_divne (u2, u1, dp, eps); lam = 1.; for (k=0; k < 8; k++) { for(i=0; i < n; i++) { pi = p0[i]+lam*dp[i]; if (pi < pmin) pi=pmin; if (pi > pmax) pi=pmax; p[i] = pi; } if (dip == 1) { allpass1 (left, false, ap, u,u2); } else { allpass2 (left, false, ap, u,u2); } usum2 = 0.; for(i=0; i < n; i++) { usum2 += u2[i]*u2[i]; } if (usum2 < usum) break; lam *= 0.5; } } /* iter */ free(ap); }