⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grids.c~

📁 seismic software,very useful
💻 C~
字号:
#include "gridhd.h"#include "ghdr.h"#include "grid.h"#include "par.h"int fgetghdr(FILE  *gfp, ghed *gh) {/*  read in a grid header from a file pointer  input:	gfp 	--	file pointer of disk grid file  output:	gh	--	grid header   return:	0	--	grid header found	1	--	not a standard grid file (no header found)  author:	Zhiming Li, 	8/17/92		        notes:	the grid file consists of n1*n2*n3*n4*n5 grid data values followed         by NGHDRS (25) floating-point header numbers */		int ierr;	float tmp; 	int nread, idtype;	long long int n1, n2, n3, n4, n5;	float scale;	filetype ftype;	long long isize, jsize, iseek;		ierr = 0;	/* check to see if gfp is pipe */	/*	ftype = filestat(fileno(gfp));	*/		/*	if(ftype == DISK) {	*/		/* retain the pointer position */		file2g(gfp);		iseek = ftell2g(gfp);		/* check grid file size */ 		fseek2g(gfp,0L,2);		jsize = ftell2g(gfp);		if(jsize <  GHDRBYTES ) {			ierr = 1;			warn(" warning: grid file size less than %d bytes",				GHDRBYTES);			return ierr;		}		fseek2g(gfp,-GHDRBYTES,2);	/*	}	*/	/* read in header */	nread = fread( (char *)gh,1,GHDRBYTES,gfp);	if(nread!=GHDRBYTES) {		warn(" warning: grid header read error \n");		ierr = 1;		return ierr; 	} 	/* check parameters */	scale = gh->scale;	if(scale==0.) {		warn(" warning: gh.scale = 0.; 1 used \n");		scale = 1.;	}	tmp  = gh->n1 / scale + 0.5;	n1 = (int) tmp;	if(n1==0) n1 = 1; 	tmp  = gh->n2 / scale + 0.5;	n2 = (int) tmp;	if(n2==0) n2 = 1;	tmp  = gh->n3 / scale + 0.5;	n3 = (int) tmp;	if(n3==0) n3 = 1;	tmp  = gh->n4 / scale + 0.5;	n4 = (int) tmp;	if(n4==0) n4=1;	tmp  = gh->n5 / scale + 0.5;	n5 = (int) tmp;	if(n5==0) n5 = 1;	/* get grid data type */	tmp = gh->dtype / scale + 0.5;	idtype = (int) tmp;	if(idtype!=1 && idtype!=2 && idtype!=4 && idtype!=8) {		warn(" warning: invalid dtype=%d; dtype=4 used \n",idtype);		idtype = 4;	} /*	if(ftype==DISK) {*/		isize = n1*n2*n3;		isize = isize*n4*n5*idtype + GHDRBYTES;		if(jsize != isize ) {			ierr = 1;			warn(	" warning: grid file size: %g bytes not consistant with grid header\n",				(float)jsize);			return ierr;		}		/* return to the original pointer position */		fseek2g(gfp,iseek,0);/*	}*/	return ierr;}	  	int fputghdr(FILE  *gfp, ghed *gh) {/*  write a grid header to a grid file  input:        gfp     --      file pointer of disk grid file        gh      --      grid header  return:        0       --      grid header written/updated        1       --      grid size error  author:        Zhiming Li,     8/17/92                 notes:        the grid file consists of n1*n2*n3*n4*n5 grid data values followed        by NGHDRS (25) floating-point header numbers*/	int ierr;        float tmp;        int nwrite, idtype;        int n1, n2, n3, n4, n5;        float scale;	filetype ftype;	long long isize, jsize;	ierr = 0;	/* check if gfp is pipe */	/*	ftype = filestat(fileno(gfp));	*//*	if(ftype==DISK) {*/		/* flush gfp buffer, in case call program forgets to do so */			file2g(gfp);        	fflush(gfp);        	/* check grid file size */        	fseek2g(gfp,0L,2);        	jsize = ftell2g(gfp);			/*        	if(jsize <  GHDRBYTES ) {                	ierr = 1;                	warn(" warning: grid file size less than %d bytes",				GHDRBYTES);                	return ierr;        	}			*//*	}*/	/* check parameters */	/* make sure n1,n2,n3,n4,n5 are not zero */        scale = gh->scale;        if(scale==0.) {                warn(" warning: gh.scale = 0.; 1 used \n");                scale = 1.;        }        tmp  = gh->n1 / scale + 0.5;        n1 = (int) tmp;        if(n1==0) n1 = 1;        tmp  = gh->n2 / scale + 0.5;        n2 = (int) tmp;        if(n2==0) n2 = 1;        tmp  = gh->n3 / scale + 0.5;        n3 = (int) tmp;        if(n3==0) n3 = 1;        tmp  = gh->n4 / scale + 0.5;        n4 = (int) tmp;        if(n4==0) n4=1;        tmp  = gh->n5 / scale + 0.5;        n5 = (int) tmp;        if(n5==0) n5 = 1;   	/* get grid data type */        tmp = gh->dtype / scale + 0.5;        idtype = (int) tmp;	if(idtype!=1 && idtype!=2 && idtype!=4 && idtype!=8) {		warn(" warning: invalid dtype=%d; dtype=4 used \n",idtype);		idtype = 4;	} 	gh->scale = scale;	gh->dtype = (float)idtype * scale;	gh->n1 = (float)n1 * scale;	gh->n2 = (float)n2 * scale;	gh->n3 = (float)n3 * scale;	gh->n4 = (float)n4 * scale;	gh->n5 = (float)n5 * scale;	/* position gfp for grid header */	if(ftype==DISK) {		isize = n1*n2*n3;		isize = isize*n4*n5*idtype + GHDRBYTES;        	if(jsize==isize || jsize==isize-GHDRBYTES) {			fseek2g(gfp,isize-GHDRBYTES,0);		} else {                	ierr = 1;        		warn(	" warning: grid file size: %g bytes not consistant with grid header\n",                	(float)jsize);			/* position to the end of the file */			fseek2g(gfp,0L,2);        	}	}	nwrite = efwrite((char*)gh,1,GHDRBYTES,gfp); 	if(nwrite!=GHDRBYTES) {		ierr=1;		warn(" warning: grid header write error \n");	}	return ierr;}void fromghdr(ghed *gh, float *scale, int *dtype, int *n1, int *n2, int *n3,	int *n4, int *n5, float *d1, float *d2, float *d3, float *d4,	float *d5, float *o1, float *o2, float *o3, float *o4, float *o5,	float *dcdp2, float *dline3, float *ocdp2, float *oline3,	float *gmin, float *gmax, int *orient, int *gtype) {/* from grid header gh, find the values of the header parameters */ /* return values with scale factor removed */ 	float tmp, sc;		sc = gh->scale;	if(sc==0.) err(" grid file header value: gh.scale = 0. ");	*scale = sc;	tmp = gh->dtype / sc + 0.5;	*dtype = (int) tmp;	tmp = gh->n1 / sc + 0.5;	*n1 = (int) tmp;	tmp = gh->n2 / sc + 0.5;	*n2 = (int) tmp;	tmp = gh->n3 / sc + 0.5;	*n3 = (int) tmp;	tmp = gh->n4 / sc + 0.5;	*n4 = (int) tmp;	tmp = gh->n5 / sc + 0.5;	*n5 = (int) tmp;	*d1 = gh->d1 / sc; 		*d2 = gh->d2 / sc; 		*d3 = gh->d3 / sc; 		*d4 = gh->d4 / sc; 		*d5 = gh->d5 / sc; 		*o1 = gh->o1 / sc; 		*o2 = gh->o2 / sc; 		*o3 = gh->o3 / sc; 		*o4 = gh->o4 / sc; 		*o5 = gh->o5 / sc; 		*dcdp2 = gh->dcdp2 / sc; 		*dline3 = gh->dline3 / sc; 		*ocdp2 = gh->ocdp2 / sc; 		*oline3 = gh->oline3 / sc; 		*gmin = gh->gmin / sc; 		*gmax = gh->gmax / sc; 		tmp = gh->orient / sc + 0.5; 		*orient = tmp; 	tmp = gh->gtype / sc + 0.5; 		*gtype = tmp; }		void toghdr(ghed *gh, float *scale, int *dtype, int *n1, int *n2, int *n3,	int *n4, int *n5, float *d1, float *d2, float *d3, float *d4,	float *d5, float *o1, float *o2, float *o3, float *o4, float *o5,	float *dcdp2, float *dline3, float *ocdp2, float *oline3,	float *gmin, float *gmax, int *orient, int *gtype) {/* update the grid header gh, using the values of the header parameters */ /* header values will be updated with scale factor applied */ 	float sc;		sc = *scale;	if(sc==0.) err(" input scale factor: scale = 0. ");	gh->scale = sc;	gh->dtype = *dtype * sc;	gh->n1 = *n1 * sc;	gh->n2 = *n2 * sc;	gh->n3 = *n3 * sc;	gh->n4 = *n4 * sc;	gh->n5 = *n5 * sc;	gh->d1 = *d1 * sc;	gh->d2 = *d2 * sc;	gh->d3 = *d3 * sc;	gh->d4 = *d4 * sc;	gh->d5 = *d5 * sc;	gh->o1 = *o1 * sc;	gh->o2 = *o2 * sc;	gh->o3 = *o3 * sc;	gh->o4 = *o4 * sc;	gh->o5 = *o5 * sc;	gh->dcdp2 = *dcdp2 * sc;	gh->dline3 = *dline3 * sc;	gh->ocdp2 = *ocdp2 * sc;	gh->oline3 = *oline3 * sc;	gh->gmin = *gmin * sc;	gh->gmax = *gmax * sc;	gh->orient = *orient * sc;	gh->gtype = *gtype * sc;}/* get header value from key */void getgval(ghed *gh, char *key, float *val) { 	int index = getgindex(key);	char *tp = (char*) gh;	float scale = *( (float*) (tp + ghdr[0].offs) );	*val = *( (float*) (tp + ghdr[index].offs) );	*val = *val / scale;}/* put header value from key */void putgval(ghed *gh, char *key, float val) { 	int index = getgindex(key);	char *tp = (char*) gh;	float scale = *( (float*) (tp + ghdr[0].offs) );	if ( -1 == (index))                err("%s: key word not in ghdr.h: '%s'", __FILE__, key);	if(scale==0.) scale = 1.;	*( (float*) (tp + ghdr[index].offs) ) = val * scale;}/* get grid header index by key */int getgindex(char *key)        /* get index for this key */{        register int i;        for (i = 0; i < NGHDRS; i++)                if (STREQ(ghdr[i].key, key))                        return i;       /* key found */        /* not found */        return -1;}/* get key from grid header index  */char *getgkey(int index){        return (index < NGHDRS && index >= 0) ? ghdr[index].key : NULL;}/* get grid header value type from key */char *ghdtype(char *key){        int index = getgindex(key);        if (-1 == (index))                err("%s: key word not in ghdr.h: '%s'", __FILE__, key);        return ghdr[index].type;}/* find min and max absolute values of a short int array */void sminmax(short *sa, int n, float *gmin, float *gmax) {	int i;	float norm;	norm = (float) sa[0];	*gmin = *gmax = norm;	for(i=0;i<n;i++) {		norm  = (float) sa[i];		if(*gmin>norm) *gmin  = norm;		if(*gmax<norm) *gmax  = norm;	}}/* find min and max values of a float array */void fminmax(float *fa, int n, float *gmin, float *gmax) {	int i;	*gmin = *gmax = fa[0];	for(i=0;i<n;i++) {		if(*gmin>fa[i]) *gmin  = fa[i];		if(*gmax<fa[i]) *gmax  = fa[i];	}}/* find min and max absolute values of a complex array */void cminmax(complex *ca, int n, float *gmin, float *gmax) {	int i;	float norm;	*gmin = *gmax = sqrt(ca[0].r*ca[0].r+ca[0].i*ca[0].i);	for(i=0;i<n;i++) {		norm  = sqrt(ca[i].r*ca[i].r+ca[i].i*ca[i].i);		if(*gmin>norm) *gmin  = norm;		if(*gmax<norm) *gmax  = norm;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -