-
Jan Thorbecke authoredJan Thorbecke authored
getModelInfo.c 2.97 KiB
#define _FILE_OFFSET_BITS 64
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <math.h>
#include "par.h"
#include "segy.h"
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define MIN(x,y) ((x) < (y) ? (x) : (y))
#define NINT(x) ((int)((x)>0.0?(x)+0.5:(x)-0.5))
/**
* reads gridded model file to compute minimum and maximum values and sampling intervals
*
* AUTHOR:
* Jan Thorbecke (janth@xs4all.nl)
* The Netherlands
**/
int getModelInfo(char *file_name, int *n1, int *n2, float *d1, float *d2, float *f1, float *f2, float *min, float *max, int *axis, int zeroch, int verbose)
{
FILE *fp;
size_t nread, trace_sz;
off_t bytes;
int ret, i, one_shot, ntraces;
float *trace, cmin;
segy hdr;
fp = fopen( file_name, "r" );
assert( fp != NULL);
nread = fread( &hdr, 1, TRCBYTES, fp );
assert(nread == TRCBYTES);
ret = fseeko( fp, 0, SEEK_END );
if (ret<0) perror("fseeko");
bytes = ftello( fp );
*n1 = hdr.ns;
*d1 = hdr.d1;
*d2 = hdr.d2;
*f1 = hdr.f1;
*f2 = hdr.f2;
if ( NINT(100.0*((*d1)/(*d2)))!=100 ) {
verr("dx and dz are different in the model !");
}
if ( NINT(1000.0*(*d1))==0 ) {
if(!getparfloat("dx",d1)) {
verr("dx is equal to zero use parameter dx= to set value");
}
*d2 = *d1;
}
trace_sz = sizeof(float)*(*n1)+TRCBYTES;
ntraces = (int) (bytes/trace_sz);
*n2 = ntraces;
/* check to find out min and max values gather */
one_shot = 1;
trace = (float *)malloc(trace_sz);
fseeko( fp, TRCBYTES, SEEK_SET );
nread = fread( trace, sizeof(float), hdr.ns, fp );
assert (nread == hdr.ns);
fseeko( fp, TRCBYTES, SEEK_SET );
if (hdr.trid == TRID_DEPTH) *axis = 1; /* samples are z-axis */
else *axis = 0; /* sample direction respresents the x-axis */
i=0; cmin=trace[0];
while ( ( (cmin==0.0) && zeroch) && (i<hdr.ns) ) cmin=trace[i++];
*max = cmin;
*min = cmin;
/* keep on reading traces until there are no more traces (nread==0) */
while (one_shot) {
nread = fread( trace, sizeof(float), hdr.ns, fp );
assert (nread == hdr.ns);
for (i=0;i<(*n1);i++) {
*max = MAX(trace[i],*max);
cmin = MIN(trace[i],*min);
if (zeroch) {
if (cmin!=0.0) *min = MIN(*min, cmin);
}
else {
*min = cmin;
}
}
nread = fread( &hdr, 1, TRCBYTES, fp );
if (nread==0) break;
}
fclose(fp);
free(trace);
if (verbose>2) {
vmess("For file %s", file_name);
vmess("nz=%d nx=%d", *n1, *n2);
vmess("dz=%f dx=%f", *d1, *d2);
vmess("min=%f max=%f", *min, *max);
vmess("zstart=%f xstart=%f", *f1, *f2);
if (*axis) vmess("sample represent z-axis\n");
else vmess("sample represent x-axis\n");
}
return 0;
}