htrid3.f 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. *DECK HTRID3
  2. SUBROUTINE HTRID3 (NM, N, A, D, E, E2, TAU)
  3. C***BEGIN PROLOGUE HTRID3
  4. C***PURPOSE Reduce a complex Hermitian (packed) matrix to a real
  5. C symmetric tridiagonal matrix by unitary similarity
  6. C transformations.
  7. C***LIBRARY SLATEC (EISPACK)
  8. C***CATEGORY D4C1B1
  9. C***TYPE SINGLE PRECISION (HTRID3-S)
  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 complex analogue of
  15. C the ALGOL procedure TRED3, NUM. MATH. 11, 181-195(1968)
  16. C by Martin, Reinsch, and Wilkinson.
  17. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
  18. C
  19. C This subroutine reduces a COMPLEX HERMITIAN matrix, stored as
  20. C a single square array, to a real symmetric tridiagonal matrix
  21. C using unitary similarity transformations.
  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 parameter, A, as declared in the calling program
  27. C dimension statement. NM is an INTEGER variable.
  28. C
  29. C N is the order of the matrix. N is an INTEGER variable.
  30. C N must be less than or equal to NM.
  31. C
  32. C A contains the lower triangle of the complex Hermitian input
  33. C matrix. The real parts of the matrix elements are stored
  34. C in the full lower triangle of A, and the imaginary parts
  35. C are stored in the transposed positions of the strict upper
  36. C triangle of A. No storage is required for the zero
  37. C imaginary parts of the diagonal elements. A is a two-
  38. C dimensional REAL array, dimensioned A(NM,N).
  39. C
  40. C On OUTPUT
  41. C
  42. C A contains some information about the unitary transformations
  43. C used in the reduction.
  44. C
  45. C D contains the diagonal elements of the real symmetric
  46. C tridiagonal matrix. D is a one-dimensional REAL array,
  47. C dimensioned D(N).
  48. C
  49. C E contains the subdiagonal elements of the real tridiagonal
  50. C matrix in its last N-1 positions. E(1) is set to zero.
  51. C E is a one-dimensional REAL array, dimensioned E(N).
  52. C
  53. C E2 contains the squares of the corresponding elements of E.
  54. C E2(1) is set to zero. E2 may coincide with E if the squares
  55. C are not needed. E2 is a one-dimensional REAL array,
  56. C dimensioned E2(N).
  57. C
  58. C TAU contains further information about the transformations.
  59. C TAU is a one-dimensional REAL array, dimensioned TAU(2,N).
  60. C
  61. C Calls PYTHAG(A,B) for sqrt(A**2 + B**2).
  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 PYTHAG
  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 HTRID3
  79. C
  80. INTEGER I,J,K,L,N,II,NM,JM1,JP1
  81. REAL A(NM,*),D(*),E(*),E2(*),TAU(2,*)
  82. REAL F,G,H,FI,GI,HH,SI,SCALE
  83. REAL PYTHAG
  84. C
  85. C***FIRST EXECUTABLE STATEMENT HTRID3
  86. TAU(1,N) = 1.0E0
  87. TAU(2,N) = 0.0E0
  88. C .......... FOR I=N STEP -1 UNTIL 1 DO -- ..........
  89. DO 300 II = 1, N
  90. I = N + 1 - II
  91. L = I - 1
  92. H = 0.0E0
  93. SCALE = 0.0E0
  94. IF (L .LT. 1) GO TO 130
  95. C .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) ..........
  96. DO 120 K = 1, L
  97. 120 SCALE = SCALE + ABS(A(I,K)) + ABS(A(K,I))
  98. C
  99. IF (SCALE .NE. 0.0E0) GO TO 140
  100. TAU(1,L) = 1.0E0
  101. TAU(2,L) = 0.0E0
  102. 130 E(I) = 0.0E0
  103. E2(I) = 0.0E0
  104. GO TO 290
  105. C
  106. 140 DO 150 K = 1, L
  107. A(I,K) = A(I,K) / SCALE
  108. A(K,I) = A(K,I) / SCALE
  109. H = H + A(I,K) * A(I,K) + A(K,I) * A(K,I)
  110. 150 CONTINUE
  111. C
  112. E2(I) = SCALE * SCALE * H
  113. G = SQRT(H)
  114. E(I) = SCALE * G
  115. F = PYTHAG(A(I,L),A(L,I))
  116. C .......... FORM NEXT DIAGONAL ELEMENT OF MATRIX T ..........
  117. IF (F .EQ. 0.0E0) GO TO 160
  118. TAU(1,L) = (A(L,I) * TAU(2,I) - A(I,L) * TAU(1,I)) / F
  119. SI = (A(I,L) * TAU(2,I) + A(L,I) * TAU(1,I)) / F
  120. H = H + F * G
  121. G = 1.0E0 + G / F
  122. A(I,L) = G * A(I,L)
  123. A(L,I) = G * A(L,I)
  124. IF (L .EQ. 1) GO TO 270
  125. GO TO 170
  126. 160 TAU(1,L) = -TAU(1,I)
  127. SI = TAU(2,I)
  128. A(I,L) = G
  129. 170 F = 0.0E0
  130. C
  131. DO 240 J = 1, L
  132. G = 0.0E0
  133. GI = 0.0E0
  134. IF (J .EQ. 1) GO TO 190
  135. JM1 = J - 1
  136. C .......... FORM ELEMENT OF A*U ..........
  137. DO 180 K = 1, JM1
  138. G = G + A(J,K) * A(I,K) + A(K,J) * A(K,I)
  139. GI = GI - A(J,K) * A(K,I) + A(K,J) * A(I,K)
  140. 180 CONTINUE
  141. C
  142. 190 G = G + A(J,J) * A(I,J)
  143. GI = GI - A(J,J) * A(J,I)
  144. JP1 = J + 1
  145. IF (L .LT. JP1) GO TO 220
  146. C
  147. DO 200 K = JP1, L
  148. G = G + A(K,J) * A(I,K) - A(J,K) * A(K,I)
  149. GI = GI - A(K,J) * A(K,I) - A(J,K) * A(I,K)
  150. 200 CONTINUE
  151. C .......... FORM ELEMENT OF P ..........
  152. 220 E(J) = G / H
  153. TAU(2,J) = GI / H
  154. F = F + E(J) * A(I,J) - TAU(2,J) * A(J,I)
  155. 240 CONTINUE
  156. C
  157. HH = F / (H + H)
  158. C .......... FORM REDUCED A ..........
  159. DO 260 J = 1, L
  160. F = A(I,J)
  161. G = E(J) - HH * F
  162. E(J) = G
  163. FI = -A(J,I)
  164. GI = TAU(2,J) - HH * FI
  165. TAU(2,J) = -GI
  166. A(J,J) = A(J,J) - 2.0E0 * (F * G + FI * GI)
  167. IF (J .EQ. 1) GO TO 260
  168. JM1 = J - 1
  169. C
  170. DO 250 K = 1, JM1
  171. A(J,K) = A(J,K) - F * E(K) - G * A(I,K)
  172. 1 + FI * TAU(2,K) + GI * A(K,I)
  173. A(K,J) = A(K,J) - F * TAU(2,K) - G * A(K,I)
  174. 1 - FI * E(K) - GI * A(I,K)
  175. 250 CONTINUE
  176. C
  177. 260 CONTINUE
  178. C
  179. 270 DO 280 K = 1, L
  180. A(I,K) = SCALE * A(I,K)
  181. A(K,I) = SCALE * A(K,I)
  182. 280 CONTINUE
  183. C
  184. TAU(2,L) = -SI
  185. 290 D(I) = A(I,I)
  186. A(I,I) = SCALE * SQRT(H)
  187. 300 CONTINUE
  188. C
  189. RETURN
  190. END