/* for graceful interrupt termination */ static void closefiles(void) { efclose(datafp); eremove(datafile); efclose(x2fp); eremove(x2file); exit(EXIT_FAILURE); }
static void closefiles(void) { efclose(headerfp); efclose(tracefp); eremove(headerfile); eremove(tracefile); exit(EXIT_FAILURE); }
void fig_end(void) { while (nesting_level != 0) fprintf(out, "-6 # end <unknown> compound\n"); fprintf(out, "## %s\n", command_line); if (out != stdout) efclose(out); }
char *string_file(const char *fname) { /* * read file in dynamically allocated character string */ FILE *in = NULL; char *buf = NULL, cr; int c; int buf_size = 1000, i = 0; /* read as ascii file */ in = (fname == NULL) ? (FILE *) stdin : efopen(fname, "r"); buf = (char *) emalloc(buf_size * sizeof(char)); while ((c = fgetc(in)) != EOF) { cr = c; convert_null_to_space(&cr, fname ? fname : "stdin", NULL); if (i == buf_size) { buf_size += 1000; buf = (char *) erealloc(buf, buf_size * sizeof(char)); } buf[i] = c; i++; } buf[i] = '\0'; /* close string */ if (fname != NULL) efclose(in); /* close file */ /* free unnecesary memory: */ return (char *) erealloc(buf, (i + 1) * sizeof(char)); }
bool initauxtbl(char *aux) { char *filename; FILE * fp ; int pflen, nread, pfargc, targc, i, j ; char *argstr, **targv ; if( !getnpar(0,aux,"s",&filename) ) { fprintf(stderr,"Can't get auxiliary input %s definition\n",aux) ; return 0 ; } fp = fopen(filename, "r") ; if( fp == NULL ) { fprintf(stderr,"Can't open auxiliary input file %s=%s\n",aux,filename); return 0 ; } /* Get the length */ efseek(fp, 0, SEEK_END); pflen = eftell(fp); rewind(fp); argstr = (char *) ealloc1(1+pflen+1, 1); /* Read the parfile */ nread = efread(argstr+1, 1, pflen, fp); if (nread != pflen) { err("%s: fread only %d bytes out of %d from %s", __FILE__,nread,pflen,filename); } efclose(fp); /* Zap whites in parfile to help in parsing */ argstr[0] = '\0' ; pfargc = white2null(argstr, pflen); targc = pfargc ; /* Allocate space for total arg pointers */ targv = (char **) ealloc1(targc, sizeof(char*)); /* Parse the parfile. Skip over multiple NULLs */ for( j=1, i=0; j < pflen; j++) { if( argstr[j] && !argstr[j-1] ) { targv[i++] = argstr + j; } } /* Allocate space for the pointer table */ argtbl = (ArgStruct*) ealloc1(targc, sizeof(ArgStruct)); /* Tabulate targv */ tabulate(targc, targv); return 1 ; }
void dump2xplot(float *d,int n1,int n2,int dtype, char *title) { char cmd[1024] ; FILE *cmpfp; /* set up xplot command */ if ( dtype == 0 ) { sprintf(cmd,"ximage n1=%d n2=%d title=\"%s\"",n1,n2,title) ; } else { sprintf(cmd,"xwigb n1=%d n2=%d title=\"%s\"",n1,n2,title) ; } /* open pipe */ cmpfp = epopen(cmd,"w"); efwrite(d,sizeof(float),n1*n2,cmpfp); efclose(cmpfp); }
/* 创建字符串链表 */ T strlist_new(const char *file) { FILE *fp = efopen(file, "r");; /*模式串文件*/ T strlist; NEW0(strlist); strlist->file = strdup(file); strlist->list = list_new(NULL); strlist->min_strlen = MAX_STR_LEN; uint64_t line_num = 0; char buf[MAX_STR_LEN+1]; /*模式串缓存,包括换行符*/ while (fgets(buf, sizeof(buf), fp)) { line_num++; char *line_break = strchr(buf, '\n'); /*换行符指针*/ if (line_break) *line_break = '\0'; Str_Len_T len = strlen(buf); if (len) { /*非空行*/ /* 插入链表末尾 */ list_push_back(strlist->list, strdup(buf)); if (len < strlist->min_strlen) strlist->min_strlen = len; else if (len > strlist->max_strlen) strlist->max_strlen = len; strlist->total_strlen += len; strlist->strlen_num[len]++; } } //printf("Total line: %ld\n", line_num); strlist->str_num = list_len(strlist->list); /*计算平均串长*/ strlist->avg_strlen = (double) strlist->total_strlen / strlist->str_num; /* 计算串长标准差 */ strlist->strlen_sd = cal_sd(strlist); efclose(fp); return strlist; }
/* with axis labeling and grids */ void dump2xplotn(float *d,int n1,int n2,int dtype,char *title, float f1, float f2, float d1, float d2, char *label1, char *label2, char *grid1, char *grid2) { char cmd[2048] ; FILE *cmpfp; /* set up xplot command */ if ( dtype == 0 ) { sprintf(cmd,"ximage n1=%d n2=%d title=\"%s\" f1=%g f2=%g d1=%g d2=%g label1=\"%s\" label2=\"%s\" grid1=\"%s\" grid2=\"%s\" \n", n1,n2,title,f1,f2,d1,d2,label1,label2,grid1,grid2); } else { sprintf(cmd,"xwigb n1=%d n2=%d title=\"%s\" f1=%g f2=%g d1=%g d2=%g label1=\"%s\" label2=\"%s\" grid1=\"%s\" grid2=\"%s\"", n1,n2,title,f1,f2,d1,d2,label1,label2,grid1,grid2) ; } /* open pipe */ cmpfp = epopen(cmd,"w"); efwrite(d,sizeof(float),n1*n2,cmpfp); efclose(cmpfp); }
void JE_loadPCX( const char *file ) // this is only meant to load tshp2.pcx { Uint8 *s = (Uint8 *)VGAScreen->pixels; /* 8-bit specific */ SDL_RWops *f = dir_fopen_die(data_dir(), file, "rb"); efseek(f, -769, SEEK_END); if (efgetc(f) == 12) { for (int i = 0; i < 256; i++) { efread(f, &colors[i].r, 1, 1); efread(f, &colors[i].g, 1, 1); efread(f, &colors[i].b, 1, 1); } } efseek(f, 128, SEEK_SET); for (int i = 0; i < 320 * 200; ) { Uint8 p = efgetc(f); if ((p & 0xc0) == 0xc0) { i += (p & 0x3f); memset(s, efgetc(f), (p & 0x3f)); s += (p & 0x3f); } else { i++; *s = p; s++; } if (i && (i % 320 == 0)) { s += VGAScreen->pitch - 320; } } efclose(f); }
int main(int argc, char **argv) { int i,ix,it; /* loop counters */ int wtype; /* =1 psv. =2 sh wavefields */ int wfield; /* =1 displcement =2 velocity =3 acceleration */ int stype; /* source type */ int int_type; /* =1 for trapezoidal rule. =2 for Filon */ int flt; /* =1 apply earth flattening correction */ int rand; /* =1 for random velocity layers */ int qopt; /* some flag ???? */ int vsp; /* =1 for vsp, =0 otherwise */ int win; /* =1 if frequency windowing required */ int verbose; /* flag to output processing information */ int nt; /* samples per trace in output traces */ int ntc; /* samples per trace in computed traces */ int nx; /* number of output traces */ int np; /* number of ray parameters */ int nlint=0; /* number of times layer interp is required */ int lsource; /* layer on top of which the source is located*/ int nw; /* number of frequencies */ int nor; /* number of receivers */ int nlayers; /* number of reflecting layers */ int layern; int nrand_layers; /* maximum number of random layers permitted */ int nf; /* number of frequencies in output traces */ int *filters_phase=NULL; /* =0 for zero phase, =1 for minimum phase fil*/ int nfilters; /* number of required filters */ int wavelet_type; /* =1 spike =2 ricker1 =3 ricker2 =4 akb */ float dt; /* time sampling interval */ float tsec; /* trace length in seconds */ float fpeak; /* peak frequency for output wavelet */ float fref; /* first frequency */ float p2w; /* maximum ray parameter value */ float bp; /* smallest ray parameter (s/km) */ float bx; /* beginning of range in Kms. */ float fx; /* final range in Kms. */ float dx; /* range increment in Kms. */ float pw1,pw2,pw3,pw4; /* window ray parameters (to apply taper) */ float h1; /* horizontal linear part of the source */ float h2; /* vertical linear part of the source */ float m0; /* seismic moment */ float m1,m2,m3; /* components of the moment tensor */ float delta; /* dip */ float lambda; /* rake */ float phis; /* azimuth of the fault plane */ float phi; /* azimuth of the receiver location */ float sdcl,sdct; /* standar deviation for p and s-wave vels */ float z0=0.0; /* reference depth */ float zlayer; /* thickness of random layers */ int layer; /* layer over on top of which to compute rand*/ float tlag; /* time lag in output traces */ float red_vel; /* erducing velocity */ float w1=0.0; /* low end frequency cutoff for taper */ float w2=0.0; /* high end frequency cutoff for taper */ float wrefp; /* reference frequency for p-wave velocities */ float wrefs; /* reference frequency for s-wave velocities */ float epsp; /* .... for p-wave velocities */ float epss; /* .... for p-wave velocities */ float sigp; /* .... for p-wave velocities */ float sigs; /* .... for s-wave velocities */ float fs; /* sampling parameter, usually 0.07<fs<0.12 */ float decay; /* decay factor to avoid wraparound */ int *lobs; /* layers on top of which lay the receivers */ int *nintlayers=NULL; /* array of number of layers to interpolate */ int *filters_type; /* array of 1 lo cut, 2 hi cut, 3 notch */ float *dbpo=NULL; /* array of filter slopes in db/octave */ float *f1=NULL; /* array of lo frequencies for filters */ float *f2=NULL; /* array of high frequencies for filters */ float *cl; /* array of compressional wave velocities */ float *ql; /* array of compressional Q values */ float *ct; /* array of shear wave velocities */ float *qt; /* array of shear Q values */ float *rho; /* array of densities */ float *t; /* array of absolute layer thickness */ int *intlayers=NULL; /* array of layers to interpolate */ float *intlayth=NULL; /* array of thicknesses over which to interp */ float **wavefield1; /* array for pressure wavefield component */ float **wavefield2=NULL;/* array for radial wavefield component */ float **wavefield3=NULL;/* array for vertical wavefield component */ char *lobsfile=""; /* input file receiver layers */ char *clfile=""; /* input file of p-wave velocities */ char *qlfile=""; /* input file of compressional Q-values */ char *ctfile=""; /* input file of s-wave velocities */ char *qtfile=""; /* input file of shear Q-values */ char *rhofile=""; /* input file of density values */ char *tfile=""; /* input file of absolute layer thicknesses */ char *intlayfile=""; /* input file of layers to interpolate */ char *nintlayfile=""; /* input file of number of layers to interp */ char *intlaythfile=""; /*input file of layer thickness where to inter*/ char *filtypefile=""; /* input file of filter types to apply */ char *fphfile=""; /* input file of filters phases */ char *dbpofile=""; /* input file of filter slopes in db/octave */ char *f1file=""; /* input file of lo-end frequency */ char *f2file=""; /* input file of hi-end frequency */ char *wfp=""; /* output file of pressure */ char *wfr=""; /* output file of radial wavefield */ char *wfz=""; /* output file of vertical wavefield */ char *wft=""; /* output file of tangential wavefield */ char *outf=""; /* output file for processing information */ FILE *wfp_file; /* file pointer to output pressure */ FILE *wfr_file; /* file pointer to output radial wavefield */ FILE *wfz_file; /* file pointer to output vertical wavefield */ FILE *wft_file; /* file pointer to output tangential wavefield*/ FILE *outfp=NULL; /* file pointer to processing information */ FILE *infp; /* file pointer to input information */ /* hook up getpar to handle the parameters */ initargs(argc,argv); requestdoc(0); /* no input data */ /* get required parameter, seismic moment */ if (!getparfloat("m0",&m0)) err("error: the seismic moment, m0, is a required parameter\n"); /*********************************************************************/ /* get general flags and set their defaults */ if (!getparint("rand",&rand)) rand = 0; if (!getparint("qopt",&qopt)) qopt = 0; if (!getparint("stype",&stype)) stype = 1; if (!getparint("wtype",&wtype)) wtype = 1; if (!getparint("wfield",&wfield)) wfield = 1; if (!getparint("int_type",&int_type)) int_type= 1; if (!getparint("flt",&flt)) flt = 0; if (!getparint("vsp",&vsp)) vsp = 0; if (!getparint("win",&win)) win = 0; if (!getparint("wavelet_type",&wavelet_type)) wavelet_type = 1; if (!getparint("verbose",&verbose)) verbose = 0; /* get model parameters and set their defaults */ if (!getparint("lsource",&lsource)) lsource = 0; if (!getparfloat("fs",&fs)) fs = 0.07; if (!getparfloat("decay",&decay)) decay = 50.0; if (!getparfloat("tsec",&tsec)) tsec = 2.048; /* get response parameters and set their defaults */ if (!getparfloat("fref",&fref)) fref = 1.0; if (!getparint("nw",&nw)) nw = 100; if (!getparint("nor",&nor)) nor = 100; if (!getparint("np",&np)) np = 1300; if (!getparfloat("p2w",&p2w)) p2w = 5.0; if (!getparfloat("bx",&bx)) bx = 0.005; if (!getparfloat("bp",&bp)) bp = 0.0; if (!getparfloat("fx",&fx)) fx = 0.1; if (!getparfloat("dx",&dx)) dx = 0.001; if (!getparfloat("pw1",&pw1)) pw1 = 0.0; if (!getparfloat("pw2",&pw2)) pw2 = 0.1; if (!getparfloat("pw3",&pw3)) pw3 = 6.7; if (!getparfloat("pw4",&pw4)) pw4 = 7.0; if (!getparfloat("h1",&h1)) h1 = 1.0; if (!getparfloat("h2",&h2)) h2 = 0.0; /* get output parameters and set their defaults */ if (!getparint("nx",&nx)) nx = 100; if (!getparfloat("dt",&dt)) dt = 0.004; if (!getparint("nt",&nt)) nt = tsec/dt; if (!getparint("nf",&nf)) nf = 50; if (!getparfloat("red_vel",&red_vel)) red_vel = 5; if (!getparfloat("fpeak",&fpeak)) fpeak = 25.; if (!getparfloat("tlag",&tlag)) tlag = 0.; /* get names of output files */ if (wtype==1) { getparstring("wfp",&wfp); getparstring("wfr",&wfr); getparstring("wfz",&wfz); } else if (wtype==2) { getparstring("wft",&wft); } else err ("wtype has to be zero or one"); /*********************************************************************/ /* get or compute moment tensor components */ if (stype==1) { /* get source parameters */ if (!getparfloat("delta",&delta)) err("if stype==1, delta is a required parameter\n"); if (!getparfloat("lambda",&lambda)) err("if stype==1, lambda is a required parameter\n"); if (!getparfloat("phis",&phis)) err("if stype==1, phis is a required parameter\n"); if (!getparfloat("phi",&phi)) err("if stype==1, phi is a required parameter\n"); /* compute moment tensor components */ compute_moment_tensor (wtype, phi, lambda, delta, phis, m0, &m1, &m2, &m3); } else if (stype==2) { /* get moment tensor components from input */ if (!getparfloat("m1",&m1)) err("if stype==2, m1 is a required parameter\n"); if (!getparfloat("m2",&m2)) err("if stype==2, m2 is a required parameter\n"); if (!getparfloat("m3",&m3)) err("if stype==2, m3 is a required parameter\n"); } else err("error, stype flag has to be one or two\n"); /*********************************************************************/ /* if q-option is not requesed, set corresponding parameters to zero */ if (!getparint("layern",&layern)) layern =0; if (!getparfloat("wrefp",&wrefp)) wrefp =0.0; if (!getparfloat("wrefs",&wrefs)) wrefs =0.0; if (!getparfloat("epsp",&epsp)) epsp =0.0; if (!getparfloat("epss",&epss)) epss =0.0; if (!getparfloat("sigp",&sigp)) sigp =0.0; if (!getparfloat("sigs",&sigs)) sigs =0.0; /*********************************************************************/ /* get number of layers and check input parameters */ if (*clfile=='\0') { /* p-wave vels input from the comand line */ nlayers=countparval("cl"); } else { /* p-wave vels input from a file */ getparint("nlayers",&nlayers); } if (*ctfile=='\0') { /* s-wave vels input from the comand line */ if (nlayers !=countparval("cl")) err("number of p-wave and s-wave velocities" "has to be the same"); } if (*qlfile=='\0') { /* compressional q-values from comand line */ if (nlayers !=countparval("ql")) err("number of p-wave velocities and q-values" "has to be the same"); } if (*qtfile=='\0') { /* shear q-values input from comand line */ if (nlayers !=countparval("qt")) err("number of p-wave velocities and shear q-values" "has to be the same"); } if (*rhofile=='\0') { /* densities input from comand line */ if (nlayers !=countparval("rho")) err("number of p-wave velocities and densities" "has to be the same"); } if (*tfile=='\0') { /* layer thicknesses input from comand line */ if (nlayers !=countparval("t")) err("number of p-wave velocities and thicknesses" "has to be the same"); } if (int_type!=1 && int_type!=2) err("int_type flag has to be one or two"); /*********************************************************************/ /* if layer interpolation is requested, get parameters */ if (*intlayfile !='\0') { getparint("nlint",&nlint); if ((infp=efopen(intlayfile,"r"))==NULL) err("cannot open file of layer interp=%s\n",intlayfile); intlayers=alloc1int(nlint); fread (intlayers,sizeof(int),nlint,infp); efclose(infp); } else if (countparval("intlayers") !=0) { nlint=countparval("intlayers"); intlayers=alloc1int(nlint); getparint("intlayers",intlayers); } if (*nintlayfile !='\0') { if ((infp=efopen(nintlayfile,"r"))==NULL) err("cannot open file of layer inter=%s\n",nintlayfile); nintlayers=alloc1int(nlint); fread (nintlayers,sizeof(int),nlint,infp); efclose(infp); } else if (countparval("nintlayers") !=0) { if (nlint !=countparval("nintlayers")) err("number of values in intlay and nintlay not equal"); nintlayers=alloc1int(nlint); getparint("nintlayers",nintlayers); } if (*intlaythfile !='\0') { if ((infp=efopen(intlaythfile,"r"))==NULL) err("cannot open file=%s\n",intlaythfile); intlayth=alloc1float(nlint); fread (intlayth,sizeof(int),nlint,infp); efclose(infp); } else if (countparval("intlayth") !=0) { if (nlint !=countparval("intlayth")) err("# of values in intlay and intlayth not equal"); intlayth=alloc1float(nlint); getparfloat("intlayth",intlayth); } /* update total number of layers */ if (nlint!=0) { for (i=0; i<nlint; i++) nlayers +=intlayers[i]-1; } /*********************************************************************/ /* if random velocity layers requested, get parameters */ if (rand==1) { getparint("layer",&layer); getparint("nrand_layers",&nrand_layers); getparfloat("zlayer",&zlayer); getparfloat("sdcl",&sdcl); getparfloat("sdct",&sdct); } else nrand_layers=0; /*********************************************************************/ /* allocate space */ cl = alloc1float(nlayers+nrand_layers); ct = alloc1float(nlayers+nrand_layers); ql = alloc1float(nlayers+nrand_layers); qt = alloc1float(nlayers+nrand_layers); rho = alloc1float(nlayers+nrand_layers); t = alloc1float(nlayers+nrand_layers); lobs = alloc1int(nor+1); lobs[nor]=0; /*********************************************************************/ /* read input parameters from files or command line */ if (*clfile !='\0') { /* read from a file */ if ((infp=efopen(clfile,"r"))==NULL) err("cannot open file of pwave velocities=%s\n",clfile); fread(cl,sizeof(float),nlayers,infp); efclose(infp); } else getparfloat("cl",cl); /* get from command line */ if (*qlfile !='\0') { if ((infp=efopen(qlfile,"r"))==NULL) err("cannot open file of compressional Q=%s\n",qlfile); fread(ql,sizeof(float),nlayers,infp); efclose(infp); } else getparfloat("ql",ql); if (*ctfile !='\0') { if ((infp=efopen(ctfile,"r"))==NULL) err("cannot open file of swave velocities=%s\n",ctfile); fread(ct,sizeof(float),nlayers,infp); efclose(infp); } else getparfloat("ct",ct); if (*qtfile !='\0') { if ((infp=efopen(qtfile,"r"))==NULL) err("cannot open file of shear Q=%s\n",qtfile); fread(qt,sizeof(float),nlayers,infp); efclose(infp); } else getparfloat("qt",qt); if (*rhofile !='\0') { if ((infp=efopen(rhofile,"r"))==NULL) err("cannot open file of densities=%s\n",rhofile); fread(rho,sizeof(float),nlayers,infp); efclose(infp); } else getparfloat("rho",rho); if (*tfile !='\0') { if ((infp=efopen(tfile,"r"))==NULL) err("cannot open file of thicknesses=%s\n",tfile); fread(t,sizeof(float),nlayers,infp); efclose(infp); } else getparfloat("t",t); if (*lobsfile !='\0') { if ((infp=efopen(lobsfile,"r"))==NULL) err("can't open file of receiver layers=%s\n",lobsfile); fread(lobs,sizeof(int),nor,infp); efclose(infp); } else getparint("lobs",lobs); /*********************************************************************/ /* if requested, do interpolation and/or parameter adjustment */ if (nlint!=0) parameter_interpolation (nlayers, intlayers, nintlayers, intlayth, cl, ql, ct, qt, rho, t); /* if requested, compute random velocity layers */ if (rand==1) { random_velocity_layers (&nlayers, &lsource, nrand_layers, sdcl, sdct, layer, zlayer, cl, ql, ct, qt, rho, t); } /* if requested, apply earth flattening approximation */ if (flt==1) { apply_earth_flattening (nlayers, z0, cl, ct, rho, t); } /*********************************************************************/ /* get filter parameters */ if (*filtypefile !='\0') { if ((infp=efopen(filtypefile,"r"))==NULL) err("cannot open file=%s\n",filtypefile); getparint("nfilters",&nfilters); filters_type=alloc1int(nfilters); fread (filters_type,sizeof(int),nfilters,infp); efclose(infp); } else { nfilters=countparval("filters_type"); filters_type=alloc1int(nfilters); getparint("filters_type",filters_type); } if (*fphfile !='\0') { if ((infp=efopen(fphfile,"r"))==NULL) err("cannot open file=%s\n",fphfile); filters_phase=alloc1int(nfilters); fread (filters_phase,sizeof(float),nfilters,infp); efclose(infp); } else if (nfilters == countparval("filters_phase")) { filters_phase=alloc1int(nfilters); getparint("filters_phase",filters_phase); } else err("number of elements infilterstype and phase must be equal"); if (*dbpofile !='\0') { if ((infp=efopen(dbpofile,"r"))==NULL) err("cannot open file=%s\n",dbpofile); dbpo=alloc1float(nfilters); fread (dbpo,sizeof(float),nfilters,infp); efclose(infp); } else if (nfilters == countparval("dbpo")) { dbpo=alloc1float(nfilters); getparfloat("dbpo",dbpo); } else err("number of elements in filters_type and dbpo must be equal"); if (*f1file !='\0') { if ((infp=efopen(f1file,"r"))==NULL) err("cannot open file=%s\n",f1file); f1=alloc1float(nfilters); fread (f1,sizeof(float),nfilters,infp); efclose(infp); } else if (nfilters == countparval("f1")) { f1=alloc1float(nfilters); getparfloat("f1",f1); } else err("number of elements in filters_type and f1 must be equal"); if (*f2file !='\0') { if ((infp=efopen(f2file,"r"))==NULL) err("cannot open file=%s\n",f2file); f2=alloc1float(nfilters); fread (f2,sizeof(float),nfilters,infp); efclose(infp); } else if (nfilters == countparval("f2")) { f2=alloc1float(nfilters); getparfloat("f2",f2); } else err("number of elements in filters_type and f2 must be equal"); /*********************************************************************/ /* allocate space for wavefield computations */ wavefield1=alloc2float(nt,nx); if (wtype==1) { wavefield2=alloc2float(nt,nx); wavefield3=alloc2float(nt,nx); } /* get name of output file for processing information */ if (verbose==2||verbose==3) { if (!getparstring("outf",&outf)) outf="info"; if ((outfp=efopen(outf,"w"))==NULL) { warn("cannot open processing file =%s, no processing\n" "information file will be generated\n",outf); verbose=1; } } /* initialize wavefields */ if (wtype==1) { for (ix=0;ix<nx;ix++) { for (it=0;it<nt;it++) { wavefield1[ix][it]=0.0; wavefield2[ix][it]=0.0; wavefield3[ix][it]=0.0; } } } else if (wtype==2) { for (ix=0;ix<nx;ix++) { for (it=0;it<nt;it++) { wavefield1[ix][it]=0.0; } } } /* number of time samples in computed traces */ ntc=tsec/dt; if (int_type==2) bp=0.0; /*********************************************************************/ /* Now, compute the actual reflectivities */ compute_reflectivities (int_type, verbose, wtype, wfield, vsp, flt, win, nx, nt, ntc, nor, nf, nlayers, lsource, layern, nfilters, filters_phase, nw, np, bp, tlag, red_vel, w1, w2, fx, dx, bx, fs, decay, p2w, tsec, fref, wrefp, wrefs, epsp, epss, sigp, sigs, pw1, pw2, pw3, pw4, h1, h2, m1, m2, m3, fref, lobs, filters_type, dbpo, f1, f2, cl, ct, ql, qt, rho, t, wavefield1, wavefield2, wavefield3, outfp); /*********************************************************************/ /* if open, close processing information file */ if (verbose==2||verbose==3) efclose(outfp); /* convolve with a wavelet and write the results out */ if (wtype==1) { /* PSV */ /* convolve with a wavelet to produce the seismograms */ convolve_wavelet (wavelet_type, nx, nt, dt, fpeak, wavefield1); convolve_wavelet (wavelet_type, nx, nt, dt, fpeak, wavefield2); convolve_wavelet (wavelet_type, nx, nt, dt, fpeak, wavefield3); /* output results in SU format */ if(*wfp!='\0'){ if ((wfp_file=efopen(wfp,"w"))==NULL) err("cannot open pressure file=%s\n",wfp); { register int ix; for (ix=0; ix<nx; ix++) { for (it=0; it<nt; it++) tr1.data[it]=wavefield1[ix][it]; /* headers*/ tr1.ns=nt; tr1.dt=1000*(int)(1000*dt); tr1.offset=(bx+ix*dx)*1000; /* output trace */ fputtr(wfp_file, &tr1); } efclose (wfp_file); } } if (*wfr !='\0') { if ((wfr_file=efopen(wfr,"w"))==NULL) err("cannot open radial wfield file=%s\n",wfr); { register int ix; for (ix=0; ix<nx; ix++) { for (it=0; it<nt; it++) tr2.data[it]=wavefield2[ix][it]; tr2.ns=nt; tr2.dt=1000*(int)(1000*dt); tr2.offset=(bx+ix*dx)*1000; fputtr(wfr_file, &tr2); } efclose (wfr_file); } } if (*wfz !='\0') { if ((wfz_file=efopen(wfz,"w"))==NULL) err("canno open vertical field file=%s\n",wfz); { register int ix; for (ix=0; ix<nx; ix++) { for (it=0; it<nt; it++) tr3.data[it]=wavefield3[ix][it]; tr3.ns=nt; tr3.dt=1000*(int)(1000*dt); tr3.offset=(bx+ix*dx)*1000; fputtr(wfz_file, &tr3); } efclose (wfz_file); } } /* free allocated space */ free2float(wavefield1); free2float(wavefield2); free2float(wavefield3); } else if (wtype==2) { /* SH */ /* convolve with a wavelet to produce the seismogram */ convolve_wavelet (wavelet_type, nx, nt, dt, fpeak, wavefield1); /* output the result in SU format */ if (*wft !='\0') { if ((wft_file=efopen(wft,"w"))==NULL) err("cannot open tangential file=%s\n",wft); { register int ix; for (ix=0; ix<nx; ix++) { for (it=0; it<nt; it++) tr1.data[it]=wavefield1[ix][it]; tr1.ns=nt; tr1.dt=1000*(int)(1000*dt); tr1.offset=(bx+ix*dx)*1000; fputtr(wft_file, &tr1); } efclose (wft_file); } } /* free allocated space */ free2float(wavefield1); } /* free workspace */ free1float(cl); free1float(ct); free1float(ql); free1float(qt); free1float(rho); free1float(t); free1int(lobs); free1int(filters_type); free1int(filters_phase); free1float(dbpo); free1float(f1); free1float(f2); return EXIT_SUCCESS; }
main(int argc, char **argv) { FILE *fpr, *fpw; char msg[BUFSIZ]; char erbuf[BUFSIZ], ewbuf[BUFSIZ], rbuf[BUFSIZ], wbuf[BUFSIZ]; char pbuf[1], pfbuf[1]; size_t mbytes, rbytes, wbytes; size_t ritems, witems; initargs(argc, argv); /* Exercise efread and efwrite */ fpw = efopen("junk.fwr", "w+"); strcpy(ewbuf, " Writing with efwrite\n"); witems = strlen(ewbuf); efwrite(ewbuf, 1, witems, fpw); erewind(fpw); fread(rbuf, 1, witems, fpw); erewind(fpw); strcpy(msg, "***efwrite from file to buffer ..."); mbytes = strlen(msg); fwrite(msg, 1, mbytes, stdout); fwrite(rbuf, 1, witems, stdout); fpr = fopen("junk.frd", "w+"); strcpy(wbuf, " Reading with efread\n"); ritems = strlen(wbuf); fwrite(wbuf, 1, ritems, fpr); erewind(fpr); strcpy(wbuf, " efread saw zero bytes\n"); witems = strlen(wbuf); strcpy(msg, "***efread from file to buffer ..."); mbytes = strlen(msg); fwrite(msg, 1, mbytes, stdout); if (!efread(erbuf, 1, ritems, fpr)) { fwrite(wbuf, 1, witems, stdout); } else { fwrite(erbuf, 1, ritems, stdout); } erewind(fpr); strcpy(wbuf, " Reading byte by byte with efread\n"); ritems = strlen(wbuf); fwrite(wbuf, 1, ritems, fpr); erewind(fpr); strcpy(wbuf, " exit loop: efread returned zero\n"); witems = strlen(wbuf); strcpy(msg, "***efread file byte by byte to buffer ..."); mbytes = strlen(msg); fwrite(msg, 1, mbytes, stdout); while (efread(erbuf, 1, 1, fpr)) { fwrite(erbuf, 1, 1, stdout); } erewind(fpr); fwrite(wbuf, 1, witems, stdout); strcpy(wbuf, ""); ritems = strlen(wbuf); fwrite(wbuf, 1, ritems, fpr); erewind(fpr); strcpy(wbuf, " efread saw zero bytes\n"); witems = strlen(wbuf); strcpy(msg, "***efread from EMPTY file to buffer ..."); mbytes = strlen(msg); fwrite(msg, 1, mbytes, stdout); efread(erbuf, 1, ritems, fpr); erewind(fpr); fwrite(wbuf, 1, witems, stdout); efclose(fpw); efclose(fpr); eremove("junk.frd"); eremove("junk.fwr"); return EXIT_SUCCESS; }
main(int argc, char **argv) { char plotcmd[BUFSIZ]; /* build ximage command for popen */ float *trbuf; /* trace buffer */ FILE *datafp; /* fp for trace data file */ FILE *plotfp; /* fp for plot data */ int nt; /* number of samples on trace */ int ntr; /* number of traces */ float d1; /* time/depth sample rate */ float d2; /* trace/dx sample rate */ float f1; /* tmin/zmin */ float f2; /* tracemin/xmin */ bool seismic; /* is this seismic data? */ int panel; /* panel to pick */ int dtype; /* type of display */ int ppos; /* position of the panel */ FILE *infp=stdin; int n3,n2,n1; /* Initialize */ initargs(argc, argv); askdoc(1); /* Get info from headers and first trace */ fgethdr(infp,&ch,&bh); n1 = bh.hns; if(!getparint("ntpp",&n2)) { if (bh.tsort==2) { n2 = bh.fold; } else { n2 = bh.ntrpr; } } if (!fgettr(infp,&tr)) err("can't get first trace"); nt = tr.ns; if ( n1!=nt ) warn("samples/trace in bhdr and trhdr different; trhdr used! \n"); n1 = nt; fseek(infp,0L,2); n3=(ftell(infp)-EBCBYTES-BNYBYTES)/(n1*sizeof(float)+HDRBYTES)/n2; if(n3==0) { n3=1; n2=(ftell(infp)-EBCBYTES-BNYBYTES)/(n1*sizeof(float)+HDRBYTES); warn("less traces were found in input! \n"); } fseek(infp,0L,0); seismic = (tr.trid == 0 || tr.trid == TREAL); if (!getparint("panel", &panel)) panel=1; if (!getparint("dtype", &dtype)) dtype=0; if (!getparfloat("d1", &d1)) { if (seismic) { /* sampling interval in ms or in m (ft) */ if ( tr.dz!=0. ) { d1 = tr.dz; } else if (tr.dt) { d1 = (float) tr.dt / 1000.0; if (tr.dt<1000) d1 = tr.dt; } else { d1 = 0.004 * 1000.; warn("tr.dt not set, assuming dt=4"); } } else { /* non-seismic data */ if (tr.d1) { d1 = tr.d1; } else { d1 = 1.0; warn("tr.d1 not set, assuming d1=1.0"); } } } if (!getparfloat("d2", &d2)) { if(bh.tsort==2) { d2 = tr.offset; } else { d2 = tr.cdp; } } if (!getparfloat("f1", &f1)) { if (seismic) { f1 = (tr.delrt) ? (float) tr.delrt/1000.0 : 0.0; if(tr.delrt<1000) f1=tr.delrt; if(tr.dz!=0.) f1=tr.fz; } else { f1 = (tr.f1) ? tr.f1 : 0.0; } } if (!getparfloat("f2", &f2)) { if (bh.tsort==2) { f2 = tr.offset; } else { f2 = tr.cdp; } } /* Allocate trace buffer */ trbuf = ealloc1float(nt); /* Create temporary "file" to hold data */ datafp = etempfile(NULL); /* Loop over input traces & put them into the data file */ ntr = 0; fseek(infp,EBCBYTES+BNYBYTES+(panel-1)*n2*(n1*sizeof(float)+HDRBYTES),0); for(ntr=0;ntr<n2;ntr++) { if(!fgettr(infp,&tr)) err("get trace error \n"); efwrite(tr.data, FSIZE, nt, datafp); if(ntr==1) { if (bh.tsort==2) { if(!getparfloat("d2",&d2)) d2 = tr.offset-d2; if (!getparint("ppos", &ppos)) ppos = tr.cdp; } else { if(!getparfloat("d2",&d2)) d2 = tr.cdp-d2; if (!getparint("ppos", &ppos)) ppos = tr.offset; } } } /* Set up xipick or xwpick command line */ if ( dtype == 0 ) { sprintf(plotcmd, "mipick n1=%d n2=%d d1=%f d2=%f f1=%f f2=%f ppos=%d", n1, n2, d1, d2, f1, f2, ppos); } else { sprintf(plotcmd, "mwpick n1=%d n2=%d d1=%f d2=%f f1=%f f2=%f ppos=%d", n1, n2, d1, d2, f1, f2, ppos); } for (--argc, ++argv; argc; --argc, ++argv) { if (strncmp(*argv, "d1=", 3) && /* skip those already set */ strncmp(*argv, "d2=", 3) && strncmp(*argv, "f1=", 3) && strncmp(*argv, "f2=", 3)) { strcat(plotcmd, " "); /* put a space between args */ strcat(plotcmd, "\""); /* user quotes are stripped */ strcat(plotcmd, *argv); /* add the arg */ strcat(plotcmd, "\""); /* user quotes are stripped */ } } /* Open pipe; read data to buf; write buf to plot program */ plotfp = epopen(plotcmd, "w"); rewind(datafp); { register int itr; for (itr = 0; itr < ntr; ++itr) { efread (trbuf, FSIZE, nt, datafp); efwrite(trbuf, FSIZE, nt, plotfp); } } /* Clean up */ epclose(plotfp); efclose(datafp); return EXIT_SUCCESS; }
int main(int argc, char **argv) { int gelev_vmin, gelev_vmax, selev_vmin, selev_vmax; int gelev_min, gelev_max, selev_min, selev_max; int gelev_globalmin, gelev_globalmax, selev_globalmin, selev_globalmax; int gelev_num, selev_num; int imin, iminv, ifirst, nz1, nz, ns, ntr, ntrv, nsv; double dfirst, delrt, delrtv, twt, dt, dtv, factor, z, amp_out; double *depth, *tr_amp; float ***velocity; short verbose; register int i, j, k, l; cwp_String vfile; FILE *fv; initargs(argc, argv); requestdoc (0); if (!getparshort("verbose", &verbose)) verbose = 1; if (!getparstring("vfile",&vfile)) vfile = "output.su"; ntr = gettra (&tr, 0); fv = efopen (vfile, "r"); ntrv = fgettra (fv, &vtr, 0); delrt = tr.delrt; delrtv = vtr.delrt; if (!getparint("ns", &ns)) ns = tr.ns; if (!getparint("nsv", &nsv)) nsv = vtr.ns; if (!getparint("nz", &nz)) nz=2000; dt = tr.dt * 0.001; dtv = vtr.dt * 0.001; imin = nint ( delrt / dt ); iminv = nint ( delrtv / dtv ); depth = ealloc1double ( ns ); tr_amp = ealloc1double ( ns ); factor = 0.0005; if ( verbose ) { fprintf ( stderr, "\n" ); fprintf ( stderr, "Number of input traces = %d\n", ntr ); fprintf ( stderr, "Number of input samples per trace = %d\n", ns ); fprintf ( stderr, "Number of output samples per trace = %d\n", nz ); fprintf ( stderr, "Sample rate = %f ms.\n", dt ); fprintf ( stderr, "Average velocity SU file name = %s\n", vfile ); fprintf ( stderr, "Number of VAVG input traces = %d\n", ntrv ); fprintf ( stderr, "Number of VAVG input samples per trace = %d\n", nsv ); fprintf ( stderr, "VAVG Sample rate = %f ms.\n", dtv ); fprintf ( stderr, "Input Delay = %f ms., First sample = %d\n", delrt, imin ); fprintf ( stderr, "Velocity Delay = %f ms., First sample = %d\n", delrtv, iminv ); fprintf ( stderr, "\n" ); } rewind ( fv ); gelev_vmin = selev_vmin = INT_MAX; gelev_vmax = selev_vmax = INT_MIN; for ( i = 0; i < ntrv; ++i ) { fgettr (fv, &vtr); gelev_vmin = min ( gelev_vmin, vtr.gelev ); gelev_vmax = max ( gelev_vmax, vtr.gelev ); selev_vmin = min ( selev_vmin, vtr.selev ); selev_vmax = max ( selev_vmax, vtr.selev ); } if ( verbose ) fprintf ( stderr, "VELOCITY DATA - gelev_vmin = %d, gelev_vmax = %d, selev_vmin = %d, selev_vmax = %d\n", gelev_vmin, gelev_vmax, selev_vmin, selev_vmax ); rewind (stdin); gelev_min = selev_min = INT_MAX; gelev_max = selev_max = INT_MIN; for ( i = 0; i < ntr; ++i ) { gettr (&tr); gelev_min = min ( gelev_min, tr.gelev ); gelev_max = max ( gelev_max, tr.gelev ); selev_min = min ( selev_min, tr.selev ); selev_max = max ( selev_max, tr.selev ); } if ( verbose ) fprintf ( stderr, "INPUT DATA - gelev_min = %d, gelev_max = %d, selev_min = %d, selev_max = %d\n", gelev_min, gelev_max, selev_min, selev_max ); gelev_globalmin = max ( gelev_min, gelev_vmin ); selev_globalmin = max ( selev_min, selev_vmin ); gelev_globalmax = min ( gelev_max, gelev_vmax ); selev_globalmax = min ( selev_max, selev_vmax ); gelev_num = gelev_globalmax - gelev_globalmin + 1; selev_num = selev_globalmax - selev_globalmin + 1; if ( verbose ) { fprintf ( stderr, "\n" ); fprintf ( stderr, "gelev_globalmin = %d, gelev_globalmax = %d, selev_globalmin = %d, selev_globalmax = %d\n", gelev_globalmin, gelev_globalmax, selev_globalmin, selev_globalmax ); fprintf ( stderr, "gelev_num = %d, selev_num = %d\n", gelev_num, selev_num ); } velocity = ealloc3float ( nsv, selev_num, gelev_num ); rewind ( fv ); ifirst = 0; dfirst = 9999999999999999.9; for ( k = 0; k < ntrv; ++k ) { fgettr (fv, &vtr); if ( vtr.gelev >= gelev_globalmin && vtr.gelev <= gelev_globalmax && vtr.selev >= selev_globalmin && vtr.selev <= selev_globalmax ) { i = vtr.gelev - gelev_globalmin; j = vtr.selev - selev_globalmin; memcpy( (void *) &velocity[i][j][0], (const void *) &vtr.data, nsv * FSIZE ); dfirst = min ( dfirst, velocity[i][j][0] * delrtv * factor ); } } efclose (fv); ifirst = nint ( dfirst / dt ); nz1 = nz - ifirst; if ( verbose ) fprintf ( stderr, "ifirst = %d, dfirst = %f, nz1 = %d\n", ifirst, dfirst, nz1 ); float zero; double depth_max; zero = 0.0; rewind (stdin); for ( l = 0; l < ntr; ++l ) { gettr (&tr); if ( tr.gelev >= gelev_globalmin && tr.gelev <= gelev_globalmax && tr.selev >= selev_globalmin && tr.selev <= selev_globalmax ) { i = tr.gelev - gelev_globalmin; j = tr.selev - selev_globalmin; for ( k = 0; k < nsv; ++k ) { twt = ( k * dtv ) + delrtv; tr_amp[k] = tr.data[k+iminv]; depth[k] = velocity[i][j][k] * twt * factor; } depth_max = depth[nsv-1]; fprintf ( stderr, "trace number = %5d, depth_max = %f\n", l, depth_max ); for ( k=ifirst; k < nz1; ++k ) { z = k * dt; if ( z <= depth_max ) { dintlin ( nsv, depth, tr_amp, tr_amp[0], tr_amp[nsv-1], 1, &z, &_out ); tr.data[k-ifirst] = (float) amp_out; } else { tr.data[k-ifirst] = zero; } } tr.trid = 1; tr.ns = nsv; tr.delrt = nint ( dfirst ); tr.dt = nint(dt*1000); puttr (&tr); } } free1double (tr_amp); free1double (depth); free3float (velocity); return EXIT_SUCCESS; }
int main(int argc, char **argv) { int nx1,nx2; /* numbers of samples */ int ix1, ix2; /* sample indices */ float a1,a2; /* filter dimensions */ float pi; /* pi number */ float vmax; /* maximum value of the data */ float vfmax; /* scale factor after filtering */ float c1,c2; float **v=NULL; /* array of velocities */ float *k1=NULL,*k2=NULL; /* wavenumber arrays */ float *kfilt1=NULL,*kfilt2=NULL;/* intermediate filter arrays */ float dk1,dk2; /* wavenumber interval */ float **kfilter=NULL; /* array of filter values */ int nx1fft,nx2fft; /* dimensions after padding for FFT */ int nK1,nK2; /* transform dimension */ int ik1,ik2; /* wavenumber indices */ register complex **ct=NULL; /* complex FFT workspace */ register float **rt=NULL; /* float FFT workspace */ FILE *tracefp=NULL; /* temp file to hold traces */ FILE *hfp=NULL; /* temp file to hold trace headers */ /* hook up getpar to handle the parameters */ initargs(argc, argv); requestdoc(1); /* Get parameters from command line */ if (!getparfloat("a1",&a1)) a1=0.; if (!getparfloat("a2",&a2)) a2=0.; /* Get info from first trace */ if (!gettr(&tr)) err("can't get first trace"); if (tr.trid != TRID_DEPTH) warn("tr.trid=%d",tr.trid); nx1=tr.ns; /* Store traces in tmpfile while getting a count */ tracefp=etmpfile(); hfp=etmpfile(); nx2=0; do { ++nx2; efwrite(&tr,HDRBYTES, 1, hfp); efwrite(tr.data, FSIZE, nx1, tracefp); } while (gettr(&tr)); /* Determine number of wavenumbers in K1 and K2 */ nx1fft=npfaro(nx1, LOOKFAC*nx1); nx2fft=npfa(nx2); if (nx1fft >=SU_NFLTS || nx1fft >= PFA_MAX) err("Padded nx1=%d--too big",nx1fft); if (nx2fft >= PFA_MAX) err("Padded nx2=%d--too big",nx2fft); /* Determine number of wavenumbers in K1 and K2 */ nK1=nx1fft/2 + 1; nK2=nx2fft/2 + 1; /* Allocate space */ v=alloc2float(nx1,nx2); rt=alloc2float(nx1fft,nx2fft); ct=alloc2complex(nK1,nx2fft); kfilter=alloc2float(nx1fft,nx2fft); k1=alloc1float(nK1); k2=alloc1float(nK2); kfilt1= alloc1float(nK1); kfilt2= alloc1float(nK2); /* Zero all arrays */ memset((void *) rt[0], 0, nx1fft*nx2fft*FSIZE); memset((void *) kfilter[0], 0, nx1fft*nx2fft*FSIZE); memset((void *) ct[0], 0, nK1*nx2fft*sizeof(complex)); memset((void *) k1, 0, nK1*FSIZE); memset((void *) k2, 0, nK2*FSIZE); memset((void *) kfilt1, 0, nK1*FSIZE); memset((void *) kfilt2, 0, nK2*FSIZE); /* Determine wavenumber arrays for the filter */ pi=PI; dk1=2*pi / nx1fft; dk2=2*pi / nx2fft; for (ik1=0; ik1<nK1; ++ik1) { c1=a1*ik1*dk1/ 2; kfilt1[ik1]= exp(-pow(c1,2)); } for (ik2=0; ik2<nK2; ++ik2) { c2= a2*ik2*dk2/2; kfilt2[ik2]= exp(-pow(c2,2)); } /* Build Gaussian filter */ /* positive k1, positive k2 */ for (ik2=0; ik2<nK2; ++ik2) { for (ik1=0; ik1<nK1; ++ik1) { kfilter[ik2][ik1]=kfilt2[ik2]*kfilt1[ik1]; } } /* positive k1, negative k2 */ for (ik2=nK2; ik2<nx2fft; ++ik2) { for (ik1=0; ik1<nK1; ++ik1) { kfilter[ik2][ik1]=kfilt2[nx2fft-ik2]*kfilt1[ik1]; } } /* Read velocities from temp file and determine maximum */ rewind(tracefp); fread(v[0],sizeof(float),nx2*nx1,tracefp); vmax=v[0][0]; for (ix2=0; ix2<nx2; ++ix2) { for (ix1=0; ix1<nx1; ++ix1) { vmax=MAX(vmax,v[ix2][ix1]); } } /* Load data into FFT arrays */ rewind(tracefp); for (ix2=0; ix2<nx2; ++ix2) { efread(rt[ix2], FSIZE, nx1, tracefp); } /* Fourier transform dimension 1 */ pfa2rc(-1,1,nx1fft,nx2,rt[0],ct[0]); /* Fourier transform dimension 2 */ pfa2cc(-1,2,nK1,nx2fft,ct[0]); /* Apply filter to the data */ for (ik2=0; ik2<nx2fft; ++ik2) { for (ik1=0; ik1<nK1; ++ik1) { ct[ik2][ik1]=crmul(ct[ik2][ik1], kfilter[ik2][ik1]) ; } } /* Inverse Fourier transformation dimension 2 */ pfa2cc(1,2,nK1,nx2fft,ct[0]); /* Inverse Fourier transformation dimension 1 */ pfa2cr(1,1,nx1fft,nx2,ct[0],rt[0]); /* Find maximum of filtered data */ vfmax=rt[0][0]; for (ix2=0; ix2<nx2; ++ix2) { for (ix1=0; ix1<nx1; ++ix1) { vfmax=MAX(vfmax,rt[ix2][ix1]); } } /* Rescale and output filtered data */ erewind(hfp); for (ix2=0; ix2<nx2; ++ix2) { efread(&tr, HDRBYTES, 1, hfp); for (ix1=0; ix1<nx1; ++ix1) tr.data[ix1]=(rt[ix2][ix1]) * vmax / vfmax; puttr(&tr); } efclose(hfp); return(CWP_Exit()); }
int main(int argc, char **argv) { cwp_String key[SU_NKEYS]; /* array of keywords */ cwp_String type[SU_NKEYS]; /* array of keywords */ int index[SU_NKEYS]; /* name of type of getparred key */ int ikey; /* key counter */ int nkeys; /* number of header fields set */ int count=0; /* number of header fields from file */ double i; /* parameters for computing fields */ int itr = 0; /* trace counter */ Value val; /* value of key field */ char *infile=""; /* name of input file of header values */ FILE *infp=NULL; /* pointer to input file */ cwp_Bool from_file=cwp_false; /* is the data from infile? */ float *afile=NULL; /* array of "a" values from file */ double *a=NULL; /* array of "a" values */ double *b=NULL; /* array of "b" values */ double *c=NULL; /* array of "c" values */ double *d=NULL; /* array of "d" values */ double *j=NULL; /* array of "j" values */ int n; /* number of a,b,c,d,j values */ /* Initialize */ initargs(argc, argv); requestdoc(1); /* Get "key" values */ if ((nkeys=countparval("key"))!=0) { getparstringarray("key",key); } else { key[0]="cdp"; } /* get types and indexes corresponding to the keys */ for (ikey=0; ikey<nkeys; ++ikey) { type[ikey]=hdtype(key[ikey]); index[ikey]=getindex(key[ikey]); } /* get name of infile */ getparstring("infile",&infile); /* if infile is specified get specified keys from file */ if (*infile!='\0') { /* open infile */ if((infp=efopen(infile,"r"))==NULL) err("cannot open infile=%s\n",infile); /* set from_file flag */ from_file=cwp_true; } /* If not from file, getpar a,b,c,d,j */ if (!from_file) { /* get "a" values */ if ((n=countparval("a"))!=0) { if (n!=nkeys) err("number of a values not equal to number of keys"); a=ealloc1double(n); getpardouble("a",a); } else { a=ealloc1double(nkeys); for (ikey=0; ikey<nkeys; ++ikey) a[ikey]=0.; } /* get "b" values */ if ((n=countparval("b"))!=0) { if (n!=nkeys) err("number of b values not equal to number of keys"); b=ealloc1double(n); getpardouble("b",b); } else { b=ealloc1double(nkeys); for (ikey=0; ikey<nkeys; ++ikey) b[ikey]=0.; } /* get "c" values */ if ((n=countparval("c"))!=0) { if (n!=nkeys) err("number of c values not equal to number of keys"); c=ealloc1double(n); getpardouble("c",c); } else { c=ealloc1double(nkeys); for (ikey=0; ikey<nkeys; ++ikey) c[ikey]=0.; } /* get "d" values */ if ((n=countparval("d"))!=0) { if (n!=nkeys) err("number of d values not equal to number of keys"); d=ealloc1double(n); getpardouble("d",d); } else { d=ealloc1double(nkeys); for (ikey=0; ikey<nkeys; ++ikey) d[ikey]=0.; } /* get "j" values */ if ((n=countparval("j"))!=0) { if (n!=nkeys) err("number of j values not equal to number of keys"); j=ealloc1double(n); getpardouble("j",j); /* make sure that j!=0 */ for (ikey=0; ikey<nkeys; ++ikey) if(j[ikey]==0) j[ikey]=ULONG_MAX; } else { j=ealloc1double(nkeys); for (ikey=0; ikey<nkeys; ++ikey) j[ikey]=ULONG_MAX; } } else { /* if reading from a file */ /* allocate space for afile */ afile=ealloc1float(nkeys); } checkpars(); /* loop over traces */ while (gettr(&tr)) { if (from_file) { /* use the "a" value from file to trace by trace */ if (efread(afile,FSIZE,nkeys,infp)!=0) { for (ikey=0; ikey<nkeys; ++ikey) { double a_in; a_in=(double) afile[ikey]; setval(type[ikey],&val,a_in, 0,0,0,ULONG_MAX); puthval(&tr,index[ikey],&val); ++count; } } } else { /* use getparred values of a,b,c,d,j */ for (ikey=0; ikey<nkeys; ++ikey) { i = (double) itr + d[ikey]; setval(type[ikey],&val,a[ikey],b[ikey], c[ikey],i,j[ikey]); puthval(&tr,index[ikey],&val); } } ++itr; puttr(&tr); } if (from_file) { efclose(infp); if (count < (int)(itr*nkeys) ) { warn("itr=%d > count=%d %s",(int) itr*count,count); warn("n traces=%d > data count =%d",(itr*nkeys),count); } } return(CWP_Exit()); }
void write_points(const char *fname, DATA *d, DPOINT *where, double *est, int n_outfl) { static FILE *f = NULL; #ifdef HAVE_LIBGIS static Site *site = NULL; static int dim = 2; int i; #endif if (! grass()) { if (where == NULL) { if (fname != NULL) { f = efopen(fname, "w"); write_ascii_header(f, d, n_outfl); } else efclose(f); } else { if (f == NULL) ErrMsg(ER_NULL, "write_points(): f"); output_line(f, d, where, est, n_outfl); } } else { #ifdef HAVE_LIBGIS if (where == NULL) { if (fname != NULL) { /* initialize: */ DUMP("opening grass sites list\n"); if (d->mode & Z_BIT_SET) dim++; if ((f = G_sites_open_new((char *) fname)) == NULL) G_fatal_error("%s: cannot open sites file %f for writing\n", G_program_name()); site = G_site_new_struct(CELL_TYPE, dim, 0, n_outfl); } else { /* close: */ DUMP("closing grass sites list\n"); fclose(f); dim = 2; G_site_free_struct(site); site = NULL; } } else { assert(site != NULL); assert(d != NULL); /* fill site: */ site->east = where->x; site->north = where->y; if (d->mode & Z_BIT_SET) site->dim[0] = where->z; if (d->mode & S_BIT_SET) site->ccat = where->u.stratum + strata_min; else site->ccat = GET_INDEX(where) + 1; for (i = 0; i < n_outfl; i++) { if (is_mv_double(&(est[i]))) { site->dbl_att[i] = -9999.0; if (DEBUG_DUMP) printlog(" [%d]:mv ", i); } else { site->dbl_att[i] = est[i]; if (DEBUG_DUMP) printlog(" value[%d]: %g ", i, site->dbl_att[i]); } } if (DEBUG_DUMP) printlog("\n"); G_site_put(f, site); } #else ErrMsg(ER_IMPOSVAL, "gstat/grass error: libgis() not linked"); #endif } }
int main (int argc, char **argv) { int nt; /* number of time samples */ int ntau; /* number of migrated time samples */ int nx; /* number of midpoints */ int ik,ix,it,itau,itmig;/* loop counters */ int nxfft; /* fft size */ int nk; /* number of wave numbers */ int ntmig,nvmig; float dt; /* time sampling interval */ float ft; /* first time sample */ float dtau; /* migrated time sampling interval */ float ftau; /* first migrated time value */ float dk; /* wave number sampling interval */ float fk; /* first wave number */ float Q, ceil; /* quality factor, ceiling of amplitude */ float t,k; /* time,wave number */ float *tmig, *vmig; /* arrays of time, interval velocities */ float dx; /* spatial sampling interval */ float *vt; /* velocity v(t) */ float **p,**q; /* input, output data */ complex **cp,**cq; /* complex input,output */ char *vfile=""; /* name of file containing velocities */ int verbose=0; /* flag for echoing info */ char *tmpdir; /* directory path for tmp files */ cwp_Bool istmpdir=cwp_false;/* true for user-given path */ /* hook up getpar to handle the parameters */ initargs(argc,argv); requestdoc(1); /* get info from first trace */ if (!gettr(&tr)) err("can't get first trace"); nt = tr.ns; /* let user give dt and/or dx from command line */ if (!getparfloat("dt", &dt)) { if (tr.dt) { /* is dt field set? */ dt = ((double) tr.dt)/1000000.0; } else { /* dt not set, assume 4 ms */ dt = 0.004; warn("tr.dt not set, assuming dt=0.004"); } } if (!getparfloat("dx",&dx)) { if (tr.d2) { /* is d2 field set? */ dx = tr.d2; } else { dx = 1.0; warn("tr.d2 not set, assuming d2=1.0"); } } /* get optional parameters */ if (!getparfloat("ft",&ft)) ft = 0.0; if (!getparint("ntau",&ntau)) ntau = nt; CHECK_NT("ntau",ntau); if (!getparfloat("dtau",&dtau)) dtau = dt; if (!getparfloat("ftau",&ftau)) ftau = ft; if (!getparfloat("Q",&Q)) Q = 1.0e6; if (!getparfloat("ceil",&ceil)) ceil = 1.0e6; if (verbose)warn("Q=%f ceil=%f",Q,ceil); if (!getparint("verbose", &verbose)) verbose = 0; /* Look for user-supplied tmpdir */ if (!getparstring("tmpdir",&tmpdir) && !(tmpdir = getenv("CWP_TMPDIR"))) tmpdir=""; if (!STREQ(tmpdir, "") && access(tmpdir, WRITE_OK)) err("you can't write in %s (or it doesn't exist)", tmpdir); /* store traces and headers in tempfiles while getting a count */ if (STREQ(tmpdir,"")) { tracefp = etmpfile(); headerfp = etmpfile(); if (verbose) warn("using tmpfile() call"); } else { /* user-supplied tmpdir */ char directory[BUFSIZ]; strcpy(directory, tmpdir); strcpy(tracefile, temporary_filename(directory)); strcpy(headerfile, temporary_filename(directory)); /* Trap signals so can remove temp files */ signal(SIGINT, (void (*) (int)) closefiles); signal(SIGQUIT, (void (*) (int)) closefiles); signal(SIGHUP, (void (*) (int)) closefiles); signal(SIGTERM, (void (*) (int)) closefiles); tracefp = efopen(tracefile, "w+"); headerfp = efopen(headerfile, "w+"); istmpdir=cwp_true; if (verbose) warn("putting temporary files in %s", directory); } nx = 0; do { ++nx; efwrite(&tr,HDRBYTES,1,headerfp); efwrite(tr.data, FSIZE, nt, tracefp); } while (gettr(&tr)); erewind(tracefp); erewind(headerfp); /* determine wavenumber sampling (for real to complex FFT) */ nxfft = npfar(nx); nk = nxfft/2+1; dk = 2.0*PI/(nxfft*dx); fk = 0.0; /* allocate space */ p = alloc2float(nt,nxfft); q = alloc2float(ntau,nxfft); cp = alloc2complex(nt,nk); cq = alloc2complex(ntau,nk); /* load traces into the zero-offset array and close tmpfile */ efread(*p, FSIZE, nt*nx, tracefp); efclose(tracefp); /* determine velocity function v(t) */ vt = ealloc1float(ntau); if (!getparstring("vfile",&vfile)) { ntmig = countparval("tmig"); if (ntmig==0) ntmig = 1; tmig = ealloc1float(ntmig); if (!getparfloat("tmig",tmig)) tmig[0] = 0.0; nvmig = countparval("vmig"); if (nvmig==0) nvmig = 1; if (nvmig!=ntmig) err("number of tmig and vmig must be equal"); vmig = ealloc1float(nvmig); if (!getparfloat("vmig",vmig)) vmig[0] = 1500.0; for (itmig=1; itmig<ntmig; ++itmig) if (tmig[itmig]<=tmig[itmig-1]) err("tmig must increase monotonically"); for (it=0,t=0.0; it<ntau; ++it,t+=dt) intlin(ntmig,tmig,vmig,vmig[0],vmig[ntmig-1], 1,&t,&vt[it]); } else { if (fread(vt,sizeof(float),nt,fopen(vfile,"r"))!=nt) err("cannot read %d velocities from file %s",nt,vfile); } checkpars(); /* pad with zeros and Fourier transform x to k */ for (ix=nx; ix<nxfft; ix++) for (it=0; it<nt; it++) p[ix][it] = 0.0; pfa2rc(-1,2,nt,nxfft,p[0],cp[0]); /* migrate each wavenumber */ for (ik=0,k=fk; ik<nk; ik++,k+=dk) gazdagvt(k,nt,dt,ft,ntau,dtau,ftau,vt,cp[ik],cq[ik], Q, ceil); /* Fourier transform k to x (including FFT scaling) */ pfa2cr(1,2,ntau,nxfft,cq[0],q[0]); for (ix=0; ix<nx; ix++) for (itau=0; itau<ntau; itau++) q[ix][itau] /= nxfft; /* restore header fields and write output */ for (ix=0; ix<nx; ++ix) { efread(&tr,HDRBYTES,1,headerfp); tr.ns = ntau ; tr.dt = dtau * 1000000.0 ; tr.delrt = ftau * 1000.0 ; memcpy( (void *) tr.data, (const void *) q[ix],ntau*FSIZE); puttr(&tr); } /* Clean up */ efclose(headerfp); if (istmpdir) eremove(headerfile); if (istmpdir) eremove(tracefile); return(CWP_Exit()); }
int main(int argc, char **argv) { char plotcmd[BUFSIZ]; /* build psmovie command for popen */ float *trbuf; /* trace buffer */ FILE *plotfp; /* fp for plot data */ int nt; /* number of samples on trace */ int n2; /* number of traces per frame */ int n3; /* number of frames in data */ int ntr; /* number of traces */ int verbose; /* verbose flag */ float d1; /* time/depth sample rate */ float d2; /* trace/dx sample rate */ float f1; /* tmin/zmin */ float f2; /* tracemin/xmin */ cwp_Bool seismic; /* is this seismic data? */ cwp_Bool have_n2 = cwp_false;/* was n2 getparred? */ cwp_Bool have_n3 = cwp_false;/* was n3 getparred? */ cwp_Bool have_ntr = cwp_false;/* was ntr set in header? */ char *tmpdir; /* directory path for tmp files */ cwp_Bool istmpdir=cwp_false;/* true for user given path */ char *cwproot; /* value of CWPROOT environment variable*/ char *bindir; /* directory path for tmp files */ /* Initialize */ initargs(argc, argv); requestdoc(1); /* Get info from first trace */ if (!gettr(&tr)) err("can't get first trace"); seismic = ISSEISMIC(tr.trid); nt = tr.ns; ntr = tr.ntr; if (ntr) have_ntr = cwp_true; if (!getparint("verbose", &verbose)) verbose=0; if (!getparfloat("d1", &d1)) { if (tr.d1) d1 = tr.d1; else if (tr.dt) d1 = ((double) tr.dt)/1000000.0; else { if (seismic) { d1 = 0.004; warn("tr.dt not set, assuming dt=0.004"); } else { /* non-seismic data */ d1 = 1.0; warn("tr.d1 not set, assuming d1=1.0"); } } } if (!getparfloat("d2", &d2)) d2 = (tr.d2) ? tr.d2 : 1.0; if (!getparfloat("f1", &f1)) { if (tr.f1) f1 = tr.f1; else if (tr.delrt) f1 = (float) tr.delrt/1000.0; else f1 = 0.0; } if (!getparfloat("f2", &f2)) { if (tr.f2) f2 = tr.f2; else if (tr.tracr) f2 = (float) tr.tracr; else if (tr.tracl) f2 = (float) tr.tracl; else if (seismic) f2 = 1.0; else f2 = 0.0; } if (!getparfloat("f2", &f2)) f2 = 1.0; /* Look for user-supplied tmpdir */ if (!getparstring("tmpdir",&tmpdir) && !(tmpdir = getenv("CWP_TMPDIR"))) tmpdir=""; if (!STREQ(tmpdir, "") && access(tmpdir, WRITE_OK)) err("you can't write in %s (or it doesn't exist)", tmpdir); /* See if CWPBIN environment variable is not set */ if (!(bindir = getenv("CWPBIN"))) { /* construct bindir from CWPROOT */ bindir = (char *) emalloc(BUFSIZ); /* Get value of CWPROOT environment variable */ if (!(cwproot = getenv("CWPROOT"))) cwproot ="" ; if (STREQ(cwproot, "")) { warn("CWPROOT environment variable is not set! "); err("Set CWPROOT in shell environment as per instructions in CWP/SU Installation README files"); } /* then bindir = $CWPROOT/bin */ sprintf(bindir, "%s/bin", cwproot); } strcat(bindir,"/"); /* put / at the end of bindir */ /* Allocate trace buffer */ trbuf = ealloc1float(nt); /* Get or set n2 and n3 */ if (getparint("n2", &n2)) have_n2 = cwp_true; if (getparint("n3", &n3)) have_n3 = cwp_true; if (have_n2 && have_n3) have_ntr = cwp_true; if (!have_ntr) { /* count traces */ if (verbose) { warn("n2 or n3 not getparred, or ntr header field not set"); warn(" ... counting traces"); } /* Create temporary "file" to hold data */ if (STREQ(tmpdir,"")) { tracefp = etmpfile(); if (verbose) warn("using tmpfile() call"); } else { /* user-supplied tmpdir */ char directory[BUFSIZ]; strcpy(directory, tmpdir); strcpy(tracefile, temporary_filename(directory)); /* Handle user interrupts */ signal(SIGINT, (void (*) (int)) closefiles); signal(SIGTERM, (void (*) (int)) closefiles); tracefp = efopen(tracefile, "w+"); istmpdir=cwp_true; if (verbose) warn("putting temporary files in %s", directory); } /* Loop over input frames & put them into the data file */ ntr = 0; do { ++ntr; efwrite(tr.data, FSIZE, nt, tracefp); } while (gettr(&tr)); } /* Set dimensions of movie */ if (!have_n2 && !have_n3) { n2 = ntr; n3=1; } if (have_n2 && !have_n3) n3 = ntr/n2; if (!have_n2 && have_n3) n2 = ntr/n3; /* Set up psmovie command line */ sprintf(plotcmd, "%spsmovie n1=%d n2=%d n3=%d d1=%f d2=%f f1=%f f2=%f", bindir, nt, n2, n3, d1, d2, f1, f2); fprintf(stderr, "%s\n", plotcmd); for (--argc, ++argv; argc; --argc, ++argv) { if (strncmp(*argv, "d1=", 3) && /* skip those already set */ strncmp(*argv, "d2=", 3) && strncmp(*argv, "f1=", 3) && strncmp(*argv, "f2=", 3)) { strcat(plotcmd, " "); /* put a space between args */ strcat(plotcmd, "\""); /* user quotes are stripped */ strcat(plotcmd, *argv); /* add the arg */ strcat(plotcmd, "\""); /* user quotes are stripped */ } } /* Open pipe to psmovie and send the traces */ plotfp = epopen(plotcmd, "w"); if (!have_ntr){ /* send out stored traces one by one */ rewind(tracefp); { register int itr; for (itr = 0; itr < ntr; ++itr) { efread (trbuf, FSIZE, nt, tracefp); efwrite(trbuf, FSIZE, nt, plotfp); } } } else { /* just pump out traces and let psmovie do the work */ do { efwrite(tr.data, FSIZE, nt, plotfp); } while (gettr(&tr)); } /* Clean up */ epclose(plotfp); if (!have_ntr) { efclose(tracefp); if (istmpdir) eremove(tracefile); } return EXIT_SUCCESS; }
int main(int argc, char **argv) { char *tmpdir ; /* directory path for tmp files */ cwp_Bool istmpdir=cwp_false ; /* true for user given path */ float *hedr ; /* the headers */ float *data ; /* the data */ int nt ; /* number of trace samples */ float dt ; /* sample interval, sec */ float delrt ; /* delay recording time, sec */ cwp_String key[SU_NKEYS] ; /* array of keywords */ cwp_String type ; /* key string type */ int nkeys ; /* number of keywords */ int ikey,ntr = 0 ; /* counters */ int num ; /* number of traces to dump */ int numtr = 4 ; /* number of traces to dump */ int hpf ; /* header print format */ /* Initialize */ initargs(argc, argv) ; requestdoc(1) ; /* Look for user-supplied tmpdir */ if (!getparstring("tmpdir",&tmpdir) && !(tmpdir = getenv("CWP_TMPDIR"))) tmpdir=""; if (!STREQ(tmpdir, "") && access(tmpdir, WRITE_OK)) err("you can't write in %s (or it doesn't exist)", tmpdir); /* Get values from first trace */ if (!gettr(&tr)) err("can't get first trace"); nt = (int) tr.ns ; /* Get nt */ dt = ((double) tr.dt)/1000000.0 ; /* microsecs to secs */ if (!dt) getparfloat("dt", &dt) ; if (!dt) MUSTGETPARFLOAT("dt", &dt) ; delrt = ((double) tr.delrt)/1000.0 ; /* millisecs to secs */ /* Get parameters */ if (getparint ("num", &num)) numtr = num ; if ((nkeys=countparval("key"))!=0) getparstringarray("key",key) ; hedr = ealloc1float(nkeys*numtr) ; /* make space for headers */ if (!getparint ("hpf", &hpf)) hpf = 0 ; /* Store traces, headers in tempfiles */ if (STREQ(tmpdir,"")) { tracefp = etmpfile(); headerfp = etmpfile(); do { ++ntr; efwrite(&tr, HDRBYTES, 1, headerfp); efwrite(tr.data, FSIZE, nt, tracefp); /* Get header values */ for (ikey=0; ikey<nkeys; ++ikey) { Value val; float fval; gethdval(&tr, key[ikey], &val) ; type = hdtype(key[ikey]) ; fval = vtof(type,val) ; hedr[(ntr-1)*nkeys+ikey] = fval ; } } while (ntr<numtr && gettr(&tr)) ; } else /* user-supplied tmpdir */ { char directory[BUFSIZ]; strcpy(directory, tmpdir); strcpy(tracefile, temporary_filename(directory)); strcpy(headerfile, temporary_filename(directory)); /* Handle user interrupts */ signal(SIGINT, (void (*) (int)) closefiles); signal(SIGQUIT, (void (*) (int)) closefiles); signal(SIGHUP, (void (*) (int)) closefiles); signal(SIGTERM, (void (*) (int)) closefiles); tracefp = efopen(tracefile, "w+"); headerfp = efopen(headerfile, "w+"); istmpdir=cwp_true; do { ++ntr; efwrite(&tr, HDRBYTES, 1, headerfp); efwrite(tr.data, FSIZE, nt, tracefp); /* Get header values */ for (ikey=0; ikey<nkeys; ++ikey) { Value val; float fval; gethdval(&tr, key[ikey], &val) ; type = hdtype(key[ikey]) ; fval = vtof(type,val) ; hedr[(ntr-1)*nkeys+ikey] = fval ; } } while (ntr<numtr && gettr(&tr)) ; } /* Rewind after read, allocate space */ erewind(tracefp); erewind(headerfp); data = ealloc1float(nt*ntr); /* Load traces into data and close tmpfile */ efread(data, FSIZE, nt*ntr, tracefp); efclose(tracefp); if (istmpdir) eremove(tracefile); rewind(headerfp); rewind(tracefp); /* Do trace work */ dump(data, dt, hedr, key, delrt, nkeys, ntr, nt, hpf) ; /* close */ efclose(headerfp); if (istmpdir) eremove(headerfile); free1(hedr) ; free1(data) ; return(CWP_Exit()) ; }
int main(int argc, char *argv[]) { #else int gstat_main(int argc, char *argv[]) { #endif DATA **data = NULL, *valdata = NULL; /* * initialise some global variables: */ atexit(close_gstat_log_file); init_userio(1); init_global_variables(); argv0 = argv[0]; /* * register command line arguments on command_line: */ command_line = store_argv(argc, argv); parse_gstatrc(); /* * INPUT: command line options; */ parse_options(argc, argv); /* exits on -e options */ /* * start with program heading: */ printlog("%s: %s version %s\n", GSTAT_NAME, GSTAT_OS, VERSION); printlog("%s\n", GSTAT_CR); gstat_start(); /* * INPUT: Parse command files: */ if (optind == argc) { /* there's no command file name left */ if (get_method() != UIF) { /* -i or -m command line option */ /* no arguments */ printlog("Updates, manuals and source code: %s\n", GSTAT_HOME); printlog("%s\n", USAGE); ErrMsg(ER_NOCMD, ""); } else { start_ui(); exit(0); } } else { /* we have a command file to be read */ for ( ; optind < argc; optind++) { command_file_name = argv[optind]; parse_file(command_file_name); if (logfile_name != NULL) set_gstat_log_file(efopen(logfile_name, "w")); /* * get global variables locally: */ data = get_gstat_data(); valdata = get_dataval(); set_seed(gl_seed); /* * check variable settings and next * INPUT: read data values from file: */ read_all_data(data, valdata, get_n_vars()); if (get_method() == NSP) /* Still no answer to this: choose default */ set_method(get_default_method()); set_mode(); check_global_variables(); setup_meschach_error_handler(); if (DEBUG_DUMP) dump_all(); if (get_method() != NSP) printlog("[%s]\n", method_string(get_method())); if (check_only) set_method(NSP); /* * start calculations && OUTPUT routines: */ switch (get_method()) { case UIF: start_ui(); break; case NSP: break; case COV: case SEM: do_variogram(get_n_vars(), get_method()); break; case POLY: setup_poly_method(); /*FALLTHROUGH*/ default: if (gl_xvalid) /* validation/cross validation */ cross_valid(data); else predict_all(data); /* or prediction: */ break; } /* switch get_method() */ remove_all(); /* free all data etc. */ init_global_variables(); /* re-init for next round */ } } if (DEBUG_DUMP) atexit(print_file_record); if (get_method() != UIF) elapsed(); /* * file closing & data freeing time: */ if (plotfile != NULL) efclose(plotfile); exit(0); } /* end of main() */
int main (int argc, char **argv) { int nt; /* number of time samples */ int nz; /* number of migrated depth samples */ int nx,nxshot; /* number of midpoints,shotgathers, the folds in a shot gather */ int flag=1; /*flag to use ft or meter as the unit*/ int dip=65; /*maximum dip angle to migrate*/ int iz,iw,ix,it,oldsx; /* loop counters*/ int ntfft; /* fft size*/ int nw; /* number of wave numbers */ int mytid,tids[NNTASKS],msgtype,rc,i;/*variable for PVM function*/ int nw1,task; int lpad=9999,rpad=9999; /*zero-traces padded on left and right sides*/ float f1,f2,f3,f4; /*frequencies to build the Hamming window*/ int nf1,nf2,nf3,nf4; /*the index for above frequencies*/ int NTASKS=0; /*number of slave tasks to start*/ char cpu_name[NNTASKS][80]; /*strings to store the computers' name*/ int flag_cpu=0; /*flag to control if using NTASKS variable*/ float sx,gxmin,gxmax; /*location of geophone and receivers*/ int isx,nxo,ifx=0; /*index for geophone and receivers*/ int ix1,ix2,ix3,il,ir; /*dummy index*/ float *wl,*wtmp; /*pointers for the souce function*/ float Fmax=25; /*peak frequency to make the Ricker wavelet*/ int ntw,truenw; /*number of frequencies to be migrated*/ float dt=0.004,dz; /*time, depth sampling interval*/ float ft; /*first time sample*/ float dw; /*frequency sampling interval*/ float fw; /*first frequency*/ float dx; /*spatial sampling interval*/ float **p,**cresult,**result_tmp; /* input, output data*/ float **v; /*double pointer direct to velocity structure*/ complex *wlsp,**cp,**cq,**cq1; /*pointers for internal usage*/ char *vfile=""; /* name of file containing velocities */ char *cpufile=""; /* name of file containing CPU name */ FILE *vfp,*cpu_fp; /* hook up getpar to handle the parameters */ initargs(argc,argv); requestdoc(1); /* get optional parameters */ if (!getparfloat("ft",&ft)) ft = 0.0; if (!getparint("nz",&nz)) err("nz must be specified"); if (!getparfloat("dz",&dz)) err("dz must be specified"); if (!getparstring("vfile", &vfile)) err("vfile must be specified"); if (!getparint("nxo",&nxo)) err("nxo must be specified"); if (!getparint("nxshot",&nxshot)) err("nshot must be specified"); if (!getparfloat("Fmax",&Fmax)) err("Fmax must be specified"); if (!getparfloat("f1",&f1)) f1 = 10.0; if (!getparfloat("f2",&f2)) f2 = 20.0; if (!getparfloat("f3",&f3)) f3 = 40.0; if (!getparfloat("f4",&f4)) f4 = 50.0; if (!getparint("lpad",&lpad)) lpad=9999; if (!getparint("rpad",&rpad)) rpad=9999; if (!getparint("flag",&flag)) flag=1; if (!getparint("dip",&dip)) dip=65; if (getparstring("cpufile", &cpufile)){ cpu_fp=fopen(cpufile,"r"); NTASKS=0; while(!feof(cpu_fp)){ fscanf(cpu_fp,"%s",cpu_name[NTASKS]); NTASKS++; } NTASKS-=1; flag_cpu=1; } else /*if cpufile not specified, the use NTASKS*/ if (!getparint("NTASKS",&NTASKS)) err("No CPUfile specified, NTASKS must be specified"); /*allocate space for the velocity profile*/ tshot=nxshot; v=alloc2float(nxo,nz); /*load velicoty file*/ vfp=efopen(vfile,"r"); efread(v[0],FSIZE,nz*nxo,vfp); efclose(vfp); /*PVM communication starts here*/ mytid=pvm_mytid(); /*get my pid*/ task=NTASKS; warn("\n %d",task); rc=0; /*spawn slave processes here*/ if(!flag_cpu){ rc=pvm_spawn(child,NULL,PvmTaskDefault,"",task,tids); } else{ for(i=0;i<NTASKS;i++){ rc+=pvm_spawn(child,NULL,PvmTaskHost,cpu_name[i],1,&tids[i]); } } /*show the pid of slaves if*/ for(i=0;i<NTASKS;i++){ if(tids[i]<0)warn("\n %d",tids[i]); else warn("\nt%x\t",tids[i]); } /*if not all the slaves start, then quit*/ if(rc<NTASKS){ warn("error");pvm_exit();exit(1);} /*broadcast the global parameters nxo,nz,dip to all slaves*/ pvm_initsend(PvmDataDefault); rc=pvm_pkint(&nxo,1,1); rc=pvm_pkint(&nz,1,1); rc=pvm_pkint(&dip,1,1); msgtype=PARA_MSGTYPE; task=NTASKS; rc=pvm_mcast(tids,task,msgtype); /*broadcast the velocity profile to all slaves*/ pvm_initsend(PvmDataDefault); rc=pvm_pkfloat(v[0],nxo*nz,1); msgtype=VEL_MSGTYPE; rc=pvm_mcast(tids,task,msgtype); /*free the space for velocity profile*/ free2float(v); /*loop over shot gathers begin here*/ loop: /* get info from first trace */ if (!gettr(&tr)) err("can't get first trace"); nt = tr.ns; /* let user give dt and/or dx from command line */ if (!getparfloat("dt", &dt)) { if (tr.dt) { /* is dt field set? */ dt = ((double) tr.dt)/1000000.0; } else { /* dt not set, assume 4 ms */ dt = 0.004; warn("tr.dt not set, assuming dt=0.004"); } } if (!getparfloat("dx",&dx)) { if (tr.d2) { /* is d2 field set? */ dx = tr.d2; } else { dx = 1.0; warn("tr.d2 not set, assuming d2=1.0"); } } sx=tr.sx; isx=sx/dx; gxmin=gxmax=tr.gx; oldsx=sx; /* determine frequency sampling interval*/ ntfft = npfar(nt); nw = ntfft/2+1; dw = 2.0*PI/(ntfft*dt); /*compute the index of the frequency to be migrated*/ fw=2.0*PI*f1; nf1=fw/dw+0.5; fw=2.0*PI*f2; nf2=fw/dw+0.5; fw=2.0*PI*f3; nf3=fw/dw+0.5; fw=2.0*PI*f4; nf4=fw/dw+0.5; /*the number of frequency to migrated*/ truenw=nf4-nf1+1; fw=0.0+nf1*dw; warn("nf1=%d nf2=%d nf3=%d nf4=%d nw=%d",nf1,nf2,nf3,nf4,truenw); fw=0.0; /* allocate space */ wl=alloc1float(ntfft); wlsp=alloc1complex(nw); /*generate the Ricker wavelet*/ wtmp=ricker(Fmax,dt,&ntw); for(it=0;it<ntfft;it++) wl[it]=0.0; for(it=0;it<ntw-12;it++) wl[it]=wtmp[it+12]; free1float( wtmp); /*Fourier transform the Ricker wavelet to frequency domain*/ pfarc(-1,ntfft,wl,wlsp); /* allocate space */ p = alloc2float(ntfft,nxo); cp = alloc2complex(nw,nxo); for (ix=0; ix<nxo; ix++) for (it=0; it<ntfft; it++) p[ix][it] = 0.0; /*read in a single shot gather*/ ix=tr.gx/dx; memcpy( (void *) p[ix], (const void *) tr.data,nt*FSIZE); nx = 0; while(gettr(&tr)){ int igx; if(tr.sx!=oldsx){ fseek(stdin,(long)(-240-nt*4),SEEK_CUR); break;} igx=tr.gx/dx; memcpy( (void *) p[igx], (const void *) tr.data,nt*FSIZE); if(gxmin>tr.gx)gxmin=tr.gx; if(gxmax<tr.gx)gxmax=tr.gx; nx++; oldsx=tr.sx; } warn("\nnx= %d",nx); warn("sx %f , gxmin %f gxmax %f",sx,gxmin,gxmax); /*transform the shot gather from time to frequency domain*/ pfa2rc(1,1,ntfft,nxo,p[0],cp[0]); /*compute the most left and right index for the migrated section*/ ix1=sx/dx; ix2=gxmin/dx; ix3=gxmax/dx; if(ix1>=ix3)ix3=ix1; if(ix1<=ix2)ix2=ix1; il=ix2; ir=ix3; ix2-=lpad; ix3+=rpad; if(ix2<0)ix2=0; if(ix3>nxo-1)ix3=nxo-1; /*the total traces to be migrated*/ nx=ix3-ix2+1; /*allocate space*/ cq = alloc2complex(nx,nw); cq1 = alloc2complex(nx,nw); /*transpose the frequency domain data from data[ix][iw] to data[iw][ix] and apply a Hamming at the same time*/ for (ix=0; ix<nx; ix++) for (iw=0; iw<nw; iw++){ float tmpp=0.0,tmppp=0.0; if(iw<nf1||iw>nf4) cq[iw][ix]=cmplx(0.0,0.0); else{ if(iw>=nf1&&iw<=nf2){tmpp=PI/(nf2-nf1);tmppp=tmpp*(iw-nf1)-PI;tmpp=0.54+0.46*cos(tmppp); cq[iw][ix]=crmul(cp[ix+ix2][iw],tmpp);} else{ if(iw>=nf3&&iw<=nf4){tmpp=PI/(nf4-nf3);tmppp=tmpp*(iw-nf3);tmpp=0.54+0.46*cos(tmppp); cq[iw][ix]=crmul(cp[ix+ix2][iw],tmpp);} else {cq[iw][ix]=cp[ix+ix2][iw];} } } cq[iw][ix]=cp[ix+ix2][iw]; cq1[iw][ix]=cmplx(0.0,0.0); } ix=sx/dx-ifx; warn("ix %d",ix); for(iw=0;iw<nw;iw++){ cq1[iw][ix-ix2]=wlsp[iw]; } free2float(p); free2complex(cp); free1float(wl); free1complex(wlsp); /*if the horizontal spacing interval is in feet, convert it to meter*/ if(!flag) dx*=0.3048; /*start of the timing function*/ time(&t1); /* send local parameters to all slaves*/ pvm_initsend(PvmDataDefault); ix=15; rc=pvm_pkint(&ix,1,1); rc=pvm_pkint(&ntfft,1,1); rc=pvm_pkint(&ix2,1,1); rc=pvm_pkint(&ix3,1,1); rc=pvm_pkint(&isx,1,1); rc=pvm_pkint(&il,1,1); rc=pvm_pkint(&ir,1,1); rc=pvm_pkfloat(&dx,1,1); rc=pvm_pkfloat(&dz,1,1); rc=pvm_pkfloat(&dw,1,1); rc=pvm_pkfloat(&dt,1,1); msgtype=PARA_MSGTYPE; task=NTASKS; rc=pvm_mcast(tids,task,msgtype); /* send all the frequency to slaves*/ count=NTASKS*5; /*count is the number of frequency components in a shot gather*/ nw=truenw; nw1=nw/(count); if(nw1==0)nw1=1; total=count=ceil(nw*1.0/nw1); /* if it is the first shot gather, send equal data to all the slaves, then for the following shot gathers, only send data when slave requests*/ if(nxshot==tshot){ for(i=0;i<NTASKS;i++){ float *tmpp; float fw1; int nww,byte,nwww; pvm_initsend(PvmDataDefault); nww=nf1+i*nw1;fw1=fw+nww*dw; nwww=nw1; byte=UnDone; rc=pvm_pkint(&byte,1,1); rc=pvm_pkfloat(&fw1,1,1); rc=pvm_pkint(&nwww,1,1); rc=pvm_pkfloat((float *)cq[nww],nx*nwww*2,1); rc=pvm_pkfloat((float *)cq1[nww],nx*nwww*2,1); msgtype=DATA_MSGTYPE; pvm_send(tids[i],msgtype); } count-=NTASKS; } while(count){ int tid0,bufid; float *tmpp; float fw1; int nww,byte,nwww; int i; i=total-count; msgtype=COM_MSGTYPE; bufid=pvm_recv(-1,msgtype); rc=pvm_upkint(&tid0,1,1); pvm_freebuf(bufid); pvm_initsend(PvmDataDefault); nww=nf1+i*nw1;fw1=fw+nww*dw; if(i==total-1)nwww=nw-nw1*i; else nwww=nw1; byte=UnDone; rc=pvm_pkint(&byte,1,1); rc=pvm_pkfloat(&fw1,1,1); rc=pvm_pkint(&nwww,1,1); rc=pvm_pkfloat((float *)cq[nww],nx*nwww*2,1); rc=pvm_pkfloat((float *)cq1[nww],nx*nwww*2,1); msgtype=DATA_MSGTYPE; pvm_send(tid0,msgtype); count--; } ix=Done; pvm_initsend(PvmDataDefault); rc=pvm_pkint(&ix,1,1); msgtype=DATA_MSGTYPE; pvm_mcast(tids,task,msgtype); free2complex(cq); free2complex(cq1); time(&t2); warn("\n %d shot been finished in %f seconds, Ntask=%d",nxshot,difftime(t2,t1),NTASKS); nxshot--; if(nxshot)goto loop; /*when all the shot gathers done, send signal to all slaves to request the partial imaging*/ ix=FinalDone; pvm_initsend(PvmDataDefault); rc=pvm_pkint(&ix,1,1); msgtype=PARA_MSGTYPE; pvm_mcast(tids,task,msgtype); /*allocate space for the final image*/ cresult = alloc2float(nz,nxo); for(ix=0;ix<nxo;ix++) for(iz=0;iz<nz;iz++) { cresult[ix][iz]=0.0; } result_tmp= alloc2float(nz,nxo); /*receive partial image from all the slaves*/ msgtype=RESULT_MSGTYPE; i=0; while(i<NTASKS){ int bufid; bufid=pvm_recv(-1,msgtype); rc=pvm_upkfloat(result_tmp[0],nxo*nz,1); pvm_freebuf(bufid); for(ix=0;ix<nxo;ix++) for(iz=0;iz<nz;iz++) { cresult[ix][iz]+=result_tmp[ix][iz]; } i=i+1; warn("\n i=%d been received",i); } /*send signal to all slaves to kill themselves*/ pvm_initsend(PvmDataDefault); pvm_mcast(tids,task,COM_MSGTYPE); /*output the final image*/ for(ix=0; ix<nxo; ix++){ tr.ns = nz ; tr.dt = dz*1000000.0 ; tr.d2 = dx; tr.offset = 0; tr.cdp = tr.tracl = ix; memcpy( (void *) tr.data, (const void *) cresult[ix],nz*FSIZE); puttr(&tr); } pvm_exit(); return EXIT_SUCCESS; }
int main(int argc,char **argv) { int n1, n2, n3, depth, time, verbose, iter, slowness; float r1, r2, r3, d1, d2, d3, *wl, ***vel, mu, vminc, vmaxc; FILE *invp=stdin, *outvp=stdout; /* initialization */ initargs(argc,argv) ; requestdoc(0); /*-----------get required parameters-----------*/ if( !getparint("n1",&n1) ) n1 = 0 ; if( n1 <= 0 ) err("sample number of 1st dimension invalid" ) ; if( !getparint("n2",&n2) ) n2 = 0 ; if( n2 <= 0 ) err("sample number of 2nd dimension invalid" ) ; if( !getparint("n3",&n3) ) n3 = 0 ; if( n3 <= 0 ) err("sample number of 3rd dimension invalid" ) ; /*-----------get optional parameters-----------*/ /* sample intervals */ if( !getparfloat("d1",&d1) ) d1 = 1.0 ; if( !getparfloat("d2",&d2) ) d2 = 1.0 ; if( !getparfloat("d3",&d3) ) d3 = 1.0 ; /* smoothing parameters */ if( !getparfloat("r1",&r1) || n1<4) r1 = 0. ; if( !getparfloat("r2",&r2) || n2<4) r2 = 0. ; if( !getparfloat("r3",&r3) || n3<4) r3 = 0. ; /* scale smoothing parameters */ r1 = (d1>0)?r1/d1:0; r2 = (d2>0)?r2/d2:0; r3 = (d3>0)?r3/d3:0; r1 = 0.5*r1*r1 ; r2 = 0.5*r2*r2 ; r3 = 0.5*r3*r3 ; /* get iteration number for smoothing operator */ if(!getparint("iter", &iter)) iter = 2; if(iter<=0 || iter>3) err("\t iter must be between 1 and 3!\n"); /* description for vertical dimension */ if(!getparint("time",&time )) time = 0; if(!getparint("depth",&depth) ) depth = 1; if(time) depth = time; /* relative weight at bottom */ if(!getparfloat("mu",&mu) ) mu = 1.0; if(mu<1) err("mu must not be less than 1 \n"); /* smoothing on velocity or slowness */ if(!getparint("slowness",&slowness) ) slowness = 0; /* clips of velocity before smoothing */ if(!getparfloat("vminc",&vminc) ) vminc = 0; if(!getparfloat("vmaxc",&vmaxc) ) vmaxc = 99999; /* allocate input file */ vel = alloc3float(n1,n2,n3) ; wl = alloc1float(4); /* read input velocity file */ efread((char *)vel[0][0],sizeof(float),n1*n2*n3,invp); /* perform smoothing operation */ vsm3d(vel,n3,n2,n1,iter,depth,r3,r2,r1,mu,slowness,vminc,vmaxc); /* write output velocity file */ efwrite((char *)vel[0][0],sizeof(float),n1*n2*n3,outvp); if(!getparint("verbose",&verbose)) verbose = 0; if(verbose) { wavel(n1,n2,n3,d1,d2,d3,time,wl,vel); fprintf(stderr,"minimum wavelengths of smoothed velocity:\n"); fprintf(stderr,"\tlambda1 = %g,\n", wl[1]); fprintf(stderr,"\tlambda2 = %g,\n", wl[2]); fprintf(stderr,"\tlambda3 = %g,\n", wl[3]); fprintf(stderr,"\tlambda = %g,\n", wl[0]); } checkpars(); /* close input and output files */ efclose(invp) ; efclose(outvp) ; return(CWP_Exit()); }
int main(int argc, char **argv) { int nt; /* number of time samples per trace */ float dt; /* time sampling interval */ float ft; /* time of first sample */ int it; /* time sample index */ int cdpmin; /* minimum cdp to process */ int cdpmax; /* maximum cdp to process */ float dxcdp; /* cdp sampling interval */ int noffmix; /* number of offsets to mix */ float offmax; /* maximum offset */ float tmute; /* mute time at far offset */ float vrms; /* rms velocity at mute time */ int nsmax; /* maximum number of time shifts per trace in DMO */ int ns; /* actual number of time shifts per trace in DMO */ float *p; /* input trace */ float **q; /* output DMO-corrected traces */ float *temp; /* temporary array */ float *ts; /* table of time shifts for DMO */ float *as; /* table of amplitudes for DMO */ float offset=0.0;/* source-receiver offset of current trace */ float oldoffset;/* offset of previous trace */ int cdp=0; /* cdp number of current trace */ int ncdp; /* number of cdps */ int icdp; /* cdp index */ int jcdp; /* cdp index */ int jcdplo; /* lower bound for jcdp */ int jcdphi; /* upper bound for jcdp */ int ntrace; /* number of traces processed in current mix */ int itrace; /* trace index */ int noff; /* number of offsets processed in current mix */ int gottrace; /* non-zero if an input trace was read */ int done; /* non-zero if done */ float *ds; /* shaping filter to complete DMO processing */ int lds=125; /* length of shaping filter */ int ifds=-100; /* time index of first sample in shaping filter */ int verbose; /* =1 for diagnostic print */ char *tmpdir; /* directory path for tmp files */ cwp_Bool istmpdir=cwp_false;/* true for user given path */ /* hook up getpar */ initargs(argc, argv); requestdoc(1); /* get information from the first header */ if (!gettr(&tr)) err("can't get first trace"); nt = tr.ns; dt = ((double) tr.dt)/1000000.0; ft = tr.delrt/1000.0; /* get parameters */ if (!getparint("cdpmin",&cdpmin)) err("must specify cdpmin"); if (!getparint("cdpmax",&cdpmax)) err("must specify cdpmax"); if (cdpmin>cdpmax) err("cdpmin must be less than cdpmax"); if (!getparfloat("dxcdp",&dxcdp)) err("must specify dxcdp"); if (!getparint("noffmix",&noffmix)) err("must specify noffmix"); if (!getparfloat("offmax",&offmax)) offmax=3000.0; if (!getparfloat("tmute",&tmute)) tmute=2.0; if (!getparfloat("vrms",&vrms)) vrms=1500.0; if (!getparint("nsmax",&nsmax)) nsmax=400; if (!getparint("verbose",&verbose)) verbose=0; /* Look for user-supplied tmpdir */ if (!getparstring("tmpdir",&tmpdir) && !(tmpdir = getenv("CWP_TMPDIR"))) tmpdir=""; if (!STREQ(tmpdir, "") && access(tmpdir, WRITE_OK)) err("you can't write in %s (or it doesn't exist)", tmpdir); checkpars(); /* determine number of cdps */ ncdp = cdpmax-cdpmin+1; /* allocate workspace */ q = ealloc2float(nt,ncdp); p = ealloc1float(nt); temp = ealloc1float(nt); ts = ealloc1float(nsmax); as = ealloc1float(nsmax); ds = ealloc1float(lds); /* tabulate time shifts and amplitudes for dmo */ maketa(dxcdp,dt,offmax,tmute,vrms,nsmax,&ns,ts,as); if (verbose) fprintf(stderr,"\tDMO will be performed via %d time shifts\n", ns); /* compute shaping filter for dmo horizontal reflection response */ makeds(ns,ts,as,lds,ifds,ds); /* open temporary file for headers */ if (STREQ(tmpdir,"")) { headerfp = etmpfile(); if (verbose) warn("using tmpfile() call"); } else { /* user-supplied tmpdir */ char directory[BUFSIZ]; strcpy(directory, tmpdir); strcpy(headerfile, temporary_filename(directory)); /* Trap signals so can remove temp files */ signal(SIGINT, (void (*) (int)) closefiles); signal(SIGQUIT, (void (*) (int)) closefiles); signal(SIGHUP, (void (*) (int)) closefiles); signal(SIGTERM, (void (*) (int)) closefiles); headerfp = efopen(headerfile, "w+"); istmpdir=cwp_true; if (verbose) warn("putting temporary header file in %s", directory); } /* initialize */ oldoffset = tr.offset; gottrace = 1; done = 0; ntrace = 0; noff = 0; for (icdp=0; icdp<ncdp; ++icdp) for (it=0; it<nt; ++it) q[icdp][it] = 0.0; /* loop over traces */ do { /* if got a trace */ if (gottrace) { /* determine offset and cdp */ offset = tr.offset; cdp = tr.cdp; /* update number of offsets mixed */ if (offset!=oldoffset) noff++; /* get trace samples */ memcpy( (void *) p, (const void *) tr.data, nt*sizeof(float)); } /* if a mix of offsets is complete */ if (noff==noffmix || !gottrace) { /* update number of offsets mixed */ if (!gottrace) noff++; /* apply shaping filter to complete dmo processing */ for (icdp=0; icdp<ncdp; ++icdp) { convolve_cwp(lds,ifds,ds,nt,0,q[icdp],nt,0,temp); memcpy( (void *) q[icdp], (const void *) temp, nt*sizeof(float)); } /* rewind trace header file */ erewind(headerfp); /* loop over all output traces */ for (itrace=0; itrace<ntrace; ++itrace) { /* read trace header and determine cdp index */ efread(&tro,HDRBYTES,1,headerfp); icdp = tro.cdp-cdpmin; /* get dmo-corrected data */ memcpy((void *) tro.data, (const void *) q[icdp],nt*sizeof(float)); /* write output trace */ puttr(&tro); } /* report */ if (verbose) fprintf(stderr,"\tCompleted mix of " "%d offsets with %d traces\n", noff,ntrace); /* if no more traces, break */ if (!gottrace) break; /* rewind trace header file */ erewind(headerfp); /* reset number of offsets and traces */ noff = 0; ntrace = 0; /* zero dmo accumulators */ for (icdp=0; icdp<ncdp; ++icdp) for (it=0; it<nt; ++it) q[icdp][it] = 0.0; } /* if cdp is within range of cdps to process */ if (cdp>=cdpmin && cdp<=cdpmax) { /* save trace header and update number of traces */ efwrite(&tr,HDRBYTES,1,headerfp); ntrace++; /* determine output traces potentially modified by input */ icdp = cdp-cdpmin; jcdplo = MAX(0,icdp-0.5*ABS(offset/dxcdp)); jcdphi = MIN(ncdp-1,icdp+0.5*ABS(offset/dxcdp)); /* loop over potentially modified output traces */ for (jcdp=jcdplo; jcdp<=jcdphi; ++jcdp) { /* do dmo for one output trace */ dmotx(ns,ts,as,offset,(jcdp-icdp)*dxcdp,dxcdp, 0,nt,dt,ft,p,q[jcdp]); } /* remember offset */ oldoffset = offset; } /* get next trace (if there is one) */ if (!gettr(&tr)) gottrace = 0; } while (!done); /* clean up */ efclose(headerfp); if (istmpdir) eremove(headerfile); return(CWP_Exit()); }
int main(int argc, char **argv) { usghed usghin, usghtop, usghbot, usghlayer; usghed usghvtop, usghvbot, usghglayer; FILE *infp,*outfp,*topfp,*botfp,*layerfp; FILE *vtopfp,*vbotfp,*glayerfp; char *infile,*outfile,*layertop, *layerbot; char *gtopgrid, *gbotgrid; char *layers, *glayers; int ibot, itop; int ierr; int nz, iz; float *dzrl, sm2top, sm2bot, sm3top, sm3bot; float gabovetop, gbelowbot; int igabovetop, igbelowbot; float g0, r0; int ginterp=0; int n1,n2,n3; int i1,i2,i3; float d1,o1,d2,d3; float *grid, *ztop, *zbot, gmin, gmax; float *vtop, *vbot; float top, bot; float tmp; int i1top, i1bot, itmp; int ivtop, ivbot; float *sm2s, *sm3s; float *work, *fsmx, *fsmy, *vs, *zs; float z, scale, zscale, vscale; int ismx, ismy; int nlayer, nglayer; /* hook up getpar */ initargs(argc,argv); askdoc(0); /* get parameters */ if(getparstring("infile",&infile)) { infp = efopen(infile,"r"); } else { infp = stdin; } ierr = fgetusghdr(infp,&usghin); if(ierr!=0) err(" input grid header error "); if(getparstring("outfile",&outfile)) { outfp = efopen(outfile,"w"); } else { outfp = stdout; } file2g(infp); file2g(outfp); nlayer = 0; nglayer = 0; nlayer = countparname("layers"); if(nlayer==1) err(" at least 2 layers are needed \n"); nglayer = countparname("glayers"); if(nlayer==0) { if (getparstring("layertop",&layertop)) { topfp = efopen(layertop,"r"); ierr = fgetusghdr(topfp,&usghtop); if(ierr!=0) err(" layertop grid header error "); } else { err(" layertop missing "); } if (getparstring("layerbot",&layerbot)) { botfp = efopen(layerbot,"r"); ierr = fgetusghdr(botfp,&usghbot); if(ierr!=0) err(" layerbot grid header error "); } else { err(" layerbot missing "); } } else { if(nlayer!=nglayer && nglayer>0 ) err(" %d layers not matching %d glayers \n",nlayer,nglayer); } ivtop = 0; if (getparstring("gtopgrid",>opgrid)) { vtopfp = efopen(gtopgrid,"r"); ierr = fgetusghdr(vtopfp,&usghvtop); if(ierr!=0) err(" gtopgrid header error "); ivtop = 1; } ivbot = 0; if(getparstring("gbotgrid",&gbotgrid) ) { vbotfp = efopen(gbotgrid,"r"); ierr = fgetusghdr(vbotfp,&usghvbot); if(ierr!=0) err(" gbotgrid header error "); ivbot = 1; } if(!getparint("ginterp",&ginterp)) ginterp=0; if(ivtop==0 || ivbot==0) { if ( getparfloat("g0",&g0) && getparfloat("r0",&r0) ) { ivtop = -1; ivbot = -1; } } if( !getparint("nz",&nz) ) nz=10; if(nlayer!=0) nz = nlayer - 1; dzrl = emalloc(nz*sizeof(float)); sm2s = emalloc((nz+1)*sizeof(float)); sm3s = emalloc((nz+1)*sizeof(float)); if( countparval("dzrl")>0 && nz!=countparval("dzrl") ) { err( " number of dzrl elements must match nz=%d \n",nz); } else if( countparval("dzrl")==0 ) { for(iz=0;iz<nz;iz++) dzrl[iz] = 1.; } else if( countparval("dzrl")==nz) { getparfloat("dzrl",dzrl); } if( !getparfloat("sm2top",&sm2top) ) sm2top=0.; if( !getparfloat("sm3top",&sm3top) ) sm3top=0.; if( !getparfloat("sm2bot",&sm2bot) ) sm2bot=0.; if( !getparfloat("sm3bot",&sm3bot) ) sm3bot=0.; igabovetop = 1; if( !getparfloat("gabovetop",&gabovetop) ) igabovetop=0; igbelowbot = 1; if( !getparfloat("gbelowbot",&gbelowbot) ) igbelowbot=0; n1 = usghin.n1; n2 = usghin.n2; n3 = usghin.n3; o1 = usghin.o1; d1 = usghin.d1; d2 = usghin.d2; d3 = usghin.d3; gmin = usghin.gmin; gmax = usghin.gmax; /* memory allocations */ ztop = (float*) emalloc(n2*n3*sizeof(float)); zbot = (float*) emalloc(n2*n3*sizeof(float)); vtop = (float*) emalloc(n2*n3*sizeof(float)); vbot = (float*) emalloc(n2*n3*sizeof(float)); zs = (float*) emalloc(n2*n3*(nz+1)*sizeof(float)); vs = (float*) emalloc(n2*n3*(nz+1)*sizeof(float)); work = (float*) emalloc(n2*n3*sizeof(float)); grid = (float*) emalloc(n1*sizeof(float)); if(nlayer==0) { if(usghin.n2!=usghtop.n1) err("check layertop header n1"); if(usghin.n3!=usghtop.n2) err("check layertop header n2"); if(usghin.o2!=usghtop.o1) err("check layertop header o1"); if(usghin.o3!=usghtop.o2) err("check layertop header o2"); if(usghin.d2!=usghtop.d1) err("check layertop header d1"); if(usghin.d3!=usghtop.d2) err("check layertop header d2"); efseek(topfp,0,0); efread(ztop,sizeof(float),n2*n3,topfp); if(usghin.n2!=usghbot.n1) err("check layerbot header n1"); if(usghin.n3!=usghbot.n2) err("check layerbot header n2"); if(usghin.o2!=usghbot.o1) err("check layerbot header o1"); if(usghin.o3!=usghbot.o2) err("check layerbot header o2"); if(usghin.d2!=usghbot.d1) err("check layerbot header d1"); if(usghin.d3!=usghbot.d2) err("check layerbot header d2"); efseek(botfp,0,0); efread(zbot,sizeof(float),n2*n3,botfp); if(ivtop==1) { if(usghin.n2!=usghvtop.n1) err("check gtopgrid header n1"); if(usghin.n3!=usghvtop.n2) err("check gtopgrid header n2"); if(usghin.o2!=usghvtop.o1) err("check gtopgrid header o1"); if(usghin.o3!=usghvtop.o2) err("check gtopgrid header o2"); if(usghin.d2!=usghvtop.d1) err("check gtopgrid header d1"); if(usghin.d3!=usghvtop.d2) err("check gtopgrid header d2"); efseek(vtopfp,0,0); efread(vtop,sizeof(float),n2*n3,vtopfp); } if(ivbot==1) { if(usghin.n2!=usghvbot.n1) err("check gbotgrid header n1"); if(usghin.n3!=usghvbot.n2) err("check gbotgrid header n2"); if(usghin.o2!=usghvbot.o1) err("check gbotgrid header o1"); if(usghin.o3!=usghvbot.o2) err("check gbotgrid header o2"); if(usghin.d2!=usghvbot.d1) err("check gbotgrid header d1"); if(usghin.d3!=usghvbot.d2) err("check gbotgrid header d2"); efseek(vbotfp,0,0); efread(vbot,sizeof(float),n2*n3,vbotfp); } } else { for(iz=0;iz<nlayer;iz++) { getnparstring(iz+1,"layers",&layers); layerfp=efopen(layers,"r"); ierr = fgetusghdr(layerfp,&usghlayer); if(ierr!=0) err(" error open layers=%s \n",layers); if(usghin.n2!=usghlayer.n1) err("check %s header n1",layers); if(usghin.n3!=usghlayer.n2) err("check %s header n2",layers); if(usghin.o2!=usghlayer.o1) err("check %s header o1",layers); if(usghin.o3!=usghlayer.o2) err("check %s header o2",layers); if(usghin.d2!=usghlayer.d1) err("check %s header d1",layers); if(usghin.d3!=usghlayer.d2) err("check %s header d2",layers); efseek(layerfp,0,0); efread(zs+iz*n2*n3,sizeof(float),n2*n3,layerfp); efclose(layerfp); } for(iz=0;iz<nglayer;iz++) { getnparstring(iz+1,"glayers",&glayers); glayerfp=efopen(glayers,"r"); ierr = fgetusghdr(glayerfp,&usghglayer); if(ierr!=0) err(" error open layers=%s \n",layers); if(usghin.n2!=usghglayer.n1) err("check %s header n1",glayers); if(usghin.n3!=usghglayer.n2) err("check %s header n2",glayers); if(usghin.o2!=usghglayer.o1) err("check %s header o1",glayers); if(usghin.o3!=usghglayer.o2) err("check %s header o2",glayers); if(usghin.d2!=usghglayer.d1) err("check %s header d1",glayers); if(usghin.d3!=usghglayer.d2) err("check %s header d2",glayers); efseek(glayerfp,0,0); efread(vs+iz*n2*n3,sizeof(float),n2*n3,glayerfp); efclose(glayerfp); } nz = nlayer - 1; } /* compute mini layer depth and grid values */ if(nlayer==0) { for(i2=0;i2<n2*n3;i2++) { zs[i2] = ztop[i2]; vs[i2] = vtop[i2]; } tmp = 0.; for(iz=0;iz<nz;iz++) tmp = tmp + dzrl[iz]; vscale = 0.; zscale = 0.; for(iz=1;iz<nz;iz++) { zscale += dzrl[iz-1]/tmp; if(ginterp==0) { vscale += dzrl[iz-1]/tmp; } else { vscale = (float)iz / nz; } for(i2=0;i2<n2*n3;i2++) { zs[i2+iz*n2*n3] = ztop[i2] + zscale*(zbot[i2]-ztop[i2]); vs[i2+iz*n2*n3] = vtop[i2] + vscale*(vbot[i2]-vtop[i2]); } } for(i2=0;i2<n2*n3;i2++) { zs[i2+nz*n2*n3] = zbot[i2]; vs[i2+nz*n2*n3] = vbot[i2]; } } /* compute smoothing window for mini layers */ tmp = 0.; for(iz=0;iz<nz;iz++) tmp = tmp + dzrl[iz]; scale = 0.; sm2s[0] = sm2top; sm3s[0] = sm3top; for(iz=1;iz<nz+1;iz++) { scale += dzrl[iz-1]/tmp; sm2s[iz] = sm2top + scale*(sm2bot-sm2top); sm3s[iz] = sm3top + scale*(sm3bot-sm3top); } /* compute grid values at the mini layers if not specified */ fseek2g(infp,0,0); if( ( (ivtop==0 || ivbot==0) && nlayer==0 ) || (nglayer==0 && nlayer>0) ) { for(i3=0;i3<n3;i3++) { for(i2=0;i2<n2;i2++) { efread(grid,sizeof(float),n1,infp); for(iz=0;iz<nz+1;iz++) { tmp = (zs[i2+i3*n2+iz*n2*n3] - o1)/d1 + 0.5; i1 = tmp; if(i1<0) { vs[i2+i3*n2+iz*n2*n3] = grid[0]; } else if(i1>=n1-1) { vs[i2+i3*n2+iz*n2*n3] = grid[n1-1]; } else { vs[i2+i3*n2+iz*n2*n3] = grid[i1]+ (tmp-i1)*(grid[i1+1]-grid[i1]); } } } } } else if(ivtop==-1 && ivbot==-1) { for(i3=0;i3<n3;i3++) { for(i2=0;i2<n2;i2++) { for(iz=0;iz<nz+1;iz++) { tmp = (zs[i2+i3*n2+iz*n2*n3] - ztop[i3*n2+i2]); vs[i2+i3*n2+iz*n2*n3] = g0 + r0 * tmp; } } } } /* smooth mini layer grids */ for(iz=0;iz<nz+1;iz++) { tmp = sm2s[iz]/d2; ismx = tmp + 1.5; tmp = sm3s[iz]/d3; ismy = tmp + 1.5; fsmx = (float*) emalloc(ismx*sizeof(float)); fsmy = (float*) emalloc(ismy*sizeof(float)); /* 2d smoothing */ smth2d_(vs+iz*n2*n3,work,fsmx,fsmy,&n2,&n3,&ismx,&ismy); /* dump2xplot(vs+iz*n2*n3,n2,n3,0,"vsmoth"); */ free(fsmx); free(fsmy); } /* output grid */ fseek2g(infp,0,0); for(i3=0;i3<n3;i3++) { for(i2=0;i2<n2;i2++) { efread(grid,sizeof(float),n1,infp); itmp = i2+i3*n2; if(nlayer==0) { top = ztop[itmp]; bot = zbot[itmp]; } else { top = zs[itmp]; bot = zs[itmp+(nlayer-1)*n2*n3]; } tmp = (top - o1)/d1 + 0.5; i1top = tmp; tmp = (bot - o1)/d1 + 0.5; i1bot = tmp; if(i1top<0) i1top = 0; if(i1bot>n1-1) i1bot = n1-1; for(i1=i1top;i1<=i1bot;i1++) { z = o1 + i1*d1; if(z>=zs[itmp] && z<=zs[itmp+nz*n2*n3]) { for(iz=0;iz<nz;iz++) { if( z == zs[itmp+iz*n2*n3] && z == zs[itmp+(iz+1)*n2*n3] ){ grid[i1] = vs[itmp+iz*n2*n3]; }else if(z>=zs[itmp+iz*n2*n3] && z<zs[itmp+(iz+1)*n2*n3]) { tmp = (z-zs[itmp+iz*n2*n3]) / (zs[itmp+(iz+1)*n2*n3]-zs[itmp+iz*n2*n3]); grid[i1] = vs[itmp+iz*n2*n3] + tmp*(vs[itmp+(iz+1)*n2*n3]-vs[itmp+iz*n2*n3]); if( grid[i1] != grid[i1] ){ fprintf( stderr ,"NaN at i3=%d " ,i3 ); fprintf( stderr ,"i2=%d i1=%d\n" ,i2, i3); } break; } } } } if(igabovetop==1) { for(i1=0;i1<i1top;i1++) { grid[i1] = gabovetop; } } if(igbelowbot==1) { for(i1=i1bot;i1<n1;i1++) { grid[i1] = gbelowbot; } } if(i2==0 && i3==0) { gmin = grid[0]; gmax = grid[0]; } for(i1=0;i1<n1;i1++) { if(gmin>grid[i1]) gmin = grid[i1]; if(gmax<grid[i1]) gmax = grid[i1]; } if( grid[0] != grid[0] ){ fprintf( stderr ,"NaN\n" ); } efwrite(grid,sizeof(float),n1,outfp); } } usghin.gmin = gmin; usghin.gmax = gmax; ierr = fputusghdr(outfp,&usghin); free(ztop); free(zbot); free(vtop); free(vbot); free(zs); free(vs); free(work); free(grid); exit(0); }
int main(int argc, char **argv) { char *key=NULL; /* header key word from segy.h */ char *type=NULL; /* ... its type */ int index; /* ... its index */ Value val; /* ... its value */ float fval; /* ... its value cast to float */ float *xshift=NULL; /* array of key shift curve values */ float *tshift=NULL; /* ... shift curve time values */ int nxshift; /* number of key shift values */ int ntshift; /* ... shift time values */ int nxtshift; /* number of shift values */ int it; /* sample counter */ int itr; /* trace counter */ int nt; /* number of time samples */ int ntr=0; /* number of traces */ int *inshift=NULL; /* array of (integer) time shift values used for positioning shifted trace in data[][] */ float dt; /* time sampling interval */ cwp_String xfile=""; /* file containing positions by key */ FILE *xfilep=NULL; /* ... its file pointer */ cwp_String tfile=""; /* file containing times */ FILE *tfilep=NULL; /* ... its file pointer */ int verbose; /* flag for printing information */ char *tmpdir=NULL; /* directory path for tmp files */ cwp_Bool istmpdir=cwp_false;/* true for user-given path */ int median; /* flag for median filter */ int nmed; /* no. of traces to median filter */ int nmix; /* number of traces to mix over */ int imix; /* mixing counter */ float *mix=NULL; /* array of mix values */ int sign; /* flag for up/down shift */ int shiftmin=0; /* minimum time shift (in samples) */ int shiftmax=0; /* maximum time shift (in samples) */ int ntdshift; /* nt + shiftmax */ size_t mixbytes; /* size of mixing array */ size_t databytes; /* size of data array */ size_t shiftbytes; /* size of data array */ float *temp=NULL; /* temporary array */ float *dtemp=NULL; /* temporary array */ float *stemp=NULL; /* rwh median sort array */ float **data=NULL; /* mixing array */ int subtract; /* flag for subtracting shifted data */ /* rwh extra pointers for median sort */ int first; /* start pointer in ring buffer */ int middle; /* middle pointer in ring buffer */ int last; /* last pointer in ring buffer */ int halfwidth; /* mid point */ int trcount; /* pointer to current start trace number */ float tmp; /* temp storage for bubble sort */ int rindex; /* wrap around index for ring buffer */ int jmix; /* internal pointer for bubble sort */ /* Initialize */ initargs(argc, argv); requestdoc(1); /* Get parameters */ if (!(getparstring("xfile",&xfile) && getparstring("tfile",&tfile))) { if (!(nxshift = countparval("xshift"))) err("must give xshift= vector"); if (!(ntshift = countparval("tshift"))) err("must give tshift= vector"); if (nxshift != ntshift) err("lengths of xshift, tshift must be the same"); xshift = ealloc1float(nxshift); getparfloat("xshift", xshift); tshift = ealloc1float(nxshift); getparfloat("tshift", tshift); } else { MUSTGETPARINT("nshift",&nxtshift); nxshift = nxtshift; xshift = ealloc1float(nxtshift); tshift = ealloc1float(nxtshift); if((xfilep=fopen(xfile,"r"))==NULL) err("cannot open xfile=%s\n",xfile); if (fread(xshift,sizeof(float),nxtshift,xfilep)!=nxtshift) err("error reading xfile=%s\n",xfile); fclose(xfilep); if((tfilep=fopen(tfile,"r"))==NULL) err("cannot open tfile=%s\n",tfile); if (fread(tshift,sizeof(float),nxtshift,tfilep)!=nxtshift) err("error reading tfile=%s\n",tfile); fclose(tfilep); } if (!getparstring("key", &key)) key = "tracl"; /* Get key type and index */ type = hdtype(key); index = getindex(key); /* Get mix weighting values values */ if ((nmix = countparval("mix"))!=0) { mix = ealloc1float(nmix); getparfloat("mix",mix); /* rwh check nmix is odd */ if (nmix%2==0) { err("number of mixing coefficients must be odd"); } } else { nmix = 5; mix = ealloc1float(nmix); mix[0] = VAL0; mix[1] = VAL1; mix[2] = VAL2; mix[3] = VAL3; mix[4] = VAL4; } /* Get remaning parameters */ if (!getparint("median",&median)) median = 0; if (!getparint("nmed",&nmed) && median) nmed = 5; if (!getparint("sign",&sign)) sign = -1; if (!getparint("subtract",&subtract)) subtract = 1; if (!getparint("verbose", &verbose)) verbose = 0; /* rwh check nmed is odd */ if (median && nmed%2==0) { nmed=nmed+1; warn("increased nmed by 1 to ensure it is odd"); } /* Look for user-supplied tmpdir */ if (!getparstring("tmpdir",&tmpdir) && !(tmpdir = getenv("CWP_TMPDIR"))) tmpdir=""; if (!STREQ(tmpdir, "") && access(tmpdir, WRITE_OK)) err("you can't write in %s (or it doesn't exist)", tmpdir); /* rwh fix for median filter if median true set nmix=nmed */ if (!median) { /* Divide mixing weights by number of traces to mix */ for (imix = 0; imix < nmix; ++imix) mix[imix]=mix[imix]/((float) nmix); } else { nmix=nmed; } /* Get info from first trace */ if (!gettr(&tr)) err("can't read first trace"); if (!tr.dt) err("dt header field must be set"); dt = ((double) tr.dt)/1000000.0; nt = (int) tr.ns; databytes = FSIZE*nt; /* Tempfiles */ if (STREQ(tmpdir,"")) { tracefp = etmpfile(); headerfp = etmpfile(); if (verbose) warn("using tmpfile() call"); } else { /* user-supplied tmpdir */ char directory[BUFSIZ]; strcpy(directory, tmpdir); strcpy(tracefile, temporary_filename(directory)); strcpy(headerfile, temporary_filename(directory)); /* Trap signals so can remove temp files */ signal(SIGINT, (void (*) (int)) closefiles); signal(SIGQUIT, (void (*) (int)) closefiles); signal(SIGHUP, (void (*) (int)) closefiles); signal(SIGTERM, (void (*) (int)) closefiles); tracefp = efopen(tracefile, "w+"); headerfp = efopen(headerfile, "w+"); istmpdir=cwp_true; if (verbose) warn("putting temporary files in %s", directory); } /* Read headers and data while getting a count */ do { ++ntr; efwrite(&tr, 1, HDRBYTES, headerfp); efwrite(tr.data, 1, databytes, tracefp); } while (gettr(&tr)); rewind(headerfp); rewind(tracefp); /* Allocate space for inshift vector */ inshift = ealloc1int(ntr); /* Loop over headers */ for (itr=0; itr<ntr; ++itr) { float tmin=tr.delrt/1000.0; float t; /* Read header values */ efread(&tr, 1, HDRBYTES, headerfp); /* Get value of key and convert to float */ gethval(&tr, index, &val); fval = vtof(type,val); /* Linearly interpolate between (xshift,tshift) values */ intlin(nxshift,xshift,tshift,tmin,tshift[nxshift-1],1,&fval,&t); /* allow for fractional shifts -> requires interpolation */ inshift[itr] = NINT((t - tmin)/dt); /* Find minimum and maximum shifts */ if (itr==0) { shiftmax=inshift[0]; shiftmin=inshift[0]; } else { shiftmax = MAX(inshift[itr],shiftmax); shiftmin = MIN(inshift[itr],shiftmin); } } rewind(headerfp); rewind(tracefp); if (verbose) { for (itr=0;itr<ntr;itr++) warn("inshift[%d]=%d",itr,inshift[itr]); } /* Compute databytes per trace and bytes in mixing panel */ ntdshift = nt + shiftmax; shiftbytes = FSIZE*ntdshift; mixbytes = shiftbytes*nmix; if (verbose) { warn("nt=%d shiftmax=%d shiftmin=%d",nt,shiftmax,shiftmin); warn("ntdshift=%d shiftbytes=%d mixbytes=%d", ntdshift,shiftbytes,mixbytes); } /* Allocate space and zero data array */ data = ealloc2float(ntdshift,nmix); temp = ealloc1float(ntdshift); dtemp = ealloc1float(nt); memset( (void *) data[0], 0, mixbytes); /* rwh array for out of place bubble sort (so we do not corrupt order in ring buffer */ stemp = ealloc1float(nmix); /* rwh first preload ring buffer symmetrically (now you know why nmix must be odd) */ trcount=-1; halfwidth=(nmix-1)/2+1; first = 0; last = nmix-1; middle = (nmix-1)/2; for (itr=0; itr<halfwidth; itr++) { efread(tr.data, 1, databytes, tracefp); trcount++; for(it=0; it<nt; ++it) { /* sign to account for positive or negative shift */ /* tr.data needs to be interpolated for non-integer shifts */ data[middle-itr][it + shiftmax + sign*inshift[itr]] = tr.data[it]; data[middle+itr][it + shiftmax + sign*inshift[itr]] = tr.data[it]; } } /* Loop over traces performing median filtering */ for (itr=0; itr<ntr; ++itr) { /* paste header and data on output trace */ efread(&tr, 1, HDRBYTES, headerfp); /* Zero out temp and dtemp */ memset((void *) temp, 0, shiftbytes); memset((void *) dtemp, 0, databytes); /* Loop over time samples */ for (it=0; it<nt; ++it) { /* Weighted moving average (mix) ? */ if (!median) { for(imix=0; imix<nmix; ++imix) { temp[it] += data[imix][it] * mix[imix]; } } else { /* inlcude median stack */ /* rwh do bubble sort and choose median value */ for(imix=0; imix<nmix; ++imix) { stemp[imix]=data[imix][it]; } for (imix=0; imix<nmix-1; imix++) { for (jmix=0; jmix<nmix-1-imix; jmix++) { if (stemp[jmix+1] < stemp[jmix]) { tmp = stemp[jmix]; stemp[jmix] = stemp[jmix+1]; stemp[jmix+1] = tmp; } } } temp[it] = stemp[middle]; } /* shift back mixed data and put into dtemp */ if (subtract) { if ((it - shiftmax - sign*inshift[itr])>=0) dtemp[it - shiftmax - sign*inshift[itr]] = data[middle][it]-temp[it]; } else { if ((it - shiftmax)>=0) dtemp[it - shiftmax - sign*inshift[itr]] = temp[it]; } } memcpy((void *) tr.data,(const void *) dtemp,databytes); /* Bump rows of data[][] over by 1 to free first row for next tr.data */ for (imix=nmix-1; 0<imix; --imix) memcpy((void *) data[imix],(const void *) data[imix-1],shiftbytes); /*for (it=0; it<nt; ++it) data[imix][it] = data[imix-1][it];*/ /* Write output trace */ tr.ns = nt; puttr(&tr); /* read next trace into buffer */ if (trcount < ntr) { efread(tr.data, 1, databytes, tracefp); trcount++; /* read tr.data into first row of mixing array */ /* WMH: changed ntdshift to nt */ for(it=0; it<nt; ++it) { /* sign to account for positive or negative shift */ /* tr.data needs to be interpolated for non-integer shifts */ data[0][it + shiftmax + sign*inshift[trcount]] = tr.data[it]; } } else { rindex=2*(trcount-ntr); memcpy((void *) data[0],(const void *) data[rindex],shiftbytes); trcount++; } } if (verbose && subtract) warn("filtered data subtracted from input"); /* Clean up */ efclose(headerfp); if (istmpdir) eremove(headerfile); efclose(tracefp); if (istmpdir) eremove(tracefile); return(CWP_Exit()); }
int main(int argc, char **argv) { char *coeff_x, *coeff_x2, *coeff_x3, *coeff_x4, file[BUFSIZ]; struct GRD_HEADER grd_x, grd_x2, grd_x3, grd_x4; struct GMT_EDGEINFO edgeinfo_x, edgeinfo_x2, edgeinfo_x3, edgeinfo_x4; struct GMT_BCR bcr_x, bcr_x2, bcr_x3, bcr_x4; double x_loc, y_loc, value_coeff_x, value_coeff_x2, value_coeff_x3, value_coeff_x4; char temp[256]; cwp_String pfile; FILE *fpp; short verbose, check; int kount, nump1; double sum, error1, sign; double delta, thresh; double *vzero_opt, *k_opt; double *datain, *samp, *xloc_array, *yloc_array; double depth_water, factor, num, sample; double vzero, k; double *wb_twt_array, *wb_z_array; double error, x, y, zero; register int i; initargs(argc, argv); argc = GMT_begin (argc, argv); if (!getparstring("pfile",&pfile)) pfile = "tops.lis"; if (!getparshort("verbose", &verbose)) verbose = 1; if (!getpardouble("delta", &delta)) delta = 0.00001; if (!getpardouble("thresh", &thresh)) thresh = 0.01; zero = 0.0; if (!getparstring("coeff_x", &coeff_x)) coeff_x="wb.twt.grd"; if (!getparstring("coeff_x2", &coeff_x2)) coeff_x2="wvavg.dat.trimmed.sample.smooth.grd"; if (!getparstring("coeff_x3", &coeff_x3)) coeff_x3="vzero.seismic.dat.trimmed.sample.smooth.grd"; if (!getparstring("coeff_x4", &coeff_x4)) coeff_x4="k.seismic.dat.trimmed.sample.smooth.grd"; if ( verbose ) { fprintf ( stderr, "\n" ); fprintf ( stderr, "WB TWT (ms.) GMT grid file name = %s\n", coeff_x ); fprintf ( stderr, "WB VAVG (m) GMT grid file name = %s\n", coeff_x2 ); fprintf ( stderr, "Seismic VZERO GMT grid file name = %s\n", coeff_x3 ); fprintf ( stderr, "Seismic K GMT grid file name = %s\n", coeff_x4 ); fprintf ( stderr, "Delta = %.10f\n", delta ); fprintf ( stderr, "Threshold = %f\n", thresh ); } GMT_boundcond_init (&edgeinfo_x); GMT_boundcond_init (&edgeinfo_x2); GMT_boundcond_init (&edgeinfo_x3); GMT_boundcond_init (&edgeinfo_x4); GMT_grd_init (&grd_x, argc, argv, FALSE); GMT_grd_init (&grd_x2, argc, argv, FALSE); GMT_grd_init (&grd_x3, argc, argv, FALSE); GMT_grd_init (&grd_x4, argc, argv, FALSE); if (GMT_read_grd_info (coeff_x, &grd_x)) fprintf (stderr, "%s: Error opening file %s\n", GMT_program, file); if (GMT_read_grd_info (coeff_x2, &grd_x2)) fprintf (stderr, "%s: Error opening file %s\n", GMT_program, file); if (GMT_read_grd_info (coeff_x3, &grd_x3)) fprintf (stderr, "%s: Error opening file %s\n", GMT_program, file); if (GMT_read_grd_info (coeff_x4, &grd_x4)) fprintf (stderr, "%s: Error opening file %s\n", GMT_program, file); f1 = (float *) GMT_memory (VNULL, (size_t)((grd_x.nx + 4) * (grd_x.ny + 4)), sizeof(float), GMT_program); f2 = (float *) GMT_memory (VNULL, (size_t)((grd_x2.nx + 4) * (grd_x2.ny + 4)), sizeof(float), GMT_program); f3 = (float *) GMT_memory (VNULL, (size_t)((grd_x3.nx + 4) * (grd_x3.ny + 4)), sizeof(float), GMT_program); f4 = (float *) GMT_memory (VNULL, (size_t)((grd_x4.nx + 4) * (grd_x4.ny + 4)), sizeof(float), GMT_program); GMT_pad[0] = GMT_pad[1] = GMT_pad[2] = GMT_pad[3] = 2; GMT_boundcond_param_prep (&grd_x, &edgeinfo_x); GMT_boundcond_param_prep (&grd_x2, &edgeinfo_x2); GMT_boundcond_param_prep (&grd_x3, &edgeinfo_x3); GMT_boundcond_param_prep (&grd_x4, &edgeinfo_x4); GMT_boundcond_set (&grd_x, &edgeinfo_x, GMT_pad, f1); GMT_boundcond_set (&grd_x2, &edgeinfo_x2, GMT_pad, f2); GMT_boundcond_set (&grd_x3, &edgeinfo_x3, GMT_pad, f3); GMT_boundcond_set (&grd_x4, &edgeinfo_x4, GMT_pad, f4); GMT_bcr_init (&grd_x, GMT_pad, BCR_BSPLINE, 1, &bcr_x); GMT_bcr_init (&grd_x2, GMT_pad, BCR_BSPLINE, 1, &bcr_x2); GMT_bcr_init (&grd_x3, GMT_pad, BCR_BSPLINE, 1, &bcr_x3); GMT_bcr_init (&grd_x4, GMT_pad, BCR_BSPLINE, 1, &bcr_x4); GMT_read_grd (coeff_x, &grd_x, f1, 0.0, 0.0, 0.0, 0.0, GMT_pad, FALSE); GMT_read_grd (coeff_x2, &grd_x2, f2, 0.0, 0.0, 0.0, 0.0, GMT_pad, FALSE); GMT_read_grd (coeff_x3, &grd_x3, f3, 0.0, 0.0, 0.0, 0.0, GMT_pad, FALSE); GMT_read_grd (coeff_x4, &grd_x4, f4, 0.0, 0.0, 0.0, 0.0, GMT_pad, FALSE); fpp = efopen (pfile, "r"); kount = 0; while (NULL != fgets ( temp, sizeof(temp), fpp )) { ++kount; (void) sscanf ( ((&(temp[0]))), "%lf%lf%lf%lf", &x_loc, &y_loc, &num, &sample ); } if ( verbose != 0) { fprintf (stderr,"\n"); fprintf (stderr,"Data file name = %s, number of input samples = %d\n", pfile, kount); fprintf (stderr,"\n"); } samp = ealloc1double ( kount ); datain = ealloc1double ( kount ); xloc_array = ealloc1double ( kount ); yloc_array = ealloc1double ( kount ); vzero_opt = ealloc1double ( kount ); k_opt = ealloc1double ( kount ); wb_twt_array = ealloc1double ( kount ); wb_z_array = ealloc1double ( kount ); rewind ( fpp ); kount = -1; while (NULL != fgets ( temp, sizeof(temp), fpp )) { ++kount; (void) sscanf ( ((&(temp[0]))), "%lf%lf%lf%lf", &x_loc, &y_loc, &num, &sample ); xloc_array[kount] = x_loc; yloc_array[kount] = y_loc; samp[kount] = num; datain[kount] = sample; if ( verbose == 2 ) fprintf ( stderr, "kount = %5d, x_loc = %12.2f, y_loc = %12.2f, num = %8.2f, sample = %8.2f\n", kount, xloc_array[kount], yloc_array[kount], samp[kount], datain[kount] ); } if ( verbose == 2 ) fprintf ( stderr, "\n" ); efclose (fpp); factor = 0.0005; nump1 = kount + 1; depth_water = error = zero; for ( i=0; i<=kount; i++ ) { check = 0; x_loc = xloc_array[i]; y_loc = yloc_array[i]; if ( x_loc >= grd_x.x_min && x_loc <= grd_x.x_max && y_loc >= grd_x.y_min && y_loc <= grd_x.y_max ) check = 1; if ( check ) { value_coeff_x = GMT_get_bcr_z (&grd_x, x_loc, y_loc, f1, &edgeinfo_x, &bcr_x); value_coeff_x2 = GMT_get_bcr_z (&grd_x2, x_loc, y_loc, f2, &edgeinfo_x2, &bcr_x2); value_coeff_x3 = GMT_get_bcr_z (&grd_x3, x_loc, y_loc, f3, &edgeinfo_x3, &bcr_x3); value_coeff_x4 = GMT_get_bcr_z (&grd_x4, x_loc, y_loc, f4, &edgeinfo_x4, &bcr_x4); if (GMT_is_dnan (value_coeff_x) || GMT_is_dnan (value_coeff_x2) || GMT_is_dnan (value_coeff_x3) || GMT_is_dnan (value_coeff_x4) ) { check = 0; } else { if ( value_coeff_x < 0.0 ) value_coeff_x *= -1.0; if ( value_coeff_x2 < 0.0 ) value_coeff_x2 *= -1.0; if ( value_coeff_x3 < 0.0 ) value_coeff_x3 *= -1.0; if ( value_coeff_x4 < 0.0 ) value_coeff_x4 *= -1.0; samp[i] -= value_coeff_x; depth_water = value_coeff_x * value_coeff_x2 * factor; datain[i] -= depth_water; wb_twt_array[i] = value_coeff_x; wb_z_array[i] = depth_water; if ( verbose == 3 ) fprintf ( stderr, "num = %5d, xloc = %10.2f yloc = %10.2f, WB TWT = %8.2f ms., WB Depth = %8.2f m., WB VEL = %8.2f mps., Vzero = %20.15f, K = %20.15f\n", i, x_loc, y_loc, value_coeff_x, depth_water, value_coeff_x2, value_coeff_x3, value_coeff_x4 ); vzero_opt[i] = value_coeff_x3; k_opt[i] = value_coeff_x4; } } } if ( verbose == 3 ) fprintf ( stderr, "\n" ); sum = zero; for ( i=0; i<=kount; i++ ) { vzero = vzero_opt[i]; k = k_opt[i]; x = samp[i]; y = ( vzero / k ) * ( exp ( k * x * factor ) - 1.0 ); error += abs ( y - datain[i] ); if ( verbose == 3 ) fprintf ( stderr, "%-5d %12.2f %12.2f %12.2f %12.4f %12.4f\n", i, x, datain[i], y, y - datain[i], error ); sign = 1.0; error = error1 = y - datain[i]; for (;;) { if ( abs(error1) < thresh ) break; vzero = vzero_opt[i]; k += ( delta * sign ); x = samp[i]; y = ( vzero / k ) * ( exp ( k * x * factor ) - 1.0 ); error1 = y - datain[i]; if ( verbose == 2 ) fprintf ( stderr, "%-5d %12.2f %12.2f %12.2f %12.4f\n", i, x, datain[i], y, error1 ); if ( (error1 > zero && error1 > error) || (error1 < zero && error1 < error) ) sign *= -1.0; } sum += abs ( y - datain[i] ); if ( verbose ) { fprintf ( stderr, "%-5d %12.2f %12.2f %12.2f %12.4f %12.4f\n", i, x, datain[i], y, y - datain[i], sum ); fprintf ( stderr, "%12.2f %12.2f ", xloc_array[i], yloc_array[i] ); fprintf ( stderr, "%30.25f %30.25f %8.2f %8.2f %8.2f\n", vzero, k, wb_twt_array[i], wb_z_array[i], sum / (float) nump1 ); } printf ( "%12.2f %12.2f ", xloc_array[i], yloc_array[i] ); printf ( "%30.25f %30.25f %8.2f %8.2f %8.2f\n", vzero, k, wb_twt_array[i], wb_z_array[i], sum / (float) nump1 ); } free1double (samp); free1double (datain); free1double (xloc_array); free1double (yloc_array); free1double (vzero_opt); free1double (k_opt); free1double (wb_twt_array); free1double (wb_z_array); GMT_free ((void *)f1); GMT_free ((void *)f2); GMT_free ((void *)f3); GMT_free ((void *)f4); GMT_end (argc, argv); return EXIT_SUCCESS; }
int main(int argc, char **argv) { char *plotcmd; /* build pswigb command for popen */ float *trbuf; /* trace buffer */ FILE *plotfp; /* fp for plot data */ int nt; /* number of samples on trace */ int ntr; /* number of traces */ int verbose; /* verbose flag */ float d1; /* time/depth sample rate */ float d2; /* trace/dx sample rate */ float f1; /* tmin/zmin */ float f2; /* tracemin/xmin */ cwp_Bool seismic; /* is this seismic data? */ cwp_Bool have_ntr=cwp_false;/* is ntr known from header or user? */ char *tmpdir; /* directory path for tmp files */ cwp_Bool istmpdir=cwp_false;/* true for user given path */ char *cwproot; /* value of CWPROOT environment variable*/ char *bindir; /* directory path for tmp files */ /* Support for irregularly spaced data */ cwp_String key; /* header key word with x2 information */ cwp_String type1=NULL; /* ... its type */ int index1=0; /* ... its index */ Value val; /* value of key */ Value scale; /* Value of scaler */ cwp_String type2=NULL; /* ... its type */ int index2=0; /* ... its index */ cwp_Bool isDepth=cwp_false; /* Is this key a type of depth? */ cwp_Bool isCoord=cwp_false; /* Is this key a type of coordinate? */ cwp_Bool irregular=cwp_false; /* if true, reading x2 from header */ cwp_String x2string; /* string of x2 values */ off_t x2len; /* ... its length */ cwp_String style; /* style parameter */ /* Initialize */ initargs(argc, argv); requestdoc(1); /* Get info from first trace */ if (!gettr(&tr)) err("can't get first trace"); seismic = ISSEISMIC(tr.trid); nt = tr.ns; ntr = tr.ntr; if (ntr) have_ntr = cwp_true; if (!getparint("verbose", &verbose)) verbose=0; if (!getparfloat("d1", &d1)) { if (tr.d1) d1 = tr.d1; else if (tr.dt) d1 = ((double) tr.dt)/1000000.0; else { if (seismic) { d1 = 0.004; warn("tr.dt not set, assuming dt=0.004"); } else { /* non-seismic data */ d1 = 1.0; warn("tr.d1 not set, assuming d1=1.0"); } } } if (!getparfloat("f1", &f1)) { if (tr.f1) f1 = tr.f1; else if (tr.delrt) f1 = (float) tr.delrt/1000.0; else f1 = 0.0; } /* Get or set ntr */ if (getparint("n2", &ntr) || getparint("ntr", &ntr)) have_ntr = cwp_true; if (!getparfloat("d2", &d2)) d2 = (tr.d2) ? tr.d2 : 1.0; if (!getparfloat("f2", &f2)) { if (tr.f2) f2 = tr.f2; else if (tr.tracr) f2 = (float) tr.tracr; else if (tr.tracl) f2 = (float) tr.tracl; else if (seismic) f2 = 1.0; else f2 = 0.0; } if (!getparstring("style", &style)) style = "seismic"; if (getparstring("key", &key)) { type1 = hdtype(key); if ( (index1 = getindex(key)) == -1 ) err("%s: keyword not in segy.h: '%s'", __FILE__, key); irregular = cwp_true; isDepth = IS_DEPTH(key); isCoord = IS_COORD(key); if (isDepth) { index2 = getindex("scalel"); type2 = hdtype("scalel"); } else if (isCoord) { index2 = getindex("scalco"); type2 = hdtype("scalco"); } } /* Look for user-supplied tmpdir */ if (!getparstring("tmpdir",&tmpdir) && !(tmpdir = getenv("CWP_TMPDIR"))) tmpdir=""; if (!STREQ(tmpdir, "") && access(tmpdir, WRITE_OK)) err("you can't write in %s (or it doesn't exist)", tmpdir); /* See if CWPBIN environment variable is not set */ if (!(bindir = getenv("CWPBIN"))) { /* construct bindir from CWPROOT */ bindir = (char *) emalloc(BUFSIZ); /* Get value of CWPROOT environment variable */ if (!(cwproot = getenv("CWPROOT"))) cwproot ="" ; if (STREQ(cwproot, "")) { warn("CWPROOT environment variable is not set! "); err("Set CWPROOT in shell environment as per instructions in CWP/SU Installation README files"); } /* then bindir = $CWPROOT/bin */ sprintf(bindir, "%s/bin", cwproot); } strcat(bindir,"/"); /* put / at the end of bindir */ /* Allocate trace buffer */ trbuf = ealloc1float(nt); if (!have_ntr || irregular ) { /* count traces */ if (verbose) { if (irregular) { warn("trace spacing from header field %s",key); warn("... getting positions"); } else { warn("n2 not getparred and " "ntr header field not set"); warn(".... counting traces"); } } /* Create temporary "file" to hold data */ if (STREQ(tmpdir,"")) { datafp = etmpfile(); if (irregular) x2fp = etmpfile(); if (verbose) warn("using tmpfile() call"); } else { /* user-supplied tmpdir */ char directory[BUFSIZ]; strcpy(directory, tmpdir); strcpy(datafile, temporary_filename(directory)); strcpy(x2file, temporary_filename(directory)); /* Handle user interrupts */ signal(SIGINT, (void (*) (int)) closefiles); signal(SIGQUIT, (void (*) (int)) closefiles); signal(SIGHUP, (void (*) (int)) closefiles); signal(SIGTERM, (void (*) (int)) closefiles); datafp = efopen(datafile, "w+"); if (irregular) x2fp = efopen(x2file, "w+"); istmpdir=cwp_true; if (verbose) warn("putting temporary files in %s", directory); } /* Loop over input data and read to temporary file */ ntr = 0; if(irregular ) { float x,xmin=FLT_MAX,xmax=-FLT_MAX; fprintf(x2fp,"x2="); do { if(ntr) fprintf(x2fp,","); ++ntr; gethval(&tr,index1,&val); if (isDepth || isCoord) { gethval(&tr,index2,&scale); x = (float) (vtod(type1,val) * pow(10.0,vtod(type2,scale))); } else x = vtof(type1,val); fprintf(x2fp,"%g",x); xmin = MIN(xmin,x); xmax = MAX(xmax,x); if (isDepth && STREQ(style,"vsp")) { int i; for (i = 0; i < nt; ++i) tr.data[i] *= -1.0; } efwrite(tr.data, FSIZE, nt, datafp); } while (gettr(&tr)); /* Flip vertical axis if style = vsp */ if (isDepth && STREQ(style,"vsp")) { fprintf(x2fp," x2beg=%g x2end=%g",xmax,xmin); style = "normal"; } if(xmin==xmax) { warn("values in header %s all equal,",key); warn("using f2=%f d2=%f",f2,d2); irregular=cwp_false; have_ntr=cwp_false; efclose(x2fp); if (istmpdir) eremove(x2file); } } else { do { ++ntr; efwrite(tr.data, FSIZE, nt, datafp); } while (gettr(&tr)); /* Save naive user */ if (STREQ(style,"vsp")) { style = "normal"; warn("style=vsp requires key= to be set"); } } } /* Set up pswigb command line */ if (irregular ) { x2len = (off_t) eftell( x2fp ); x2string = (char *) emalloc( ++x2len ); rewind(x2fp); fread(x2string,sizeof(char),x2len,x2fp); plotcmd = (char *) emalloc(x2len+BUFSIZ); if (STREQ(style,"vsp")) { style = "normal"; } sprintf(plotcmd, "%spswigb n1=%d d1=%f f1=%f %s style=%s", bindir, nt, d1, f1, x2string, style); free(x2string); } else { if (STREQ(style,"vsp")) { style = "normal"; } plotcmd = (char *) emalloc(BUFSIZ); sprintf(plotcmd, "%spswigb n1=%d n2=%d d1=%f d2=%f f1=%f f2=%f style=%s", bindir, nt, ntr, d1, d2, f1, f2, style); } for (--argc, ++argv; argc; --argc, ++argv) { if (strncmp(*argv, "d1=", 3) && /* skip those already set */ strncmp(*argv, "d2=", 3) && strncmp(*argv, "f1=", 3) && strncmp(*argv, "f2=", 3) && strncmp(*argv, "style=", 6)){ strcat(plotcmd, " "); /* put a space between args */ strcat(plotcmd, "\""); /* user quotes are stripped */ strcat(plotcmd, *argv); /* add the arg */ strcat(plotcmd, "\""); /* user quotes are stripped */ } } /* Open pipe to pswigb and send the traces */ plotfp = epopen(plotcmd, "w"); free(plotcmd); if (!have_ntr || irregular) { /* send out stored traces one by one */ rewind(datafp); { register int itr; for (itr = 0; itr < ntr; ++itr) { efread (trbuf, FSIZE, nt, datafp); efwrite(trbuf, FSIZE, nt, plotfp); } } } else { /* just pump out traces and let pswigb do the work */ do { efwrite(tr.data, FSIZE, nt, plotfp); } while (gettr(&tr)); } /* Clean up */ epclose(plotfp); if (!have_ntr) { efclose(datafp); if (istmpdir) eremove(datafile); } if (irregular) { efclose(x2fp); if (istmpdir) eremove(x2file); } return EXIT_SUCCESS; }
/* Initialize getpar */ static int getparinit (void) { static int targc; /* total number of args */ static char **targv; /* pointer to arg strings */ static char *pfname; /* name of parameter file */ FILE *pffd; /* file id of parameter file */ int pflen; /* length of parameter file in bytes */ static int pfargc; /* arg count from parameter file */ bool parfile; /* parfile existence flag */ int argstrlen; char *argstr, *pargstr; /* storage for command line and parameter file args */ int nread; /* bytes fread */ int i, j; /* counters */ char *getpfname(); /* return name of parameter file */ int white2null(); /* deliminate arg strings from parameter file with (possibly multiple) NULLs and return a count of the strings */ int tabulate(); /* install symbol table */ tabled = true; /* remember table is built */ /* Check if xargc was initiated */ if(!xargc) err("%s: xargc=%d -- not initiated in main", __FILE__, xargc); /* Space needed for command lines */ for (i = 1, argstrlen = 0; i < xargc; i++) { argstrlen += strlen(xargv[i]) + 1; } /* Get parfile name if there is one */ /* parfile = (pfname = getpfname()) ? true : false; */ if (pfname = getpfname()) { parfile = true; } else { parfile = false; } if (parfile) { pffd = efopen(pfname, "r"); /* Get the length */ efseek(pffd, 0, SEEK_END); pflen = eftell(pffd); rewind(pffd); argstrlen += pflen; } else { pflen = 0; } /* Allocate space for command line and parameter file plus nulls at the ends to help with parsing. */ /* argstr = (char *) calloc((size_t) (1+argstrlen+1), 1); */ argstr = (char *) ealloc1(1+argstrlen+1, 1); if (parfile) { /* Read the parfile */ nread = efread(argstr + 1, 1, pflen, pffd); if (nread != pflen) { err("%s: fread only %d bytes out of %d from %s", __FILE__, nread, pflen, pfname); } efclose(pffd); /* Zap whites in parfile to help in parsing */ argstr[0] = '\0' ; pfargc = white2null(argstr, pflen); } else { pfargc = 0; } /* Total arg count */ targc = pfargc + xargc - 1; /* Allocate space for total arg pointers */ targv = (char **) ealloc1(targc, sizeof(char*)); if (parfile) { /* Parse the parfile. Skip over multiple NULLs */ for (j = 1, i = 0; j < pflen; j++) { if (argstr[j] && !argstr[j-1]) { targv[i++] = argstr + j; } } } else { i = 0; } /* Copy command line arguments */ for (j = 1, pargstr = argstr + pflen + 2; j < xargc; j++) { strcpy(pargstr,xargv[j]); targv[i++] = pargstr; pargstr += strlen(xargv[j]) + 1; } /* Allocate space for the pointer table */ argtbl = (ArgStruct*) ealloc1(targc, sizeof(ArgStruct)); /* Tabulate targv */ tabulate(targc, targv); }
int main(int argc, char **argv) /*argc, argv - the arguments to the main() function*/ { int nt; /*number of time samples*/ int nz; /*number of migrated depth samples*/ int nx; /*number of midpoints (traces)*/ int ix; int iz; float dt; /*time sampling interval*/ float dx; /*spatial sampling interval*/ float dz; /*migrated depth sampling interval*/ float **data; /*input seismic data*/ complex **image; /*migrated image*/ float **rimage; /*migrated image*/ float **v; /*velocity model*/ FILE *vfp; char *vfile=""; /*name of velocity file*/ int verbose=1; char *tmpdir; /* directory path for tmp files*/ cwp_Bool istmpdir=cwp_false; /* true for user-given path*/ /******************************* Intialize *********************************************/ initargs(argc,argv); requestdoc(1); /********************************* Get parameters **************************************/ /*get info from first trace*/ if (!gettr(&tr)) err("can't get first trace"); /*fgettr: get a fixed-length segy trace from a file by file pointer*/ nt = tr.ns; /*nt*/ /*gettr: macro using fgettr to get a trace from stdin*/ if (!getparfloat("dt", &dt)) { /*dt*/ if (tr.dt) { dt = ((double) tr.dt)/1000000.0; } else {err("dt is not set");} } if (!getparfloat("dx", &dx)) { /*dx*/ if (tr.d2) { dx = tr.d2; } else { err("dx is not set"); } } /*get optional parameters*/ if (!getparint("nz",&nz)) err("nz must be specified"); if (!getparfloat("dz",&dz)) err("dz must be specified"); if (!getparstring("vfile", &vfile)) err("velocity file must be specified"); if (!getparint("verbose", &verbose)) verbose = 0; /****************************************************************************************/ /* Look for user-supplied tmpdir */ if (!getparstring("tmpdir",&tmpdir) && !(tmpdir = getenv("CWP_TMPDIR"))) tmpdir=""; if (!STREQ(tmpdir, "") && access(tmpdir, WRITE_OK)) err("you can't write in %s (or it doesn't exist)", tmpdir); checkpars(); /**************************** Count trace number nx ******************************/ /* store traces and headers in tempfiles while getting a count */ if (STREQ(tmpdir,"")) { tracefp = etmpfile(); headerfp = etmpfile(); if (verbose) warn("using tmpfile() call"); } else { /* user-supplied tmpdir */ char directory[BUFSIZ]; strcpy(directory, tmpdir); strcpy(tracefile, temporary_filename(directory)); strcpy(headerfile, temporary_filename(directory)); /* Trap signals so can remove temp files */ signal(SIGINT, (void (*) (int)) closefiles); signal(SIGQUIT, (void (*) (int)) closefiles); signal(SIGHUP, (void (*) (int)) closefiles); signal(SIGTERM, (void (*) (int)) closefiles); tracefp = efopen(tracefile, "w+"); headerfp = efopen(headerfile, "w+"); istmpdir=cwp_true; if (verbose) warn("putting temporary files in %s", directory); } nx = 0; do { ++nx; /*get the number of traces nx*/ efwrite(&tr,HDRBYTES,1,headerfp); efwrite(tr.data, FSIZE, nt, tracefp); } while (gettr(&tr)); erewind(tracefp); /*Set position of stream to the beginning*/ erewind(headerfp); /******************************************************************************************/ /*allocate memory*/ data = alloc2float(nt,nx); /*2D array nx by nt*/ image = alloc2complex(nz,nx); /*2D array nx by nz*/ rimage = alloc2float(nz,nx); /*2D array nx by nz*/ v= alloc2float(nz,nx); /*2D array, in Fortran the velocity model is nz by nx 2D array*/ /*in binary, it is actually 1D*/ /* load traces into the zero-offset array and close tmpfile */ efread(*data, FSIZE, nt*nx, tracefp); /*read traces to data*/ efclose(tracefp); /*load velicoty file*/ vfp=efopen(vfile,"r"); efread(v[0],FSIZE,nz*nx,vfp); /*load velocity*/ efclose(vfp); /***********************finish reading data*************************************************/ /* call pspi migration function*/ pspimig(data,image,v,nt,nx,nz,dt,dx,dz); /*get real part of image*/ for (iz=0;iz<nz;iz++){ for (ix=0;ix<nx;ix++){ rimage[ix][iz] = image[ix][iz].r; } } /* restore header fields and write output */ for (ix=0; ix<nx; ix++) { efread(&tr,HDRBYTES,1,headerfp); tr.ns = nz; tr.d1 = dz; memcpy( (void *) tr.data, (const void *) rimage[ix],nz*FSIZE); puttr(&tr); } /* Clean up */ efclose(headerfp); if (istmpdir) eremove(headerfile); if (istmpdir) eremove(tracefile); return(CWP_Exit()); }
int main (int argc, char **argv) { int nt; /* number of time samples */ int nz; /* number of migrated depth samples */ int nx; /* number of horizontal samples */ int nxshot; /* number of shots to be migrated */ /*int nxshot_orig;*/ /* first value of nxshot */ int iz,iw,ix,it; /* loop counters */ int igx; /* integerized gx value */ int ntfft; /* fft size */ int nw,truenw; /* number of wave numbers */ int dip=79; /* dip angle */ float sx,gx; /* x source and geophone location */ float gxmin=0.0,gxmax=0.0; /* x source and geophone location */ float min_sx_gx; /* min(sx,gx) */ float oldgx; /* old gx position */ /* float oldgxmin; */ /* old gx position */ /* float oldgxmax; */ /* old gx position */ float oldsx=0.0; /* old sx position */ int isx=0,nxo; /* index for source and geophone */ int oldisx=0; /* old value of source index */ int oldigx=0; /* old value of integerized gx value */ int ix1,ix2,ix3,ixshot; /* dummy index */ int lpad,rpad; /* padding on both sides of the migrated section */ float *wl=NULL,*wtmp=NULL; float fmax; float f1,f2,f3,f4; int nf1,nf2,nf3,nf4; int ntw; float dt=0.004,dz; /* time and depth sampling interval */ float dw; /* frequency sampling interval */ float fw; /* first frequency */ float w; /* frequency */ float dx; /* spatial sampling interval */ float **p=NULL; /* input data */ float **cresult=NULL; /* output result */ float v1; /* average velocity */ double kz2; float **v=NULL,**vp=NULL;/* pointers for the velocity profile */ complex cshift2; complex *wlsp=NULL; /* complex input,output */ complex **cp=NULL; /* ... */ complex **cp1=NULL; /* ... */ complex **cq=NULL; /* ... */ char *vfile=""; /* name of file containing velocities */ FILE *vfp=NULL; int verbose; /* verbose flag */ /* hook up getpar to handle the parameters */ initargs(argc,argv); requestdoc(1); /* get required parameters */ MUSTGETPARINT("nz",&nz); MUSTGETPARINT("nxo",&nxo); MUSTGETPARFLOAT("dz",&dz); MUSTGETPARSTRING("vfile",&vfile); MUSTGETPARINT("nxshot",&nxshot); /* get optional parameters */ if (!getparfloat("fmax",&fmax)) fmax = 25.0; if (!getparfloat("f1",&f1)) f1 = 10.0; if (!getparfloat("f2",&f2)) f2 = 20.0; if (!getparfloat("f3",&f3)) f3 = 40.0; if (!getparfloat("f4",&f4)) f4 = 50.0; if (!getparint("lpad",&lpad)) lpad=9999; if (!getparint("rpad",&rpad)) rpad=9999; if (!getparint("dip",&dip)) dip=79; if (!getparint("verbose",&verbose)) verbose = 0; /* allocating space */ cresult = alloc2float(nz,nxo); vp = alloc2float(nxo,nz); /* load velicoty file */ vfp=efopen(vfile,"r"); efread(vp[0],FSIZE,nz*nxo,vfp); efclose(vfp); /* zero out cresult array */ memset((void *) cresult[0], 0, nxo*nz*FSIZE); /* save value of nxshot */ /* nxshot_orig=nxshot; */ /* get info from first trace */ if (!gettr(&tr)) err("can't get first trace"); nt = tr.ns; get_sx_gx(&sx,&gx); min_sx_gx = MIN(sx,gx); sx = sx - min_sx_gx; gx = gx - min_sx_gx; /* let user give dt and/or dx from command line */ if (!getparfloat("dt", &dt)) { if (tr.dt) { /* is dt field set? */ dt = ((double) tr.dt)/1000000.0; } else { /* dt not set, assume 4 ms */ dt = 0.004; if(verbose) warn("tr.dt not set, assuming dt=0.004"); } } if (!getparfloat("dx",&dx)) { if (tr.d2) { /* is d2 field set? */ dx = tr.d2; } else { dx = 1.0; if(verbose) warn("tr.d2 not set, assuming d2=1.0"); } } checkpars(); oldisx=0; do { /* begin loop over shots */ /* determine frequency sampling interval*/ ntfft = npfar(nt); nw = ntfft/2+1; dw = 2.0*PI/(ntfft*dt); /* compute the index of the frequency to be migrated*/ fw=2.0*PI*f1; nf1=fw/dw+0.5; fw=2.0*PI*f2; nf2=fw/dw+0.5; fw=2.0*PI*f3; nf3=fw/dw+0.5; fw=2.0*PI*f4; nf4=fw/dw+0.5; /* the number of frequencies to migrated*/ truenw=nf4-nf1+1; fw=0.0+nf1*dw; if(verbose) warn("nf1=%d nf2=%d nf3=%d nf4=%d nw=%d",nf1,nf2,nf3,nf4,truenw); /* allocate space */ wl=alloc1float(ntfft); wlsp=alloc1complex(nw); /* generate the Ricker wavelet */ wtmp=ricker(fmax,dt,&ntw); /* zero out wl[] array */ memset((void *) wl, 0, ntfft*FSIZE); /* CHANGE BY CHRIS STOLK, Dec. 11, 2005 */ /* The next two lines are the old code, */ /* it is erroneous because the peak of */ /* the wavelet occurs at positive time */ /* instead of time zero. */ /* for(it=0;it<ntw;it++) wl[it]=wtmp[it]; */ /* New code: we put in the wavelet in a centered fashion */ for(it=0;it<ntw;it++) wl[(it-ntw/2+ntfft) % ntfft]=wtmp[it]; /* End of new code */ free1float(wtmp); /* fourier transform wl array */ pfarc(-1,ntfft,wl,wlsp); /* allocate space */ p = alloc2float(ntfft,nxo); cq = alloc2complex(nw,nxo); /* zero out p[][] array */ memset((void *) p[0], 0, ntfft*nxo*FSIZE); /* initialize a number of items before looping over traces */ nx = 0; igx=0; oldigx=0; oldsx=sx; oldgx=gx; /* oldgxmax=gxmax; */ /* oldgxmin=gxmin; */ do { /* begin looping over traces within a shot gather */ memcpy( (void *) p[igx], (const void *) tr.data,nt*FSIZE); /* get sx and gx */ get_sx_gx(&sx,&gx); sx = (sx - min_sx_gx); gx = (gx - min_sx_gx); igx = NINT(gx/dx); if (igx==oldigx) warn("repeated igx!!! check dx or scalco value!!!"); oldigx = igx; if(gxmin>gx)gxmin=gx; if(gxmax<gx)gxmax=gx; if(verbose) warn(" inside loop: min_sx_gx %f isx %d igx %d gx %f sx %f",min_sx_gx,isx,igx,gx,sx); /* sx, gx must increase monotonically */ if (!(oldsx <= sx) ) err("sx field must be monotonically increasing!"); if (!(oldgx <= gx) ) err("gx field must be monotonically increasing!"); ++nx; } while(gettr(&tr) && sx==oldsx); isx=NINT(oldsx/dx); ixshot=isx; if (isx==oldisx) warn("repeated isx!!! check dx or scalco value!!!"); oldisx=isx; if(verbose) { warn("sx %f, gx %f , gxmin %f gxmax %f nx %d",sx,gx,gxmin,gxmax, nx); warn("isx %d igx %d ixshot %d" ,isx,igx,ixshot); } /* transform the shot gather from time to frequency domain */ pfa2rc(1,1,ntfft,nxo,p[0],cq[0]); /* compute the most left and right index for the migrated */ /* section */ ix1=NINT(oldsx/dx); ix2=NINT(gxmin/dx); ix3=NINT(gxmax/dx); if(ix1>=ix3)ix3=ix1; if(ix1<=ix2)ix2=ix1; ix2-=lpad; ix3+=rpad; if(ix2<0)ix2=0; if(ix3>nxo-1)ix3=nxo-1; /* the total traces to be migrated */ nx=ix3-ix2+1; nw=truenw; /* allocate space for velocity profile within the aperature */ v=alloc2float(nx,nz); for(iz=0;iz<nz;iz++) for(ix=0;ix<nx;ix++) v[iz][ix]=vp[iz][ix+ix2]; /* allocate space */ cp = alloc2complex(nx,nw); cp1 = alloc2complex(nx,nw); /* transpose the frequency domain data from */ /* data[ix][iw] to data[iw][ix] and apply a */ /* Hamming at the same time */ for (ix=0; ix<nx; ++ix) { for (iw=0; iw<nw; iw++){ float tmpp=0.0,tmppp=0.0; if(iw>=(nf1-nf1)&&iw<=(nf2-nf1)){ tmpp=PI/(nf2-nf1); tmppp=tmpp*(iw-nf1)-PI; tmpp=0.54+0.46*cos(tmppp); cp[iw][ix]=crmul(cq[ix+ix2][iw+nf1],tmpp); } else { if(iw>=(nf3-nf1)&&iw<=(nf4-nf1)) { tmpp=PI/(nf4-nf3); tmppp=tmpp*(iw-nf3); tmpp=0.54+0.46*cos(tmppp); cp[iw][ix]=crmul(cq[ix+ix2][iw+nf1],tmpp); } else { cp[iw][ix]=cq[ix+ix2][iw+nf1]; } } cp1[iw][ix]=cmplx(0.0,0.0); } } for(iw=0;iw<nw;iw++){ cp1[iw][ixshot-ix2]=wlsp[iw+nf1]; } if(verbose) { warn("ixshot %d ix %d ix1 %d ix2 %d ix3 %d",ixshot,ix,ix1,ix2,ix3); warn("oldsx %f ",oldsx); } free2float(p); free2complex(cq); free1float(wl); free1complex(wlsp); /* loops over depth */ for(iz=0; iz<nz; ++iz) { /* the imaging condition */ for(ix=0; ix<nx; ++ix){ for(iw=0,w=fw;iw<nw;w+=dw,iw++){ complex tmp; float ratio=10.0; if(fabs(ix+ix2-ixshot)*dx<ratio*iz*dz) tmp=cmul(cp[iw][ix],cp1[iw][ix]); else tmp=cmplx(0.0,0.0); cresult[ix+ix2][iz]+=tmp.r/ntfft; } } /* get the average velocity */ v1=0.0; for(ix=0;ix<nx;++ix) v1+=v[iz][ix]/nx; /* compute time-invariant wavefield */ for(ix=0;ix<nx;++ix) { for(iw=0,w=fw;iw<nw;w+=dw,++iw) { kz2=-(1.0/v1)*w*dz; cshift2=cmplx(cos(kz2),sin(kz2)); cp[iw][ix]=cmul(cp[iw][ix],cshift2); cp1[iw][ix]=cmul(cp1[iw][ix],cshift2); } } /* wave-propagation using finite-difference method */ fdmig(cp, nx, nw,v[iz],fw,dw,dz,dx,dt,dip); fdmig(cp1,nx, nw,v[iz],fw,dw,dz,dx,dt,dip); /* apply thin lens term here */ for(ix=0;ix<nx;++ix) { for(iw=0,w=fw;iw<nw;w+=dw,++iw){ kz2=-(1.0/v[iz][ix]-1.0/v1)*w*dz; cshift2=cmplx(cos(kz2),sin(kz2)); cp[iw][ix]=cmul(cp[iw][ix],cshift2); cp1[iw][ix]=cmul(cp1[iw][ix],cshift2); } } } free2complex(cp); free2complex(cp1); free2float(v); --nxshot; } while(nxshot); /* restore header fields and write output */ for(ix=0; ix<nxo; ix++){ tr.ns = nz; tr.d1 = dz; tr.d2 = dx; tr.offset = 0; tr.cdp = tr.tracl = ix; memcpy( (void *) tr.data, (const void *) cresult[ix],nz*FSIZE); puttr(&tr); } return(CWP_Exit()); }