dsico.f 8.3 KB

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