tevlc.f 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. *DECK TEVLC
  2. SUBROUTINE TEVLC (N, D, E2, IERR)
  3. C***BEGIN PROLOGUE TEVLC
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to CBLKTR
  6. C***LIBRARY SLATEC
  7. C***TYPE SINGLE PRECISION (TEVLC-S)
  8. C***AUTHOR (UNKNOWN)
  9. C***DESCRIPTION
  10. C
  11. C This subroutine finds the eigenvalues of a symmetric tridiagonal
  12. C matrix by the rational QL method.
  13. C
  14. C On Input-
  15. C
  16. C N is the order of the matrix,
  17. C
  18. C D contains the diagonal elements of the input matrix,
  19. C
  20. C E2 contains the subdiagonal elements of the input matrix
  21. C in its last N-1 positions. E2(1) is arbitrary.
  22. C
  23. C On Output-
  24. C
  25. C D contains the eigenvalues in ascending order. If an
  26. C error exit is made, the eigenvalues are correct and
  27. C ordered for indices 1,2,...IERR-1, but may not be
  28. C the smallest eigenvalues,
  29. C
  30. C E2 has been destroyed,
  31. C
  32. C IERR is set to
  33. C ZERO for normal return,
  34. C J if the J-th eigenvalue has not been
  35. C determined after 30 iterations.
  36. C
  37. C***SEE ALSO CBLKTR
  38. C***REFERENCES C. H. Reinsch, Eigenvalues of a real, symmetric, tri-
  39. C diagonal matrix, Algorithm 464, Communications of the
  40. C ACM 16, 11 (November 1973), pp. 689.
  41. C***ROUTINES CALLED (NONE)
  42. C***COMMON BLOCKS CCBLK
  43. C***REVISION HISTORY (YYMMDD)
  44. C 801001 DATE WRITTEN
  45. C 890831 Modified array declarations. (WRB)
  46. C 891214 Prologue converted to Version 4.0 format. (BAB)
  47. C 900402 Added TYPE section. (WRB)
  48. C 920528 DESCRIPTION revised and REFERENCES section added. (WRB)
  49. C***END PROLOGUE TEVLC
  50. C
  51. INTEGER I ,J ,L ,M ,
  52. 1 N ,II ,L1 ,MML ,
  53. 2 IERR
  54. REAL D(*) ,E2(*)
  55. REAL B ,C ,F ,G ,
  56. 1 H ,P ,R ,S ,
  57. 2 MACHEP
  58. C
  59. COMMON /CCBLK/ NPP ,K ,MACHEP ,CNV ,
  60. 1 NM ,NCMPLX ,IK
  61. C***FIRST EXECUTABLE STATEMENT TEVLC
  62. IERR = 0
  63. IF (N .EQ. 1) GO TO 115
  64. C
  65. DO 101 I=2,N
  66. E2(I-1) = E2(I)*E2(I)
  67. 101 CONTINUE
  68. C
  69. F = 0.0
  70. B = 0.0
  71. E2(N) = 0.0
  72. C
  73. DO 112 L=1,N
  74. J = 0
  75. H = MACHEP*(ABS(D(L))+SQRT(E2(L)))
  76. IF (B .GT. H) GO TO 102
  77. B = H
  78. C = B*B
  79. C
  80. C ********** LOOK FOR SMALL SQUARED SUB-DIAGONAL ELEMENT **********
  81. C
  82. 102 DO 103 M=L,N
  83. IF (E2(M) .LE. C) GO TO 104
  84. C
  85. C ********** E2(N) IS ALWAYS ZERO, SO THERE IS NO EXIT
  86. C THROUGH THE BOTTOM OF THE LOOP **********
  87. C
  88. 103 CONTINUE
  89. C
  90. 104 IF (M .EQ. L) GO TO 108
  91. 105 IF (J .EQ. 30) GO TO 114
  92. J = J+1
  93. C
  94. C ********** FORM SHIFT **********
  95. C
  96. L1 = L+1
  97. S = SQRT(E2(L))
  98. G = D(L)
  99. P = (D(L1)-G)/(2.0*S)
  100. R = SQRT(P*P+1.0)
  101. D(L) = S/(P+SIGN(R,P))
  102. H = G-D(L)
  103. C
  104. DO 106 I=L1,N
  105. D(I) = D(I)-H
  106. 106 CONTINUE
  107. C
  108. F = F+H
  109. C
  110. C ********** RATIONAL QL TRANSFORMATION **********
  111. C
  112. G = D(M)
  113. IF (G .EQ. 0.0) G = B
  114. H = G
  115. S = 0.0
  116. MML = M-L
  117. C
  118. C ********** FOR I=M-1 STEP -1 UNTIL L DO -- **********
  119. C
  120. DO 107 II=1,MML
  121. I = M-II
  122. P = G*H
  123. R = P+E2(I)
  124. E2(I+1) = S*R
  125. S = E2(I)/R
  126. D(I+1) = H+S*(H+D(I))
  127. G = D(I)-E2(I)/G
  128. IF (G .EQ. 0.0) G = B
  129. H = G*P/R
  130. 107 CONTINUE
  131. C
  132. E2(L) = S*G
  133. D(L) = H
  134. C
  135. C ********** GUARD AGAINST UNDERFLOWED H **********
  136. C
  137. IF (H .EQ. 0.0) GO TO 108
  138. IF (ABS(E2(L)) .LE. ABS(C/H)) GO TO 108
  139. E2(L) = H*E2(L)
  140. IF (E2(L) .NE. 0.0) GO TO 105
  141. 108 P = D(L)+F
  142. C
  143. C ********** ORDER EIGENVALUES **********
  144. C
  145. IF (L .EQ. 1) GO TO 110
  146. C
  147. C ********** FOR I=L STEP -1 UNTIL 2 DO -- **********
  148. C
  149. DO 109 II=2,L
  150. I = L+2-II
  151. IF (P .GE. D(I-1)) GO TO 111
  152. D(I) = D(I-1)
  153. 109 CONTINUE
  154. C
  155. 110 I = 1
  156. 111 D(I) = P
  157. 112 CONTINUE
  158. C
  159. IF (ABS(D(N)) .GE. ABS(D(1))) GO TO 115
  160. NHALF = N/2
  161. DO 113 I=1,NHALF
  162. NTOP = N-I
  163. DHOLD = D(I)
  164. D(I) = D(NTOP+1)
  165. D(NTOP+1) = DHOLD
  166. 113 CONTINUE
  167. GO TO 115
  168. C
  169. C ********** SET ERROR -- NO CONVERGENCE TO AN
  170. C EIGENVALUE AFTER 30 ITERATIONS **********
  171. C
  172. 114 IERR = L
  173. 115 RETURN
  174. C
  175. C ********** LAST CARD OF TQLRAT **********
  176. C
  177. END