示例#1
0
文件: banded.c 项目: 1014511134/src
void sf_banded_const_define (sf_bands slv, 
			     float diag        /* diagonal */, 
			     const float* offd /* off-diagonal [band] */)
/*< define matrix with constant diagonal coefficients >*/
{
    int k, m, m1, n, n1;
    float t;
    
    for (k = 0; k < slv->n; k++) {   
	t = diag;
	m1 = SF_MIN(k,slv->band);
	for (m = 0; m < m1; m++)
	    t -= (slv->o[m][k-m-1])*(slv->o[m][k-m-1])*(slv->d[k-m-1]);
	slv->d[k] = t;
	n1 = SF_MIN(slv->n-k-1,slv->band);
	for (n = 0; n < n1; n++) {
	    t = offd[n];
	    m1 = SF_MIN(k,slv->band-n-1);
	    for (m = 0; m < m1; m++) {
		t -= (slv->o[m][k-m-1])*(slv->o[n+m+1][k-m-1])*(slv->d[k-m-1]);
	    }
	    slv->o[n][k] = t/slv->d[k];
	}
    }
}
示例#2
0
文件: banded.c 项目: 1014511134/src
void sf_banded_define (sf_bands slv, 
		       float* diag  /* diagonal [n] */, 
		       float** offd /* off-diagonal [band][n] */)
/*< define the matrix >*/
{
    int k, m, m1, n, n1;
    float t;
    
    for (k = 0; k < slv->n; k++) {
	t = diag[k];
	m1 = SF_MIN(k,slv->band);
	for (m = 0; m < m1; m++)
	    t -= (slv->o[m][k-m-1])*(slv->o[m][k-m-1])*(slv->d[k-m-1]);
	slv->d[k] = t;
	n1 = SF_MIN(slv->n-k-1,slv->band);
	for (n = 0; n < n1; n++) {
	    t = offd[n][k];
	    m1 = SF_MIN(k,slv->band-n-1);
	    for (m = 0; m < m1; m++) {
		t -= (slv->o[m][k-m-1])*(slv->o[n+m+1][k-m-1])*(slv->d[k-m-1]);
	    }
	    slv->o[n][k] = t/slv->d[k];
	}
    }
}
示例#3
0
文件: banded.c 项目: 1014511134/src
void sf_banded_const_define_eps (sf_bands slv, 
				 float diag        /* diagonal */, 
				 const float* offd /* off-diagonal [band] */, 
				 int nb            /* size of the boundary */,
				 float eps         /* regularization parameter */)
