示例#1
0
文件: newton.c 项目: blynn/frac
// Finds smallest root greater than given lower bound.
// Assumes there exists exactly one root with this property.
// (Impossible to solve equations if roots have same integer part at
// the moment. Don't do that.)
// TODO: Rewrite so you choose if you want smaller or greater root.
// or so it returns both solutions in an array.
static void *newton(cf_t cf) {
  newton_data_ptr nd = cf_data(cf);
  abc_t p;
  abc_init(p);
  abc_set_coeff(p, nd->a);
  cf_t x = nd->x;
  mpz_t z, z0, z1, one, pow2, t0, t1, t2;
  mpz_init(z); mpz_init(z0); mpz_init(z1); mpz_init(pow2);
  mpz_init(t0); mpz_init(t1); mpz_init(t2);
  mpz_init(one);
  mpz_set_ui(one, 1);

  void move_right() {
    cf_get(z, x);
    mpz_mul(t0, z, p->b1);
    mpz_add(t0, t0, p->b0);
    mpz_set(p->b0, p->b1);
    mpz_set(p->b1, t0);

    mpz_mul(t0, z, p->a1);  mpz_mul(t1, z, p->c1);
    mpz_add(t0, t0, p->a0); mpz_add(t1, t1, p->c0);
    mpz_set(p->a0, p->a1);  mpz_set(p->c0, p->c1);
    mpz_set(p->a1, t0);     mpz_set(p->c1, t1);
  }
示例#2
0
文件: Mpassive2d.c 项目: Seislet/src
int main(int argc, char* argv[])
{
    bool verb,pas,adj,abc;          /* execution flags */
    int ix, iz, it;                 /* index variables */
    int nt, nx, nz, depth, nzxpad, nb, n2, snap;
    float ox, oz, dx, dz, dt, dt2, idz2, idx2, cb;

    int nxpad, nzpad;
    float **vvpad;
    
    float **dd, **mm, **vv, ***ww;
    float **u0, **u1, **u2, **tmp;  /* temporary arrays */

    sf_file in, out, vel, wave;     /* I/O files */

    /* initialize Madagascar */
    sf_init(argc,argv);
    
    /* initialize OpenMP support */
#ifdef _OPENMP
    omp_init();
#endif

    if(!sf_getbool("verb", &verb)) verb=false;
    /* verbosity flag */
    if(!sf_getbool("adj", &adj)) adj=false;
    /* adjoint flag, 0: modeling, 1: migration */
    if(!sf_getbool("pas", &pas)) pas=false;
    /* passive flag, 0: exploding reflector rtm, 1: passive seismic imaging */
    if(!sf_getbool("abc",&abc)) abc = false;
    /* absorbing boundary condition */
    if(!sf_getint("snap", &snap)) snap=0;
    /* wavefield snapshot flag */
    if(!sf_getint("depth", &depth)) depth=0;
    /* surface */
	
    /* setup I/O files */
    in  = sf_input("in");
    out = sf_output("out");
    vel = sf_input("velocity");
    /* velocity model */
    
    /* Dimensions */
    if(!sf_histint  (vel, "n1", &nz)) sf_error("No n1= in velocity");
    if(!sf_histint  (vel, "n2", &nx)) sf_error("No n2= in velocity");
    if(!sf_histfloat(vel, "o1", &oz)) sf_error("No o1= in velocity");
    if(!sf_histfloat(vel, "o2", &ox)) sf_error("No o2= in velocity");
    if(!sf_histfloat(vel, "d1", &dz)) sf_error("No d1= in velocity");
    if(!sf_histfloat(vel, "d2", &dx)) sf_error("No d2= in velocity");

    if(adj){ /* migration */
        if(!sf_histint(in, "n1", &nt)) sf_error("No n1= in data");
        if(!sf_histfloat(in, "d1", &dt)) sf_error("No d1= in data");
        if(!sf_histint(in, "n2", &n2) || n2!=nx) sf_error("Need n2=%d in data", nx);

        sf_putint   (out, "n1", nz);
        sf_putfloat (out, "o1", oz);
        sf_putfloat (out, "d1", dz);
        sf_putstring(out, "label1", "Depth");
        sf_putstring(out, "unit1" , "km");
        sf_putint   (out, "n2", nx);
        sf_putfloat (out, "o2", ox);
        sf_putfloat (out, "d2", dx);
        sf_putstring(out, "label2", "Distance");
        sf_putstring(out, "unit2" , "km");
        if (pas) {
            sf_putint   (out, "n3", nt);
            sf_putfloat (out, "d3", dt);
            sf_putfloat (out, "o3", 0.0f);
            sf_putstring(out, "label3", "Time");
            sf_putstring(out, "unit3" , "s");
        }
    }else{ /* modeling */
        if(!sf_getint("nt", &nt)) sf_error("Need nt=");
        if(!sf_getfloat("dt", &dt)) sf_error("Need dt=");
        
        sf_putint   (out, "n1", nt);
        sf_putfloat (out, "d1", dt);
        sf_putfloat (out, "o1", 0.0);
        sf_putstring(out, "label1", "Time");
        sf_putstring(out, "unit1" , "s");
        sf_putint   (out, "n2", nx);
        sf_putfloat (out, "o2", ox);
        sf_putfloat (out, "d2", dx);
        sf_putstring(out, "label2", "Distance");
        sf_putstring(out, "unit2" , "km");
        if (pas) {
            sf_putint   (out, "n3", 1);
        }
    }
    
    /* dimension of padded boundary */
    if(!sf_getint("nb", &nb) || nb<NOP) nb = NOP;
    if(!sf_getfloat("cb", &cb)) cb = 0.0f;
    nxpad = nx+2*nb;
    nzpad = nz+2*nb;
    nzxpad = nzpad*nxpad;
    depth = depth+nb;

    /* set Laplacian coefficients */
    idz2 = 1.0f/(dz*dz);
    idx2 = 1.0f/(dx*dx);
    
    /* wavefield snapshot */
    if(snap){
        wave = sf_output("wave");
        
        sf_putint(wave, "n1", nzpad);
        sf_putfloat(wave, "d1", dz);
        sf_putfloat(wave, "o1", oz-nb*dz);
            
        sf_putint(wave, "n2", nxpad);
        sf_putfloat(wave, "d2", dx);
        sf_putfloat(wave, "o2", ox-nb*dx);
        
        sf_putint(wave, "n3", 1+(nt-1)/snap);
        if(adj){
            sf_putfloat(wave, "d3", -snap*dt);
            sf_putfloat(wave, "o3", (nt-1)*dt);
        }else{
            sf_putfloat(wave, "d3", snap*dt);
            sf_putfloat(wave, "o3", 0.0f);
        }
    }
        
    /* allocate arrays */
    vv    = sf_floatalloc2(nz, nx);
    dd    = sf_floatalloc2(nt, nx);
    vvpad = sf_floatalloc2(nzpad, nxpad);
    u0    = sf_floatalloc2(nzpad, nxpad);
    u1    = sf_floatalloc2(nzpad, nxpad);
    u2    = sf_floatalloc2(nzpad, nxpad);
    if (pas) {
        mm = NULL;
        ww = sf_floatalloc3(nz, nx, nt);
    } else {
        mm = sf_floatalloc2(nz, nx);
        ww = NULL;
    }
    
    /* read velocity */
    sf_floatread(vv[0], nz*nx, vel);
    
    /* pad boundary */
    dt2 = dt*dt;
    for     (ix=0; ix<nx; ix++)
        for (iz=0; iz<nz; iz++)
            vvpad[ix+nb][iz+nb] = vv[ix][iz]*vv[ix][iz]*dt2;
    for     (ix=0; ix<nxpad; ix++){
        for (iz=0; iz<nb;    iz++){
            vvpad[ix][      iz  ] = vvpad[ix][      nb  ];
            vvpad[ix][nzpad-iz-1] = vvpad[ix][nzpad-nb-1];
        }
    }
    for     (ix=0; ix<nb;    ix++){
        for (iz=0; iz<nzpad; iz++){
            vvpad[      ix  ][iz]=vvpad[      nb  ][iz];
            vvpad[nxpad-ix-1][iz]=vvpad[nxpad-nb-1][iz];
        }
    }

    memset(u0[0], 0.0f, nzxpad*sizeof(float));
    memset(u1[0], 0.0f, nzxpad*sizeof(float));
    memset(u2[0], 0.0f, nzxpad*sizeof(float));

    /* absorbing boundary condition */
    if (abc) {
        if (verb) sf_warning("absorbing boundary condition");
        abc_init(nzpad,nxpad,nzpad,nxpad,nb,nb,nb,nb,cb,cb,cb,cb);
    }

    if(adj){ /* migration */
        
        /* read data */
        sf_floatread(dd[0], nt*nx, in);
        
        for (it=nt-1; it>-1; it--){
            if (verb) sf_warning("Migration: %d/%d;", it, 0);
            
            /* time stepping */
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix, iz)
#endif
            for     (ix=NOP; ix<nxpad-NOP; ix++){
                for (iz=NOP; iz<nzpad-NOP; iz++){
                    u2[ix][iz] = LapT(u1,ix,iz,idx2,idz2,vvpad) + 2.0f*u1[ix][iz] - u0[ix][iz];
                }
            }
            /* rotate pointers */
            tmp=u0; u0=u1; u1=u2; u2=tmp;
            if (abc) abc_apply(u1[0]);
            if (abc) abc_apply(u0[0]);

            /* inject data */
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix)
#endif
            for (ix=nb; ix<nb+nx; ix++)
                u1[ix][depth] += dd[ix-nb][it];
            
            if (pas) {
                /* image source */
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix, iz)
#endif
                for     (ix=0; ix<nx; ix++)
                    for (iz=0; iz<nz; iz++)
                        ww[it][ix][iz] = u1[ix+nb][iz+nb];
            }
            if (snap && it%snap==0) sf_floatwrite(u1[0], nzxpad, wave);
        }
        if (verb) sf_warning(".");

        if (!pas) {
            /* output image */
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix, iz)
#endif
            for     (ix=0; ix<nx; ix++)
                for (iz=0; iz<nz; iz++)
                    mm[ix][iz] = u1[ix+nb][iz+nb];
            sf_floatwrite(mm[0], nz*nx, out);
        } else {
            /* output source */
            sf_floatwrite(ww[0][0], nz*nx*nt, out);
        }
    
    }else{/* modeling */
    	
        if (pas) { 
            /* read source */
            sf_floatread(ww[0][0], nz*nx*nt, in);
        } else { 
            /* read image */
            sf_floatread(mm[0], nz*nx, in);
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix, iz)
#endif
            for     (ix=0; ix<nx; ix++)
                for (iz=0; iz<nz; iz++)
                    u1[ix+nb][iz+nb] = mm[ix][iz];
        }

    	for (it=0; it<nt; it++){
            if (verb) sf_warning("Modeling: %d/%d;", it, nt-1);
            
            if(snap && it%snap==0) sf_floatwrite(u1[0], nzxpad, wave);
            if (pas){
                /* inject source */
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix, iz)
#endif
                for     (ix=0; ix<nx; ix++)
                    for (iz=0; iz<nz; iz++)
                        u1[ix+nb][iz+nb] += ww[it][ix][iz];
            }

            /* record data */
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix)
#endif
            for (ix=nb; ix<nb+nx; ix++)
	        dd[ix-nb][it] = u1[ix][depth];
            
            if (abc) abc_apply(u0[0]);
            if (abc) abc_apply(u1[0]);
            /* time stepping */
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix, iz)
#endif
            for     (ix=NOP; ix<nxpad-NOP; ix++){
                for (iz=NOP; iz<nzpad-NOP; iz++){
                    u2[ix][iz] = Lap (u1,ix,iz,idx2,idz2,vvpad) + 2.0f*u1[ix][iz] - u0[ix][iz];
                }
            }
            /* rotate pointers */
            tmp=u0; u0=u1; u1=u2; u2=tmp;
        }
    	if (verb) sf_warning(".");
        
    	/* output data */
    	sf_floatwrite(dd[0], nt*nx, out);
    }

    if(pas) {
        free(**ww); free(*ww); free(ww);
    } else {
        free(*mm); free(mm);
    }

    if (abc) abc_close();
    free(*vvpad); free(vvpad); free(*vv); free(vv);
    free(*dd); free(dd); 
    free(*u0); free(u0); free(*u1); free(u1); free(*u2); free(u2);
    exit (0);
}
示例#3
0
文件: psp.c 项目: 1014511134/src
int psp3(float **wvfld, float **wvfld1, float **dat, float **dat1, float *img, float *vel, pspar par)
/*< pseudo-spectral back propagation of two receiver wavefields >*/
{
    /*survey parameters*/
    int   nx, nz;
    float dx, dz;
    int   n_srcs;
    int   *spx, *spz;
    int   gpz, gpx, gpl;
    int   gpz_v, gpx_v, gpl_v;
    int   snap;
    /*fft related*/
    bool  cmplx;
    int   pad1;
    /*absorbing boundary*/
    bool abc;
    int nbt, nbb, nbl, nbr;
    float ct,cb,cl,cr;
    /*source parameters*/
    int src; /*source type*/
    int nt;
    float dt,*f0,*t0,*A;
    /*misc*/
    bool verb, ps;
    float vref;
    
    int nx1, nz1; /*domain of interest*/
    int it,iz,ik,ix,i,j;     /* index variables */
    int nk,nzx,nz2,nx2,nzx2,nkz,nth;
    int it1, it2, its;
    float dkx,dkz,kx0,kz0,vref2,kx,kz,k;
    float c, old;

    /*wave prop arrays*/
    float *vv;
    sf_complex *cwave,*cwavem;
    float *wave,*curr,*curr1,*prev,*prev1,*lapl;

    /*passing the parameters*/
    nx    = par->nx;
    nz    = par->nz;
    dx    = par->dx;
    dz    = par->dz;
    n_srcs= par->n_srcs;
    spx   = par->spx;
    spz   = par->spz;
    gpz   = par->gpz;
    gpx   = par->gpx;
    gpl   = par->gpl;
    gpz_v = par->gpz_v;
    gpx_v = par->gpx_v;
    gpl_v = par->gpl_v;
    snap  = par->snap;
    cmplx = par->cmplx;
    pad1  = par->pad1;
    abc   = par->abc;
    nbt   = par->nbt;
    nbb   = par->nbb;
    nbl   = par->nbl;
    nbr   = par->nbr;
    ct    = par->ct;
    cb    = par->cb;
    cl    = par->cl;
    cr    = par->cr;
    src   = par->src;
    nt    = par->nt;
    dt    = par->dt;
    f0    = par->f0;
    t0    = par->t0;
    A     = par->A;
    verb  = par->verb;
    ps    = par->ps;
    vref  = par->vref;
    

#ifdef _OPENMP
#pragma omp parallel
    {
      nth = omp_get_num_threads();
    }
#else
    nth = 1;
#endif
    if (verb) sf_warning(">>>> Using %d threads <<<<<", nth);

    nz1 = nz-nbt-nbb;
    nx1 = nx-nbl-nbr;

    nk = fft2_init(cmplx,pad1,nz,nx,&nz2,&nx2);
    nzx = nz*nx;
    nzx2 = nz2*nx2;
    
    dkz = 1./(nz2*dz); kz0 = (cmplx)? -0.5/dz:0.;
    dkx = 1./(nx2*dx); kx0 = -0.5/dx;
    nkz = (cmplx)? nz2:(nz2/2+1);
    if(nk!=nx2*nkz) sf_error("wavenumber dimension mismatch!");
    sf_warning("dkz=%f,dkx=%f,kz0=%f,kx0=%f",dkz,dkx,kz0,kx0);
    sf_warning("nk=%d,nkz=%d,nz2=%d,nx2=%d",nk,nkz,nz2,nx2);

    if(abc)
      abc_init(nz,nx,nz2,nx2,nbt,nbb,nbl,nbr,ct,cb,cl,cr);

    /* allocate and read/initialize arrays */
    vv     = sf_floatalloc(nzx); 
    lapl   = sf_floatalloc(nk);
    wave   = sf_floatalloc(nzx2);
    curr   = sf_floatalloc(nzx2);
    curr1  = sf_floatalloc(nzx2);
    prev   = sf_floatalloc(nzx2);
    prev1  = sf_floatalloc(nzx2);
    cwave  = sf_complexalloc(nk);
    cwavem = sf_complexalloc(nk);

    for (iz=0; iz < nzx; iz++) {
        vv[iz] = vel[iz]*vel[iz]*dt*dt;
    }
    vref *= dt;
    vref2 = vref*vref;
    for (iz=0; iz < nzx2; iz++) {
	curr[iz] = 0.;
	curr1[iz] = 0.;
	prev[iz] = 0.;
	prev1[iz] = 0.;
    }
    for (iz=0; iz < nz1*nx1; iz++) {
        img[iz] = 0.;
    }

    /* constructing the pseudo-analytical op */
    for (ix=0; ix < nx2; ix++) {
	kx = kx0+ix*dkx;
	for (iz=0; iz < nkz; iz++) {
	    kz = kz0+iz*dkz;
	    k = 2*SF_PI*hypot(kx,kz);
	    if (ps) lapl[iz+ix*nkz] = -k*k;
	    else lapl[iz+ix*nkz] = 2.*(cos(vref*k)-1.)/vref2;
	}
    }

    /* step backward in time */
    it1 = nt-1;
    it2 = -1;
    its = -1;	

    /* MAIN LOOP */
    for (it=it1; it!=it2; it+=its) {
      
        if(verb) sf_warning("it=%d/%d;",it,nt);
	
        /* first receiver wavefield */
	/* matrix multiplication */
	fft2(curr,cwave);

	for (ik = 0; ik < nk; ik++) {
#ifdef SF_HAS_COMPLEX_H
	  cwavem[ik] = cwave[ik]*lapl[ik];
#else
	  cwavem[ik] = sf_cmul(cwave[ik],lapl[ik]);
#endif
	}
	
	ifft2(wave,cwavem);

#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix,iz,i,j,old,c)
#endif
	for (ix = 0; ix < nx; ix++) {
	    for (iz=0; iz < nz; iz++) {
		i = iz+ix*nz;  /* original grid */
		j = iz+ix*nz2; /* padded grid */

		old = c = curr[j];
		c += c - prev[j];
		prev[j] = old;
		c += wave[j]*vv[i];
		curr[j] = c;
	    }
	}

	/* inject data */
	if (NULL!=dat) {
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix)
#endif
	    for (ix = 0; ix < gpl; ix++) {
	        curr[gpz+(ix+gpx)*nz2] += vv[gpz+(ix+gpx)*nz]*dat[ix][it];
	    }
	}

	/*apply abc*/
	if (abc) {
	  abc_apply(curr);
	  abc_apply(prev);
	}
	
	/* second receiver wavefield */
	/* matrix multiplication */
	fft2(curr1,cwave);

	for (ik = 0; ik < nk; ik++) {
#ifdef SF_HAS_COMPLEX_H
	  cwavem[ik] = cwave[ik]*lapl[ik];
#else
	  cwavem[ik] = sf_cmul(cwave[ik],lapl[ik]);
#endif
	}
	
	ifft2(wave,cwavem);

#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix,iz,i,j,old,c)
#endif
	for (ix = 0; ix < nx; ix++) {
	    for (iz=0; iz < nz; iz++) {
		i = iz+ix*nz;  /* original grid */
		j = iz+ix*nz2; /* padded grid */

		old = c = curr1[j];
		c += c - prev1[j];
		prev1[j] = old;
		c += wave[j]*vv[i];
		curr1[j] = c;
	    }
	}

	/* inject data */
	if (NULL!=dat1) {
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix)
#endif
	    for (ix = 0; ix < gpl; ix++) {
	        curr1[gpz+(ix+gpx)*nz2] += vv[gpz+(ix+gpx)*nz]*dat1[ix][it];
	    }
	}

	/*apply abc*/
	if (abc) {
	  abc_apply(curr1);
	  abc_apply(prev1);
	}

	/* cross-correlation imaging condition */
	if (snap > 0 && it%snap==0) {
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix,iz,i,j)
#endif
	    for (ix = 0; ix < nx1; ix++) {
	        for (iz = 0; iz < nz1; iz++) {
		    i = iz + nz1*ix;
		    j = iz+nbt + (ix+nbl)*nz2; /* padded grid */
		    img[i] += curr[j]*curr1[j]; //!!!IMPORTANT!!!
		}
	    }
	}
	
	/* save wavefield */
	if (snap > 0 && it%snap==0) {
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix,iz,i,j)
#endif
	  for (ix=0; ix<nx1; ix++) {
	    for (iz=0; iz<nz1; iz++) {
	      i = iz + nz1*ix;
	      j = iz+nbt + (ix+nbl)*nz2; /* padded grid */
	      wvfld[it/snap][i] = curr[j];
              wvfld1[it/snap][i] = curr1[j];
	    }
	  }
	}
    }
    if(verb) sf_warning(".");

    /*free up memory*/
    fft2_finalize();
    if (abc) abc_close();
    free(vv);
    free(lapl);   
    free(wave);
    free(curr);
    free(curr1);
    free(prev);
    free(prev1);
    free(cwave);
    free(cwavem);
    
    return 0;
}
示例#4
0
文件: psp.c 项目: 1014511134/src
int psp4(float **wvfld, float **wvfld0, float **dat, float **dat_v, float *vel, pspar par)
/*< pseudo-spectral wave extrapolation using wavefield injection >*/
{
    /*survey parameters*/
    int   nx, nz;
    float dx, dz;
    int   n_srcs;
    int   *spx, *spz;
    int   gpz, gpx, gpl;
    int   gpz_v, gpx_v, gpl_v;
    int   snap;
    /*fft related*/
    bool  cmplx;
    int   pad1;
    /*absorbing boundary*/
    bool abc;
    int nbt, nbb, nbl, nbr;
    float ct,cb,cl,cr;
    /*source parameters*/
    int src; /*source type*/
    int nt;
    float dt,*f0,*t0,*A;
    /*misc*/
    bool verb, ps;
    float vref;
    
    int nx1, nz1; /*domain of interest*/
    int it,iz,ik,ix,i,j;     /* index variables */
    int nk,nzx,nz2,nx2,nzx2,nkz,nth;
    int it1, it2, its;
    float dkx,dkz,kx0,kz0,vref2,kx,kz,k,t;
    float c, old;

    /*wave prop arrays*/
    float *vv;
    sf_complex *cwave,*cwavem;
    float *wave,*curr,*prev,*lapl;

    /*source*/
    float **rick;
    float freq;
    int fft_size;

    /*passing the parameters*/
    nx    = par->nx;
    nz    = par->nz;
    dx    = par->dx;
    dz    = par->dz;
    n_srcs= par->n_srcs;
    spx   = par->spx;
    spz   = par->spz;
    gpz   = par->gpz;
    gpx   = par->gpx;
    gpl   = par->gpl;
    gpz_v = par->gpz_v;
    gpx_v = par->gpx_v;
    gpl_v = par->gpl_v;
    snap  = par->snap;
    cmplx = par->cmplx;
    pad1  = par->pad1;
    abc   = par->abc;
    nbt   = par->nbt;
    nbb   = par->nbb;
    nbl   = par->nbl;
    nbr   = par->nbr;
    ct    = par->ct;
    cb    = par->cb;
    cl    = par->cl;
    cr    = par->cr;
    src   = par->src;
    nt    = par->nt;
    dt    = par->dt;
    f0    = par->f0;
    t0    = par->t0;
    A     = par->A;
    verb  = par->verb;
    ps    = par->ps;
    vref  = par->vref;
    

#ifdef _OPENMP
#pragma omp parallel
    {
      nth = omp_get_num_threads();
    }
#else
    nth = 1;
#endif
    if (verb) sf_warning(">>>> Using %d threads <<<<<", nth);

    nz1 = nz-nbt-nbb;
    nx1 = nx-nbl-nbr;

    nk = fft2_init(cmplx,pad1,nz,nx,&nz2,&nx2);
    nzx = nz*nx;
    nzx2 = nz2*nx2;
    
    dkz = 1./(nz2*dz); kz0 = (cmplx)? -0.5/dz:0.;
    dkx = 1./(nx2*dx); kx0 = -0.5/dx;
    nkz = (cmplx)? nz2:(nz2/2+1);
    if(nk!=nx2*nkz) sf_error("wavenumber dimension mismatch!");
    sf_warning("dkz=%f,dkx=%f,kz0=%f,kx0=%f",dkz,dkx,kz0,kx0);
    sf_warning("nk=%d,nkz=%d,nz2=%d,nx2=%d",nk,nkz,nz2,nx2);

    if(abc)
      abc_init(nz,nx,nz2,nx2,nbt,nbb,nbl,nbr,ct,cb,cl,cr);

    /* allocate and read/initialize arrays */
    vv     = sf_floatalloc(nzx); 
    lapl   = sf_floatalloc(nk);
    wave   = sf_floatalloc(nzx2);
    curr   = sf_floatalloc(nzx2);
    prev   = sf_floatalloc(nzx2);
    cwave  = sf_complexalloc(nk);
    cwavem = sf_complexalloc(nk);
    if (src==0) {
      rick = sf_floatalloc2(nt,n_srcs);
      for (i=0; i<n_srcs; i++) {
	for (it=0; it<nt; it++) {
	  rick[i][it] = 0.f;
	}
	rick[i][(int)(t0[i]/dt)] = A[i]; /*time delay*/
	freq = f0[i]*dt;           /*peak frequency*/
	fft_size = 2*kiss_fft_next_fast_size((nt+1)/2);
	ricker_init(fft_size, freq, 0);
	sf_freqfilt(nt,rick[i]);
	ricker_close();
      }
    } else rick = NULL;

    for (iz=0; iz < nzx; iz++) {
        vv[iz] = vel[iz]*vel[iz]*dt*dt;
    }
    vref *= dt;
    vref2 = vref*vref;
    for (iz=0; iz < nzx2; iz++) {
	curr[iz] = 0.;
	prev[iz] = 0.;
    }

    /* constructing the pseudo-analytical op */
    for (ix=0; ix < nx2; ix++) {
	kx = kx0+ix*dkx;
	for (iz=0; iz < nkz; iz++) {
	    kz = kz0+iz*dkz;
	    k = 2*SF_PI*hypot(kx,kz);
	    if (ps) lapl[iz+ix*nkz] = -k*k;
	    else lapl[iz+ix*nkz] = 2.*(cos(vref*k)-1.)/vref2;
	}
    }

    /* modeling */
    /* step forward in time */
    it1 = 0;
    it2 = nt;
    its = +1;

    /* MAIN LOOP */
    for (it=it1; it!=it2; it+=its) {
      
        if(verb) sf_warning("it=%d/%d;",it,nt);
	
	/* matrix multiplication */
	fft2(curr,cwave);

	for (ik = 0; ik < nk; ik++) {
#ifdef SF_HAS_COMPLEX_H
	  cwavem[ik] = cwave[ik]*lapl[ik];
#else
	  cwavem[ik] = sf_cmul(cwave[ik],lapl[ik]);
#endif
	}
	
	ifft2(wave,cwavem);

#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix,iz,i,j,old,c)
#endif
	for (ix = 0; ix < nx; ix++) {
	    for (iz=0; iz < nz; iz++) {
		i = iz+ix*nz;  /* original grid */
		j = iz+ix*nz2; /* padded grid */

		old = c = curr[j];
		c += c - prev[j];
		prev[j] = old;
		c += wave[j]*vv[i];
		curr[j] = c;
	    }
	}

        if (NULL!=wvfld0) { /* wavefield injection */
          if (snap > 0 && it%snap==0) {
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix,iz,i,j,ik)
#endif
            for (ix=0; ix<nx1; ix++) {
              for (iz=0; iz<nz1; iz++) {
                i = iz + nz1*ix;
                j = iz+nbt + (ix+nbl)*nz2; /* padded grid */
                ik = iz+nbt + (ix+nbl)*nz; /* padded grid */
                curr[j] += vv[ik]*wvfld0[it/snap][i];
              }
            }
          }
        } else { /* source injection */
          t = it*dt;
          for (i=0; i<n_srcs; i++) {
            for(ix=-1;ix<=1;ix++) {
              for(iz=-1;iz<=1;iz++) {
                ik = spz[i]+iz+nz*(spx[i]+ix);
                j = spz[i]+iz+nz2*(spx[i]+ix);
                if (src==0) {
                  curr[j] += vv[ik]*rick[i][it]/(abs(ix)+abs(iz)+1);
                } else {
                  curr[j] += vv[ik]*Ricker(t, f0[i], t0[i], A[i])/(abs(ix)+abs(iz)+1);
                }
              }
            }
          }
        }

	/*apply abc*/
	if (abc) {
	  abc_apply(curr);
	  abc_apply(prev);
	}

        /* record data */
        if (NULL!=dat) {
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix)
#endif
            for (ix = 0; ix < gpl; ix++) {
                dat[ix][it] = curr[gpz+(ix+gpx)*nz2];
            }
        }
        if (NULL!=dat_v) {
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(iz)
#endif
            for (iz = 0; iz < gpl_v; iz++) {
                dat_v[iz][it] = curr[gpz_v+iz+(gpx_v)*nz2];
            }
        }

	/* save wavefield */
	if (snap > 0 && it%snap==0) {
#ifdef _OPENMP
#pragma omp parallel for default(shared) private(ix,iz,i,j)
#endif
	  for (ix=0; ix<nx1; ix++) {
	    for (iz=0; iz<nz1; iz++) {
	      i = iz + nz1*ix;
	      j = iz+nbt + (ix+nbl)*nz2; /* padded grid */
	      wvfld[it/snap][i] = curr[j];
	    }
	  }
	}
    }
    if(verb) sf_warning(".");

    /*free up memory*/
    fft2_finalize();
    if (abc) abc_close();
    free(vv);
    free(lapl);   
    free(wave);
    free(curr);
    free(prev);
    free(cwave);
    free(cwavem);
    
    return 0;
}
示例#5
0
int main(int argc , char * argv[]){
  struct abctune * tunes, * tune;
  struct abcsym * sym;
  int n_tunes = 1, debug_flag=1, i;
  char info_type;

  abc_init((void *(*)(int sz)) malloc,
           free, 
           0,
           sizeof (struct SYMBOL) - sizeof (struct abcsym),
           1);

  if(argc == 2) { tunes = abc_parse(fslurp(argv[1])) ; }
  else          { tunes = abc_parse(fslurp("x.abc")) ; }

/* short lengthx[4]; */
/* printf("\n>>>>>>>>>>>>>%d\n",sizeof lengthx[0]); */
  printf("{"); // begin of structure
  printf("deco_tb => {"); // begin of deco_tb
  int o=0, first_deco=1;
  for(o=0; o<128; o++) {
    if (deco_tb[o]) { 
      if (first_deco) { first_deco = 0; }
      else            { printf(","); }
      printf("%d=>\"%s\"", o, deco_tb[o]); 
    }
  }
  printf("},"); // end of deco_tb
  if (debug_flag) printf("\n");

  printf("tunes => {"); // begin of tunes
  if (debug_flag) printf("\n");
  for (tune = tunes; tune != 0; tune = tune->next){

    printf("%d => {", n_tunes); // begin of tune
    if (debug_flag) printf("\n");

    printf("abc_vers=>%d,",tune->abc_vers);  
    if (tune->client_data)
      printf("client_data=>%s,",(char *)tune->client_data);  
    else
      printf("client_data=>\"\",");  
    printf("micro_tb=>[");
    for (i=0; i<MAXMICRO; i++) {
      if (i>0) printf(",");
      printf("%d",tune->micro_tb[i]); 
    }
    printf("],");
    if (debug_flag) printf("\n");
    printf("symbols=>["); // begin of symbols

    for (sym = tune->first_sym; sym != 0; sym = sym->next){
      printf("{"); // begin of symbol

      printf("type=>%d,"        ,sym->type);  
      printf("state=>%d,"       ,sym->state);
      printf("colnum=>%d,"      ,sym->colnum);  
      printf("flags=>%d,"       ,sym->flags);
      printf("linenum=>%d,"     ,sym->linenum);  
      printf("text=>\"%s\","    ,escape_string(sym->text));   
      printf("comment=>\"%s\"," ,escape_string(sym->comment));
      printf("info=>{"); // begin of info

      if (sym->type == 1) { // symbols of type 1 (Info)
        info_type = sym->text[0];
        switch (info_type) {
          case 'K': // Key
            printf("sf=>%d,"      ,sym->u.key.sf);
            printf("empty=>%d,"   ,sym->u.key.empty); 
            printf("exp=>%d,"     ,sym->u.key.exp); 
            printf("mode=>%d,"    ,sym->u.key.mode); 
            printf("nacc=>%d,"    ,sym->u.key.nacc); 
            printf("octave=>%d,"  ,sym->u.key.octave); 
            printf("pits=>[");
            for (i=0; i<8; i++) {
              if (i>0) printf(",");
              printf("%d",sym->u.key.pits[i]); 
            }
            printf("],");
            printf("accs=>[");
            for (i=0; i<8; i++) {
              if (i>0) printf(",");
              printf("%d",sym->u.key.accs[i]); 
            }
            printf("]");
            break;
          case 'L': // Length
            printf("base_length=>%d",sym->u.length.base_length);
            break;
          case 'M': // Meter
            printf("wmeasure=>%d,"  ,sym->u.meter.wmeasure); 
            printf("nmeter=>%d,"    ,sym->u.meter.nmeter); 
            printf("expdur=>%d,"    ,sym->u.meter.expdur); 
            printf("meter=>[");
            for (i=0; i<sym->u.meter.nmeter; i++){
              if (i>0) printf(",");
              printf("{");
              printf("top=>\"%s\"," ,escape_string(sym->u.meter.meter[i].top)); 
              printf("bot=>\"%s\""  ,escape_string(sym->u.meter.meter[i].bot));
              printf("}");
            }
            printf("]");
            break;
          case 'Q': // Tempo
            printf("str1=>\"%s\","  ,escape_string(sym->u.tempo.str1));
            printf("length=>[");
            for (i=0; i<4; i++) {
              if (i>0) printf(",");
              printf("%d",sym->u.tempo.length[i]);
/* printf("\n\n\n\n\tlength:%d\n\n\n\n",sym->u.tempo.length[i]); */
            }
            printf("],");
/* printf("\n\n\n\n\tvalue:%s\n\n\n\n",sym->u.tempo.value); */
            printf("value=>\"%s\"," ,escape_string(sym->u.tempo.value)); 
            printf("str2=>\"%s\""   ,escape_string(sym->u.tempo.str2)); 
            break;
          case 'V': // Voice
/* printf("\n\n\n\n\tvoice_id:%s\n\n\n\n",sym->u.voice.id); */
            printf("id=>\"%s\","    ,escape_string(sym->u.voice.id));
            printf("fname=>\"%s\"," ,escape_string(sym->u.voice.fname));
            printf("nname=>\"%s\"," ,escape_string(sym->u.voice.nname));
            printf("voice=>%d,"     ,sym->u.voice.voice); 
            printf("octave=>%d,"    ,sym->u.voice.octave); 
            printf("scale=>%f,"     ,sym->u.voice.scale); 
            printf("merge=>%d,"     ,sym->u.voice.merge); 
            printf("stem=>%d,"      ,sym->u.voice.stem); 
            printf("gstem=>%d,"     ,sym->u.voice.gstem); 
            printf("dyn=>%d,"       ,sym->u.voice.dyn); 
            printf("lyrics=>%d,"    ,sym->u.voice.lyrics); 
            printf("gchord=>%d"     ,sym->u.voice.gchord); 
            break;
          case 'U': // Symbols Redefition
            printf("symbol=>%d,"    ,sym->u.user.symbol); 
            printf("value=>%d"      ,sym->u.user.value); 
            break;
        }
      } // end of type 1

      if (sym->type == 3) { // symbols of type 3 (Clef)
        printf("name=>\"%s\",",escape_string(sym->u.clef.name)); 
        printf("staffscale=>%f,",sym->u.clef.staffscale); 
        printf("stafflines=>%d,",sym->u.clef.stafflines); 
        printf("type=>%d,",sym->u.clef.type); 
        printf("line=>%d,",sym->u.clef.line); 
        printf("octave=>%d,",sym->u.clef.octave); 
        printf("transpose=>%d,",sym->u.clef.transpose); 
        printf("invis=>%d,",sym->u.clef.invis); 
        printf("check_pitch=>%d",sym->u.clef.check_pitch); 
      } // end of type 3

      if (sym->type == 4 || sym->type == 5) { // symbols of type 4 and 5 (Note, Rest)
        printf("pits=>[");
        for (i=0; i<MAXHD; i++) {
          if (i>0) printf(",");
          printf("%d",sym->u.note.pits[i]); 
        }
        printf("],");
        printf("lens=>[");
        for (i=0; i<MAXHD; i++) {
          if (i>0) printf(",");
          printf("%d",sym->u.note.lens[i]); 
        }
        printf("],");
        printf("accs=>[");
        for (i=0; i<MAXHD; i++) {
          if (i>0) printf(",");
          printf("%d",sym->u.note.accs[i]); 
        }
        printf("],");
        printf("sl1=>[");
        for (i=0; i<MAXHD; i++) {
          if (i>0) printf(",");
          printf("%d",sym->u.note.sl1[i]); 
        }
        printf("],");
        printf("sl2=>[");
        for (i=0; i<MAXHD; i++) {
          if (i>0) printf(",");
          printf("%d",sym->u.note.sl2[i]); 
        }
        printf("],");
        printf("ti1=>[");
        for (i=0; i<MAXHD; i++) {
          if (i>0) printf(",");
          printf("%d",sym->u.note.ti1[i]); 
        }
        printf("],");
        printf("decs=>[");
        for (i=0; i<MAXHD; i++) {
          if (i>0) printf(",");
          printf("%d",sym->u.note.decs[i]); 
        }
        printf("],");
        printf("chlen=>%d,",sym->u.note.chlen); 
        printf("nhd=>%d,",sym->u.note.nhd); 
        printf("slur_st=>%d,",sym->u.note.slur_st); 
        printf("slur_end=>%d,",sym->u.note.slur_end); 
        printf("brhythm=>%d,",sym->u.note.brhythm); 
        printf("dc=>{");
        printf("n=>%d," ,sym->u.note.dc.n); 
        printf("h=>%d," ,sym->u.note.dc.h); 
        printf("s=>%d," ,sym->u.note.dc.s); 
        printf("t=>[");
        for (i=0; i<MAXDC; i++) {
          if (i>0) printf(",");
          printf("%d",sym->u.note.dc.t[i]); 
        }
        printf("]");
        printf("}"); // end of dc
      } // end of type 4, 5

      if (sym->type == 6 || sym->type == 8 || sym->type == 9) { // symbols of type 6, 8, 9 (Bar, Multi-measure Rest (mrest) and Measure Repeat (mrep))
        printf("type=>%d,",sym->u.bar.type); 
        printf("repeat_bar=>%d,",sym->u.bar.repeat_bar); 
        printf("len=>%d,",sym->u.bar.len); 
        printf("dotted=>%d,",sym->u.bar.dotted); 
        printf("dc=>{");
        printf("n=>%d," ,sym->u.bar.dc.n); 
        printf("h=>%d," ,sym->u.bar.dc.h); 
        printf("s=>%d," ,sym->u.bar.dc.s); 
        printf("t=>[");
        for (i=0; i<MAXDC; i++) {
          if (i>0) printf(",");
          printf("%d",sym->u.bar.dc.t[i]); 
        }
        printf("]");
        printf("}");
      } // end of type 6, 8, 9

      if (sym->type == 7) { // symbols of type 7 (End of Line (eoln))
        printf("type=>%d",sym->u.eoln.type); 
      } // end of type 7

      if (sym->type == 10) { // symbols of type 10 (Voice Overlay (v_over))
        printf("type=>%d,",sym->u.v_over.type); 
        printf("voice=>%d",sym->u.v_over.voice); 
      } // end of type 10

      if (sym->type == 11) { // symbols of type 11 (Tuplet)
        printf("p_plet=>%d,",sym->u.tuplet.p_plet); 
        printf("q_plet=>%d,",sym->u.tuplet.q_plet); 
        printf("r_plet=>%d",sym->u.tuplet.r_plet); 
      } // end of type 11

      printf("}"); // end of info

      printf("}"); // end of symbol
      if (sym->next != 0) printf(",");  
      if (debug_flag) printf("\n");
    }

    printf("]"); // end of symbols
    printf("}"); // end of tune
    if (tune->next != 0) printf(",");  
    n_tunes++;
  }
  printf("}");  // end of tunes
  printf("}");  // end of structure

  return 0;
}