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