cgtsl.f 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. *DECK CGTSL
  2. SUBROUTINE CGTSL (N, C, D, E, B, INFO)
  3. C***BEGIN PROLOGUE CGTSL
  4. C***PURPOSE Solve a tridiagonal linear system.
  5. C***LIBRARY SLATEC (LINPACK)
  6. C***CATEGORY D2C2A
  7. C***TYPE COMPLEX (SGTSL-S, DGTSL-D, CGTSL-C)
  8. C***KEYWORDS LINEAR ALGEBRA, LINPACK, MATRIX, SOLVE, TRIDIAGONAL
  9. C***AUTHOR Dongarra, J., (ANL)
  10. C***DESCRIPTION
  11. C
  12. C CGTSL given a general tridiagonal matrix and a right hand
  13. C side will find the solution.
  14. C
  15. C On Entry
  16. C
  17. C N INTEGER
  18. C is the order of the tridiagonal matrix.
  19. C
  20. C C COMPLEX(N)
  21. C is the subdiagonal of the tridiagonal matrix.
  22. C C(2) through C(N) should contain the subdiagonal.
  23. C On output C is destroyed.
  24. C
  25. C D COMPLEX(N)
  26. C is the diagonal of the tridiagonal matrix.
  27. C On output D is destroyed.
  28. C
  29. C E COMPLEX(N)
  30. C is the superdiagonal of the tridiagonal matrix.
  31. C E(1) through E(N-1) should contain the superdiagonal.
  32. C On output E is destroyed.
  33. C
  34. C B COMPLEX(N)
  35. C is the right hand side vector.
  36. C
  37. C On Return
  38. C
  39. C B is the solution vector.
  40. C
  41. C INFO INTEGER
  42. C = 0 normal value.
  43. C = K if the K-th element of the diagonal becomes
  44. C exactly zero. The subroutine returns when
  45. C this is detected.
  46. C
  47. C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
  48. C Stewart, LINPACK Users' Guide, SIAM, 1979.
  49. C***ROUTINES CALLED (NONE)
  50. C***REVISION HISTORY (YYMMDD)
  51. C 780814 DATE WRITTEN
  52. C 890831 Modified array declarations. (WRB)
  53. C 890831 REVISION DATE from Version 3.2
  54. C 891214 Prologue converted to Version 4.0 format. (BAB)
  55. C 900326 Removed duplicate information from DESCRIPTION section.
  56. C (WRB)
  57. C 920501 Reformatted the REFERENCES section. (WRB)
  58. C***END PROLOGUE CGTSL
  59. INTEGER N,INFO
  60. COMPLEX C(*),D(*),E(*),B(*)
  61. C
  62. INTEGER K,KB,KP1,NM1,NM2
  63. COMPLEX T
  64. COMPLEX ZDUM
  65. REAL CABS1
  66. CABS1(ZDUM) = ABS(REAL(ZDUM)) + ABS(AIMAG(ZDUM))
  67. C***FIRST EXECUTABLE STATEMENT CGTSL
  68. INFO = 0
  69. C(1) = D(1)
  70. NM1 = N - 1
  71. IF (NM1 .LT. 1) GO TO 40
  72. D(1) = E(1)
  73. E(1) = (0.0E0,0.0E0)
  74. E(N) = (0.0E0,0.0E0)
  75. C
  76. DO 30 K = 1, NM1
  77. KP1 = K + 1
  78. C
  79. C FIND THE LARGEST OF THE TWO ROWS
  80. C
  81. IF (CABS1(C(KP1)) .LT. CABS1(C(K))) GO TO 10
  82. C
  83. C INTERCHANGE ROW
  84. C
  85. T = C(KP1)
  86. C(KP1) = C(K)
  87. C(K) = T
  88. T = D(KP1)
  89. D(KP1) = D(K)
  90. D(K) = T
  91. T = E(KP1)
  92. E(KP1) = E(K)
  93. E(K) = T
  94. T = B(KP1)
  95. B(KP1) = B(K)
  96. B(K) = T
  97. 10 CONTINUE
  98. C
  99. C ZERO ELEMENTS
  100. C
  101. IF (CABS1(C(K)) .NE. 0.0E0) GO TO 20
  102. INFO = K
  103. GO TO 100
  104. 20 CONTINUE
  105. T = -C(KP1)/C(K)
  106. C(KP1) = D(KP1) + T*D(K)
  107. D(KP1) = E(KP1) + T*E(K)
  108. E(KP1) = (0.0E0,0.0E0)
  109. B(KP1) = B(KP1) + T*B(K)
  110. 30 CONTINUE
  111. 40 CONTINUE
  112. IF (CABS1(C(N)) .NE. 0.0E0) GO TO 50
  113. INFO = N
  114. GO TO 90
  115. 50 CONTINUE
  116. C
  117. C BACK SOLVE
  118. C
  119. NM2 = N - 2
  120. B(N) = B(N)/C(N)
  121. IF (N .EQ. 1) GO TO 80
  122. B(NM1) = (B(NM1) - D(NM1)*B(N))/C(NM1)
  123. IF (NM2 .LT. 1) GO TO 70
  124. DO 60 KB = 1, NM2
  125. K = NM2 - KB + 1
  126. B(K) = (B(K) - D(K)*B(K+1) - E(K)*B(K+2))/C(K)
  127. 60 CONTINUE
  128. 70 CONTINUE
  129. 80 CONTINUE
  130. 90 CONTINUE
  131. 100 CONTINUE
  132. C
  133. RETURN
  134. END