home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / eispack-1.0-src.tgz / tar.out / contrib / eispack / cbal.f < prev    next >
Text File  |  1996-09-28  |  5KB  |  182 lines

  1.       subroutine cbal(nm,n,ar,ai,low,igh,scale)
  2. c
  3.       integer i,j,k,l,m,n,jj,nm,igh,low,iexc
  4.       double precision ar(nm,n),ai(nm,n),scale(n)
  5.       double precision c,f,g,r,s,b2,radix
  6.       logical noconv
  7. c
  8. c     this subroutine is a translation of the algol procedure
  9. c     cbalance, which is a complex version of balance,
  10. c     num. math. 13, 293-304(1969) by parlett and reinsch.
  11. c     handbook for auto. comp., vol.ii-linear algebra, 315-326(1971).
  12. c
  13. c     this subroutine balances a complex matrix and isolates
  14. c     eigenvalues whenever possible.
  15. c
  16. c     on input
  17. c
  18. c        nm must be set to the row dimension of two-dimensional
  19. c          array parameters as declared in the calling program
  20. c          dimension statement.
  21. c
  22. c        n is the order of the matrix.
  23. c
  24. c        ar and ai contain the real and imaginary parts,
  25. c          respectively, of the complex matrix to be balanced.
  26. c
  27. c     on output
  28. c
  29. c        ar and ai contain the real and imaginary parts,
  30. c          respectively, of the balanced matrix.
  31. c
  32. c        low and igh are two integers such that ar(i,j) and ai(i,j)
  33. c          are equal to zero if
  34. c           (1) i is greater than j and
  35. c           (2) j=1,...,low-1 or i=igh+1,...,n.
  36. c
  37. c        scale contains information determining the
  38. c           permutations and scaling factors used.
  39. c
  40. c     suppose that the principal submatrix in rows low through igh
  41. c     has been balanced, that p(j) denotes the index interchanged
  42. c     with j during the permutation step, and that the elements
  43. c     of the diagonal matrix used are denoted by d(i,j).  then
  44. c        scale(j) = p(j),    for j = 1,...,low-1
  45. c                 = d(j,j)       j = low,...,igh
  46. c                 = p(j)         j = igh+1,...,n.
  47. c     the order in which the interchanges are made is n to igh+1,
  48. c     then 1 to low-1.
  49. c
  50. c     note that 1 is returned for igh if igh is zero formally.
  51. c
  52. c     the algol procedure exc contained in cbalance appears in
  53. c     cbal  in line.  (note that the algol roles of identifiers
  54. c     k,l have been reversed.)
  55. c
  56. c     arithmetic is real throughout.
  57. c
  58. c     questions and comments should be directed to burton s. garbow,
  59. c     mathematics and computer science div, argonne national laboratory
  60. c
  61. c     this version dated august 1983.
  62. c
  63. c     ------------------------------------------------------------------
  64. c
  65.       radix = 16.0d0
  66. c
  67.       b2 = radix * radix
  68.       k = 1
  69.       l = n
  70.       go to 100
  71. c     .......... in-line procedure for row and
  72. c                column exchange ..........
  73.    20 scale(m) = j
  74.       if (j .eq. m) go to 50
  75. c
  76.       do 30 i = 1, l
  77.          f = ar(i,j)
  78.          ar(i,j) = ar(i,m)
  79.          ar(i,m) = f
  80.          f = ai(i,j)
  81.          ai(i,j) = ai(i,m)
  82.          ai(i,m) = f
  83.    30 continue
  84. c
  85.       do 40 i = k, n
  86.          f = ar(j,i)
  87.          ar(j,i) = ar(m,i)
  88.          ar(m,i) = f
  89.          f = ai(j,i)
  90.          ai(j,i) = ai(m,i)
  91.          ai(m,i) = f
  92.    40 continue
  93. c
  94.    50 go to (80,130), iexc
  95. c     .......... search for rows isolating an eigenvalue
  96. c                and push them down ..........
  97.    80 if (l .eq. 1) go to 280
  98.       l = l - 1
  99. c     .......... for j=l step -1 until 1 do -- ..........
  100.   100 do 120 jj = 1, l
  101.          j = l + 1 - jj
  102. c
  103.          do 110 i = 1, l
  104.             if (i .eq. j) go to 110
  105.             if (ar(j,i) .ne. 0.0d0 .or. ai(j,i) .ne. 0.0d0) go to 120
  106.   110    continue
  107. c
  108.          m = l
  109.          iexc = 1
  110.          go to 20
  111.   120 continue
  112. c
  113.       go to 140
  114. c     .......... search for columns isolating an eigenvalue
  115. c                and push them left ..........
  116.   130 k = k + 1
  117. c
  118.   140 do 170 j = k, l
  119. c
  120.          do 150 i = k, l
  121.             if (i .eq. j) go to 150
  122.             if (ar(i,j) .ne. 0.0d0 .or. ai(i,j) .ne. 0.0d0) go to 170
  123.   150    continue
  124. c
  125.          m = k
  126.          iexc = 2
  127.          go to 20
  128.   170 continue
  129. c     .......... now balance the submatrix in rows k to l ..........
  130.       do 180 i = k, l
  131.   180 scale(i) = 1.0d0
  132. c     .......... iterative loop for norm reduction ..........
  133.   190 noconv = .false.
  134. c
  135.       do 270 i = k, l
  136.          c = 0.0d0
  137.          r = 0.0d0
  138. c
  139.          do 200 j = k, l
  140.             if (j .eq. i) go to 200
  141.             c = c + dabs(ar(j,i)) + dabs(ai(j,i))
  142.             r = r + dabs(ar(i,j)) + dabs(ai(i,j))
  143.   200    continue
  144. c     .......... guard against zero c or r due to underflow ..........
  145.          if (c .eq. 0.0d0 .or. r .eq. 0.0d0) go to 270
  146.          g = r / radix
  147.          f = 1.0d0
  148.          s = c + r
  149.   210    if (c .ge. g) go to 220
  150.          f = f * radix
  151.          c = c * b2
  152.          go to 210
  153.   220    g = r * radix
  154.   230    if (c .lt. g) go to 240
  155.          f = f / radix
  156.          c = c / b2
  157.          go to 230
  158. c     .......... now balance ..........
  159.   240    if ((c + r) / f .ge. 0.95d0 * s) go to 270
  160.          g = 1.0d0 / f
  161.          scale(i) = scale(i) * f
  162.          noconv = .true.
  163. c
  164.          do 250 j = k, n
  165.             ar(i,j) = ar(i,j) * g
  166.             ai(i,j) = ai(i,j) * g
  167.   250    continue
  168. c
  169.          do 260 j = 1, l
  170.             ar(j,i) = ar(j,i) * f
  171.             ai(j,i) = ai(j,i) * f
  172.   260    continue
  173. c
  174.   270 continue
  175. c
  176.       if (noconv) go to 190
  177. c
  178.   280 low = k
  179.       igh = l
  180.       return
  181.       end
  182.