1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
subroutine cortr(nm,n,low,igh,hr,hi,ortr,orti,zr,zi)
c!purpose
c cortr accumulate the unitary similarities performed by corth
c!calling sequence
c
c subroutine cortr(nm,n,low,igh,hr,hi,ortr,orti,zr,zi)
c
c on input.
c
c nm must be set to the row dimension of two-dimensional
c array parameters as declared in the calling program
c dimension statement.
c
c n is the order of the matrix.
c
c low and igh are integers determined by the balancing
c subroutine cbal. if cbal has not been used,
c set low=1, igh=n.
c
c hr and hi contain the real and imaginary parts,
c respectively, of the complex upper hessenberg matrix.
c their lower triangles below the subdiagonal contain further
c information about the transformations which were used in the
c reduction by corth, if performed. if the eigenvectors of
c the hessenberg matrix are desired, these elements may be
c arbitrary.
c
c
c on output.
c
c zr and zi contain the real and imaginary parts,
c respectivelyof the tranformations performed
c
c!
double precision hr(nm,n),hi(nm,n),zr(nm,n),zi(nm,n),ortr(igh)
double precision orti(igh),sr,si,norm
c .......... initialize eigenvector matrix ..........
do 100 i = 1, n
c
do 100 j = 1, n
zr(i,j) = 0.0d+0
zi(i,j) = 0.0d+0
if (i .eq. j) zr(i,j) = 1.0d+0
100 continue
c .......... form the matrix of accumulated transformations
c from the information left by corth ..........
iend = igh - low - 1
if (iend) 150, 150, 105
c .......... for i=igh-1 step -1 until low+1 do -- ..........
105 do 140 ii = 1, iend
i = igh - ii
cx if (ortr(i) .eq. 0.0d+0 .and. orti(i) .eq. 0.0d+0) go to 140
cx if (hr(i,i-1).eq.0.0d+0 .and. hi(i,i-1).eq.0.0d+0) go to 140
c .......... norm below is negative of h formed in corth ..........
norm = hr(i,i-1)*ortr(i) + hi(i,i-1)*orti(i)
if (norm.eq.0.0d+00) goto 140
ip1 = i + 1
c
do 110 k = ip1, igh
ortr(k) = hr(k,i-1)
orti(k) = hi(k,i-1)
110 continue
c
do 130 j = i, igh
sr = 0.0d+0
si = 0.0d+0
c
do 115 k = i, igh
sr = sr + ortr(k)*zr(k,j) + orti(k)*zi(k,j)
si = si + ortr(k)*zi(k,j) - orti(k)*zr(k,j)
115 continue
c
sr = sr/norm
si = si/norm
c
do 120 k = i, igh
zr(k,j) = zr(k,j) + sr*ortr(k) - si*orti(k)
zi(k,j) = zi(k,j) + sr*orti(k) + si*ortr(k)
120 continue
c
130 continue
c
140 continue
c*****
150 return
end
|