cptsl.f 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. *DECK CPTSL
  2. SUBROUTINE CPTSL (N, D, E, B)
  3. C***BEGIN PROLOGUE CPTSL
  4. C***PURPOSE Solve a positive definite tridiagonal linear system.
  5. C***LIBRARY SLATEC (LINPACK)
  6. C***CATEGORY D2D2A
  7. C***TYPE COMPLEX (SPTSL-S, DPTSL-D, CPTSL-C)
  8. C***KEYWORDS LINEAR ALGEBRA, LINPACK, MATRIX, POSITIVE DEFINITE, SOLVE,
  9. C TRIDIAGONAL
  10. C***AUTHOR Dongarra, J., (ANL)
  11. C***DESCRIPTION
  12. C
  13. C CPTSL given a positive definite tridiagonal matrix and a right
  14. C hand side will find the solution.
  15. C
  16. C On Entry
  17. C
  18. C N INTEGER
  19. C is the order of the tridiagonal matrix.
  20. C
  21. C D COMPLEX(N)
  22. C is the diagonal of the tridiagonal matrix.
  23. C On output D is destroyed.
  24. C
  25. C E COMPLEX(N)
  26. C is the offdiagonal of the tridiagonal matrix.
  27. C E(1) through E(N-1) should contain the
  28. C offdiagonal.
  29. C
  30. C B COMPLEX(N)
  31. C is the right hand side vector.
  32. C
  33. C On Return
  34. C
  35. C B contains the solution.
  36. C
  37. C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
  38. C Stewart, LINPACK Users' Guide, SIAM, 1979.
  39. C***ROUTINES CALLED (NONE)
  40. C***REVISION HISTORY (YYMMDD)
  41. C 780814 DATE WRITTEN
  42. C 890505 REVISION DATE from Version 3.2
  43. C 891214 Prologue converted to Version 4.0 format. (BAB)
  44. C 900326 Removed duplicate information from DESCRIPTION section.
  45. C (WRB)
  46. C 920501 Reformatted the REFERENCES section. (WRB)
  47. C***END PROLOGUE CPTSL
  48. INTEGER N
  49. COMPLEX D(*),E(*),B(*)
  50. C
  51. INTEGER K,KBM1,KE,KF,KP1,NM1,NM1D2
  52. COMPLEX T1,T2
  53. C
  54. C CHECK FOR 1 X 1 CASE
  55. C
  56. C***FIRST EXECUTABLE STATEMENT CPTSL
  57. IF (N .NE. 1) GO TO 10
  58. B(1) = B(1)/D(1)
  59. GO TO 70
  60. 10 CONTINUE
  61. NM1 = N - 1
  62. NM1D2 = NM1/2
  63. IF (N .EQ. 2) GO TO 30
  64. KBM1 = N - 1
  65. C
  66. C ZERO TOP HALF OF SUBDIAGONAL AND BOTTOM HALF OF
  67. C SUPERDIAGONAL
  68. C
  69. DO 20 K = 1, NM1D2
  70. T1 = CONJG(E(K))/D(K)
  71. D(K+1) = D(K+1) - T1*E(K)
  72. B(K+1) = B(K+1) - T1*B(K)
  73. T2 = E(KBM1)/D(KBM1+1)
  74. D(KBM1) = D(KBM1) - T2*CONJG(E(KBM1))
  75. B(KBM1) = B(KBM1) - T2*B(KBM1+1)
  76. KBM1 = KBM1 - 1
  77. 20 CONTINUE
  78. 30 CONTINUE
  79. KP1 = NM1D2 + 1
  80. C
  81. C CLEAN UP FOR POSSIBLE 2 X 2 BLOCK AT CENTER
  82. C
  83. IF (MOD(N,2) .NE. 0) GO TO 40
  84. T1 = CONJG(E(KP1))/D(KP1)
  85. D(KP1+1) = D(KP1+1) - T1*E(KP1)
  86. B(KP1+1) = B(KP1+1) - T1*B(KP1)
  87. KP1 = KP1 + 1
  88. 40 CONTINUE
  89. C
  90. C BACK SOLVE STARTING AT THE CENTER, GOING TOWARDS THE TOP
  91. C AND BOTTOM
  92. C
  93. B(KP1) = B(KP1)/D(KP1)
  94. IF (N .EQ. 2) GO TO 60
  95. K = KP1 - 1
  96. KE = KP1 + NM1D2 - 1
  97. DO 50 KF = KP1, KE
  98. B(K) = (B(K) - E(K)*B(K+1))/D(K)
  99. B(KF+1) = (B(KF+1) - CONJG(E(KF))*B(KF))/D(KF+1)
  100. K = K - 1
  101. 50 CONTINUE
  102. 60 CONTINUE
  103. IF (MOD(N,2) .EQ. 0) B(1) = (B(1) - E(1)*B(2))/D(1)
  104. 70 CONTINUE
  105. RETURN
  106. END