int main (int argc, char **argv) { int nt,nzt,nxt,nz,nxo,nxs,ns,nx,nr,is,ixo,ixs; int ls,jtr,mtr,tracl,mzmax; off_t nseek; float ft,fzt,fxt,fz,fx,fxo,fs,fxs,dt,dzt,dxt,dz,dx,dxo,ds,dxs, ext,ezt,es,ex,ez,xo,s,xs,xg,fpeak; float v0,dvz; float fmax,angmax,offmax,rmax,aperx; float **mig,**migi,***ttab,**tb,**pb,**cosb,**sigb,**tsum,**tt; char *infile="stdin",*outfile="stdout",*ttfile,*jpfile; FILE *infp,*outfp,*ttfp,*jpfp; Wavelet *w; /* hook up getpar to handle the parameters */ initargs(argc, argv); requestdoc(1); /* open input and output files */ if( !getparstring("infile",&infile)) { infp = stdin; } else if ((infp=fopen(infile,"r"))==NULL) err("cannot open infile=%s\n",infile); if( !getparstring("outfile",&outfile)) { outfp = stdout; } else { outfp = fopen(outfile,"w"); } efseeko(infp,(off_t) 0,SEEK_CUR); warn("Got A"); efseeko(outfp,(off_t) 0,SEEK_CUR); if( !getparstring("ttfile",&ttfile)) err("must specify ttfile!\n"); if ((ttfp=fopen(ttfile,"r"))==NULL) err("cannot open ttfile=%s\n",ttfile); if( !getparstring("jpfile",&jpfile)) { jpfp = stderr; } else jpfp = fopen(jpfile,"w"); /* get information for seismogram traces */ if (!getparint("nt",&nt)) nt = 501; if (!getparfloat("dt",&dt)) dt = 0.004; if (!getparfloat("ft",&ft)) ft = 0.0; if (!getparfloat("fmax",&fmax)) fmax = 1.0/(4*dt); fpeak = 0.2/dt; if (!getparint("nxs",&nxs)) nxs = 101; if (!getparfloat("dxs",&dxs)) dxs = 15; if (!getparfloat("fxs",&fxs)) fxs = 0.0; if (!getparint("nxo",&nxo)) nxo = 1; if (!getparfloat("dxo",&dxo)) dxo = 50; if (!getparfloat("fxo",&fxo)) fxo = 0.0; /* get traveltime table parameters */ if (!getparint("nxt",&nxt)) err("must specify nxt!\n"); if (!getparfloat("fxt",&fxt)) err("must specify fxt!\n"); if (!getparfloat("dxt",&dxt)) err("must specify dxt!\n"); if (!getparint("nzt",&nzt)) err("must specify nzt!\n"); if (!getparfloat("fzt",&fzt)) err("must specify fzt!\n"); if (!getparfloat("dzt",&dzt)) err("must specify dzt!\n"); if (!getparint("ns",&ns)) err("must specify ns!\n"); if (!getparfloat("fs",&fs)) err("must specify fs!\n"); if (!getparfloat("ds",&ds)) err("must specify ds!\n"); ext = fxt+(nxt-1)*dxt; ezt = fzt+(nzt-1)*dzt; es = fs+(ns-1)*ds; /* check source and receiver coordinates */ for (ixs=0; ixs<nxs; ++ixs) { xs = fxs+ixs*dxs; for (ixo=0; ixo<nxo; ++ixo) { xg = xs+fxo+ixo*dxo; if (fs>xs || es<xs || fs>xg || es<xg) err("shot or receiver lie outside of specified (x,z) grid\n"); } } /* get migration section parameters */ if (!getparint("nx",&nx)) err("must specify nx!\n"); if (!getparfloat("fx",&fx)) err("must specify fx!\n"); if (!getparfloat("dx",&dx)) err("must specify dx!\n"); if (!getparint("nz",&nz)) err("must specify nz!\n"); if (!getparfloat("fz",&fz)) err("must specify fz!\n"); if (!getparfloat("dz",&dz)) err("must specify dz!\n"); ex = fx+(nx-1)*dx; ez = fz+(nz-1)*dz; if(fxt>fx || ext<ex || fzt>fz || ezt<ez) err(" migration section is out of traveltime table!\n"); if (!getparfloat("v0",&v0)) v0 = 1500; if (!getparfloat("dvz",&dvz)) dvz = 0; if (!getparfloat("angmax",&angmax)) angmax = 60.; if (angmax<0.00001) err("angmax must be positive!\n"); mzmax = dx*sin(angmax*PI/180.)/dz; if(mzmax<1) mzmax = 1; if (!getparfloat("aperx",&aperx)) aperx = 0.5*nxt*dxt; if (!getparint("ls",&ls)) ls = 1; if (!getparint("mtr",&mtr)) mtr = 100; fprintf(jpfp,"\n"); fprintf(jpfp," Modeling parameters\n"); fprintf(jpfp," ================\n"); fprintf(jpfp," infile=%s \n",infile); fprintf(jpfp," outfile=%s \n",outfile); fprintf(jpfp," ttfile=%s \n",ttfile); fprintf(jpfp," \n"); fprintf(jpfp," nzt=%d fzt=%g dzt=%g\n",nzt,fzt,dzt); fprintf(jpfp," nxt=%d fxt=%g dxt=%g\n",nxt,fxt,dxt); fprintf(jpfp," ns=%d fs=%g ds=%g\n",ns,fs,ds); fprintf(jpfp," \n"); fprintf(jpfp," nz=%d fz=%g dz=%g\n",nz,fz,dz); fprintf(jpfp," nx=%d fx=%g dx=%g\n",nx,fx,dx); fprintf(jpfp," \n"); fprintf(jpfp," nxs=%d fxs=%g dxs=%g\n",nxs,fxs,dxs); fprintf(jpfp," nxo=%d fxo=%g dxo=%g\n",nxo,fxo,dxo); fprintf(jpfp," \n"); /* compute reference traveltime and slowness */ offmax = MAX(ABS(fxo),ABS(fxo+(nxo-1)*dxo)); rmax = MAX(es-fxt,ext-fs); rmax = MIN(rmax,0.5*offmax+aperx); nr = 2+(int)(rmax/dx); tb = ealloc2float(nzt,nr); pb = ealloc2float(nzt,nr); sigb = ealloc2float(nzt,nr); cosb = ealloc2float(nzt,nr); timeb(nr,nzt,dx,dzt,fzt,dvz,v0,tb,pb,sigb,cosb); fprintf(jpfp," nt=%d ft=%g dt=%g fpeak=%g \n",nt,ft,dt,fpeak); fprintf(jpfp," v0=%g dvz=%g \n",v0,dvz); fprintf(jpfp," aperx=%g angmax=%g offmax=%g\n",aperx,angmax,offmax); fprintf(jpfp," mtr=%d ls=%d\n",mtr,ls); fprintf(jpfp," ================\n"); fflush(jpfp); /* allocate space */ mig = ealloc2float(nz,nx); migi = ealloc2float(nz+2*mzmax,nx); ttab = ealloc3float(nzt,nxt,ns); tt = ealloc2float(nzt,nxt); tsum = ealloc2float(nzt,nxt); /* make wavelet */ makericker(fpeak,dt,&w); /* set constant segy trace header parameters */ memset((void *) &tr, 0, sizeof(segy)); tr.trid = 1; tr.counit = 1; tr.ns = nt; tr.dt = 1.0e6*dt; tr.delrt = 1.0e3*ft; fprintf(jpfp," read traveltime tables \n"); fflush(jpfp); /* compute traveltime residual */ for(is=0; is<ns; ++is){ nseek = (off_t) nxt*nzt*is; efseeko(ttfp,nseek*((off_t) sizeof(float)),SEEK_SET); fread(ttab[is][0],sizeof(float),nxt*nzt,ttfp); s = fs+is*ds; resit(nxt,fxt,dxt,nzt,nr,dx,tb,ttab[is],s); } fprintf(jpfp," read migration section \n"); fflush(jpfp); /* read migration section */ fread(mig[0],sizeof(float),nx*nz,infp); /* integrate migration section for constructing anti-aliasing filter */ integ(mig,nz,dz,nx,mzmax,migi); fprintf(jpfp," start synthesis ... \n"); fprintf(jpfp," \n"); fflush(jpfp); jtr = 0; /* loop over shots */ for (ixs=0,xs=fxs,tracl=0; ixs<nxs; ++ixs,xs+=dxs) { /* loop over offsets */ for (ixo=0,xo=fxo; ixo<nxo; ++ixo,xo+=dxo) { float as,res; int is; xg = xs+xo; /* set segy trace header parameters */ tr.tracl = tr.tracr = ++tracl; tr.fldr = 1+ixs; tr.tracf = 1+ixo; tr.offset = NINT(xo); tr.sx = NINT(xs); tr.gx = NINT(xg); as = (xs-fs)/ds; is = (int)as; if(is==ns-1) is=ns-2; res = as-is; if(res<=0.01) res = 0.0; if(res>=0.99) res = 1.0; sum2(nxt,nzt,1-res,res,ttab[is],ttab[is+1],tsum); as = (xg-fs)/ds; is = (int)as; if(is==ns-1) is=ns-2; res = as-is; if(res<=0.01) res = 0.0; if(res>=0.99) res = 1.0; sum2(nxt,nzt,1-res,res,ttab[is],ttab[is+1],tt); sum2(nxt,nzt,1,1,tt,tsum,tsum); fflush(jpfp); /* make one trace */ maketrace(tr.data,nt,ft,dt,xs,xg,mig,migi,aperx, nx,fx,dx,nz,fz,dz,mzmax,ls,angmax,v0,fmax,w, tb,pb,sigb,cosb,nr,tsum,nxt,fxt,dxt,nzt,fzt,dzt); /* write trace */ fputtr(outfp,&tr); jtr++; if((jtr-1)%mtr ==0 ){ fprintf(jpfp," generated trace %d\n",jtr); fflush(jpfp); } } } fprintf(jpfp," generated %d traces in total\n",jtr); fprintf(jpfp," \n"); fprintf(jpfp," output done\n"); fflush(jpfp); efclose(jpfp); efclose(outfp); free2float(tsum); free2float(tt); free2float(pb); free2float(tb); free2float(cosb); free2float(sigb); free3float(ttab); free2float(mig); free2float(migi); return(CWP_Exit()); }
int main (int argc, char **argv) { int nr,ir,ls,smooth,ndpfz,ns,ixo,ixm,nxo,nxm,nt, nx,nz,nxb,nxd,ixd,i,ix,iz,nx1,nx0,nxd1, verbose,tracl, *nxz; float tmin,temp,temp1, dsmax,fpeak,dx,dz,fx,ex,fx1,ex1, dxm,dxo,dt,fxm,fxo,ft,xo,xm,vs0,vg0, xs,xg,ez, *ar,**xr,**zr, **vold,**ts,**as,**sgs,**tg,**ag,**sgg,**bas,**bag, **v,**ts1=NULL,**as1=NULL,**sgs1=NULL, **tg1=NULL,**ag1=NULL,**sgg1=NULL; FILE *vfp=stdin; Reflector *r; Wavelet *w; /* hook up getpar to handle the parameters */ initargs(argc,argv); requestdoc(0); /* get required parameters */ if (!getparint("nx",&nx)) err("must specify nx!\n"); if (!getparint("nz",&nz)) err("must specify nz!\n"); /* get optional parameters */ if (!getparint("nxb",&nxb)) nxb = nx; if (!getparint("nxd",&nxd)) nxd = 1; if (!getparfloat("dx",&dx)) dx = 100; if (!getparfloat("fx",&fx)) fx = 0.0; if (!getparfloat("dz",&dz)) dz = 100; if (!getparint("nt",&nt)) nt = 101; CHECK_NT("nt",nt); if (!getparfloat("dt",&dt)) dt = 0.04; if (!getparfloat("ft",&ft)) ft = 0.0; if (!getparint("nxo",&nxo)) nxo = 1; if (!getparfloat("dxo",&dxo)) dxo = 50; if (!getparfloat("fxo",&fxo)) fxo = 0.0; if (!getparint("nxm",&nxm)) nxm = 101; if (!getparfloat("dxm",&dxm)) dxm = 50; if (!getparfloat("fxm",&fxm)) fxm = 0.0; if (!getparfloat("fpeak",&fpeak)) fpeak = 0.2/dt; if (!getparint("ls",&ls)) ls = 0; if (!getparfloat("tmin",&tmin)) tmin = 10.0*dt; if (!getparint("ndpfz",&ndpfz)) ndpfz = 5; if (!getparint("smooth",&smooth)) smooth = 0; if (!getparint("verbose",&verbose)) verbose = 0; /* check the ranges of shots and receivers */ ex = fx+(nx-1)*dx; ez = (nz-1)*dz; for (ixm=0; ixm<nxm; ++ixm) for (ixo=0; ixo<nxo; ++ixo) { /* compute source and receiver coordinates */ xs = fxm+ixm*dxm-0.5*(fxo+ixo*dxo); xg = xs+fxo+ixo*dxo; if (fx>xs || ex<xs || fx>xg || ex<xg) err("shot or receiver lie outside of specified (x,z) grid\n"); } decodeReflectors(&nr,&ar,&nxz,&xr,&zr); if (!smooth) breakReflectors(&nr,&ar,&nxz,&xr,&zr); /* allocate space */ vold = ealloc2float(nz,nx); /* read velocities */ if(fread(vold[0],sizeof(float),nx*nz,vfp)!=nx*nz) err("cannot read %d velocities from file %s",nx*nz,vfp); /* determine maximum reflector segment length */ tmin = MAX(tmin,MAX(ft,dt)); dsmax = vold[0][0]/(2*ndpfz)*sqrt(tmin/fpeak); /* make reflectors */ makeref(dsmax,nr,ar,nxz,xr,zr,&r); /* count reflector segments */ for (ir=0,ns=0; ir<nr; ++ir) ns += r[ir].ns; /* make wavelet */ makericker(fpeak,dt,&w); /* if requested, print information */ if (verbose) { warn("\nSUSYNVXZ:"); warn("Total number of small reflecting segments is %d.\n",ns); } /* set constant segy trace header parameters */ memset( (void *) &tr, 0, sizeof(segy)); tr.trid = 1; tr.counit = 1; tr.ns = nt; tr.dt = 1.0e6*dt; tr.delrt = 1.0e3*ft; /* allocate space */ nx1 = 1+2*nxb; ts = ealloc2float(nz,nx1); as = ealloc2float(nz,nx1); sgs = ealloc2float(nz,nx1); tg = ealloc2float(nz,nx1); ag = ealloc2float(nz,nx1); sgg = ealloc2float(nz,nx1); v = ealloc2float(nz,nx1); bas = ealloc2float(nz,nx1); bag = ealloc2float(nz,nx1); if(nxd>1) { /* allocate space for interpolation */ ts1 = ealloc2float(nz,nx1); as1 = ealloc2float(nz,nx1); sgs1 = ealloc2float(nz,nx1); tg1 = ealloc2float(nz,nx1); ag1 = ealloc2float(nz,nx1); sgg1 = ealloc2float(nz,nx1); } /* loop over offsets and midpoints */ for (ixo=0, tracl=0; ixo<nxo; ++ixo){ xo = fxo+ixo*dxo; if(ABS(xo)>nxb*dx) err("\t band NXB is too small!\n"); nxd1 = nxd; for (ixm=0; ixm<nxm; ixm +=nxd1){ xm = fxm+ixm*dxm; xs = xm-0.5*xo; xg = xs+xo; /* set range for traveltimes' calculation */ fx1 = xm-nxb*dx; ex1 = MIN(ex+(nxd1-1)*dxm,xm+nxb*dx); nx1 = 1+(ex1-fx1)/dx; nx0 = (fx1-fx)/dx; temp = (fx1-fx)/dx-nx0; /* transpose velocity such that the first row is at fx1 */ for(ix=0;ix<nx1;++ix) for(iz=0;iz<nz;++iz){ if(ix<-nx0) v[ix][iz] = vold[0][iz]; else if(ix+nx0>nx-2) v[ix][iz]=vold[nx-1][iz]; else v[ix][iz] = vold[ix+nx0][iz]*(1.0-temp) +temp*vold[ix+nx0+1][iz]; } if(ixm==0 || nxd1==1){ /* No interpolation */ /* compute traveltimes, propagation angles, sigmas from shot and receiver respectively */ eiktam(xs,0.,nz,dz,0.,nx1,dx,fx1,v,ts,as,sgs,bas); eiktam(xg,0.,nz,dz,0.,nx1,dx,fx1,v,tg,ag,sgg,bag); ixd = NINT((xs-fx)/dx); vs0 = vold[ixd][0]; ixd = NINT((xg-fx)/dx); vg0 = vold[ixd][0]; /* make one trace */ ex1 = MIN(ex,xm+nxb*dx); makeone(ts,as,sgs,tg,ag,sgg,ex1,ez,dx,dz,fx1,vs0,vg0, ls,w,nr,r,nt,dt,ft,tr.data); /* set segy trace header parameters */ tr.tracl = tr.tracr = ++tracl; tr.cdp = 1+ixm; tr.cdpt = 1+ixo; tr.offset = NINT(xo); tr.sx = NINT(xs); tr.gx = NINT(xg); /* write trace */ puttr(&tr); } else { /* Linear interpolation */ eiktam(xs,0,nz,dz,0,nx1,dx,fx1,v,ts1,as1,sgs1,bas); eiktam(xg,0,nz,dz,0,nx1,dx,fx1,v,tg1,ag1,sgg1,bag); ixd = NINT((xs-fx)/dx); vs0 = vold[ixd][0]; ixd = NINT((xg-fx)/dx); vg0 = vold[ixd][0]; xm -= nxd1*dxm; for(i=1; i<=nxd1; ++i) { xm += dxm; xs = xm-0.5*xo; xg = xs+xo; fx1 = xm-nxb*dx; ex1 = MIN(ex+(nxd1-1)*dxm,xm+nxb*dx); nx1 = 1+(ex1-fx1)/dx; temp = nxd1-i; temp1 = 1.0/(nxd1-i+1); for(ix=0;ix<nx1;++ix) for(iz=0;iz<nz;++iz){ if(i==nxd1){ ts[ix][iz] = ts1[ix][iz]; tg[ix][iz] = tg1[ix][iz]; sgs[ix][iz] = sgs1[ix][iz]; ag[ix][iz] = ag1[ix][iz]; sgg[ix][iz] = sgg1[ix][iz]; as[ix][iz] = as1[ix][iz]; } else{ ts[ix][iz] = (temp*ts[ix][iz] +ts1[ix][iz])*temp1; tg[ix][iz] = (temp*tg[ix][iz] +tg1[ix][iz])*temp1; as[ix][iz] = (temp*as[ix][iz] +as1[ix][iz])*temp1; sgs[ix][iz] = (temp*sgs[ix][iz] +sgs1[ix][iz])*temp1; ag[ix][iz] = (temp*ag[ix][iz] +ag1[ix][iz])*temp1; sgg[ix][iz] = (temp*sgg[ix][iz] +sgg1[ix][iz])*temp1; } } /* make one trace */ ex1 = MIN(ex,xm+nxb*dx); makeone(ts,as,sgs,tg,ag,sgg,ex1,ez,dx,dz,fx1,vs0,vg0, ls,w,nr,r,nt,dt,ft,tr.data); /* set segy trace header parameters */ tr.tracl = tr.tracr = ++tracl; tr.cdp = 1+ixm-nxd1+i; tr.cdpt = 1+ixo; tr.offset = NINT(xo); tr.d2=dxm; tr.f2=fxm; tr.sx = NINT(xs); tr.gx = NINT(xg); /* write trace */ puttr(&tr); } } /* set skip parameter */ if(ixm<nxm-1 && ixm>nxm-1-nxd1) nxd1 = nxm-1-ixm; } warn("\t finish offset %f\n",xo); } free2float(vold); free2float(ts); free2float(bas); free2float(sgs); free2float(as); free2float(v); free2float(tg); free2float(bag); free2float(sgg); free2float(ag); if(nxd>1) { free2float(ts1); free2float(as1); free2float(sgs1); free2float(tg1); free2float(ag1); free2float(sgg1); } return(CWP_Exit()); }
int main (int argc, char **argv) { int nr,er,ob,sp,ir,ixz,ls,smooth,ndpfz,ns, ixo,ixsm,nxo,nxs,nxm,nt,nxsm, shots,midpoints,verbose,tracl, *nxz; float x0,z0,v00,gamma,dvdx,dvdz,vmin,tmin,tminr, x,z,v,t,dsmax,fpeak, dxs,dxm,dxo,dt,fxs,fxm,fxo,ft,dxsm, xs,zs,xg,zg, *xo,*ar,**xr,**zr; Reflector *r; Wavelet *w; /* hook up getpar to handle the parameters */ initargs(argc,argv); requestdoc(0); /* get parameters */ if (!getparint("nt",&nt)) nt = 101; CHECK_NT("nt",nt); if (!getparfloat("dt",&dt)) dt = 0.04; if (!getparfloat("ft",&ft)) ft = 0.0; if ((nxo=countparval("xo"))!=0) { xo = ealloc1float(nxo); getparfloat("xo",xo); } else { if (!getparint("nxo",&nxo)) nxo = 1; if (!getparfloat("dxo",&dxo)) dxo = 0.05; if (!getparfloat("fxo",&fxo)) fxo = 0.0; xo = ealloc1float(nxo); for (ixo=0; ixo<nxo; ++ixo) xo[ixo] = fxo+ixo*dxo; } shots = (getparint("nxs",&nxs) || getparfloat("dxs",&dxs) || getparfloat("fxs",&fxs)); midpoints = (getparint("nxm",&nxm) || getparfloat("dxm",&dxm) || getparfloat("fxm",&fxm)); if (shots && midpoints) err("cannot specify both shot and midpoint sampling!\n"); if (shots) { if (!getparint("nxs",&nxs)) nxs = 101; if (!getparfloat("dxs",&dxs)) dxs = 0.05; if (!getparfloat("fxs",&fxs)) fxs = 0.0; nxsm = nxs; dxsm = dxs; } else { midpoints = 1; if (!getparint("nxm",&nxm)) nxm = 101; if (!getparfloat("dxm",&dxm)) dxm = 0.05; if (!getparfloat("fxm",&fxm)) fxm = 0.0; nxsm = nxm; dxsm = dxm; } if (!getparint("nxm",&nxm)) nxm = 101; if (!getparfloat("dxm",&dxm)) dxm = 0.05; if (!getparfloat("fxm",&fxm)) fxm = 0.0; if (!getparfloat("x0",&x0)) x0 = 0.0; if (!getparfloat("z0",&z0)) z0 = 0.0; if (!getparfloat("v00",&v00)) v00 = 2.0; if (!getparfloat("gamma",&gamma)) gamma = 1.0; if (!getparfloat("dvdx",&dvdx)) dvdx = 0.0; if (!getparfloat("dvdz",&dvdz)) dvdz = 0.0; if (!getparfloat("fpeak",&fpeak)) fpeak = 0.2/dt; if (!getparint("ls",&ls)) ls = 0; if (!getparint("er",&er)) er = 0; if (!getparint("ob",&ob)) ob = 1; if (!getparint("sp",&sp)) sp = 1; if (!getparfloat("tmin",&tmin)) tmin = 10.0*dt; if (!getparint("ndpfz",&ndpfz)) ndpfz = 5; if (!getparint("smooth",&smooth)) smooth = 0; if (!getparint("verbose",&verbose)) verbose = 0; decodeReflectors(&nr,&ar,&nxz,&xr,&zr); if (!smooth) breakReflectors(&nr,&ar,&nxz,&xr,&zr); /* convert velocity v(x0,z0) to v(0,0) */ v00 -= dvdx*x0+dvdz*z0; /* determine minimum velocity and minimum reflection time */ for (ir=0,vmin=FLT_MAX,tminr=FLT_MAX; ir<nr; ++ir) { for (ixz=0; ixz<nxz[ir]; ++ixz) { x = xr[ir][ixz]; z = zr[ir][ixz]; v = v00+dvdx*x+dvdz*z; if (v<vmin) vmin = v; t = 2.0*z/v; if (t<tminr) tminr = t; } } /* determine maximum reflector segment length */ tmin = MAX(tmin,MAX(ft,dt)); dsmax = vmin/(2*ndpfz)*sqrt(tmin/fpeak); /* make reflectors */ makeref(dsmax,nr,ar,nxz,xr,zr,&r); /* count reflector segments */ for (ir=0,ns=0; ir<nr; ++ir) ns += r[ir].ns; /* make wavelet */ makericker(fpeak,dt,&w); /* if requested, print information */ if (verbose) { warn("\nSYNLVCW:"); warn( "Minimum possible reflection time (assuming sources\n" "and receivers are at the surface Z=0) is %g s.\n" "You may want to adjust the \"minimum time of \n" "interest\" parameter.",tminr); warn( "Total number of small reflecting\n" "segments is %d.",ns); } /* set constant segy trace header parameters */ memset( (void *) &tr, 0, sizeof(segy)); tr.trid = 1; tr.counit = 1; tr.ns = nt; tr.dt = 1.0e6*dt; tr.delrt = 1.0e3*ft; /* loop over shots or midpoints */ for (ixsm=0,tracl=0; ixsm<nxsm; ++ixsm) { /* loop over offsets */ for (ixo=0; ixo<nxo; ++ixo) { /* compute source and receiver coordinates */ if (shots) xs = fxs+ixsm*dxs; else xs = fxm+ixsm*dxm-0.5*xo[ixo]; zs = 0.0; xg = xs+xo[ixo]; zg = 0.0; /* set segy trace header parameters */ tr.tracl = tr.tracr = ++tracl; if (shots) { tr.fldr = 1+ixsm; tr.tracf = 1+ixo; } else { tr.cdp = 1+ixsm; tr.cdpt = 1+ixo; } tr.offset = NINT(1000.0*(dxsm>0.0?xo[ixo]:-xo[ixo])); tr.sx = NINT(1000.0*xs); tr.gx = NINT(1000.0*xg); /* make one trace */ makeone(v00,dvdx,dvdz,ls,er,ob,sp,w,gamma, xs,zs,xg,zg, nr,r,nt,dt,ft,tr.data); /* write trace */ puttr(&tr); } } return(CWP_Exit()); }