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

  1.       subroutine tinvit(nm,n,d,e,e2,m,w,ind,z,
  2.      x                  ierr,rv1,rv2,rv3,rv4,rv6)
  3. c
  4.       integer i,j,m,n,p,q,r,s,ii,ip,jj,nm,its,tag,ierr,group
  5.       double precision d(n),e(n),e2(n),w(m),z(nm,m),
  6.      x       rv1(n),rv2(n),rv3(n),rv4(n),rv6(n)
  7.       double precision u,v,uk,xu,x0,x1,eps2,eps3,eps4,norm,order,epslon,
  8.      x       pythag
  9.       integer ind(m)
  10. c
  11. c     this subroutine is a translation of the inverse iteration tech-
  12. c     nique in the algol procedure tristurm by peters and wilkinson.
  13. c     handbook for auto. comp., vol.ii-linear algebra, 418-439(1971).
  14. c
  15. c     this subroutine finds those eigenvectors of a tridiagonal
  16. c     symmetric matrix corresponding to specified eigenvalues,
  17. c     using inverse iteration.
  18. c
  19. c     on input
  20. c
  21. c        nm must be set to the row dimension of two-dimensional
  22. c          array parameters as declared in the calling program
  23. c          dimension statement.
  24. c
  25. c        n is the order of the matrix.
  26. c
  27. c        d contains the diagonal elements of the input matrix.
  28. c
  29. c        e contains the subdiagonal elements of the input matrix
  30. c          in its last n-1 positions.  e(1) is arbitrary.
  31. c
  32. c        e2 contains the squares of the corresponding elements of e,
  33. c          with zeros corresponding to negligible elements of e.
  34. c          e(i) is considered negligible if it is not larger than
  35. c          the product of the relative machine precision and the sum
  36. c          of the magnitudes of d(i) and d(i-1).  e2(1) must contain
  37. c          0.0d0 if the eigenvalues are in ascending order, or 2.0d0
  38. c          if the eigenvalues are in descending order.  if  bisect,
  39. c          tridib, or  imtqlv  has been used to find the eigenvalues,
  40. c          their output e2 array is exactly what is expected here.
  41. c
  42. c        m is the number of specified eigenvalues.
  43. c
  44. c        w contains the m eigenvalues in ascending or descending order.
  45. c
  46. c        ind contains in its first m positions the submatrix indices
  47. c          associated with the corresponding eigenvalues in w --
  48. c          1 for eigenvalues belonging to the first submatrix from
  49. c          the top, 2 for those belonging to the second submatrix, etc.
  50. c
  51. c     on output
  52. c
  53. c        all input arrays are unaltered.
  54. c
  55. c        z contains the associated set of orthonormal eigenvectors.
  56. c          any vector which fails to converge is set to zero.
  57. c
  58. c        ierr is set to
  59. c          zero       for normal return,
  60. c          -r         if the eigenvector corresponding to the r-th
  61. c                     eigenvalue fails to converge in 5 iterations.
  62. c
  63. c        rv1, rv2, rv3, rv4, and rv6 are temporary storage arrays.
  64. c
  65. c     calls pythag for  dsqrt(a*a + b*b) .
  66. c
  67. c     questions and comments should be directed to burton s. garbow,
  68. c     mathematics and computer science div, argonne national laboratory
  69. c
  70. c     this version dated august 1983.
  71. c
  72. c     ------------------------------------------------------------------
  73. c
  74.       ierr = 0
  75.       if (m .eq. 0) go to 1001
  76.       tag = 0
  77.       order = 1.0d0 - e2(1)
  78.       q = 0
  79. c     .......... establish and process next submatrix ..........
  80.   100 p = q + 1
  81. c
  82.       do 120 q = p, n
  83.          if (q .eq. n) go to 140
  84.          if (e2(q+1) .eq. 0.0d0) go to 140
  85.   120 continue
  86. c     .......... find vectors by inverse iteration ..........
  87.   140 tag = tag + 1
  88.       s = 0
  89. c
  90.       do 920 r = 1, m
  91.          if (ind(r) .ne. tag) go to 920
  92.          its = 1
  93.          x1 = w(r)
  94.          if (s .ne. 0) go to 510
  95. c     .......... check for isolated root ..........
  96.          xu = 1.0d0
  97.          if (p .ne. q) go to 490
  98.          rv6(p) = 1.0d0
  99.          go to 870
  100.   490    norm = dabs(d(p))
  101.          ip = p + 1
  102. c
  103.          do 500 i = ip, q
  104.   500    norm = dmax1(norm, dabs(d(i))+dabs(e(i)))
  105. c     .......... eps2 is the criterion for grouping,
  106. c                eps3 replaces zero pivots and equal
  107. c                roots are modified by eps3,
  108. c                eps4 is taken very small to avoid overflow ..........
  109.          eps2 = 1.0d-3 * norm
  110.          eps3 = epslon(norm)
  111.          uk = q - p + 1
  112.          eps4 = uk * eps3
  113.          uk = eps4 / dsqrt(uk)
  114.          s = p
  115.   505    group = 0
  116.          go to 520
  117. c     .......... look for close or coincident roots ..........
  118.   510    if (dabs(x1-x0) .ge. eps2) go to 505
  119.          group = group + 1
  120.          if (order * (x1 - x0) .le. 0.0d0) x1 = x0 + order * eps3
  121. c     .......... elimination with interchanges and
  122. c                initialization of vector ..........
  123.   520    v = 0.0d0
  124. c
  125.          do 580 i = p, q
  126.             rv6(i) = uk
  127.             if (i .eq. p) go to 560
  128.             if (dabs(e(i)) .lt. dabs(u)) go to 540
  129. c     .......... warning -- a divide check may occur here if
  130. c                e2 array has not been specified correctly ..........
  131.             xu = u / e(i)
  132.             rv4(i) = xu
  133.             rv1(i-1) = e(i)
  134.             rv2(i-1) = d(i) - x1
  135.             rv3(i-1) = 0.0d0
  136.             if (i .ne. q) rv3(i-1) = e(i+1)
  137.             u = v - xu * rv2(i-1)
  138.             v = -xu * rv3(i-1)
  139.             go to 580
  140.   540       xu = e(i) / u
  141.             rv4(i) = xu
  142.             rv1(i-1) = u
  143.             rv2(i-1) = v
  144.             rv3(i-1) = 0.0d0
  145.   560       u = d(i) - x1 - xu * v
  146.             if (i .ne. q) v = e(i+1)
  147.   580    continue
  148. c
  149.          if (u .eq. 0.0d0) u = eps3
  150.          rv1(q) = u
  151.          rv2(q) = 0.0d0
  152.          rv3(q) = 0.0d0
  153. c     .......... back substitution
  154. c                for i=q step -1 until p do -- ..........
  155.   600    do 620 ii = p, q
  156.             i = p + q - ii
  157.             rv6(i) = (rv6(i) - u * rv2(i) - v * rv3(i)) / rv1(i)
  158.             v = u
  159.             u = rv6(i)
  160.   620    continue
  161. c     .......... orthogonalize with respect to previous
  162. c                members of group ..........
  163.          if (group .eq. 0) go to 700
  164.          j = r
  165. c
  166.          do 680 jj = 1, group
  167.   630       j = j - 1
  168.             if (ind(j) .ne. tag) go to 630
  169.             xu = 0.0d0
  170. c
  171.             do 640 i = p, q
  172.   640       xu = xu + rv6(i) * z(i,j)
  173. c
  174.             do 660 i = p, q
  175.   660       rv6(i) = rv6(i) - xu * z(i,j)
  176. c
  177.   680    continue
  178. c
  179.   700    norm = 0.0d0
  180. c
  181.          do 720 i = p, q
  182.   720    norm = norm + dabs(rv6(i))
  183. c
  184.          if (norm .ge. 1.0d0) go to 840
  185. c     .......... forward substitution ..........
  186.          if (its .eq. 5) go to 830
  187.          if (norm .ne. 0.0d0) go to 740
  188.          rv6(s) = eps4
  189.          s = s + 1
  190.          if (s .gt. q) s = p
  191.          go to 780
  192.   740    xu = eps4 / norm
  193. c
  194.          do 760 i = p, q
  195.   760    rv6(i) = rv6(i) * xu
  196. c     .......... elimination operations on next vector
  197. c                iterate ..........
  198.   780    do 820 i = ip, q
  199.             u = rv6(i)
  200. c     .......... if rv1(i-1) .eq. e(i), a row interchange
  201. c                was performed earlier in the
  202. c                triangularization process ..........
  203.             if (rv1(i-1) .ne. e(i)) go to 800
  204.             u = rv6(i-1)
  205.             rv6(i-1) = rv6(i)
  206.   800       rv6(i) = u - rv4(i) * rv6(i-1)
  207.   820    continue
  208. c
  209.          its = its + 1
  210.          go to 600
  211. c     .......... set error -- non-converged eigenvector ..........
  212.   830    ierr = -r
  213.          xu = 0.0d0
  214.          go to 870
  215. c     .......... normalize so that sum of squares is
  216. c                1 and expand to full order ..........
  217.   840    u = 0.0d0
  218. c
  219.          do 860 i = p, q
  220.   860    u = pythag(u,rv6(i))
  221. c
  222.          xu = 1.0d0 / u
  223. c
  224.   870    do 880 i = 1, n
  225.   880    z(i,r) = 0.0d0
  226. c
  227.          do 900 i = p, q
  228.   900    z(i,r) = rv6(i) * xu
  229. c
  230.          x0 = x1
  231.   920 continue
  232. c
  233.       if (q .lt. n) go to 100
  234.  1001 return
  235.       end
  236.