ctrdi.f 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. *DECK CTRDI
  2. SUBROUTINE CTRDI (T, LDT, N, DET, JOB, INFO)
  3. C***BEGIN PROLOGUE CTRDI
  4. C***PURPOSE Compute the determinant and inverse of a triangular matrix.
  5. C***LIBRARY SLATEC (LINPACK)
  6. C***CATEGORY D2C3, D3C3
  7. C***TYPE COMPLEX (STRDI-S, DTRDI-D, CTRDI-C)
  8. C***KEYWORDS DETERMINANT, INVERSE, LINEAR ALGEBRA, LINPACK,
  9. C TRIANGULAR MATRIX
  10. C***AUTHOR Moler, C. B., (U. of New Mexico)
  11. C***DESCRIPTION
  12. C
  13. C CTRDI computes the determinant and inverse of a complex
  14. C triangular matrix.
  15. C
  16. C On Entry
  17. C
  18. C T COMPLEX(LDT,N)
  19. C T contains the triangular matrix. The zero
  20. C elements of the matrix are not referenced, and
  21. C the corresponding elements of the array can be
  22. C used to store other information.
  23. C
  24. C LDT INTEGER
  25. C LDT is the leading dimension of the array T.
  26. C
  27. C N INTEGER
  28. C N is the order of the system.
  29. C
  30. C JOB INTEGER
  31. C = 010 no det, inverse of lower triangular.
  32. C = 011 no det, inverse of upper triangular.
  33. C = 100 det, no inverse.
  34. C = 110 det, inverse of lower triangular.
  35. C = 111 det, inverse of upper triangular.
  36. C
  37. C On Return
  38. C
  39. C T inverse of original matrix if requested.
  40. C Otherwise unchanged.
  41. C
  42. C DET COMPLEX(2)
  43. C determinant of original matrix if requested.
  44. C Otherwise not referenced.
  45. C Determinant = DET(1) * 10.0**DET(2)
  46. C with 1.0 .LE. CABS1(DET(1)) .LT. 10.0
  47. C or DET(1) .EQ. 0.0 .
  48. C
  49. C INFO INTEGER
  50. C INFO contains zero if the system is nonsingular
  51. C and the inverse is requested.
  52. C Otherwise INFO contains the index of
  53. C a zero diagonal element of T.
  54. C
  55. C
  56. C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
  57. C Stewart, LINPACK Users' Guide, SIAM, 1979.
  58. C***ROUTINES CALLED CAXPY, CSCAL
  59. C***REVISION HISTORY (YYMMDD)
  60. C 780814 DATE WRITTEN
  61. C 890831 Modified array declarations. (WRB)
  62. C 890831 REVISION DATE from Version 3.2
  63. C 891214 Prologue converted to Version 4.0 format. (BAB)
  64. C 900326 Removed duplicate information from DESCRIPTION section.
  65. C (WRB)
  66. C 920501 Reformatted the REFERENCES section. (WRB)
  67. C***END PROLOGUE CTRDI
  68. INTEGER LDT,N,JOB,INFO
  69. COMPLEX T(LDT,*),DET(2)
  70. C
  71. COMPLEX TEMP
  72. REAL TEN
  73. INTEGER I,J,K,KB,KM1,KP1
  74. COMPLEX ZDUM
  75. REAL CABS1
  76. CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
  77. C***FIRST EXECUTABLE STATEMENT CTRDI
  78. C
  79. C COMPUTE DETERMINANT
  80. C
  81. IF (JOB/100 .EQ. 0) GO TO 70
  82. DET(1) = (1.0E0,0.0E0)
  83. DET(2) = (0.0E0,0.0E0)
  84. TEN = 10.0E0
  85. DO 50 I = 1, N
  86. DET(1) = T(I,I)*DET(1)
  87. IF (CABS1(DET(1)) .EQ. 0.0E0) GO TO 60
  88. 10 IF (CABS1(DET(1)) .GE. 1.0E0) GO TO 20
  89. DET(1) = CMPLX(TEN,0.0E0)*DET(1)
  90. DET(2) = DET(2) - (1.0E0,0.0E0)
  91. GO TO 10
  92. 20 CONTINUE
  93. 30 IF (CABS1(DET(1)) .LT. TEN) GO TO 40
  94. DET(1) = DET(1)/CMPLX(TEN,0.0E0)
  95. DET(2) = DET(2) + (1.0E0,0.0E0)
  96. GO TO 30
  97. 40 CONTINUE
  98. 50 CONTINUE
  99. 60 CONTINUE
  100. 70 CONTINUE
  101. C
  102. C COMPUTE INVERSE OF UPPER TRIANGULAR
  103. C
  104. IF (MOD(JOB/10,10) .EQ. 0) GO TO 170
  105. IF (MOD(JOB,10) .EQ. 0) GO TO 120
  106. DO 100 K = 1, N
  107. INFO = K
  108. IF (CABS1(T(K,K)) .EQ. 0.0E0) GO TO 110
  109. T(K,K) = (1.0E0,0.0E0)/T(K,K)
  110. TEMP = -T(K,K)
  111. CALL CSCAL(K-1,TEMP,T(1,K),1)
  112. KP1 = K + 1
  113. IF (N .LT. KP1) GO TO 90
  114. DO 80 J = KP1, N
  115. TEMP = T(K,J)
  116. T(K,J) = (0.0E0,0.0E0)
  117. CALL CAXPY(K,TEMP,T(1,K),1,T(1,J),1)
  118. 80 CONTINUE
  119. 90 CONTINUE
  120. 100 CONTINUE
  121. INFO = 0
  122. 110 CONTINUE
  123. GO TO 160
  124. 120 CONTINUE
  125. C
  126. C COMPUTE INVERSE OF LOWER TRIANGULAR
  127. C
  128. DO 150 KB = 1, N
  129. K = N + 1 - KB
  130. INFO = K
  131. IF (CABS1(T(K,K)) .EQ. 0.0E0) GO TO 180
  132. T(K,K) = (1.0E0,0.0E0)/T(K,K)
  133. TEMP = -T(K,K)
  134. IF (K .NE. N) CALL CSCAL(N-K,TEMP,T(K+1,K),1)
  135. KM1 = K - 1
  136. IF (KM1 .LT. 1) GO TO 140
  137. DO 130 J = 1, KM1
  138. TEMP = T(K,J)
  139. T(K,J) = (0.0E0,0.0E0)
  140. CALL CAXPY(N-K+1,TEMP,T(K,K),1,T(K,J),1)
  141. 130 CONTINUE
  142. 140 CONTINUE
  143. 150 CONTINUE
  144. INFO = 0
  145. 160 CONTINUE
  146. 170 CONTINUE
  147. 180 CONTINUE
  148. RETURN
  149. END