Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;    
}
Ejemplo n.º 3
0
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);
}