chpfa.f 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. *DECK CHPFA
  2. SUBROUTINE CHPFA (AP, N, KPVT, INFO)
  3. C***BEGIN PROLOGUE CHPFA
  4. C***PURPOSE Factor a complex Hermitian matrix stored in packed form by
  5. C elimination with symmetric pivoting.
  6. C***LIBRARY SLATEC (LINPACK)
  7. C***CATEGORY D2D1A
  8. C***TYPE COMPLEX (SSPFA-S, DSPFA-D, CHPFA-C, DSPFA-C)
  9. C***KEYWORDS HERMITIAN, LINEAR ALGEBRA, LINPACK, MATRIX FACTORIZATION,
  10. C PACKED
  11. C***AUTHOR Bunch, J., (UCSD)
  12. C***DESCRIPTION
  13. C
  14. C CHPFA factors a complex Hermitian matrix stored in
  15. C packed form by elimination with symmetric pivoting.
  16. C
  17. C To solve A*X = B , follow CHPFA by CHPSL.
  18. C To compute INVERSE(A)*C , follow CHPFA by CHPSL.
  19. C To compute DETERMINANT(A) , follow CHPFA by CHPDI.
  20. C To compute INERTIA(A) , follow CHPFA by CHPDI.
  21. C To compute INVERSE(A) , follow CHPFA by CHPDI.
  22. C
  23. C On Entry
  24. C
  25. C AP COMPLEX (N*(N+1)/2)
  26. C the packed form of a Hermitian matrix A . The
  27. C columns of the upper triangle are stored sequentially
  28. C in a one-dimensional array of length N*(N+1)/2 .
  29. C See comments below for details.
  30. C
  31. C N INTEGER
  32. C the order of the matrix A .
  33. C
  34. C Output
  35. C
  36. C AP A block diagonal matrix and the multipliers which
  37. C were used to obtain it stored in packed form.
  38. C The factorization can be written A = U*D*CTRANS(U)
  39. C where U is a product of permutation and unit
  40. C upper triangular matrices , CTRANS(U) is the
  41. C conjugate transpose of U , and D is block diagonal
  42. C with 1 by 1 and 2 by 2 blocks.
  43. C
  44. C KVPT INTEGER(N)
  45. C an integer vector of pivot indices.
  46. C
  47. C INFO INTEGER
  48. C = 0 normal value.
  49. C = K if the K-th pivot block is singular. This is
  50. C not an error condition for this subroutine,
  51. C but it does indicate that CHPSL or CHPDI may
  52. C divide by zero if called.
  53. C
  54. C Packed Storage
  55. C
  56. C The following program segment will pack the upper
  57. C triangle of a Hermitian matrix.
  58. C
  59. C K = 0
  60. C DO 20 J = 1, N
  61. C DO 10 I = 1, J
  62. C K = K + 1
  63. C AP(K) = A(I,J)
  64. C 10 CONTINUE
  65. C 20 CONTINUE
  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, CSWAP, ICAMAX
  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 CHPFA
  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,IJJ,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 CHPFA
  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 = CONJG(AP(JK))
  192. AP(JK) = CONJG(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 = CONJG(MULK)
  206. CALL CAXPY(J,T,AP(IK+1),1,AP(IJ+1),1)
  207. IJJ = IJ + J
  208. AP(IJJ) = CMPLX(REAL(AP(IJJ)),0.0E0)
  209. AP(JK) = MULK
  210. IJ = IJ - (J - 1)
  211. 130 CONTINUE
  212. C
  213. C SET THE PIVOT ARRAY.
  214. C
  215. KPVT(K) = K
  216. IF (SWAP) KPVT(K) = IMAX
  217. GO TO 190
  218. 140 CONTINUE
  219. C
  220. C 2 X 2 PIVOT BLOCK.
  221. C
  222. KM1K = IK + K - 1
  223. IKM1 = IK - (K - 1)
  224. IF (.NOT.SWAP) GO TO 160
  225. C
  226. C PERFORM AN INTERCHANGE.
  227. C
  228. CALL CSWAP(IMAX,AP(IM+1),1,AP(IKM1+1),1)
  229. IMJ = IKM1 + IMAX
  230. DO 150 JJ = IMAX, KM1
  231. J = KM1 + IMAX - JJ
  232. JKM1 = IKM1 + J
  233. T = CONJG(AP(JKM1))
  234. AP(JKM1) = CONJG(AP(IMJ))
  235. AP(IMJ) = T
  236. IMJ = IMJ - (J - 1)
  237. 150 CONTINUE
  238. T = AP(KM1K)
  239. AP(KM1K) = AP(IMK)
  240. AP(IMK) = T
  241. 160 CONTINUE
  242. C
  243. C PERFORM THE ELIMINATION.
  244. C
  245. KM2 = K - 2
  246. IF (KM2 .EQ. 0) GO TO 180
  247. AK = AP(KK)/AP(KM1K)
  248. KM1KM1 = IKM1 + K - 1
  249. AKM1 = AP(KM1KM1)/CONJG(AP(KM1K))
  250. DENOM = 1.0E0 - AK*AKM1
  251. IJ = IK - (K - 1) - (K - 2)
  252. DO 170 JJ = 1, KM2
  253. J = KM1 - JJ
  254. JK = IK + J
  255. BK = AP(JK)/AP(KM1K)
  256. JKM1 = IKM1 + J
  257. BKM1 = AP(JKM1)/CONJG(AP(KM1K))
  258. MULK = (AKM1*BK - BKM1)/DENOM
  259. MULKM1 = (AK*BKM1 - BK)/DENOM
  260. T = CONJG(MULK)
  261. CALL CAXPY(J,T,AP(IK+1),1,AP(IJ+1),1)
  262. T = CONJG(MULKM1)
  263. CALL CAXPY(J,T,AP(IKM1+1),1,AP(IJ+1),1)
  264. AP(JK) = MULK
  265. AP(JKM1) = MULKM1
  266. IJJ = IJ + J
  267. AP(IJJ) = CMPLX(REAL(AP(IJJ)),0.0E0)
  268. IJ = IJ - (J - 1)
  269. 170 CONTINUE
  270. 180 CONTINUE
  271. C
  272. C SET THE PIVOT ARRAY.
  273. C
  274. KPVT(K) = 1 - K
  275. IF (SWAP) KPVT(K) = -IMAX
  276. KPVT(K-1) = KPVT(K)
  277. 190 CONTINUE
  278. IK = IK - (K - 1)
  279. IF (KSTEP .EQ. 2) IK = IK - (K - 2)
  280. K = K - KSTEP
  281. GO TO 10
  282. 200 CONTINUE
  283. RETURN
  284. END