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

📄 sumigprepspislave.c

📁 su 的源代码库
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       */#include "su.h"#include "segy.h"#include "header.h"#include <signal.h>#include "pvm3.h"#define PARA_MSGTYPE 1#define VEL_MSGTYPE 2#define DATA_MSGTYPE 3#define COM_MSGTYPE 4#define RESULT_MSGTYPE 5#define Done 10#define UnDone -10#define FinalDone 0 /*********************** self documentation ******************************/char *sdoc[] = {"                                                                       ","                                                                       ","                                                                       ","The vfile parameter must be specified, the velocity should be stored in","binary format in vfile, its structure should be vfile[iz][ix].         ",NULL};/**************** end self doc *******************************************/int main (int argc, char **argv) {        int L=6, Bz=0,dip=0;        float c[101], *V,P[100],Sz=0,Y[101];	double a,a1,a2,theta,theta1,theta2;	int Finish;	int nt;                 /* number of time samples */        int nz;                 /* number of migrated depth samples */        int nx,nxo;                 /* number of midpoints  */        int ik,iz,iw,ix,it,ix2,ix3,ixshot;     /* loop counters        */        int nxfft,ntfft;        /* fft size             */        int nk,nw;              /* number of wave numbers */        int mytid,msgtype,rc,i,parent_tid;        float dt=0.004,dz,tz;         /* time sampling interval       */        float ft,fz;            /* first time sample            */        float dk,dw;            /* wave number sampling interval */        float fk,fw;            /* first wave number            */        float k,w;              /* wave number          */        float dx;               /* spatial sampling interval    */        float **cresult;    /* input, output data           */        float vmin,v1,v2,vmax,lvmin,lvmax;        double kz1,kz2;        float **v,**vp;        double phase1;        complex cshift1,cshift2;        complex **cq,**cp,**cp1,**cq1,***cq2,***cq3;  /* complex input,output         */        int verbose=1;          /* flag for echoing info                */        v=NULL;	mytid=pvm_mytid();	parent_tid=pvm_parent();	msgtype=PARA_MSGTYPE;		rc=pvm_recv(-1,msgtype);	rc=pvm_upkint(&nxo,1,1);	rc=pvm_upkint(&nz,1,1);	rc=pvm_upkint(&dip,1,1);        vp=alloc2float(nxo,nz);        msgtype=VEL_MSGTYPE;        rc=pvm_recv(-1,msgtype);        rc=pvm_upkfloat(vp[0],nxo*nz,1);        cresult = alloc2float(nz,nxo);	for(ix=0;ix<nxo;ix++)	for(iz=0;iz<nz;iz++)	cresult[ix][iz]=0.0;loop:        msgtype=PARA_MSGTYPE;        rc=pvm_recv(-1,msgtype);        rc=pvm_upkint(&Finish,1,1);        if(Finish==FinalDone)goto end; 	rc=pvm_upkint(&ntfft,1,1);        rc=pvm_upkint(&ix2,1,1);        rc=pvm_upkint(&ix3,1,1);	rc=pvm_upkint(&ixshot,1,1);	nx=ix3-ix2+1;	rc=pvm_upkfloat(&dx,1,1);	rc=pvm_upkfloat(&dz,1,1); 	rc=pvm_upkfloat(&dw,1,1);        rc=pvm_upkfloat(&dt,1,1);        /*allocate space for velocity profile within the aperature*/        if(v!=NULL){free2float(v);v=NULL;}        v=alloc2float(nx,nz);        for(iz=0;iz<nz;iz++)            for(ix=0;ix<nx;ix++){        v[iz][ix]=vp[iz][ix+ix2];          }        vmax=v[0][0];vmin=v[0][0];        for(iz=0;iz<nz;++iz)        for(ix=0;ix<nx;ix++)        {         if(v[iz][ix]>=vmax) vmax=v[iz][ix];         if(v[iz][ix]<=vmin) vmin=v[iz][ix];        }       /* determine wavenumber sampling (for complex to complex FFT) */        nxfft = npfa(nx);        nk = nxfft;        dk = 2.0*PI/(nxfft*dx);        fk = -PI/dx;while(1){        msgtype=DATA_MSGTYPE;        rc=pvm_recv(-1,msgtype);        rc=pvm_upkint(&Finish,1,1);        if(Finish==Done)goto loop;        rc=pvm_upkfloat(&fw,1,1);        rc=pvm_upkint(&nw,1,1);        cp = alloc2complex(nx,nw);	cp1 = alloc2complex(nx,nw);        rc=pvm_upkfloat((float *)cp[0],nx*nw*2,1);        rc=pvm_upkfloat((float *)cp1[0],nx*nw*2,1);        cq = alloc2complex(nk,nw);	cq1=alloc2complex(nk,nw);        /* loops over depth */        for(iz=0;iz<nz;++iz){        /*the imaging condition*//*        for(ix=0;ix<nx;ix++){        for(iw=0,w=fw;iw<nw;w+=dw,iw++){                complex tmp;                float ratio=10.0;                if(fabs(ix+ix2-ixshot)*dx<ratio*iz*dz)                tmp=cmul(cp[iw][ix],cp1[iw][ix]);                else tmp=cmplx(0.0,0.0);                cresult[ix+ix2][iz]+=tmp.r/ntfft;        }        }*//* anothe imaging condition, slightly different from the above one, but not quiteslow*/                  for(iw=0,w=fw;iw<nw;w+=dw,iw++){                float kk=0.0;                complex tmp;                 float ratio=1.5;                if(dip<80)ratio=1.5;                else ratio=1.5;                  for(ix=0;ix<nx;ix++){                kk+=(pow(cp1[iw][ix].i,2.0)+pow(cp1[iw][ix].r,2.0))/nx;                }                                for(ix=0;ix<nx;ix++){                tmp=cmul(cp[iw][ix],cp1[iw][ix]);                                if(fabs(ix-ixshot+ix2)*dx<ratio*iz*dz)                        tmp=crmul(tmp,1.0/(kk+1.0e-10));                else tmp=cmplx(0.0,0.0);                  cresult[ix+ix2][iz]+=tmp.r/ntfft;                                }                }        for (ik=0; ik<nx; ++ik)        for (iw=0,w=fw; iw<nw;w+=dw, ++iw){		cp[iw][ik]=cmul(cp[iw][ik],cexp(cmplx(0.0,-w*dz/v[iz][ik])));		cp1[iw][ik]=cmul(cp1[iw][ik],cexp(cmplx(0.0,-w*dz/v[iz][ik])));		cq[iw][ik] = ik%2 ? cneg(cp[iw][ik]) : cp[iw][ik];		cq1[iw][ik] = ik%2 ? cneg(cp1[iw][ik]) : cp1[iw][ik];	}                                for (ik=nx; ik<nk; ++ik)                        for (iw=0; iw<nw; ++iw)                        {			cq[iw][ik] = cmplx(0.0,0.0);			cq1[iw][ik] = cmplx(0.0,0.0);			}                /* FFT to W-K domain */                                pfa2cc(-1,1,nk,nw,cq[0]);		pfa2cc(-1,1,nk,nw,cq1[0]);	lvmin=lvmax=v[iz][0];	for(ix=0;ix<nx;ix++){		if(v[iz][ix]<=lvmin)lvmin=v[iz][ix];			if(v[iz][ix]>=lvmax)lvmax=v[iz][ix];		}        /* The second time phase shift */        v1=lvmin;          v2=lvmax;                  if((v2-v1)/v1<0.01){                 for(ik=0,k=fk;ik<nk;++ik,k+=dk)                for(iw=0,w=fw;iw<nw;++iw,w+=dw){                                if(w==0.0)w=1.0e-10/dt;                kz1=1.0-pow(v1*k/w,2.0);                                 if(kz1>=0.0){                phase1 = -w*sqrt(kz1)*dz/v1+w*dz/v1;                cshift1 = cmplx(cos(phase1), sin(phase1));                cq[iw][ik] = cmul(cq[iw][ik],cshift1);		cq1[iw][ik] = cmul(cq1[iw][ik],cshift1);                }                else{                   phase1 = -w*sqrt(-kz1)*dz/v1;                cshift1=cexp(cmplx(phase1,w*dz/v1));                cq[iw][ik] = cmul(cq[iw][ik],cshift1);		cq1[iw][ik] = cmul(cq1[iw][ik],cshift1);                }        }        pfa2cc(1,1,nk,nw,cq[0]);	pfa2cc(1,1,nk,nw,cq1[0]);        for(ix=0;ix<nx;++ix)                for(iw=0;iw<nw;++iw){                  cq[iw][ix] = crmul( cq[iw][ix], 1.0/nxfft);                cp[iw][ix] =ix%2 ? cneg(cq[iw][ix]) : cq[iw][ix];		cq1[iw][ix] = crmul( cq1[iw][ix], 1.0/nxfft);                cp1[iw][ix] =ix%2 ? cneg(cq1[iw][ix]) : cq1[iw][ix];                }        }                        else{                    for(ik=0;ik<=L;ik++)        c[ik]=lvmin+ik*1.0*(lvmax-lvmin)/(L*1.0);        for(ik=0;ik<L;ik++)        {        P[ik]=0.0;        }                for(ix=0;ix<nx;ix++){                for(ik=0;ik<L;ik++){if(((v[iz][ix]>=c[ik])&&(v[iz][ix]<c[ik+1]))||((ik==L-1)&&(v[iz][ix]==lvmax))){                P[ik]+=1.0/nx; break;}                 }}          Sz=0.0;        for(ik=0;ik<L;ik++)        {if(P[ik]!=0.00) Sz=Sz-P[ik]*log(P[ik]);        }                 Bz=exp(Sz)+0.5;        Y[0]=0.0; Y[L]=1.0;        for(ik=1;ik<L;ik++)        {Y[ik]=0.0;        for(ix=0;ix<ik;ix++)        for(ix=0;ix<ik;ix++)        Y[ik]=Y[ik]+P[ix];        }         V=alloc1float(Bz+1);         V[0]=lvmin;                           for(ix=1;ix<=Bz;ix++)        {        for(ik=0;ik<L;ik++)        {if((ix*1.0/Bz>Y[ik])&&(ix*1.0/Bz<=Y[ik+1])){        V[ix]=c[ik]+(ix*1.0/Bz-Y[ik])*(c[ik+1]-c[ik])/(Y[ik+1]-Y[ik]);break;}        }                }        V[Bz]=lvmax*1.005;          cq2=ealloc3complex(nk,nw,Bz+1);        cq3=ealloc3complex(nk,nw,Bz+1);        for(ix=0;ix<Bz+1;ix++){                for(iw=0,w=fw;iw<nw;++iw,w+=dw)                for(ik=0,k=fk;ik<nk;++ik,k+=dk){                        if(w==0.0)w=1.0e-10/dt;                        kz1=1.0-pow(V[ix]*k/w,2.0);                if(kz1>=0.00){                        phase1 =-w*sqrt(kz1)*dz/V[ix]+w*dz/V[ix];                        cshift1 = cexp(cmplx(0.0,phase1));                        cq2[ix][iw][ik] = cmul(cq[iw][ik],cshift1);			cq3[ix][iw][ik] = cmul(cq1[iw][ik],cshift1);                                 }                else{                phase1 =-w*sqrt(-kz1)*dz/V[ix];                cshift1 =cexp(cmplx(phase1,w*dz/V[ix]));                cq2[ix][iw][ik] = cmul(cq[iw][ik],cshift1);		cq3[ix][iw][ik] = cmul(cq1[iw][ik],cshift1);                }        }                                pfa2cc(1,1,nk,nw,cq2[ix][0]);	pfa2cc(1,1,nk,nw,cq3[ix][0]);        for(ik=0;ik<nx;++ik)                for(iw=0,w=fw;iw<nw;w+=dw,++iw){float a=0.015,g=1.0;int i,I=10;if(ik<=I)g=exp(-a*(I-ik)*(I-ik));if(ik>=nx-I)g=exp(-a*(-nx+I+ik)*(-nx+I+ik));                cq2[ix][iw][ik] = crmul( cq2[ix][iw][ik], g*1.0/nxfft);                cq2[ix][iw][ik] =ik%2 ? cneg(cq2[ix][iw][ik]) : cq2[ix][iw][ik];		cq3[ix][iw][ik] = crmul( cq3[ix][iw][ik], g*1.0/nxfft);		cq3[ix][iw][ik] =ik%2 ? cneg(cq3[ix][iw][ik]) : cq3[ix][iw][ik];        }}        for(ix=0;ix<nx;++ix)        for(ik=0;ik<Bz;++ik){        if(((v[iz][ix]>=V[ik])&&(v[iz][ix]<V[ik+1]))) {                  v1=V[ik];v2=V[ik+1];                        for(iw=0,w=fw;iw<nw;w+=dw,++iw){                  a1=cq2[ik][iw][ix].r;a2=cq2[ik+1][iw][ix].r;                theta1=cq2[ik][iw][ix].i ;theta2=cq2[ik+1][iw][ix].i;                a= a1*(v2-v[iz][ix])/(v2-v1)+a2*(v[iz][ix]-v1)/(v2-v1);                theta=theta1*(v2-v[iz][ix])/(v2-v1)+theta2*(v[iz][ix]-v1)/(v2-v1);                cp[iw][ix] =cmplx(a,theta);                a1=cq3[ik][iw][ix].r;a2=cq3[ik+1][iw][ix].r;                theta1=cq3[ik][iw][ix].i ;theta2=cq3[ik+1][iw][ix].i;                a= a1*(v2-v[iz][ix])/(v2-v1)+a2*(v[iz][ix]-v1)/(v2-v1);                theta=theta1*(v2-v[iz][ix])/(v2-v1)+theta2*(v[iz][ix]-v1)/(v2-v1);                cp1[iw][ix] =cmplx(a,theta);                   }        break;                  }}        free3complex(cq2);	free3complex(cq3);        free1float(V);}                                        }pvm_initsend(PvmDataDefault);pvm_pkint(&mytid,1,1);msgtype=COM_MSGTYPE;pvm_send(parent_tid,msgtype);free2complex(cp);free2complex(cp1);free2complex(cq);free2complex(cq1);}end:pvm_initsend(PvmDataDefault);pvm_pkfloat(cresult[0],nxo*nz,1);msgtype=RESULT_MSGTYPE;pvm_send(parent_tid,msgtype);msgtype=COM_MSGTYPE;pvm_recv(-1,msgtype);pvm_exit();exit(0);}

⌨️ 快捷键说明

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