velo2hfile.c

来自「seismic software,very useful」· C语言 代码 · 共 921 行 · 第 1/2 页

C
921
字号
   			fprintf(hfilefp, "%9.1f %9.1f %8.0f %8.0f   %1d   %4.2f  %4.0f  %4.2f \n",				xpicks[ip+h0],zpicks[ip+h0],				veltop[ip+h0],velbot[ip+h0],dif[ip+h0],				dens[ip+h0],qval[ip+h0],pois[ip+h0]);		}	}}/* compute velocities from VELO and DVDZ cards *//* this if for hfile */void vtopbot(int maxp,int maxcdp,      int ncdp_velo,float *x_velo,float *z_velo,float *v_velo,int *nps_velo,     int ncdp_dvdz,float *x_dvdz,float *zt_dvdz,float *zb_dvdz,      float *dvdz_dvdz, int *nps_dvdz,     int nhs,float *xpicks,float *zpicks,int *npicks,float xtol,float ztol,      float *veltops,float *velbots,float *velavgs,float *dvdzs,     int *vtopupdate, int *vbotupdate, int *hnums) {	float x, z, va, g, vat, gt, vab, gb;	int ih, ip, jh;	float zmax, xmin, xmax, zt, zb, tmp;	float *vth, *vbh, *vah, *dvdzh, *xvh, *zvs, *zvh;	float *zgrid, *vagrid, *dvdzgrid, dz, *g1, *g2, *z2, z21, z2n;	int i1,i2,n1,n2,one=1,nzgrid;	int *ivs, *nvh;	int iz, n, j2, j1, nvs, j;	float *xnew, *znew, *vanew, *vtnew, *vbnew, *gnew, xpre, xnow;	int *indx, inow, ihbot;	float *zsort;	int *isort;	char vtopyes, vbotyes;	int it1, it2, ib1, ib2, ii;			if(ncdp_velo==0) {		/* if no velo card input, simply return with warning message */		warn("no VELO card input ! \n");	} else {		/* find maximum depth */		zmax = 0.;		for(ih=0;ih<nhs;ih++) {			for(iz=0;iz<npicks[ih];iz++) {				if(zmax<zpicks[ih*maxpks+iz])				  	zmax=zpicks[ih*maxpks+iz];			}		}		for(i2=0;i2<ncdp_velo;i2++) {			for(iz=0;iz<nps_velo[i2];iz++) {				if(zmax<z_velo[i2*maxp+iz])				  	zmax=z_velo[i2*maxp+iz];			}		}		/* compute average v and dvdz grids */		nzgrid = 1024;		zgrid = (float *) malloc(nzgrid*sizeof(float));		vagrid = (float *) malloc(nzgrid*ncdp_velo*sizeof(float));		dvdzgrid = (float *) malloc(nzgrid*ncdp_velo*sizeof(float));		g1 = (float *) malloc(nzgrid*sizeof(float));		g2 = (float *) malloc(nzgrid*sizeof(float));		vth = (float *) malloc(nhs*ncdp_velo*sizeof(float));		vbh = (float *) malloc(nhs*ncdp_velo*sizeof(float));		vah = (float *) malloc(nhs*ncdp_velo*sizeof(float));		dvdzh = (float *) malloc(nhs*ncdp_velo*sizeof(float));		xvh = (float *) malloc(nhs*ncdp_velo*sizeof(float));		zvh = (float *) malloc(nhs*ncdp_velo*sizeof(float));		nvh = (int *) malloc(nhs*sizeof(int));		zvs = (float *) malloc(nhs*sizeof(float));		ivs = (int *) malloc(nhs*sizeof(int));		zsort = (float *) malloc(nhs*sizeof(float));		isort = (int *) malloc(nhs*sizeof(int));		vtnew = (float *) malloc(maxpks*sizeof(float));		vbnew = (float *) malloc(maxpks*sizeof(float));		indx = (int *) malloc(maxpks*sizeof(int));		vanew = (float *) malloc(maxpks*sizeof(float));		gnew = (float *) malloc(maxpks*sizeof(float));		xnew = (float *) malloc(maxpks*sizeof(float));		znew = (float *) malloc(maxpks*sizeof(float));		z2 = (float *) malloc(nhs*sizeof(float));		dz = zmax/(nzgrid-2);		for(iz=0;iz<nzgrid;iz++) zgrid[iz] = iz * dz;		/* compute average velocity and gradient at velo location and		   at depth zgrid */		for(i2=0;i2<ncdp_velo;i2++) {			n2 = i2*nzgrid;			/* find gradient */			x = x_velo[i2];			if(ncdp_dvdz==0) {				for(iz=0;iz<nzgrid;iz++) 					dvdzgrid[iz+n2] = 0.;			} else if (ncdp_dvdz==1) {				n = nps_dvdz[0];				dvdzint(zt_dvdz,zb_dvdz,dvdz_dvdz,n,					zgrid,dvdzgrid+n2,nzgrid);			} else {				bisear_(&ncdp_dvdz,&one,x_dvdz,&x,&j2);				if(x<=x_dvdz[0]) {					n = nps_dvdz[0];					dvdzint(zt_dvdz,zb_dvdz,dvdz_dvdz,n,					     zgrid,dvdzgrid+n2,nzgrid);				} else if (x>=x_dvdz[ncdp_dvdz-1]) {					n = nps_dvdz[ncdp_dvdz-1];					i1 = (ncdp_dvdz-1)*maxp;					dvdzint(zt_dvdz+i1,zb_dvdz+i1,						dvdz_dvdz+i1,n,zgrid,						dvdzgrid+n2,nzgrid);				} else {					j1 = j2 - 1;					n = nps_dvdz[j1];					i1 = j1*maxp;					dvdzint(zt_dvdz+i1,zb_dvdz+i1,						dvdz_dvdz+i1,n,						zgrid,g1,nzgrid);					n = nps_dvdz[j2];					i1 = j2*maxp;					dvdzint(zt_dvdz+i1,zb_dvdz+i1,						dvdz_dvdz+i1,n,						zgrid,g2,nzgrid);					tmp = (x-x_dvdz[j1]) /					      (x_dvdz[j2]-x_dvdz[j1]);									for(iz=0;iz<nzgrid;iz++) {						dvdzgrid[iz+n2] = g1[iz]+						tmp * (g2[iz]-g1[iz]);					}				}			}			/* find average velocity at zgrid */			n = nps_velo[i2];			n1 = i2*maxp;			j1 = 0;			j2 = 0;			vconint(z_velo+n1,v_velo+n1,n,zgrid,vagrid+n2,nzgrid,				j1,j2,dvdzgrid+n2);		}					/* compute vt (velocity above) and vb (velocity below) 			along horizons at velan locations */		for(ih=0;ih<nhs;ih++) nvh[ih] = 0;		for(i2=0;i2<ncdp_velo;i2++) {			x = x_velo[i2];				jh = 0;			/* find cross points of horizons at velan locations */			for(ih=0;ih<nhs;ih++) {				xmin = xpicks[ih*maxpks]-xtol;				xmax = xpicks[ih*maxpks+npicks[ih]-1]+xtol;				n1 = npicks[ih]; 				n2 = ih * maxpks;				if(x>=xmin && x<=xmax) {					ivs[jh] = ih;					/* find z */					bisear_(&n1,&one,xpicks+n2,&x,&i1);					if(x<=xpicks[n2]) {						z = zpicks[n2];					} else if(x>=xpicks[n1+n2-1]) {						z = zpicks[n1+n2-1];					} else {						/* linear interpolation */						   z = zpicks[n2+i1-1] +						    (x-xpicks[n2+i1-1])*						    (zpicks[n2+i1]-						     zpicks[n2+i1-1])/						    (xpicks[n2+i1]-						     xpicks[n2+i1-1]);					}					zvs[jh] = z; 					jh = jh + 1;				}			}			/* sort zvs into ascending order */			for (iz=0;iz<jh;iz++) {				isort[iz] = iz;				zsort[iz] = zvs[iz];			}			qkisort(jh,zsort,isort);			for(iz=0;iz<jh;iz++) zvs[iz] = zsort[isort[iz]];			/* find vt and vb */			for(iz=0;iz<jh;iz++) {                                z = zvs[iz];                                tmp = z/dz;                                j1 = tmp;				if(iz<jh-1) {					tmp = zvs[iz+1]/dz;					j2 = tmp;				} else {                                 	j2 = j1 + 1;				}                                ilimit(&j1,0,nzgrid-1);                                ilimit(&j2,0,nzgrid-1);                                ii = ivs[isort[iz]]*ncdp_velo                                        +nvh[ivs[isort[iz]]];				if(ztol>0.) {					n = nps_velo[i2];					n1 = i2*maxp;					tmp = fabs(z-z_velo[n1]);					i1 = 0;						for(j=1;j<n;j++) {						if(fabs(z-z_velo[n1+j])<tmp) {						    i1 = j;						    tmp=fabs(z-z_velo[n1+j]); 							}					}					if(tmp<ztol) {						va = v_velo[n1+i1];						if(i1+1<n) {							vab = v_velo[n1+i1+1];							zb = z_velo[n1+i1+1];						} else {                                			va=vagrid[i2*nzgrid+j1];                                			z = zgrid[j1];                                			vab = 							  vagrid[i2*nzgrid+j2];                                			zb = zgrid[j2];						}					} else {                                		va = vagrid[i2*nzgrid+j1];                                		z = zgrid[j1];                                		vab = vagrid[i2*nzgrid+j2];                                		zb = zgrid[j2];					}				} else {                                	va = vagrid[i2*nzgrid+j1];                                	z = zgrid[j1];                                	vab = vagrid[i2*nzgrid+j2];                                	zb = zgrid[j2];				}                                tmp = z/dz;                                j1 = tmp;                                tmp = zb/dz;                                j2 = tmp;                                ilimit(&j1,0,nzgrid-1);                                ilimit(&j2,0,nzgrid-1);				g = 0.;				for(j=j1;j<j2+1;j++) {					g = g + dvdzgrid[i2*nzgrid+j];				}				if(j2>j1) g  = g / (j2-j1+1);			                                    vth[ii] = (zb*vab-z*va)/(zb-z) - 0.5*g*(zb-z);                                vbh[ii] = (zb*vab-z*va)/(zb-z) + 0.5*g*(zb-z);                                vah[ii] = va;                                dvdzh[ii] = g;                                xvh[ii] = x;                                zvh[ii] = zvs[iz];                                nvh[ivs[isort[iz]]] += 1;				/*                                fprintf(stderr,"vt=%6.0f vb=%6.0f va=%6.0f vab=%6.0f g=%6.2f x=%6.0f z=%6.0f zb=%6.0f \n",             vth[ii],vbh[ii],vah[ii],vab,dvdzh[ii],x,z,zb);				*/			}		}		/* fing vt, vb at pick positions */		for(ih=0;ih<nhs;ih++) {                       	vtopyes = 'n';			for(jh=0;jh<maxhs;jh++) {				if(hnums[ih]==vtopupdate[jh]) {                        		vtopyes = 'y';					break;				}			}                       	vbotyes = 'n';			for(jh=0;jh<maxhs;jh++) {				if(hnums[ih]==vbotupdate[jh]) {                        		vbotyes = 'y';					break;				}			}                        if(vtopyes=='n' && vbotyes=='n') continue;			/* find velocity at top of a layer */			if(vtopyes=='y') {				n2 = ih*maxpks;				n1 = ih*ncdp_velo;				nvs = nvh[ih];				if(nvs==0) {					fprintf(stderr, 				   	"warning: no velan at horizon %d !\n",						hnums[ih]); 				} else { 					for(ip=0;ip<npicks[ih];ip++) {						findv(nvs,xvh+n1,vth+n1,							xpicks[ip+n2],							&veltops[ip+n2]);  					}				}			}			/* now for the bottom velocity of the layer */			if(vbotyes=='y') {				n2 = ih*maxpks;				n1 = ih*ncdp_velo;				nvs = nvh[ih];				if(nvs==0) {					fprintf(stderr, 				   	"warning: no velan at horizon %d !\n",						hnums[ih]); 				} else { 					for(ip=0;ip<npicks[ih];ip++) {						findv(nvs,xvh+n1,vbh+n1,							xpicks[ip+n2],							&velbots[ip+n2]);  					}				}			}		}		free(indx);		free(xnew);		free(znew);		free(vtnew);		free(vbnew);		free(vanew);		free(gnew);		free(zvs);		free(ivs);		free(isort);		free(zsort);		free(nvh);		free(xvh);		free(zvh);		free(vbh);		free(vth);		free(vah);		free(dvdzh);		free(zgrid);		free(vagrid);		free(dvdzgrid);		free(g1);		free(g2);		free(z2);	}}/* find velocity at x position of an horizon velocity function */ void findv(int ns, float *xs, float *vs, float x, float *v) { 	int one=1, i2;	float tmp;	if (ns==1) {		*v = vs[0];	} else {	       	bisear_(&ns,&one,xs,&x,&i2);		if(x<=xs[0]) { 			*v = vs[0];		} else if(x>=xs[ns-1]) {			*v = vs[ns-1];		} else { 			tmp = (x-xs[i2-1])/(xs[i2]-xs[i2-1]);			*v = vs[i2-1] + tmp*(vs[i2]-vs[i2-1]);		}	}}/* find an interface index ihbot directly below an x position of an 	interfaceat of index ihxz */  /* *ihbot is the index found. If -1, index not found	*/void findbot(int maxp,int maxcdp,	int nhs,float *xpicks,float *zpicks,int *npicks,float xtol,	float x, int ihxz, int *ihbot) {	int ih, n1, n2, one=1;	float xmin, xmax, z;	float *zxs, *zsort;	int *ixs, *ixsave, *isort;	int i1, i2, nxs, iz;	zxs = (float*) malloc(nhs*sizeof(float));	ixs = (int*) malloc(nhs*sizeof(int));	ixsave = (int*) malloc(nhs*sizeof(int));	isort = (int*) malloc(nhs*sizeof(int));	zsort = (float*) malloc(nhs*sizeof(float));	/* find cross point at horizons */	nxs = 0;	for(ih=0;ih<nhs;ih++) {		xmin = xpicks[ih*maxpks]-xtol;		xmax = xpicks[ih*maxpks+npicks[ih]-1]+xtol;		n1 = npicks[ih]; 		n2 = ih * maxpks;		if(x>=xmin && x<=xmax) {			ixs[nxs] = ih;			/* find z */			bisear_(&n1,&one,xpicks+n2,&x,&i1);			if(x<=xpicks[n2]) {				z = zpicks[n2];			} else if(x>=xpicks[n1+n2-1]) {				z = zpicks[n1+n2-1];			} else {			/* linear interpolation */			   	z = zpicks[n2+i1-1] +				    (x-xpicks[n2+i1-1])*				    (zpicks[n2+i1]-				     zpicks[n2+i1-1])/				    (xpicks[n2+i1]-				     xpicks[n2+i1-1]);			}			zxs[nxs] = z; 			nxs = nxs + 1;		}	}	/* sort zxs into ascending order */	for (iz=0;iz<nxs;iz++) {        	isort[iz] = iz;                zsort[iz] = zxs[iz];        }        if(nxs>0) qkisort(nxs,zsort,isort);        for(iz=0;iz<nxs;iz++) zxs[iz] = zsort[isort[iz]];        for(iz=0;iz<nxs;iz++) ixsave[iz] = ixs[iz];        for(iz=0;iz<nxs;iz++) ixs[iz] = ixsave[isort[iz]];	*ihbot = -1;	for(iz=0;iz<nxs;iz++) {		if(ihxz==ixs[iz]) {			if(iz+1 < nxs)				*ihbot = ixs[iz+1];		break;		}	}	free(ixs);	free(ixsave);	free(zxs);	free(zsort);	free(isort);}

⌨️ 快捷键说明

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