cgedi.f 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. *DECK CGEDI
  2. SUBROUTINE CGEDI (A, LDA, N, IPVT, DET, WORK, JOB)
  3. C***BEGIN PROLOGUE CGEDI
  4. C***PURPOSE Compute the determinant and inverse of a matrix using the
  5. C factors computed by CGECO or CGEFA.
  6. C***LIBRARY SLATEC (LINPACK)
  7. C***CATEGORY D2C1, D3C1
  8. C***TYPE COMPLEX (SGEDI-S, DGEDI-D, CGEDI-C)
  9. C***KEYWORDS DETERMINANT, INVERSE, LINEAR ALGEBRA, LINPACK, MATRIX
  10. C***AUTHOR Moler, C. B., (U. of New Mexico)
  11. C***DESCRIPTION
  12. C
  13. C CGEDI computes the determinant and inverse of a matrix
  14. C using the factors computed by CGECO or CGEFA.
  15. C
  16. C On Entry
  17. C
  18. C A COMPLEX(LDA, N)
  19. C the output from CGECO or CGEFA.
  20. C
  21. C LDA INTEGER
  22. C the leading dimension of the array A .
  23. C
  24. C N INTEGER
  25. C the order of the matrix A .
  26. C
  27. C IPVT INTEGER(N)
  28. C the pivot vector from CGECO or CGEFA.
  29. C
  30. C WORK COMPLEX(N)
  31. C work vector. Contents destroyed.
  32. C
  33. C JOB INTEGER
  34. C = 11 both determinant and inverse.
  35. C = 01 inverse only.
  36. C = 10 determinant only.
  37. C
  38. C On Return
  39. C
  40. C A inverse of original matrix if requested.
  41. C Otherwise unchanged.
  42. C
  43. C DET COMPLEX(2)
  44. C determinant of original matrix if requested.
  45. C Otherwise not referenced.
  46. C Determinant = DET(1) * 10.0**DET(2)
  47. C with 1.0 .LE. CABS1(DET(1)) .LT. 10.0
  48. C or DET(1) .EQ. 0.0 .
  49. C
  50. C Error Condition
  51. C
  52. C A division by zero will occur if the input factor contains
  53. C a zero on the diagonal and the inverse is requested.
  54. C It will not occur if the subroutines are called correctly
  55. C and if CGECO has set RCOND .GT. 0.0 or CGEFA has set
  56. C INFO .EQ. 0 .
  57. C
  58. C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
  59. C Stewart, LINPACK Users' Guide, SIAM, 1979.
  60. C***ROUTINES CALLED CAXPY, CSCAL, CSWAP
  61. C***REVISION HISTORY (YYMMDD)
  62. C 780814 DATE WRITTEN
  63. C 890831 Modified array declarations. (WRB)
  64. C 890831 REVISION DATE from Version 3.2
  65. C 891214 Prologue converted to Version 4.0 format. (BAB)
  66. C 900326 Removed duplicate information from DESCRIPTION section.
  67. C (WRB)
  68. C 920501 Reformatted the REFERENCES section. (WRB)
  69. C***END PROLOGUE CGEDI
  70. INTEGER LDA,N,IPVT(*),JOB
  71. COMPLEX A(LDA,*),DET(2),WORK(*)
  72. C
  73. COMPLEX T
  74. REAL TEN
  75. INTEGER I,J,K,KB,KP1,L,NM1
  76. COMPLEX ZDUM
  77. REAL CABS1
  78. CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
  79. C***FIRST EXECUTABLE STATEMENT CGEDI
  80. C
  81. C COMPUTE DETERMINANT
  82. C
  83. IF (JOB/10 .EQ. 0) GO TO 70
  84. DET(1) = (1.0E0,0.0E0)
  85. DET(2) = (0.0E0,0.0E0)
  86. TEN = 10.0E0
  87. DO 50 I = 1, N
  88. IF (IPVT(I) .NE. I) DET(1) = -DET(1)
  89. DET(1) = A(I,I)*DET(1)
  90. IF (CABS1(DET(1)) .EQ. 0.0E0) GO TO 60
  91. 10 IF (CABS1(DET(1)) .GE. 1.0E0) GO TO 20
  92. DET(1) = CMPLX(TEN,0.0E0)*DET(1)
  93. DET(2) = DET(2) - (1.0E0,0.0E0)
  94. GO TO 10
  95. 20 CONTINUE
  96. 30 IF (CABS1(DET(1)) .LT. TEN) GO TO 40
  97. DET(1) = DET(1)/CMPLX(TEN,0.0E0)
  98. DET(2) = DET(2) + (1.0E0,0.0E0)
  99. GO TO 30
  100. 40 CONTINUE
  101. 50 CONTINUE
  102. 60 CONTINUE
  103. 70 CONTINUE
  104. C
  105. C COMPUTE INVERSE(U)
  106. C
  107. IF (MOD(JOB,10) .EQ. 0) GO TO 150
  108. DO 100 K = 1, N
  109. A(K,K) = (1.0E0,0.0E0)/A(K,K)
  110. T = -A(K,K)
  111. CALL CSCAL(K-1,T,A(1,K),1)
  112. KP1 = K + 1
  113. IF (N .LT. KP1) GO TO 90
  114. DO 80 J = KP1, N
  115. T = A(K,J)
  116. A(K,J) = (0.0E0,0.0E0)
  117. CALL CAXPY(K,T,A(1,K),1,A(1,J),1)
  118. 80 CONTINUE
  119. 90 CONTINUE
  120. 100 CONTINUE
  121. C
  122. C FORM INVERSE(U)*INVERSE(L)
  123. C
  124. NM1 = N - 1
  125. IF (NM1 .LT. 1) GO TO 140
  126. DO 130 KB = 1, NM1
  127. K = N - KB
  128. KP1 = K + 1
  129. DO 110 I = KP1, N
  130. WORK(I) = A(I,K)
  131. A(I,K) = (0.0E0,0.0E0)
  132. 110 CONTINUE
  133. DO 120 J = KP1, N
  134. T = WORK(J)
  135. CALL CAXPY(N,T,A(1,J),1,A(1,K),1)
  136. 120 CONTINUE
  137. L = IPVT(K)
  138. IF (L .NE. K) CALL CSWAP(N,A(1,K),1,A(1,L),1)
  139. 130 CONTINUE
  140. 140 CONTINUE
  141. 150 CONTINUE
  142. RETURN
  143. END