void find_match(int nd /* data size */, float* mm /* match [nd] */, float* dd /* data [nd] */, sf_filter aa /* estimated filter */, int niter /* number of iterations */, float eps /* regularization parameter */) /*< find matched filter >*/ { int id, nh2; float *dd_pad=NULL,*tmp=NULL; float eps_S=0.0; bool CG = true; nh2 = (aa->nh-1) / 2; dd_pad = sf_floatalloc(nd+aa->nh-1); for (id=0;id<(nd+aa->nh-1);id++) { if (CG==true) dd_pad[id] = 0.0; else { dd_pad[id] = eps; if (id<nd) mm[id]+=eps; } } for (id=0;id<nd;id++) dd_pad[id+nh2] += dd[id]; if (CG) { /* solution using preconditioned CG */ //FIXME: still memory leaks in sf_cdstep (sf_list) not affordable with huge datasets helix_tcaf_init(nd, mm, aa); sf_cdstep_init(); sf_solver_prec(helix_tcaf_lop, sf_cdstep, sf_copy_lop, aa->nh,aa->nh, nd+aa->nh-1, aa->flt, dd_pad, niter*3, eps, "x0", aa->flt, "verb",false,"end"); sf_cdstep_close(); } else { /* solution using shaping CG with S = (1+eps^2)^(-1) I*/ eps_S = 1.0 / (1.0+eps); tmp = sf_floatalloc(aa->nh); helix_tcaf_init(nd,mm, aa); copy_scaled_init(eps_S); sf_conjgrad_init(aa->nh, aa->nh, nd+aa->nh-1, nd+aa->nh-1, 1.0, 1.e-8, false, false); sf_conjgrad(NULL,helix_tcaf_lop,copy_scaled_lop, tmp,aa->flt,dd_pad,3*niter); sf_conjgrad_close(); free(tmp); free(dd_pad); } }
void sf_multidivn_close (void) /*< free allocated storage >*/ { sf_trianglen_close(); sf_conjgrad_close(); free (p); sf_weight2_close(); }
void div2_close (void) /*< free allocated storage >*/ { if (gauss) { gauss2_close(); } else { sf_triangle2_close(); } sf_conjgrad_close(); free (p); }
int main(int argc, char* argv[]) { int i, niter, n1, n2, n12, i3, n3, rect1, rect2, order; float *mm, *dd, **pp, lam; bool *known; sf_file in, out, dip, mask; sf_init (argc,argv); in = sf_input("in"); out = sf_output("out"); dip = sf_input("dip"); if (!sf_histint(in,"n1",&n1)) sf_error("No n1= in input"); if (!sf_histint(in,"n2",&n2)) sf_error("No n2= in input"); n12 = n1*n2; n3 = sf_leftsize(in,2); if (!sf_getint("niter",&niter)) niter=100; /* number of iterations */ if (!sf_getint("order",&order)) order=1; /* accuracy order */ pp = sf_floatalloc2(n1,n2); mm = sf_floatalloc(n12); known = sf_boolalloc(n12); if (NULL != sf_getstring ("mask")) { mask = sf_input("mask"); dd = sf_floatalloc(n12); } else { mask = NULL; dd = NULL; } if (!sf_getint("rect1",&rect1)) rect1=3; if (!sf_getint("rect2",&rect2)) rect2=3; /* smoothing radius */ pwdsl_init(n1,n2,order,rect1,rect2,0.01); pwdsl_set(pp); sf_mask_init(known); for (i3=0; i3 < n3; i3++) { sf_warning("slice %d of %d",i3+1,n3); sf_floatread(mm,n12,in); if (NULL != mask) { sf_floatread(dd,n12,mask); } else { dd = mm; } /* figure out scaling and make known data mask */ lam = 0.; for (i=0; i < n12; i++) { if (dd[i] != 0.) { known[i] = true; lam += 1.; } else { known[i] = false; } } lam = sqrtf(lam/n12); /* read dip */ sf_floatread(pp[0],n12,dip); sf_conjgrad_init(n12, n12, n12, n12, lam, 10*FLT_EPSILON, true, true); sf_conjgrad(NULL,sf_mask_lop,pwdsl_lop,dd,mm,mm,niter); sf_conjgrad_close(); sf_floatwrite (mm,n12,out); } exit(0); }
int main(int argc, char* argv[]) { int i, niter, n1, n2, n12, i3, n3, ns, order, np; float *mm, *dd, *xx, **pp, **qq, lam, eps; bool *known; sf_file in, out, dip, mask; sf_init (argc,argv); in = sf_input("in"); out = sf_output("out"); dip = sf_input("dip"); if (!sf_histint(in,"n1",&n1)) sf_error("No n1= in input"); if (!sf_histint(in,"n2",&n2)) sf_error("No n2= in input"); n12 = n1*n2; n3 = sf_leftsize(in,2); if (!sf_getint("niter",&niter)) niter=100; /* number of iterations */ if (!sf_getint("order",&order)) order=1; /* accuracy order */ pp = sf_floatalloc2(n1,n2); mm = sf_floatalloc(n12); xx = sf_floatalloc(n12); known = sf_boolalloc(n12); np = sf_leftsize(dip,2); if (np > n3) { qq = sf_floatalloc2(n1,n2); } else { qq = NULL; } if (NULL != sf_getstring ("mask")) { mask = sf_input("mask"); dd = sf_floatalloc(n12); } else { mask = NULL; dd = NULL; } if (!sf_getint("ns",&ns)) ns=1; /* smoothing radius */ if (!sf_getfloat("eps",&eps)) eps=0.01; /* regularization */ sf_mask_init(known); for (i3=0; i3 < n3; i3++) { sf_warning("slice %d of %d",i3+1,n3); sf_floatread(mm,n12,in); for (i=0; i < n12; i++) { xx[i] = mm[i]; } if (NULL != mask) { sf_floatread(dd,n12,mask); } else { dd = mm; } /* figure out scaling and make known data mask */ lam = 0.; for (i=0; i < n12; i++) { if (dd[i] != 0.) { known[i] = true; lam += 1.; } else { known[i] = false; } } lam = sqrtf(lam/n12); /* read dip */ sf_floatread(pp[0],n12,dip); sf_conjgrad_init(n12, n12, n12, n12, lam, 10*FLT_EPSILON, true, true); if (NULL != qq) { sf_floatread(qq[0],n12,dip); pwsmooth2_init(ns, n1, n2, order, eps, pp, qq); sf_conjgrad(NULL,sf_mask_lop,pwsmooth2_lop,xx,mm,mm,niter); pwsmooth2_close(); } else { pwsmooth_init(ns, n1, n2, order, eps, pp); sf_conjgrad(NULL,sf_mask_lop,pwsmooth_lop,xx,mm,mm,niter); pwsmooth_close(); } sf_conjgrad_close(); sf_floatwrite (mm,n12,out); } exit(0); }