June 5, 2012
C/C++ : SEGY Merge
C/C++ : SEGY Merge
In my last post, I am create a method how to merge SEGY with cat and dd command. Now, I am create a C/C++ SEGY merge code. This is the main C/C++ : SEGY Merge code :
void usage()
{
printf("\nSEGY_MERGE \n");
printf("by toto (toto-share.com)\n\n");
printf("segy_merge segy1 segy2 segy3 ... segyn > output.sgy \n");
printf("\n");
}
int main(int argc, char **argv)
{
int i, j, result;
int ns, dt, format, nsegy, ntrc;
int tmpns, tmpdt, tmpformat;
FILE *fid=NULL;
unsigned char segy_header[3600];
unsigned char *buffer;
if(argc==1)
{
usage();
return(0);
}
//check ns, dt and format segy
getBinaryHeaderInfo(argv[1], &ns, &dt, &format);
for (i=2; i<argc; i++)
{
getBinaryHeaderInfo(argv[i], &tmpns, &tmpdt, &tmpformat);
if(ns!=tmpns || dt!=tmpdt || format!=tmpformat)
{
fprintf(stderr,"segy_merge : ns, dt, or format segy not equal at index %i \n", i);
return(1);
}
}
if(format==1) nsegy = 240 + (ns*4);
else if(format==2) nsegy = 240 + (ns*4);
else if(format==3) nsegy = 240 + (ns*2);
else if(format==4) nsegy = 240 + (ns*4);
else if(format==5) nsegy = 240 + (ns*4);
else if(format==8) nsegy = 240 + (ns);
else
{
fprintf(stderr,"segy_merge : format file must be 1, 2, 3, 4, 5 or 8 \n");
return(1);
}
// --------------- MERGE FILE --------------
buffer = (unsigned char*) calloc(nsegy, sizeof(unsigned char)); //allocate header+trace
for(i=1; i<argc; i++)
{
fid = fopen(argv[i], "r");
if(!fid){
fprintf(stderr,"Error opening file %s \n", argv[i]);
exit(0);
}
ntrc = getNumberOfTraceSegyFile(fid, nsegy); //get number of trace from segy file
if(i==1) //read and write segy header
{
result = fread(segy_header, sizeof(unsigned char), 3600, fid);
result = fwrite(segy_header, sizeof(unsigned char), 3600, stdout);
}
else
fseeko64(fid, 3600, SEEK_SET); //skip reading segy header
for(j=0; j<ntrc; j++)
{
if(j%1000==0)
fprintf(stderr,"open file %i/%i, reading traces %i from %i \n",
i, argc-1, j+1, ntrc);
result = fread(buffer, sizeof(unsigned char), nsegy, fid); //read trace
result = fwrite(buffer, sizeof(unsigned char), nsegy, stdout);//write trace
}
fclose(fid);
}
free(buffer);
fprintf(stderr,"Merging File Complete \n");
return(1);
}
After compile this code, we can use this program with command :
segymerge input_segy1 input_segy2 …. input_segyn > output_segy_merge.sgy
or
segymerge *.sgy > output_segy_merge.sgy
This is the sample output log from this C/C++ SEGY merge program :
toto@toto-laptop$ segymerge file1.sgy file2.sgy file3.sgy >out.sgy open file 1/3, reading traces 1 from 114972 open file 1/3, reading traces 1001 from 114972 open file 1/3, reading traces 2001 from 114972 open file 1/3, reading traces 3001 from 114972
You can download the comple C/C++ SEGY merge code at here