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

  1.       subroutine ratqr(n,eps1,d,e,e2,m,w,ind,bd,type,idef,ierr)
  2. c
  3.       integer i,j,k,m,n,ii,jj,k1,idef,ierr,jdef
  4.       double precision d(n),e(n),e2(n),w(n),bd(n)
  5.       double precision f,p,q,r,s,ep,qp,err,tot,eps1,delta,epslon
  6.       integer ind(n)
  7.       logical type
  8. c
  9. c     this subroutine is a translation of the algol procedure ratqr,
  10. c     num. math. 11, 264-272(1968) by reinsch and bauer.
  11. c     handbook for auto. comp., vol.ii-linear algebra, 257-265(1971).
  12. c
  13. c     this subroutine finds the algebraically smallest or largest
  14. c     eigenvalues of a symmetric tridiagonal matrix by the
  15. c     rational qr method with newton corrections.
  16. c
  17. c     on input
  18. c
  19. c        n is the order of the matrix.
  20. c
  21. c        eps1 is a theoretical absolute error tolerance for the
  22. c          computed eigenvalues.  if the input eps1 is non-positive,
  23. c          or indeed smaller than its default value, it is reset
  24. c          at each iteration to the respective default value,
  25. c          namely, the product of the relative machine precision
  26. c          and the magnitude of the current eigenvalue iterate.
  27. c          the theoretical absolute error in the k-th eigenvalue
  28. c          is usually not greater than k times eps1.
  29. c
  30. c        d contains the diagonal elements of the input matrix.
  31. c
  32. c        e contains the subdiagonal elements of the input matrix
  33. c          in its last n-1 positions.  e(1) is arbitrary.
  34. c
  35. c        e2 contains the squares of the corresponding elements of e.
  36. c          e2(1) is arbitrary.
  37. c
  38. c        m is the number of eigenvalues to be found.
  39. c
  40. c        idef should be set to 1 if the input matrix is known to be
  41. c          positive definite, to -1 if the input matrix is known to
  42. c          be negative definite, and to 0 otherwise.
  43. c
  44. c        type should be set to .true. if the smallest eigenvalues
  45. c          are to be found, and to .false. if the largest eigenvalues
  46. c          are to be found.
  47. c
  48. c     on output
  49. c
  50. c        eps1 is unaltered unless it has been reset to its
  51. c          (last) default value.
  52. c
  53. c        d and e are unaltered (unless w overwrites d).
  54. c
  55. c        elements of e2, corresponding to elements of e regarded
  56. c          as negligible, have been replaced by zero causing the
  57. c          matrix to split into a direct sum of submatrices.
  58. c          e2(1) is set to 0.0d0 if the smallest eigenvalues have been
  59. c          found, and to 2.0d0 if the largest eigenvalues have been
  60. c          found.  e2 is otherwise unaltered (unless overwritten by bd).
  61. c
  62. c        w contains the m algebraically smallest eigenvalues in
  63. c          ascending order, or the m largest eigenvalues in
  64. c          descending order.  if an error exit is made because of
  65. c          an incorrect specification of idef, no eigenvalues
  66. c          are found.  if the newton iterates for a particular
  67. c          eigenvalue are not monotone, the best estimate obtained
  68. c          is returned and ierr is set.  w may coincide with d.
  69. c
  70. c        ind contains in its first m positions the submatrix indices
  71. c          associated with the corresponding eigenvalues in w --
  72. c          1 for eigenvalues belonging to the first submatrix from
  73. c          the top, 2 for those belonging to the second submatrix, etc..
  74. c
  75. c        bd contains refined bounds for the theoretical errors of the
  76. c          corresponding eigenvalues in w.  these bounds are usually
  77. c          within the tolerance specified by eps1.  bd may coincide
  78. c          with e2.
  79. c
  80. c        ierr is set to
  81. c          zero       for normal return,
  82. c          6*n+1      if  idef  is set to 1 and  type  to .true.
  83. c                     when the matrix is not positive definite, or
  84. c                     if  idef  is set to -1 and  type  to .false.
  85. c                     when the matrix is not negative definite,
  86. c          5*n+k      if successive iterates to the k-th eigenvalue
  87. c                     are not monotone increasing, where k refers
  88. c                     to the last such occurrence.
  89. c
  90. c     note that subroutine tridib is generally faster and more
  91. c     accurate than ratqr if the eigenvalues are clustered.
  92. c
  93. c     questions and comments should be directed to burton s. garbow,
  94. c     mathematics and computer science div, argonne national laboratory
  95. c
  96. c     this version dated august 1983.
  97. c
  98. c     ------------------------------------------------------------------
  99. c
  100.       ierr = 0
  101.       jdef = idef
  102. c     .......... copy d array into w ..........
  103.       do 20 i = 1, n
  104.    20 w(i) = d(i)
  105. c
  106.       if (type) go to 40
  107.       j = 1
  108.       go to 400
  109.    40 err = 0.0d0
  110.       s = 0.0d0
  111. c     .......... look for small sub-diagonal entries and define
  112. c                initial shift from lower gerschgorin bound.
  113. c                copy e2 array into bd ..........
  114.       tot = w(1)
  115.       q = 0.0d0
  116.       j = 0
  117. c
  118.       do 100 i = 1, n
  119.          p = q
  120.          if (i .eq. 1) go to 60
  121.          if (p .gt. epslon(dabs(d(i)) + dabs(d(i-1)))) go to 80
  122.    60    e2(i) = 0.0d0
  123.    80    bd(i) = e2(i)
  124. c     .......... count also if element of e2 has underflowed ..........
  125.          if (e2(i) .eq. 0.0d0) j = j + 1
  126.          ind(i) = j
  127.          q = 0.0d0
  128.          if (i .ne. n) q = dabs(e(i+1))
  129.          tot = dmin1(w(i)-p-q,tot)
  130.   100 continue
  131. c
  132.       if (jdef .eq. 1 .and. tot .lt. 0.0d0) go to 140
  133. c
  134.       do 110 i = 1, n
  135.   110 w(i) = w(i) - tot
  136. c
  137.       go to 160
  138.   140 tot = 0.0d0
  139. c
  140.   160 do 360 k = 1, m
  141. c     .......... next qr transformation ..........
  142.   180    tot = tot + s
  143.          delta = w(n) - s
  144.          i = n
  145.          f = dabs(epslon(tot))
  146.          if (eps1 .lt. f) eps1 = f
  147.          if (delta .gt. eps1) go to 190
  148.          if (delta .lt. (-eps1)) go to 1000
  149.          go to 300
  150. c     .......... replace small sub-diagonal squares by zero
  151. c                to reduce the incidence of underflows ..........
  152.   190    if (k .eq. n) go to 210
  153.          k1 = k + 1
  154.          do 200 j = k1, n
  155.             if (bd(j) .le. (epslon(w(j)+w(j-1))) ** 2) bd(j) = 0.0d0
  156.   200    continue
  157. c
  158.   210    f = bd(n) / delta
  159.          qp = delta + f
  160.          p = 1.0d0
  161.          if (k .eq. n) go to 260
  162.          k1 = n - k
  163. c     .......... for i=n-1 step -1 until k do -- ..........
  164.          do 240 ii = 1, k1
  165.             i = n - ii
  166.             q = w(i) - s - f
  167.             r = q / qp
  168.             p = p * r + 1.0d0
  169.             ep = f * r
  170.             w(i+1) = qp + ep
  171.             delta = q - ep
  172.             if (delta .gt. eps1) go to 220
  173.             if (delta .lt. (-eps1)) go to 1000
  174.             go to 300
  175.   220       f = bd(i) / q
  176.             qp = delta + f
  177.             bd(i+1) = qp * ep
  178.   240    continue
  179. c
  180.   260    w(k) = qp
  181.          s = qp / p
  182.          if (tot + s .gt. tot) go to 180
  183. c     .......... set error -- irregular end of iteration.
  184. c                deflate minimum diagonal element ..........
  185.          ierr = 5 * n + k
  186.          s = 0.0d0
  187.          delta = qp
  188. c
  189.          do 280 j = k, n
  190.             if (w(j) .gt. delta) go to 280
  191.             i = j
  192.             delta = w(j)
  193.   280    continue
  194. c     .......... convergence ..........
  195.   300    if (i .lt. n) bd(i+1) = bd(i) * f / qp
  196.          ii = ind(i)
  197.          if (i .eq. k) go to 340
  198.          k1 = i - k
  199. c     .......... for j=i-1 step -1 until k do -- ..........
  200.          do 320 jj = 1, k1
  201.             j = i - jj
  202.             w(j+1) = w(j) - s
  203.             bd(j+1) = bd(j)
  204.             ind(j+1) = ind(j)
  205.   320    continue
  206. c
  207.   340    w(k) = tot
  208.          err = err + dabs(delta)
  209.          bd(k) = err
  210.          ind(k) = ii
  211.   360 continue
  212. c
  213.       if (type) go to 1001
  214.       f = bd(1)
  215.       e2(1) = 2.0d0
  216.       bd(1) = f
  217.       j = 2
  218. c     .......... negate elements of w for largest values ..........
  219.   400 do 500 i = 1, n
  220.   500 w(i) = -w(i)
  221. c
  222.       jdef = -jdef
  223.       go to (40,1001), j
  224. c     .......... set error -- idef specified incorrectly ..........
  225.  1000 ierr = 6 * n + 1
  226.  1001 return
  227.       end
  228.