void smooth_misfit(float **pp, float *fcost, int nr, int nt, int drectx, int drectz, int nrepeat, int ider) /*< adjoint source of smoothing kernel misfit >*/ { int it, ir, nd; int m[2], rect[2]; nd=nt*nr; m[0]=nt; m[1]=nr; rect[0]=drectz; rect[1]=drectx; sf_dtrianglen_init(2, rect, m); sf_dtrianglen(0, nrepeat, 6, pp[0]); for (ir=0; ir<nr; ir++) for (it=0; it<nt; it++) *fcost += 0.5*pp[ir][it]*pp[ir][it]; sf_dtrianglen(ider, nrepeat, 6, pp[0]); if(ider!=0){ for (ir=0; ir<nr; ir++) for (it=0; it<nt; it++) pp[ir][it] *=2.; } sf_dtrianglen_close(); }
int main (int argc, char* argv[]) { int dim, dim1, i, ider, nrep, i2, n1, n2, nderiv; int n[SF_MAX_DIM], rect[SF_MAX_DIM]; char key[6]; float* data; sf_file in, out; sf_init (argc, argv); in = sf_input ("in"); out = sf_output ("out"); if (SF_FLOAT != sf_gettype(in)) sf_error("Need float input"); dim = sf_filedims (in,n); dim1 = -1; for (i=0; i < dim; i++) { snprintf(key,6,"rect%d",i+1); if (!sf_getint(key,rect+i)) rect[i]=1; /*( rect#=(1,1,...) smoothing radius on #-th axis )*/ if (rect[i] > 1) dim1 = i; } n1 = n2 = 1; for (i=0; i < dim; i++) { if (i <= dim1) { n1 *= n[i]; } else { n2 *= n[i]; } } data = sf_floatalloc (n1); if (!sf_getint("ider",&ider)) ider=0; /* direction of the derivative (0 means no derivative) */ if (!sf_getint("repeat",&nrep)) nrep=1; /* repeat smoothing several times */ if (!sf_getint("nderiv",&nderiv)) nderiv=6; /* derivative filter accuracy */ sf_dtrianglen_init(dim1+1,rect,n); for (i2=0; i2 < n2; i2++) { sf_floatread(data,n1,in); sf_dtrianglen(ider, nrep, nderiv, data); sf_floatwrite(data,n1,out); } exit (0); }