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; }
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; }
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; }