comlr.f 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. *DECK COMLR
  2. SUBROUTINE COMLR (NM, N, LOW, IGH, HR, HI, WR, WI, IERR)
  3. C***BEGIN PROLOGUE COMLR
  4. C***PURPOSE Compute the eigenvalues of a complex upper Hessenberg
  5. C matrix using the modified LR method.
  6. C***LIBRARY SLATEC (EISPACK)
  7. C***CATEGORY D4C2B
  8. C***TYPE COMPLEX (COMLR-C)
  9. C***KEYWORDS EIGENVALUES, EISPACK, LR METHOD
  10. C***AUTHOR Smith, B. T., et al.
  11. C***DESCRIPTION
  12. C
  13. C This subroutine is a translation of the ALGOL procedure COMLR,
  14. C NUM. MATH. 12, 369-376(1968) by Martin and Wilkinson.
  15. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 396-403(1971).
  16. C
  17. C This subroutine finds the eigenvalues of a COMPLEX
  18. C UPPER Hessenberg matrix by the modified LR 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 parameters, HR and HI, as declared in the calling
  24. C program dimension statement. NM is an INTEGER variable.
  25. C
  26. C N is the order of the matrix H=(HR,HI). N is an INTEGER
  27. C variable. 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 CBAL. If CBAL has not been used,
  31. C set LOW=1 and IGH equal to the order of the matrix, N.
  32. C
  33. C HR and HI contain the real and imaginary parts, respectively,
  34. C of the complex upper Hessenberg matrix. Their lower
  35. C triangles below the subdiagonal contain the multipliers
  36. C which were used in the reduction by COMHES, if performed.
  37. C HR and HI are two-dimensional REAL arrays, dimensioned
  38. C HR(NM,N) and HI(NM,N).
  39. C
  40. C On OUTPUT
  41. C
  42. C The upper Hessenberg portions of HR and HI have been
  43. C destroyed. Therefore, they must be saved before calling
  44. C COMLR if subsequent calculation of eigenvectors is to
  45. C be performed.
  46. C
  47. C WR and WI contain the real and imaginary parts, respectively,
  48. C of the eigenvalues of the upper Hessenberg matrix. If an
  49. C error exit is made, the eigenvalues should be correct for
  50. C 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 Calls CSROOT for complex square root.
  61. C Calls CDIV for complex division.
  62. C
  63. C Questions and comments should be directed to B. S. Garbow,
  64. C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
  65. C ------------------------------------------------------------------
  66. C
  67. C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
  68. C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
  69. C system Routines - EISPACK Guide, Springer-Verlag,
  70. C 1976.
  71. C***ROUTINES CALLED CDIV, CSROOT
  72. C***REVISION HISTORY (YYMMDD)
  73. C 760101 DATE WRITTEN
  74. C 890831 Modified array declarations. (WRB)
  75. C 890831 REVISION DATE from Version 3.2
  76. C 891214 Prologue converted to Version 4.0 format. (BAB)
  77. C 920501 Reformatted the REFERENCES section. (WRB)
  78. C***END PROLOGUE COMLR
  79. C
  80. INTEGER I,J,L,M,N,EN,LL,MM,NM,IGH,IM1,ITN,ITS,LOW,MP1,ENM1,IERR
  81. REAL HR(NM,*),HI(NM,*),WR(*),WI(*)
  82. REAL SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,S1,S2
  83. C
  84. C***FIRST EXECUTABLE STATEMENT COMLR
  85. IERR = 0
  86. C .......... STORE ROOTS ISOLATED BY CBAL ..........
  87. DO 200 I = 1, N
  88. IF (I .GE. LOW .AND. I .LE. IGH) GO TO 200
  89. WR(I) = HR(I,I)
  90. WI(I) = HI(I,I)
  91. 200 CONTINUE
  92. C
  93. EN = IGH
  94. TR = 0.0E0
  95. TI = 0.0E0
  96. ITN = 30*N
  97. C .......... SEARCH FOR NEXT EIGENVALUE ..........
  98. 220 IF (EN .LT. LOW) GO TO 1001
  99. ITS = 0
  100. ENM1 = EN - 1
  101. C .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
  102. C FOR L=EN STEP -1 UNTIL LOW E0 -- ..........
  103. 240 DO 260 LL = LOW, EN
  104. L = EN + LOW - LL
  105. IF (L .EQ. LOW) GO TO 300
  106. S1 = ABS(HR(L-1,L-1)) + ABS(HI(L-1,L-1))
  107. 1 + ABS(HR(L,L)) + ABS(HI(L,L))
  108. S2 = S1 + ABS(HR(L,L-1)) + ABS(HI(L,L-1))
  109. IF (S2 .EQ. S1) GO TO 300
  110. 260 CONTINUE
  111. C .......... FORM SHIFT ..........
  112. 300 IF (L .EQ. EN) GO TO 660
  113. IF (ITN .EQ. 0) GO TO 1000
  114. IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320
  115. SR = HR(EN,EN)
  116. SI = HI(EN,EN)
  117. XR = HR(ENM1,EN) * HR(EN,ENM1) - HI(ENM1,EN) * HI(EN,ENM1)
  118. XI = HR(ENM1,EN) * HI(EN,ENM1) + HI(ENM1,EN) * HR(EN,ENM1)
  119. IF (XR .EQ. 0.0E0 .AND. XI .EQ. 0.0E0) GO TO 340
  120. YR = (HR(ENM1,ENM1) - SR) / 2.0E0
  121. YI = (HI(ENM1,ENM1) - SI) / 2.0E0
  122. CALL CSROOT(YR**2-YI**2+XR,2.0E0*YR*YI+XI,ZZR,ZZI)
  123. IF (YR * ZZR + YI * ZZI .GE. 0.0E0) GO TO 310
  124. ZZR = -ZZR
  125. ZZI = -ZZI
  126. 310 CALL CDIV(XR,XI,YR+ZZR,YI+ZZI,XR,XI)
  127. SR = SR - XR
  128. SI = SI - XI
  129. GO TO 340
  130. C .......... FORM EXCEPTIONAL SHIFT ..........
  131. 320 SR = ABS(HR(EN,ENM1)) + ABS(HR(ENM1,EN-2))
  132. SI = ABS(HI(EN,ENM1)) + ABS(HI(ENM1,EN-2))
  133. C
  134. 340 DO 360 I = LOW, EN
  135. HR(I,I) = HR(I,I) - SR
  136. HI(I,I) = HI(I,I) - SI
  137. 360 CONTINUE
  138. C
  139. TR = TR + SR
  140. TI = TI + SI
  141. ITS = ITS + 1
  142. ITN = ITN - 1
  143. C .......... LOOK FOR TWO CONSECUTIVE SMALL
  144. C SUB-DIAGONAL ELEMENTS ..........
  145. XR = ABS(HR(ENM1,ENM1)) + ABS(HI(ENM1,ENM1))
  146. YR = ABS(HR(EN,ENM1)) + ABS(HI(EN,ENM1))
  147. ZZR = ABS(HR(EN,EN)) + ABS(HI(EN,EN))
  148. C .......... FOR M=EN-1 STEP -1 UNTIL L DO -- ..........
  149. DO 380 MM = L, ENM1
  150. M = ENM1 + L - MM
  151. IF (M .EQ. L) GO TO 420
  152. YI = YR
  153. YR = ABS(HR(M,M-1)) + ABS(HI(M,M-1))
  154. XI = ZZR
  155. ZZR = XR
  156. XR = ABS(HR(M-1,M-1)) + ABS(HI(M-1,M-1))
  157. S1 = ZZR / YI * (ZZR + XR + XI)
  158. S2 = S1 + YR
  159. IF (S2 .EQ. S1) GO TO 420
  160. 380 CONTINUE
  161. C .......... TRIANGULAR DECOMPOSITION H=L*R ..........
  162. 420 MP1 = M + 1
  163. C
  164. DO 520 I = MP1, EN
  165. IM1 = I - 1
  166. XR = HR(IM1,IM1)
  167. XI = HI(IM1,IM1)
  168. YR = HR(I,IM1)
  169. YI = HI(I,IM1)
  170. IF (ABS(XR) + ABS(XI) .GE. ABS(YR) + ABS(YI)) GO TO 460
  171. C .......... INTERCHANGE ROWS OF HR AND HI ..........
  172. DO 440 J = IM1, EN
  173. ZZR = HR(IM1,J)
  174. HR(IM1,J) = HR(I,J)
  175. HR(I,J) = ZZR
  176. ZZI = HI(IM1,J)
  177. HI(IM1,J) = HI(I,J)
  178. HI(I,J) = ZZI
  179. 440 CONTINUE
  180. C
  181. CALL CDIV(XR,XI,YR,YI,ZZR,ZZI)
  182. WR(I) = 1.0E0
  183. GO TO 480
  184. 460 CALL CDIV(YR,YI,XR,XI,ZZR,ZZI)
  185. WR(I) = -1.0E0
  186. 480 HR(I,IM1) = ZZR
  187. HI(I,IM1) = ZZI
  188. C
  189. DO 500 J = I, EN
  190. HR(I,J) = HR(I,J) - ZZR * HR(IM1,J) + ZZI * HI(IM1,J)
  191. HI(I,J) = HI(I,J) - ZZR * HI(IM1,J) - ZZI * HR(IM1,J)
  192. 500 CONTINUE
  193. C
  194. 520 CONTINUE
  195. C .......... COMPOSITION R*L=H ..........
  196. DO 640 J = MP1, EN
  197. XR = HR(J,J-1)
  198. XI = HI(J,J-1)
  199. HR(J,J-1) = 0.0E0
  200. HI(J,J-1) = 0.0E0
  201. C .......... INTERCHANGE COLUMNS OF HR AND HI,
  202. C IF NECESSARY ..........
  203. IF (WR(J) .LE. 0.0E0) GO TO 580
  204. C
  205. DO 540 I = L, J
  206. ZZR = HR(I,J-1)
  207. HR(I,J-1) = HR(I,J)
  208. HR(I,J) = ZZR
  209. ZZI = HI(I,J-1)
  210. HI(I,J-1) = HI(I,J)
  211. HI(I,J) = ZZI
  212. 540 CONTINUE
  213. C
  214. 580 DO 600 I = L, J
  215. HR(I,J-1) = HR(I,J-1) + XR * HR(I,J) - XI * HI(I,J)
  216. HI(I,J-1) = HI(I,J-1) + XR * HI(I,J) + XI * HR(I,J)
  217. 600 CONTINUE
  218. C
  219. 640 CONTINUE
  220. C
  221. GO TO 240
  222. C .......... A ROOT FOUND ..........
  223. 660 WR(EN) = HR(EN,EN) + TR
  224. WI(EN) = HI(EN,EN) + TI
  225. EN = ENM1
  226. GO TO 220
  227. C .......... SET ERROR -- NO CONVERGENCE TO AN
  228. C EIGENVALUE AFTER 30*N ITERATIONS ..........
  229. 1000 IERR = EN
  230. 1001 RETURN
  231. END