예제 #1
0
파일: fwi_commons.c 프로젝트: yunzhishi/src
void smooth_misfit(float **pp, float *fcost, int nr, int nt, int drectx, int drectz, int nrepeat, int ider)
/*< adjoint source of smoothing kernel misfit >*/
{
	int it, ir, nd;
	int m[2], rect[2];

	nd=nt*nr;
	m[0]=nt; m[1]=nr;
	rect[0]=drectz; rect[1]=drectx;

	sf_dtrianglen_init(2, rect, m);
	
	sf_dtrianglen(0, nrepeat, 6, pp[0]);
	
	for (ir=0; ir<nr; ir++)
		for (it=0; it<nt; it++)
			*fcost += 0.5*pp[ir][it]*pp[ir][it];

	sf_dtrianglen(ider, nrepeat, 6, pp[0]);
	
	if(ider!=0){
		for (ir=0; ir<nr; ir++)
			for (it=0; it<nt; it++)
				pp[ir][it] *=2.;
	}

	sf_dtrianglen_close();
}
예제 #2
0
파일: Mdsmooth.c 프로젝트: 717524640/src
int main (int argc, char* argv[]) 
{
    int dim, dim1, i, ider, nrep, i2, n1, n2, nderiv;
    int n[SF_MAX_DIM], rect[SF_MAX_DIM];
    char key[6];
    float* data;
    sf_file in, out;

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

    if (SF_FLOAT != sf_gettype(in)) sf_error("Need float input");

    dim = sf_filedims (in,n);
    dim1 = -1;
    for (i=0; i < dim; i++) {
	snprintf(key,6,"rect%d",i+1);
	if (!sf_getint(key,rect+i)) rect[i]=1;
	/*( rect#=(1,1,...) smoothing radius on #-th axis )*/ 
	if (rect[i] > 1) dim1 = i;
    }

    n1 = n2 = 1;
    for (i=0; i < dim; i++) {
	if (i <= dim1) {
	    n1 *= n[i];
	} else {
	    n2 *= n[i];
	}
    }

    data = sf_floatalloc (n1);

    if (!sf_getint("ider",&ider)) ider=0;
    /* direction of the derivative (0 means no derivative) */
    
    if (!sf_getint("repeat",&nrep)) nrep=1;
    /* repeat smoothing several times */

    if (!sf_getint("nderiv",&nderiv)) nderiv=6;
    /* derivative filter accuracy */

    sf_dtrianglen_init(dim1+1,rect,n);
    
    for (i2=0; i2 < n2; i2++) {
	sf_floatread(data,n1,in);

	sf_dtrianglen(ider, nrep, nderiv, data);
	
	sf_floatwrite(data,n1,out);
    }    

    exit (0);
}