cspfa.f 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. *DECK CSPFA
  2. SUBROUTINE CSPFA (AP, N, KPVT, INFO)
  3. C***BEGIN PROLOGUE CSPFA
  4. C***PURPOSE Factor a complex symmetric matrix stored in packed form by
  5. C elimination with symmetric pivoting.
  6. C***LIBRARY SLATEC (LINPACK)
  7. C***CATEGORY D2C1
  8. C***TYPE COMPLEX (SSPFA-S, DSPFA-D, CHPFA-C, CSPFA-C)
  9. C***KEYWORDS LINEAR ALGEBRA, LINPACK, MATRIX FACTORIZATION, PACKED,
  10. C SYMMETRIC
  11. C***AUTHOR Bunch, J., (UCSD)
  12. C***DESCRIPTION
  13. C
  14. C CSPFA factors a complex symmetric matrix stored in
  15. C packed form by elimination with symmetric pivoting.
  16. C
  17. C To solve A*X = B , follow CSPFA by CSPSL.
  18. C To compute INVERSE(A)*C , follow CSPFA by CSPSL.
  19. C To compute DETERMINANT(A) , follow CSPFA by CSPDI.
  20. C To compute INVERSE(A) , follow CSPFA by CSPDI.
  21. C
  22. C On Entry
  23. C
  24. C AP COMPLEX (N*(N+1)/2)
  25. C the packed form of a symmetric matrix A . The
  26. C columns of the upper triangle are stored sequentially
  27. C in a one-dimensional array of length N*(N+1)/2 .
  28. C See comments below for details.
  29. C
  30. C N INTEGER
  31. C the order of the matrix A .
  32. C
  33. C On Return
  34. C
  35. C AP a block diagonal matrix and the multipliers which
  36. C were used to obtain it stored in packed form.
  37. C The factorization can be written A = U*D*TRANS(U)
  38. C where U is a product of permutation and unit
  39. C upper triangular matrices , TRANS(U) is the
  40. C transpose of U , and D is block diagonal
  41. C with 1 by 1 and 2 by 2 blocks.
  42. C
  43. C KVPT INTEGER(N)
  44. C an integer vector of pivot indices.
  45. C
  46. C INFO INTEGER
  47. C = 0 normal value.
  48. C = K if the K-th pivot block is singular. This is
  49. C not an error condition for this subroutine,
  50. C but it does indicate that CSPSL or CSPDI may
  51. C divide by zero if called.
  52. C
  53. C Packed Storage
  54. C
  55. C The following program segment will pack the upper
  56. C triangle of a symmetric matrix.
  57. C
  58. C K = 0
  59. C DO 20 J = 1, N
  60. C DO 10 I = 1, J
  61. C K = K + 1
  62. C AP(K) = A(I,J)
  63. C 10 CONTINUE
  64. C 20 CONTINUE
  65. C
  66. C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
  67. C Stewart, LINPACK Users' Guide, SIAM, 1979.
  68. C***ROUTINES CALLED CAXPY, CSWAP, ICAMAX
  69. C***REVISION HISTORY (YYMMDD)
  70. C 780814 DATE WRITTEN
  71. C 890531 Changed all specific intrinsics to generic. (WRB)
  72. C 890831 Modified array declarations. (WRB)
  73. C 891107 Corrected category and modified routine equivalence
  74. C 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 CSPFA
  81. INTEGER N,KPVT(*),INFO
  82. COMPLEX AP(*)
  83. C
  84. COMPLEX AK,AKM1,BK,BKM1,DENOM,MULK,MULKM1,T
  85. REAL ABSAKK,ALPHA,COLMAX,ROWMAX
  86. INTEGER ICAMAX,IJ,IK,IKM1,IM,IMAX,IMAXP1,IMIM,IMJ,IMK
  87. INTEGER J,JJ,JK,JKM1,JMAX,JMIM,K,KK,KM1,KM1K,KM1KM1,KM2,KSTEP
  88. LOGICAL SWAP
  89. COMPLEX ZDUM
  90. REAL CABS1
  91. CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
  92. C***FIRST EXECUTABLE STATEMENT CSPFA
  93. C
  94. C INITIALIZE
  95. C
  96. C ALPHA IS USED IN CHOOSING PIVOT BLOCK SIZE.
  97. C
  98. ALPHA = (1.0E0 + SQRT(17.0E0))/8.0E0
  99. C
  100. INFO = 0
  101. C
  102. C MAIN LOOP ON K, WHICH GOES FROM N TO 1.
  103. C
  104. K = N
  105. IK = (N*(N - 1))/2
  106. 10 CONTINUE
  107. C
  108. C LEAVE THE LOOP IF K=0 OR K=1.
  109. C
  110. IF (K .EQ. 0) GO TO 200
  111. IF (K .GT. 1) GO TO 20
  112. KPVT(1) = 1
  113. IF (CABS1(AP(1)) .EQ. 0.0E0) INFO = 1
  114. GO TO 200
  115. 20 CONTINUE
  116. C
  117. C THIS SECTION OF CODE DETERMINES THE KIND OF
  118. C ELIMINATION TO BE PERFORMED. WHEN IT IS COMPLETED,
  119. C KSTEP WILL BE SET TO THE SIZE OF THE PIVOT BLOCK, AND
  120. C SWAP WILL BE SET TO .TRUE. IF AN INTERCHANGE IS
  121. C REQUIRED.
  122. C
  123. KM1 = K - 1
  124. KK = IK + K
  125. ABSAKK = CABS1(AP(KK))
  126. C
  127. C DETERMINE THE LARGEST OFF-DIAGONAL ELEMENT IN
  128. C COLUMN K.
  129. C
  130. IMAX = ICAMAX(K-1,AP(IK+1),1)
  131. IMK = IK + IMAX
  132. COLMAX = CABS1(AP(IMK))
  133. IF (ABSAKK .LT. ALPHA*COLMAX) GO TO 30
  134. KSTEP = 1
  135. SWAP = .FALSE.
  136. GO TO 90
  137. 30 CONTINUE
  138. C
  139. C DETERMINE THE LARGEST OFF-DIAGONAL ELEMENT IN
  140. C ROW IMAX.
  141. C
  142. ROWMAX = 0.0E0
  143. IMAXP1 = IMAX + 1
  144. IM = IMAX*(IMAX - 1)/2
  145. IMJ = IM + 2*IMAX
  146. DO 40 J = IMAXP1, K
  147. ROWMAX = MAX(ROWMAX,CABS1(AP(IMJ)))
  148. IMJ = IMJ + J
  149. 40 CONTINUE
  150. IF (IMAX .EQ. 1) GO TO 50
  151. JMAX = ICAMAX(IMAX-1,AP(IM+1),1)
  152. JMIM = JMAX + IM
  153. ROWMAX = MAX(ROWMAX,CABS1(AP(JMIM)))
  154. 50 CONTINUE
  155. IMIM = IMAX + IM
  156. IF (CABS1(AP(IMIM)) .LT. ALPHA*ROWMAX) GO TO 60
  157. KSTEP = 1
  158. SWAP = .TRUE.
  159. GO TO 80
  160. 60 CONTINUE
  161. IF (ABSAKK .LT. ALPHA*COLMAX*(COLMAX/ROWMAX)) GO TO 70
  162. KSTEP = 1
  163. SWAP = .FALSE.
  164. GO TO 80
  165. 70 CONTINUE
  166. KSTEP = 2
  167. SWAP = IMAX .NE. KM1
  168. 80 CONTINUE
  169. 90 CONTINUE
  170. IF (MAX(ABSAKK,COLMAX) .NE. 0.0E0) GO TO 100
  171. C
  172. C COLUMN K IS ZERO. SET INFO AND ITERATE THE LOOP.
  173. C
  174. KPVT(K) = K
  175. INFO = K
  176. GO TO 190
  177. 100 CONTINUE
  178. IF (KSTEP .EQ. 2) GO TO 140
  179. C
  180. C 1 X 1 PIVOT BLOCK.
  181. C
  182. IF (.NOT.SWAP) GO TO 120
  183. C
  184. C PERFORM AN INTERCHANGE.
  185. C
  186. CALL CSWAP(IMAX,AP(IM+1),1,AP(IK+1),1)
  187. IMJ = IK + IMAX
  188. DO 110 JJ = IMAX, K
  189. J = K + IMAX - JJ
  190. JK = IK + J
  191. T = AP(JK)
  192. AP(JK) = AP(IMJ)
  193. AP(IMJ) = T
  194. IMJ = IMJ - (J - 1)
  195. 110 CONTINUE
  196. 120 CONTINUE
  197. C
  198. C PERFORM THE ELIMINATION.
  199. C
  200. IJ = IK - (K - 1)
  201. DO 130 JJ = 1, KM1
  202. J = K - JJ
  203. JK = IK + J
  204. MULK = -AP(JK)/AP(KK)
  205. T = MULK
  206. CALL CAXPY(J,T,AP(IK+1),1,AP(IJ+1),1)
  207. AP(JK) = MULK
  208. IJ = IJ - (J - 1)
  209. 130 CONTINUE
  210. C
  211. C SET THE PIVOT ARRAY.
  212. C
  213. KPVT(K) = K
  214. IF (SWAP) KPVT(K) = IMAX
  215. GO TO 190
  216. 140 CONTINUE
  217. C
  218. C 2 X 2 PIVOT BLOCK.
  219. C
  220. KM1K = IK + K - 1
  221. IKM1 = IK - (K - 1)
  222. IF (.NOT.SWAP) GO TO 160
  223. C
  224. C PERFORM AN INTERCHANGE.
  225. C
  226. CALL CSWAP(IMAX,AP(IM+1),1,AP(IKM1+1),1)
  227. IMJ = IKM1 + IMAX
  228. DO 150 JJ = IMAX, KM1
  229. J = KM1 + IMAX - JJ
  230. JKM1 = IKM1 + J
  231. T = AP(JKM1)
  232. AP(JKM1) = AP(IMJ)
  233. AP(IMJ) = T
  234. IMJ = IMJ - (J - 1)
  235. 150 CONTINUE
  236. T = AP(KM1K)
  237. AP(KM1K) = AP(IMK)
  238. AP(IMK) = T
  239. 160 CONTINUE
  240. C
  241. C PERFORM THE ELIMINATION.
  242. C
  243. KM2 = K - 2
  244. IF (KM2 .EQ. 0) GO TO 180
  245. AK = AP(KK)/AP(KM1K)
  246. KM1KM1 = IKM1 + K - 1
  247. AKM1 = AP(KM1KM1)/AP(KM1K)
  248. DENOM = 1.0E0 - AK*AKM1
  249. IJ = IK - (K - 1) - (K - 2)
  250. DO 170 JJ = 1, KM2
  251. J = KM1 - JJ
  252. JK = IK + J
  253. BK = AP(JK)/AP(KM1K)
  254. JKM1 = IKM1 + J
  255. BKM1 = AP(JKM1)/AP(KM1K)
  256. MULK = (AKM1*BK - BKM1)/DENOM
  257. MULKM1 = (AK*BKM1 - BK)/DENOM
  258. T = MULK
  259. CALL CAXPY(J,T,AP(IK+1),1,AP(IJ+1),1)
  260. T = MULKM1
  261. CALL CAXPY(J,T,AP(IKM1+1),1,AP(IJ+1),1)
  262. AP(JK) = MULK
  263. AP(JKM1) = MULKM1
  264. IJ = IJ - (J - 1)
  265. 170 CONTINUE
  266. 180 CONTINUE
  267. C
  268. C SET THE PIVOT ARRAY.
  269. C
  270. KPVT(K) = 1 - K
  271. IF (SWAP) KPVT(K) = -IMAX
  272. KPVT(K-1) = KPVT(K)
  273. 190 CONTINUE
  274. IK = IK - (K - 1)
  275. IF (KSTEP .EQ. 2) IK = IK - (K - 2)
  276. K = K - KSTEP
  277. GO TO 10
  278. 200 CONTINUE
  279. RETURN
  280. END