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

📄 suimp3d.c

📁 seismic software,very useful
💻 C
字号:
/* SUIMP3D: $Revision: 1.6 $ ; $Date: 90/11/15 10:43:33 $	*//*---------------------------------------------------------------------- * Copyright (c) Colorado School of Mines, 1990. * All rights reserved. * * This code is part of SU.  SU stands for Seismic Unix, a processing line * developed at the Colorado School of Mines, partially based on Stanford * Exploration Project (SEP) software.  Inquiries should be addressed to: * *  Jack K. Cohen, Center for Wave Phenomena, Colorado School of Mines, *  Golden, CO 80401  (jkc@dix.mines.colorado) *---------------------------------------------------------------------- */#include "su.h"#include "segy.h"/*********************** self documentation **************/string sdoc = "\							\n\SUIMP3D - generate shot records for a point scatterer	\n\							\n\suimp3d [optional parameters] >stdout 			\n\							\n\Optional parameters					\n\	nshot=1		number of shots			\n\	nrec=1		number of receivers		\n\	c=5000		speed				\n\	dt=.004		sampling rate			\n\	nt=256		number of samples		\n\	x0=1000		point scatterer location	\n\	z0=1000		point scatterer location	\n\	sxmin=0		first shot location		\n\	szmin=0		first shot location		\n\	gxmin=0		first receiver location		\n\	gzmin=0		first receiver location		\n\	dsx=100		x-step in shot location		\n\	dsz=0	 	z-step in shot location		\n\	dgx=100		x-step in receiver location	\n\	dgz=0		z-step in receiver location	\n\							\n\";/**************** end self doc ***************************//* Credits: *	CWP: Norm, Jack * */#define LOOKFAC	2	/* Look ahead factor for npfao	  */#define PFA_MAX	720720	/* Largest allowed nfft	          */segy tr;main(int argc, char **argv){	float c;		/* speed			*/	float dt;		/* sampling rate		*/	int nt;			/* number of samples		*/	int ntsize;		/* ... in bytes			*/	int nshot;		/* number of shots		*/	int nrec;		/* number of receivers		*/	float x0, z0;		/* point scatterer location	*/	float sxmin, szmin;	/* first shot location		*/	float gxmin, gzmin;	/* first receiver location	*/	float dsx;		/* x-step in shot location	*/	float dsz;		/* z-step in shot location	*/	float dgx;		/* x-step in receiver location	*/	float dgz;		/* z-step in receiver location	*/	float sx, sz;		/* shot location		*/	float gx, gz;		/* receiver location		*/	float rs;		/* distance to shot		*/	float rg;		/* distance to receiver		*/	float d;		/* rs + rg			*/	float t;		/* total travel time		*/	int jt;			/* (int) arrival time on trace	*/	float k;		/* constant part of response	*/	register float *rt;	/* real trace			*/	register complex *ct;	/* complex transformed trace	*/	int nfft;		/* size of fft 			*/	int nfby2;		/* nfft/2			*/	int nfby2p1;		/* nfft/2 + 1			*/	int nzeros;		/* padded zeroes in bytes	*/	float spread;		/* 3-D spreading factor		*/	float isq;		/* temp for omega squared	*/	register int i;		/* counter			*/	register int s;		/* shot counter			*/	register int g;		/* receiver counter		*/	/* Initialize */	initargs(argc, argv);	askdoc(0);	/* Get parameters */	if (!igetpar("nshot", &nshot))		nshot = 1;	if (!igetpar("nrec", &nrec))		nrec  = 1;	if (!igetpar("nt", &nt))		nt    = 256;	if (!fgetpar("c", &c))			c     = 5000.0;	if (!fgetpar("dt", &dt))		dt    = 0.004;	if (!fgetpar("x0", &x0))		x0    = 1000.0;	if (!fgetpar("z0", &z0))		z0    = 1000.0;	if (!fgetpar("sxmin", &sxmin))		sxmin = 0.0;	if (!fgetpar("szmin", &szmin))		szmin = 0.0;	if (!fgetpar("gxmin", &gxmin))		gxmin = 0.0;	if (!fgetpar("gzmin", &gzmin))		gzmin = 0.0;	if (!fgetpar("dsx", &dsx))		dsx   = 100.0;	if (!fgetpar("dsz", &dsz))		dsz   = 0.0;	if (!fgetpar("dgx", &dgx))		dgx   = 100.0;	if (!fgetpar("dgz", &dgz))		dgz   = 0.0;	/* Set the constant header fields */	tr.ns = nt;	tr.dt = dt * 1000000.0;	ntsize = nt * FSIZE;	/* Set up for fft */	nfft = npfaro(nt, LOOKFAC * nt);	if (nfft >= MIN(SU_NFLTS, PFA_MAX))		err("Padded nt=%d -- too big", nfft);	nfby2 = nfft / 2;	nfby2p1 = nfby2 + 1;	nzeros = (nfft - nt) * FSIZE;	/* Allocate fft arrays */	rt   = ealloc1float(nfft);	ct   = ealloc1complex(nfby2p1);	/* Set the constant in the response amplitude	   including scale for inverse fft below      */	k = (double) nfft / (4.0 * c * c * dt * dt * dt);	/* Create the traces */	for (s = 0; s < nshot; ++s) {	/* loop over shots */		sx = sxmin + s * dsx;		sz = szmin + s * dsz;		tr.sx = sx;		tr.sy = sz;		rs = sqrt((sx - x0)*(sx - x0) + (sz - z0)*(sz - z0));		for (g = 0; g < nrec; ++g) {	/* loop over receivers */			bzero(tr.data, ntsize);			gx = gxmin + g * dgx;			gz = gzmin + g * dgz;			rg = sqrt((gx - x0)*(gx - x0) + (gz - z0)*(gz - z0));			d = rs + rg;			t = d/c;			jt = t/dt;			spread = rs*rg;			/* Distribute response over two surrounding samples */			tr.data[jt] = k * ((jt + 1)*dt - t)/spread;			tr.data[jt + 1] = k * (t - jt*dt)/spread;			/* Load trace into rt (zero-padded) */			memcpy((char*)rt, (char*)tr.data, ntsize);			bzero(rt + nt, nzeros);			/* FFT */			pfarc(1, nfft, rt, ct);			/* Multiply by omega^2 */			for (i = 0; i < nfby2p1; ++i)				ct[i] = crmul(ct[i], i*i);			/* Invert and take real part */			pfacr(-1, nfft, ct, rt);			/* Load traces back in */			memcpy((char*)tr.data, (char*)rt, ntsize);			tr.gx = gx;			tr.gy = gz;			tr.tracl = s*nrec + g + 1;			tr.offset = gx - sx;	/* for surface surveys */			tr.cdp = 0.5*(gx + sx);	/* for surface surveys */			puttr(&tr);		} /* end loop on receivers */	} /* end loop on shots */	return EXIT_SUCCESS;}

⌨️ 快捷键说明

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