c c........|.........|.........|.........|.........|.........|.........|.. c........|.........|.........|.........|.........|.........|.........|.. c c Rmatrix and associated programs may be used freely by University c researchers and teachers. Commercial parties interested in using c the program should contact C. J. Thomson. c c........|.........|.........|.........|.........|.........|.........|.. c........|.........|.........|.........|.........|.........|.........|.. c subroutine isotroc(a,rho,px,py,eval,evec) c Copyright (c) 1996 C. J. Thomson. c All rights reserved by the author. c Finds e-vals and e-vecs for an isotropic layer. c Based on modified (corrected) version of Sean Guest's routine isoeig. c This version allows complex slowness and frequency. c implicit real*8 (a-h,o-z) dimension a(3,3,3,3) complex*16 px,py complex*16 p(3),eval(6),evec(6,6) p(1)=px p(2)=py c33=a(3,3,3,3)*rho c44=a(2,3,2,3)*rho call isoeigc (rho,p,c33,c44,eval,evec) return end c c........|.........|.........|.........|.........|.........|.........|.. c subroutine isoeigc(den,p,c33,c44,wc,zc) c Copyright (c) 1996 C. J. Thomson. c All rights reserved by the author. c c Original version of isoeig: W.S. Guest November 1988 c c Modified/Corrected: C. Thomson October 1993 c Sean's original lines commented out for c comparison. c NOTE: c33 = lambda + 2mu and c44 = mu in Lame notation c c c Modified for complex lateral slowness, February 1995. CJT. c Modified to test branches better, November 1996. CJT. c c c Sean's comments follow... c c ``This subroutine calculates the displacement-stress eigenvectors c and the eigenvalues in the case of an isotropic medium. The coding c follows Fryer and Frazer (1987) with the obvious errors corrected. c The vectors are choosen to be in a right handed system. P is along c the slowness vector, SV is pointed upwards, and SH is horizontal c but its direction depends on the value of p(x) (It goes to the c left of the p(x) direction). All of the vectors are normalized so c that the displacements are of unit magnitude. c c Orientations rechecked 07/92 Sean Guest'' c implicit real*8(a-h,o-z) c integer i complex*16 p2,p(3),wc(6),zc(6,6),norm,acomp,ccomp,bcomp c c-LK Correction for the normal incidence if(p(1).eq.0..and.p(2).eq.0.) then p(1)=1.E-20 end if c-LK p2=p(1)**2 +p(2)**2 c c branch test parameter c acc=1.d-12 acc=4.d0*datan(1.d0) c c Define the eigenvalues c wc(1)=cdsqrt(den/c33-p2) c test=datan2(dimag(wc(1)),dble(wc(1))) c if(test.lt.0.d0.and.test.ge.-acc)wc(1)=-wc(1) c if(test.eq.acc)wc(1)=-wc(1) if(dimag(wc(1)).lt.0.d0)wc(1)=-wc(1) c if(dble(wc(1)).eq.0.d0)then c if(dimag(wc(1)).eq.0.d0)then c print *,'*** error 1 in isotroc' c stop c endif c test=2.d0*acc c else c if(dimag(wc(1)).ne.0.d0)then c test=dabs(dimag(wc(1))/dble(wc(1))) c endif c endif c if(test.gt.acc)then c if(dimag(wc(1)).lt.0.d0)wc(1)=-wc(1) c else c if(dble(wc(1)).lt.0.d0)wc(1)=-wc(1) c endif wc(2)=cdsqrt(den/c44-p2) c test=datan2(dimag(wc(2)),dble(wc(2))) c if(test.lt.0.d0.and.test.ge.-acc)wc(2)=-wc(2) c if(test.eq.acc)wc(2)=-wc(2) if(dble(wc(2)).lt.0.d0)wc(2)=-wc(2) c if(dble(wc(2)).eq.0.d0)then c if(dimag(wc(2)).eq.0.d0)then c print *,'*** error 1 in isotroc' c stop c endif c test=2.d0*acc c else c if(dimag(wc(2)).ne.0.d0)then c test=dabs(dimag(wc(2))/dble(wc(2))) c endif c endif c if(test.gt.acc)then c if(dimag(wc(2)).lt.0.d0)wc(2)=-wc(2) c else c if(dble(wc(2)).lt.0.d0)wc(2)=-wc(2) c endif wc(3)=wc(2) wc(4)=-wc(1) wc(5)=-wc(2) wc(6)=-wc(3) c c write (19,'(12e10.3)') wc c c Evaluation of the Eigenvectors c Solution of the Eigenvectors c do 10 i=0,3,3 c zc(1,1+i)=p(1) zc(2,1+i)=p(2) zc(3,1+i)=wc(1+i) zc(4,1+i)=2.d0*p(1)*c44*wc(1+i) zc(5,1+i)=2.d0*p(2)*c44*wc(1+i) zc(6,1+i)=den-2.d0*p2*c44 c c zc(4,1+i)=-2.d0*p(1)*c44*wc(1+i) c zc(5,1+i)=-2.d0*p(2)*c44*wc(1+i) c zc(6,1+i)=2.d0*p2*c44-den c zc(1,2+i)=p(1) zc(2,2+i)=p(2) zc(3,2+i)=-p2/wc(2+i) zc(4,2+i)=p(1)*zc(6,1+i)/wc(2+i) zc(5,2+i)=p(2)*zc(6,1+i)/wc(2+i) zc(6,2+i)=-2.d0*p2*c44 c c zc(4,2+i)=p(1)*(2.d0*p2*c44-den)/wc(2+i) c zc(5,2+i)=p(2)*(2.d0*p2*c44-den)/wc(2+i) c zc(6,2+i)=2.d0*p2*c44 c if (dble(wc(2+i)) .gt. 0.d0)then c do j=1,6 c zc(j,2+i) = -zc(j,2+i) c enddo c endif c zc(1,3+i)=-p(2) zc(2,3+i)=p(1) zc(3,3+i)=0.d0 zc(4,3+i)=-p(2)*c44*wc(3+i) zc(5,3+i)=p(1)*c44*wc(3+i) zc(6,3+i)=0.d0 c 10 continue c cs do 40 j=1,6 cs do 30 i=4,6 cs zc(i,j)=zc(i,j)*(0.d0,-1.d0) cs 30 continue cs 40 continue c c Normalize the vectors based on displacement c do 50 j=1,6 acomp=zc(1,j)*zc(1,j) bcomp=zc(2,j)*zc(2,j) ccomp=zc(3,j)*zc(3,j) acomp=zc(1,j)*dconjg(zc(1,j)) bcomp=zc(2,j)*dconjg(zc(2,j)) ccomp=zc(3,j)*dconjg(zc(3,j)) norm=cdsqrt(acomp+bcomp+ccomp) do 60 i=1,6 zc(i,j)=zc(i,j)/norm 60 continue 50 continue c return end c c........|.........|.........|.........|.........|.........|.........|.. c