comqr2.f 14 KB

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