hqr.f 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. *DECK HQR
  2. SUBROUTINE HQR (NM, N, LOW, IGH, H, WR, WI, IERR)
  3. C***BEGIN PROLOGUE HQR
  4. C***PURPOSE Compute the eigenvalues of a real upper Hessenberg matrix
  5. C using the QR method.
  6. C***LIBRARY SLATEC (EISPACK)
  7. C***CATEGORY D4C2B
  8. C***TYPE SINGLE PRECISION (HQR-S, COMQR-C)
  9. C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK
  10. C***AUTHOR Smith, B. T., et al.
  11. C***DESCRIPTION
  12. C
  13. C This subroutine is a translation of the ALGOL procedure HQR,
  14. C NUM. MATH. 14, 219-231(1970) by Martin, Peters, and Wilkinson.
  15. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 359-371(1971).
  16. C
  17. C This subroutine finds the eigenvalues of a REAL
  18. C UPPER Hessenberg matrix by the QR method.
  19. C
  20. C On INPUT
  21. C
  22. C NM must be set to the row dimension of the two-dimensional
  23. C array parameter, H, as declared in the calling program
  24. C dimension statement. NM is an INTEGER variable.
  25. C
  26. C N is the order of the matrix H. N is an INTEGER variable.
  27. C N must be less than or equal to NM.
  28. C
  29. C LOW and IGH are two INTEGER variables determined by the
  30. C balancing subroutine BALANC. If BALANC has not been
  31. C used, set LOW=1 and IGH equal to the order of the matrix, N.
  32. C
  33. C H contains the upper Hessenberg matrix. Information about
  34. C the transformations used in the reduction to Hessenberg
  35. C form by ELMHES or ORTHES, if performed, is stored
  36. C in the remaining triangle under the Hessenberg matrix.
  37. C H is a two-dimensional REAL array, dimensioned H(NM,N).
  38. C
  39. C On OUTPUT
  40. C
  41. C H has been destroyed. Therefore, it must be saved before
  42. C calling HQR if subsequent calculation and back
  43. C transformation of eigenvectors is to be performed.
  44. C
  45. C WR and WI contain the real and imaginary parts, respectively,
  46. C of the eigenvalues. The eigenvalues are unordered except
  47. C that complex conjugate pairs of values appear consecutively
  48. C with the eigenvalue having the positive imaginary part first.
  49. C If an error exit is made, the eigenvalues should be correct
  50. C for indices IERR+1, IERR+2, ..., N. WR and WI are one-
  51. C dimensional REAL arrays, dimensioned WR(N) and WI(N).
  52. C
  53. C IERR is an INTEGER flag set to
  54. C Zero for normal return,
  55. C J if the J-th eigenvalue has not been
  56. C determined after a total of 30*N iterations.
  57. C The eigenvalues should be correct for indices
  58. C IERR+1, IERR+2, ..., N.
  59. C
  60. C Questions and comments should be directed to B. S. Garbow,
  61. C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
  62. C ------------------------------------------------------------------
  63. C
  64. C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
  65. C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
  66. C system Routines - EISPACK Guide, Springer-Verlag,
  67. C 1976.
  68. C***ROUTINES CALLED (NONE)
  69. C***REVISION HISTORY (YYMMDD)
  70. C 760101 DATE WRITTEN
  71. C 890531 Changed all specific intrinsics to generic. (WRB)
  72. C 890831 Modified array declarations. (WRB)
  73. C 890831 REVISION DATE from Version 3.2
  74. C 891214 Prologue converted to Version 4.0 format. (BAB)
  75. C 920501 Reformatted the REFERENCES section. (WRB)
  76. C***END PROLOGUE HQR
  77. C
  78. INTEGER I,J,K,L,M,N,EN,LL,MM,NA,NM,IGH,ITN,ITS,LOW,MP2,ENM2,IERR
  79. REAL H(NM,*),WR(*),WI(*)
  80. REAL P,Q,R,S,T,W,X,Y,ZZ,NORM,S1,S2
  81. LOGICAL NOTLAS
  82. C
  83. C***FIRST EXECUTABLE STATEMENT HQR
  84. IERR = 0
  85. NORM = 0.0E0
  86. K = 1
  87. C .......... STORE ROOTS ISOLATED BY BALANC
  88. C AND COMPUTE MATRIX NORM ..........
  89. DO 50 I = 1, N
  90. C
  91. DO 40 J = K, N
  92. 40 NORM = NORM + ABS(H(I,J))
  93. C
  94. K = I
  95. IF (I .GE. LOW .AND. I .LE. IGH) GO TO 50
  96. WR(I) = H(I,I)
  97. WI(I) = 0.0E0
  98. 50 CONTINUE
  99. C
  100. EN = IGH
  101. T = 0.0E0
  102. ITN = 30*N
  103. C .......... SEARCH FOR NEXT EIGENVALUES ..........
  104. 60 IF (EN .LT. LOW) GO TO 1001
  105. ITS = 0
  106. NA = EN - 1
  107. ENM2 = NA - 1
  108. C .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
  109. C FOR L=EN STEP -1 UNTIL LOW DO -- ..........
  110. 70 DO 80 LL = LOW, EN
  111. L = EN + LOW - LL
  112. IF (L .EQ. LOW) GO TO 100
  113. S = ABS(H(L-1,L-1)) + ABS(H(L,L))
  114. IF (S .EQ. 0.0E0) S = NORM
  115. S2 = S + ABS(H(L,L-1))
  116. IF (S2 .EQ. S) GO TO 100
  117. 80 CONTINUE
  118. C .......... FORM SHIFT ..........
  119. 100 X = H(EN,EN)
  120. IF (L .EQ. EN) GO TO 270
  121. Y = H(NA,NA)
  122. W = H(EN,NA) * H(NA,EN)
  123. IF (L .EQ. NA) GO TO 280
  124. IF (ITN .EQ. 0) GO TO 1000
  125. IF (ITS .NE. 10 .AND. ITS .NE. 20) GO TO 130
  126. C .......... FORM EXCEPTIONAL SHIFT ..........
  127. T = T + X
  128. C
  129. DO 120 I = LOW, EN
  130. 120 H(I,I) = H(I,I) - X
  131. C
  132. S = ABS(H(EN,NA)) + ABS(H(NA,ENM2))
  133. X = 0.75E0 * S
  134. Y = X
  135. W = -0.4375E0 * S * S
  136. 130 ITS = ITS + 1
  137. ITN = ITN - 1
  138. C .......... LOOK FOR TWO CONSECUTIVE SMALL
  139. C SUB-DIAGONAL ELEMENTS.
  140. C FOR M=EN-2 STEP -1 UNTIL L DO -- ..........
  141. DO 140 MM = L, ENM2
  142. M = ENM2 + L - MM
  143. ZZ = H(M,M)
  144. R = X - ZZ
  145. S = Y - ZZ
  146. P = (R * S - W) / H(M+1,M) + H(M,M+1)
  147. Q = H(M+1,M+1) - ZZ - R - S
  148. R = H(M+2,M+1)
  149. S = ABS(P) + ABS(Q) + ABS(R)
  150. P = P / S
  151. Q = Q / S
  152. R = R / S
  153. IF (M .EQ. L) GO TO 150
  154. S1 = ABS(P) * (ABS(H(M-1,M-1)) + ABS(ZZ) + ABS(H(M+1,M+1)))
  155. S2 = S1 + ABS(H(M,M-1)) * (ABS(Q) + ABS(R))
  156. IF (S2 .EQ. S1) GO TO 150
  157. 140 CONTINUE
  158. C
  159. 150 MP2 = M + 2
  160. C
  161. DO 160 I = MP2, EN
  162. H(I,I-2) = 0.0E0
  163. IF (I .EQ. MP2) GO TO 160
  164. H(I,I-3) = 0.0E0
  165. 160 CONTINUE
  166. C .......... DOUBLE QR STEP INVOLVING ROWS L TO EN AND
  167. C COLUMNS M TO EN ..........
  168. DO 260 K = M, NA
  169. NOTLAS = K .NE. NA
  170. IF (K .EQ. M) GO TO 170
  171. P = H(K,K-1)
  172. Q = H(K+1,K-1)
  173. R = 0.0E0
  174. IF (NOTLAS) R = H(K+2,K-1)
  175. X = ABS(P) + ABS(Q) + ABS(R)
  176. IF (X .EQ. 0.0E0) GO TO 260
  177. P = P / X
  178. Q = Q / X
  179. R = R / X
  180. 170 S = SIGN(SQRT(P*P+Q*Q+R*R),P)
  181. IF (K .EQ. M) GO TO 180
  182. H(K,K-1) = -S * X
  183. GO TO 190
  184. 180 IF (L .NE. M) H(K,K-1) = -H(K,K-1)
  185. 190 P = P + S
  186. X = P / S
  187. Y = Q / S
  188. ZZ = R / S
  189. Q = Q / P
  190. R = R / P
  191. C .......... ROW MODIFICATION ..........
  192. DO 210 J = K, EN
  193. P = H(K,J) + Q * H(K+1,J)
  194. IF (.NOT. NOTLAS) GO TO 200
  195. P = P + R * H(K+2,J)
  196. H(K+2,J) = H(K+2,J) - P * ZZ
  197. 200 H(K+1,J) = H(K+1,J) - P * Y
  198. H(K,J) = H(K,J) - P * X
  199. 210 CONTINUE
  200. C
  201. J = MIN(EN,K+3)
  202. C .......... COLUMN MODIFICATION ..........
  203. DO 230 I = L, J
  204. P = X * H(I,K) + Y * H(I,K+1)
  205. IF (.NOT. NOTLAS) GO TO 220
  206. P = P + ZZ * H(I,K+2)
  207. H(I,K+2) = H(I,K+2) - P * R
  208. 220 H(I,K+1) = H(I,K+1) - P * Q
  209. H(I,K) = H(I,K) - P
  210. 230 CONTINUE
  211. C
  212. 260 CONTINUE
  213. C
  214. GO TO 70
  215. C .......... ONE ROOT FOUND ..........
  216. 270 WR(EN) = X + T
  217. WI(EN) = 0.0E0
  218. EN = NA
  219. GO TO 60
  220. C .......... TWO ROOTS FOUND ..........
  221. 280 P = (Y - X) / 2.0E0
  222. Q = P * P + W
  223. ZZ = SQRT(ABS(Q))
  224. X = X + T
  225. IF (Q .LT. 0.0E0) GO TO 320
  226. C .......... REAL PAIR ..........
  227. ZZ = P + SIGN(ZZ,P)
  228. WR(NA) = X + ZZ
  229. WR(EN) = WR(NA)
  230. IF (ZZ .NE. 0.0E0) WR(EN) = X - W / ZZ
  231. WI(NA) = 0.0E0
  232. WI(EN) = 0.0E0
  233. GO TO 330
  234. C .......... COMPLEX PAIR ..........
  235. 320 WR(NA) = X + P
  236. WR(EN) = X + P
  237. WI(NA) = ZZ
  238. WI(EN) = -ZZ
  239. 330 EN = ENM2
  240. GO TO 60
  241. C .......... SET ERROR -- NO CONVERGENCE TO AN
  242. C EIGENVALUE AFTER 30*N ITERATIONS ..........
  243. 1000 IERR = EN
  244. 1001 RETURN
  245. END