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

📄 suvelan_uccs.c

📁 su 的源代码库
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       *//* SUVELAN_UCCS : $Revision: 1.5 $ ; $Date: 2006/11/07 22:58:42 $	*/#include "su.h"#include "segy.h"#include "string.h"/*********************** self documentation **********************************/char *sdoc[] = {"									     "," SUVELAN_UCCS - compute stacking VELocity panel for cdp gathers	     ","		using UnNormalized CrossCorrelation Sum 	             ","									     "," suvelan_uccs <stdin >stdout [optional parameters]			     ","									     "," Optional Parameters:							     "," nx=tr.cdpt              number of traces in cdp 			     "," nv=50                   number of velocities				     "," dv=50.0                velocity sampling interval			     "," fv=1500.0               first velocity				     "," smute=1.5               samples with NMO stretch exceeding smute are zeroed"," dtratio=5               ratio of output to input time sampling intervals   "," nsmooth=dtratio*2+1     length of smoothing window                         "," verbose=0               =1 for diagnostic print on stderr		     "," pwr=1.0                 semblance value to the power      		     ","									     ","Notes:									     "," Unnormalized crosscorrelation sum: sum all possible crosscorrelation trace "," pairs in a CMP gather for each trial velocity and zero-offset two-way      "," travel time inside a time window. This unnormalized coherency measure      "," produces large spectral amplitudes for strong reflections and small        "," spectral amplitudes for weaker ones. If M is the number of traces in the   "," CMP gather M(M-1)/2 is the total number of crosscorrelations for each trial"," velocity and zero-offset two-way traveltime.			 	     ",NULL};/*  * Credits: CWP: Valmore Celis, Sept 2002	 *  * Based on the original code: suvelan.c  *    Colorado School of Mines:  Dave Hale c. 1989 * * * Reference: Neidell, N.S., and Taner, M.T., 1971, Semblance and other  *            coherency measures for multichannel data: Geophysics, 36, 498-509. * * Trace header fields accessed:  ns, dt, delrt, offset, cdp * Trace header fields modified:  ns, dt, offset, cdp *//**************** end self doc *******************************************/segy tr;intmain(int argc, char **argv){	int nx; 	/* number of traces in the cmp gather */	int ix;		/* trace number index */ 	int nv;		/* number of velocities */	float dv;	/* velocity sampling interval */	float fv;	/* first velocity */	float fac;	/* cumulative product of traces in window (ismin,ismax) */	float ff;	/* sum over time window (ismin,ismax) */	int iv;		/* velocity index */	int dtratio;	/* ratio of output to input sampling intervals */	int nsmooth;	/* length in samples of smoothing window */	int nt;		/* number of time samples per input trace */	float dt;	/* time sampling interval for input traces */	float ft;	/* time of first sample input and output */	int ntout;	/* number of output samples */	float dtout;	/* time sampling interval for output traces */	int it;		/* input time sample index */	int itout;	/* output time sample index */	int is;		/* time sample index for smoothing window */	int ismin;	/* lower limit on is */	int ismax;	/* upper limit on is */	int itmute;	/* time sample index of first sample not muted */	int iti;	/* time sample index used in linear interpolation */	float ti;	/* normalized time for linear interpolation */	float frac;	/* fractional distance from sample in interpolation */	int gottrace;	/* =1 if an input trace was read */	int verbose;	/* =1 for diagnostic print */	long cdp;	/* cdp from current input trace header */	long cdpprev;	/* cdp from previous input trace header */	float smute;	/* NMO stretch mute factor */	float offset;	/* offset from input trace header */	float offovs;	/* (offset/velocity)^2 */	float tn;	/* time after NMO */	float tnmute;	/* mute time after NMO */	float nsum;	/* actual trace in the time window (ismin,ismax) */	float dsum;	/* trace accumulation */	float v;	/* velocity */	float *aoff;	/* array[nt] of input trace offsets */	float *sem;	/* array[ntout] of semblance */	float **datm;	/* array[nt][nx] of input traces */	float **datn;	/* array[nt][nx] of traces with NMO correction*/	float pwr;      /* power of semblance */	/* hook up getpar */	initargs(argc,argv);	requestdoc(0);	/* get parameters from the first trace */	if (!gettr(&tr)) err("can't get first trace");	nt = tr.ns;	dt = ((double) tr.dt)/1000000.0;	ft = tr.delrt/1000.0;	cdp = tr.cdp;	/* get optional parameters */	if (!getparint("nx",&nx)) nx = tr.cdpt;	if (!getparint("nv",&nv)) nv = 50;	if (!getparfloat("dv",&dv)) dv = 100.0;	if (!getparfloat("fv",&fv)) fv = 1500.0;	if (!getparfloat("smute",&smute)) smute = 1.5;	if (smute<=1.0) err("smute must be greater than 1.0");	if (!getparint("dtratio",&dtratio)) dtratio = 5;	if (!getparint("nsmooth",&nsmooth)) nsmooth = dtratio*2+1;	if (!getparint("verbose",&verbose)) verbose = 0;	if (!getparfloat("pwr",&pwr)) pwr = 1.0;	if (pwr < 0.0)   	  err("we are not looking for noise: pwr < 0");	if (pwr == 0.0)   	  err("we are creating an all-white semblance: pwr = 0");	/* determine output sampling */	ntout = 1+(nt-1)/dtratio;   CHECK_NT("ntout",ntout);	dtout = dt*dtratio;	if (verbose) {		fprintf(stderr,			"\tnumber of output time samples is %d\n",ntout);		fprintf(stderr,			"\toutput time sampling interval is %g\n",dtout);		fprintf(stderr,			"\toutput time of first sample is %g\n",ft);	}	/* allocate memory */	aoff = ealloc1float(nx);	datm = ealloc2float(nt,nx);	datn = ealloc2float(nt,nx);	sem = ealloc1float(ntout);	/* zero accumulators */	memset((void *) datm[0], 0, FSIZE*nt*nx);	memset((void *) datn[0], 0, FSIZE*nt*nx);	/* initialize flag */	gottrace = 1;	/* remember previous cdp */	cdpprev = tr.cdp;        ix = 0; 	/* loop over input traces */	while (gottrace|(~gottrace)/*True*/) { /* middle exit loop */		/* if got a trace */		if (gottrace) {			/* determine offset and cdp */			offset = tr.offset;			aoff[ix] = offset;			cdp = tr.cdp;			/* get trace samples */			memcpy( (void *) datm[ix],				(const void *) tr.data,nt*sizeof(float));			++ix;		}		/* if cdp has changed or no more input traces */		if (cdp!=cdpprev || !gottrace) {		/*  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  */		for (iv=0,v=fv; iv<nv; ++iv,v+=dv) {			for (ix=0;ix<nx;++ix) {                        /* compute offset/velocity squared */                        offovs = (aoff[ix]*aoff[ix])/(v*v);                        /* determine mute time after nmo */                        tnmute = sqrt(offovs/(smute*smute-1.0));                        if (tnmute > ft) {                                itmute = (tnmute-ft)/dt;                        } else {                                itmute = 0 ;                        }                        /* do nmo via quick and dirty linear interpolation                           (accurate enough for velocity analysis) */ 						for (it=itmute,tn=ft+itmute*dt; it<nt; ++it,tn+=dt) {                                ti = (sqrt(tn*tn+offovs)-ft)/dt;                                iti = ti;                                if (iti<nt-1) {                                        frac = ti-iti;                                        datn[ix][it] = (1.0-frac)*datm[ix][iti]+                                                frac*datm[ix][iti+1];                                        }                                }                        }			for (itout=0; itout<ntout; ++itout) {                                it = itout*dtratio;                                ismin = it-nsmooth/2;                                ismax = it+nsmooth/2;                                if (ismin<0) ismin = 0;                                if (ismax>nt-1) ismax = nt-1;                                ff = 0.0;                                for (is=ismin; is<ismax; ++is) {                                        nsum = dsum = fac = 0.0;				        for (ix=0;ix<nx;++ix) {                                                nsum = datn[ix][is];						dsum = dsum + nsum;						fac  = fac + nsum*dsum;                                        }					ff  = ff + fac;                                 }			sem[itout]=ff;  			}			/* set output trace header fields */			tr.offset = 0;			tr.cdp = (int) cdpprev;			tr.ns = ntout;			tr.dt = dtout*1000000.0;		/* output semblance */			memcpy((void *) tr.data,                       	       (const void *) sem,ntout*sizeof(float));                	puttr(&tr);		}		/*  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  */			/* diagnostic print */			if (verbose) 				warn("semblance output for cdp=%d",cdpprev);			/* if no more input traces, break input trace loop */			if (!gottrace) break;			/* remember previous cdp */			cdpprev = cdp;		}		/* get next trace (if there is one) */		if (!gettr(&tr)) gottrace = 0;	}	return(CWP_Exit());}

⌨️ 快捷键说明

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