/*< define matrix with constant diagonal coefficients 
  and regularized b.c. >*/
{
    int k, m, m1, n, n1;
    float t;
    
    for (k = 0; k < slv->n; k++) {   
	t = diag;
	if (k < nb || slv->n-k-1 < nb) t += eps;
	m1 = SF_MIN(k,slv->band);
	for (m = 0; m < m1; m++)
	    t -= (slv->o[m][k-m-1])*(slv->o[m][k-m-1])*(slv->d[k-m-1]);
	slv->d[k] = t;
	n1 = SF_MIN(slv->n-k-1,slv->band);
	for (n = 0; n < n1; n++) {
	    t = offd[n];
	    m1 = SF_MIN(k,slv->band-n-1);
	    for (m = 0; m < m1; m++) {
		t -= (slv->o[m][k-m-1])*(slv->o[n+m+1][k-m-1])*(slv->d[k-m-1]);
	    }
	    slv->o[n][k] = t/slv->d[k];
	}
    }
}
示例#4
0
static float linterp2(float x,float t) 
{
    float ans,st0,st1;
    int i,k;

    i=SF_MAX(0,SF_MIN(nx1-1,floor(x/hx)));
    k=SF_MAX(0,SF_MIN(nt1-1,floor(t/ht)));
    if( k<nt1 ) {
	st0=linterp1(i,k,x);
	st1=linterp1(i,k+1,x);
	ans=linterp(st0,st1,ht,t);
    }
    else ans=linterp1(i,k,x);
    return ans;
}
示例#5
0
int main(int argc, char* argv[]) 
{
    int wide1,wide2,wide3, wide, shift1, shift2, shift3, i, j, k, i1, n1, i2, n2, i3, n3, i4, n4;
    float ***data, ***signal, ***win;
    sf_file in, out;

    sf_init (argc,argv);
    in = sf_input("in");
    out = sf_output("out");

    if (!sf_histint(in,"n1",&n1)) sf_error("No n1= in input");
    if (!sf_histint(in,"n2",&n2)) sf_error("No n2= in input");
    if (!sf_histint(in,"n3",&n3)) sf_error("No n3= in input");
    n4 = sf_leftsize(in,3);

    data = sf_floatalloc3(n1,n2,n3);
    signal = sf_floatalloc3(n1,n2,n3);

    if (!sf_getint("wide1",&wide1)) wide1=5;
    if (!sf_getint("wide2",&wide2)) wide2=5;
    if (!sf_getint("wide3",&wide3)) wide3=5;
    /* sliding window width */
    wide = wide1*wide2*wide3;

    win = sf_floatalloc3(wide1,wide2,wide3);

    for (i4=0; i4 < n4; i4++) {
	sf_floatread(data[0][0],n1*n2*n3,in);	
	for (i3=0; i3 < n3; i3++) { shift3 = SF_MAX (0, SF_MIN (n3-wide3, i3-wide3/2));
	    for (i2=0; i2 < n2; i2++) { shift2 = SF_MAX (0, SF_MIN (n2-wide2, i2-wide2/2));
		for (i1=0; i1 < n1; i1++) { shift1 = SF_MAX (0, SF_MIN (n1-wide1, i1-wide1/2));
		    for (i=0; i < wide; i++) {
			for (j=0; j < wide; j++) {
			    for (k=0; k < wide; k++) {
				win[i][j][k] = data[shift3+k][shift2+i][shift1+j];
			    }
			}
		    }
		    signal[i3][i2][i1] = sf_quantile(wide/2,wide,win[0][0]);
		}
	    }
	}
	
	sf_floatwrite(signal[0][0],n1*n2*n3,out);
    }	

    exit(0);
}
示例#6
0
static int
vorbis_command (SF_PRIVATE *psf, int command, void * data, int datasize)
{	VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;

	switch (command)
	{	case SFC_SET_COMPRESSION_LEVEL :
			if (data == NULL || datasize != sizeof (double))
				return SF_FALSE ;

			if (psf->have_written)
				return SF_FALSE ;

			vdata->quality = 1.0 - *((double *) data) ;

			/* Clip range. */
			vdata->quality = SF_MAX (0.0, SF_MIN (1.0, vdata->quality)) ;

			psf_log_printf (psf, "%s : Setting SFC_SET_VBR_ENCODING_QUALITY to %f.\n", __func__, vdata->quality) ;
			return SF_TRUE ;

		default :
			return SF_FALSE ;
	} ;

	return SF_FALSE ;
} /* vorbis_command */
示例#7
0
int main(void)
{
	
    int i, j, i1, nf=8, n1=101, n2=301, im;
    float *a, *a1, *a2, *w, f;   /* a is reference data, a1 is true data, a2 is interpolated data. */

    a=sf_floatalloc(n1);
    a1=sf_floatalloc(n2);
    a2=sf_floatalloc(n2);
    w=sf_floatalloc(nf);  
   
    for(i=0;i<n1;i++)
	a[i]=sinf(SF_PI/100*i)+cosf(SF_PI/100*i); /* Calculate original data point value. */
    
    for(i=0;i<n2;i++)
        a1[i]=sinf(SF_PI/100*(0+1.0/3*i))+cosf(SF_PI/100*(0+1.0/3*i)); /* Calculate true fine-grid data point value. */

    for(i1=0;i1<n2;i1++)
    {
	f=(1.0-0.5*nf)+(0+1.0/3*i1-0)/1;
	j=f;  /* j is grid location */
	f-=j; /* f is offset from grid location */
        sf_spline_int(f,nf,w);
	a2[i1]=0;
	for (i = SF_MAX(0,-j); i < SF_MIN(nf,n1-j); i++) { 
	    im = i+j;
	    a2[i1]+=a[im]*w[i];
	}
    }

    for(i=0;i<n2;i++)
	sf_warning("Interpolation result comparison: True[%d]=%f, Inter[%d]=%f",i,a1[i],i,a2[i]);

    exit(0);
}
示例#8
0
文件: graph.c 项目: housian0724/src
static void getminmax(const float* f, float* min, float* max)
{
    int i, m, nc;
    float fmin, fmax, fi, fbig, fsml, fdif;

    m=0;
    fmin=+FLT_MAX;
    fmax=-FLT_MAX;
    for (i=0; i < n; i++) {
	fi = f[i];
	if (isfinite(fi)) {
	    t[m] = fi;
	    m++;
	    if (fmin > fi) fmin=fi;
	    if (fmax < fi) fmax=fi;
	}
    }

    nc = (1.-0.01*pclip)*m;
    if (nc < 0) nc=0;
    if (nc >= m) nc=m-1;
    
    if (nc > 0 && nc < m-1) {
	fsml = sf_quantile(nc,m,t);
	fbig = sf_quantile(m-nc-1, m,t);
	fdif = fbig - fsml;

	*min = SF_MAX(fmin-fdif/8,fsml-fdif);
	*max = SF_MIN(fmax+fdif/8,fbig+fdif);
    } else {
	*min = fmin;
	*max = fmax;
    }
}
示例#9
0
static int
ogg_command (SF_PRIVATE *psf, int command, void * data, int datasize)
{	VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;

	switch (command)
	{	case SFC_SET_VBR_ENCODING_QUALITY :
			if (data == NULL || datasize != sizeof (double))
				return 1 ;

			if (psf->have_written)
				return 1 ;

			vdata->quality = *((double *) data) ;

			/* Clip range. */
			vdata->quality = SF_MAX (0.0, SF_MIN (1.0, vdata->quality)) ;

			psf_log_printf (psf, "%s : Setting SFC_SET_VBR_ENCODING_QUALITY to %f.\n", __func__, vdata->quality) ;
			break ;

		default :
			return 0 ;
		} ;

	return 0 ;
} /* ogg_command */
示例#10
0
文件: stretch4.c 项目: krushev36/src
void stretch4_invert (bool add /* add flag */,
		      map4 str, 
		      float* ord /* [nd] */, 
		      float* mod /* [n1] */)
/*< convert model to ordinates by spline interpolation >*/
{
    int id, it, i, nt, i1, i2;
    float *w, *mm;

    sf_adjnull(false,add,str->nt,str->nd,mod,ord);

    mm = str->diag;
    nt = str->nt;

    for (it = 0; it < nt; it++) {
	mm[it] = mod[it];
    }

    sf_tridiagonal_solve(str->tslv, mm);

    for (id = 0; id < str->nd; id++) {
	if (str->m[id]) continue;
	
	it = str->x[id]; 
	w = str->w[id]; 
	
	i1 = SF_MAX(0,-it);
	i2 = SF_MIN(4,nt-it);

	for (i=i1; i < i2; i++) {
	    ord[id] += w[i]*mm[it+i];
	}
    } 
}
示例#11
0
文件: slow3.c 项目: 1014511134/src
/*------------------------------------------------------------*/
int slow3(int nr           /* maximum number of references */, 
	  float ds         /* minimum slowness separation */, 
	  int ns           /* number of slownesses */, 
	  const float* ss  /* [ns] slowness array */, 
	  float* sr        /* [nr] reference slownesses squared */) 
/*< compute reference slownesses, return their number >*/
{
    int is,jr,ir;
    float smin, smax, s, s2=0., qr, *ss2;

    ss2 = sf_floatalloc(ns);
    for (is=0; is<ns; is++) {
	ss2[is]=ss[is];
    }
    
    smax = sf_quantile(ns-1,ns,ss2);
    smin = sf_quantile(   0,ns,ss2);
    nr = SF_MIN(nr,1+(smax-smin)/ds);
    
    jr=0;
    for (ir=0; ir<nr; ir++) {
	qr = (ir+1.0)/nr - 0.5 * 1./nr;
	s = sf_quantile(qr*ns,ns,ss2);
	if (0==ir || SF_ABS(s-s2) > ds) {
	    sr [jr] = s*s;
	    s2 = s;
	    jr++;
	}
    }
    
    free(ss2);
    return jr;
}
示例#12
0
文件: caf.c 项目: weiwei22844/sox
static int
caf_read_chanmap (SF_PRIVATE * psf, sf_count_t chunk_size)
{	const AIFF_CAF_CHANNEL_MAP * map_info ;
	unsigned channel_bitmap, channel_decriptions, bytesread ;
	int layout_tag ;

	bytesread = psf_binheader_readf (psf, "E444", &layout_tag, &channel_bitmap, &channel_decriptions) ;

	map_info = aiff_caf_of_channel_layout_tag (layout_tag) ;

	psf_log_printf (psf, "  Tag    : %x\n", layout_tag) ;
	if (map_info)
		psf_log_printf (psf, "  Layout : %s\n", map_info->name) ;

	if (bytesread < chunk_size)
		psf_binheader_readf (psf, "j", chunk_size - bytesread) ;

	if (map_info && map_info->channel_map != NULL)
	{	size_t chanmap_size = SF_MIN (psf->sf.channels, layout_tag & 0xff) * sizeof (psf->channel_map [0]) ;

		free (psf->channel_map) ;

		if ((psf->channel_map = malloc (chanmap_size)) == NULL)
			return SFE_MALLOC_FAILED ;

		memcpy (psf->channel_map, map_info->channel_map, chanmap_size) ;
		} ;

	return 0 ;
} /* caf_read_chanmap */
示例#13
0
文件: hwt3d.c 项目: 1014511134/src
/*------------------------------------------------------------*/
float hwt3d_getv(float ***vv,
		 pt3d P) 
