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

📄 suvautop.c

📁 seismic software,very useful
💻 C
📖 第 1 页 / 共 2 页
字号:
			}			sem[ip+i1*np] = (dsum!=0.0?nsum/dsum:0.0);		}		for(ip=1;ip<np-1;ip++) {			wk[ip] = .5*sem[ip+i1*np]+.5*(sem[ip-1+i1*np]+sem[ip+1+i1*np]);  		}		wk[0] = 0.75*sem[i1*np]+0.25*sem[1+i1*np];		wk[np-1] = 0.75*sem[np-1+i1*np]+0.25*sem[np-2+i1*np];		for(ip=0;ip<np;ip++) sem[ip+i1*np] = wk[ip];	}	free(wk);	if(qcsemb==1) dump2xplotn(sem,np,n1,0,"semblance",		op*100.,o1,dp*100.,d1,"percentage of Vrms","time","solid","solid");	wk = (float *) emalloc(n1*sizeof(float));	for(ip=0;ip<np;ip++) {		for(i1=0;i1<n1;i1++) wk[i1] = sem[ip+i1*np];		for(i1=1;i1<n1-1;i1++) {			sem[ip+i1*np] = .5*wk[i1]+.25*(wk[i1-1]+wk[i1+1]);		}		sem[ip] = 0.75*wk[0] + 0.25*wk[1];		sem[ip+(n1-1)*np] = 0.75*wk[n1-1] + 0.25*wk[n1-2];	}	free(wk);}void vapick(float *sem, int np, int n1, float op, float dp,	float o1, float d1, float twb, float *vi, 	float *vo, int votype, float alpha, 	float pvimin, float pvimax, int itout, float *to, 	int *ntout, int qcsemb, int invr) {	int *ippp;	int i1, iw, ip0, ip;	int ipp;	float tmp, vr2t, p0, phigh;	float t, smax, dpmmax, dppmax, dvmmax, dvpmax, v2l, v2h, obj;	float v0, v2, p, rdp, rdv;  	float *wk;	float *pm1, *pm2, *pp, *vr2p;	float *sm1, *sm2;	float *vr2m1, *vr2m2;	int ip1, ip2, nn1;	float m1, m2, s1, s2, p1, p2;	float s, tabove, vr2above, vr2;	int i1above, i, *i1m;	int *indx, *ii, *jj, j;	float *a;	float zero;	int n2, i2;	tmp = (twb - o1)/d1+0.5;	iw = tmp;	wk = (float*) emalloc(n1*sizeof(float));	ippp = (int*) emalloc(n1*sizeof(int));	pm1 = (float*) emalloc(n1*sizeof(float));	pm2 = (float*) emalloc(n1*sizeof(float));	pp = (float*) emalloc(n1*sizeof(float));	vr2p = (float*) emalloc(n1*sizeof(float));	sm1 = (float*) emalloc(n1*sizeof(float));	sm2 = (float*) emalloc(n1*sizeof(float));	vr2m1 = (float*) emalloc(n1*sizeof(float));	vr2m2 = (float*) emalloc(n1*sizeof(float));	i1m = (int*) emalloc(n1*sizeof(int));	indx = (int*) emalloc(n1*sizeof(int));	a = (float*) emalloc(n1*sizeof(float));	ii = (int*) emalloc(n1*sizeof(int));	jj = (int*) emalloc(n1*sizeof(int));	/* compute Vrms**2 */	wk[0] = vi[0]*vi[0];	tmp = wk[0]*o1;	for(i1=1;i1<n1;i1++) {		tmp = tmp + vi[i1]*vi[i1]*d1;		wk[i1] = tmp/(o1+i1*d1);	}	tmp = (1.-op)/dp+0.5;	ip0 = tmp;	if(ip0<0) ip0 = 0;	if(ip0>np-1) ip0 = np-1;	p0 = op + ip0*dp;	phigh = op+(np-1)*dp;	/* give more weights to the semblance at the initial velocity */	for (i1=0;i1<n1;i1++) {		sem[ip0+i1*np] *= (1.+alpha);		if(ip0-1>=0) sem[ip0-1+i1*np] *= (1.+alpha*.5);		if(ip0+1<np) sem[ip0+1+i1*np] *= (1.+alpha*.5);	}	for(i1=0;i1<=iw;i1++) vo[i1] = vi[i1];	for(i1=0;i1<n1;i1++) ippp[i1] = ip0;	/* find local maximum */	nn1 = 0;	for(i1=iw+1;i1<n1-1;i1++) {		m1 = 0.;		m2 = 0.;		ip1 = -1;		ip2 = -1;		for(ip=1;ip<np;ip++) {			tmp = sem[ip+i1*np];			if(tmp>sem[ip-1+i1*np] && tmp>sem[ip+1+i1*np] && 				   tmp>sem[ip+(i1-1)*np] && tmp>sem[ip+(i1+1)*np] ) {				if(tmp>m1) {					m1 = tmp; ip1 = ip;					m2 = m1; ip2 = ip1;				} else if(tmp>m2) {					m2 = tmp; ip2 = ip;				}			}		}		if(ip1>1) {			findp(sem,np,n1,ip1,i1,op,dp,&s,&p);			pm1[nn1] = p;			sm1[nn1] = s;			i1m[nn1] = i1;			vr2m1[nn1] = wk[i1] * p*p;			if(ip2>1) {				findp(sem,np,n1,ip2,i1,op,dp,&s,&p);				pm2[nn1] = p; 				sm2[nn1] = s; 				vr2m2[nn1] = wk[i1]*p*p;			} else {				pm2[nn1] = -999.; 			}			nn1 = nn1+1;		}	}/*	for(i=0;i<nn1;i++) fprintf(stderr,"i=%d i1m=%d \n",i,i1m[i]);*/	/* find largest semblance locations */	for(i=0;i<nn1;i++) {		indx[i] = i;		a[i] = - sm1[i];	}	qkisort(nn1,a,indx);		ii[0] = i1m[indx[0]];	jj[0] = indx[0];	i1 = 1;	for(i=1;i<nn1;i++) {		t = i1m[indx[i]];		for(j=0;j<i1;j++) {			tmp = t - ii[j];			tmp = fabs(tmp);			if(tmp<=5) break;			if(j==i1-1) {				ii[i1] = i1m[indx[i]];				jj[i1] = indx[i];				i1 = i1 + 1;			}		}	}	nn1 = i1;/*	for(i=0;i<nn1;i++) {		fprintf(stderr,"i1=%d jj=%d \n",ii[i],jj[i]);	}*/	for(i=0;i<nn1;i++) {		a[i] = ii[i];		indx[i] = i;	}	qkisort(nn1,a,indx);	for(i=0;i<nn1;i++) i1m[i] = ii[indx[i]];		/*	for(i=0;i<nn1;i++) fprintf(stderr,"i1=%d jj=%d \n",i1m[i],jj[indx[i]]);	*/	for(i=0;i<nn1;i++) a[i] = sm1[jj[indx[i]]];	for(i=0;i<nn1;i++) sm1[i] = a[i];	for(i=0;i<nn1;i++) a[i] = pm1[jj[indx[i]]];	for(i=0;i<nn1;i++) pm1[i] = a[i];	for(i=0;i<nn1;i++) a[i] = vr2m1[jj[indx[i]]];	for(i=0;i<nn1;i++) vr2m1[i] = a[i];	for(i=0;i<nn1;i++) a[i] = sm2[jj[indx[i]]];	for(i=0;i<nn1;i++) sm2[i] = a[i];	for(i=0;i<nn1;i++) a[i] = pm2[jj[indx[i]]];	for(i=0;i<nn1;i++) pm2[i] = a[i];	for(i=0;i<nn1;i++) a[i] = vr2m2[jj[indx[i]]];	for(i=0;i<nn1;i++) vr2m2[i] = a[i];	tmp = (1.-op)/dp+0.5;	ip0 = tmp;	vr2p[0] = wk[iw];	vr2above = wk[iw];	tabove = o1 + iw*d1;	i1above = iw;	/* auto pick the velocity */	for(i=0;i<nn1;i++) {		i1 = i1m[i];		t = o1 + i1*d1;		tmp = (wk[i1]*t-wk[i1above]*(o1+i1above*d1))/(t-o1-i1above*d1);		v2l = tmp * pvimin;		v2h = tmp * pvimax;		smax =  sm1[i];		vr2 = vr2m1[i];		v2 = (vr2*t - vr2above*tabove)/(t-tabove);		p = pm1[i];/*		fprintf(stderr,"i1=%d v2l=%g v2h=%g vi=%g \n",i1,v2l,v2h,sqrt(tmp));		fprintf(stderr,"i1=%d p=%g t=%g tab=%g vr2=%g vr2ab=%g v2=%g \n",			i1,p,t,tabove,vr2,vr2above,v2);*/		if( (v2<v2l || v2>v2h) && pm2[i] != -999. ) {			smax =  sm2[i];			vr2 = vr2m2[i];			v2 = (vr2*t - vr2above*tabove)/(t-tabove);			p = pm2[i];		}		if(invr==1 || vr2>vr2above ) {			if(v2>=v2l && v2<=v2h) {				vr2p[i] = vr2; 				pp[i] = p;			} else {				vr2p[i] = wk[i1];				pp[i] = 1.0;			}			vr2above = vr2p[i];			tabove = t;			i1above = i1;		} else {			i1m[i] = -1;		}	}	i = 0;	for(i1=0;i1<nn1;i1++) {		if(i1m[i1]!=-1) {			i1m[i] = i1m[i1];			vr2p[i] = vr2p[i1];			pp[i] = pp[i1];			i = i + 1;		}	}	nn1 = i;/* linear interpolation of rms velocity */	/* time and rms velocity at large semblance picks */	for(i1=0;i1<nn1;i1++) {		pm1[i1] = o1 + i1m[i1]*d1;		sm1[i1] = sqrt(vr2p[i1]); 	}	/* linearly interpolate the picks to input velocity grid times */	for(i1=0;i1<n1;i1++) pm2[i1] = o1 + i1*d1;	tmp = (sm1[nn1-1] - sm1[nn1-2])/(pm1[nn1-1]-pm1[nn1-2]);	zero = 0.;	lin1dn_(pm1,sm1,&nn1,pm2,sm2,&n1,indx,&zero,&tmp);	/* compute vrms*vrms*t and vrms */	vr2t = vo[iw]*vo[iw]*(o1+iw*d1);	for(i1=iw+1;i1<n1;i1++) { 		tmp = (o1+i1*d1)*sm2[i1]*sm2[i1] - vr2t;		if(tmp>0) {			vo[i1] = sqrt(tmp/d1); 		} else {			vo[i1] = vo[i1-1];		}		vr2t = (o1+i1*d1)*sm2[i1]*sm2[i1];	}	/* compute the output velocity */	/* vrms output */	if(votype==0) {		wk[0] = vo[0];		tmp = vo[0]*vo[0]*o1;		for(i1=1;i1<n1;i1++) {			tmp = tmp + vo[i1]*vo[i1]*d1;					wk[i1] = sqrt(tmp/(o1+i1*d1));		}		for(i1=0;i1<n1;i1++) vo[i1] = wk[i1];	/* vavg output */	} else if(votype==1) {		wk[0] = vo[0];		tmp = vo[0]*o1;		for(i1=1;i1<n1;i1++) {			tmp = tmp + vo[i1]*d1;					wk[i1] = tmp/(o1+i1*d1);		}		for(i1=0;i1<n1;i1++) vo[i1] = wk[i1];	}	/* output time sampling */	if(itout==0) {		*ntout = n1;		for(i1=0;i1<n1;i1++) to[i1] = o1+i1*d1;	} else {		if(iw==0) {			to[0] = 0.;			*ntout = 1;		} else if(iw>0) {			*ntout = 2;			to[0] = 0.;			to[1] = twb;		}		for(i1=0;i1<nn1;i1++) to[*ntout+i1] = o1 + i1m[i1]*d1;		*ntout += nn1;		if(to[*ntout-1]< (o1+(n1-1)*d1)) {			*ntout += 1;			to[*ntout-1] = o1 + (n1-1)*d1;		}		for(i1=0;i1<n1;i1++) {			pm1[i1] = o1 + i1*d1;			wk[i1] = vo[i1]; 		}		i1 = *ntout;		lin1d_(pm1,wk,&n1,to,vo,&i1,indx);	}/* p-semblance to v-semblance conversion and screen dump */	if(qcsemb==1) {		vconvert(to,vo,i1,votype,0,to,sm2,i1,0,0);		if(itout==0) {			for(i1=0;i1<n1;i1++) pm1[i1] = o1+i1*d1;		}		vconvert(pm1,vi,n1,2,0,pm1,sm1,n1,0,0);		/*		for(i1=0;i1<n1;i1++) { 			fprintf(stderr,"to=%g vo=%g pm1=%g vi=%g sm1=%g \n",				to[i1],vo[i1],pm1[i1],vi[i1],sm1[i1]);		}		*/		free(wk);		zero = 999999.;		tmp = 0.;		for(i1=0;i1<n1;i1++) {			if(zero>sm1[i1]) zero = sm1[i1];			if(tmp<sm1[i1]) tmp = sm1[i1];		}		/* if(zero<2000) dv = 25; if(zero>2000) dv = 100.; */		if(zero<2000) v2h = 30; if(zero>2000) v2h = 100.;		zero = zero * op;		tmp = tmp * (op+(np-1)*dp);		n2 = (tmp - zero)/v2h + 1;		fprintf(stderr,"vmin=%g vmax=%g dv=%g nv=%d \n",zero,tmp,v2h,n2); 		wk = (float *) emalloc(n1*n2*sizeof(float));		bzero(wk,n1*n2*sizeof(float));		for(i2=0;i2<n2;i2++) {			tmp = zero + i2*v2h;			for(i1=0;i1<n1;i1++) {				v2l = (tmp/sm1[i1]-op)/dp;				ip = v2l;				v2l = v2l - ip;				if(ip>=0 && ip<np-2)				wk[i1+i2*n1] = sem[ip+i1*np]*(1.-v2l) + sem[ip+1+i1*np]*v2l; 			}		}		dump2xplotn(wk,n1,n2,0,"weighted semblance without picks",			o1,zero,d1,v2h,"time","rms velocity","solid","solid");		fprintf(stderr," \n");		for(i1=0;i1<*ntout;i1++) {			t = to[i1];			t = (t - o1)/d1 + 0.5;			i = t; 			tmp = (sm2[i1] - zero)/v2h + 0.5;			i2 = tmp;			if(i2>=0 && i2<n2) wk[i2*n1+i] = 0.;			if(i1>0) { 				tmp = sm2[i1]*sm2[i1]*to[i1] - sm2[i1-1]*sm2[i1-1]*to[i1-1];				tmp = tmp/(to[i1] - to[i1-1]);				tmp = sqrt(tmp);			} else {				tmp = sm2[0];			}	fprintf(stderr," t=%8.1f    Vrms_ori=%8.1f    Vrms_pic=%8.1f    Vint_pic=%8.1f \n", to[i1],sm1[i],sm2[i1],tmp);		}		dump2xplotn(wk,n1,n2,0,"weighted semblance with picks",			o1,zero,d1,v2h,"time","rms velocity","solid","solid");	}	free(wk);	free(ippp);	free(pm1);	free(pm2);	free(pp);	free(vr2p);	free(sm1);	free(sm2);	free(vr2m1);	free(vr2m2);	free(i1m);	free(indx);	free(a);	free(ii);	free(jj);}float fpower(float a, int power){	int i;	float p;	p = a;	for(i=1;i<power;i++) p *= a;	return p;}void findp(float *sem, int np, int n1, int ip1, int i1,	float op, float dp, float *s, float *p){	float p1,p2,p3,s1,s2,s3;	float ss, pp;			p1 = -1.;			p2 = 0.;			p3 = 1.;			s1 = sem[ip1-1+i1*np];			s2 = sem[ip1+i1*np];			s3 = sem[ip1+1+i1*np];			pol3max_(&p1,&p2,&p3,&s1,&s2,&s3,&pp,&ss);			*s = ss;			*p = op + (ip1+pp)*dp; }

⌨️ 快捷键说明

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