comlr2.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. *DECK COMLR2
  2. SUBROUTINE COMLR2 (NM, N, LOW, IGH, INT, HR, HI, WR, WI, ZR, ZI,
  3. + IERR)
  4. C***BEGIN PROLOGUE COMLR2
  5. C***PURPOSE Compute the eigenvalues and eigenvectors of a complex upper
  6. C Hessenberg matrix using the modified LR method.
  7. C***LIBRARY SLATEC (EISPACK)
  8. C***CATEGORY D4C2B
  9. C***TYPE COMPLEX (COMLR2-C)
  10. C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK, LR METHOD
  11. C***AUTHOR Smith, B. T., et al.
  12. C***DESCRIPTION
  13. C
  14. C This subroutine is a translation of the ALGOL procedure COMLR2,
  15. C NUM. MATH. 16, 181-204(1970) by Peters and Wilkinson.
  16. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971).
  17. C
  18. C This subroutine finds the eigenvalues and eigenvectors
  19. C of a COMPLEX UPPER Hessenberg matrix by the modified LR
  20. C method. The eigenvectors of a COMPLEX GENERAL matrix
  21. C can also be found if COMHES has been used to reduce
  22. C this general matrix to Hessenberg form.
  23. C
  24. C On INPUT
  25. C
  26. C NM must be set to the row dimension of the two-dimensional
  27. C array parameters, HR, HI, ZR and ZI, as declared in the
  28. C calling program dimension statement. NM is an INTEGER
  29. C variable.
  30. C
  31. C N is the order of the matrix H=(HR,HI). N is an INTEGER
  32. C variable. N must be less than or equal to NM.
  33. C
  34. C LOW and IGH are two INTEGER variables determined by the
  35. C balancing subroutine CBAL. If CBAL has not been used,
  36. C set LOW=1 and IGH equal to the order of the matrix, N.
  37. C
  38. C INT contains information on the rows and columns
  39. C interchanged in the reduction by COMHES, if performed.
  40. C Only elements LOW through IGH are used. If you want the
  41. C eigenvectors of a complex general matrix, leave INT as it
  42. C came from COMHES. If the eigenvectors of the Hessenberg
  43. C matrix are desired, set INT(J)=J for these elements. INT
  44. C is a one-dimensional INTEGER array, dimensioned INT(IGH).
  45. C
  46. C HR and HI contain the real and imaginary parts, respectively,
  47. C of the complex upper Hessenberg matrix. Their lower
  48. C triangles below the subdiagonal contain the multipliers
  49. C which were used in the reduction by COMHES, if performed.
  50. C If the eigenvectors of a complex general matrix are
  51. C desired, leave these multipliers in the lower triangles.
  52. C If the eigenvectors of the Hessenberg matrix are desired,
  53. C these elements must be set to zero. HR and HI are
  54. C two-dimensional REAL arrays, dimensioned HR(NM,N) and
  55. C HI(NM,N).
  56. C
  57. C On OUTPUT
  58. C
  59. C The upper Hessenberg portions of HR and HI have been
  60. C destroyed, but the location HR(1,1) contains the norm
  61. C of the triangularized matrix.
  62. C
  63. C WR and WI contain the real and imaginary parts, respectively,
  64. C of the eigenvalues of the upper Hessenberg matrix. If an
  65. C error exit is made, the eigenvalues should be correct for
  66. C indices IERR+1, IERR+2, ..., N. WR and WI are one-
  67. C dimensional REAL arrays, dimensioned WR(N) and WI(N).
  68. C
  69. C ZR and ZI contain the real and imaginary parts, respectively,
  70. C of the eigenvectors. The eigenvectors are unnormalized.
  71. C If an error exit is made, none of the eigenvectors has been
  72. C found. ZR and ZI are two-dimensional REAL arrays,
  73. C dimensioned ZR(NM,N) and ZI(NM,N).
  74. C
  75. C IERR is an INTEGER flag set to
  76. C Zero for normal return,
  77. C J if the J-th eigenvalue has not been
  78. C determined after a total of 30*N iterations.
  79. C The eigenvalues should be correct for indices
  80. C IERR+1, IERR+2, ..., N, but no eigenvectors are
  81. C computed.
  82. C
  83. C Calls CSROOT for complex square root.
  84. C Calls CDIV for complex division.
  85. C
  86. C Questions and comments should be directed to B. S. Garbow,
  87. C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
  88. C ------------------------------------------------------------------
  89. C
  90. C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
  91. C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
  92. C system Routines - EISPACK Guide, Springer-Verlag,
  93. C 1976.
  94. C***ROUTINES CALLED CDIV, CSROOT
  95. C***REVISION HISTORY (YYMMDD)
  96. C 760101 DATE WRITTEN
  97. C 890531 Changed all specific intrinsics to generic. (WRB)
  98. C 890831 Modified array declarations. (WRB)
  99. C 890831 REVISION DATE from Version 3.2
  100. C 891214 Prologue converted to Version 4.0 format. (BAB)
  101. C 920501 Reformatted the REFERENCES section. (WRB)
  102. C***END PROLOGUE COMLR2
  103. C
  104. INTEGER I,J,K,L,M,N,EN,II,JJ,LL,MM,NM,NN,IGH,IM1,IP1
  105. INTEGER ITN,ITS,LOW,MP1,ENM1,IEND,IERR
  106. REAL HR(NM,*),HI(NM,*),WR(*),WI(*),ZR(NM,*),ZI(NM,*)
  107. REAL SI,SR,TI,TR,XI,XR,YI,YR,ZZI,ZZR,NORM,S1,S2
  108. INTEGER INT(*)
  109. C
  110. C***FIRST EXECUTABLE STATEMENT COMLR2
  111. IERR = 0
  112. C .......... INITIALIZE EIGENVECTOR MATRIX ..........
  113. DO 100 I = 1, N
  114. C
  115. DO 100 J = 1, N
  116. ZR(I,J) = 0.0E0
  117. ZI(I,J) = 0.0E0
  118. IF (I .EQ. J) ZR(I,J) = 1.0E0
  119. 100 CONTINUE
  120. C .......... FORM THE MATRIX OF ACCUMULATED TRANSFORMATIONS
  121. C FROM THE INFORMATION LEFT BY COMHES ..........
  122. IEND = IGH - LOW - 1
  123. IF (IEND .LE. 0) GO TO 180
  124. C .......... FOR I=IGH-1 STEP -1 UNTIL LOW+1 DO -- ..........
  125. DO 160 II = 1, IEND
  126. I = IGH - II
  127. IP1 = I + 1
  128. C
  129. DO 120 K = IP1, IGH
  130. ZR(K,I) = HR(K,I-1)
  131. ZI(K,I) = HI(K,I-1)
  132. 120 CONTINUE
  133. C
  134. J = INT(I)
  135. IF (I .EQ. J) GO TO 160
  136. C
  137. DO 140 K = I, IGH
  138. ZR(I,K) = ZR(J,K)
  139. ZI(I,K) = ZI(J,K)
  140. ZR(J,K) = 0.0E0
  141. ZI(J,K) = 0.0E0
  142. 140 CONTINUE
  143. C
  144. ZR(J,I) = 1.0E0
  145. 160 CONTINUE
  146. C .......... STORE ROOTS ISOLATED BY CBAL ..........
  147. 180 DO 200 I = 1, N
  148. IF (I .GE. LOW .AND. I .LE. IGH) GO TO 200
  149. WR(I) = HR(I,I)
  150. WI(I) = HI(I,I)
  151. 200 CONTINUE
  152. C
  153. EN = IGH
  154. TR = 0.0E0
  155. TI = 0.0E0
  156. ITN = 30*N
  157. C .......... SEARCH FOR NEXT EIGENVALUE ..........
  158. 220 IF (EN .LT. LOW) GO TO 680
  159. ITS = 0
  160. ENM1 = EN - 1
  161. C .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT
  162. C FOR L=EN STEP -1 UNTIL LOW DO -- ..........
  163. 240 DO 260 LL = LOW, EN
  164. L = EN + LOW - LL
  165. IF (L .EQ. LOW) GO TO 300
  166. S1 = ABS(HR(L-1,L-1)) + ABS(HI(L-1,L-1))
  167. 1 + ABS(HR(L,L)) + ABS(HI(L,L))
  168. S2 = S1 + ABS(HR(L,L-1)) + ABS(HI(L,L-1))
  169. IF (S2 .EQ. S1) GO TO 300
  170. 260 CONTINUE
  171. C .......... FORM SHIFT ..........
  172. 300 IF (L .EQ. EN) GO TO 660
  173. IF (ITN .EQ. 0) GO TO 1000
  174. IF (ITS .EQ. 10 .OR. ITS .EQ. 20) GO TO 320
  175. SR = HR(EN,EN)
  176. SI = HI(EN,EN)
  177. XR = HR(ENM1,EN) * HR(EN,ENM1) - HI(ENM1,EN) * HI(EN,ENM1)
  178. XI = HR(ENM1,EN) * HI(EN,ENM1) + HI(ENM1,EN) * HR(EN,ENM1)
  179. IF (XR .EQ. 0.0E0 .AND. XI .EQ. 0.0E0) GO TO 340
  180. YR = (HR(ENM1,ENM1) - SR) / 2.0E0
  181. YI = (HI(ENM1,ENM1) - SI) / 2.0E0
  182. CALL CSROOT(YR**2-YI**2+XR,2.0E0*YR*YI+XI,ZZR,ZZI)
  183. IF (YR * ZZR + YI * ZZI .GE. 0.0E0) GO TO 310
  184. ZZR = -ZZR
  185. ZZI = -ZZI
  186. 310 CALL CDIV(XR,XI,YR+ZZR,YI+ZZI,XR,XI)
  187. SR = SR - XR
  188. SI = SI - XI
  189. GO TO 340
  190. C .......... FORM EXCEPTIONAL SHIFT ..........
  191. 320 SR = ABS(HR(EN,ENM1)) + ABS(HR(ENM1,EN-2))
  192. SI = ABS(HI(EN,ENM1)) + ABS(HI(ENM1,EN-2))
  193. C
  194. 340 DO 360 I = LOW, EN
  195. HR(I,I) = HR(I,I) - SR
  196. HI(I,I) = HI(I,I) - SI
  197. 360 CONTINUE
  198. C
  199. TR = TR + SR
  200. TI = TI + SI
  201. ITS = ITS + 1
  202. ITN = ITN - 1
  203. C .......... LOOK FOR TWO CONSECUTIVE SMALL
  204. C SUB-DIAGONAL ELEMENTS ..........
  205. XR = ABS(HR(ENM1,ENM1)) + ABS(HI(ENM1,ENM1))
  206. YR = ABS(HR(EN,ENM1)) + ABS(HI(EN,ENM1))
  207. ZZR = ABS(HR(EN,EN)) + ABS(HI(EN,EN))
  208. C .......... FOR M=EN-1 STEP -1 UNTIL L DO -- ..........
  209. DO 380 MM = L, ENM1
  210. M = ENM1 + L - MM
  211. IF (M .EQ. L) GO TO 420
  212. YI = YR
  213. YR = ABS(HR(M,M-1)) + ABS(HI(M,M-1))
  214. XI = ZZR
  215. ZZR = XR
  216. XR = ABS(HR(M-1,M-1)) + ABS(HI(M-1,M-1))
  217. S1 = ZZR / YI * (ZZR + XR + XI)
  218. S2 = S1 + YR
  219. IF (S2 .EQ. S1) GO TO 420
  220. 380 CONTINUE
  221. C .......... TRIANGULAR DECOMPOSITION H=L*R ..........
  222. 420 MP1 = M + 1
  223. C
  224. DO 520 I = MP1, EN
  225. IM1 = I - 1
  226. XR = HR(IM1,IM1)
  227. XI = HI(IM1,IM1)
  228. YR = HR(I,IM1)
  229. YI = HI(I,IM1)
  230. IF (ABS(XR) + ABS(XI) .GE. ABS(YR) + ABS(YI)) GO TO 460
  231. C .......... INTERCHANGE ROWS OF HR AND HI ..........
  232. DO 440 J = IM1, N
  233. ZZR = HR(IM1,J)
  234. HR(IM1,J) = HR(I,J)
  235. HR(I,J) = ZZR
  236. ZZI = HI(IM1,J)
  237. HI(IM1,J) = HI(I,J)
  238. HI(I,J) = ZZI
  239. 440 CONTINUE
  240. C
  241. CALL CDIV(XR,XI,YR,YI,ZZR,ZZI)
  242. WR(I) = 1.0E0
  243. GO TO 480
  244. 460 CALL CDIV(YR,YI,XR,XI,ZZR,ZZI)
  245. WR(I) = -1.0E0
  246. 480 HR(I,IM1) = ZZR
  247. HI(I,IM1) = ZZI
  248. C
  249. DO 500 J = I, N
  250. HR(I,J) = HR(I,J) - ZZR * HR(IM1,J) + ZZI * HI(IM1,J)
  251. HI(I,J) = HI(I,J) - ZZR * HI(IM1,J) - ZZI * HR(IM1,J)
  252. 500 CONTINUE
  253. C
  254. 520 CONTINUE
  255. C .......... COMPOSITION R*L=H ..........
  256. DO 640 J = MP1, EN
  257. XR = HR(J,J-1)
  258. XI = HI(J,J-1)
  259. HR(J,J-1) = 0.0E0
  260. HI(J,J-1) = 0.0E0
  261. C .......... INTERCHANGE COLUMNS OF HR, HI, ZR, AND ZI,
  262. C IF NECESSARY ..........
  263. IF (WR(J) .LE. 0.0E0) GO TO 580
  264. C
  265. DO 540 I = 1, J
  266. ZZR = HR(I,J-1)
  267. HR(I,J-1) = HR(I,J)
  268. HR(I,J) = ZZR
  269. ZZI = HI(I,J-1)
  270. HI(I,J-1) = HI(I,J)
  271. HI(I,J) = ZZI
  272. 540 CONTINUE
  273. C
  274. DO 560 I = LOW, IGH
  275. ZZR = ZR(I,J-1)
  276. ZR(I,J-1) = ZR(I,J)
  277. ZR(I,J) = ZZR
  278. ZZI = ZI(I,J-1)
  279. ZI(I,J-1) = ZI(I,J)
  280. ZI(I,J) = ZZI
  281. 560 CONTINUE
  282. C
  283. 580 DO 600 I = 1, J
  284. HR(I,J-1) = HR(I,J-1) + XR * HR(I,J) - XI * HI(I,J)
  285. HI(I,J-1) = HI(I,J-1) + XR * HI(I,J) + XI * HR(I,J)
  286. 600 CONTINUE
  287. C .......... ACCUMULATE TRANSFORMATIONS ..........
  288. DO 620 I = LOW, IGH
  289. ZR(I,J-1) = ZR(I,J-1) + XR * ZR(I,J) - XI * ZI(I,J)
  290. ZI(I,J-1) = ZI(I,J-1) + XR * ZI(I,J) + XI * ZR(I,J)
  291. 620 CONTINUE
  292. C
  293. 640 CONTINUE
  294. C
  295. GO TO 240
  296. C .......... A ROOT FOUND ..........
  297. 660 HR(EN,EN) = HR(EN,EN) + TR
  298. WR(EN) = HR(EN,EN)
  299. HI(EN,EN) = HI(EN,EN) + TI
  300. WI(EN) = HI(EN,EN)
  301. EN = ENM1
  302. GO TO 220
  303. C .......... ALL ROOTS FOUND. BACKSUBSTITUTE TO FIND
  304. C VECTORS OF UPPER TRIANGULAR FORM ..........
  305. 680 NORM = 0.0E0
  306. C
  307. DO 720 I = 1, N
  308. C
  309. DO 720 J = I, N
  310. NORM = NORM + ABS(HR(I,J)) + ABS(HI(I,J))
  311. 720 CONTINUE
  312. C
  313. HR(1,1) = NORM
  314. IF (N .EQ. 1 .OR. NORM .EQ. 0.0E0) GO TO 1001
  315. C .......... FOR EN=N STEP -1 UNTIL 2 DO -- ..........
  316. DO 800 NN = 2, N
  317. EN = N + 2 - NN
  318. XR = WR(EN)
  319. XI = WI(EN)
  320. ENM1 = EN - 1
  321. C .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- ..........
  322. DO 780 II = 1, ENM1
  323. I = EN - II
  324. ZZR = HR(I,EN)
  325. ZZI = HI(I,EN)
  326. IF (I .EQ. ENM1) GO TO 760
  327. IP1 = I + 1
  328. C
  329. DO 740 J = IP1, ENM1
  330. ZZR = ZZR + HR(I,J) * HR(J,EN) - HI(I,J) * HI(J,EN)
  331. ZZI = ZZI + HR(I,J) * HI(J,EN) + HI(I,J) * HR(J,EN)
  332. 740 CONTINUE
  333. C
  334. 760 YR = XR - WR(I)
  335. YI = XI - WI(I)
  336. IF (YR .NE. 0.0E0 .OR. YI .NE. 0.0E0) GO TO 775
  337. YR = NORM
  338. 770 YR = 0.5E0*YR
  339. IF (NORM + YR .GT. NORM) GO TO 770
  340. YR = 2.0E0*YR
  341. 775 CALL CDIV(ZZR,ZZI,YR,YI,HR(I,EN),HI(I,EN))
  342. 780 CONTINUE
  343. C
  344. 800 CONTINUE
  345. C .......... END BACKSUBSTITUTION ..........
  346. ENM1 = N - 1
  347. C .......... VECTORS OF ISOLATED ROOTS ..........
  348. DO 840 I = 1, ENM1
  349. IF (I .GE. LOW .AND. I .LE. IGH) GO TO 840
  350. IP1 = I + 1
  351. C
  352. DO 820 J = IP1, N
  353. ZR(I,J) = HR(I,J)
  354. ZI(I,J) = HI(I,J)
  355. 820 CONTINUE
  356. C
  357. 840 CONTINUE
  358. C .......... MULTIPLY BY TRANSFORMATION MATRIX TO GIVE
  359. C VECTORS OF ORIGINAL FULL MATRIX.
  360. C FOR J=N STEP -1 UNTIL LOW+1 DO -- ..........
  361. DO 880 JJ = LOW, ENM1
  362. J = N + LOW - JJ
  363. M = MIN(J-1,IGH)
  364. C
  365. DO 880 I = LOW, IGH
  366. ZZR = ZR(I,J)
  367. ZZI = ZI(I,J)
  368. C
  369. DO 860 K = LOW, M
  370. ZZR = ZZR + ZR(I,K) * HR(K,J) - ZI(I,K) * HI(K,J)
  371. ZZI = ZZI + ZR(I,K) * HI(K,J) + ZI(I,K) * HR(K,J)
  372. 860 CONTINUE
  373. C
  374. ZR(I,J) = ZZR
  375. ZI(I,J) = ZZI
  376. 880 CONTINUE
  377. C
  378. GO TO 1001
  379. C .......... SET ERROR -- NO CONVERGENCE TO AN
  380. C EIGENVALUE AFTER 30*N ITERATIONS ..........
  381. 1000 IERR = EN
  382. 1001 RETURN
  383. END