/*< get velocity from 3-D cube by linear interpolation >*/
{
    double  z, x, y;
    double rz,rx,ry;
    int    jz,jx,jy;
    double fz,fx,fy;
    float  v;
    int    kz,kx,ky;

    x = SF_MIN(SF_MAX(ax.o,P.x),ax.o+(ax.n-2)*ax.d);
    y = SF_MIN(SF_MAX(ay.o,P.y),ay.o+(ay.n-2)*ay.d);
    z = SF_MIN(SF_MAX(az.o,P.z),az.o+(az.n-2)*az.d);

    rx = (x-ax.o)/ax.d;
    jx = (int)(rx);
    fx =       rx-jx;
    kx = jx+1;

    ry = (y-ay.o)/ay.d;
    jy = (int)(ry);
    fy =       ry-jy;
    ky = jy+1;

    rz = (z-az.o)/az.d;
    jz = (int)(rz);
    fz =       rz-jz;
    kz = jz+1;

    if(ax.n==1) {jx=0; kx=0; fx=0;}
    if(ay.n==1) {jy=0; ky=0; fy=0;}
    if(az.n==1) {jz=0; kz=0; fz=0;}

    v = vv[ jy][ jx][ jz] * (1-fz)*(1-fx)*(1-fy) +
	vv[ jy][ jx][ kz] * (  fz)*(1-fx)*(1-fy) +
	vv[ ky][ jx][ jz] * (1-fz)*(1-fx)*(  fy) +
	vv[ ky][ jx][ kz] * (  fz)*(1-fx)*(  fy) + 
	vv[ jy][ kx][ jz] * (1-fz)*(  fx)*(1-fy) +
	vv[ jy][ kx][ kz] * (  fz)*(  fx)*(1-fy) +
	vv[ ky][ kx][ jz] * (1-fz)*(  fx)*(  fy) +
	vv[ ky][ kx][ kz] * (  fz)*(  fx)*(  fy);

    return(v);
}
示例#14
0
static char solve2pt(int ind,int inda,int indb,float ha,float hb,char ch) 
{
    int kmin /* ,i,k  ,i1,k1 */;
  float x1,x2;
  float xa,ta,xb,tb,x,t,tmin;
  float d,dp,dp2,df;
  char /* ch1='y', */ ch2='n';
  int ntry=0;

  xa=*(x0+inda);
  ta=*(t0+inda);
  xb=*(x0+indb);
  tb=*(t0+indb);
  tmin=SF_MAX(ta,tb)-TOL;
  kmin=floor(tmin/ht);
  x1=SF_MIN(xa,xb)-TOL;
  x2=SF_MAX(xa,xb)+TOL;
  t=*(t0+ind);
  if( kmin<nt1 ) {
    while( ch2=='n' && ntry<NTRYMAX ) {
      x=lateral(t,xa,xb,ta,tb,ha,hb);
      /*i=SF_MAX(0,SF_MIN(nx1-1,floor(x/hx)));
	k=SF_MAX(0,SF_MIN(nt1-1,floor(t/ht))); */
      d=fn(t,ta,tb,xa,xb,ha,hb);
      dp=2.0*d;
      dp2=dp;
      while( fabs(d)>TOL && fabs(dp2)>fabs(d) ) {
        df=dfn(t,ta,tb,xa,xb,ha,hb);
        t-=d/df;
        dp2=dp;
        dp=d;
        d=fn(t,ta,tb,xa,xb,ha,hb);
      } 
      x=lateral(t,xa,xb,ta,tb,ha,hb);
/*      i1=SF_MAX(0,SF_MIN(nx1-1,floor(x/hx)));
	k1=SF_MAX(0,SF_MIN(nt1-1,floor(t/ht))); */
      if( x>=x1 && x<=x2 && t>=tmin ) ch2='y';
      ntry++;
    }
    if( fabs(d)<=TOL  && t>=tmin  ) {
      if( x>=x1 && x<=x2 ) {
/*	ch1='n'; */
	if( *(pup+ind)<=1 || (*(pup+ind)==2 && t<(*(t0+ind))) ) {
	  ch='s';
	  *(t0+ind)=t;
	  *(x0+ind)=x;
	  *(pup+ind)=2;
	  *(v+ind)=1.0/linterp2(x,t);
	}
	ch=(ch=='s') ? 's' : 'n';
      }
    }
  }
  else
    ch=(ch=='s') ? 's' : 'f';
  return ch;
}
示例#15
0
文件: pweno.c 项目: 1014511134/src
void sf_pweno_apply (sf_pweno ent, 
		int i     /* grid location */, 
		float x   /* offset from grid */, 
		float *f  /* output data value */, 
		float *f1 /* output derivative */, 
		derr what /* flag of what to compute */) 
/*< Apply interpolation >*/
{
    int j, k, i1, i2, n;
    float s, s1, y, w, g, g1, tw;

    /* Stencil */
    i2 = SF_MAX(0,SF_MIN(i,ent->n-ent->order));
    i1 = SF_MIN(i2,SF_MAX(0,i-ent->order+2));
    
    /* ENO selection */
    w = fabsf(ent->diff[ent->order-1][i1]);
    for (j=i1+1; j <=i2; j++) {
	g = ((j != i) ? fabsf(ent->diff[ent->order-1][j]) : fabsf(ent->diff[ent->order][i]) );
	if (w > g) w = g;
    }
    
    /* Loop over starting points */
    for (g = 0., g1 = 0., n = 0, j = i1; j <= i2; j++) {
        tw = ((j != i) ? ent->diff[ent->order-1][j] : ent->diff[ent->order][i] );
	if (fabsf(tw) > w) continue;
	n++;
        
	y = x + i - j;
	
	/* Loop to compute the polynomial */
	for (s = 1., s1 = 0., k=0; k < ent->order; k++) {
	    if (what != FUNC1) {
		g1 += s1*ent->diff[k][j];
		s1 = (s + s1*(y-k))/(k+1.);
	    }
	    if (what != DER1) g += s*((k != (ent->order-1) || j != i) ?  ent->diff[k][j] : ent->diff[ent->order][i] );
	    s *= (y-k)/(k+1.);
	}
    }
    
    if (what != DER1) *f = g/n;
    if (what != FUNC1) *f1 = g1/n;
}
示例#16
0
文件: rotate.c 项目: 1014511134/src
void shot_rotate_get_bx_ex_iz(float *dkx,int *bx,int *ex, int iz,int boundary_nx, struct shot_rotate_par_type rotate_par)
/*< rotate >*/
{

    float dx,dz,rotate_angle;
    int nx,nz,nx_rotate,nz_rotate,ix_rotate_center;
    int nz_left,nz_right;
    int tmp_nx,nx_iz;
    float x,z,tan_rotate_angle;
    dx=rotate_par.dx; dz=rotate_par.dz; nx=rotate_par.nx; nz=rotate_par.nz; rotate_angle=rotate_par.rotate_angle;
    nx_rotate=rotate_par.nx_rotate;     nz_rotate=rotate_par.nz_rotate; ix_rotate_center=rotate_par.ix_rotate_center;
    nz_left=rotate_par.nz_left; nz_right=rotate_par.nz_right;
    tan_rotate_angle=sin(fabs(rotate_angle))/cos(fabs(rotate_angle));
    if (iz < nz_left) {
	z=(float)(iz)*dz; 
	x=z*tan_rotate_angle;
	tmp_nx=(int)(x/dx)+boundary_nx;
	*bx=SF_MAX(0,ix_rotate_center-tmp_nx);
    }
    else{
	z=(float)(iz-nz_left)*dz; x=z/tan_rotate_angle;
	tmp_nx=(int)(x/dx)-boundary_nx;
	*bx=SF_MAX(0,tmp_nx);
    }
    if (iz <nz_right){
	z=(float)(iz)*dz; x=z/tan_rotate_angle;
	tmp_nx=(int)(x/dx)+boundary_nx;
	*ex=SF_MIN(nx_rotate-1,ix_rotate_center+tmp_nx); 
    }
    else{
	z=(float)(iz-nz_right)*dz; x=z*tan_rotate_angle;
	tmp_nx=(int)(x/dx)-boundary_nx;
	*ex=SF_MIN(nx_rotate-1,nx_rotate-tmp_nx);
    }
    nx_iz=kissfftn(*ex-*bx+1); *ex=*bx+nx_iz-1;
    if ( *ex > nx_rotate-1 ){
	//*bx=0; *ex=nx_rotate-1; nx_iz=nx_rotate;
	*ex=nx_rotate-1; *bx=*ex+1-nx_iz; 
	if (*bx<0){*ex=nx_rotate-1; *bx=0; nx_iz=nx_rotate;}
    }
    *dkx=2.0*SF_PI/((float)(nx_iz)*dx);
}
示例#17
0
文件: stretch4.c 项目: krushev36/src
void stretch4_apply (bool add /* add flag */,
		     map4 str, 
		     float* ord /* [nd] */, 
		     float* mod /* [n1] */)
