Exemple #1
0
int sglfdback2(float ***mig1, float **mig2, float ***fwf, float **localrec, bool verb, bool wantwf, sf_file Ftmpbwf)
{
	float **txxn1, **txxn0, **vxn1, **vxn0, **vzn1, **vzn0;
	float **sill, **ccr, ***bwf;
	int wfit, htau;
	float tau;

	sill=sf_floatalloc2(nz, nx);
	ccr=sf_floatalloc2(nz, nx);
	bwf=sf_floatalloc3(nz, nx, wfnt);
	zero2(sill, nz, nx);
	zero2(ccr, nz, nx);
	zero3(mig1, nz, nx, ntau);

	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=wfnt-1;
	for(it=nt-1; it>=0; it--){
		if(verb) sf_warning("Backward 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++){
				txxn0[ix][iz]=txxn1[ix][iz]+dt*bc11[ix][iz]*(ldx(vxn1, ix-1, iz) +ldz(vzn1, ix, iz-1));
			}
		}

		pml_txxb(txxn0, vxn1, vzn1);
#ifdef _OPENMP
#pragma omp parallel for private(ix)
#endif
		for(ix=0; ix<ng; ix++){
			txxn0[ix*ginv+pmlsize+nfd][pmlsize+nfd+gp]+=localrec[ix][it];
		}
#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++){
				vxn0[ix][iz]=vxn1[ix][iz]+dt/bdenx[ix][iz]*ldx(txxn0, ix, iz);
				vzn0[ix][iz]=vzn1[ix][iz]+dt/bdenz[ix][iz]*ldz(txxn0, ix, iz);
			}
		}

		pml_vxzb(vxn1, vzn1, vxn0, vzn0, txxn0);

		transp=txxn1; txxn1=txxn0; txxn0=transp;
		transp=vxn1; vxn1=vxn0; vxn0=transp;
		transp=vzn1; vzn1=vzn0; vzn0=transp;

		if(it%wfinv==0){
			for(ix=0; ix<nx; ix++)
				for(iz=0; iz<nz; iz++){
					bwf[wfit][ix][iz]=txxn0[ix+pmlsize+nfd][iz+pmlsize+nfd];
					ccr[ix][iz]+=fwf[wfit][ix][iz]*bwf[wfit][ix][iz];
					sill[ix][iz]+=fwf[wfit][ix][iz]*fwf[wfit][ix][iz];
				}
			wfit--;
		}
	} //end of it
	if(verb) sf_warning(".");

	for(itau=0; itau<ntau; itau++){
		tau=itau*dtau+tau0;
		htau=tau/wfdt;
		for(it=abs(htau); it<wfnt-abs(htau); it++){
			for(ix=0; ix<nx; ix++){
				for(iz=0; iz<nz; iz++){
					mig1[itau][ix][iz]+=fwf[it+htau][ix][iz]*bwf[it-htau][ix][iz];
				}
			}
		}//end of it
	} // end of itau

	for(ix=0; ix<nx; ix++){
		for(iz=0; iz<nz; iz++){
			mig2[ix][iz]=ccr[ix][iz]/(sill[ix][iz]+SF_EPS);
		}
	}

	if(wantwf) sf_floatwrite(bwf[0][0], wfnt*nx*nz, Ftmpbwf);
	return 0;
}
Exemple #2
0
int sglfdback2(float **img1, float **img2, float ***wavfld, float **rcd, 
               bool verb, bool wantwf, float **den, float **c11, 
               geopar geop, srcpar srcp, pmlpar pmlp, sf_file Ftmpbwf)  
/*< staggered grid lowrank FD backward propagation + imaging >*/
{
    /*caculate arrays*/
    float **txxn1, **txxn0, **vxn1, **vzn1, **vxn0, **vzn0;
    
    float **denx, **denz;
    float **sill, **ccr;
    /*grid index*/
    int nx, nz, nt, ix, iz, it, gn, ginter;
    int nxb, nzb, snpint;
    int gp;
    float dt, dx, dz;
    int pmlout, marg;
    bool freesurface;

    /* tmp variable */
    int wfit;
    
    nx = geop->nx;
    nz = geop->nz;
    nxb = geop->nxb;
    nzb = geop->nzb;
    dx = geop->dx;
    dz = geop->dz;
    
    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);

    sill = sf_floatalloc2(nz, nx);
    ccr  = img1;

#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 (ix = 0; ix < nx; ix++) {
	for (iz = 0; iz < nz; iz++) {
	    sill[ix][iz] = 0.0;
	}
    }
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
    for (ix = 0; ix < nx; ix++) {
	for (iz = 0; iz < nz; iz++) {
	    ccr[ix][iz] = 0.0;
	}
    }
        
    /*Main loop*/
    wfit = (int)(nt-1)/snpint;
    
    for (it = nt-1; it>=0; it--) {
	if  (verb) sf_warning("Backward it=%d/%d;", it, nt-1);

	/*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++) { 
		txxn0[ix][iz] = txxn1[ix][iz] + dt*c11[ix][iz]*(ldx(vxn1, ix-1, iz) + ldz(vzn1, ix, iz-1));
	    }
	}
	/*Stress PML */
	pml_txxb(txxn0, vxn1, vzn1, c11, ldx, ldz, freesurface);

#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif	
	for (ix=0; ix<gn; ix++)  {
	    txxn0[ix*ginter+pmlout+marg][pmlout+marg+gp] = rcd[ix][it];
	}
	
	/*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++) {
		vxn0[ix][iz] = vxn1[ix][iz] + dt/denx[ix][iz]*ldx(txxn0, ix, iz);
		vzn0[ix][iz] = vzn1[ix][iz] + dt/denz[ix][iz]*ldz(txxn0, ix, iz);
	    }
	}

	/*Velocity PML */
	pml_vxzb(vxn1, vzn1, vxn0, vzn0, txxn0, denx, denz, ldx, ldz, freesurface);

	/*n1 -> n0*/
	time_step_exch(txxn1, txxn0, it);
	time_step_exch(vxn1, vxn0, it);
	time_step_exch(vzn1, vzn0, it);
	pml_tstep_exchb(it);
	
	if ( wantwf && it%snpint == 0 ) {

	    for ( ix = 0; ix < nx; ix++) 
		sf_floatwrite(txxn0[ix+pmlout+marg]+pmlout+marg, nz, Ftmpbwf);
	}

	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++) {
		    ccr[ix][iz] += wavfld[wfit][ix][iz]*txxn0[ix+pmlout+marg][iz+pmlout+marg];
		}
	    }
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif
	    for (ix=0; ix<nx; ix++) {
		for (iz=0; iz<nz; iz++) {
		    sill[ix][iz] += wavfld[wfit][ix][iz]*wavfld[wfit][ix][iz];
		}
	    }
	    wfit--;
	}
    } /*Main loop*/
    if (verb) sf_warning(".");
    
#ifdef _OPENMP
#pragma omp parallel for private(ix, iz)
#endif    
    for (ix=0; ix<nx; ix++) {
	for (iz=0; iz<nz; iz++) {
	    img2[ix][iz] = ccr[ix][iz]/(sill[ix][iz]+SF_EPS);//
	}
    } 
    
    return 0;

}