예제 #1
0
파일: Mmpidip2.c 프로젝트: nicklinyi/src
int main (int argc, char *argv[])
{
    int n123, niter, order, nj1,nj2, i, j, liter, dim;
    int n[SF_MAX_DIM], rect[3], nr, ir; 
    float p0, *u, *p, pmin, pmax, eps;
    float **allu, **allp, d1, d2, d3, o1, o2, o3, *sendbuf, *recvbuf;
    bool verb, **mm;
    sf_file in, out, mask, dip0;

    int cpuid, numprocs, nrpad, iturn;
    MPI_Comm comm=MPI_COMM_WORLD;

    sf_init(argc,argv);

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(comm, &cpuid);
    MPI_Comm_size(comm, &numprocs);

    in = sf_input ("--input");
    out = sf_output ("--output");

    if (SF_FLOAT != sf_gettype(in)) sf_error("Need float type");
    if (cpuid==0) sf_warning("numprocs=%d", numprocs);

    dim = sf_filedims(in,n);
    if (dim < 2) n[1]=1;
    n123 = n[0]*n[1];
    nr = 1;
    for (j=2; j < dim; j++) {
        nr *= n[j];
    }

    n[2]= 1;
    rect[2]=1;
    nj2=1;

    if(nr%numprocs==0)
        nrpad=nr;
    else
        nrpad=(nr/numprocs+1)*numprocs;

    /* set up output dimension */
    if(cpuid==0){
        if (!sf_histfloat(in, "d1", &d1)) sf_error("No d1= in input");
        if (!sf_histfloat(in, "o1", &o1)) sf_error("No o1= in input");
        if (!sf_histfloat(in, "d2", &d2)) sf_error("No d2= in input");
        if (!sf_histfloat(in, "o2", &o2)) sf_error("No o2= in input");
        if (!sf_histfloat(in, "d3", &d3)) sf_error("No d3= in input");
        if (!sf_histfloat(in, "o3", &o3)) sf_error("No o3= in input");

        sf_putint(out, "n1", n[0]);
        sf_putfloat(out, "d1", d1);
        sf_putfloat(out, "o1", o1);
        sf_putstring(out, "label1", "Depth");
        sf_putstring(out, "unit1", "m");
        sf_putint(out, "n2", n[1]);
        sf_putfloat(out, "d2", d2);
        sf_putfloat(out, "o2", o2);
        sf_putstring(out, "label2", "Offset");
        sf_putstring(out, "unit2", "m");
        sf_putint(out, "n3", nr);
        sf_putfloat(out, "d3", d3);
        sf_putfloat(out, "o3", o3);
        sf_putstring(out, "label3", "CIGs");
        sf_putstring(out, "unit3", "m");
    }

    if (!sf_getint("niter",&niter)) niter=5;
    /* number of iterations */
    if (!sf_getint("liter",&liter)) liter=20;
    /* number of linear iterations */

    if (!sf_getint("rect1",&rect[0])) rect[0]=1;
    /* dip smoothness on 1st axis */
    if (!sf_getint("rect2",&rect[1])) rect[1]=1;
    /* dip smoothness on 2nd axis */

    if (!sf_getfloat("p0",&p0)) p0=0.;
    /* initial dip */

    if (!sf_getint("order",&order)) order=1;
    /* accuracy order */
    if (!sf_getint("nj1",&nj1)) nj1=1;
    /* antialiasing */

    if (!sf_getbool("verb",&verb)) verb = false;
    /* verbosity flag */
    if (!sf_getfloat("pmin",&pmin)) pmin = -FLT_MAX;
    /* minimum dip */
    if (!sf_getfloat("pmax",&pmax)) pmax = +FLT_MAX;
    /* maximum dip */

    if (!sf_getfloat("eps",&eps)) eps=0.0f;
    /* regularization */

    /* initialize dip estimation */
    dip3_init(n[0], n[1], n[2], rect, liter, eps, false);

    /* initial dip file */
    if(NULL != sf_getstring("dip0")){
        dip0=sf_input("dip0");
    }else{
        dip0=NULL;
    }
    if(cpuid==0){
        allu=sf_floatalloc2(n123, nrpad);
        sf_floatread(allu[0], n123*nr, in);
        for(ir=nr; ir<nrpad; ir++)
            for(i=0; i<n123; i++)
                allu[ir][i]=0.;
        allp=sf_floatalloc2(n123, nrpad);
        if(NULL != dip0){
            sf_floatread(allp[0], n123*nr, dip0);
            for(ir=nr; ir<nrpad; ir++)
                for(i=0; i<n123; i++)
                    allp[ir][i]=0.;
        }
    }
    u = sf_floatalloc(n123);
    p = sf_floatalloc(n123);

    /* masking operator */
    if(NULL != sf_getstring("mask")) {
        mm = sf_boolalloc2(n123,2);
        mask = sf_input("mask");
        if(cpuid==0) sf_floatread(u, n123, mask);
        MPI_Bcast(u, n123, MPI_FLOAT, 0, comm);
        mask32 (false, order, nj1, nj2, n[0], n[1], n[2], u, mm);
    }else{
        mm = (bool**) sf_alloc(2,sizeof(bool*));
        mm[0] = mm[1] = NULL;
    }

    /* loop over third dimension */
    for(iturn=0; iturn*numprocs<nrpad; iturn++){
        ir=iturn*numprocs+cpuid;
        if (cpuid==0 && verb) sf_warning("slice %d of %d;", ir+1, nr);

        /* image data */
        if(cpuid==0){
            sendbuf=allu[iturn*numprocs];
            recvbuf=u;
        }else{
            sendbuf=NULL;
            recvbuf=u;
        }
        MPI_Scatter(sendbuf, n123, MPI_FLOAT, recvbuf, n123, MPI_FLOAT, 0, comm);

        /* initialize t-x dip */
        if(NULL != dip0) {
            if(cpuid==0){
                sendbuf=allp[iturn*numprocs];
                recvbuf=p;
            }else{
                sendbuf=NULL;
                recvbuf=p;
            }
            MPI_Scatter(sendbuf, n123, MPI_FLOAT, recvbuf, n123, MPI_FLOAT, 0, comm);
        }else{
            for(i=0; i < n123; i++) {
                p[i] = p0;
            }
        }

        /* estimate t-x dip */
        if(ir<nr) dip3(false, 1, niter, order, nj1, u, p, mm[0], pmin, pmax);

        if(cpuid==0){
            sendbuf=p;
            recvbuf=allp[iturn*numprocs];
        }else{
            sendbuf=p;
            recvbuf=NULL;
        }
        MPI_Gather(sendbuf, n123, MPI_FLOAT, recvbuf, n123, MPI_FLOAT, 0, comm);
    }

    if(cpuid==0) sf_floatwrite(allp[0], n123*nr, out);

    MPI_Finalize();
    exit (0);
}
예제 #2
0
파일: Mdip2.c 프로젝트: 1014511134/src
int main (int argc, char *argv[])
{
    int n123, niter, order, nj1,nj2, i,j, liter, dim;
    int n[SF_MAX_DIM], rect[3], nr, ir; 
    float p0, *u, *p, pmin, pmax, eps;
    bool verb, **mm;
    sf_file in, out, mask, idip0;

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

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

    dim = sf_filedims(in,n);
    if (dim < 2) n[1]=1;
    n123 = n[0]*n[1];
    nr = 1;
    for (j=2; j < dim; j++) {
	nr *= n[j];
    }

    n[2]= 1;
    rect[2]=1;
    nj2=1;
    
    if (!sf_getint("niter",&niter)) niter=5;
    /* number of iterations */
    if (!sf_getint("liter",&liter)) liter=20;
    /* number of linear iterations */

    if (!sf_getint("rect1",&rect[0])) rect[0]=1;
    /* dip smoothness on 1st axis */
    if (!sf_getint("rect2",&rect[1])) rect[1]=1;
    /* dip smoothness on 2nd axis */

    if (!sf_getfloat("p0",&p0)) p0=0.;
    /* initial dip */

    if (!sf_getint("order",&order)) order=1;
    /* accuracy order */
    if (!sf_getint("nj1",&nj1)) nj1=1;
    /* antialiasing */

    if (!sf_getbool("verb",&verb)) verb = false;
    /* verbosity flag */
    if (!sf_getfloat("pmin",&pmin)) pmin = -FLT_MAX;
    /* minimum dip */
    if (!sf_getfloat("pmax",&pmax)) pmax = +FLT_MAX;
    /* maximum dip */

    if (!sf_getfloat("eps",&eps)) eps=0.0f;
    /* regularization */

    /* initialize dip estimation */
    dip3_init(n[0], n[1], n[2], rect, liter, eps, false);

    u = sf_floatalloc(n123);
    p = sf_floatalloc(n123);

    if (NULL != sf_getstring("mask")) {
	mm = sf_boolalloc2(n123,2);
	mask = sf_input("mask");
    } else {
	mm = (bool**) sf_alloc(2,sizeof(bool*));
	mm[0] = mm[1] = NULL;
	mask = NULL;
    }

    if (NULL != sf_getstring("idip")) {
	/* initial in-line dip */
	idip0 = sf_input("idip");
    } else {
	idip0 = NULL;
    }

    for (ir=0; ir < nr; ir++) {
	if (verb) sf_warning("slice %d of %d;", ir+1, nr);
    	if (NULL != mask) {
	    sf_floatread(u,n123,mask);
	    mask32 (false, order, nj1, nj2, n[0], n[1], n[2], u, mm);
	}

	/* read data */
	sf_floatread(u,n123,in);
	

	/* initialize t-x dip */
	if (NULL != idip0) {
	    sf_floatread(p,n123,idip0);
	} else {
	    for(i=0; i < n123; i++) {
		p[i] = p0;
	    }
	}
	
	/* estimate t-x dip */
	dip3(false, 1, niter, order, nj1, u, p, mm[0], pmin, pmax);
	
	/* write t-x dip */
	sf_floatwrite(p,n123,out);
	
    }
    if (verb) sf_warning(".");
    
    exit (0);
}