/*< transform ordinates to model >*/
{
    int id, it, i, nt, i1, i2;
    float *w, *mm, *mod2;

    sf_adjnull(false,add,str->nd,str->nt,ord,mod);
        
    mm = str->diag;
    nt = str->nt;

    mod2 = sf_floatalloc(nt);

    for (it = 0; it < nt; it++) {
	mm[it] = 0.0f;
    }
    
    for (id = 0; id < str->nd; id++) {
	if (str->m[id]) continue;
	
	it = str->x[id]; 
	w = str->w[id]; 
	
	i1 = SF_MAX(0,-it);
	i2 = SF_MIN(4,nt-it);

	for (i=i1; i < i2; i++) {
	    mm[it+i] += w[i]*ord[id];
	}
    }    

    sf_banded_solve (str->slv, mm);

    for (it = 0; it <= str->ib; it++) {
	mm[it] = 0.0f;
    }
    
    for (it = str->ie; it < nt; it++) {
	mm[it] = 0.0f;
    }

    sf_spline4_post(nt,0,nt,mm,mod2);

    for (it=0; it < nt; it++) {
	if (it > str->ib && it < str->ie) {
	    mod[it] += mod2[it];
	}
    }

    free(mod2);
}
示例#18
0
文件: stretch4.c 项目: krushev36/src
void stretch4_apply_adj (bool add,  /* add flag */
			 map4 str, 
			 float* ord /* [nd] */, 
			 float* mod /* [n1] */)
/*< transform model to ordinates by adjoint operation >*/
{
    int id, it, i, nt, i1, i2;
    float *w, *mm, *mod2;

    sf_adjnull(true,add,str->nd,str->nt,ord,mod);
    
    mm = str->diag;
    nt = str->nt;

    mod2 = sf_floatalloc(nt);

    for (it = 0; it <= nt; it++) {
	mod2[it] = mod[it];
    }
    
    for (it = 0; it <= str->ib; it++) {
	mod2[it] = 0.0f;
    }
    
    for (it = str->ie; it < nt; it++) {
	mod2[it] = 0.0f;
    }

    sf_spline4_post(nt,0,nt,mod2,mm);

    for (it = 0; it <= str->ib; it++) {
	mm[it] = 0.0f;
    }
    
    for (it = str->ie; it < nt; it++) {
	mm[it] = 0.0f;
    }

    sf_banded_solve (str->slv, mm);

    for (id = 0; id < str->nd; id++) {
	if (str->m[id]) continue;
	
	it = str->x[id]; 
	w = str->w[id]; 
	
	i1 = SF_MAX(0,-it);
	i2 = SF_MIN(4,nt-it);

	for (i=i1; i < i2; i++) {
	    ord[id] += w[i]*mm[it+i];
	}
    } 
}
示例#19
0
文件: banded.c 项目: 1014511134/src
void sf_banded_solve (const sf_bands slv, float* b)
/*< invert (in place) >*/
{
    int k, m, m1;
    float t;

    for (k = 1; k < slv->n; k++) {
	t = b[k];
	m1 = SF_MIN(k,slv->band);
	for (m = 0; m < m1; m++)
	    t -= (slv->o[m][k-m-1]) * b[k-m-1];
	b[k] = t;
    }
    for (k = slv->n-1; k >= 0; k--) {
	t = b[k]/slv->d[k];
	m1 = SF_MIN(slv->n -k-1,slv->band);
	for (m = 0; m < m1; m++)
	    t -= slv->o[m][k] * b[k+m+1];
	b[k] = t;
    }
}
示例#20
0
文件: image.c 项目: 1014511134/src
void shot_image_stack(float *img,float mig_min_x,float mig_min_y,int mig_nx,int mig_ny,sf_file tag,
		      struct shot_image_par_type image_par)
