Пример #1
0
int main(int  argc,char **argv)
{
    sf_init(argc,argv);

    sf_file Fix, Fiy, Fiz;
    sf_file Fi1, Fi2, Fi3;
    sf_file Fo1, Fo2;

    clock_t t1, t2;
    float   timespent;

    t1=clock();

   int isep;

   if (!sf_getint("isep",&isep)) isep=1;

    /* setup I/O files */
    Fix = sf_input("in");
    Fiy = sf_input("apvyy");
    Fiz = sf_input("apvzz");

    Fi1 = sf_input("PseudoPurePx"); /* pseudo-pure P-wave x-component */
    Fi2 = sf_input("PseudoPurePy"); /* pseudo-pure P-wave y-component */
    Fi3 = sf_input("PseudoPurePz"); /* pseudo-pure P-wave z-component */
    Fo1 = sf_output("out");               /* pseudo-pure scalar P-wave */
    Fo2 = sf_output("PseudoPureSepP");    /* separated scalar P-wave */

    int     nx, ny, nz, nxf, nyf, nzf, hnx, hny, hnz, i, j, k;
    float   fx, fy, fz, dx, dy, dz, dxf, dyf, dzf;

    /* Read/Write axes */
    sf_axis az, ax, ay;

    az = sf_iaxa(Fi1,1); nz = sf_n(az); dz = sf_d(az)*1000.0;
    ax = sf_iaxa(Fi1,2); nx = sf_n(ax); dx = sf_d(ax)*1000.0;
    ay = sf_iaxa(Fi1,3); ny = sf_n(ay); dy = sf_d(ay)*1000.0;
    fy=sf_o(ay)*1000.0;
    fx=sf_o(ax)*1000.0;
    fz=sf_o(az)*1000.0;

    sf_warning("nx=%d ny=%d nz=%d dx=%f dy=%f dz=%f",nx,ny,nz,dx,dy,dz);

    puthead3x(Fo1, nz, nx, ny, dz/1000.0, dx/1000.0, dy/1000.0, 0.0, 0.0, 0.0);
    puthead3x(Fo2, nz, nx, ny, dz/1000.0, dx/1000.0, dy/1000.0, 0.0, 0.0, 0.0);

    float*** px=sf_floatalloc3(nz,nx,ny);
    float*** py=sf_floatalloc3(nz,nx,ny);
    float*** pz=sf_floatalloc3(nz,nx,ny);
    float*** p=sf_floatalloc3(nz,nx,ny);

    int iy, ix, iz;

    for(iy=0;iy<ny;iy++)
    for(ix=0;ix<nx;ix++)
    {
      sf_floatread(px[iy][ix],nz,Fi1);
      sf_floatread(py[iy][ix],nz,Fi2);
      sf_floatread(pz[iy][ix],nz,Fi3);
    }

    for(iy=0;iy<ny;iy++)
    for(ix=0;ix<nx;ix++){
       for(iz=0;iz<nz;iz++)
          p[iy][ix][iz] = px[iy][ix][iz] + py[iy][ix][iz] + pz[iy][ix][iz];
       sf_floatwrite(p[iy][ix],nz,Fo1);
    }

if(isep==1){
    /* Read axes */
    sf_axis azf, axf, ayf;
    azf = sf_iaxa(Fix,1); nzf = sf_n(azf); dzf = sf_d(azf)*1000.0;
    axf = sf_iaxa(Fix,2); nxf = sf_n(axf); dxf = sf_d(axf)*1000.0;
    ayf = sf_iaxa(Fix,3); nyf = sf_n(ayf); dyf = sf_d(ayf)*1000.0;

    if(dx!=dxf){
       sf_warning("dx= %f dxf=%f",dx,dxf);
       sf_warning("filter and data spatial sampling don't match in x-axis");
       exit(0);
    }
    if(dy!=dyf){
       sf_warning("dy= %f dyf=%f",dy,dyf);
       sf_warning("filter and data spatial sampling don't match in y-axis");
       exit(0);
    }
    if(dz!=dzf){
       sf_warning("dz= %f dzf=%f",dz,dzf);
       sf_warning("filter and data spatial sampling don't match in z-axis");
       exit(0);
    }

    float*** apvxx=sf_floatalloc3(nzf,nxf,nyf);
    float*** apvyy=sf_floatalloc3(nzf,nxf,nyf);
    float*** apvzz=sf_floatalloc3(nzf,nxf,nyf);

    hnx=nxf/2;
    hny=nyf/2;
    hnz=nzf/2;

    sf_warning("nxf=%d nyf=%d nzf=%d dxf=%f dyf=%f dzf=%f",nxf,nyf,nzf,dxf,dyf,dzf);

    for(iy=0;iy<nyf;iy++)
    for(ix=0;ix<nxf;ix++)
    {
      sf_floatread(apvxx[iy][ix],nzf,Fix);
      sf_floatread(apvyy[iy][ix],nzf,Fiy);
      sf_floatread(apvzz[iy][ix],nzf,Fiz);
    }

    float*** pxc=sf_floatalloc3(nz,nx,ny);
    float*** pyc=sf_floatalloc3(nz,nx,ny);
    float*** pzc=sf_floatalloc3(nz,nx,ny);
    zero3float(pxc, nz,nx,ny);
    zero3float(pyc, nz,nx,ny);
    zero3float(pzc, nz,nx,ny);

    int l, g, h, ll, gg, hh;

    for(j=0;j<ny;j++){
      sf_warning("ny=%d iy=%d",ny,j);
      for(i=0;i<nx;i++)
      for(k=0;k<nz;k++)
      {

        for(g=-hny; g<=hny; g++){
            gg=g+hny;
            for(l=-hnx; l<=hnx; l++){
                ll=l+hnx;
                for(h=-hnz; h<=hnz; h++)
                {
                    hh=h+hnz;
                    if(i+l>=0 && i+l<nx && j+g>=0 && j+g<ny && k+h>=0 && k+h<nz){
                        pyc[i][j][k]+=py[i+l][j+g][k+h]*apvxx[gg][ll][hh];
                        pxc[i][j][k]+=px[i+l][j+g][k+h]*apvyy[gg][ll][hh];
                        pzc[i][j][k]+=pz[i+l][j+g][k+h]*apvzz[gg][ll][hh];
                    }
                } // h loop
             } // g loop
          }// l oop
       }
    }
/*
    int iix, iiy, iiz;

    for(iy=0;iy<ny;iy++)
    for(ix=0;ix<nx;ix++)
       for(iz=0;iz<nz;iz++){
          pxc[iy][ix][iz]=px[iy][ix][iz];
          pyc[iy][ix][iz]=py[iy][ix][iz];
          pzc[iy][ix][iz]=pz[iy][ix][iz];
          iix=ix-nx/2;
          iiy=iy-ny/2;
          iiz=iz-nz/2;
          if(sqrt(1.0*(iix*iix+iiy*iiy+iiz*iiz))<3.0*nx/8)
          {
             pxc[iy][ix][iz] = 0.0;
             pyc[iy][ix][iz] = 0.0;
             pzc[iy][ix][iz] = 0.0;
          }
       }
*/
    for(iy=0;iy<ny;iy++)
    for(ix=0;ix<nx;ix++){
       for(iz=0;iz<nz;iz++)
          p[iy][ix][iz] = pxc[iy][ix][iz] + pyc[iy][ix][iz] + pzc[iy][ix][iz];
       sf_floatwrite(p[iy][ix],nz,Fo2);
    }
    free(**pxc);
    free(**pyc);
    free(**pzc);
    free(**apvxx);
    free(**apvyy);
    free(**apvzz);
}// endif
    t2=clock();
    timespent=(float)(t2-t1)/CLOCKS_PER_SEC;
    sf_warning("Computation time (Filtering): %f (second)",timespent);

    free(**px);
    free(**py);
    free(**pz);

    free(**p);
		
    return 0;
}
Пример #2
0
int main(int  argc,char **argv)
{
    int   isx,isy,isz,bd;

    int   i,j,k,im,jm,it;
	int   nth, rank;
    float t;
    float fx,fy,fz,dt2;

    float ***c11, ***c22, ***c33, ***c12, ***c13, ***c23, ***c44, ***c55, ***c66;
    float ***phaix, ***phaiy, ***phaiz;

    sf_init(argc,argv);

    sf_file Fo1, Fo2, Fo3;

    float f0=40;         // main frequency of the wavelet(usually 30Hz)
    float t0=0.04;       // time delay of the wavelet(if f0=30Hz, t0=0.04s)*/
    float A=1.0;           // the amplitude of wavelet 

    clock_t t1, t2, t3;
    float   timespent;

    t1=clock();

    /* time samping paramter */
    if (!sf_getint("nt",&nt))   nt=301;
    if (!sf_getfloat("dt",&dt)) dt=0.001;
    if (!sf_getint("bd",&bd)) bd=20;

    sf_warning("nt=%d dt=%f",nt,dt);

    /* setup I/O files */
    sf_file Fc11, Fc22, Fc33, Fc12, Fc13, Fc23, Fc44, Fc55, Fc66;
    sf_file Fphiz, Fphiy, Fphix;

    Fc11 = sf_input ("c11");  /* c11 using standard input */
    Fc22 = sf_input ("c22");  /* c22 */
    Fc33 = sf_input ("c33");  /* c33 */
    Fc12 = sf_input ("c12");  /* c12 */
    Fc13 = sf_input ("c13");  /* c13 */
    Fc23 = sf_input ("c23");  /* c23 */
    Fc44 = sf_input ("c44");  /* c44 */
    Fc55 = sf_input ("c55");  /* c55 */
    Fc66 = sf_input ("c66");  /* c66 */
    Fphix = sf_input ("phix");  /* phix x ccw*/
    Fphiy = sf_input ("phiy");  /* phiy y ccw*/
    Fphiz = sf_input ("phiz");  /* phiz z ccw */

    /* Read/Write axes */
    sf_axis az, ax, ay;
    az = sf_iaxa(Fc11,1); nz = sf_n(az); dz = sf_d(az)*1000.0;
    ax = sf_iaxa(Fc11,2); nx = sf_n(ax); dx = sf_d(ax)*1000.0;
    ay = sf_iaxa(Fc11,3); ny = sf_n(ay); dy = sf_d(ay)*1000.0;
    fy=sf_o(ay)*1000.0;
    fx=sf_o(ax)*1000.0;
    fz=sf_o(az)*1000.0;

    int nxpad, nypad, nzpad;

    nxpad=nx+2*bd;
    nypad=ny+2*bd;
    nzpad=nz+2*bd;

    sf_warning("nxpad=%d nypad=%d nzpad=%d ",nxpad,nypad,nzpad);
    sf_warning("dx=%f dy=%f dz=%f ",dx,dy,dz);

    c11=sf_floatalloc3(nzpad,nxpad,nypad);	
    c22=sf_floatalloc3(nzpad,nxpad,nypad);
    c33=sf_floatalloc3(nzpad,nxpad,nypad);	
    c12=sf_floatalloc3(nzpad,nxpad,nypad);
    c13=sf_floatalloc3(nzpad,nxpad,nypad);	
    c23=sf_floatalloc3(nzpad,nxpad,nypad);
    c44=sf_floatalloc3(nzpad,nxpad,nypad);
    c55=sf_floatalloc3(nzpad,nxpad,nypad);	
    c66=sf_floatalloc3(nzpad,nxpad,nypad);	
    phaix=sf_floatalloc3(nzpad,nxpad,nypad);
    phaiy=sf_floatalloc3(nzpad,nxpad,nypad);
    phaiz=sf_floatalloc3(nzpad,nxpad,nypad);

    /* read velocity model */
    for(i=bd;i<nypad-bd;i++)
        for(j=bd;j<nxpad-bd;j++){
          sf_floatread(&c11[i][j][bd],nz,Fc11);
          sf_floatread(&c22[i][j][bd],nz,Fc22);
          sf_floatread(&c33[i][j][bd],nz,Fc33);
          sf_floatread(&c12[i][j][bd],nz,Fc12);
          sf_floatread(&c13[i][j][bd],nz,Fc13);
          sf_floatread(&c23[i][j][bd],nz,Fc23);
          sf_floatread(&c44[i][j][bd],nz,Fc44);
          sf_floatread(&c55[i][j][bd],nz,Fc55);
          sf_floatread(&c66[i][j][bd],nz,Fc66);
          sf_floatread(&phaix[i][j][bd],nz,Fphix);
          sf_floatread(&phaiy[i][j][bd],nz,Fphiy);
          sf_floatread(&phaiz[i][j][bd],nz,Fphiz);
       }

    vmodelboundary3d(c11, nx, ny, nz, nxpad, nypad, nzpad, bd);
    vmodelboundary3d(c22, nx, ny, nz, nxpad, nypad, nzpad, bd);
    vmodelboundary3d(c33, nx, ny, nz, nxpad, nypad, nzpad, bd);
    vmodelboundary3d(c12, nx, ny, nz, nxpad, nypad, nzpad, bd);
    vmodelboundary3d(c13, nx, ny, nz, nxpad, nypad, nzpad, bd);
    vmodelboundary3d(c23, nx, ny, nz, nxpad, nypad, nzpad, bd);
    vmodelboundary3d(c44, nx, ny, nz, nxpad, nypad, nzpad, bd);
    vmodelboundary3d(c55, nx, ny, nz, nxpad, nypad, nzpad, bd);
    vmodelboundary3d(c66, nx, ny, nz, nxpad, nypad, nzpad, bd);
    vmodelboundary3d(phaix, nx, ny, nz, nxpad, nypad, nzpad, bd);
    vmodelboundary3d(phaiy, nx, ny, nz, nxpad, nypad, nzpad, bd);
    vmodelboundary3d(phaiz, nx, ny, nz, nxpad, nypad, nzpad, bd);

    for(i=0;i<nypad;i++)
        for(j=0;j<nxpad;j++)
          for(k=0;k<nzpad;k++){
             phaix[i][j][k] *= SF_PI/180.0;
             phaiy[i][j][k] *= SF_PI/180.0;
             phaiz[i][j][k] *= SF_PI/180.0;
          }
    sf_warning("Read velocity model parameters ok !");

    int mm=2*_m+1;
    int mmix=2*_mix+1;
 
    sf_warning("m=%d mix=%d",_m,_mix);

    float *coeff_2dx,*coeff_2dy,*coeff_2dz,*coeff_1dx,*coeff_1dy,*coeff_1dz;

    coeff_2dy=sf_floatalloc(mm);
    coeff_2dx=sf_floatalloc(mm);
    coeff_2dz=sf_floatalloc(mm);
    coeff_1dy=sf_floatalloc(mmix);
    coeff_1dx=sf_floatalloc(mmix);
    coeff_1dz=sf_floatalloc(mmix);

    coeff2d(coeff_2dx,dx);
    coeff2d(coeff_2dy,dy);
    coeff2d(coeff_2dz,dz);

    coeff1dmix(coeff_1dx, dx);
    coeff1dmix(coeff_1dy, dy);
    coeff1dmix(coeff_1dz, dz);

    float*** p1=sf_floatalloc3(nzpad,nxpad,nypad);
    float*** p2=sf_floatalloc3(nzpad,nxpad,nypad);
    float*** p3=sf_floatalloc3(nzpad,nxpad,nypad);

    zero3float(p1,nzpad,nxpad,nypad);
    zero3float(p2,nzpad,nxpad,nypad);
    zero3float(p3,nzpad,nxpad,nypad);
    
    float*** q1=sf_floatalloc3(nzpad,nxpad,nypad);
    float*** q2=sf_floatalloc3(nzpad,nxpad,nypad);
    float*** q3=sf_floatalloc3(nzpad,nxpad,nypad);

    zero3float(q1,nzpad,nxpad,nypad);
    zero3float(q2,nzpad,nxpad,nypad);
    zero3float(q3,nzpad,nxpad,nypad);

    float*** r1=sf_floatalloc3(nzpad,nxpad,nypad);
    float*** r2=sf_floatalloc3(nzpad,nxpad,nypad);
    float*** r3=sf_floatalloc3(nzpad,nxpad,nypad);

    zero3float(r1,nzpad,nxpad,nypad);
    zero3float(r2,nzpad,nxpad,nypad);
    zero3float(r3,nzpad,nxpad,nypad);

    t2=clock();

    /* setup I/O files */
    Fo1 = sf_output("out");      /* original elasticwave iLine x-component */
    Fo2 = sf_output("Elasticy"); /* original elasticwave iLine y-component */
    Fo3 = sf_output("Elasticz"); /* original elasticwave xLine z-component */

    puthead3x(Fo1, nz, nx, ny, dz/1000.0, dx/1000.0, dy/1000.0, 0.0, 0.0, 0.0);
    puthead3x(Fo2, nz, nx, ny, dz/1000.0, dx/1000.0, dy/1000.0, 0.0, 0.0, 0.0);
    puthead3x(Fo3, nz, nx, ny, dz/1000.0, dx/1000.0, dy/1000.0, 0.0, 0.0, 0.0);

    /* source definition */
    isy=nypad/2;
    isx=nxpad/2;
    isz=nzpad/2;

    dt2=dt*dt;

#ifdef _OPENMP
    #pragma omp parallel
	{
	  nth = omp_get_num_threads();
	  rank = omp_get_thread_num();
	  sf_warning("Using %d threads, this is %dth thread",nth, rank);
	}
#endif

    float*** px_tmp=sf_floatalloc3(nzpad,nxpad,nypad);
    float*** pz_tmp=sf_floatalloc3(nzpad,nxpad,nypad);
    float*** qx_tmp=sf_floatalloc3(nzpad,nxpad,nypad);
    float*** qz_tmp=sf_floatalloc3(nzpad,nxpad,nypad);
    float*** rx_tmp=sf_floatalloc3(nzpad,nxpad,nypad);
    float*** rz_tmp=sf_floatalloc3(nzpad,nxpad,nypad);

	/*********the kernel calculation ************/
	for(it=0;it<nt;it++)
	{
	     t=it*dt;
             
         /* source Type 0: oriented 45 degree to vertical and 45 degree azimuth: Yan & Sava (2012) */
         p2[isy][isx][isz]+=Ricker(t, f0, t0, A);  // x-component
         q2[isy][isx][isz]+=Ricker(t, f0, t0, A);  // y-component
         r2[isy][isx][isz]+=Ricker(t, f0, t0, A);  // z-component

             // 3D exploding force source (e.g., Wu's PhD

/*               for(k=-1;k<=1;k++)*/
/*               for(i=-1;i<=1;i++)*/
/*               for(j=-1;j<=1;j++)*/
/*               {*/
/*                if(fabs(i)+fabs(j)+fabs(k)==3)*/
/*                {*/
/*                     p2[isy+k][isx+i][isz+j]+=i*Ricker(t, f0, t0, A);  // x-component*/
/*                     q2[isy+k][isx+i][isz+j]+=k*Ricker(t, f0, t0, A);  // y-component*/
/*                     r2[isy+k][isx+i][isz+j]+=j*Ricker(t, f0, t0, A);  // z-component*/
/*                }*/
/*               }*/
               
  	     fwportelastic3d(dt2,p1,p2,p3,q1,q2,q3,r1,r2,r3,
				         px_tmp,pz_tmp,
				         qx_tmp,qz_tmp,
				         rx_tmp,rz_tmp,
                         coeff_2dx,coeff_2dy,coeff_2dz,
                         coeff_1dx,coeff_1dy,coeff_1dz,
                         dx,dy,dz,nxpad,nypad,nzpad,
			 c11,c22,c33,c12,c13,c23,c44,c55,c66,phaix,phaiy,phaiz);

         if(it==nt-1) // output snapshot
         {
            // output iLine 
	     	for(i=0;i<ny;i++)
                {
                    im=i+bd;
		            for(j=0;j<nx;j++)
                    {
                        jm=j+bd;
                        sf_floatwrite(&p3[im][jm][bd],nz,Fo1);
                        sf_floatwrite(&q3[im][jm][bd],nz,Fo2);
                        sf_floatwrite(&r3[im][jm][bd],nz,Fo3);
                    }
                }
             }
            for(i=0;i<nypad;i++)
            for(j=0;j<nxpad;j++)
            for(k=0;k<nzpad;k++)
            {
                    p1[i][j][k]=p2[i][j][k];
                    p2[i][j][k]=p3[i][j][k];

                    q1[i][j][k]=q2[i][j][k];
                    q2[i][j][k]=q3[i][j][k];

                    r1[i][j][k]=r2[i][j][k];
                    r2[i][j][k]=r3[i][j][k];
           }

           sf_warning("forward propagation...  it= %d   t=%f",it,t);
     }

    printf("ok3\n");

    t3=clock();
    timespent=(float)(t3-t2)/CLOCKS_PER_SEC;
    sf_warning("CPU time for 3D ORT elastic modeling: %f(second)",timespent);

    free(**p1);
    free(**p2);
    free(**p3);
    free(**q1);
    free(**q2);
    free(**q3);
    free(**r1);
    free(**r2);
    free(**r3);
    free(**px_tmp);
    free(**qx_tmp);
    free(**rx_tmp);
    free(**pz_tmp);
    free(**qz_tmp);
    free(**rz_tmp);

    free(**c11);
    free(**c33);
    free(**c13);
    free(**c55);
    free(**c66);
    free(**phaiz);
    free(**phaiy);
    free(**phaix);
		
    return 0;
}
Пример #3
0
int main(int  argc,char **argv)
{
    sf_init(argc,argv);

    float   vp0,vs0,ga1,ep1,de1,ga2,ep2,de2,de3,alpha,the,phi;
    float   dx,dy,dz,dkx,dky,dkz,fkx,fky,fkz;

    int     i,j,k,ix,iy,hny,hnx,hnz,ny,nx,nz,itaper;

    double  sinx, siny, sinz, sinx2, siny2, sinz2, k2, vp2, vs2, kx, ky, kz;

    clock_t t1, t2;
    float   timespent;

    t1=clock();

    /* time samping paramter */
    if (!sf_getfloat("vp0",&vp0)) vp0=3000.0;
    if (!sf_getfloat("vs0",&vs0)) vs0=1500.0;
    if (!sf_getfloat("de1",&de1)) de1=0.05;
    if (!sf_getfloat("de2",&de2)) de2=-0.05;
    if (!sf_getfloat("de3",&de3)) de3=0.15;
    if (!sf_getfloat("ep1",&ep1)) ep1=0.2;
    if (!sf_getfloat("ep2",&ep2)) ep2=0.05;
    if (!sf_getfloat("ga1",&ga1)) ga1=0.1;
    if (!sf_getfloat("ga2",&ga2)) ga2=0.1;

    if (!sf_getfloat("alpha",&alpha)) alpha=0.;
    if (!sf_getfloat("the",&the)) the=0.;
    if (!sf_getfloat("phi",&phi)) phi=0.;

    if (!sf_getint("hnx",&hnx)) hnx=25;
    if (!sf_getint("hny",&hny)) hny=25;
    if (!sf_getint("hnz",&hnz)) hnz=25;

    if (!sf_getfloat("dx",&dx)) dx=10.;
    if (!sf_getfloat("dy",&dy)) dy=10.;
    if (!sf_getfloat("dz",&dz)) dz=10.;

    itaper=1;
    nx=2*hnx+1;
    ny=2*hny+1;
    nz=2*hnz+1;

    sf_warning("itaper=%d ",itaper);
    sf_warning("nx=%d ",nx);
    sf_warning("ny=%d ",ny);
    sf_warning("nz=%d ",nz);
    sf_warning("dx=%f ",dx);
    sf_warning("dy=%f ",dy);
    sf_warning("dz=%f ",dz);

    dkx=2*PI/dx/nx;
    dkz=2*PI/dz/nz;
    dky=2*PI/dy/ny;

    fkx=-PI/dx;
    fky=-PI/dy;
    fkz=-PI/dz;

    sf_warning("vp0=%f ",vp0);
    sf_warning("vs0=%f ",vs0);
    sf_warning("de1=%f ",de1);
    sf_warning("de2=%f ",de2);
    sf_warning("de3=%f ",de3);
    sf_warning("ep1=%f ",ep1);
    sf_warning("ep2=%f ",ep2);
    sf_warning("ga1=%f ",ga1);
    sf_warning("ga2=%f ",ga2);

    sf_warning("alpha=%f ",alpha);
    sf_warning("the=%f ",the);
    sf_warning("phi=%f ",phi);

    alpha *= PI/180.0;
    the *= PI/180.0;
    phi *= PI/180.0;
    
    char    jobz='V';  /* for SVD */
    char    uplo='U';  /* for SVD */
    int     M=3;  /* for SVD */
    int     LDA=M;  /* for SVD */
    int     LWORK=4*M;  /* for SVD */
    int     INFO;  /* for SVD */
    double  *Chr, *w, *work;  /* Lapack SVD array */
    Chr=calloc(sizeof(double),M*M);
    w=calloc(sizeof(double),M*M);
    work=calloc(sizeof(double),LWORK);

    //double A[3][3],w[3],Q[3][3];

    float*** apvx=sf_floatalloc3(nz,nx,ny);
    float*** apvy=sf_floatalloc3(nz,nx,ny);
    float*** apvz=sf_floatalloc3(nz,nx,ny);

    vp2=vp0*vp0;
    vs2=vs0*vs0;
    ep1=1+2*ep1;
    de1=1+2*de1;
    ga1=1+2*ga1;
    ep2=1+2*ep2;
    de2=1+2*de2;
    ga2=1+2*ga2;
    de3=1+2*de3;

    double a11, a22, a33, a44, a55, a66, a12a66, a23a44, a13a55;

    a11 = ep2*vp2;
    a22 = ep1*vp2;
    a33 = vp2;
    a44 = ga1/ga2*vs2;
    a55 = vs2;
    a66 = ga1*vs2;
    a23a44 = sqrt((a33-a44)*(de1*a33-a44));//a23+a44
    a12a66 = sqrt((a11-a66)*(de3*a11-a66));//a12+a66
    a13a55 = sqrt((a33-a55)*(de2*a33-a55));//a13+a55

    int jhny, ihnx, khnz;

    zero3float(apvy, nz, nx, ny);
    zero3float(apvx, nz, nx, ny);
    zero3float(apvz, nz, nx, ny);

    int      iz;
    float    rkx, rky, rkz;

    float*** taper=sf_floatalloc3(nz,nx,ny);
    
    for( j=-hny; j<=hny; j++){
          jhny=j+hny;
	  ky=j*dky;
          rky=2*PI*j/ny;
         //sf_warning("j=%d jhny=%d ky=%f ",j,jhny,ky);
	  for( i=-hnx; i<=hnx; i++ ){
                ihnx=i+hnx;
		kx=i*dkx;
                rkx=2*PI*i/nx;
		for( k=-hnz; k<=hnz; k++)
		{
                        khnz=k+hnz;
                        rkz=2*PI*k/nz;

                        taper[jhny][ihnx][khnz]=pow((TAPER(rky)*TAPER(rkx)*TAPER(rkz)), 1.0/100.0);

			if(i==0 && j==0 && k==0)
                        {
			   apvy[jhny][ihnx][khnz]=1.0;
			   apvx[jhny][ihnx][khnz]=1.0;
			   apvz[jhny][ihnx][khnz]=1.0;
			   continue;
                        }

                         if(kx==0.0)   //move this sample from zero for cintinuous spectrum
                             kx = 0.0000000001*dkx;
                         if(ky==0.0)   //move this sample from zero for cintinuous spectrum
                             ky = 0.0000000001*dky;
                         if(kz==0.0)   //move this sample from zero for cintinuous spectrum
                             kz = 0.0000000001*dkz;

                        //sf_warning("j= %d i= %d  k=%d ",j,i,k);

			kz=k*dkz;
			k2=sqrt(kx*kx+ky*ky+kz*kz);
			sinx=kx/k2;
			siny=ky/k2;
			sinz=kz/k2;

			sinx2=sinx*sinx;
			siny2=siny*siny;
			sinz2=sinz*sinz;
/*
			A[0][0] = a11*sinx2 + a66*siny2 + a55*sinz2;
			A[0][1] = A[0][1] = a12a66*sinx*siny;
			A[0][2] = A[2][0] = a13a55*sinx*sinz;
			A[1][1] = a66*sinx2 + a22*siny2 + a44*sinz2;
			A[1][2] = A[2][1] = a23a44*siny*sinz;
			A[2][2] = a55*sinx2 + a44*siny2 + a33*sinz2;

                        // Hybrid algorithm of eigeinvalue solution for hermitian 3X3 matrices
                        if( dsyevh3(A, Q, w) != 0) {
                          sf_warning("dsyevh3 error !!!");
                          exit(0);
                        }

                        double upy, upx, upz;

                        upx=Q[0][0];
                        upy=Q[1][0];
                        upz=Q[2][0];

 */
			Chr[0] = a11*sinx2 + a66*siny2 + a55*sinz2;
			Chr[1] = a12a66*sinx*siny;
			Chr[2] = a13a55*sinx*sinz;
			Chr[3] = Chr[1];
			Chr[4] = a66*sinx2 + a22*siny2 + a44*sinz2;
			Chr[5] = a23a44*siny*sinz;
			Chr[6] = Chr[2];
			Chr[7] = Chr[5];
			Chr[8] = a55*sinx2 + a44*siny2 + a33*sinz2;

			dsyev_(&jobz, &uplo, &M, Chr, &LDA, w, work, &LWORK, &INFO);
                        
                        //sf_warning("v1=%f v2=%f v3=%f ",sqrt(w[0]), sqrt(w[1]),sqrt(w[2]));
                        //sf_warning("a1=%f a2=%f a3=%f ",Q[0][0],Q[1][0],Q[2][0]);
                        //sf_warning("b1=%f b2=%f b3=%f ",Q[0][1],Q[1][1],Q[2][1]);
                        //sf_warning("c1=%f c2=%f c3=%f ",Q[0][2],Q[1][2],Q[2][2]);
                        
                        /* get the closest direction to k */
                        if(upx*sinx + upy*siny+ upz*sinz < 0.) {
                            upx=-Q[0][0];
                            upy=-Q[1][0];
                            upz=-Q[2][0];
                        }

                        //sf_warning("v1=%f v2=%f v3=%f ",sqrt(w[0]), sqrt(w[1]),sqrt(w[2]));
                        //sf_warning("upx=%f upy=%f upz=%f ",upx,upy,upz);
                        //sf_warning("------------------------------------------------");

			apvy[jhny][ihnx][khnz]=(float)(upy/siny);
			apvx[jhny][ihnx][khnz]=(float)(upx/sinx);
			apvz[jhny][ihnx][khnz]=(float)(upz/sinz);

		}// k loop
           } // i loop
      } // j loop

/* Wang Tengfei
    for( j=0; j<ny ; j++)
         for( i=0; i<nx; i++ )
            for( k=0; k<nz ; k++)
            {
                if(fabs(apvy[j][i][k])==0)
                {
                    if(j==0)
                       apvy[j][i][k]=apvy[j+1][i][k];
                    else if(j==ny-1)
                       apvy[j][i][k]=apvy[j-1][i][k];
                    else
                       apvy[j][i][k]=(apvy[j+1][i][k] + apvy[j-1][i][k])/2.0;
                }
                if(fabs(apvx[j][i][k])==0)
                {
                    if(i==0)
                       apvx[j][i][k]=apvx[j][i+1][k];
                    else if(i==nx-1)
                       apvx[j][i][k]=apvx[j][i-1][k];
                    else
                       apvx[j][i][k]=(apvx[j][i+1][k] + apvx[j][i-1][k])/2.0;
                }
                if(fabs(apvz[j][i][k])==0)
                {
                    if(k==0)
                       apvz[j][i][k]=apvz[j][i][k+1] ;
                    else if(k==nz-1)
                       apvz[j][i][k]=apvz[j][i][k-1] ;
                    else
                       apvz[j][i][k]=(apvz[j][i][k+1] + apvz[j][i][k-1])/2.0;
                }
            }
*/
//  Cheng Jiubing
    for( j=0; j<ny ; j++)
         for( i=0; i<nx; i++ )
         {
             apvy[j][i][hnz]=(apvy[j][i][hnz+1] + apvy[j][i][hnz-1])/2.0;
             apvx[j][i][hnz]=(apvx[j][i][hnz+1] + apvx[j][i][hnz-1])/2.0;
             apvz[j][i][hnz]=(apvz[j][i][hnz+1] + apvz[j][i][hnz-1])/2.0;
         }
    for( j=0; j<ny ; j++)
         for( k=0; k<nz; k++ )
         {
             apvy[j][hnx][k]=(apvy[j][hnx+1][k] + apvy[j][hnx-1][k])/2.0;
             apvx[j][hnx][k]=(apvx[j][hnx+1][k] + apvx[j][hnx-1][k])/2.0;
             apvz[j][hnx][k]=(apvz[j][hnx+1][k] + apvz[j][hnx-1][k])/2.0;
         }
    for( i=0; i<nx ; i++)
         for( k=0; k<nz; k++ )
         {
             apvy[hny][i][k]=(apvy[hny+1][i][k] + apvy[hny-1][i][k])/2.0;
             apvx[hny][i][k]=(apvx[hny+1][i][k] + apvx[hny-1][i][k])/2.0;
             apvz[hny][i][k]=(apvz[hny+1][i][k] + apvz[hny-1][i][k])/2.0;
         }
//
    sf_file Fo1, Fo2, Fo3, Fo4;

    Fo1 = sf_output("out");    /* deviation operator's x-component in (ky,kx,kz) domain */
    Fo2 = sf_output("apvy");   /* deviation operator's y-component in (ky,kx,kz) domain */
    Fo3 = sf_output("apvz");   /* deviation operator's z-component in (ky,kx,kz) domain */
    Fo4 = sf_output("taper");  /* deviation operator's z-component in (ky,kx,kz) domain */

    puthead3kx(Fo1, nz, nx, ny, dkz, dkx, dky, fkz, fkx, fky);
    puthead3kx(Fo2, nz, nx, ny, dkz, dkx, dky, fkz, fkx, fky);
    puthead3kx(Fo3, nz, nx, ny, dkz, dkx, dky, fkz, fkx, fky);
    puthead3kx(Fo4, nz, nx, ny, dkz, dkx, dky, fkz, fkx, fky);

    for(iy=0;iy<ny;iy++)
    for(ix=0;ix<nx;ix++)
    for(iz=0;iz<nz;iz++)
    {
       apvx[iy][ix][iz] *= taper[iy][ix][iz];
       apvy[iy][ix][iz] *= taper[iy][ix][iz];
       apvz[iy][ix][iz] *= taper[iy][ix][iz];
    }

    for(iy=0;iy<ny;iy++)
    for(ix=0;ix<nx;ix++)
    {
      sf_floatwrite(apvx[iy][ix],nz,Fo1);
      sf_floatwrite(apvy[iy][ix],nz,Fo2);
      sf_floatwrite(apvz[iy][ix],nz,Fo3);
      sf_floatwrite(taper[iy][ix],nz,Fo4);
    }
    free(**taper);

    float*** apvxx=sf_floatalloc3(nz,nx,ny);
    float*** apvyy=sf_floatalloc3(nz,nx,ny);
    float*** apvzz=sf_floatalloc3(nz,nx,ny);

    kykxkz2yxz(apvy, apvyy, hny, hnx, hnz, ny, nx, nz);
    kykxkz2yxz(apvx, apvxx, hny, hnx, hnz, ny, nx, nz);
    kykxkz2yxz(apvz, apvzz, hny, hnx, hnz, ny, nx, nz);

    free(**apvx);
    free(**apvy);
    free(**apvz);

    sf_file Fo5, Fo6, Fo7;

    Fo5 = sf_output("apvxx");  /* deviation operator's x-component in (y,x,z) domain */ 
    Fo6 = sf_output("apvyy");  /* deviation operator's y-component in (y,x,z) domain */
    Fo7 = sf_output("apvzz");  /* deviation operator's z-component in (y,x,z) domain */

    puthead3x(Fo5, nz, nx, ny, dz/1000.0, dx/1000.0, dy/1000.0, 0.0, 0.0, 0.0);
    puthead3x(Fo6, nz, nx, ny, dz/1000.0, dx/1000.0, dy/1000.0, 0.0, 0.0, 0.0);
    puthead3x(Fo7, nz, nx, ny, dz/1000.0, dx/1000.0, dy/1000.0, 0.0, 0.0, 0.0);

    for(iy=0;iy<ny;iy++)
    for(ix=0;ix<nx;ix++)
    {
      sf_floatwrite(apvxx[iy][ix],nz,Fo5);
      sf_floatwrite(apvyy[iy][ix],nz,Fo6);
      sf_floatwrite(apvzz[iy][ix],nz,Fo7);
    }

    t2=clock();
    timespent=(float)(t2-t1)/CLOCKS_PER_SEC;
    sf_warning("CPU time for 3D ORT deviation operators: %f(second)",timespent);

   /****************End of Calculating Polarization Vector****************/
	free(**apvxx);
	free(**apvyy);
	free(**apvzz);

        //free(Chr);
        //free(w);
        //free(work);

	return 0;
}