comqr.f 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. *DECK COMQR
  2. SUBROUTINE COMQR (NM, N, LOW, IGH, HR, HI, WR, WI, IERR)
  3. C***BEGIN PROLOGUE COMQR
  4. C***PURPOSE Compute the eigenvalues of complex upper Hessenberg matrix
  5. C using the QR method.
  6. C***LIBRARY SLATEC (EISPACK)
  7. C***CATEGORY D4C2B
  8. C***TYPE COMPLEX (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 a unitary analogue of the
  14. C ALGOL procedure COMLR, NUM. MATH. 12, 369-376(1968) by Martin
  15. C and Wilkinson.
  16. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 396-403(1971).
  17. C The unitary analogue substitutes the QR algorithm of Francis
  18. C (COMP. JOUR. 4, 332-345(1962)) for the LR algorithm.
  19. C
  20. C This subroutine finds the eigenvalues of a COMPLEX
  21. C upper Hessenberg matrix by the QR method.
  22. C
  23. C On INPUT
  24. C
  25. C NM must be set to the row dimension of the two-dimensional
  26. C array parameters, HR and HI, as declared in the calling
  27. C program dimension statement. NM is an INTEGER variable.
  28. C
  29. C N is the order of the matrix H=(HR,HI). N is an INTEGER
  30. C variable. N must be less than or equal to NM.
  31. C
  32. C LOW and IGH are two INTEGER variables determined by the
  33. C balancing subroutine CBAL. If CBAL has not been used,
  34. C set LOW=1 and IGH equal to the order of the matrix, N.
  35. C
  36. C HR and HI contain the real and imaginary parts, respectively,
  37. C of the complex upper Hessenberg matrix. Their lower
  38. C triangles below the subdiagonal contain information about
  39. C the unitary transformations used in the reduction by CORTH,
  40. C if performed. HR and HI are two-dimensional REAL arrays,
  41. C dimensioned HR(NM,N) and HI(NM,N).
  42. C
  43. C On OUTPUT
  44. C
  45. C The upper Hessenberg portions of HR and HI have been
  46. C destroyed. Therefore, they must be saved before calling
  47. C COMQR if subsequent calculation of eigenvectors is to
  48. C be performed.
  49. C
  50. C WR and WI contain the real and imaginary parts, respectively,
  51. C of the eigenvalues of the upper Hessenberg matrix. If an
  52. C error exit is made, the eigenvalues should be correct for
  53. C indices IERR+1, IERR+2, ..., N. WR and WI are one-
  54. C dimensional REAL arrays, dimensioned WR(N) and WI(N).
  55. C
  56. C IERR is an INTEGER flag set to
  57. C Zero for normal return,
  58. C J if the J-th eigenvalue has not been
  59. C determined after a total of 30*N iterations.
  60. C The eigenvalues should be correct for indices
  61. C IERR+1, IERR+2, ..., N.
  62. C
  63. C Calls CSROOT for complex square root.
  64. C Calls PYTHAG(A,B) for sqrt(A**2 + B**2).
  65. C Calls CDIV for complex division.
  66. C
  67. C Questions and comments should be directed to B. S. Garbow,
  68. C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
  69. C ------------------------------------------------------------------
  70. C
  71. C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
  72. C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
  73. C system Routines - EISPACK Guide, Springer-Verlag,
  74. C 1976.
  75. C***ROUTINES CALLED CDIV, CSROOT, PYTHAG
  76. C***REVISION HISTORY (YYMMDD)
  77. C 760101 DATE WRITTEN
  78. C 890531 Changed all specific intrinsics to generic. (WRB)
  79. C 890831 Modified array declarations. (WRB)
  80. C 890831 REVISION DATE from Version 3.2
  81. C 891214 Prologue converted to Version 4.0 format. (BAB)
  82. C 920501 Reformatted the REFERENCES section. (WRB)
  83. C***END PROLOGUE COMQR
  84. C
  85. INTEGER I,J,L,N,EN,LL,NM,IGH,ITN,ITS,LOW,LP1,ENM1,IERR
  86. REAL HR(NM,*),HI(NM,*),WR(*),WI(*)
  87. REAL SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,NORM,S1,S2
  88. REAL PYTHAG
  89. C
  90. C***FIRST EXECUTABLE STATEMENT COMQR
  91. IERR = 0
  92. IF (LOW .EQ. IGH) GO TO 180
  93. C .......... CREATE REAL SUBDIAGONAL ELEMENTS ..........
  94. L = LOW + 1
  95. C
  96. DO 170 I = L, IGH
  97. LL = MIN(I+1,IGH)
  98. IF (HI(I,I-1) .EQ. 0.0E0) GO TO 170
  99. NORM = PYTHAG(HR(I,I-1),HI(I,I-1))
  100. YR = HR(I,I-1) / NORM
  101. YI = HI(I,I-1) / NORM
  102. HR(I,I-1) = NORM
  103. HI(I,I-1) = 0.0E0
  104. C
  105. DO 155 J = I, IGH
  106. SI = YR * HI(I,J) - YI * HR(I,J)
  107. HR(I,J) = YR * HR(I,J) + YI * HI(I,J)
  108. HI(I,J) = SI
  109. 155 CONTINUE
  110. C
  111. DO 160 J = LOW, LL
  112. SI = YR * HI(J,I) + YI * HR(J,I)
  113. HR(J,I) = YR * HR(J,I) - YI * HI(J,I)
  114. HI(J,I) = SI
  115. 160 CONTINUE
  116. C
  117. 170 CONTINUE
  118. C .......... STORE ROOTS ISOLATED BY CBAL ..........
  119. 180 DO 200 I = 1, N
  120. IF (I .GE. LOW .AND. I .LE. IGH) GO TO 200
  121. WR(I) = HR(I,I)
  122. WI(I) = HI(I,I)
  123. 200 CONTINUE
  124. C
  125. EN = IGH
  126. TR = 0.0E0
  127. TI = 0.0E0
  128. ITN = 30*N
  129. C .......... SEARCH FOR NEXT EIGENVALUE ..........
  130. 220 IF (EN .LT. LOW) GO TO 1001
  131. ITS = 0
  132. ENM1 = EN - 1
  133. C .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
  134. C FOR L=EN STEP -1 UNTIL LOW E0 -- ..........
  135. 240 DO 260 LL = LOW, EN
  136. L = EN + LOW - LL
  137. IF (L .EQ. LOW) GO TO 300
  138. S1 = ABS(HR(L-1,L-1)) + ABS(HI(L-1,L-1))
  139. 1 + ABS(HR(L,L)) +ABS(HI(L,L))
  140. S2 = S1 + ABS(HR(L,L-1))
  141. IF (S2 .EQ. S1) GO TO 300
  142. 260 CONTINUE
  143. C .......... FORM SHIFT ..........
  144. 300 IF (L .EQ. EN) GO TO 660
  145. IF (ITN .EQ. 0) GO TO 1000
  146. IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320
  147. SR = HR(EN,EN)
  148. SI = HI(EN,EN)
  149. XR = HR(ENM1,EN) * HR(EN,ENM1)
  150. XI = HI(ENM1,EN) * HR(EN,ENM1)
  151. IF (XR .EQ. 0.0E0 .AND. XI .EQ. 0.0E0) GO TO 340
  152. YR = (HR(ENM1,ENM1) - SR) / 2.0E0
  153. YI = (HI(ENM1,ENM1) - SI) / 2.0E0
  154. CALL CSROOT(YR**2-YI**2+XR,2.0E0*YR*YI+XI,ZZR,ZZI)
  155. IF (YR * ZZR + YI * ZZI .GE. 0.0E0) GO TO 310
  156. ZZR = -ZZR
  157. ZZI = -ZZI
  158. 310 CALL CDIV(XR,XI,YR+ZZR,YI+ZZI,XR,XI)
  159. SR = SR - XR
  160. SI = SI - XI
  161. GO TO 340
  162. C .......... FORM EXCEPTIONAL SHIFT ..........
  163. 320 SR = ABS(HR(EN,ENM1)) + ABS(HR(ENM1,EN-2))
  164. SI = 0.0E0
  165. C
  166. 340 DO 360 I = LOW, EN
  167. HR(I,I) = HR(I,I) - SR
  168. HI(I,I) = HI(I,I) - SI
  169. 360 CONTINUE
  170. C
  171. TR = TR + SR
  172. TI = TI + SI
  173. ITS = ITS + 1
  174. ITN = ITN - 1
  175. C .......... REDUCE TO TRIANGLE (ROWS) ..........
  176. LP1 = L + 1
  177. C
  178. DO 500 I = LP1, EN
  179. SR = HR(I,I-1)
  180. HR(I,I-1) = 0.0E0
  181. NORM = PYTHAG(PYTHAG(HR(I-1,I-1),HI(I-1,I-1)),SR)
  182. XR = HR(I-1,I-1) / NORM
  183. WR(I-1) = XR
  184. XI = HI(I-1,I-1) / NORM
  185. WI(I-1) = XI
  186. HR(I-1,I-1) = NORM
  187. HI(I-1,I-1) = 0.0E0
  188. HI(I,I-1) = SR / NORM
  189. C
  190. DO 490 J = I, EN
  191. YR = HR(I-1,J)
  192. YI = HI(I-1,J)
  193. ZZR = HR(I,J)
  194. ZZI = HI(I,J)
  195. HR(I-1,J) = XR * YR + XI * YI + HI(I,I-1) * ZZR
  196. HI(I-1,J) = XR * YI - XI * YR + HI(I,I-1) * ZZI
  197. HR(I,J) = XR * ZZR - XI * ZZI - HI(I,I-1) * YR
  198. HI(I,J) = XR * ZZI + XI * ZZR - HI(I,I-1) * YI
  199. 490 CONTINUE
  200. C
  201. 500 CONTINUE
  202. C
  203. SI = HI(EN,EN)
  204. IF (SI .EQ. 0.0E0) GO TO 540
  205. NORM = PYTHAG(HR(EN,EN),SI)
  206. SR = HR(EN,EN) / NORM
  207. SI = SI / NORM
  208. HR(EN,EN) = NORM
  209. HI(EN,EN) = 0.0E0
  210. C .......... INVERSE OPERATION (COLUMNS) ..........
  211. 540 DO 600 J = LP1, EN
  212. XR = WR(J-1)
  213. XI = WI(J-1)
  214. C
  215. DO 580 I = L, J
  216. YR = HR(I,J-1)
  217. YI = 0.0E0
  218. ZZR = HR(I,J)
  219. ZZI = HI(I,J)
  220. IF (I .EQ. J) GO TO 560
  221. YI = HI(I,J-1)
  222. HI(I,J-1) = XR * YI + XI * YR + HI(J,J-1) * ZZI
  223. 560 HR(I,J-1) = XR * YR - XI * YI + HI(J,J-1) * ZZR
  224. HR(I,J) = XR * ZZR + XI * ZZI - HI(J,J-1) * YR
  225. HI(I,J) = XR * ZZI - XI * ZZR - HI(J,J-1) * YI
  226. 580 CONTINUE
  227. C
  228. 600 CONTINUE
  229. C
  230. IF (SI .EQ. 0.0E0) GO TO 240
  231. C
  232. DO 630 I = L, EN
  233. YR = HR(I,EN)
  234. YI = HI(I,EN)
  235. HR(I,EN) = SR * YR - SI * YI
  236. HI(I,EN) = SR * YI + SI * YR
  237. 630 CONTINUE
  238. C
  239. GO TO 240
  240. C .......... A ROOT FOUND ..........
  241. 660 WR(EN) = HR(EN,EN) + TR
  242. WI(EN) = HI(EN,EN) + TI
  243. EN = ENM1
  244. GO TO 220
  245. C .......... SET ERROR -- NO CONVERGENCE TO AN
  246. C EIGENVALUE AFTER 30*N ITERATIONS ..........
  247. 1000 IERR = EN
  248. 1001 RETURN
  249. END