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

📄 suinterp.c

📁 su 的源代码库
💻 C
📖 第 1 页 / 共 2 页
字号:
Author: John Anderson (visitor to CSM from Mobil) Spring 1993*******************************************************************/{	int	ntfft,ntfftny,n2fft,n2fftny,j,k,ixm;	long	ix,it,ntlong,n2long;	float	df,dff,wa,wb,dxx,eps=1.0e-30,f,fcl,fch;	float 	*rt,*rrt,*a,*b,*p,*time,*aa,*bb,*save,*tin=NULL;	complex	*crt,*ccrt;	VND	*vnda,*vndb;	char 	*file;	ntlong=nt;	n2long=n2;	lent=1+2*(lent/2);	len2=1+2*(len2/2);	lagc=1 + lagc*0.001/dt;	ntfft=npfar(nt);	ntfftny=1+ntfft/2;	n2fft=npfar(n2);	n2fftny=1+n2fft/2;	df=1./(ntfft*dt);	crt = (complex *)VNDemalloc( MAX(ntfftny,n2fftny)*sizeof(complex),		"jea_xinterpolate:allocating crt" );	rt = (float *)crt;	if(n2<2 || (iopt==0 && ninterp==0) ) {	    	for(ix=0;ix<n2;ix++) {			V2Dr0(vndorig,ix,(char *)rt,101);				V2Dw0(vndinterp,ix,(char *)rt,102);		}		free(crt);		return;	}	ccrt = (complex *)VNDemalloc( ntfftny*sizeof(complex),		"jea_xinterpolate:allocating ccrt" );	rrt = (float *)ccrt;	a =  (float *)VNDemalloc( MAX(n2,nt)*sizeof(float),		"jea_xinterpolate:allocating a" );	b =  (float *)VNDemalloc( MAX(n2,nt)*sizeof(float),		"jea_xinterpolate:allocating b" );	p =  (float *)VNDemalloc( nt*sizeof(float),		"jea_xinterpolate:allocating p" );	time =  (float *)VNDemalloc( nt*sizeof(float),		"jea_xinterpolate:allocating time" );	aa =  (float *)VNDemalloc( MAX(n2,nt)*sizeof(float),		"jea_xinterpolate:allocating aa" );	bb =  (float *)VNDemalloc( MAX(n2,nt)*sizeof(float),		"jea_xinterpolate:allocating bb" );	if(linear) {		tin=(float *)VNDemalloc(nt*sizeof(float),			"jea_xinterpolate: allocating tin");		for(j=0;j<nt;j++) tin[j]=j;	}	file=VNDtempname("suinterp");	vnda  = V2Dop(2,500000,sizeof(float),file,ntlong,n2long);	VNDfree(file,"file");	file=VNDtempname("suinterp");	vndb  = V2Dop(2,500000,sizeof(float),file,ntlong,n2long);	VNDfree(file,"file");	/* loop computing filtered data for picking purposes in vnda */	/* compute time derivative of filtered data in vndb */	dff=2.*PI/ntfft;	for(ix=0;ix<n2;ix++) {		V2Dr0(vndorig,ix,(char *)rt,103);		for(j=0;j<nt;j++) a[j]=fabs(rt[j]);		runav(nt,lagc,a,b);		runav(nt,lagc,b,a);		for(j=0;j<nt;j++) rt[j]=rt[j]/(a[j]+eps);			for(j=nt;j<ntfft;j++) rt[j]=0.;		if(deriv) {			for(j=nt-1;j>0;j--){				rt[j]=rt[j]-rt[j-1];			}			rt[0]=rt[1];		}		pfarc(1,ntfft,rt,crt);		if(freq1>0.){			for(j=0;j<ntfftny;j++){				f=j*df;				fcl=(f/freq1);				fcl=fcl*fcl*fcl*fcl;				fch=(f/freq2);				fch=fch*fch*fch*fch;				f=fcl/( (1.+fcl)*(1.+fch) );				crt[j]=crmul(crt[j],f);				ccrt[j]=cmul(crt[j],cmplx(0.,-j*dff));			}		}else{			for(j=0;j<ntfftny;j++){				f=j*df;				fch=(f/freq2);				f=1./(1.+fch*fch*fch*fch);				crt[j]=crmul(crt[j],f);				ccrt[j]=cmul(crt[j],cmplx(0.,-j*dff));			}		}		pfacr(-1,ntfft,crt,rt); 		V2Dw0(vnda,ix,(char *)rt,104);		pfacr(-1,ntfft,ccrt,rrt); 		V2Dw0(vndb,ix,(char *)rrt,105);	} 	if(iopt==1){		for(ix=0;ix<n2;ix++){			V2Dr0(vnda,ix,(char *)rt,104);			V2Dw0(vndinterp,ix,(char *)rt,104);		}		VNDcl(vnda,1);		VNDcl(vndb,1);		VNDfree(crt,"jea_xinterpolate: crt");		VNDfree(ccrt,"jea_xinterpolate: ccrt");		VNDfree(a,"jea_xinterpolate: a");		VNDfree(b,"jea_xinterpolate: b");		VNDfree(p,"jea_xinterpolate: p");		VNDfree(time,"jea_xinterpolate: time");		VNDfree(aa,"jea_xinterpolate: aa");		VNDfree(bb,"jea_xinterpolate: bb");		if(linear) VNDfree(tin,"jea_xinterpolate: tin");		return;	}	/* loop computing spatial derivative of data for picking purposes*/	n2fft=npfar(n2);	n2fftny=1+n2fft/2;	dxx=2.*PI/(n2fft*n2fft);	if(n2<16) xopt=1;	for(it=0;it<nt;it++) {		V2Dr1(vnda,it,(char *)rt,106);		if(xopt) {			for(j=0;j<n2-1;j++) rt[j]=rt[j+1]-rt[j];			rt[n2-1]=rt[n2-2];		}else{			for(j=n2;j<n2fft;j++) rt[j]=0.;			pfarc(1,n2fft,rt,crt);			for(j=0;j<n2fftny;j++){				crt[j]=cmul(crt[j],cmplx(0.,-j*dxx));			}			pfacr(-1,n2fft,crt,rt); 		}		V2Dw1(vnda,it,(char *)rt,107);	} 	/* compute dot products and smooth over time */	for(ix=0;ix<n2;ix++) {		V2Dr0(vnda,ix,(char *)a,108);		V2Dr0(vndb,ix,(char *)b,109);		for(it=0;it<nt;it++) {			aa[it]=a[it]*b[it];			bb[it]=b[it]*b[it];		}		runav(nt,lent,aa,a);		runav(nt,lent,a,aa);		runav(nt,lent,bb,b);		runav(nt,lent,b,bb);		V2Dw0(vnda,ix,(char *)aa,110);		V2Dw0(vndb,ix,(char *)bb,111);	}	/* smooth dot products in x */	if(len2>1){	    for(it=0;it<nt;it++) {		V2Dr1(vnda,it,(char *)a,112);		V2Dr1(vndb,it,(char *)b,113);		runav(n2,len2,a,aa);		runav(n2,len2,aa,a);		runav(n2,len2,b,bb);		runav(n2,len2,bb,b);		V2Dw1(vnda,it,(char *)a,114);		V2Dw1(vndb,it,(char *)b,115);	    }	}	/* loop computing p, interpolating, and outputting results */	V2Dr0(vndorig,0,(char *)a,116);	for(ix=1;ix<n2;ix++) {		ixm=((int) (ix-1));		V2Dr0(vnda,ixm,(char *)aa,117);		V2Dr0(vndb,ixm,(char *)bb,118);		for(it=0;it<nt;it++) {			p[it] = - aa[it]/( bb[it] + eps );		}		V2Dr0(vndorig,ix,(char *)b,119);		if(iopt==2) {			V2Dw0(vndinterp,ixm,(char *)p,120);			/* don't output dip picks except on original traces */		}else{			V2Dw0(vndinterp,ixm*(ninterp+1),(char *)a,120);			for(k=0;k<ninterp;k++){				wa=(1.+k)/(1+ninterp);				wb=1.-wa;				for(it=0;it<nt;it++) time[it] = ((float ) it) - p[it]*wa;				if(linear){					intlin(nt,tin,a,a[0],a[nt-1],nt,					       time,aa);				}else{							ints8r(nt,1.0,0.,a,0.0,0.0,nt,time,aa);				}				for(it=0;it<nt;it++) time[it] = ((float ) it) + p[it]*wb;				if(linear){					intlin(nt,tin,a,a[0],a[nt-1],nt,					       time,bb);				}else{							ints8r(nt,1.0,0.,b,0.0,0.0,nt,time,bb);				}				for(it=0;it<nt;it++)					aa[it]=wb*aa[it]+wa*bb[it];				V2Dw0(vndinterp,k+1+ixm*(ninterp+1),				      (char *)aa,121);			}		}		save=a;		a=b;		b=save;  	} 	if(iopt==2) {		V2Dw0(vndinterp,n2-1,(char *)p,122);	}else{		V2Dw0(vndinterp,(n2-1)*(ninterp+1),(char *)a,122);	}/* close files, free temporary memory, and return results in file vndinterp */	VNDcl(vnda,1);	VNDcl(vndb,1);	VNDfree(crt,"jea_xinterpolate: crt");	VNDfree(ccrt,"jea_xinterpolate: ccrt");	VNDfree(a,"jea_xinterpolate: a");	VNDfree(b,"jea_xinterpolate: b");	VNDfree(p,"jea_xinterpolate: p");	VNDfree(time,"jea_xinterpolate: time");	VNDfree(aa,"jea_xinterpolate: aa");	VNDfree(bb,"jea_xinterpolate: bb");	if(linear) VNDfree(tin,"jea_xinterpolate: tin");	return;}void runav(int n,int len,float *a,float *b)/*compute a boxcar running average filterint n   	number of samples in a[] and b[]int len 	length of running average in samplesfloat a[n]	input arrayfloat b[n]	output array*******************************************************************Author: John Anderson (visitor to CSM from Mobil) Spring 1993*******************************************************************/{	float sum=0.;	int j,lenh=len/2;	if(len<=1) {		for(j=0;j<n;j++) b[j]=a[j];		return;	}	for(j=0;j<MIN(len,n);j++) sum+=a[j];	for(j=0;j<MIN(lenh+1,n);j++) b[j]=sum;	for(j=lenh+1;j<n-lenh;j++) {		sum=sum+a[j+lenh]-a[j-lenh-1];		b[j]=sum;	}	for(j=MAX(0,n-lenh);j<n;j++) b[j]=sum;	sum=1./len;	for(j=0;j<n;j++) b[j]*=sum;	return;}/* for graceful interrupt termination */static void closefiles(void){	efclose(headerfp);	eremove(headerfile);	exit(EXIT_FAILURE);}

⌨️ 快捷键说明

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