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

📄 surelanan.c

📁 su 的源代码库
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       */#include "su.h"#include "segy.h"/*********************** self documentation ******************************/char *sdoc[] = {"									"," SURELANAN - REsiduaL-moveout semblance ANalysis for ANisotropic media	","									"," surelan refl= npicks=    [optional parameters]			"," 									"," Required parameters:							"," reflector file: reflec =						"," number of points in the reflector file =				"," 									"," Optional Parameters:							"," nr1=51		number of r1-parameter samples   		"," dr1=0.01              r1-parameter sampling interval			"," fr1=-0.25             first value of r1-parameter			"," nr2=51		number of r2-parameter samples   		"," dr2=0.01              r2-parameter sampling interval			"," fr2=-0.25             first value of r2-parameter			"," dzratio=5             ratio of output to input depth sampling intervals"," nsmooth=dzratio*2+1   length of semblance num and den smoothing window"," verbose=0             =1 for diagnostic print on stderr		"," method=linear		for linear interpolation of the interface       "," 			=mono for monotonic cubic interpolation of interface"," 			=akima for Akima's cubic interpolation of interface "," 			=spline for cubic spline interpolation of interface ","									"," Note: 								"," 1. This program is part of Debashish Sarkar's anisotropic model building"," technique. 								"," 2. Input migrated traces should be sorted by cdp - surelan outputs a 	","    group of semblance traces every time cdp changes.  Therefore, the  ","    output will be useful only if cdp gathers are input.  		"," 3. The residual-moveout semblance for cdp gathers is based		","	on z(h)*z(h) = z(0)*z(0) + r1*h^2 + r2*h^4/[h^2+z(0)^2] where z ","	depth and h is the half-offset.   				","									",NULL};/**************** end self doc *******************************************//*  * Trace header fields accessed:  ns, d1, f1, offset, cdp * Trace header fields modified:  ns, d1, offset, cdp */segy tr;int main(int argc, char **argv){	float r1;	float r2;	int nr1;	/* number of r-parameter samples */	int nr2;	/* number of r-parameter samples */	float dr1;	/* r-parameter samples sampling interval */	float dr2;	/* r-parameter samples sampling interval */	float fr1;	/* first r-parameter samples */	float fr2;	/* first r-parameter samples */	int ir1;	/* r-parameter samples index */	int ir2;	/* r-parameter samples index */	int dzratio;	/* ratio of output to input sampling intervals */	int nsmooth;	/* length in samples of num and den smoothing window */	int nz;		/* number of time samples per input trace */	float dz;	/* time sampling interval for input traces */	float fz;	/* time of first sample input and output */	int iz;		/* input depth sample index */	int izi;	/* depth sample index used in linear interpolation */	int is;	float zi;	/* normalized time for linear interpolation */	float frac;	/* fractional distance from sample in interpolation */	int gottrace;	/* =1 if an input trace was read */	int done;	/* =1 if done with everything */	int verbose;	/* =1 for diagnostic print */	int npicks;	/* number of picks made on the reflector */	int ipicks;	long cdp;	/* cdp from current input trace header */	long cdpprev;	/* cdp from previous input trace header */	float half_offset;	/* offset from input trace header */	float roffs2;	float zn;	/* time after residual-moveout */	float nsum;	/* semblance numerator sum */	float dsum;	/* semblance denominator sum */	float temp;	/* temporary scalar */	float Z;	float Zmin;	float *data;	/*array[nz] of input trace */	float *sem;	/*array[nr2] of semblance */	float *xint,*zint,(*zind)[4]; /*arrays storing picked interface */	float *xcdp,*zcdp;	float ***num;	/*array[nr1][nr2][nz] of semblance numerators */	float ***den;	/*array[nr1][nr2][nz] of semblance denominators */	float ***nnz;	/*array[nr1][nr2][nz] for counting non-zero samples */	char *refl;	/*name of the file containing pts picked on the refl.*/	char *method="linear";	FILE *dataptr;  /*pointer to the file containing pts picked on the refl.*/	/* hook up getpar */	initargs(argc,argv);	requestdoc(0);	/* get parameters from the first trace */	if (!gettr(&tr)) err("can't get first trace");	nz = tr.ns;	dz = tr.d1; 	fz = tr.f1;	cdp = tr.cdp;	half_offset = tr.offset/2;	/* get required parameters */	getparstring("refl",&refl);	getparint("npicks",&npicks);	/* get optional parameters */	if (!getparint("nr1",&nr1)) nr1 = 51;	if (!getparint("nr2",&nr2)) nr2 = 51;	if (!getparfloat("dr1",&dr1)) dr1 = 0.01;	if (!getparfloat("dr2",&dr2)) dr2 = 0.01;	if (!getparfloat("fr1",&fr1)) fr1 = -0.25;	if (!getparfloat("fr2",&fr2)) fr2 = -0.25;	if (!getparint("dzratio",&dzratio)) dzratio = 5;	if (!getparint("nsmooth",&nsmooth)) nsmooth = dzratio*2+1;	if (!getparint("verbose",&verbose)) verbose = 0;	getparstring("method",&method);		dataptr=fopen(refl,"r");		/* allocate memory */	data = ealloc1float(nz);	num  = ealloc3float(nsmooth,nr2,nr1);	den  = ealloc3float(nsmooth,nr2,nr1);	nnz  = ealloc3float(nsmooth,nr2,nr1);	sem  = ealloc1float(nr2);	zint = ealloc1float(npicks);	xint = ealloc1float(npicks);	xcdp = ealloc1float(1);        zcdp = ealloc1float(1);                	xcdp[0] = cdp;		/* Input picked interface */                for(ipicks=0;ipicks<npicks;ipicks++)                        fscanf(dataptr,"%f %f\n", &zint[ipicks], &xint[ipicks]);                /* if linear interpolation or only one input sample */                if (method[0]=='l') {                                intlin(npicks,xint,zint,zint[0],zint[npicks-1],                                1,xcdp,zcdp);                /* else, if monotonic interpolation */                } else if (method[0]=='m') {                                zind = (float (*)[4])ealloc1float(npicks*4);                                cmonot(npicks,xint,zint,zind);                                intcub(0,npicks,xint,zind,1,xcdp,zcdp);                /* else, if Akima interpolation */                } else if (method[0]=='a') {                                zind = (float (*)[4])ealloc1float(npicks*4);                                cakima(npicks,xint,zint,zind);                                intcub(0,npicks,xint,zind,1,xcdp,zcdp);                /* else, if cubic spline interpolation */                } else if (method[0]=='s') {                                zind = (float (*)[4])ealloc1float(npicks*4);                                csplin(npicks,xint,zint,zind);                                intcub(0,npicks,xint,zind,1,xcdp,zcdp);                /* else, if unknown method specified */                } else {                        err("%s is an unknown interpolation method!\n",method);                }		Z = zcdp[0];		warn("%f \n",Z);	/* zero accumulators */	for (ir1=0; ir1<nr1; ++ir1) 	for (ir2=0; ir2<nr2; ++ir2) {		for (iz=0; iz<nsmooth; ++iz) {			num[ir1][ir2][iz] = 0.0;			den[ir1][ir2][iz] = 0.0;			nnz[ir1][ir2][iz] = 0.0;		}	}	/* initialize flags */	gottrace = 1;	done = 0;	/* remember previous cdp */	cdpprev = tr.cdp;	/* loop over input traces */	do {		/* if got a trace */		if (gottrace) {			/* determine offset and cdp */			half_offset = tr.offset/2;			cdp = tr.cdp;			/* get trace samples */			memcpy((void *) data, (const void *) tr.data,				nz*sizeof(float));		}		/* if cdp has changed or no more input traces */		if (cdp!=cdpprev || !gottrace) {			/* set output trace header fields */			tr.offset = 0;			tr.cdp = (int) cdpprev;			tr.ns = nr2;			tr.d1 = dr2;			/* loop over r-parameters */			for (ir1=0; ir1<nr1; ++ir1) {				for (ir2=0; ir2<nr2; ++ir2) {				/* compute semblance quotients */					nsum = dsum = 0.0;					for (is=0; is<nsmooth; ++is) {						nsum += num[ir1][ir2][is]*							num[ir1][ir2][is];						dsum += nnz[ir1][ir2][is]*							den[ir1][ir2][is];					}					sem[ir2] = (dsum!=0.0?nsum/dsum:0.0);					/*warn("%f \n",sem[ir2]);*/				}				/* output semblances */				memcpy((void *) tr.data,(const void *) sem,					nr2*sizeof(float));				puttr(&tr);			}			/* diagnostic print */			if (verbose) 				warn("tsemblance output for cdp=%d\n",cdpprev);			/* if no more input traces, break input trace loop */			if (!gottrace) break;			/* remember previous cdp */			cdpprev = cdp;		}		/* loop over residual moveouts */		for (ir1=0,r1=fr1; ir1<nr1; ++ir1,r1+=dr1) 		for (ir2=0,r2=fr2; ir2<nr2; ++ir2,r2+=dr2) { 						/* compute hyperbolic and nonhyperbolic terms */			roffs2 = r1*half_offset*half_offset+r2*pow(half_offset,4)/(pow(half_offset,2)+pow(Z,2));			/* determine mute depth after rmo */			Zmin=Z-((nsmooth-1)*dz/2);			/* do rmo via linear interpolation and  */			/* accumulate semblance numerator and denominator */			for (iz=0,zn=Zmin; iz<nsmooth; ++iz,zn+=dz) {				temp = zn*zn+roffs2;				zi = (temp>fz*fz)?(sqrt(temp)-fz)/dz:0;				izi = zi; /* izi is `int' and zi is `float' */				if (izi<nz-1) {					frac = zi-izi;					temp = (1.0-frac)*data[izi]+						frac*data[izi+1];					if (temp!=0.0) {						num[ir1][ir2][iz] += temp;						den[ir1][ir2][iz] += temp*temp;						nnz[ir1][ir2][iz] += 1.0;					}			    	}			}		}			/* get next trace (if there is one) */		if (!gettr(&tr)) gottrace = 0;	} while (!done);	return(CWP_Exit());}

⌨️ 快捷键说明

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