Exemple #1
0
int sglfdfor2(float ***fwf, float **rcd, bool verb)
{
	float **txxn1, **txxn0, **vxn1, **vxn0, **vzn1, **vzn0;
	int wfit;

	txxn1=sf_floatalloc2(nzb, nxb);
	txxn0=sf_floatalloc2(nzb, nxb);
	vxn1=sf_floatalloc2(nzb, nxb);
	vxn0=sf_floatalloc2(nzb, nxb);
	vzn1=sf_floatalloc2(nzb, nxb);
	vzn0=sf_floatalloc2(nzb, nxb);

	zero2(txxn1, nzb, nxb);
	zero2(txxn0, nzb, nxb);
	zero2(vxn1, nzb, nxb);
	zero2(vxn0, nzb, nxb);
	zero2(vzn1, nzb, nxb);
	zero2(vzn0, nzb, nxb);

	zero2(txxn1x, nzb, nxb);
	zero2(txxn1z, nzb, nxb);
	zero2(txxn0x, nzb, nxb);
	zero2(txxn0z, nzb, nxb);

	wfit=0;
	for(it=0; it<nt; it++){
//		sf_warning("test txxn1[801][30]=%d",txxn1[801][30])
		if(verb) sf_warning("Forward it=%d/%d;", it+1, nt);
#ifdef _OPENMP
#pragma omp parallel for private(ix,iz)
#endif
		for(ix=nfd+pmlsize; ix<nfd+pmlsize+nx; ix++){
			for(iz=nfd+pmlsize; iz<nfd+pmlsize+nz; iz++){
				vxn1[ix][iz]=vxn0[ix][iz]-dt/fdenx[ix][iz]*ldx(txxn0, ix, iz);
				vzn1[ix][iz]=vzn0[ix][iz]-dt/fdenz[ix][iz]*ldz(txxn0, ix, iz);
			}
		}

		pml_vxz(vxn1, vzn1, vxn0, vzn0, txxn0);
#ifdef _OPENMP
#pragma omp parallel for private(ix,iz)
#endif
		for(ix=nfd+pmlsize; ix<nfd+pmlsize+nx; ix++){
			for(iz=nfd+pmlsize; iz<nfd+pmlsize+nz; iz++){
				txxn1[ix][iz]=txxn0[ix][iz]-dt*fc11[ix][iz]*(ldx(vxn1, ix-1, iz) + ldz(vzn1, ix, iz-1));
			}
		}

		pml_txx(txxn1, vxn1, vzn1);

		if((it*dt)<srctrunc){
			explsource(txxn1);
		}

		if(it%wfinv==0){
#ifdef _OPENMP
#pragma omp parallel for private(ix,iz)
#endif
			for(ix=0; ix<nx; ix++){
				for(iz=0; iz<nz; iz++){
					fwf[wfit][ix][iz]=txxn0[ix+nfd+pmlsize][iz+nfd+pmlsize];
				}
			}
			wfit++;
		}
#ifdef _OPENMP
#pragma omp parallel for private(ix)
#endif
		for(ix=0; ix<ng; ix++){
			rcd[ix][it]=txxn0[ix*ginv+pmlsize+nfd][pmlsize+nfd+gp];
		}

		transp=txxn0; txxn0=txxn1; txxn1=transp;
		transp=vxn0;  vxn0=vxn1;   vxn1=transp;
		transp=vzn0;  vzn0=vzn1;   vzn1=transp;
	} // end of it
	if(verb) sf_warning(".");
	return 0;;
}
Exemple #2
0
int sglfdfor2(float ***wavfld, float **rcd, bool verb,
              float **den, float **c11, 
              geopar geop, srcpar srcp, pmlpar pmlp)
/*< staggered grid lowrank FD forward modeling >*/
{
    /*caculate arrays*/
    float **txxn1, **txxn0, **vxn1, **vzn1, **vxn0, **vzn0;

    float **denx, **denz;
    /*grid index*/
    int nx, nz, nt, ix, iz, it;
    int nxb, nzb, snpint;
    int spx, spz, gp,  gn, ginter;
    float dt, dx, dz;
    int pmlout, marg;
    bool freesurface;
    
    /* tmp variable */
    int wfit;
    int nth;

    nx = geop->nx;
    nz = geop->nz;
    nxb = geop->nxb;
    nzb = geop->nzb;
    dx = geop->dx;
    dz = geop->dz;

    spx = geop->spx;
    spz = geop->spz;
    gp  = geop->gp;
    gn  = geop->gn;
    ginter = geop->ginter;

    snpint = geop->snpint;

    nt = srcp->nt;
    dt = srcp->dt;

    pmlout = pmlp->pmlout;
    freesurface = pmlp->freesurface;
    marg   = getmarg();
    

    denx = sf_floatalloc2(nzb, nxb);
    denz = sf_floatalloc2(nzb, nxb);

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

#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
    for (ix = 0; ix < nxb; ix++) {
	for ( iz= 0; iz < nzb; iz++) {
	    denx[ix][iz] = den[ix][iz];
	    denz[ix][iz] = den[ix][iz];
	}
    }
    /*den[ix+1/2][iz]*/

#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
    for ( ix = 0; ix < nxb-1; ix++) {
	for (iz = 0; iz < nzb; iz++) {
	    denx[ix][iz] = (den[ix+1][iz] + den[ix][iz])*0.5;
	}
    }
    /*den[ix][iz+1/2]*/
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
    for ( ix = 0; ix < nxb; ix++) {
	for (iz = 0; iz < nzb-1; iz++) {
	    denz[ix][iz] = (den[ix][iz+1] + den[ix][iz])*0.5;
	}
    }

    txxn1 = sf_floatalloc2(nzb, nxb);
    txxn0 = sf_floatalloc2(nzb, nxb);
    vxn1  = sf_floatalloc2(nzb, nxb);
    vzn1  = sf_floatalloc2(nzb, nxb);
    vxn0  = sf_floatalloc2(nzb, nxb);
    vzn0  = sf_floatalloc2(nzb, nxb);

    init_pml(nz, nx, dt, marg, pmlp);
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
    for (ix = 0; ix < nxb; ix++) {
	for (iz = 0; iz < nzb; iz++) {
	    txxn1[ix][iz] = 0.0;
	 }
    }
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
    for (ix = 0; ix < nxb; ix++) {
	for (iz = 0; iz < nzb; iz++) {
	    txxn0[ix][iz] = 0.0;
	}
    }
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
    for (ix = 0; ix < nxb; ix++) {
	for (iz = 0; iz < nzb; iz++) {
	    vxn1[ix][iz] = 0.0;  
	}
    }
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
    for (ix = 0; ix < nxb; ix++) {
	for (iz = 0; iz < nzb; iz++) {
	    vxn0[ix][iz] = 0.0;
	}
    } 
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
    for (ix = 0; ix < nxb; ix++) {
	for (iz = 0; iz < nzb; iz++) {
	    vzn1[ix][iz] = 0.0;  
	}
    }
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
    for (ix = 0; ix < nxb; ix++) {
	for (iz = 0; iz < nzb; iz++) {
	    vzn0[ix][iz] = 0.0;
	}
    }
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif  
    for (it = 0; it < nt; it++) {
	for (ix = 0; ix < gn; ix++) {
	    rcd[ix][it] = 0.0;
	}
    }  

    /*Main loop*/
    wfit = 0;
    for (it = 0; it < nt; it++) {
	if (verb) sf_warning("Forward it=%d/%d;", it, nt-1);
	
	/*velocity*/
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
	for (ix = marg+pmlout; ix < nx+pmlout+marg; ix++ ) {
	    for (iz = marg+pmlout; iz < nz+pmlout+marg; iz++) {
		vxn1[ix][iz] = vxn0[ix][iz] - dt/denx[ix][iz]*ldx(txxn0, ix, iz);
		vzn1[ix][iz] = vzn0[ix][iz] - dt/denz[ix][iz]*ldz(txxn0, ix, iz);
	    }
	}
	
	/*Velocity PML */
	pml_vxz(vxn1, vzn1, vxn0, vzn0, txxn0, denx, denz, ldx, ldz, freesurface);
	
	/*Stress*/
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
	for (ix = marg+pmlout; ix < nx+marg+pmlout; ix++) {
	    for ( iz = marg+pmlout; iz < nz+marg+pmlout; iz++) { 
		txxn1[ix][iz] = txxn0[ix][iz] - dt*c11[ix][iz]*(ldx(vxn1, ix-1, iz) + ldz(vzn1, ix, iz-1));
	    }
	}
	 
	/*Stress PML */
	pml_txx(txxn1, vxn1, vzn1, c11, ldx, ldz, freesurface);
	
	if ((it*dt)<=srcp->trunc) {
	    explsourcet(txxn1, srcp->wavelet, it, dt, spx+pmlout+marg, spz+pmlout+marg, nxb, nzb, srcp);
	}
	
	if ( it%snpint == 0 ) {
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
	    for ( ix = 0; ix < nx; ix++) 
		for ( iz = 0; iz<nz; iz++ )
		    wavfld[wfit][ix][iz] = txxn0[ix+pmlout+marg][iz+pmlout+marg];
	    wfit++;
	}
	
	//sf_warning("test I am at 257");
	
#ifdef _OPENMP
#pragma omp parallel for private(ix)
#endif	 
	for ( ix =0 ; ix < gn; ix++) {
	    rcd[ix][it] = txxn0[ix*ginter+pmlout+marg][pmlout+marg+gp];
	    //sf_warning("gn=%d ix=%d ginter=%d ix*ginter=%d", gn, ginter, ix, ix*ginter);
	}

	//sf_warning("test I am at 266");
	
	/*n1 -> n0*/
	time_step_exch(txxn0, txxn1, it);
	time_step_exch(vxn0, vxn1, it);
	time_step_exch(vzn0, vzn1, it);
	pml_tstep_exch(it);
	
    } /*Main loop*/
    if (verb) sf_warning(".");
    return wfit;
    
}