void preparation_s(sf_file Fv, sf_file Fw, sf_acqui acpar, sf_sou soupar, sf_vec_s array, sf_seis seispar) /*< read data, initialize variables and prepare acquisition geometry >*/ { int i, nb, nzx; float sx, xend, rbegin, rend, tmp; int nplo=3, nphi=3, nt; float eps=0.0001; sf_butter blo=NULL, bhi=NULL; /* absorbing boundary coefficients */ nb=acpar->nb; acpar->bc=sf_floatalloc(nb); for(i=0; i<nb; i++){ tmp=acpar->coef*(nb-i); acpar->bc[i]=expf(-tmp*tmp); } /* padding variables */ acpar->padnx=acpar->nx+2*nb; acpar->padnz=acpar->nz+2*nb; acpar->padx0=acpar->x0-nb*acpar->dx; acpar->padz0=acpar->z0-nb*acpar->dz; /* acquisition parameters */ acpar->ds_v=acpar->ds/acpar->dx+0.5; acpar->s0_v=(acpar->s0-acpar->x0)/acpar->dx+0.5+nb; acpar->sz += nb; acpar->dr_v=acpar->dr/acpar->dx+0.5; acpar->r0_v=sf_intalloc(acpar->ns); acpar->r02=sf_intalloc(acpar->ns); acpar->nr2=sf_intalloc(acpar->ns); acpar->rz += nb; xend=acpar->x0+(acpar->nx-1)*acpar->dx; if(acpar->acqui_type==1){ for(i=0; i<acpar->ns; i++){ acpar->r0_v[i]=acpar->r0/acpar->dx+0.5+nb; acpar->r02[i]=0; acpar->nr2[i]=acpar->nr; } }else{ for(i=0; i<acpar->ns; i++){ sx=acpar->s0+acpar->ds*i; rbegin=(sx+acpar->r0 <acpar->x0)? acpar->x0 : sx+acpar->r0; rend=sx+acpar->r0 +(acpar->nr-1)*acpar->dr; rend=(rend < xend)? rend : xend; acpar->r0_v[i]=(rbegin-acpar->x0)/acpar->dx+0.5+nb; acpar->r02[i]=(rbegin-sx-acpar->r0)/acpar->dx+0.5; acpar->nr2[i]=(rend-rbegin)/acpar->dr+1.5; } } /* read model parameters */ nzx=acpar->nz*acpar->nx; nt=acpar->nt; array->vv=sf_floatalloc(nzx); array->ww=sf_floatalloc(nt); sf_floatread(array->vv, nzx, Fv); sf_floatread(array->ww, nt, Fw); /* bandpass the wavelet */ soupar->flo *= acpar->dt; soupar->fhi *= acpar->dt; if(soupar->flo > eps) blo=sf_butter_init(false, soupar->flo, nplo); if(soupar->fhi < 0.5-eps) bhi=sf_butter_init(true, soupar->fhi, nphi); if(NULL != blo){ sf_butter_apply(blo, nt, array->ww); sf_reverse(nt, array->ww); sf_butter_apply(blo, nt, array->ww); sf_reverse(nt, array->ww); sf_butter_close(blo); } if(NULL != bhi){ sf_butter_apply(bhi, nt, array->ww); sf_reverse(nt, array->ww); sf_butter_apply(bhi, nt, array->ww); sf_reverse(nt, array->ww); sf_butter_close(bhi); } /* simultaneous source */ nsource=soupar->nsource; dsource=soupar->dsource; /* seislet regularization */ if(seispar!=NULL){ seislet=true; seislet_init(acpar->nz, acpar->nx, true, true, seispar->eps, seispar->order, seispar->type[0]); seislet_set(seispar->dip); pclip=seispar->pclip; ss=sf_floatalloc(nzx); } }
void preparation_q(sf_file Fv, sf_file Fq, sf_file Ftau, sf_file Fw, sf_acqui acpar, sf_sou soupar, sf_vec_q array, float f0) /*< read data, initialize variables and prepare acquisition geometry >*/ { int i, nb, nzx; float sx, xend, rbegin, rend, tmp; float *qq; int nplo=3, nphi=3, nt; float eps=0.0001; sf_butter blo=NULL, bhi=NULL; /* absorbing boundary coefficients */ nb=acpar->nb; acpar->bc=sf_floatalloc(nb); for(i=0; i<nb; i++){ tmp=acpar->coef*(nb-i); acpar->bc[i]=expf(-tmp*tmp); } /* padding variables */ acpar->padnx=acpar->nx+2*nb; acpar->padnz=acpar->nz+2*nb; acpar->padx0=acpar->x0-nb*acpar->dx; acpar->padz0=acpar->z0-nb*acpar->dz; /* acquisition parameters */ acpar->ds_v=acpar->ds/acpar->dx+0.5; acpar->s0_v=(acpar->s0-acpar->x0)/acpar->dx+0.5+nb; acpar->sz += nb; acpar->dr_v=acpar->dr/acpar->dx+0.5; acpar->r0_v=sf_intalloc(acpar->ns); acpar->r02=sf_intalloc(acpar->ns); acpar->nr2=sf_intalloc(acpar->ns); acpar->rz += nb; xend=acpar->x0+(acpar->nx-1)*acpar->dx; if(acpar->acqui_type==1){ for(i=0; i<acpar->ns; i++){ acpar->r0_v[i]=acpar->r0/acpar->dx+0.5+nb; acpar->r02[i]=0; acpar->nr2[i]=acpar->nr; } }else{ for(i=0; i<acpar->ns; i++){ sx=acpar->s0+acpar->ds*i; rbegin=(sx+acpar->r0 <acpar->x0)? acpar->x0 : sx+acpar->r0; rend=sx+acpar->r0 +(acpar->nr-1)*acpar->dr; rend=(rend < xend)? rend : xend; acpar->r0_v[i]=(rbegin-acpar->x0)/acpar->dx+0.5+nb; acpar->r02[i]=(rbegin-sx-acpar->r0)/acpar->dx+0.5; acpar->nr2[i]=(rend-rbegin)/acpar->dr+1.5; } } /* read model parameters */ nzx=acpar->nz*acpar->nx; nt=acpar->nt; array->vv=sf_floatalloc(nzx); qq=sf_floatalloc(nzx); array->tau=sf_floatalloc(nzx); array->taus=sf_floatalloc(nzx); array->ww=sf_floatalloc(nt); sf_floatread(array->vv, nzx, Fv); sf_floatread(qq, nzx, Fq); sf_floatread(array->tau, nzx, Ftau); sf_floatread(array->ww, nt, Fw); /* calculate taus */ for(i=0; i<nzx; i++){ array->taus[i]=(sqrtf(qq[i]*qq[i]+1)-1.)/(2.*SF_PI*f0*qq[i]); } /* bandpass the wavelet */ soupar->flo *= acpar->dt; soupar->fhi *= acpar->dt; if(soupar->flo > eps) blo=sf_butter_init(false, soupar->flo, nplo); if(soupar->fhi < 0.5-eps) bhi=sf_butter_init(true, soupar->fhi, nphi); if(NULL != blo){ sf_butter_apply(blo, nt, array->ww); sf_reverse(nt, array->ww); sf_butter_apply(blo, nt, array->ww); sf_reverse(nt, array->ww); sf_butter_close(blo); } if(NULL != bhi){ sf_butter_apply(bhi, nt, array->ww); sf_reverse(nt, array->ww); sf_butter_apply(bhi, nt, array->ww); sf_reverse(nt, array->ww); sf_butter_close(bhi); } free(qq); }
/* for passive source and fwi */ void gradient_pas_init(sf_file Fdat, sf_file Fsrc, sf_file Fmwt, sf_mpi *mpipar, sf_sou soupar, sf_acqui acpar, sf_vec array, sf_fwi fwipar, sf_pas paspar, bool verb1) /*< initialize >*/ { float **dwt=NULL,***mwt,***wwt; int it,ix,iz,iturn,is,rdn; char filename[20]="tempbin",srdn[10]; FILE *temp; verb=verb1; first=true; // only at the first iteration, need to calculate the gradient scaling parameter cpuid=mpipar->cpuid; numprocs=mpipar->numprocs; nz=acpar->nz; nx=acpar->nx; nzx=nz*nx; padnz=acpar->padnz; padnx=acpar->padnx; padnzx=padnz*padnx; nb=acpar->nb; nt=acpar->nt; ns=acpar->ns; nr=acpar->nr; dr_v=acpar->dr_v; r0_v=acpar->r0_v; rz=acpar->rz; grectx=fwipar->rectx; grectz=fwipar->rectz; interval=acpar->interval; wnt=(nt-1)/interval+1; dt=acpar->dt; idt=1./dt; dt2=dt*dt; wdt=dt*interval; wdt2=wdt*wdt; dx2=acpar->dx*acpar->dx; dz2=acpar->dz*acpar->dz; wt1=fwipar->wt1; wt2=fwipar->wt2; woff1=fwipar->woff1; woff2=fwipar->woff2; waterz=fwipar->waterz; waterzb=fwipar->waterzb; bc=acpar->bc; if (cpuid==0) { srand(time(NULL)); rdn = rand()%1000000000; sprintf(srdn,"%d",rdn); strcat(filename,srdn); } MPI_Bcast(filename, 20, MPI_CHAR, 0, comm); if(verb && cpuid==0) sf_warning("filename=%s",filename); temp=fopen(filename, "wb+"); if(ns%numprocs==0) nturn=ns/numprocs; else nturn=ns/numprocs+1; /* allocate data/source/weight */ dd = sf_floatalloc3(nt, nx, nturn); ww3 = sf_floatalloc4(nz, nx, nt, nturn); gwt = sf_floatalloc4(nz, nx, nt, nturn); wwt = sf_floatalloc3(nz, nx, nt); /* temporary output var */ if (!paspar->onlyvel) { mwt = sf_floatalloc3(nz, nx, nt); /* src model weight */ /* dwt = sf_floatalloc2(acpar->nt, acpar->nx); wtn1=(fwipar->wt1-acpar->t0)/acpar->dt+0.5; wtn2=(fwipar->wt2-acpar->t0)/acpar->dt+0.5; woffn1=(fwipar->woff1-acpar->r0)/acpar->dr+0.5; woffn2=(fwipar->woff2-acpar->r0)/acpar->dr+0.5; residual_weighting(dwt, acpar->nt, acpar->nx, wtn1, wtn2, woffn1, woffn2, !fwipar->oreo); */ } else { mwt=NULL; dwt=NULL; } /* read data/source */ for(iturn=0; iturn<nturn; iturn++){ is=iturn*numprocs+cpuid; if(is<ns){ /* read data */ sf_seek(Fdat, is*nt*nx*sizeof(float), SEEK_SET); sf_floatread(dd[iturn][0], nt*nx, Fdat); if (paspar->onlyvel) { /* read source */ sf_seek(Fsrc, is*nz*nx*nt*sizeof(float), SEEK_SET); sf_floatread(ww3[iturn][0][0], nz*nx*nt, Fsrc); } else { /* linear inversion of source */ lstri_op(dd[iturn], dwt, ww3[iturn], mwt, acpar, array, paspar, verb); /* write source */ fseeko(temp, is*nz*nx*nt*sizeof(float), SEEK_SET); fwrite(ww3[iturn][0][0], sizeof(float), nz*nx*nt, temp); if (NULL!=Fmwt && is==0) sf_floatwrite(mwt[0][0], nz*nx*nt, Fmwt); } /* calculate gradient mask */ if (!paspar->onlyvel && paspar->prec && paspar->hidesrc) { #ifdef _OPENMP #pragma omp parallel for default(shared) private(it,ix,iz) #endif for (it=0; it<nt; it++) for (ix=0; ix<nx; ix++) for (iz=0; iz<nz; iz++) gwt[iturn][it][ix][iz] = mwt[it][ix][iz]; threshold(true, nz*nx*nt, paspar->hard, gwt[iturn][0][0]); #ifdef _OPENMP #pragma omp parallel for default(shared) private(it,ix,iz) #endif for (it=0; it<nt; it++) for (ix=0; ix<nx; ix++) for (iz=0; iz<nz; iz++) gwt[iturn][it][ix][iz] = 1.-gwt[iturn][it][ix][iz]; } else { #ifdef _OPENMP #pragma omp parallel for default(shared) private(it,ix,iz) #endif for (it=0; it<nt; it++) for (ix=0; ix<nx; ix++) for (iz=0; iz<nz; iz++) gwt[iturn][it][ix][iz] = 1.; } } /* if is<ns */ } fclose(temp); MPI_Barrier(comm); if(!paspar->onlyvel && cpuid==0) { temp=fopen(filename, "rb"); for(is=0; is<ns; is++){ fseeko(temp, is*nz*nx*nt*sizeof(float), SEEK_SET); fread(wwt[0][0], sizeof(float), nz*nx*nt, temp); sf_floatwrite(wwt[0][0], nz*nx*nt, Fsrc); } fclose(temp); remove(filename); } MPI_Barrier(comm); /* data residual weights */ wtn1=(wt1-acpar->t0)/dt+0.5; wtn2=(wt2-acpar->t0)/dt+0.5; woffn1=(woff1-acpar->r0)/acpar->dr+0.5; woffn2=(woff2-acpar->r0)/acpar->dr+0.5; weight=sf_floatalloc2(nt, nr); residual_weighting(weight, nt, nr, wtn1, wtn2, woffn1, woffn2, fwipar->oreo); /* padding and convert vector to 2-d array */ vv = sf_floatalloc2(padnz, padnx); tau= sf_floatalloc2(padnz, padnx); taus=sf_floatalloc2(padnz, padnx); pad2d(array->vv, vv, nz, nx, nb); pad2d(array->tau, tau, nz, nx, nb); pad2d(array->taus, taus, nz, nx, nb); /* multiscale gradient */ if(soupar->flo > 0.0001) blo=sf_butter_init(false, soupar->flo, 3); if(soupar->fhi < 0.5-0.0001) bhi=sf_butter_init(true, soupar->fhi, 3); free(**wwt); free(*wwt); free(wwt); if (NULL!=mwt) { free(**mwt); free(*mwt); free(mwt); } return; }