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]; } } } }
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]; } } } }