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

📄 ktmig.c

📁 seismic software,very useful
💻 C
📖 第 1 页 / 共 4 页
字号:
*/		if(il>=0 && il<nlout && is>=0 && is<nsout) {			if(ntrend==0) {			   if(abs(tra.offset)<off[io+is*nofo+il*nofo*nsout]) {				off[io+is*nofo+il*nofo*nsout] = abs(tra.offset);				lpos=io+is*nofo+il*nofo*nsout;				lpos=lpos*240;				fseek2g(hdrfp,lpos,0);				tmp = tra.mute*0.001;				tmp = tmp*tmp-tra.offset*tra.offset/gmin/gmin; 				if(tmp>=0.) {					tmp = sqrt(tmp);					tmp = tmp * 1000.;					itmp = tra.mute;					tra.mute = tmp;					}				efwrite(&tra,sizeof(char),240,hdrfp);				if(tmp>=0.) tra.mute = itmp;			   } 			} else {				if(lend==lstart) {					ps = ms;					pl = lstart;				} else {					tmp = (send-sstart)/(lend-lstart);					pl = ml + tmp*(lstart*tmp+ms-sstart); 					pl = pl/(1.+tmp*tmp);					ps = tmp*(pl-lstart) + sstart;				}				if(dsout!=0.) {					tmp = (ps - sstart)/dsout + 0.5;					isend = tmp; 				} else { 					tmp = (pl - lstart)/dlout + 0.5;					isend = tmp;				}				if (isend>=0 && isend<ntrend) {			   	   if (abs(tra.offset)<off[io+isend*nofo]) {				      tmp = sqrt( (ms-s[isend])*(ms-s[isend])				          + (ml-l[isend])*(ml-l[isend]) );				      if (tmp<disend[io+isend*nofo]) { 					 disend[io+isend*nofo] = tmp;					 tra.dz = tmp;				         lpos=io+isend*nofo;				         lpos=lpos*240;					 fseek2g(hdrfp,lpos,0);				         tmp = tra.mute*0.001;				         tmp = tmp*tmp-tra.offset*tra.offset/						gmin/gmin; 				         if (tmp>=0.) {					    tmp = sqrt(tmp);					    tmp = tmp * 1000.;					    itmp = tra.mute;					    tra.mute = tmp;					         }				         efwrite(&tra,sizeof(char),240,hdrfp);				      }				   }			        }  			}		}		/* find velocity */		cdpnow = tra.cdp;		if(cdpnow!=cdppre || vread==0 ) { 			cdppre = cdpnow;			tmp = (ms-s0v)/dsv + .5;			isv = tmp;			if(isv<0) isv = 0;			if(isv>nsv-1) isv = nsv - 1;			tmp = (ml-l0v)/dlv + .5;			ilv = tmp;			if(ilv<0) ilv = 0;			if(ilv>nlv-1) ilv = nlv - 1;			lpos = (isv + ilv*nsv)*ntv;			lpos = lpos * sizeof(float);			if(ivdisk==1) {				fseek2g(velfp,lpos,0);				efread(vel,sizeof(float),ntv,velfp);				if(etatype!=-1) {					fseek2g(etafp,lpos,0); 					efread(eta,sizeof(float),ntv,etafp);				}			} else {				for(it=0;it<ntv;it++)					vel[it] = velos[it+(isv+ilv*nsv)*ntv];				if(etatype!=-1) {					for(it=0;it<ntv;it++)						eta[it] = etas[it+(isv+ilv*nsv)*ntv];				}			}			vread = 1;		}		/* compute fovt2 = 4./(v*t)**2    */ 		for(it=0;it<ntau;it++) {			tmp = (tmig[it]-t0v)/dtv;			itv = tmp;			if(itv<0) {				v = vel[0];			} else if(itv>=ntv-1) {				v = vel[ntv-1];			} else {				tmp = tmp - itv;				v = (1.-tmp)*vel[itv]+tmp*vel[itv+1];			}			vr2[ktrace*ntau+it] = v*v;			tmp = v*tmig[it];			if(tmp==0.) tmp = v * dtau; 			fovt2[ktrace*ntau+it] = 4./(tmp*tmp);		}		/* compute eta at output travel time */		if(etatype==0) {			for(it=0;it<ntau;it++) {				tmp = (tmig[it]-t0v)/dtv;				itv = tmp;				if(itv<0) {					v = eta[0];				} else if(itv>=ntv-1) {					v = eta[ntv-1];				} else {					tmp = tmp - itv;					v = (1.-tmp)*eta[itv]+tmp*eta[itv+1];				}				etamig[ktrace*ntau+it] = v;			}		} else if(etatype==1) {			tmp = 0.;			etaeff[0] = eta[0];			for(it=1;it<ntv;it++) {				vr4 = vel[it]*vel[it]*vel[it]*vel[it];				tmp = tmp + vr4*(1.+8.*eta[it])*dtv;				etaeff[it] = 0.125*(tmp/(it*dtv+t0v)/vr4-1.);			}			for(it=0;it<ntau;it++) {				tmp = (tmig[it]-t0v)/dtv;				itv = tmp;				if(itv<0) {					v = etaeff[0];				} else if(itv>=ntv-1) {					v = etaeff[ntv-1];				} else {					tmp = tmp - itv;					v = (1.-tmp)*etaeff[itv]+tmp*etaeff[itv+1];				}				etamig[ktrace*ntau+it] = v;			}		}		ktrace += 1;					if(ktrace==mtrace || ktrace==ntras) {			migs(nlout,nsout,nofo,mig,ntau,				imgfp,ktrace,ntl,dldt,trace, 				tras,dtl,tminl,nt,				ss,sl,gs,gl, 				imutel,fovt2,s,l,				tm,iofs,apers,aperl,fold,				w1,work1,work2,wsave,tracef,				ifcut,ltaper,ksmax,klmax,				f0,df,nf,ftaper,nsave,nfft,				dtau,tau0,angmax,				indxw,nindxw,incdxw,				resamp,ires,ntres,				ss2,scs,scg,ncpu,				vr2,vi2,vq4,tau,etamig,etatype);			itrace = itrace + ktrace;			ndskwt = ndskwt + ktrace;			ktrace = 0;		}		if(jtrace/1000>m1000) { 		fprintf(jpfp," process done for %d input traces\n",jtrace);			m1000 = jtrace/1000;		fflush(jpfp);		}			if(ndskwt>=ntrdsk && ntrdsk>0) {		/* update disk file */			fldfp = efopen(diskfld,"r+");			fseek2g(fldfp,0,1);			efwrite(fold,sizeof(float),nlout*nsout*nofo,fldfp);			efclose(fldfp);			imgfp = efopen(diskimg,"r+");			fseek2g(imgfp,0,1);			fwrite(mig,sizeof(float),nofo*nsout*nlout*ntau,imgfp);			efclose(imgfp);		fprintf(hffp,"Number of Traces Processed: %d %d \n",				jtrace,jtrace-ntrpre+ltrace);			fflush(hffp);			ndskwt=0;		}	} while (ntrace<ntras && fgettr(infp,&tra));	if(ktrace>0) {		migs(nlout,nsout,nofo,mig,ntau,			imgfp,ktrace,ntl,dldt,trace, 			tras,dtl,tminl,nt, 			ss,sl,gs,gl, 			imutel,fovt2,s,l,			tm,iofs,apers,aperl,fold,			w1,work1,work2,wsave,tracef,			ifcut,ltaper,ksmax,klmax,			f0,df,nf,ftaper,nsave,nfft, 			dtau,tau0,angmax, 			indxw,nindxw,incdxw,			resamp,ires,ntres,			ss2,scs,scg,ncpu,			vr2,vi2,vq4,tau,etamig,etatype);		itrace = itrace + ktrace;		ktrace = 0;	fprintf(jpfp," processing done for total %d input traces \n",jtrace);	}	fprintf(jpfp," %d input traces processed in this run \n",ntrace);	fflush(jpfp);	ntrpre = ntrpre + ntrace;	efclose(hdrfp);	hdrfp = efopen(diskhdr,"r");	fseek2g(hdrfp,0,1);	if(isave==1 && ntrace>0) {		fldfp = efopen(diskfld,"r+");		fseek2g(fldfp,0,1);		efwrite(fold,sizeof(float),nlout*nsout*nofo,fldfp);		efclose(fldfp);	} 	if(isave==0) unlink(diskfld);	if(ftell(btfp)==0) { 		efclose(btfp);		unlink("BAD_TRACE_FILE");	} else {		efclose(btfp);	}	if(nlcore<nlout || (ipre==1&&ntrdsk==0)) efclose(imgfp);	if(isave==1 && nlcore==nlout)  {		imgfp = efopen(diskimg,"r+");		fseek2g(imgfp,0,1);		fwrite(mig,sizeof(float),nofo*nsout*nlout*ntau,imgfp);		efclose(imgfp);	}	if(isave==1) fprintf(jpfp," backup to disk done \n");	fprintf(hffp,"Number of Traces Processed: %d 0 \n",ntrpre);	efclose(hffp);	if(ihis==0) unlink(hisfile);	/* output */	if(nlcore<nlout) fseek2g(imgfp,0,0);	fseek2g(hdrfp,0,0);	if( (ntrace == ntras || feof(infp)!=0) && traceout==1) {	     fprintf(jpfp," start output ... \n");	     for(iy=0;iy<nlout;iy++) {		for(ix=0;ix<nsout;ix++) {			for(io=0;io<nofo;io++) {				itmp = (io*nsout*nlout+iy*nsout+ix);				itmp2 = itmp*ntau;				bcopy(mig+itmp2,tra.data,ntau*sizeof(float));				if(fold[itmp]>1.) {					scale = 1./fold[itmp];					for(it=0;it<ntau;it++) 						tra.data[it]=tra.data[it]*scale;				}				/* update headers */				bzero(&tra,240);				efread(&tra,sizeof(char),240,hdrfp);				tra.offset = ofo[io];				tra.tracl = ix + 1;				tra.tracr = iy + 1;				tra.cdpt = io + 1;				tra.dz = 0.;				ofs = ofo[io];				if(tra.trid==1) {					mx = (tra.gx+tra.sx)/2;                        		my = (tra.gy+tra.sy)/2;					tmp = tra.gx-tra.sx;					dd = tra.gy-tra.sy;					tmp = tmp*tmp + dd*dd;                   	dd = sqrt(tmp);                    if(dd>0.) {                   		tra.sx = mx+ofs*(tra.sx-mx)/dd;                   		tra.gx = mx+ofs*(tra.gx-mx)/dd;                   		tra.sy = my+ofs*(tra.sy-my)/dd;                   		tra.gy = my+ofs*(tra.gy-my)/dd;                   	} else {                        tra.sx = mx-ofs/2;                   		tra.gx = mx+ofs/2;                       	tra.sy = my;                       	tra.gy = my;                    }				} else {					ms = s[iy*nsout+ix];					ml = l[iy*nsout+ix];					sl2xy(s1,l1,x1,y1,s2,l2,x2,y2,s3,l3,x3,y3,ms,ml,&mx,&my);					tra.sx = mx-ofs/2;					tra.gx = mx+ofs/2;					tra.sy = my;					tra.gy = my;				} 				tra.delrt = tau0 * 1000.;				tra.ns = ntau;				tra.dt = dtau * 1000000.;				if(tra.trid!=1) {					tmp = (tau0 + (ntau-1)*dtau)*1000;					tra.mute = tmp;				}				if(itgain==1) {					for(it=0;it<ntau;it++) 						tra.data[it]=tra.data[it]							*tugain[it];				}				if(ntrend>0) {					tmp = (l[iy*nsout+ix] - l1)/ddl + 0.5;					iiy = tmp;					tmp = (s[iy*nsout+ix] - s1)/dds + 0.5;					iix = tmp;					if(cdpnum==0) {						tra.cdp = iiy*ncdppl+iix+cdp1;					} else {						tra.cdp = iix*nlines+iiy+cdp1;					}				}				if(ikey==1) {					ms = s[iy*nsout+ix];					ml = l[iy*nsout+ix];					fline = (ml - l1)*(ln3-ln1)/(l3-l1) + ln1 + 0.5;					ftrace = (ms - s1)*(tr2-tr1)/(s2-s1) + tr1 + 0.5;					intline = fline;					inttrace = ftrace;					itov(trktype,&trkval,inttrace);					itov(lnktype,&lnkval,intline);					puthval(&tra,indxtrk,&trkval);					puthval(&tra,indxlnk,&lnkval);				}				/* output */				fputtr(outfp,&tra);			}		}	    }	    fprintf(jpfp," output done \n");	    fflush(jpfp);	} 		efclose(outfp);		efclose(hdrfp);	if(isave==0) unlink(diskhdr);	if(isave==0) unlink(diskimg);	free(mig);	if(ivdisk==0) free(velos);	if(ivdisk==0) free(etas);	/* backup to tape */	if(ibacko==1) {                fprintf(jpfp," Backup %s , %s and %s to %s \n",                        diskimg,diskhdr,diskfld,backupo);                tar3to(backupo,diskimg,diskhdr,diskfld);        }	return 0;}void migs(int nl, int ns, int nofo, float *mig, int ntau,	FILE *imgfp, int ktrace, int ntl, float dldt, float *trace, 	float *tras, float dtl, float tminl, int nt, 	float *ss, float *sl, float *gs, float *gl, 	int *imutel, float *fovt2, float *s, float *l,	float *tm, int *iofs, float apers, float aperl, float *fold,	float *w1, float *work1, float *work2, float *wsave, float *tracef,	int *ifcut, int *ltaper, float ksmax, float klmax,	float f0, float df, int nf, float ftaper, int nsave, int nfft,	float dtau, float tau0, float angmax, 	int *indxw,int nindxw, int incdxw,	float *resamp, int ires, int ntres,	float *s2, float *scs, float *scg, int ncpu, 	float  *vr2, float *vi2, float *vq4, float *tau,	float *etamig, int etatype) {	int il, itr, i, ir0, it, ii;	float tmp;	long lwork, ltmp;	int nsl;	nsl = ns*nl;	/* linearly interpolate input trace */	for(itr=0;itr<ktrace;itr++) {		ir0 = itr*nt;		if(ntl!=nt) {               		for(it=0;it<ntl;it++) {                   		tmp = it*dldt;                       		i = (int)tmp;                       		tmp = tmp - i;                   		if(i>=0 && i<nt-1) {                       			trace[it] = 						(1.-tmp)*tras[i+ir0]+						tmp*tras[i+1+ir0];                       		}			}			} else {               		for(it=0;it<ntl;it++)                     		trace[it] = tras[it+ir0];		}			/* 3d prestack time migration */		ii = iofs[itr]-1;		vr22vi2_(vr2+itr*ntau,vi2,&ntau);		vi22vq4_(vi2,vq4,&ntau);		vt2s2_(vr2+itr*ntau,vq4,s2,tau,&ntau);		if(etatype==-1) {			pstm3d_(trace,&ntl,&tminl,&dtl,&ss[itr],&sl[itr],			&gs[itr],&gl[itr],&imutel[itr],			fovt2+itr*ntau,mig+ii*ntau*nsl,&nsl,&ntau,s,l,			tm,&apers,&aperl,fold+nsl*ii,w1,			&f0,&df,&nf,&ftaper,			ifcut,ltaper,tracef,			wsave,&nsave,work1,work2,&nfft,			&ksmax,&klmax,&dtau,&tau0,&angmax,			indxw,&nindxw,&incdxw,&ncpu,			resamp,&ires,&ntres,s2,scs,scg);		} else {			pstmeta_(trace,&ntl,&tminl,&dtl,&ss[itr],&sl[itr],			&gs[itr],&gl[itr],&imutel[itr],			fovt2+itr*ntau,mig+ii*ntau*nsl,&nsl,&ntau,s,l,			tm,&apers,&aperl,fold+nsl*ii,w1,			&f0,&df,&nf,&ftaper,			ifcut,ltaper,tracef,			wsave,&nsave,work1,work2,&nfft,			&ksmax,&klmax,&dtau,&tau0,&angmax,			indxw,&nindxw,&incdxw,&ncpu,			resamp,&ires,&ntres,s2,scs,scg,etamig+itr*ntau);		}	}}

⌨️ 快捷键说明

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