chidi.f 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. *DECK CHIDI
  2. SUBROUTINE CHIDI (A, LDA, N, KPVT, DET, INERT, WORK, JOB)
  3. C***BEGIN PROLOGUE CHIDI
  4. C***PURPOSE Compute the determinant, inertia and inverse of a complex
  5. C Hermitian matrix using the factors obtained from CHIFA.
  6. C***LIBRARY SLATEC (LINPACK)
  7. C***CATEGORY D2D1A, D3D1A
  8. C***TYPE COMPLEX (SSIDI-S, DSISI-D, CHIDI-C, CSIDI-C)
  9. C***KEYWORDS DETERMINANT, HERMITIAN, INVERSE, LINEAR ALGEBRA, LINPACK,
  10. C MATRIX
  11. C***AUTHOR Bunch, J., (UCSD)
  12. C***DESCRIPTION
  13. C
  14. C CHIDI computes the determinant, inertia and inverse
  15. C of a complex Hermitian matrix using the factors from CHIFA.
  16. C
  17. C On Entry
  18. C
  19. C A COMPLEX(LDA,N)
  20. C the output from CHIFA.
  21. C
  22. C LDA INTEGER
  23. C the leading dimension of the array A.
  24. C
  25. C N INTEGER
  26. C the order of the matrix A.
  27. C
  28. C KVPT INTEGER(N)
  29. C the pivot vector from CHIFA.
  30. C
  31. C WORK COMPLEX(N)
  32. C work vector. Contents destroyed.
  33. C
  34. C JOB INTEGER
  35. C JOB has the decimal expansion ABC where
  36. C if C .NE. 0, the inverse is computed,
  37. C if B .NE. 0, the determinant is computed,
  38. C if A .NE. 0, the inertia is computed.
  39. C
  40. C For example, JOB = 111 gives all three.
  41. C
  42. C On Return
  43. C
  44. C Variables not requested by JOB are not used.
  45. C
  46. C A contains the upper triangle of the inverse of
  47. C the original matrix. The strict lower triangle
  48. C is never referenced.
  49. C
  50. C DET REAL(2)
  51. C determinant of original matrix.
  52. C Determinant = DET(1) * 10.0**DET(2)
  53. C with 1.0 .LE. ABS(DET(1)) .LT. 10.0
  54. C or DET(1) = 0.0.
  55. C
  56. C INERT INTEGER(3)
  57. C the inertia of the original matrix.
  58. C INERT(1) = number of positive eigenvalues.
  59. C INERT(2) = number of negative eigenvalues.
  60. C INERT(3) = number of zero eigenvalues.
  61. C
  62. C Error Condition
  63. C
  64. C A division by zero may occur if the inverse is requested
  65. C and CHICO has set RCOND .EQ. 0.0
  66. C or CHIFA has set INFO .NE. 0 .
  67. C
  68. C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
  69. C Stewart, LINPACK Users' Guide, SIAM, 1979.
  70. C***ROUTINES CALLED CAXPY, CCOPY, CDOTC, CSWAP
  71. C***REVISION HISTORY (YYMMDD)
  72. C 780814 DATE WRITTEN
  73. C 890531 Changed all specific intrinsics to generic. (WRB)
  74. C 890831 Modified array declarations. (WRB)
  75. C 891107 Modified routine equivalence list. (WRB)
  76. C 891107 REVISION DATE from Version 3.2
  77. C 891214 Prologue converted to Version 4.0 format. (BAB)
  78. C 900326 Removed duplicate information from DESCRIPTION section.
  79. C (WRB)
  80. C 920501 Reformatted the REFERENCES section. (WRB)
  81. C***END PROLOGUE CHIDI
  82. INTEGER LDA,N,JOB
  83. COMPLEX A(LDA,*),WORK(*)
  84. REAL DET(2)
  85. INTEGER KPVT(*),INERT(3)
  86. C
  87. COMPLEX AKKP1,CDOTC,TEMP
  88. REAL TEN,D,T,AK,AKP1
  89. INTEGER J,JB,K,KM1,KS,KSTEP
  90. LOGICAL NOINV,NODET,NOERT
  91. C***FIRST EXECUTABLE STATEMENT CHIDI
  92. NOINV = MOD(JOB,10) .EQ. 0
  93. NODET = MOD(JOB,100)/10 .EQ. 0
  94. NOERT = MOD(JOB,1000)/100 .EQ. 0
  95. C
  96. IF (NODET .AND. NOERT) GO TO 140
  97. IF (NOERT) GO TO 10
  98. INERT(1) = 0
  99. INERT(2) = 0
  100. INERT(3) = 0
  101. 10 CONTINUE
  102. IF (NODET) GO TO 20
  103. DET(1) = 1.0E0
  104. DET(2) = 0.0E0
  105. TEN = 10.0E0
  106. 20 CONTINUE
  107. T = 0.0E0
  108. DO 130 K = 1, N
  109. D = REAL(A(K,K))
  110. C
  111. C CHECK IF 1 BY 1
  112. C
  113. IF (KPVT(K) .GT. 0) GO TO 50
  114. C
  115. C 2 BY 2 BLOCK
  116. C USE DET (D S) = (D/T * C - T) * T , T = ABS(S)
  117. C (S C)
  118. C TO AVOID UNDERFLOW/OVERFLOW TROUBLES.
  119. C TAKE TWO PASSES THROUGH SCALING. USE T FOR FLAG.
  120. C
  121. IF (T .NE. 0.0E0) GO TO 30
  122. T = ABS(A(K,K+1))
  123. D = (D/T)*REAL(A(K+1,K+1)) - T
  124. GO TO 40
  125. 30 CONTINUE
  126. D = T
  127. T = 0.0E0
  128. 40 CONTINUE
  129. 50 CONTINUE
  130. C
  131. IF (NOERT) GO TO 60
  132. IF (D .GT. 0.0E0) INERT(1) = INERT(1) + 1
  133. IF (D .LT. 0.0E0) INERT(2) = INERT(2) + 1
  134. IF (D .EQ. 0.0E0) INERT(3) = INERT(3) + 1
  135. 60 CONTINUE
  136. C
  137. IF (NODET) GO TO 120
  138. DET(1) = D*DET(1)
  139. IF (DET(1) .EQ. 0.0E0) GO TO 110
  140. 70 IF (ABS(DET(1)) .GE. 1.0E0) GO TO 80
  141. DET(1) = TEN*DET(1)
  142. DET(2) = DET(2) - 1.0E0
  143. GO TO 70
  144. 80 CONTINUE
  145. 90 IF (ABS(DET(1)) .LT. TEN) GO TO 100
  146. DET(1) = DET(1)/TEN
  147. DET(2) = DET(2) + 1.0E0
  148. GO TO 90
  149. 100 CONTINUE
  150. 110 CONTINUE
  151. 120 CONTINUE
  152. 130 CONTINUE
  153. 140 CONTINUE
  154. C
  155. C COMPUTE INVERSE(A)
  156. C
  157. IF (NOINV) GO TO 270
  158. K = 1
  159. 150 IF (K .GT. N) GO TO 260
  160. KM1 = K - 1
  161. IF (KPVT(K) .LT. 0) GO TO 180
  162. C
  163. C 1 BY 1
  164. C
  165. A(K,K) = CMPLX(1.0E0/REAL(A(K,K)),0.0E0)
  166. IF (KM1 .LT. 1) GO TO 170
  167. CALL CCOPY(KM1,A(1,K),1,WORK,1)
  168. DO 160 J = 1, KM1
  169. A(J,K) = CDOTC(J,A(1,J),1,WORK,1)
  170. CALL CAXPY(J-1,WORK(J),A(1,J),1,A(1,K),1)
  171. 160 CONTINUE
  172. A(K,K) = A(K,K)
  173. 1 + CMPLX(REAL(CDOTC(KM1,WORK,1,A(1,K),1)),
  174. 2 0.0E0)
  175. 170 CONTINUE
  176. KSTEP = 1
  177. GO TO 220
  178. 180 CONTINUE
  179. C
  180. C 2 BY 2
  181. C
  182. T = ABS(A(K,K+1))
  183. AK = REAL(A(K,K))/T
  184. AKP1 = REAL(A(K+1,K+1))/T
  185. AKKP1 = A(K,K+1)/T
  186. D = T*(AK*AKP1 - 1.0E0)
  187. A(K,K) = CMPLX(AKP1/D,0.0E0)
  188. A(K+1,K+1) = CMPLX(AK/D,0.0E0)
  189. A(K,K+1) = -AKKP1/D
  190. IF (KM1 .LT. 1) GO TO 210
  191. CALL CCOPY(KM1,A(1,K+1),1,WORK,1)
  192. DO 190 J = 1, KM1
  193. A(J,K+1) = CDOTC(J,A(1,J),1,WORK,1)
  194. CALL CAXPY(J-1,WORK(J),A(1,J),1,A(1,K+1),1)
  195. 190 CONTINUE
  196. A(K+1,K+1) = A(K+1,K+1)
  197. 1 + CMPLX(REAL(CDOTC(KM1,WORK,1,A(1,K+1),
  198. 2 1)),0.0E0)
  199. A(K,K+1) = A(K,K+1) + CDOTC(KM1,A(1,K),1,A(1,K+1),1)
  200. CALL CCOPY(KM1,A(1,K),1,WORK,1)
  201. DO 200 J = 1, KM1
  202. A(J,K) = CDOTC(J,A(1,J),1,WORK,1)
  203. CALL CAXPY(J-1,WORK(J),A(1,J),1,A(1,K),1)
  204. 200 CONTINUE
  205. A(K,K) = A(K,K)
  206. 1 + CMPLX(REAL(CDOTC(KM1,WORK,1,A(1,K),1)),
  207. 2 0.0E0)
  208. 210 CONTINUE
  209. KSTEP = 2
  210. 220 CONTINUE
  211. C
  212. C SWAP
  213. C
  214. KS = ABS(KPVT(K))
  215. IF (KS .EQ. K) GO TO 250
  216. CALL CSWAP(KS,A(1,KS),1,A(1,K),1)
  217. DO 230 JB = KS, K
  218. J = K + KS - JB
  219. TEMP = CONJG(A(J,K))
  220. A(J,K) = CONJG(A(KS,J))
  221. A(KS,J) = TEMP
  222. 230 CONTINUE
  223. IF (KSTEP .EQ. 1) GO TO 240
  224. TEMP = A(KS,K+1)
  225. A(KS,K+1) = A(K,K+1)
  226. A(K,K+1) = TEMP
  227. 240 CONTINUE
  228. 250 CONTINUE
  229. K = K + KSTEP
  230. GO TO 150
  231. 260 CONTINUE
  232. 270 CONTINUE
  233. RETURN
  234. END