chiev.f 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. *DECK CHIEV
  2. SUBROUTINE CHIEV (A, LDA, N, E, V, LDV, WORK, JOB, INFO)
  3. C***BEGIN PROLOGUE CHIEV
  4. C***PURPOSE Compute the eigenvalues and, optionally, the eigenvectors
  5. C of a complex Hermitian matrix.
  6. C***LIBRARY SLATEC
  7. C***CATEGORY D4A3
  8. C***TYPE COMPLEX (SSIEV-S, CHIEV-C)
  9. C***KEYWORDS COMPLEX HERMITIAN, EIGENVALUES, EIGENVECTORS, MATRIX,
  10. C SYMMETRIC
  11. C***AUTHOR Kahaner, D. K., (NBS)
  12. C Moler, C. B., (U. of New Mexico)
  13. C Stewart, G. W., (U. of Maryland)
  14. C***DESCRIPTION
  15. C
  16. C David Kahaner, Cleve Moler, G. W. Stewart,
  17. C N.B.S. U.N.M. N.B.S./U.MD.
  18. C
  19. C Abstract
  20. C CHIEV computes the eigenvalues and, optionally,
  21. C the eigenvectors of a complex Hermitian matrix.
  22. C
  23. C Call Sequence Parameters-
  24. C (the values of parameters marked with * (star) will be changed
  25. C by CHIEV.)
  26. C
  27. C A* COMPLEX(LDA,N)
  28. C complex Hermitian input matrix.
  29. C Only the upper triangle of A need be
  30. C filled in. Elements on diagonal must be real.
  31. C
  32. C LDA INTEGER
  33. C set by the user to
  34. C the leading dimension of the complex array A.
  35. C
  36. C N INTEGER
  37. C set by the user to
  38. C the order of the matrices A and V, and
  39. C the number of elements in E.
  40. C
  41. C E* REAL(N)
  42. C on return from CHIEV E contains the eigenvalues of A.
  43. C See also INFO below.
  44. C
  45. C V* COMPLEX(LDV,N)
  46. C on return from CHIEV if the user has set JOB
  47. C = 0 V is not referenced.
  48. C = nonzero the N eigenvectors of A are stored in the
  49. C first N columns of V. See also INFO below.
  50. C
  51. C LDV INTEGER
  52. C set by the user to
  53. C the leading dimension of the array V if JOB is also
  54. C set nonzero. In that case N must be .LE. LDV.
  55. C If JOB is set to zero LDV is not referenced.
  56. C
  57. C WORK* REAL(4N)
  58. C temporary storage vector. Contents changed by CHIEV.
  59. C
  60. C JOB INTEGER
  61. C set by the user to
  62. C = 0 eigenvalues only to be calculated by CHIEV.
  63. C Neither V nor LDV are referenced.
  64. C = nonzero eigenvalues and vectors to be calculated.
  65. C In this case A and V must be distinct arrays
  66. C also if LDA .GT. LDV CHIEV changes all the
  67. C elements of A thru column N. If LDA < LDV
  68. C CHIEV changes all the elements of V through
  69. C column N. If LDA = LDV only A(I,J) and V(I,
  70. C J) for I,J = 1,...,N are changed by CHIEV.
  71. C
  72. C INFO* INTEGER
  73. C on return from CHIEV the value of INFO is
  74. C = 0 normal return, calculation successful.
  75. C = K if the eigenvalue iteration fails to converge,
  76. C eigenvalues (and eigenvectors if requested)
  77. C 1 through K-1 are correct.
  78. C
  79. C Error Messages
  80. C No. 1 recoverable N is greater than LDA
  81. C No. 2 recoverable N is less than one.
  82. C No. 3 recoverable JOB is nonzero and N is greater than LDV
  83. C No. 4 warning LDA > LDV, elements of A other than the
  84. C N by N input elements have been changed
  85. C No. 5 warning LDA < LDV, elements of V other than the
  86. C N by N output elements have been changed
  87. C No. 6 recoverable nonreal element on diagonal of A.
  88. C
  89. C***REFERENCES (NONE)
  90. C***ROUTINES CALLED HTRIBK, HTRIDI, IMTQL2, SCOPY, SCOPYM, TQLRAT,
  91. C XERMSG
  92. C***REVISION HISTORY (YYMMDD)
  93. C 800808 DATE WRITTEN
  94. C 890531 Changed all specific intrinsics to generic. (WRB)
  95. C 890531 REVISION DATE from Version 3.2
  96. C 891214 Prologue converted to Version 4.0 format. (BAB)
  97. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  98. C***END PROLOGUE CHIEV
  99. INTEGER I,INFO,J,JOB,K,L,LDA,LDV,M,MDIM,N
  100. REAL A(*),E(*),WORK(*),V(*)
  101. C***FIRST EXECUTABLE STATEMENT CHIEV
  102. IF (N .GT. LDA) CALL XERMSG ('SLATEC', 'CHIEV', 'N .GT. LDA.', 1,
  103. + 1)
  104. IF(N .GT. LDA) RETURN
  105. IF (N .LT. 1) CALL XERMSG ('SLATEC', 'CHIEV', 'N .LT. 1', 2, 1)
  106. IF(N .LT. 1) RETURN
  107. IF(N .EQ. 1 .AND. JOB .EQ. 0) GO TO 35
  108. MDIM = 2 * LDA
  109. IF(JOB .EQ. 0) GO TO 5
  110. IF (N .GT. LDV) CALL XERMSG ('SLATEC', 'CHIEV',
  111. + 'JOB .NE. 0 AND N .GT. LDV.', 3, 1)
  112. IF(N .GT. LDV) RETURN
  113. IF(N .EQ. 1) GO TO 35
  114. C
  115. C REARRANGE A IF NECESSARY WHEN LDA.GT.LDV AND JOB .NE.0
  116. C
  117. MDIM = MIN(MDIM,2 * LDV)
  118. IF (LDA .LT. LDV) CALL XERMSG ('SLATEC', 'CHIEV',
  119. + 'LDA.LT.LDV, ELEMENTS OF V OTHER THAN THE N BY N OUTPUT ' //
  120. + 'ELEMENTS HAVE BEEN CHANGED.', 5, 0)
  121. IF(LDA.LE.LDV) GO TO 5
  122. CALL XERMSG ('SLATEC', 'CHIEV',
  123. + 'LDA.GT.LDV, ELEMENTS OF A OTHER THAN THE N BY N INPUT ' //
  124. + 'ELEMENTS HAVE BEEN CHANGED.', 4, 0)
  125. L = N - 1
  126. DO 4 J=1,L
  127. M = 1+J*2*LDV
  128. K = 1+J*2*LDA
  129. CALL SCOPY(2*N,A(K),1,A(M),1)
  130. 4 CONTINUE
  131. 5 CONTINUE
  132. C
  133. C FILL IN LOWER TRIANGLE OF A, COLUMN BY COLUMN.
  134. C
  135. DO 6 J = 1,N
  136. K = (J-1)*(MDIM+2)+1
  137. IF (A(K+1) .NE. 0.0) CALL XERMSG ('SLATEC', 'CHIEV',
  138. + 'NONREAL ELEMENT ON DIAGONAL OF A', 6, 1)
  139. IF(A(K+1) .NE.0.0) RETURN
  140. CALL SCOPY(N-J+1,A(K),MDIM,A(K),2)
  141. CALL SCOPYM(N-J+1,A(K+1),MDIM,A(K+1),2)
  142. 6 CONTINUE
  143. C
  144. C SEPARATE REAL AND IMAGINARY PARTS
  145. C
  146. DO 10 J = 1, N
  147. K = (J-1) * MDIM +1
  148. L = K + N
  149. CALL SCOPY(N,A(K+1),2,WORK(1),1)
  150. CALL SCOPY(N,A(K),2,A(K),1)
  151. CALL SCOPY(N,WORK(1),1,A(L),1)
  152. 10 CONTINUE
  153. C
  154. C REDUCE A TO TRIDIAGONAL MATRIX.
  155. C
  156. CALL HTRIDI(MDIM,N,A(1),A(N+1),E,WORK(1),WORK(N+1),
  157. 1 WORK(2*N+1))
  158. IF(JOB .NE. 0) GOTO 15
  159. C
  160. C EIGENVALUES ONLY.
  161. C
  162. CALL TQLRAT(N,E,WORK(N+1),INFO)
  163. RETURN
  164. C
  165. C EIGENVALUES AND EIGENVECTORS.
  166. C
  167. 15 DO 17 J = 1,N
  168. K = (J-1) * MDIM + 1
  169. M = K + N - 1
  170. DO 16 I = K,M
  171. 16 V(I) = 0.
  172. I = K + J - 1
  173. V(I) = 1.
  174. 17 CONTINUE
  175. CALL IMTQL2(MDIM,N,E,WORK(1),V,INFO)
  176. IF(INFO .NE. 0) RETURN
  177. CALL HTRIBK(MDIM,N,A(1),A(N+1),WORK(2*N+1),N,V(1),V(N+1))
  178. C
  179. C CONVERT EIGENVECTORS TO COMPLEX STORAGE.
  180. C
  181. DO 20 J = 1,N
  182. K = (J-1) * MDIM + 1
  183. I = (J-1) * 2 * LDV + 1
  184. L = K + N
  185. CALL SCOPY(N,V(K),1,WORK(1),1)
  186. CALL SCOPY(N,V(L),1,V(I+1),2)
  187. CALL SCOPY(N,WORK(1),1,V(I),2)
  188. 20 CONTINUE
  189. RETURN
  190. C
  191. C TAKE CARE OF N=1 CASE.
  192. C
  193. 35 IF (A(2) .NE. 0.) CALL XERMSG ('SLATEC', 'CHIEV',
  194. + 'NONREAL ELEMENT ON DIAGONAL OF A', 6, 1)
  195. IF(A(2) .NE. 0.) RETURN
  196. E(1) = A(1)
  197. INFO = 0
  198. IF(JOB .EQ. 0) RETURN
  199. V(1) = A(1)
  200. V(2) = 0.
  201. RETURN
  202. END