chisl.f 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. *DECK CHISL
  2. SUBROUTINE CHISL (A, LDA, N, KPVT, B)
  3. C***BEGIN PROLOGUE CHISL
  4. C***PURPOSE Solve the complex Hermitian system using factors obtained
  5. C from CHIFA.
  6. C***LIBRARY SLATEC (LINPACK)
  7. C***CATEGORY D2D1A
  8. C***TYPE COMPLEX (SSISL-S, DSISL-D, CHISL-C, CSISL-C)
  9. C***KEYWORDS HERMITIAN, LINEAR ALGEBRA, LINPACK, MATRIX, SOLVE
  10. C***AUTHOR Bunch, J., (UCSD)
  11. C***DESCRIPTION
  12. C
  13. C CHISL solves the complex Hermitian system
  14. C A * X = B
  15. C using the factors computed by CHIFA.
  16. C
  17. C On Entry
  18. C
  19. C A COMPLEX(LDA,N)
  20. C the output from CHIFA.
  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 CHIFA.
  30. C
  31. C B COMPLEX(N)
  32. C the right hand side vector.
  33. C
  34. C On Return
  35. C
  36. C B the solution vector X .
  37. C
  38. C Error Condition
  39. C
  40. C A division by zero may occur if CHICO has set RCOND .EQ. 0.0
  41. C or CHIFA has set INFO .NE. 0 .
  42. C
  43. C To compute INVERSE(A) * C where C is a matrix
  44. C with P columns
  45. C CALL CHIFA(A,LDA,N,KVPT,INFO)
  46. C IF (INFO .NE. 0) GO TO ...
  47. C DO 10 J = 1, p
  48. C CALL CHISL(A,LDA,N,KVPT,C(1,J))
  49. C 10 CONTINUE
  50. C
  51. C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
  52. C Stewart, LINPACK Users' Guide, SIAM, 1979.
  53. C***ROUTINES CALLED CAXPY, CDOTC
  54. C***REVISION HISTORY (YYMMDD)
  55. C 780814 DATE WRITTEN
  56. C 890531 Changed all specific intrinsics to generic. (WRB)
  57. C 890831 Modified array declarations. (WRB)
  58. C 891107 Modified routine equivalence list. (WRB)
  59. C 891107 REVISION DATE from Version 3.2
  60. C 891214 Prologue converted to Version 4.0 format. (BAB)
  61. C 900326 Removed duplicate information from DESCRIPTION section.
  62. C (WRB)
  63. C 920501 Reformatted the REFERENCES section. (WRB)
  64. C***END PROLOGUE CHISL
  65. INTEGER LDA,N,KPVT(*)
  66. COMPLEX A(LDA,*),B(*)
  67. C
  68. COMPLEX AK,AKM1,BK,BKM1,CDOTC,DENOM,TEMP
  69. INTEGER K,KP
  70. C
  71. C LOOP BACKWARD APPLYING THE TRANSFORMATIONS AND
  72. C D INVERSE TO B.
  73. C
  74. C***FIRST EXECUTABLE STATEMENT CHISL
  75. K = N
  76. 10 IF (K .EQ. 0) GO TO 80
  77. IF (KPVT(K) .LT. 0) GO TO 40
  78. C
  79. C 1 X 1 PIVOT BLOCK.
  80. C
  81. IF (K .EQ. 1) GO TO 30
  82. KP = KPVT(K)
  83. IF (KP .EQ. K) GO TO 20
  84. C
  85. C INTERCHANGE.
  86. C
  87. TEMP = B(K)
  88. B(K) = B(KP)
  89. B(KP) = TEMP
  90. 20 CONTINUE
  91. C
  92. C APPLY THE TRANSFORMATION.
  93. C
  94. CALL CAXPY(K-1,B(K),A(1,K),1,B(1),1)
  95. 30 CONTINUE
  96. C
  97. C APPLY D INVERSE.
  98. C
  99. B(K) = B(K)/A(K,K)
  100. K = K - 1
  101. GO TO 70
  102. 40 CONTINUE
  103. C
  104. C 2 X 2 PIVOT BLOCK.
  105. C
  106. IF (K .EQ. 2) GO TO 60
  107. KP = ABS(KPVT(K))
  108. IF (KP .EQ. K - 1) GO TO 50
  109. C
  110. C INTERCHANGE.
  111. C
  112. TEMP = B(K-1)
  113. B(K-1) = B(KP)
  114. B(KP) = TEMP
  115. 50 CONTINUE
  116. C
  117. C APPLY THE TRANSFORMATION.
  118. C
  119. CALL CAXPY(K-2,B(K),A(1,K),1,B(1),1)
  120. CALL CAXPY(K-2,B(K-1),A(1,K-1),1,B(1),1)
  121. 60 CONTINUE
  122. C
  123. C APPLY D INVERSE.
  124. C
  125. AK = A(K,K)/CONJG(A(K-1,K))
  126. AKM1 = A(K-1,K-1)/A(K-1,K)
  127. BK = B(K)/CONJG(A(K-1,K))
  128. BKM1 = B(K-1)/A(K-1,K)
  129. DENOM = AK*AKM1 - 1.0E0
  130. B(K) = (AKM1*BK - BKM1)/DENOM
  131. B(K-1) = (AK*BKM1 - BK)/DENOM
  132. K = K - 2
  133. 70 CONTINUE
  134. GO TO 10
  135. 80 CONTINUE
  136. C
  137. C LOOP FORWARD APPLYING THE TRANSFORMATIONS.
  138. C
  139. K = 1
  140. 90 IF (K .GT. N) GO TO 160
  141. IF (KPVT(K) .LT. 0) GO TO 120
  142. C
  143. C 1 X 1 PIVOT BLOCK.
  144. C
  145. IF (K .EQ. 1) GO TO 110
  146. C
  147. C APPLY THE TRANSFORMATION.
  148. C
  149. B(K) = B(K) + CDOTC(K-1,A(1,K),1,B(1),1)
  150. KP = KPVT(K)
  151. IF (KP .EQ. K) GO TO 100
  152. C
  153. C INTERCHANGE.
  154. C
  155. TEMP = B(K)
  156. B(K) = B(KP)
  157. B(KP) = TEMP
  158. 100 CONTINUE
  159. 110 CONTINUE
  160. K = K + 1
  161. GO TO 150
  162. 120 CONTINUE
  163. C
  164. C 2 X 2 PIVOT BLOCK.
  165. C
  166. IF (K .EQ. 1) GO TO 140
  167. C
  168. C APPLY THE TRANSFORMATION.
  169. C
  170. B(K) = B(K) + CDOTC(K-1,A(1,K),1,B(1),1)
  171. B(K+1) = B(K+1) + CDOTC(K-1,A(1,K+1),1,B(1),1)
  172. KP = ABS(KPVT(K))
  173. IF (KP .EQ. K) GO TO 130
  174. C
  175. C INTERCHANGE.
  176. C
  177. TEMP = B(K)
  178. B(K) = B(KP)
  179. B(KP) = TEMP
  180. 130 CONTINUE
  181. 140 CONTINUE
  182. K = K + 2
  183. 150 CONTINUE
  184. GO TO 90
  185. 160 CONTINUE
  186. RETURN
  187. END