/*< stack image >*/
{
    float *tmp_img;
    float img_min_x,img_max_x,img_min_y,img_max_y,img_dx,img_dy;
    float mig_max_x,rite_min_x,rite_max_x;
    int img_ny,img_nx,rite_nx;
    int n_hy_hx,img_nhx,img_nhy,nz;
    int ntmp_img[2],nimg[3];
    int rite_ix_b,array_ix_b;
    int block_size,block_i;
    int iy,rite_iy,ix,i_hy_hx,iz;

    img_min_x=image_par.min_x; img_max_x=image_par.max_x; img_min_y=image_par.min_y; img_max_y=image_par.max_y;
    img_dx=image_par.dx; img_dy=image_par.dy;             img_ny=image_par.ny; img_nx=image_par.nx;
    img_nhx=image_par.nhx; img_nhy=image_par.nhy;  nz=image_par.nz;

    mig_max_x=((float)(mig_nx-1))*img_dx+mig_min_x;

    rite_min_x=SF_MAX(img_min_x,mig_min_x); 
    rite_max_x=SF_MIN(img_max_x,mig_max_x);
    rite_nx=(rite_max_x-rite_min_x)/img_dx+1;

    n_hy_hx= img_nhy*img_nhx;  d3(n_hy_hx,nz,ntmp_img); d4(mig_ny,mig_nx,n_hy_hx,nimg);

    if (rite_nx >=1){
	rite_ix_b= (rite_min_x-img_min_x)/img_dx;
	array_ix_b=(rite_min_x-mig_min_x)/img_dx;
	tmp_img=sf_floatalloc(rite_nx*n_hy_hx*nz);
	block_size=4*n_hy_hx*nz;
	for(iy=0;iy<mig_ny;iy++){
	    vector_value_f(tmp_img,0.0,rite_nx*n_hy_hx*nz);
	    rite_iy= iy+(mig_min_y-img_min_y)/img_dy;
	    if (rite_iy < img_ny && rite_iy>= 0){
		block_i=rite_iy*img_nx+rite_ix_b;
		sf_seek(tag,block_i*block_size,SEEK_SET);
		sf_floatread(tmp_img,rite_nx*n_hy_hx*nz,tag);
		for(ix=0;ix<rite_nx;ix++){
		    for(i_hy_hx=0;i_hy_hx<n_hy_hx;i_hy_hx++){
			for(iz=0;iz<nz;iz++){
			    tmp_img[i3(ix,i_hy_hx,iz,ntmp_img)]+=img[i4(iz,iy,array_ix_b+ix,i_hy_hx,nimg)]; 
			}
		    }
		} 
		sf_seek(tag,block_i*block_size,SEEK_SET);
		sf_floatwrite(tmp_img,rite_nx*n_hy_hx*nz,tag);
	    }
	}
	free(tmp_img);
    }
}
示例#21
0
int
broadcast_var_get (SF_PRIVATE *psf, SF_BROADCAST_INFO * data, size_t datasize)
{	size_t size ;

	if (psf->broadcast_var == NULL)
		return SF_FALSE ;

	size = SF_MIN (datasize, bc_min_size (&(psf->broadcast_var->binfo))) ;

	memcpy (data, &(psf->broadcast_var->binfo), size) ;

	return SF_TRUE ;
} /* broadcast_var_set */
示例#22
0
int
broadcast_var_get (SF_PRIVATE *psf, SF_BROADCAST_INFO * data, size_t datasize)
{	size_t size ;

	if (psf->broadcast_16k == NULL)
		return SF_FALSE ;

	size = SF_MIN (datasize, bc_min_size ((const SF_BROADCAST_INFO *) psf->broadcast_16k)) ;

	memcpy (data, psf->broadcast_16k, size) ;

	return SF_TRUE ;
} /* broadcast_var_get */
示例#23
0
int main(int argc, char* argv[])
{
    char        *mode=NULL;             /* Standard types           */
    int         i1,i2,n1,n2;
    float       *list=NULL;

    sf_file     in=NULL,out=NULL;       /* RSF types                */

    sf_init(argc,argv);                 /* Initialize RSF           */

    in  = sf_input("in");               /* Open files               */
    out = sf_output("out");

    sf_fileflush(out,in);               /* Copy header to output    */

                                        /* Check input data type    */
    if (sf_gettype(in) != SF_FLOAT) sf_error("Input must be float.");

                                        /* Get the file sizes       */
    if (!sf_histint(in,"n1",&n1)) sf_error("No n1= in input.");

    n2 = sf_leftsize(in,1);

                                        /* Check mode               */
    if ((mode = sf_getstring("mode")) == NULL) mode = "min";
    /* 'min' (default) or 'max' */

    if (strcmp(mode,"min")!=0 && strcmp(mode,"max")!=0)
        sf_error ("Unknown mode %s.",mode);

    list = sf_floatalloc(n1);           /* Allocate list            */

    for (i2=0; i2<n2; i2++)             /* Process each list        */
    {
        sf_floatread(list,n1,in);       /* Read a list              */

                                        /* Find the min or max      */
        if (strcmp(mode,"min")==0)
            for (i1=1; i1<n1; i1++) list[i1] = SF_MIN(list[i1],list[i1-1]);

        if (strcmp(mode,"max")==0)
            for (i1=1; i1<n1; i1++) list[i1] = SF_MAX(list[i1],list[i1-1]);

        sf_floatwrite(list,n1,out);     /* Write the output         */
    }



    exit (0);
}
示例#24
0
float sf_esc_tracer3_sintersect (sf_esc_tracer3 esc_tracer, float *z, float *x, float *y,
                                 float *b, float *a, float dz, float dx, float dy,
                                 float db, float da, float fz, float fx, float fy,
                                 float fb, float fa)
