ctrco.f 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. *DECK CTRCO
  2. SUBROUTINE CTRCO (T, LDT, N, RCOND, Z, JOB)
  3. C***BEGIN PROLOGUE CTRCO
  4. C***PURPOSE Estimate the condition number of a triangular matrix.
  5. C***LIBRARY SLATEC (LINPACK)
  6. C***CATEGORY D2C3
  7. C***TYPE COMPLEX (STRCO-S, DTRCO-D, CTRCO-C)
  8. C***KEYWORDS CONDITION NUMBER, LINEAR ALGEBRA, LINPACK,
  9. C TRIANGULAR MATRIX
  10. C***AUTHOR Moler, C. B., (U. of New Mexico)
  11. C***DESCRIPTION
  12. C
  13. C CTRCO estimates the condition of a complex triangular matrix.
  14. C
  15. C On Entry
  16. C
  17. C T COMPLEX(LDT,N)
  18. C T contains the triangular matrix. The zero
  19. C elements of the matrix are not referenced, and
  20. C the corresponding elements of the array can be
  21. C used to store other information.
  22. C
  23. C LDT INTEGER
  24. C LDT is the leading dimension of the array T.
  25. C
  26. C N INTEGER
  27. C N is the order of the system.
  28. C
  29. C JOB INTEGER
  30. C = 0 T is lower triangular.
  31. C = nonzero T is upper triangular.
  32. C
  33. C On Return
  34. C
  35. C RCOND REAL
  36. C an estimate of the reciprocal condition of T .
  37. C For the system T*X = B , relative perturbations
  38. C in T and B of size EPSILON may cause
  39. C relative perturbations in X of size EPSILON/RCOND .
  40. C If RCOND is so small that the logical expression
  41. C 1.0 + RCOND .EQ. 1.0
  42. C is true, then T may be singular to working
  43. C precision. In particular, RCOND is zero if
  44. C exact singularity is detected or the estimate
  45. C underflows.
  46. C
  47. C Z COMPLEX(N)
  48. C a work vector whose contents are usually unimportant.
  49. C If T is close to a singular matrix, then Z is
  50. C an approximate null vector in the sense that
  51. C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
  52. C
  53. C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
  54. C Stewart, LINPACK Users' Guide, SIAM, 1979.
  55. C***ROUTINES CALLED CAXPY, CSSCAL, SCASUM
  56. C***REVISION HISTORY (YYMMDD)
  57. C 780814 DATE WRITTEN
  58. C 890531 Changed all specific intrinsics to generic. (WRB)
  59. C 890831 Modified array declarations. (WRB)
  60. C 890831 REVISION DATE from Version 3.2
  61. C 891214 Prologue converted to Version 4.0 format. (BAB)
  62. C 900326 Removed duplicate information from DESCRIPTION section.
  63. C (WRB)
  64. C 920501 Reformatted the REFERENCES section. (WRB)
  65. C***END PROLOGUE CTRCO
  66. INTEGER LDT,N,JOB
  67. COMPLEX T(LDT,*),Z(*)
  68. REAL RCOND
  69. C
  70. COMPLEX W,WK,WKM,EK
  71. REAL TNORM,YNORM,S,SM,SCASUM
  72. INTEGER I1,J,J1,J2,K,KK,L
  73. LOGICAL LOWER
  74. COMPLEX ZDUM,ZDUM1,ZDUM2,CSIGN1
  75. REAL CABS1
  76. CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
  77. CSIGN1(ZDUM1,ZDUM2) = CABS1(ZDUM1)*(ZDUM2/CABS1(ZDUM2))
  78. C
  79. C***FIRST EXECUTABLE STATEMENT CTRCO
  80. LOWER = JOB .EQ. 0
  81. C
  82. C COMPUTE 1-NORM OF T
  83. C
  84. TNORM = 0.0E0
  85. DO 10 J = 1, N
  86. L = J
  87. IF (LOWER) L = N + 1 - J
  88. I1 = 1
  89. IF (LOWER) I1 = J
  90. TNORM = MAX(TNORM,SCASUM(L,T(I1,J),1))
  91. 10 CONTINUE
  92. C
  93. C RCOND = 1/(NORM(T)*(ESTIMATE OF NORM(INVERSE(T)))) .
  94. C ESTIMATE = NORM(Z)/NORM(Y) WHERE T*Z = Y AND CTRANS(T)*Y = E .
  95. C CTRANS(T) IS THE CONJUGATE TRANSPOSE OF T .
  96. C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL
  97. C GROWTH IN THE ELEMENTS OF Y .
  98. C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
  99. C
  100. C SOLVE CTRANS(T)*Y = E
  101. C
  102. EK = (1.0E0,0.0E0)
  103. DO 20 J = 1, N
  104. Z(J) = (0.0E0,0.0E0)
  105. 20 CONTINUE
  106. DO 100 KK = 1, N
  107. K = KK
  108. IF (LOWER) K = N + 1 - KK
  109. IF (CABS1(Z(K)) .NE. 0.0E0) EK = CSIGN1(EK,-Z(K))
  110. IF (CABS1(EK-Z(K)) .LE. CABS1(T(K,K))) GO TO 30
  111. S = CABS1(T(K,K))/CABS1(EK-Z(K))
  112. CALL CSSCAL(N,S,Z,1)
  113. EK = CMPLX(S,0.0E0)*EK
  114. 30 CONTINUE
  115. WK = EK - Z(K)
  116. WKM = -EK - Z(K)
  117. S = CABS1(WK)
  118. SM = CABS1(WKM)
  119. IF (CABS1(T(K,K)) .EQ. 0.0E0) GO TO 40
  120. WK = WK/CONJG(T(K,K))
  121. WKM = WKM/CONJG(T(K,K))
  122. GO TO 50
  123. 40 CONTINUE
  124. WK = (1.0E0,0.0E0)
  125. WKM = (1.0E0,0.0E0)
  126. 50 CONTINUE
  127. IF (KK .EQ. N) GO TO 90
  128. J1 = K + 1
  129. IF (LOWER) J1 = 1
  130. J2 = N
  131. IF (LOWER) J2 = K - 1
  132. DO 60 J = J1, J2
  133. SM = SM + CABS1(Z(J)+WKM*CONJG(T(K,J)))
  134. Z(J) = Z(J) + WK*CONJG(T(K,J))
  135. S = S + CABS1(Z(J))
  136. 60 CONTINUE
  137. IF (S .GE. SM) GO TO 80
  138. W = WKM - WK
  139. WK = WKM
  140. DO 70 J = J1, J2
  141. Z(J) = Z(J) + W*CONJG(T(K,J))
  142. 70 CONTINUE
  143. 80 CONTINUE
  144. 90 CONTINUE
  145. Z(K) = WK
  146. 100 CONTINUE
  147. S = 1.0E0/SCASUM(N,Z,1)
  148. CALL CSSCAL(N,S,Z,1)
  149. C
  150. YNORM = 1.0E0
  151. C
  152. C SOLVE T*Z = Y
  153. C
  154. DO 130 KK = 1, N
  155. K = N + 1 - KK
  156. IF (LOWER) K = KK
  157. IF (CABS1(Z(K)) .LE. CABS1(T(K,K))) GO TO 110
  158. S = CABS1(T(K,K))/CABS1(Z(K))
  159. CALL CSSCAL(N,S,Z,1)
  160. YNORM = S*YNORM
  161. 110 CONTINUE
  162. IF (CABS1(T(K,K)) .NE. 0.0E0) Z(K) = Z(K)/T(K,K)
  163. IF (CABS1(T(K,K)) .EQ. 0.0E0) Z(K) = (1.0E0,0.0E0)
  164. I1 = 1
  165. IF (LOWER) I1 = K + 1
  166. IF (KK .GE. N) GO TO 120
  167. W = -Z(K)
  168. CALL CAXPY(N-KK,W,T(I1,K),1,Z(I1),1)
  169. 120 CONTINUE
  170. 130 CONTINUE
  171. C MAKE ZNORM = 1.0
  172. S = 1.0E0/SCASUM(N,Z,1)
  173. CALL CSSCAL(N,S,Z,1)
  174. YNORM = S*YNORM
  175. C
  176. IF (TNORM .NE. 0.0E0) RCOND = YNORM/TNORM
  177. IF (TNORM .EQ. 0.0E0) RCOND = 0.0E0
  178. RETURN
  179. END