chico.f 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. *DECK CHICO
  2. SUBROUTINE CHICO (A, LDA, N, KPVT, RCOND, Z)
  3. C***BEGIN PROLOGUE CHICO
  4. C***PURPOSE Factor a complex Hermitian matrix by elimination with sym-
  5. C metric pivoting and estimate the condition of the matrix.
  6. C***LIBRARY SLATEC (LINPACK)
  7. C***CATEGORY D2D1A
  8. C***TYPE COMPLEX (SSICO-S, DSICO-D, CHICO-C, CSICO-C)
  9. C***KEYWORDS CONDITION NUMBER, HERMITIAN, LINEAR ALGEBRA, LINPACK,
  10. C MATRIX FACTORIZATION
  11. C***AUTHOR Moler, C. B., (U. of New Mexico)
  12. C***DESCRIPTION
  13. C
  14. C CHICO factors a complex Hermitian matrix by elimination with
  15. C symmetric pivoting and estimates the condition of the matrix.
  16. C
  17. C If RCOND is not needed, CHIFA is slightly faster.
  18. C To solve A*X = B , follow CHICO by CHISL.
  19. C To compute INVERSE(A)*C , follow CHICO by CHISL.
  20. C To compute INVERSE(A) , follow CHICO by CHIDI.
  21. C To compute DETERMINANT(A) , follow CHICO by CHIDI.
  22. C To compute INERTIA(A), follow CHICO by CHIDI.
  23. C
  24. C On Entry
  25. C
  26. C A COMPLEX(LDA, N)
  27. C the Hermitian matrix to be factored.
  28. C Only the diagonal and upper triangle are used.
  29. C
  30. C LDA INTEGER
  31. C the leading dimension of the array A .
  32. C
  33. C N INTEGER
  34. C the order of the matrix A .
  35. C
  36. C Output
  37. C
  38. C A a block diagonal matrix and the multipliers which
  39. C were used to obtain it.
  40. C The factorization can be written A = U*D*CTRANS(U)
  41. C where U is a product of permutation and unit
  42. C upper triangular matrices , CTRANS(U) is the
  43. C conjugate transpose of U , and D is block diagonal
  44. C with 1 by 1 and 2 by 2 blocks.
  45. C
  46. C KVPT INTEGER(N)
  47. C an integer vector of pivot indices.
  48. C
  49. C RCOND REAL
  50. C an estimate of the reciprocal condition of A .
  51. C For the system A*X = B , relative perturbations
  52. C in A and B of size EPSILON may cause
  53. C relative perturbations in X of size EPSILON/RCOND .
  54. C If RCOND is so small that the logical expression
  55. C 1.0 + RCOND .EQ. 1.0
  56. C is true, then A may be singular to working
  57. C precision. In particular, RCOND is zero if
  58. C exact singularity is detected or the estimate
  59. C underflows.
  60. C
  61. C Z COMPLEX(N)
  62. C a work vector whose contents are usually unimportant.
  63. C If A is close to a singular matrix, then Z is
  64. C an approximate null vector in the sense that
  65. C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
  66. C
  67. C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
  68. C Stewart, LINPACK Users' Guide, SIAM, 1979.
  69. C***ROUTINES CALLED CAXPY, CDOTC, CHIFA, CSSCAL, SCASUM
  70. C***REVISION HISTORY (YYMMDD)
  71. C 780814 DATE WRITTEN
  72. C 890531 Changed all specific intrinsics to generic. (WRB)
  73. C 890831 Modified array declarations. (WRB)
  74. C 891107 Modified routine equivalence list. (WRB)
  75. C 891107 REVISION DATE from Version 3.2
  76. C 891214 Prologue converted to Version 4.0 format. (BAB)
  77. C 900326 Removed duplicate information from DESCRIPTION section.
  78. C (WRB)
  79. C 920501 Reformatted the REFERENCES section. (WRB)
  80. C***END PROLOGUE CHICO
  81. INTEGER LDA,N,KPVT(*)
  82. COMPLEX A(LDA,*),Z(*)
  83. REAL RCOND
  84. C
  85. COMPLEX AK,AKM1,BK,BKM1,CDOTC,DENOM,EK,T
  86. REAL ANORM,S,SCASUM,YNORM
  87. INTEGER I,INFO,J,JM1,K,KP,KPS,KS
  88. COMPLEX ZDUM,ZDUM2,CSIGN1
  89. REAL CABS1
  90. CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
  91. CSIGN1(ZDUM,ZDUM2) = CABS1(ZDUM)*(ZDUM2/CABS1(ZDUM2))
  92. C
  93. C FIND NORM OF A USING ONLY UPPER HALF
  94. C
  95. C***FIRST EXECUTABLE STATEMENT CHICO
  96. DO 30 J = 1, N
  97. Z(J) = CMPLX(SCASUM(J,A(1,J),1),0.0E0)
  98. JM1 = J - 1
  99. IF (JM1 .LT. 1) GO TO 20
  100. DO 10 I = 1, JM1
  101. Z(I) = CMPLX(REAL(Z(I))+CABS1(A(I,J)),0.0E0)
  102. 10 CONTINUE
  103. 20 CONTINUE
  104. 30 CONTINUE
  105. ANORM = 0.0E0
  106. DO 40 J = 1, N
  107. ANORM = MAX(ANORM,REAL(Z(J)))
  108. 40 CONTINUE
  109. C
  110. C FACTOR
  111. C
  112. CALL CHIFA(A,LDA,N,KPVT,INFO)
  113. C
  114. C RCOND = 1/(NORM(A)*(ESTIMATE OF NORM(INVERSE(A)))) .
  115. C ESTIMATE = NORM(Z)/NORM(Y) WHERE A*Z = Y AND A*Y = E .
  116. C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL
  117. C GROWTH IN THE ELEMENTS OF W WHERE U*D*W = E .
  118. C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
  119. C
  120. C SOLVE U*D*W = E
  121. C
  122. EK = (1.0E0,0.0E0)
  123. DO 50 J = 1, N
  124. Z(J) = (0.0E0,0.0E0)
  125. 50 CONTINUE
  126. K = N
  127. 60 IF (K .EQ. 0) GO TO 120
  128. KS = 1
  129. IF (KPVT(K) .LT. 0) KS = 2
  130. KP = ABS(KPVT(K))
  131. KPS = K + 1 - KS
  132. IF (KP .EQ. KPS) GO TO 70
  133. T = Z(KPS)
  134. Z(KPS) = Z(KP)
  135. Z(KP) = T
  136. 70 CONTINUE
  137. IF (CABS1(Z(K)) .NE. 0.0E0) EK = CSIGN1(EK,Z(K))
  138. Z(K) = Z(K) + EK
  139. CALL CAXPY(K-KS,Z(K),A(1,K),1,Z(1),1)
  140. IF (KS .EQ. 1) GO TO 80
  141. IF (CABS1(Z(K-1)) .NE. 0.0E0) EK = CSIGN1(EK,Z(K-1))
  142. Z(K-1) = Z(K-1) + EK
  143. CALL CAXPY(K-KS,Z(K-1),A(1,K-1),1,Z(1),1)
  144. 80 CONTINUE
  145. IF (KS .EQ. 2) GO TO 100
  146. IF (CABS1(Z(K)) .LE. CABS1(A(K,K))) GO TO 90
  147. S = CABS1(A(K,K))/CABS1(Z(K))
  148. CALL CSSCAL(N,S,Z,1)
  149. EK = CMPLX(S,0.0E0)*EK
  150. 90 CONTINUE
  151. IF (CABS1(A(K,K)) .NE. 0.0E0) Z(K) = Z(K)/A(K,K)
  152. IF (CABS1(A(K,K)) .EQ. 0.0E0) Z(K) = (1.0E0,0.0E0)
  153. GO TO 110
  154. 100 CONTINUE
  155. AK = A(K,K)/CONJG(A(K-1,K))
  156. AKM1 = A(K-1,K-1)/A(K-1,K)
  157. BK = Z(K)/CONJG(A(K-1,K))
  158. BKM1 = Z(K-1)/A(K-1,K)
  159. DENOM = AK*AKM1 - 1.0E0
  160. Z(K) = (AKM1*BK - BKM1)/DENOM
  161. Z(K-1) = (AK*BKM1 - BK)/DENOM
  162. 110 CONTINUE
  163. K = K - KS
  164. GO TO 60
  165. 120 CONTINUE
  166. S = 1.0E0/SCASUM(N,Z,1)
  167. CALL CSSCAL(N,S,Z,1)
  168. C
  169. C SOLVE CTRANS(U)*Y = W
  170. C
  171. K = 1
  172. 130 IF (K .GT. N) GO TO 160
  173. KS = 1
  174. IF (KPVT(K) .LT. 0) KS = 2
  175. IF (K .EQ. 1) GO TO 150
  176. Z(K) = Z(K) + CDOTC(K-1,A(1,K),1,Z(1),1)
  177. IF (KS .EQ. 2)
  178. 1 Z(K+1) = Z(K+1) + CDOTC(K-1,A(1,K+1),1,Z(1),1)
  179. KP = ABS(KPVT(K))
  180. IF (KP .EQ. K) GO TO 140
  181. T = Z(K)
  182. Z(K) = Z(KP)
  183. Z(KP) = T
  184. 140 CONTINUE
  185. 150 CONTINUE
  186. K = K + KS
  187. GO TO 130
  188. 160 CONTINUE
  189. S = 1.0E0/SCASUM(N,Z,1)
  190. CALL CSSCAL(N,S,Z,1)
  191. C
  192. YNORM = 1.0E0
  193. C
  194. C SOLVE U*D*V = Y
  195. C
  196. K = N
  197. 170 IF (K .EQ. 0) GO TO 230
  198. KS = 1
  199. IF (KPVT(K) .LT. 0) KS = 2
  200. IF (K .EQ. KS) GO TO 190
  201. KP = ABS(KPVT(K))
  202. KPS = K + 1 - KS
  203. IF (KP .EQ. KPS) GO TO 180
  204. T = Z(KPS)
  205. Z(KPS) = Z(KP)
  206. Z(KP) = T
  207. 180 CONTINUE
  208. CALL CAXPY(K-KS,Z(K),A(1,K),1,Z(1),1)
  209. IF (KS .EQ. 2) CALL CAXPY(K-KS,Z(K-1),A(1,K-1),1,Z(1),1)
  210. 190 CONTINUE
  211. IF (KS .EQ. 2) GO TO 210
  212. IF (CABS1(Z(K)) .LE. CABS1(A(K,K))) GO TO 200
  213. S = CABS1(A(K,K))/CABS1(Z(K))
  214. CALL CSSCAL(N,S,Z,1)
  215. YNORM = S*YNORM
  216. 200 CONTINUE
  217. IF (CABS1(A(K,K)) .NE. 0.0E0) Z(K) = Z(K)/A(K,K)
  218. IF (CABS1(A(K,K)) .EQ. 0.0E0) Z(K) = (1.0E0,0.0E0)
  219. GO TO 220
  220. 210 CONTINUE
  221. AK = A(K,K)/CONJG(A(K-1,K))
  222. AKM1 = A(K-1,K-1)/A(K-1,K)
  223. BK = Z(K)/CONJG(A(K-1,K))
  224. BKM1 = Z(K-1)/A(K-1,K)
  225. DENOM = AK*AKM1 - 1.0E0
  226. Z(K) = (AKM1*BK - BKM1)/DENOM
  227. Z(K-1) = (AK*BKM1 - BK)/DENOM
  228. 220 CONTINUE
  229. K = K - KS
  230. GO TO 170
  231. 230 CONTINUE
  232. S = 1.0E0/SCASUM(N,Z,1)
  233. CALL CSSCAL(N,S,Z,1)
  234. YNORM = S*YNORM
  235. C
  236. C SOLVE CTRANS(U)*Z = V
  237. C
  238. K = 1
  239. 240 IF (K .GT. N) GO TO 270
  240. KS = 1
  241. IF (KPVT(K) .LT. 0) KS = 2
  242. IF (K .EQ. 1) GO TO 260
  243. Z(K) = Z(K) + CDOTC(K-1,A(1,K),1,Z(1),1)
  244. IF (KS .EQ. 2)
  245. 1 Z(K+1) = Z(K+1) + CDOTC(K-1,A(1,K+1),1,Z(1),1)
  246. KP = ABS(KPVT(K))
  247. IF (KP .EQ. K) GO TO 250
  248. T = Z(K)
  249. Z(K) = Z(KP)
  250. Z(KP) = T
  251. 250 CONTINUE
  252. 260 CONTINUE
  253. K = K + KS
  254. GO TO 240
  255. 270 CONTINUE
  256. C MAKE ZNORM = 1.0
  257. S = 1.0E0/SCASUM(N,Z,1)
  258. CALL CSSCAL(N,S,Z,1)
  259. YNORM = S*YNORM
  260. C
  261. IF (ANORM .NE. 0.0E0) RCOND = YNORM/ANORM
  262. IF (ANORM .EQ. 0.0E0) RCOND = 0.0E0
  263. RETURN
  264. END