/*< Compute intersection of a straight trajectory from (z, x, y, b, a) with 
    the nearest wall defined by (dz, dx, dy, db, da), return pseudotime along the trajectory >*/
{
    float tz, tx, ty, tb, ta, sigma, rp = 1e-6;
    /* Loop until curvature approximation by a straight line is adequate */
    do {
        /* Time to phase-space cell walls */
        tz = fabsf (fz) > rp ? fabsf (dz/fz) : SF_HUGE;
        tx = fabsf (fx) > rp ? fabsf (dx/fx) : SF_HUGE;
        ty = fabsf (fy) > rp ? fabsf (dy/fy) : SF_HUGE;
        tb = fabsf (fb) > rp ? fabsf (db/fb) : SF_HUGE;
        ta = fabsf (fa) > rp ? fabsf (da/fa) : SF_HUGE;
        /* Hitting the angle wall first - too much curvature on the ray,
           reduce distance by half */
        if ((ta < tz && ta < tx && ta < ty) ||
            (tb < tz && tb < tx && tb < ty)) {
            dz *= 0.5;
            dx *= 0.5;
            dy *= 0.5;
        }
    } while ((ta < tz && ta < tx && ta < ty) ||
             (tb < tz && tb < tx && tb < ty));
    sigma = SF_MIN (ta, tb);
    sigma = SF_MIN (ty, sigma);
    sigma = SF_MIN (tx, sigma);
    sigma = SF_MIN (tz, sigma);
    *z -= fz*sigma;
    *x -= fx*sigma;
    *y -= fy*sigma;
    *b -= fb*sigma;
    *a -= fa*sigma;
    return sigma;
}
示例#25
0
文件: dynprog.c 项目: 1014511134/src
void dynprog(int i0 /* starting velocity */,
	     float** weight /* [n1][n2] */)
/*< apply >*/
{
    float d, c, w, w2;
    int i1, i2, i, ic, ib, ie, it;
    
    if (NULL != ttime) {
	for (i2=0; i2 < n2; i2++) {
	    w = 0.5*(weight[0][i2]+weight[0][i0]);
	    ttime[0][i2] = SF_ABS(i2-i0)*w;
	}
    }
    
    for (i2=0; i2 < n2; i2++) {
	w = 0.5*(weight[1][i2]+weight[0][i0]);
	prev[i2] = dist[SF_ABS(i2-i0)]*w;
	what[1][i2] = i0;

	if (NULL != ttime) ttime[1][i2]=prev[i2];
    }

    for (i1=2; i1 < n1; i1++) {
	for (i2=0; i2 < n2; i2++) {
	    w = weight[i1][i2];
	    ib = SF_MAX(i2-gt,-1);
	    ie = SF_MIN(i2+gt,n2);
	    c = FLT_MAX;
	    ic = -1;
	    for (i=ib+1; i < ie; i++) {
		w2 = 0.5*(w+weight[i1-1][i]);
		d = dist[SF_ABS(i2-i)]*w2+prev[i];
		it = i-ib-1;
		if (d < c) {
		    c =	d;
		    ic = it;
		}
		prob[it]=d;
	    }

	    next[i2]=find_minimum(ic,ie-ib-1,ib+1,c,&what[i1][i2]);
	}
	for (i2=0; i2 < n2; i2++) {
	    prev[i2]=next[i2];
	    if (NULL != ttime) ttime[i1][i2]=prev[i2];
	}
    }
}
示例#26
0
文件: common.cpp 项目: conghui/swfwi
float cal_beta(const float *g0, const float *g1, const float *cg, int nz, int nx)
/*< calculate beta >*/
{
  float a = 0;
  float b = 0;
  float c = 0;
  for (int ix = 0; ix < nx; ix++) {
    for (int iz = 0; iz < nz; iz++) {
      int idx = ix * nz + iz;
      a += g1[idx] * (g1[idx] - g0[idx]); // numerator of HS
      b += cg[idx] * (g1[idx] - g0[idx]); // denominator of HS,DY
      c += g1[idx] * g1[idx]; // numerator of DY
    }
  }

  float beta_HS = (fabsf(b) > 0) ? (a / b) : 0.0;
  float beta_DY = (fabsf(b) > 0) ? (c / b) : 0.0;
  return SF_MAX(0.0, SF_MIN(beta_HS, beta_DY));
}
示例#27
0
文件: file.c 项目: liumch/src
void sf_unpipe (sf_file file, off_t size) 
/*< Redirect a pipe input to a direct access file >*/
{
    off_t nbuf, len, bufsiz;
    char *dataname=NULL;
    FILE* tmp;
    char *buf;
	
    if (!(file->pipe)) return;
	
    tmp = sf_tempfile(&dataname,"wb");
	
    bufsiz = sf_bufsiz(file);
    buf = sf_charalloc(SF_MIN(bufsiz,size));
	
    while (size > 0) {
	nbuf = (bufsiz < size)? bufsiz : size;
	if (nbuf != fread(buf,1,nbuf,file->stream) ||
	    nbuf != fwrite(buf,1,nbuf,tmp))
	    sf_error ("%s: trouble unpiping:",__FILE__);
	size -= nbuf;
    }
	
    free(buf);
	
    if (NULL != file->dataname ) {
	len = strlen(dataname)+1;
	file->dataname = (char*) sf_realloc(file->dataname,len,sizeof(char));
	memcpy(file->dataname,dataname,len);
    }
	
    /*
      if (unlink(file->dataname))
      sf_warning ("%s: trouble removing %s:",__FILE__,file->dataname);
    */
	
    (void) fclose(file->stream);
    file->stream = freopen(dataname,"rb",tmp);
	
    if (NULL == file->stream)
	sf_error ("%s: Trouble reading data file %s:",__FILE__,dataname);
} 
示例#28
0
文件: hwt3d.c 项目: 1014511134/src
/*------------------------------------------------------------*/
void hwt3d_fill(float*** tt, /* traveltime cube */
		int n)
