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; }
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; }