csidi.f 6.6 KB

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