/*< fill holes >*/
{
    int ix,iy,iz;
    int kx,ky,kz;
    int lx,ly,lz;
    int jx,jy,jz;
    float v;
    int   k;

    for(iz=0;iz<az.n;iz++) {
	for(iy=0;iy<ay.n;iy++) {
	    for(ix=0;ix<ax.n;ix++) {

		/*---------------------------------------*/
		if( tt[iy][ix][iz] == MISSING) {

		    kx=SF_MIN(SF_MAX(ix-n,0),ax.n-1);
		    ky=SF_MIN(SF_MAX(iy-n,0),ay.n-1);
		    kz=SF_MIN(SF_MAX(iz-n,0),az.n-1);

		    lx=SF_MIN(SF_MAX(ix+n,0),ax.n-1);
		    ly=SF_MIN(SF_MAX(iy+n,0),ay.n-1);
		    lz=SF_MIN(SF_MAX(iz+n,0),az.n-1);

		    k=0;
		    v=0.;
		    for(jz=kz;jz<=lz;jz++) {
			for(jy=ky;jy<=ly;jy++) {
			    for(jx=kx;jx<=lx;jx++) {
				
				if(    tt[jy][jx][jz] != MISSING) {
				    v+=tt[jy][jx][jz];
				    k++;
				}
			    }
			}
		    } /* local loop */
		    
		    if(k>0) tt[iy][ix][iz] = v/k;
		    
		} /* end if MISSING */
		/*---------------------------------------*/

	    }
	}
    } /* global loop */
}
示例#29
0
文件: caf.c 项目: weiwei22844/sox
static int
caf_get_chunk_data (SF_PRIVATE *psf, const SF_CHUNK_ITERATOR * iterator, SF_CHUNK_INFO * chunk_info)
{	int indx ;
	sf_count_t pos ;

	if ((indx = psf_find_read_chunk_iterator (&psf->rchunks, iterator)) < 0)
		return SFE_UNKNOWN_CHUNK ;

	if (chunk_info->data == NULL)
		return SFE_BAD_CHUNK_DATA_PTR ;

	chunk_info->id_size = psf->rchunks.chunks [indx].id_size ;
	memcpy (chunk_info->id, psf->rchunks.chunks [indx].id, sizeof (chunk_info->id) / sizeof (*chunk_info->id)) ;

	pos = psf_ftell (psf) ;
	psf_fseek (psf, psf->rchunks.chunks [indx].offset, SEEK_SET) ;
	psf_fread (chunk_info->data, SF_MIN (chunk_info->datalen, psf->rchunks.chunks [indx].len), 1, psf) ;
	psf_fseek (psf, pos, SEEK_SET) ;

	return SFE_NO_ERROR ;
} /* caf_get_chunk_data */
示例#30
0
文件: green.c 项目: 1014511134/src
void GreenTtAmp(float r1,float r2,float r3,float s1,float s2,float s3,double *tt,double *amp)
/*< traveltime-amplitude >*/
{
    double x2,z1,z2,beta,xr;
    double thetas,thetar;

    if (vgrad < EPS) {
	xr=sqrt((s1-r1)*(s1-r1) + (s2-r2)*(s2-r2) + (s3-r3)*(s3-r3));
	*tt=xr/v0;
	*amp=1./SF_MAX(xr,EPS);
    } else {

	x2=sqrt((s1-r1)*(s1-r1) + (s2-r2)*(s2-r2));
	if (x2<EPS) { 
	    *tt=fabs(r3-s3)/(0.5*s3*vgrad+0.5*r3*vgrad+v0);
	    *amp=1./((*tt)*v0);
	    return;
	}

	z1=SF_MIN(s3,r3); z1+=v0/vgrad;
	z2=SF_MAX(s3,r3); z2+=v0/vgrad;

	beta=0.5*(z1+z2)/x2;
	xr=0.5*x2-beta*(z1-z2);

	thetas=atan(z1/xr);
	if (fabs(xr-x2)<EPS) thetar=SF_PI/2.;
	else                    thetar=atan(z2/(xr-x2));

	if (xr > x2)
	    *tt= (log(fabs(tan(thetar/2)))-log(fabs(tan(thetas/2))))/vgrad;
	else if (xr < x2)
	    *tt=-(log(fabs(tan(thetar/2)))+log(fabs(tan(thetas/2))))/vgrad;
	else 
	    *tt=-(log(fabs(tan(thetas/2))));

	*amp=1./(v0*SF_MAX(*tt,EPS));
    }
    return;
}