void dsrtomo_set(float *t /* stencil time */, float *w /* stencil slowness-squared */, int *f /* stencil flag */, int *dp0 /* receiver mask */, int *mp0 /* model mask */) /*< set operator >*/ { upgrad_set(upg,t,w,f); dp = dp0; mp = mp0; }
void fatomo_set(float **t /* stencil time */, int **m /* mask */) /*< set fatomo operator and right-hand side >*/ { int is; /* set stencil */ for (is=0; is < ns; is++) { upgrad_set(upglist[is],t[is]); } /* set mask */ mask = m; }
int fastmarch(float *time /* time */, float *source /* source */, int *list /* list */, int *mask /* recv */, float *data /* reco */, float *rhs /* rhs */, upgrad upg /* stencil */) /*< run fast marching eikonal solver >*/ { int its; float xs[3], *p; int npoints, i, j, k, count, length; #ifdef _OPENMP its = omp_get_thread_num(); #else its = 0; #endif /* point t to time for pqueue operations */ t[its] = time; /* source distance from origin */ xs[0] = source[0]-o[0]; xs[1] = source[1]-o[1]; xs[2] = source[2]-o[2]; /* initialize priority queue */ xn[its] = x[its]; x1[its] = x[its]+1; count = 0; length = 0; /* fast marching */ for (npoints = neighbors_nearsource(time,xs); npoints > 0; npoints -= neighbours(time,i)) { /* smallest value in queue */ p = pqueue_extract(); if (p == NULL) { sf_warning("%s: shot (%g,%g,%g) heap exausted!",__FILE__,source[0],source[1],source[2]); break; } i = p-time; /* update wave front */ in[its][i] = SF_IN; /* update stencil */ upgrad_set(upg,time,i,in[its],length); length++; /* update rhs */ k = list[0]; for (j=0; j < list[1]; j++) { if (i == mask[j]) { rhs[k+j] = data[j]-time[i]; count++; break; } } /* break for limited acquisition */ if (count == list[1]) break; } return(length); }