#include "CalcMethod.h" #include "LEquations.h" #include "Matrix1.h" CalcMethod::CalcMethod(void) { } CalcMethod::~CalcMethod(void) { } //\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\/\/\/\/\/\\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\/\/\/\/\/\/\/\ float PI2=8.*atan(1.); float PI7=1./sqrt(2.); void CalcMethod::stl_dt(float t,float de,int ifmin,int ifmax,float dfinterval,float rb,float R_TOOL,float DEN_BORE_FLUID, float VIS, float POR,float dkb,float dkbf,float PERM,float vbf,float VS,float FMST,float SPACEE,complex kew[512],float FWFSYN[1024],complexCFDWV0[1024],float dtf[3]) { int i; float s1,s2,s3,s4,ff,ww,QST,P,kdd,PI=3.1415926; complexai,ar,K,ftemp,PERMw,fe,ke,D,kee,BC,zx,wi[1024],wk[1024]; s1=0.0;s2=0.0;s3=s4=0.0; ai=complex(0.0,1.0); ar=complex(1.0,0.0); // AA=complex((8*3*PERM/POR),0.); for(i =ifmin;i(t*PERM*DEN_BORE_FLUID*ww/(VIS*POR),0.0)*ai; kee=sqrt(ar-ftemp/complex(2.,0.0))-ftemp; PERMw=PERM/kee;//动态渗透率 D=PERMw*dkbf/(VIS*POR*(de));//流体扩散系数 if(real(ke)-ww/vbf>0) { fe=sqrt(ke*ke-ww*ww/vbf/vbf);//径向波数 } else { fe=sqrt(-ke*ke+ww*ww/vbf/vbf); } CFB(fe*rb,wi,wk,0); BC=fe*rb*wi[1]/wi[0]; zx=rb*sqrt(complex(-1.*ww,0.0)*ai/D+ke*ke); CFB(zx,wi,wk,0); ftemp=complex(2.*DEN_BORE_FLUID*ww/((rb*rb-R_TOOL*R_TOOL)*VIS),0.0)*ai*PERMw *zx/(complex(1.,0.0)+pow(BC,complex(VS/vbf,0.0))) *wk[1]/wk[0]; // if(real(ftemp)>0.0)ftemp=complex(-real(ftemp),imag(ftemp)); K=sqrt(ke*ke+ftemp); //波数 QST=0.5*real(K)/imag(K); K=K*(ar+1/QST*ai/(complex(2.)))*(ar+1/QST*complex(log(ff/FMST))/(PI)); P=real(ke)/sqrt(real(K)*real(K)+imag(K)*imag(K)); kdd=real(K)*SPACEE;//qrt(real(ai*K*complex(SPACEE,0.0))*real(ai*K*complex(SPACEE,0.0))+imag(ai*K*complex(SPACEE,0.0))*imag(ai*K*complex(SPACEE,0.0)));//real(exp(ai*K*SPACE)); // aa[i]=fabs(real(K/ke)*FWFSYN[i]*real(CFDWV0[i])*real(exp(ai*K*SPACEE))); s1=P*FWFSYN[i]*kdd+s1; s2=s2+i*P*FWFSYN[i]*kdd; s3=s3+ww*ww*FWFSYN[i]*FWFSYN[i];//real(CFDWV0[i]); s4=s4+(kdd/ww-real(ke)*SPACEE/ww)*ww*ww*FWFSYN[i]*FWFSYN[i];//real(CFDWV0[i]); } dtf[0]=s2/s1*dfinterval; dtf[1]=s4/s3*1000000.; dtf[2]=QST; } float CalcMethod::prr_N(float wave_R[8][1024],float DT_INTERVAL,float TIME_L,float SPACE_RLEV,float time,float dt,int MMM) { double s1,s2,s3,s4; int iflag; float t,awave,aij,rr1; int ij,jj; s2=0.0; s4=0.0; iflag=0; if(fabs(time-dt*12)<1600) { for(t=0;t660)iflag=1; if(aij>float(jj)) { awave=(1-aij+jj)*wave_R[ij][jj]+(aij-jj)*wave_R[ij][jj+1]; } else { awave=(aij-jj+1)*wave_R[ij][jj]+(jj-aij)*wave_R[ij][jj-1]; } s1=s1+sqrt(sqrt(fabs(awave)))*fabs(awave)/awave; s3=s3+sqrt(sqrt(fabs(awave))); } s2=s2+s1*s1*s1*s1; s4=s4+s3*s3*s3*s3; } rr1=sqrt(sqrt(s2/s4)); } else { rr1=0.0; } if(iflag==1)rr1=0.0; return rr1; } // // //以下为子程序 /// //// /// complex CalcMethod::DET(float vp, float vs,float vf,float den,float R, float w ,int IONLY) { return 0; } void CalcMethod::CFB(complex Z, complex wi[2], complex wk[2], int IONLY) { /* SUBROUTINE CFB(Z,I0,I1,K0,K1,IONLY) MW114420 C SUBROUTINE TO CALCULATE MODIFIED BESSEL FUNCTIONS MW114430 C I0,I1,K0,AND K1 FOR COMPLEX ARGUMENTS MW114440 C EQUATION NUMBERS REFER TO EQUATIONS IN MW114450 C ABRAMOWITZ AND STEGUN. MW114460 C IONLY IS SET TO 1 IF ONE WANTS TO CALCULATE I0 AND I1 ONLY. MW114470 */ complex Z2O4,ZT8,TOP,TERM,SUM; complex BF[100],I0,I1,K0,K1; complex temp1,temp2; float GAMMA,PIO2,TWOPI,PIT3O2,ORDER,SIGN,AMU,FACTK,SUMINV,X,Y,B; float CONV ; // float yyi,yyr; GAMMA=.5772156649015328; PIT3O2=4.712388981; PIO2=1.570796326794896; TWOPI=6.283185307179586; CONV=1.0e-12; //C PI=3.141592653589793 int I,II,j,JJ,jj,N; //C CALCULATE I0 AND I1 USING RECURRENCE RELATIONSHIP EQN 9.6.26... if (fabs(real(Z))<=15.0) { N=int(8.500+1.500*fabs(real(Z))) ; BF[N+2]=complex (0.00,0.00); BF[N+1]=complex (1.0e-20,1.0e-20); temp2=complex (2.0,0.0); SUM=complex (0.00,0.00) ; for(I=N;I>0;I--) { X=float(I); temp1=complex (X); BF[I]=temp1*temp2/Z*BF[I+1]+BF[I+2]; SUM=SUM+BF[I]; } //C NORMALIZE USING EQN 9.6.37 //MW114710 SUM=exp(Z)/(BF[1]+temp2*(SUM-BF[1])) ; I0=SUM*BF[1] ; I1=SUM*BF[2] ; //C ... OR AYMPTOTIC SERIES EQN 9.7.1 } else { temp1=complex (8.0,0.0); ZT8=Z*temp1 ; for(I=1;I<=2 ;I++) { ORDER=float(I-1) ; SIGN=-1.00; AMU=4.00*ORDER*ORDER ; SUM=complex (1.00,0.00) ; TERM=complex (1.00,0.00) ; Y=1.00 ; for( j=1;j<=15;j=j+2) { X=float(j) ; TERM=TERM* (complex)(AMU-X*X)/ZT8/(complex)(Y ); if (fabs(real(TERM)) (2.0,0.0); if(fabs(real(Z))<5.0) { K0=(log(Z/temp2)+complex(GAMMA,0.0))*complex(-1.,0.0)*I0; Z2O4=Z*Z/complex(4.00,0.00) ; FACTK=1.00; TOP=complex (1.00,0.00); SUMINV=0.0 ; for(jj=1;jj<25;jj++) { for( JJ=1;JJ<50;JJ++) { B=float(JJ); FACTK=FACTK*B; if(JJ>20) { float nnn=0; } TOP=TOP*Z2O4; SUMINV=SUMINV+1./B ; TERM=TOP/ complex(FACTK,0.0)/complex(FACTK,0.0)*complex(SUMINV,0.0); K0=K0+TERM ; if (fabs(real(TERM))(8.,0.) ; SUM=complex (1.0,0.0) ; TERM=complex (1.0,0.0); Y=1.0 ; for( II=1;II<30;II=II+2) { X=float(II) ; TERM=-TERM*complex(X,0.0)*complex(X,0.0)/ZT8/complex(Y,0.0); SUM=SUM+TERM; if (fabs(real(TERM))(1.00,0.0)/Z-I1*K0)/I0 ; wk[0]=K0; wk[1]=K1; } /// int CalcMethod::amp(float x[1024], int nl, float xr[1024],int i0) { int i,nfft,mm; float xi[1024],xmax; CString ss; nfft=1024; for(i=0;i<1024;i++)xi[i]=0.; for(i=0;i0) r4tx(NTHPO,X,Y);//X+1,X+2,X+3,Y,Y+1,Y+2,Y+3); for(J=1;J<=15;J++) { L[J-1]=1; M2=J-N2POW; if(M2 <=0 ) { M3=N2POW-J+1; L[J-1]=pow(2.0,M3); } } IJ=1; for(J1=1;J1<=N;J1++) { XX[J1]=X[J1-1]; YY[J1]=Y[J1-1]; } for(J1=1;J1<=L[14];J1++) { for(J2=J1;J2<=L[13];J2+=L[14]) { for(J3=J2;J3<=L[12];J3+=L[13]) { for(J4=J3;J4<=L[11];J4+=L[12]) { for(J5=J4;J5<=L[10];J5+=L[11]) { for(J6=J5;J6<=L[9];J6+=L[10]) { for(J7=J6;J7<=L[8];J7+=L[9]) { for(J8=J7;J8<=L[7];J8+=L[8]) { for(J9=J8;J9<=L[6];J9+=L[7]) { for(J10=J9;J10<=L[5];J10+=L[6]) { for(J11=J10;J11<=L[4];J11+=L[5]) { for(J12=J11;J12<=L[3];J12+=L[4]) { for(J13=J12;J13<=L[2];J13+=L[3]) { for(J14=J13;J14<=L[1];J14+=L[2]) { for(JI=J14;JI<=L[0];JI+=L[1]) { M4=IJ-JI; if(M4<0) { R=XX[IJ]; XX[IJ]=XX[JI]; XX[JI]=R; FI=YY[IJ]; YY[IJ]=YY[JI]; YY[JI]=FI; } IJ++; } } } } } } } } } } } } } } } // for(J1=1;J1<=N;J1++) { X[J1-1]=XX[J1]; Y[J1-1]=YY[J1]; } if(INN == 1) { for(I=0;I 0) { CR0[K+NXTLT]=C4*(BR0-BR1)-S4*(BI0-BI1); CI0[K+NXTLT]=C4*(BI0-BI1)+S4*(BR0-BR1); CR0[K+2*NXTLT]=C2*(BR2-BI3)-S2*(BI2+BR3); CI0[K+2*NXTLT]=C2*(BI2+BR3)+S2*(BR2-BI3); CR0[K+3*NXTLT]=C6*(BR2+BI3)-S6*(BI2-BR3); CI0[K+3*NXTLT]=C6*(BI2-BR3)+S6*(BR2+BI3); TR=PI7*(BR5-BI5); TI=PI7*(BR5+BI5); CR0[K+4*NXTLT]=C1*(BR4+TR)-S1*(BI4+TI); CI0[K+4*NXTLT]=C1*(BI4+TI)+S1*(BR4+TR); CR0[K+5*NXTLT]=C5*(BR4-TR)-S5*(BI4-TI); CI0[K+5*NXTLT]=C5*(BI4-TI)+S5*(BR4-TR); TR=-PI7*(BR7+BI7); TI=PI7*(BR7-BI7); CR0[K+6*NXTLT]=C3*(BR6+TR)-S3*(BI6+TI); CI0[K+6*NXTLT]=C3*(BI6+TI)+S3*(BR6+TR); CR0[K+7*NXTLT]=C7*(BR6-TR)-S7*(BI6-TI); CI0[K+7*NXTLT]=C7*(BI6-TI)+S7*(BR6-TR); } else { CR0[K+NXTLT]=BR0-BR1; CI0[K+NXTLT]=BI0-BI1; CR0[K+2*NXTLT]=BR2-BI3; CI0[K+2*NXTLT]=BI2+BR3; CR0[K+3*NXTLT]=BR2+BI3; CI0[K+3*NXTLT]=BI2-BR3; TR=PI7*(BR5-BI5); TI=PI7*(BR5+BI5); CR0[K+4*NXTLT]=BR4+TR; CI0[K+4*NXTLT]=BI4+TI; CR0[K+5*NXTLT]=BR4-TR; CI0[K+5*NXTLT]=BI4-TI; TR=-PI7*(BR7+BI7); TI=PI7*(BR7-BI7); CR0[K+6*NXTLT]=BR6+TR; CI0[K+6*NXTLT]=BI6+TI; CR0[K+7*NXTLT]=BR6-TR; CI0[K+7*NXTLT]=BI6-TI; } } } } void CalcMethod::wavelet( float INTA[1024],float ww[1024],int IP,int ipoint) { /* ! 此程序为小波变换 !* !* !* THIS PROGRAM COMPUTE THE ONE-DIMENSIONAL ORTHOGONORMAL !* WAVELETS TRANSFORM OF THE SIGNAL IN vp DATA !* FILE AND RECONSTRUCT THE ORIGINAL SIGNAL !* FROM ITS WAVELET DECOMPOSION USING THE !* MALLAT'S PYRAMIDAL ALGORITHM !* !* WRITTEN BY liweiyan !* 2004.8 !* !********************************************************************** !* !* PARAMETER DISCRIPTION: !* !* !* N == NUMBER OF DATA SAMPLES TO BE PROCESSED !* M == NUMBER OF fscaleS !* vp(I,J) == THE APPROXIMATION OF THE SIGNAL AT THE !* RESOLUTION 2^I AND TIME J.(NOTE:vp(0,J) !* CORRESPONDS TO THE ORIGINAL SIGNAL AT !* TIME J !* B(I,J) == THE WAVELET DECOMPOSITION RESULT AT !* RESOLUTION 2^I AND TIME J.(NOTE:I>=1) !* AA(I,J) == THE RECONSTRUCTED SIGNAL AT THE RESOLUTION !* 2^I AND TIME J.(NOTE:I>=0) !* fscale(I) == THE WAVELET COMPOSITION AT RESPONDING !* fscale IS VALUED 0 !* !* SUBROUTINE: !* !* DWT == COMPUTE THE ONE-DIMENSIONAL ORTOGONORMAL !* WAVELET TRANSFORM !* RECON_DWT == RECONSTRUCT THE ORIGINAL SIGNAL FROM !* ITS WAVELET DECOMPOSITION !* !***************************************************************** */ //! 输入参数名,个数与moC对应 // ! 下面可以定义处理程序的变量 float vp[7][1024],B[7][1024],AA[7][1024]; float C1[8],H[4],G[2],K1[6]; float wmax,wwmax; int M,N,fscale[7],i,k,I512; C1[0]=1.5; C1[1]=1.12; C1[2]=1.03; C1[3]=1.01; C1[4]=1.; C1[5]=1.; C1[6]=1.; C1[7]=1.; H[0]=0.125; H[1]=0.375; H[2]=0.375; H[3]=0.125; G[0]=-2.0; G[1]=2.0; K1[0]=0.0078125; K1[1]=0.054685; K1[2]=0.171875; K1[3]=-0.171875; K1[4]=-0.054685; K1[5]=-0.0078125; M=5; fscale[1]=0; fscale[2]=0; fscale[3]=0; fscale[4]=0; fscale[0]=0; if(IP<0) { fscale[1]=1; fscale[2]=1; fscale[3]=1; fscale[4]=0; fscale[0]=1; // fscale[IP]=1; } else { fscale[IP-1]=1; fscale[IP]=1; } I512=ipoint; N=512; if(I512>512)N=1024; wmax= vp[0][0]=fabs(INTA[0]); for(i=0;iwmax)wmax=fabs(vp[0][i]); } if(ipointwwmax)wwmax=fabs(vp[0][i]); } for( i=0;i0;K=K-1) { C2=C1[K-1]; for( I=N+1;I<=N+3*C;I++) { B[K][I]=-B[K][2*N-I]; AA[K][I]=AA[K][2*N-I]; } for( I=-C/2;I<=3*C;I++) { P=0.0; Q=0.0; for( J=-1;J<=2;J++) P=P+H[J+1]*AA[K][int(fabs((double)(I+C*J)))]; for( J=-3;J<=2;J++) { if((I-C*J)<0) { Q=Q+K1[J+3]*(-1)*B[K][int(fabs((double)(I-C*J)))]; } else { Q=Q+K1[J+3]*B[K][I-C*J]; } } AA[K-1][I+C/2]=P-C2*Q; } for(I=3*C+1;I<=N-C/2;I++) { P=0.0; Q=0.0; for( J=-1;J<=2;J++) P=P+H[J+1]*AA[K][I+C*J]; for( J=-3;J<=2;J++) Q=Q+K1[J+3]*B[K][I-C*J]; AA[K-1][I+C/2]=P-C2*Q; } C=C/2; } return; } complex CalcMethod::GetRootMonteCarlo(complex k0,float vp,float vs,float vf,float denf,float den,float R,float w,int n,float MTOOL,float R_TOOL,float df) { int mm=0; int k; float xx,yy,a,r,z,x1,y1,z1,eps=1.0e-10,k_real,k_imag; int nControlB=10; float xStart; // float PI=3.1415926; complex kw0,kw; // w=2*PI*fff; // k0=complex(w/vf/0.85,0.0); if(n==0) { if(vs>vf) { kw0=k0+complex (0.1,0.);//complex (w/vf+.10,0.0); } else { if(w>2000*2*3.1415926) { kw0=k0-complex (0.1,0.);//complex (w/vf-.10,0.0); } else { kw0=k0+complex (0.1,0.); } } // kw0=initialvalue(real(k0),imag(k0),vp,vs,vf,denf,den,R,w,n,MTOOL,R_TOOL,df); xStart=0.1; }//w/vf; if(n==1) { kw0=complex(w/vs/0.85,0.0); // kw0=initialvalue(real(k0),imag(k0),vp,vs,vf,denf,den,R,w,n,MTOOL,R_TOOL,df); xStart=.10;//w/vf; } a=xStart; k=1; r=1.0; xx=real(kw0); yy=imag(kw0); z=Func(xx,yy,vp,vs,vf,denf,den,R, w,n,MTOOL,R_TOOL);// whp i=3时,kew[i]=CalcMethod::GetRootMonteCarlo(k0, // ???è?????ó?vp while (a>=eps) { x1=-a+2.0*a*rnd(&r); x1=xx+x1; y1=-a+2.0*a*rnd(&r); y1=yy+y1; z1=Func(x1,y1,vp,vs,vf,denf,den,R,w,n,MTOOL,R_TOOL); k=k+1; if (z1>=z) { if (k>nControlB) { k=1; a=a/2.0; mm++; } } else { // k=1; xx=x1; yy=y1; z=z1; if (z(xx,yy); return kw; } } } k_real=xx; k_imag=yy; kw=complex (xx,yy); return kw; } float CalcMethod::rnd(float* r) { int m; float s,u,v,p; s=65536.0; u=2053.0; v=13849.0; m=(int)(*r/s); *r=*r-m*s; *r=u*(*r)+v; m=(int)(*r/s); *r=*r-m*s; p=*r/s; return(p); } float CalcMethod::Func(float x,float y ,float vp,float vs,float vf,float denf,float den,float R,float w,int n,float MTOOL,float R_TOOL) { complex M[4][4],C,fun,p,s,f,g,k,ttt; complexfr,sr,pr,fa,ai,inter[4],Inter; float arg0=0.0,SPACE=3.6; float kp,kf,ks,etool,temp; int i,j; int u[24][4]={{0,1,2,3},{0,1,3,2},{0,2,1,3},{0,2,3,1},{0,3,1,2},{0,3,2,1}, {1,0,2,3},{1,0,3,2},{1,2,0,3},{1,2,3,0},{1,3,0,2},{1,3,2,0}, {2,0,3,1},{2,0,1,3},{2,1,3,0},{2,1,0,3},{2,3,0,1},{2,3,1,0}, {3,0,1,2},{3,0,2,1},{3,1,2,0},{3,1,0,2},{3,2,0,1},{3,2,1,0}}; int t,sd[4]; // k=w/v; // w=w/1000.; // ttt=complex(1.e-10,0.0); k=complex(x,y); kp=w/vp; ks=w/vs; kf=w/vf; ai=complex(0.0,1.0); ttt=(k-complex(kf,0.0))*(k-complex(kf,0.0))*R*R; p=sqrt(k*k-complex(kp*kp,0)); s=sqrt(k*k-complex(ks*ks,0)); f=sqrt(k*k-complex(kf*kf,0)); complex common; inter[0]=pow(f*complex(R_TOOL/2,0),n); inter[1]=complex(cos(n*(arg0-3.1415926/2)),0); Inter=ai*k*complex(SPACE,0); inter[2]=complex(pow(2.718282,(double)real(Inter))*cos(imag(Inter)),pow(2.718282,(double)real(Inter))*sin(imag(Inter))); common=inter[3]=complex(1.0,0.0);//inter[0]*inter[1]*inter[2]/complex(1000.,0.0); fr=f*complex (R,0.0); pr=p*complex (R,0.0); sr=s*complex (R,0.0); fa=f*complex (R_TOOL,0.0); temp=MTOOL/R_TOOL; etool=(temp*real(f*Ibessel(1,fa))+denf*w*w*real(Ibessel(0,fa)))/(temp*real(f*Kbessel(1,fa))-denf*w*w*real(Kbessel(0,fa))); M[0][0]=complex (-1.,0.0)*complex (n/R,0.0)*Ibessel(n,fr)-f*Ibessel(n+1,fr); M[0][1]=complex (-1.,0.0)*p*(complex (-n,0)/(pr)*Kbessel(n,pr)+Kbessel(n+1,pr)); M[0][2]=complex (-1.,0.0)*complex (n/R,0)*Kbessel(n,sr); M[0][3]=ai*complex (-ks,0.0)*(complex (-n,0.0)/(sr)*Kbessel(n,sr)+Kbessel(n+1,sr)); M[1][0]=(complex (denf*w*w,0.0)*Ibessel(n,fr)); M[1][1]=(complex (den,0)*(complex (2.0*vs*vs,0)*k*k-complex (w*w,0.0))*Kbessel(n,pr)+complex (2.0*den*vs*vs/R,0.0)*p*((complex (n*(n-1),0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[1][2]=(complex (-2*n*den*vs*vs/R,0.0)*s*((complex (1-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); M[1][3]=(ai*k*complex (2*den*vs*vs,0.0)*s*s*Kbessel(n,sr)+ai*complex (2*ks*den*vs*vs/R,0)*((complex (n*(n-1),0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); M[2][0]=(0.0,0.0); M[2][1]=(complex (-2*n*den*vs*vs,0.0)*p*((complex (1-n,0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[2][2]=(complex (-den*vs*vs,0)*s*s*((complex (1.0,0.0)+complex (2*n*(n-1),0.0)/(sr*sr))*Kbessel(n,sr)+(complex (2,0.0)/sr)*Kbessel(n+1,sr))); M[2][3]=(ai*complex (2*ks*n*den*vs*vs/R,0)*((complex (1-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); M[3][0]=(0.0,0.0); M[3][1]=(ai*k*complex (-2*den*vs*vs,0)*p*((complex (-n,0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[3][2]=(ai*k*complex (-n*den*vs*vs/R,0)*Kbessel(n,sr)); M[3][3]=((k*k+s*s)*s*complex (den*vs*vs,0)*((complex (-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); if(MTOOL>0.01) { if(n==0) { complex aaa=Ibessel(n,fr); aaa=Ibessel(n+1,fr); aaa=Kbessel(n+1,fr);//whp 溢出 M[0][0]=complex (-1.,0.0)*complex (n/R,0.0)*Ibessel(n,fr)-f*(Ibessel(n+1,fr)-etool*Kbessel(n+1,fr)); M[1][0]=(complex (denf*w*w,0.0)*(Ibessel(n,fr)+etool*Kbessel(n,fr))); } if(n==1) { M[0][0]=complex (-1.,0.0)*complex (n/R,0.0)*(Ibessel(n,fr)-etool*Kbessel(n,fr))-f*(Ibessel(n+1,fr)); M[1][0]=(complex (denf*w*w,0.0)*(Ibessel(n,fr)-etool*Kbessel(n,fr))); } } for(j=1;j<=3;j++) { for(i=0;i<=3;i++)M[j][i]=M[j][i]*ttt; } for(j=0;j<24;j++) { sd[0]=u[j][0]; sd[1]=u[j][1]; sd[2]=u[j][2]; sd[3]=u[j][3]; t=reversion(sd); // complex temp1=complex (pow(-1,t),0.0); // complex temp2=complex ((-1)^t,0.0); fun=fun+complex (pow(-1.0,t),0.0)*M[0][u[j][0]]*common*M[1][u[j][1]]*common*M[2][u[j][2]]*common*M[3][u[j][3]]*common; } //whp add 2010.9.15 for sqrt(real(fun)*real(fun)+imag(fun)*imag(fun));出现浮点溢出 float aa=fabs(real(fun)); float bb=fabs(imag(fun)); float mud=1; while(aa>=1e+18||bb>=1e+18) { aa/=10000.;bb/=10000.;mud*=100.; } aa=aa*aa; bb=bb*bb; float cc=aa+bb; cc=sqrt(cc)*mud; //float aaa=sqrt(real(fun)*real(fun)+imag(fun)*imag(fun)); return cc;//sqrt(real(fun)*real(fun)+imag(fun)*imag(fun)); } // float CalcMethod::FuncD(float x,float y ,float vp,float vs,float vf,float denf,float den,float R,float w,int n,float MTOOL,float R_TOOL) { complex M[4][4],C,fun,p,s,f,g,k,ttt; complexfr,sr,pr,fa,ai,inter[4],Inter; float arg0=0.0,SPACE=3.6,Funcd; float kp,kf,ks,etool,temp,E10=1000000000000.; int i,j; int u[24][4]={{0,1,2,3},{0,1,3,2},{0,2,1,3},{0,2,3,1},{0,3,1,2},{0,3,2,1}, {1,0,2,3},{1,0,3,2},{1,2,0,3},{1,2,3,0},{1,3,0,2},{1,3,2,0}, {2,0,3,1},{2,0,1,3},{2,1,3,0},{2,1,0,3},{2,3,0,1},{2,3,1,0}, {3,0,1,2},{3,0,2,1},{3,1,2,0},{3,1,0,2},{3,2,0,1},{3,2,1,0}}; int t,sd[4]; // k=w/v; // w=w/1000.; // ttt=complex(1.e-10,0.0); k=complex(x,y); kp=w/vp; ks=w/vs; kf=w/vf; ai=complex(0.0,1.0); ttt=(k-complex(kf,0.0))*(k-complex(kf,0.0))*R*R; p=sqrt(k*k-complex(kp*kp,0)); s=sqrt(k*k-complex(ks*ks,0)); f=sqrt(k*k-complex(kf*kf,0)); complex common; inter[0]=pow(f*complex(R_TOOL/2,0),n); inter[1]=complex(cos(n*(arg0-3.1415926/2)),0); Inter=ai*k*complex(SPACE,0); inter[2]=complex(pow(2.718282,(double)real(Inter))*cos(imag(Inter)),pow(2.718282,(double)real(Inter))*sin(imag(Inter))); common=inter[3]=complex(1.0,0.0);//inter[0]*inter[1]*inter[2]/complex(1000.,0.0); fr=f*complex (R,0.0); pr=p*complex (R,0.0); sr=s*complex (R,0.0); fa=f*complex (R_TOOL,0.0); temp=MTOOL/R_TOOL; etool=(temp*real(f*Ibessel(1,fa))+denf*w*w*real(Ibessel(0,fa)))/(temp*real(f*Kbessel(1,fa))-denf*w*w*real(Kbessel(0,fa))); M[0][0]=complex (-1.,0.0)*complex (n/R,0.0)*Ibessel(n,fr)-f*Ibessel(n+1,fr); M[0][1]=complex (-1.,0.0)*p*(complex (-n,0)/(pr)*Kbessel(n,pr)+Kbessel(n+1,pr)); M[0][2]=complex (-1.,0.0)*complex (n/R,0)*Kbessel(n,sr); M[0][3]=ai*complex (-ks,0.0)*(complex (-n,0.0)/(sr)*Kbessel(n,sr)+Kbessel(n+1,sr)); M[1][0]=(complex (denf*w*w,0.0)*Ibessel(n,fr)); M[1][1]=(complex (den,0)*(complex (2.0*vs*vs,0)*k*k-complex (w*w,0.0))*Kbessel(n,pr)+complex (2.0*den*vs*vs/R,0.0)*p*((complex (n*(n-1),0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[1][2]=(complex (-2*n*den*vs*vs/R,0.0)*s*((complex (1-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); M[1][3]=(ai*k*complex (2*den*vs*vs,0.0)*s*s*Kbessel(n,sr)+ai*complex (2*ks*den*vs*vs/R,0)*((complex (n*(n-1),0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); M[2][0]=(0.0,0.0); M[2][1]=(complex (-2*n*den*vs*vs,0.0)*p*((complex (1-n,0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[2][2]=(complex (-den*vs*vs,0)*s*s*((complex (1.0,0.0)+complex (2*n*(n-1),0.0)/(sr*sr))*Kbessel(n,sr)+(complex (2,0.0)/sr)*Kbessel(n+1,sr))); M[2][3]=(ai*complex (2*ks*n*den*vs*vs/R,0)*((complex (1-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); M[3][0]=(0.0,0.0); M[3][1]=(ai*k*complex (-2*den*vs*vs,0)*p*((complex (-n,0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[3][2]=(ai*k*complex (-n*den*vs*vs/R,0)*Kbessel(n,sr)); M[3][3]=((k*k+s*s)*s*complex (den*vs*vs,0)*((complex (-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); if(MTOOL>0.01) { if(n==0) { M[0][0]=complex (-1.,0.0)*complex (n/R,0.0)*Ibessel(n,fr)-f*(Ibessel(n+1,fr)-etool*Kbessel(n+1,fr)); M[1][0]=(complex (denf*w*w,0.0)*(Ibessel(n,fr)+etool*Kbessel(n,fr))); } if(n==1) { M[0][0]=complex (-1.,0.0)*complex (n/R,0.0)*(Ibessel(n,fr)-etool*Kbessel(n,fr))-f*(Ibessel(n+1,fr)); M[1][0]=(complex (denf*w*w,0.0)*(Ibessel(n,fr)-etool*Kbessel(n,fr))); } } for(j=1;j<=3;j++) { for(i=0;i<=3;i++)M[j][i]=M[j][i]*ttt; } for(j=0;j<24;j++) { sd[0]=u[j][0]; sd[1]=u[j][1]; sd[2]=u[j][2]; sd[3]=u[j][3]; t=reversion(sd); // complex temp1=complex (pow(-1,t),0.0); // complex temp2=complex ((-1)^t,0.0); fun=fun+complex (pow(-1.0,t),0.0)*M[0][u[j][0]]*common*M[1][u[j][1]]*common*M[2][u[j][2]]*common*M[3][u[j][3]]*common; } Funcd= real(fun)/E10; return Funcd; } // float CalcMethod::Func_M11(float x,float y ,float vp,float vs,float vf,float denf,float den,float R,float w,int n,float MTOOL,float R_TOOL) { complex M[3][3],C,fun,p,s,f,g,k,ttt; complexfr,sr,pr,fa,ai,inter[4],Inter; float arg0=0.0,SPACE=3.6; float kp,kf,ks,etool,temp,m11,E10=1000000000000.; int i,j; int u[6][3]={{0,1,2},{0,2,1}, {1,0,2},{1,2,0}, {2,0,1},{2,1,0}}; int t,sd[3]; // k=w/v; // w=w/1000.; // ttt=complex(1.e-10,0.0); k=complex(x,y); kp=w/vp; ks=w/vs; kf=w/vf; ai=complex(0.0,1.0); ttt=(k-complex(kf,0.0))*(k-complex(kf,0.0))*R*R; p=sqrt(k*k-complex(kp*kp,0)); s=sqrt(k*k-complex(ks*ks,0)); f=sqrt(k*k-complex(kf*kf,0)); complex common; inter[0]=pow(f*complex(R_TOOL/2,0),n); inter[1]=complex(cos(n*(arg0-3.1415926/2)),0); Inter=ai*k*complex(SPACE,0); inter[2]=complex(pow(2.718282,(double)real(Inter))*cos(imag(Inter)),pow(2.718282,(double)real(Inter))*sin(imag(Inter))); common=inter[3]=complex(1.0,0.0);//inter[0]*inter[1]*inter[2]/complex(1000.,0.0); fr=f*complex (R,0.0); pr=p*complex (R,0.0); sr=s*complex (R,0.0); fa=f*complex (R_TOOL,0.0); temp=MTOOL/R_TOOL; etool=(temp*real(f*Ibessel(1,fa))+denf*w*w*real(Ibessel(0,fa)))/(temp*real(f*Kbessel(1,fa))-denf*w*w*real(Kbessel(0,fa))); // M[0][0]=complex (-1.,0.0)*complex (n/R,0.0)*Ibessel(n,fr)-f*Ibessel(n+1,fr); // M[0][1]=complex (-1.,0.0)*p*(complex (-n,0)/(pr)*Kbessel(n,pr)+Kbessel(n+1,pr)); // M[0][2]=complex (-1.,0.0)*complex (n/R,0)*Kbessel(n,sr); // M[0][3]=ai*complex (-ks,0.0)*(complex (-n,0.0)/(sr)*Kbessel(n,sr)+Kbessel(n+1,sr)); // M[1][0]=(complex (denf*w*w,0.0)*Ibessel(n,fr)); M[0][0]=(complex (den,0)*(complex (2.0*vs*vs,0)*k*k-complex (w*w,0.0))*Kbessel(n,pr)+complex (2.0*den*vs*vs/R,0.0)*p*((complex (n*(n-1),0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[0][1]=(complex (-2*n*den*vs*vs/R,0.0)*s*((complex (1-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); M[0][2]=(ai*k*complex (2*den*vs*vs,0.0)*s*s*Kbessel(n,sr)+ai*complex (2*ks*den*vs*vs/R,0)*((complex (n*(n-1),0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); // M[2][0]=(0.0,0.0); M[1][0]=(complex (-2*n*den*vs*vs,0.0)*p*((complex (1-n,0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[1][1]=(complex (-den*vs*vs,0)*s*s*((complex (1.0,0.0)+complex (2*n*(n-1),0.0)/(sr*sr))*Kbessel(n,sr)+(complex (2,0.0)/sr)*Kbessel(n+1,sr))); M[1][2]=(ai*complex (2*ks*n*den*vs*vs/R,0)*((complex (1-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); // M[3][0]=(0.0,0.0); M[2][0]=(ai*k*complex (-2*den*vs*vs,0)*p*((complex (-n,0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[2][1]=(ai*k*complex (-n*den*vs*vs/R,0)*Kbessel(n,sr)); M[2][2]=((k*k+s*s)*s*complex (den*vs*vs,0)*((complex (-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); for(j=0;j<=2;j++) { for(i=0;i<=2;i++)M[j][i]=M[j][i]*ttt; } for(j=0;j<6;j++) { sd[0]=u[j][0]; sd[1]=u[j][1]; sd[2]=u[j][2]; // sd[3]=u[j][3]; t=reversion3(sd); fun=fun+complex (pow(-1.0,t),0.0)*M[0][u[j][0]]*common*M[1][u[j][1]]*common*M[2][u[j][2]]*common; } m11=real(fun)/E10; return m11; } // // float CalcMethod::Func_M21(float x,float y ,float vp,float vs,float vf,float denf,float den,float R,float w,int n,float MTOOL,float R_TOOL) { complex M[3][3],C,fun,p,s,f,g,k,ttt; complexfr,sr,pr,fa,ai,inter[4],Inter; float arg0=0.0,SPACE=3.6,m21; float kp,kf,ks,etool,temp,E10=1000000000000.; int i,j; int u[6][3]={{0,1,2},{0,2,1}, {1,0,2},{1,2,0}, {2,0,1},{2,1,0}}; int t,sd[3]; // k=w/v; // w=w/1000.; // ttt=complex(1.e-10,0.0); k=complex(x,y); kp=w/vp; ks=w/vs; kf=w/vf; ai=complex(0.0,1.0); ttt=(k-complex(kf,0.0))*(k-complex(kf,0.0))*R*R; p=sqrt(k*k-complex(kp*kp,0)); s=sqrt(k*k-complex(ks*ks,0)); f=sqrt(k*k-complex(kf*kf,0)); complex common; inter[0]=pow(f*complex(R_TOOL/2,0),n); inter[1]=complex(cos(n*(arg0-3.1415926/2)),0); Inter=ai*k*complex(SPACE,0); inter[2]=complex(pow(2.718282,(double)real(Inter))*cos(imag(Inter)),pow(2.718282,(double)real(Inter))*sin(imag(Inter))); common=inter[3]=complex(1.0,0.0);//inter[0]*inter[1]*inter[2]/complex(1000.,0.0); fr=f*complex (R,0.0); pr=p*complex (R,0.0); sr=s*complex (R,0.0); fa=f*complex (R_TOOL,0.0); temp=MTOOL/R_TOOL; etool=(temp*real(f*Ibessel(1,fa))+denf*w*w*real(Ibessel(0,fa)))/(temp*real(f*Kbessel(1,fa))-denf*w*w*real(Kbessel(0,fa))); // M[0][0]=complex (-1.,0.0)*complex (n/R,0.0)*Ibessel(n,fr)-f*Ibessel(n+1,fr); M[0][0]=complex (-1.,0.0)*p*(complex (-n,0)/(pr)*Kbessel(n,pr)+Kbessel(n+1,pr)); M[0][1]=complex (-1.,0.0)*complex (n/R,0)*Kbessel(n,sr); M[0][2]=ai*complex (-ks,0.0)*(complex (-n,0.0)/(sr)*Kbessel(n,sr)+Kbessel(n+1,sr)); // M[1][0]=(complex (denf*w*w,0.0)*Ibessel(n,fr)); // M[1][1]=(complex (den,0)*(complex (2.0*vs*vs,0)*k*k-complex (w*w,0.0))*Kbessel(n,pr)+complex (2.0*den*vs*vs/R,0.0)*p*((complex (n*(n-1),0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); // M[1][2]=(complex (-2*n*den*vs*vs/R,0.0)*s*((complex (1-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); // M[1][3]=(ai*k*complex (2*den*vs*vs,0.0)*s*s*Kbessel(n,sr)+ai*complex (2*ks*den*vs*vs/R,0)*((complex (n*(n-1),0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); // M[2][0]=(0.0,0.0); M[1][0]=(complex (-2*n*den*vs*vs,0.0)*p*((complex (1-n,0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[1][1]=(complex (-den*vs*vs,0)*s*s*((complex (1.0,0.0)+complex (2*n*(n-1),0.0)/(sr*sr))*Kbessel(n,sr)+(complex (2,0.0)/sr)*Kbessel(n+1,sr))); M[1][2]=(ai*complex (2*ks*n*den*vs*vs/R,0)*((complex (1-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); // M[3][0]=(0.0,0.0); M[2][0]=(ai*k*complex (-2*den*vs*vs,0)*p*((complex (-n,0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[2][1]=(ai*k*complex (-n*den*vs*vs/R,0)*Kbessel(n,sr)); M[2][2]=((k*k+s*s)*s*complex (den*vs*vs,0)*((complex (-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); for(j=0;j<=2;j++) { for(i=0;i<=2;i++)M[j][i]=M[j][i]*ttt; } for(j=0;j<6;j++) { sd[0]=u[j][0]; sd[1]=u[j][1]; sd[2]=u[j][2]; // sd[3]=u[j][3]; t=reversion3(sd); fun=fun+complex (pow(-1.0,t),0.0)*M[0][u[j][0]]*common*M[1][u[j][1]]*common*M[2][u[j][2]]*common; } m21=real(fun)/E10; return m21; } // float CalcMethod::Get_EW(float k0,float vp,float vs,float vf,float denf,float den,float R,float w,int n,float MTOOL,float R_TOOL,float df) { complex uff,pff,p,s,f,g,k,ttt; complexfr,sr,pr,fa,ai; float M11,M21,arg0=0.0,SPACE=3.6; float kp,kf,ks,x,dx; ai=(0.,1.); // k=w/v; // w=w/1000.; // ttt=complex(1.e-10,0.0); k=complex(k0,0); kp=w/vp; ks=w/vs; kf=w/vf; ai=complex(0.0,1.0); ttt=(k-complex(kf,0.0))*(k-complex(kf,0.0))*R*R; p=sqrt(k*k-complex(kp*kp,0)); s=sqrt(k*k-complex(ks*ks,0)); f=sqrt(k*k-complex(kf*kf,0)); fr=f*complex (R,0.0); pr=p*complex (R,0.0); sr=s*complex (R,0.0); fa=f*complex (R_TOOL,0.0); uff=-f*Ibessel(1,fr)*exp(ai*k*SPACE); pff=-denf*w*w*Ibessel(1,fr)*exp(ai*k*SPACE); M11=Func_M11(k0,0 , vp, vs, vf, denf, den, R, w,n, MTOOL, R_TOOL); M21=Func_M21(k0,0 , vp, vs, vf, denf, den, R, w,n, MTOOL, R_TOOL); dx=FuncD(k0+0.001,0 , vp, vs, vf, denf, den, R, w,n, MTOOL, R_TOOL)-FuncD(k0,0 , vp, vs, vf, denf, den, R, w,n, MTOOL, R_TOOL); x=dx/0.001; return real(uff*M11-pff*M21)/x; } // complex CalcMethod::Ibessel(int n,complex x) { complex k,wi[2],wk[2]; int IONLY=0; /// if(fabs(imag(x))<=0.0000000001) /// { /// return complex (TransformativeIntegerBessel1stFunction(n,real(x)),0.0); /// } /// else { if(n==0) { CFB(x, wi, wk,IONLY); return wi[0]; } if(n==1) { CFB(x, wi, wk, IONLY); return wi[1]; } k=(complex(-2*n,0)/x)*Ibessel(n-1,x)+Ibessel(n-2,x); return k; } } complex CalcMethod::Kbessel(int n,complex x) { complex k,wi[2],wk[2]; int IONLY=0; /// if(fabs(imag(x))<=0.0000000001) /// { /// return complex (TransformativeIntegerBessel2ndFunction(n,real(x)),0.0); /// } /// else /// { if(n==0) { CFB(x, wi, wk, IONLY); return wk[0]; } if(n==1) { CFB(x, wi, wk, IONLY); return wk[1]; } k=(complex(2*n,0.0)/x)*Ibessel(n-1,x)+Ibessel(n-2,x); return k; /// } } inline bool CalcMethod::doubleEqual(float lhs, float rhs) { float DOUBLEERROR=0.000001; if (fabs(lhs - rhs) < DOUBLEERROR) return true; else return false; } int CalcMethod::reversion(int vp[4]) { int i,t=0,j; for(i=1;i<4;i++) { for(j=0;j=0; i--) p=p*y+a[i]; } else { y=3.75/t; p=c[8]; for(i=7; i>=0; i--) p=p*y+c[i]; p=p*exp(t)/sqrt(t); } } if(n==0) return(p); q=p; if(t<3.75) { y=(x/3.75)*(x/3.75); p=b[6]; for(i=5; i>=0; i--) p=p*y+b[i]; p=p*t; } else { y=3.75/t; p=d[8]; for(i=7; i>=0; i--) p=p*y+d[i]; p=p*exp(t)/sqrt(t); } if(x<0.0) p=-p; if(n==1) return(p); if(doubleEqual(x,0.0)) return(0.0); y=2.0/t; t = b0 = 0.0; b1=1.0; m=n+(int)sqrt(40.0*n); m=2*m; for(i=m; i>0; i--) { p=b0+i*y*b1; b0=b1; b1=p; if(fabs(b1)>1.0e+10) { t=t*1.0e-10; b0=b0*1.0e-10; b1=b1*1.0e-10; } if(i==n) t=b0; } p=t*q/b1; if((x<0.0)&&(n%2==1)) p=-p; return(p); } float CalcMethod::TransformativeIntegerBessel2ndFunction(int n, float x) { int i; float y,p,b0,b1; float a[7]={ -0.57721566,0.4227842,0.23069756, 0.0348859,0.00262698,0.0001075,0.0000074}; float b[7]={ 1.0,0.15443144,-0.67278579, -0.18156897,-0.01919402,-0.00110404,-0.00004686}; float c[7]={ 1.25331414,-0.07832358,0.02189568, -0.01062446,0.00587872,-0.0025154,0.00053208}; float d[7]={ 1.25331414,0.23498619,-0.0365562, 0.01504268,-0.00780353,0.00325614,-0.00068245}; if(n<0) n=-n; if(x<0.0) x=-x; if(doubleEqual(x,0.0)) return(1.0e+70); if(n!=1) { if(x < 2.0 || doubleEqual(x, 2.0)) { y=x*x/4.0; p=a[6]; for(i=5; i>=0; i--) p=p*y+a[i]; p=p-TransformativeIntegerBessel1stFunction(0,x)*log(x/2.0); } else { y=2.0/x; p=c[6]; for(i=5; i>=0; i--) p=p*y+c[i]; p=p*exp(-x)/sqrt(x); } } if(n==0) return(p); b0=p; if(x < 2.0 || doubleEqual(x, 2.0)) { y=x*x/4.0; p=b[6]; for(i=5; i>=0; i--) p=p*y+b[i]; p=p/x+TransformativeIntegerBessel1stFunction(1,x)*log(x/2.0); } else { y=2.0/x; p=d[6]; for(i=5; i>=0; i--) p=p*y+d[i]; p=p*exp(-x)/sqrt(x); } if(n==1) return(p); b1=p; y=2.0/x; for(i=1; i h[3],float s[3],float SPACE_INTERVAL,float w,complex W[8]) { int i,j; int NumRows,NumColumns; float matrixA[4*8*3],matrixB[2*8]; float mA[6]; for(i=0;i<8;i++) { for(j=0;j<3;j++) { matrixA[i*6+j]=cos(i*w*s[j]*SPACE_INTERVAL); } for(j=3;j<6;j++) { matrixA[i*6+j]=-sin(i*w*s[j-3]*SPACE_INTERVAL); } } for(i=8;i<2*8;i++) { for(j=0;j<3;j++) { matrixA[i*6+j]=sin(i*w*s[j]*SPACE_INTERVAL); } for(j=3;j<6;j++) { matrixA[i*6+j]=cos(i*w*s[j-3]*SPACE_INTERVAL); } } for(i=0;i<8;i++) { matrixB[i]=real(W[i]); } for(i=8;i<16;i++) { matrixB[i]=imag(W[i-8]); } NumRows=2*8;NumColumns=2*3; CMatrix1 mtxA(NumRows,NumColumns,matrixA); NumColumns=1; CMatrix1 mtxB(NumColumns,NumColumns,matrixB); CLEquations leqs(mtxA,mtxB); CMatrix1 mtxResult,mtxQ,mtxR; leqs.GetRootsetMqr(mtxResult,mtxQ,mtxR); for(i=0;i<3;i++) { h[i]=complex(mtxResult.GetData()[i],mtxResult.GetData()[i+3]); } } void CalcMethod::waveseparate2( complex h[2],float s[2],float SPACE_INTERVAL,float w,complex W[8]) { int i,j; int NumRows,NumColumns; float matrixA[4*8*2],matrixB[2*8]; // float mA[4]; for(i=0;i<8;i++) { for(j=0;j<2;j++) { matrixA[i*4+j]=cos(i*w*s[j]*SPACE_INTERVAL); } for(j=2;j<4;j++) { matrixA[i*4+j]=-sin(i*w*s[j-2]*SPACE_INTERVAL); } } for(i=8;i<2*8;i++) { for(j=0;j<2;j++) { matrixA[i*4+j]=sin(i*w*s[j]*SPACE_INTERVAL); } for(j=2;j<4;j++) { matrixA[i*4+j]=cos(i*w*s[j-2]*SPACE_INTERVAL); } } for(i=0;i<8;i++) { matrixB[i]=real(W[i]); } for(i=8;i<16;i++) { matrixB[i]=imag(W[i-8]); } NumRows=2*8;NumColumns=2*2; CMatrix1 mtxA(NumRows,NumColumns,matrixA); /*float vvv[16*4],voo[16][4],voo1[16][4]; for(int i=0;i(mtxResult.GetData()[i],mtxResult.GetData()[i+2]); } } // ///三波分离 // void CalcMethod::WAVEseparate( float wf[8][1024],float hwf1[1024],float hwf2[1024],float hwf3[1024],float dtst,float dfinterval,float SPACE_INTERVAL,int NSAMPLE,float fmin,float fmax) { complex fwf[8][1024],fhf[3],wff[8],fhwf[3][1024],fhwf0[3][1024],temp; float xreal[1024],ximag[1024],svp[3]; int i,j,NFFT=1024; int ifmin,ifmax,i0,i1; double err,err0,ss,w; err0=1.0e18; i0=0; i1=1; ifmin=fmin/dfinterval; ifmax=fmax/dfinterval; // for(i=0;i<8;i++) { for(j=0;j(xreal[j],ximag[j]); } } // for( ss=dtst-10;ss(sqrt(real(fwf[j][i])*real(fwf[j][i])+real(fwf[j][i])*real(fwf[j][i])),0.0); //waveseparate( h[3],float s[3],float SPACE_INTERVAL,float w,complex W[8]) waveseparate3( fhf,svp, SPACE_INTERVAL, w,wff); for(j=0;j<3;j++)fhwf0[j][i]=fhf[j]; temp=fhf[0]-fhf[1]-fhf[2]; float temp1=sqrt(real(temp)*real(temp)+imag(temp)*imag(temp)); float temp2=sqrt(real(wff[0])*real(wff[0])+imag(wff[0])*imag(wff[0])); err=err+(temp1-temp2)*(temp1-temp2); } if(err fwf[8][1024],fhf[2],wff[8],fhwf[2][1024],fhwf0[2][1024],temp; float xreal[1024],ximag[1024],svp[2]; int i,j,NFFT=1024; int ifmin,ifmax,i0,i1; double err,err0,ss,w; err0=1.0e20; i0=0; i1=1; ifmin=fmin/dfinterval; ifmax=fmax/dfinterval; // ifmin=0; // ifmax=NFFT/2; // for(i=0;i<8;i++) { for(j=0;j(xreal[j],ximag[j]); } } // for( ss=dtst-15;ss(sqrt(real(fwf[j][i])*real(fwf[j][i])+real(fwf[j][i])*real(fwf[j][i])),0.0); //waveseparate( h[3],float s[3],float SPACE_INTERVAL,float w,complex W[8]) //wavesp2( fhf,svp, SPACE_INTERVAL, w,wff); waveseparate2( fhf,svp, SPACE_INTERVAL, w,wff); for(j=0;j<2;j++)fhwf0[j][i]=fhf[j]; float temp0=sqrt(real(wff[0]-fhf[0]-fhf[1])*real(wff[0]-fhf[0]-fhf[1])+imag(wff[0]-fhf[0]-fhf[1])*imag(wff[0]-fhf[0]-fhf[1])); // float temp0=sqrt(real(fhf[0])*real(fhf[0])+imag(fhf[0])*imag(fhf[0])); // float temp1=sqrt(real(fhf[1])*real(fhf[1])+imag(fhf[1])*imag(fhf[1])); // float temp2=sqrt(real(wff[0])*real(wff[0])+imag(wff[0])*imag(wff[0])); err=err+temp0;//fabs(temp2-temp1-temp0);//sqrt(real(temp)*real(temp)+imag(temp)*imag(temp)); } if(err h[3],float s[3],float SPACE_INTERVAL,float w,complex W[8]) { complex Q[8][8], Z[8][3]; int i,j; for(i=0;i<8;i++) { for(j=0;j<3;j++) { Z[i][j]=complex(cos(i*w*SPACE_INTERVAL*s[j]),sin(i*w*SPACE_INTERVAL*s[j])); } } splitCQR(Z, Q); setrootQR(Z,h,Q,W); } void CalcMethod::setrootQR(complex R[8][3],complex h[],complex Q[8][8],complex B[]) { complex R1[8][3],QT[8][8],C[8]; int i,j; for(i=0;i<3;i++) { for(j=0;j<3;j++) { R1[i][j]=R[i][j]; } } for(i=0;i<8;i++) { for(j=0;j<8;j++) { QT[i][j]=conj(Q[j][i]); } } for(i=0;i<8;i++) { C[i]=0; for(j=0;j<8;j++) { C[i]=C[i]+QT[i][j]*B[j]; } } h[2]=C[2]/R1[2][2]; h[1]=(C[i]-h[2]*R1[1][2])/R1[1][1]; h[0]=(C[i]-h[2]*R1[0][2]-h[1]*R1[0][1])/R1[0][0]; } void CalcMethod::splitCQR(complex Z[8][3],complex Q[8][8]) { int i,j,p,q,m; complex z[3][3],h1[3][3],h[8][8],h2[8][8]; for(i=0;i<3;i++) { for(j=0;j<3;j++) { z[i][j]=Z[i][j]; } } splitC3QR(z,h1); for(i=0;i<8;i++) { for(j=0;j<8;j++) { if(i<3&&j<3) { Q[i][j]=h1[i][j]; } else { Q[i][j]=Z[i][j]; } } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { Z[i][j]=z[i][j]; } } for(i=3;i<8;i++) { recursion(Z,i,h); for(p=0;p<8;p++) { for(q=0;q<8;q++) { for(m=0;m<8;m++) { h2[p][q]=complex(0,0); h2[p][q]=h2[p][q]+h[p][m]*Q[m][q]; } } } for(p=0;p<8;p++) { for(q=0;q<8;q++) { Q[p][q]=h2[p][q]; } } } } void CalcMethod::recursion(complex Z[8][3],int n,complex Q[8][8]) { float e[3],o[3]; complex I[8][8],q[3],q1[3],u[3],r[3],h[8][8],h1[8][8],u1[8]; int i,j,k,l,m; for(i=0;i<8;i++) { for(j=0;j<8;j++) { if(i==j) { I[i][j]=complex(1,0); h1[i][j]=complex(1,0); } else { I[i][j]=complex(0,0); h1[i][j]=complex(0,0); } } } for(k=0;k<3;k++) { e[k]=sqrt(pow(abs(Z[k][k]),2)+pow(abs(Z[n][k]),2)); o[k]=e[k]*(e[k]+abs(Z[k][k])); q[k]=Z[k][k]+complex(e[k]*cos(arg(Z[k][k])),e[k]*sin(arg(Z[k][k]))); q1[k]=q[k]/complex(o[k],0); u[k]=Z[n][k]/complex(o[k],0); for(l=k;l<4;l++) { r[l]=conj(q[k])*Z[k][l]+conj(Z[n][k])*Z[n][l]; Z[k][l]=Z[k][l]-q1[k]*r[l]; Z[n][l]=Z[n][l]-u[k]*r[l]; } for(i=0;i<8;i++) { if(i==k) { u1[i]=q[k]; } else if(i==n) { u1[i]=u[k]; } else { u1[i]=complex(0,0); } } for(i=0;i<8;i++) { for(j=0;j<8;j++) { h[i][j]=I[i][j]-u1[i]*conj(u1[j]); } } for(i=0;i<8;i++) { for(j=0;j<8;j++) { for(m=0;m<8;m++) { Q[i][j]=complex(0,0); Q[i][j]=Q[i][j]+h[i][m]*h1[m][j]; } } } for(i=0;i<8;i++) { for(j=0;j<8;j++) { h1[i][j]=h[i][j]; } } } } void CalcMethod::splitC3QR(complex z[3][3],complex h[3][3]) { float p; complex u1[3],u2[2],u3[3]; complex H[3][3],H1[2][2],H2[3][3]; complex I[3][3],I2[2][2]; complex z1[3][3],z2[2][2],z3[2][2]; complex s[3][3]; p=sqrt(pow(abs(z[0][0]),2)+pow(abs(z[1][0]),2)+pow(abs(z[2][0]),2)); u1[0]=z[0][0]+complex(p*cos(arg(z[0][0])),p*sin(arg(z[0][0]))); u1[1]=z[1][0]; u1[2]=z[2][0]; int i,j,m; for(i=0;i<3;i++) { for(j=0;j<3;j++) { if(i==j) { I[i][j]=complex(1,0); } else { I[i][j]=complex(0,0); } } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { H[i][j]=I[i][j]-u1[i]*conj(u1[j])/complex(p*(p+abs(z[0][0])),0); } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { z1[i][j]=H[i][0]*z[0][j]+H[i][1]*z[1][j]+H[i][2]*z[2][j]; } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { z[i][j]=z1[i][j]; } } z2[0][0]=z[1][1]; z2[0][1]=z[1][2]; z2[1][0]=z[2][1]; z2[0][1]=z[2][2]; p=sqrt(pow(abs(z1[1][1]),2)+pow(abs(z1[2][1]),2)); u2[0]=z1[1][1]+complex(p*cos(arg(z1[1][1])),p*sin(arg(z1[2][1]))); u2[1]=z1[2][1]; I2[0][0]=complex(1,0); I2[0][1]=complex(0,0); I2[1][0]=complex(0,0); I2[1][1]=complex(1,0); for(i=0;i<2;i++) { for(j=0;j<2;j++) { H1[i][j]=I2[i][j]-u2[i]*conj(u2[j])/complex(p*(p+abs(z1[1][1])),0.0); } } for(i=0;i<2;i++) { for(j=0;j<2;j++) { z3[i][j]=H1[i][0]*z2[0][j]+H1[i][1]*z2[1][j]; } } z[1][1]=z3[0][0]; z[1][2]=z3[0][1]; z[2][1]=z3[1][0]; z[2][2]=z3[1][1]; h[0][0]=complex(1,0); h[0][1]=complex(0,0); h[0][2]=complex(0,0); h[1][0]=complex(0,0); h[2][0]=complex(0,0); h[1][1]=H1[0][0]; h[1][2]=H1[0][1]; h[2][1]=H1[1][0]; h[2][2]=H1[1][1]; for(i=0;i<3;i++) { for(j=0;j<3;j++) { H2[i][j]=complex(0,0); for(m=0;m<3;m++) { H2[i][j]=H2[i][j]+h[i][m]*H[m][j]; } } } for(i=0;i<3;i++) { for(j=0;j<3;j++) { h[i][j]=H2[i][j]; } } } void CalcMethod::wavesp2(complex h[2],float s[2],float d,float w,complex W[8]) { complex Z[8][2]; complex Q[8][8]; int i,j; for(i=0;i<8;i++) { for(j=0;j<2;j++) { Z[i][j]=complex(cos(i*w*s[j]*d),sin(i*w*s[j]*d)); } } splitQR2(Z,Q); setrootQR2(Z,Q,h,W); } void CalcMethod::setrootQR2(complex Z[8][2],complex Q[8][8], complex h[2],complex W[8]) { int i,j; complex C[8]; for(i=0;i<8;i++) { C[i]=0; for(j=0;j<8;j++) { C[i]=C[i]+Q[i][j]*W[j]; } } h[1]=C[1]/Z[1][1]; h[0]=(C[0]-Z[0][1]*h[1])/Z[0][0]; } void CalcMethod::splitQR2(complex Z[8][2],complex Q[8][8]) { int i,j,m; float p=0.0; complex q1,q2; complex u1[8],u2[8]; complex H[8][8],H1[8][8],I[8][8],Z1[8][2],Z2[8][2]; for(i=0;i<8;i++) { for(j=0;j<8;j++) { if(i==j) { I[i][j]=complex(1,0); } else { I[i][j]=complex(0,0); } } } for(i=0;i<8;i++) { p=p+pow(abs(Z[i][0]),2); } p=sqrt(p); q1=complex(p*cos(arg(Z[0][0])),p*sin(arg(Z[0][0]))); u1[0]=Z[0][0]+complex(p*cos(arg(Z[0][0])),p*sin(arg(Z[0][0]))); for(i=1;i<8;i++) { u1[i]=Z[i][0]; } for(i=0;i<8;i++) { for(j=0;j<8;j++) { H[i][j]=I[i][j]-u1[i]*conj(u1[j])/(q1*(q1+Z[0][0])); } } for(i=0;i<8;i++) { for(j=0;j<2;j++) { Z1[i][j]=complex(0,0); for(m=0;m<8;m++) { Z1[i][j]=Z1[i][j]+H[i][m]*Z[m][j]; } } } p=0; for(i=1;i<8;i++) { p=p+pow(abs(Z1[i][1]),2); } q2=complex(p*cos(arg(Z[1][1])),p*sin(arg(Z[1][1]))); u2[0]=complex(0,0); u2[1]=Z1[1][1]+q2; for(i=2;i<8;i++) { u2[i]=Z[i][1]; } for(i=0;i<8;i++) { for(j=0;j<8;j++) { H1[i][j]=I[i][j]-u2[i]*conj(u2[j])/(q2*(q2+Z[1][1])); } } for(i=0;i<8;i++) { for(j=0;j<2;j++) { Z2[i][j]=complex(0,0); for(m=0;m<8;m++) { Z2[i][j]=Z2[i][j]+H1[i][m]*Z1[m][j]; } } } for(i=0;i<8;i++) { for(j=0;j<2;j++) { Z[i][j]=Z2[i][j]; } } for(i=0;i<8;i++) { for(j=0;j<8;j++) { Q[i][j]=complex(0,0); for(m=0;m<8;m++) { Q[i][j]=Q[i][j]+H1[i][m]*H[m][j]; } } } } float CalcMethod::Func1(float x,float y ,float Vpv,float Vsv,float Vsh,float vf,float denf, float den,float R,float w,int n,float MTOOL,float R_TOOL) { float c11,c13,c33,c44,c66; float etool,temp; complex k; complex U,V,W; complex Qp,Qsh,Qsv; complex Q[4][4]; complex fun,T,T1,T2; complex _c11,_c13,_c66,_c44,_c33; complex _R,_n,_denf,_w,_den,_vf; complex _a,_b,f,kf; complex a,ai,_ar,ttt; int t,i,j,i1,i0; int u[24][4]={{0,1,2,3},{0,1,3,2},{0,2,1,3},{0,2,3,1},{0,3,1,2},{0,3,2,1}, {1,0,2,3},{1,0,3,2},{1,2,0,3},{1,2,3,0},{1,3,0,2},{1,3,2,0}, {2,0,3,1},{2,0,1,3},{2,1,3,0},{2,1,0,3},{2,3,0,1},{2,3,1,0}, {3,0,1,2},{3,0,2,1},{3,1,2,0},{3,1,0,2},{3,2,0,1},{3,2,1,0}}; k=complex(x,y); i1=1;i0=0; c44=den*Vsv*Vsv; c66=den*Vsh*Vsh; c33=den*Vpv*Vpv; c11=(c66/c44)*c33; c13=c33-2*c44; a=complex(R_TOOL,0.0); ai=complex(0.0,1.0); ai=complex(-1.0,0.0); ttt=complex(1.0e-10,0.0); temp=MTOOL/R_TOOL; _c11=complex(c11,0); _c13=complex(c13,0); _c66=complex(c66,0); _c44=complex(c44,0); _c33=complex(c33,0); _R=complex(R,0); _n=complex(n,0); _denf=complex(denf,0); _w=complex(w,0); _den=complex(den,0); _vf=complex(vf,0); U=_c11*_c44; V=_den*(_c11+_c44)-(_c11*_c33-_c13*_c13-complex(2.0,0.0)*_c13*_c44)*(k*k/(_w*_w)); W=_c33*_c44*(_den/_c44-k*k/(_w*_w))*(_den/_c33-k*k/(_w*_w)); T=(_c44*k*k-_den*_w*_w)/_c66; Qsh=sqrt(T); T1=V*V-complex(4.0,0.0)*U*W; T2=(complex(-1.0,0.0)*V+sqrt(T1))/(complex(2.0,0.0)*U); Qp=_w*sqrt(T2); T2=(complex(-1.0,0.0)*V-sqrt(T1))/(complex(2.0,0.0)*U); Qsv=_w*sqrt(T2); _a=(complex(-1.0,0.0)/(ai*k))*((_c13+complex(2.0,0.0)*_c44)*k*k- _c11*Qp*Qp-_den*_w*_w)/(_c44*k*k-(_c11-_c13-_c44)*Qp*Qp-_den*_w*_w); _b=_ar*ai*k*(_c44*k*k-(_c11-_c13-_c44)*Qsv*Qsv-_den*_w*_w)/ ((_c13+complex(2.0,0.0)*_c44)*k*k-_c11*Qsv*Qsv-_den*_w*_w); kf=_w/_vf; T=k*k-kf*kf; f=sqrt(T); Q[0][0]=_ar*(_n/_R)*Ibessel(n,f*_R)-f*Ibessel(n+1,f*_R); Q[0][1]=_ar*(complex(1.0,0.0)+ai*k*_a)*Qp*((_ar*_n/(Qp*_R))*Kbessel(n,Qp*_R)+Kbessel(n+1,Qp*_R)); Q[0][2]=(_n/_R)*Kbessel(n,Qsh*_R); Q[0][3]=_ar*(ai*k+_b)*Qsv*((_ar*_n/(Qp*_R))*Kbessel(n,Qp*_R)+Kbessel(n+1,Qp*_R)); Q[1][0]=_denf*_w*_w*Ibessel(n,f*_R); Q[1][1]=(_c11*Qp*Qp-_c13*k*k+(_c11-_c13)*ai*k*_a*Qp*Qp)*Kbessel(n,Qp*_R)+complex(2.0,0.0)*_c66*(Qp/_R)*(complex(1.0,0.0)+ai*k*_a)*((complex(n*(n-1),0.0)/(Qp*_R))*Kbessel(n,Qp*_R)+Kbessel(n+1,Qp*_R)); Q[1][2]=complex(-2,0)*_c66*_n*(Qsh/_R)*((complex(1-n,0.0)/(Qsh*_R))*Kbessel(n,Qsh*_R)+Kbessel(n+1,Qsh*_R)); Q[1][3]=((_c11*Qsv*Qsv-_c13*k*k)*_b+(_c11-_c13)*ai*k*Qsv*Qsv)*Kbessel(n,Qsv*_R)+complex(2,0)*_c66*(Qsv/_R)*(ai*k+_b)*((complex(n*(n-1),0.0)/(Qsv*_R))*Kbessel(n,Qsv*_R)+Kbessel(n+1,Qsv*_R)); Q[2][0]=complex(0,0); Q[2][1]=complex(2,0)*_c66*_n*(Qp/_R)*(complex(1.0,0.0)+ai*k*_a)*((complex(1-n,0.0)/(Qp*_R))*Kbessel(n,Qp*_R)+Kbessel(n,Qp*_R)); Q[2][2]=_ar*_c66*Qsh*Qsh*((complex(1.0,0.0)+complex(2.0*n*(n-1),0.0)/(Qsh*_R*Qsh*_R))*Kbessel(n,Qsh*_R)+(complex(2.0,0.0)/(Qsh*_R))*Kbessel(n+1,Qsh*_R)); Q[2][3]=complex(2,0)*_c66*_n*(Qsv/_R)*(ai*k+_b)*((complex(1-n,0.0)/(Qsv*_R))*Kbessel(n,Qsv*_R)+Kbessel(n+1,Qsv*_R)); Q[3][0]=complex(0,0); Q[3][1]=_ar*_c44*Qp*(complex(2,0)*ai*k-_a*(k*k+Qp*Qp))*(_ar*(_n/(Qp*_R))*Kbessel(n,Qp*_R)+Kbessel(n+1,Qp*_R)); Q[3][2]=complex(1,0)*ai*k*_n*(_c44/_R)*Kbessel(n,Qsh*_R); Q[3][3]=_c44*Qsv*((k*k+Qsv*Qsv)-complex(2,0)*ai*k*_b)*((_ar*_n/(Qsv*_R))*Kbessel(n,Qsv*_R)+Kbessel(n+1,Qsv*_R));//Kbessel(1,Qsv*_R); etool=(temp*real(f*Ibessel(i1,f*a))+denf*w*w*real(Ibessel(i0,f*a)))/(temp*real(f*Kbessel(i1,f*a))-denf*w*w*real(Kbessel(i0,f*a))); if(MTOOL>0.01) { if(n==0) { Q[0][0]=_ar*(_n/_R)*Ibessel(n,f*_R)-f*(Ibessel(n+1,f*_R)-complex (etool,0)*Kbessel(n+1,f*_R)); Q[1][0]=_denf*_w*_w*(Ibessel(n,f*_R)+complex (etool,0)*Kbessel(n,f*_R)); } if(n==1) { Q[0][0]=_ar*(_n/_R)*(Ibessel(n,f*_R)-complex (etool,0)*Kbessel(n,f*_R))-f*(Ibessel(n+1,f*_R)); Q[1][0]=_denf*_w*_w*(Ibessel(n,f*_R)-complex (etool,0)*Kbessel(n,f*_R)); } } for(j=1;j<=3;j++) { for(i=0;i<=3;i++)Q[j][i]=Q[j][i]*ttt; } for(j=0;j<24;j++) { t=reversion(u[j]); fun=fun+complex(pow(-1.0,t),0)*Q[0][u[j][0]]*Q[1][u[j][1]]*Q[2][u[j][2]]*Q[3][u[j][3]]; } return sqrt(real(fun)*real(fun)+imag(fun)*imag(fun)); } complex CalcMethod::GetRootMonteCarlo1(float Vpv,float Vsv,float Vsh,float vf,float denf,float den,float R,float w,int n,float MTOOL,float R_TOOL) { int k; float xx,yy,a,r,z,x1,y1,z1,eps=1.0e-10,k_real,k_imag; int nControlB=10; float xStart; // float PI=3.1415926; complex kw0,kw; // w=2*PI*fff; if(Vsv>vf) { kw0=complex (w/vf+.10,0.0); } else { kw0=complex (w/vf-.10,0.0); } xStart=0.10;//w/vf; if(n==1) { kw0=complex (w/vf-.50,0.0); xStart=0.50;//w/vf; } a=xStart; k=1; r=1.0; xx=real(kw0); yy=imag(kw0); z=Func1(xx,yy,Vpv,Vsv,Vsh,vf,denf,den,R, w,n,MTOOL,R_TOOL); // ???è?????ó?vp while (a>=eps) { x1=-a+2.0*a*rnd(&r); x1=xx+x1; y1=-a+2.0*a*rnd(&r); y1=yy+y1; z1=Func1(x1,y1,Vpv,Vsv,Vsh,vf,denf,den,R,w,n,MTOOL,R_TOOL); k=k+1; if (z1>=z) { if (k>nControlB) { k=1; a=a/2.0; } } else { // k=1; xx=x1; yy=y1; z=z1; if (z(xx,yy); return kw; } } } k_real=xx; k_imag=yy; kw=complex(xx,yy); return kw; } complex CalcMethod::xianjie(float vp,float vs,float vf,float denf,float den,float R,float w,int n,float MTOOL,float R_TOOL) { complex xk ; complex xk_1; complex x,fk,fk_1; float e=0.00001; int k=0; complex x0, x1; if(n==0) { x0=complex(w/vf/0.99,0.0); x1=complex(w/vf/0.9,0.0); } if(n==1) { x0=complex(1.1*w/vs,0.0); x1=complex(0.9*w/vf,0.0); } xk=x1,xk_1=x0; while(abs(xk-xk_1)>e) { float temp=abs(xk-xk_1); fk=Funcxianjie(real(xk),imag(xk) ,vp,vs,vf,denf,den,R,w,n,MTOOL,R_TOOL); fk_1=Funcxianjie(real(xk_1),imag(xk_1),vp,vs,vf,denf,den,R,w,n,MTOOL,R_TOOL); x=xk-fk*(xk-xk_1)/(fk-fk_1); xk_1=xk; xk=x; if(k>100)return x; k++; } return x; } complex CalcMethod::Funcxianjie(float x,float y ,float vp,float vs,float vf,float denf,float den,float R,float w,int n,float MTOOL,float R_TOOL) { complex M[4][4],fun,p,s,f,g,k,ttt; complex fr,sr,pr,fa,ai,inter[4],Inter; complex common; float arg0=0.0,SPACE=3.6; float kp,kf,ks,etool,temp; int j,i; // k=w/v; k=complex(x,y); kp=w/vp; ks=w/vs; kf=w/vf; ai=complex(0.0,1.0); ttt=complex(1.e-10,0.0); p=sqrt(k*k-complex(kp*kp,0)); s=sqrt(k*k-complex(ks*ks,0)); f=sqrt(k*k-complex(kf*kf,0)); inter[0]=pow(f*complex(R_TOOL/2,0),n); inter[1]=complex(cos(n*(arg0-3.1415926/2)),0); Inter=ai*k*complex(SPACE,0); inter[2]=complex(pow(2.718282,(double)real(Inter))*cos(imag(Inter)),pow(2.718282,(double)real(Inter))*sin(imag(Inter))); inter[3]=inter[0]*inter[1]*inter[2]; common=complex(1.0,0.0);//inter[3]*inter[3]*inter[3]*inter[3]*complex(1.e-12,0.0); fr=f*complex (R,0.0); pr=p*complex (R,0.0); sr=s*complex (R,0.0); fa=f*complex (R_TOOL,0.0); temp=MTOOL/R_TOOL; etool=(temp*real(f*Ibessel(1,fa))+denf*w*w*real(Ibessel(0,fa)))/(temp*real(f*Kbessel(1,fa))-denf*w*w*real(Kbessel(0,fa))); M[0][0]=complex (-1.,0.0)*complex (n/R,0.0)*Ibessel(n,fr)-f*Ibessel(n+1,fr); M[0][1]=complex (-1.,0.0)*p*(complex (-n,0)/(pr)*Kbessel(n,pr)+Kbessel(n+1,pr)); M[0][2]=complex (-1.,0.0)*complex (n/R,0)*Kbessel(n,sr); M[0][3]=ai*complex (-ks,0.0)*(complex (-n,0.0)/(sr)*Kbessel(n,sr)+Kbessel(n+1,sr)); M[1][0]=(complex (denf*w*w,0.0)*Ibessel(n,fr)); M[1][1]=(complex (den,0)*(complex (2.0*vs*vs,0)*k*k-complex (w*w,0.0))*Kbessel(n,pr)+complex (2.0*den*vs*vs/R,0.0)*p*((complex (n*(n-1),0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[1][2]=(complex (-2*n*den*vs*vs/R,0.0)*s*((complex (1-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); M[1][3]=((ai*k*complex (2*den*vs*vs,0.0)*s*s*Kbessel(n,sr)+ai*complex (2*ks*den*vs*vs/R,0)*((complex (n*(n-1),0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr)))); M[2][0]=(0.0,0.0); M[2][1]=(complex (-2*n*den*vs*vs,0.0)*p*((complex (1-n,0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[2][2]=(complex (-den*vs*vs,0)*s*s*((complex (1.0,0.0)+complex (2*n*(n-1),0.0)/(sr*sr))*Kbessel(n,sr)+(complex (2,0.0)/sr)*Kbessel(n+1,sr))); M[2][3]=(ai*complex (2*ks*n*den*vs*vs/R,0)*((complex (1-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); M[3][0]=(0.0,0.0); M[3][1]=(ai*k*complex (-2*den*vs*vs,0)*p*((complex (-n,0.0)/pr)*Kbessel(n,pr)+Kbessel(n+1,pr))); M[3][2]=(ai*k*complex (-n*den*vs*vs/R,0)*Kbessel(n,sr)); M[3][3]=((k*k+s*s)*s*complex (den*vs*vs,0)*((complex (-n,0)/sr)*Kbessel(n,sr)+Kbessel(n+1,sr))); if(MTOOL>0.01) { if(n==0) { M[0][0]=complex (-1.,0.0)*complex (n/R,0.0)*Ibessel(n,fr)-f*(Ibessel(n+1,fr)-etool*Kbessel(n+1,fr)); M[1][0]=(complex (denf*w*w,0.0)*(Ibessel(n,fr)+etool*Kbessel(n,fr))); } if(n==1) { M[0][0]=complex (-1.,0.0)*complex (n/R,0.0)*(Ibessel(n,fr)-etool*Kbessel(n,fr))-f*(Ibessel(n+1,fr)); M[1][0]=(complex (denf*w*w,0.0)*(Ibessel(n,fr)-etool*Kbessel(n,fr))); } } for(j=0;j<=3;j++) { for(i=0;i<=3;i++) { M[j][i]=M[j][i]*ttt; } } int u[24][4]={{0,1,2,3},{0,1,3,2},{0,2,1,3},{0,2,3,1},{0,3,1,2},{0,3,2,1}, {1,0,2,3},{1,0,3,2},{1,2,0,3},{1,2,3,0},{1,3,0,2},{1,3,2,0}, {2,0,3,1},{2,0,1,3},{2,1,3,0},{2,1,0,3},{2,3,0,1},{2,3,1,0}, {3,0,1,2},{3,0,2,1},{3,1,2,0},{3,1,0,2},{3,2,0,1},{3,2,1,0}}; int t,sd[4]; for(j=0;j<24;j++) { sd[0]=u[j][0]; sd[1]=u[j][1]; sd[2]=u[j][2]; sd[3]=u[j][3]; t=reversion(sd); inter[0]=M[0][u[j][0]]; inter[1]=inter[0]*M[1][u[j][1]]; inter[2]=inter[1]*M[2][u[j][2]]; inter[3]=inter[2]*M[3][u[j][3]]; fun=fun+complex (pow(-1.0,t),0.0)*inter[3]*common; } return fun; } complex CalcMethod::interposek(float x,float y ,float vp,float vs,float vf,float denf,float den,float R,float w,int n,float MTOOL,float R_TOOL) { float hr=0.1;//x/10;//? float hi=0.0;//y/10;//? complex X[5]; complex inter[8],Inter; int i; for(i=0;i<5;i++) { X[i]=complex(x+(i)*hr,y+(i)*hi); } complex h=complex(hr,hi); complex m,f0,f1,f2,f3,f4; f0=Funcxianjie(real(X[0]),imag(X[0]),vp,vs,vf,denf,den,R,w,n,MTOOL,R_TOOL); f1=Funcxianjie(real(X[1]),imag(X[1]),vp,vs,vf,denf,den,R,w,n,MTOOL,R_TOOL); f2=Funcxianjie(real(X[2]),imag(X[2]),vp,vs,vf,denf,den,R,w,n,MTOOL,R_TOOL); f3=Funcxianjie(real(X[3]),imag(X[3]),vp,vs,vf,denf,den,R,w,n,MTOOL,R_TOOL); f4=Funcxianjie(real(X[4]),imag(X[4]),vp,vs,vf,denf,den,R,w,n,MTOOL,R_TOOL); inter[0]=(complex(1.0/12.0,0)/h)*complex(-25,0)*f0; Inter=(complex(1.0/12.0,0)/h)*complex(48,0); inter[1]=inter[0]+Inter*f1; inter[2]=inter[1]+(complex(1.0/12.0,0)/h)*complex(-36,0)*f2; inter[3]=inter[2]+(complex(1.0/12.0,0)/h)*complex(16,0)*f3; inter[4]=inter[3]+(complex(1.0/12.0,0)/h)*complex(-3,0)*f4; m=inter[4]; return m; } complex CalcMethod::interposeW(float x,float y ,float vp,float vs,float vf,float denf,float den,float R,float w,int n,float MTOOL,float R_TOOL,float df) { complex m,inter[8],Inter; float W[5]; int i,dff=df/5.; for(i=0;i<5;i++) { W[i]=w+(i)*dff; } complex f0,f1,f2,f3,f4; f0=Funcxianjie(x,y,vp,vs,vf,denf,den,R,W[0],n,MTOOL,R_TOOL); f1=Funcxianjie(x,y,vp,vs,vf,denf,den,R,W[1],n,MTOOL,R_TOOL); f2=Funcxianjie(x,y,vp,vs,vf,denf,den,R,W[2],n,MTOOL,R_TOOL); f3=Funcxianjie(x,y,vp,vs,vf,denf,den,R,W[3],n,MTOOL,R_TOOL); f4=Funcxianjie(x,y,vp,vs,vf,denf,den,R,W[4],n,MTOOL,R_TOOL); inter[0]=complex(1.0/(12.0*dff),0)*complex(-25,0)*f0; Inter=complex(48,0)*f1; inter[1]=inter[0]+complex(1.0/(12.0*dff),0)*complex(48,0)*f1; inter[2]=inter[1]+complex(1.0/(12.0*dff),0)*complex(-36,0)*f2; inter[3]=inter[2]+complex(1.0/(12.0*dff),0)*complex(16,0)*f3; inter[4]=inter[3]+complex(1.0/(12.0*dff),0)*complex(-3,0)*f4; m=inter[4]; return m; } // void CalcMethod::G_L(float r,float r_,float k,float w,float denf,float gl[2][2]) { float space=0.1524; gl[0][0]=r*r/(r_*r_)*cos(k*space); gl[0][1]=-r*r/(r_*r_)*sin(k*space)*k/(denf*w*w); gl[1][0]=denf*w*w*sin(k*space)/k; gl[1][1]=cos(k*space); } //求逆矩阵 void CalcMethod::MM_(float M[2][2],float M_[2][2]) { float x,x00,x01,x10,x11; x=M[0][0]*M[1][1]+M[0][1]*M[1][0]; x00=M[1][1]/x; x01=M[1][0]/x; x10=M[0][1]/x; x11=M[0][0]/x; M_[0][0]=x00; M_[0][1]=x01; M_[1][0]=x10; M_[1][1]=x11; } //矩阵乘 void CalcMethod::M_M(float M1[2][2],float M2[2][2],float M[2][2]) { float x00,x01,x10,x11; x00=M1[0][0]*M2[0][0]+M1[0][1]*M2[1][0]; x01=M1[0][0]*M2[0][1]+M1[0][1]*M2[1][1]; x10=M1[1][0]*M2[0][0]+M1[1][1]*M2[1][0]; x11=M1[1][0]*M2[0][1]+M1[1][1]*M2[1][1]; M[0][0]=x00; M[0][1]=x01; M[1][0]=x10; M[1][1]=x11; } // complex CalcMethod::initialvalue(float x,float y ,float vp,float vs,float vf,float denf,float den,float R,float w,int n,float MTOOL,float R_TOOL,float df) { complex k; float W; W=df;//w/10; k=complex(x,y); complex difK,difW; difK=interposek(x,y ,vp,vs,vf,denf,den,R,w,n,MTOOL,R_TOOL); difW=interposeW(x,y ,vp,vs,vf,denf,den,R,w,n,MTOOL,R_TOOL,W); complextemp=complex(W,0)*difW/difK; k=k-temp; return k; }