Example #1
0
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);
    }

}
Example #2
0
void sf_multidivn_close (void)
/*< free allocated storage >*/
{
    sf_trianglen_close();
    sf_conjgrad_close();
    free (p);
    sf_weight2_close();
}
Example #3
0
void div2_close (void)
/*< free allocated storage >*/
{
    if (gauss) {
	gauss2_close();
    } else { 
	sf_triangle2_close();
    }
    sf_conjgrad_close();
    free (p);
}
Example #4
0
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);
}
Example #5
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);
}