Example #1
0
void sf_upgrad_set(sf_upgrad upg, const float *r0 /* reference */)
/*< supply reference >*/
{
    int i, m, it, jt, ii[3], a, b;
    unsigned char *up;
    float t, t2;

    t0 = r0;

    /* sort from small to large traveltime */
    for (it = 0; it < nt; it++) {
	upg->order[it] = it;
    }
    qsort(upg->order, nt, sizeof(int), fermat);
     
    for (it = 0; it < nt; it++) {
	jt = upg->order[it];

	sf_line2cart(ndim,nn,jt,ii);
	up = upg->update[it];
	up[0] = up[1] = 0;
	t = t0[jt];
	upg->ww[it][ndim] = 0.;
	for (i=0, m=1; i < ndim; i++, m <<= 1) {
	    a = jt-ss[i];
	    b = jt+ss[i];
	    if ((ii[i] == 0) || 
		(ii[i] != nn[i]-1 && 1==fermat(&a,&b))) {
		if (b < 0 || b >= nt) continue;
		up[1] |= m;
		t2 = t0[b];
	    } else {
		if (a < 0 || a >= nt) continue;
		t2 = t0[a];
	    }

	    if (t2 < t) {
		up[0] |= m;
		upg->ww[it][i] = (t-t2)*dd[i];
		upg->ww[it][ndim] += upg->ww[it][i];
	    }	    
	}
    }
}
Example #2
0
void upgrad_set(upgrad upg      /* upwind stencil */, 
		const float* t0 /* t0 */,
		const float* x0 /* x0 */,
		const int* f0   /* f0 */)
/*< supply reference >*/
{
    int i, j, m, it, jt, ii[3], a, b;
    unsigned char *up;
    float t, t2;
    float x, x2;

    t_0 = t0;
    x_0 = x0;
    f_0 = f0;

    /* sort from small to large traveltime */
    for (it = 0; it < nt; it++) {
	upg->order[it] = it;
    }
    qsort(upg->order, nt, sizeof(int), fermat);
     
    for (it = 0; it < nt; it++) {
	jt = upg->order[it];

	sf_line2cart(ndim,nn,jt,ii);
	up = upg->update[it];
	up[0] = up[1] = 0;
	t = t_0[jt];
	x = x_0[jt];
	upg->wt[it][ndim] = 0.;
	upg->wx[it][ndim] = 0.;

	/* special coded for one-sided update */
	if (f_0[jt] >= 0) {
	    i = f_0[jt];

	    for (j=0, m=1; j < i; j++) m <<= 1;

	    a = jt-ss[i];
	    b = jt+ss[i];
	    if ((ii[i] == 0) || 
		(ii[i] != nn[i]-1 && 1==fermat(&a,&b))) {
		up[1] |= m;
		t2 = t_0[b];
		x2 = x_0[b];
	    } else {
		t2 = t_0[a];
		x2 = x_0[a];
	    }

	    if (t2 < t) {
		up[0] |= m;
		upg->wt[it][i] = (t-t2)*dd[i];
		upg->wt[it][ndim] += upg->wt[it][i];
		upg->wx[it][i] = 0.;
		upg->wx[it][ndim] += upg->wx[it][i];
	    }
	    
	    continue;
	}

	/* x0 will also use the same upwind determined by t0 */
	for (i=0, m=1; i < ndim; i++, m <<= 1) {
	    a = jt-ss[i];
	    b = jt+ss[i];
	    if ((ii[i] == 0) || 
		(ii[i] != nn[i]-1 && 1==fermat(&a,&b))) {
		up[1] |= m;
		t2 = t_0[b];
		x2 = x_0[b];
	    } else {
		t2 = t_0[a];
		x2 = x_0[a];
	    }

	    if (t2 < t) {
		up[0] |= m;
		upg->wt[it][i] = (t-t2)*dd[i];
		upg->wt[it][ndim] += upg->wt[it][i];
		upg->wx[it][i] = (x-x2)*dd[i];
		upg->wx[it][ndim] += upg->wx[it][i];
	    }	    
	}
    }
}