tri3.f 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. *DECK TRI3
  2. SUBROUTINE TRI3 (M, A, B, C, K, Y1, Y2, Y3, TCOS, D, W1, W2, W3)
  3. C***BEGIN PROLOGUE TRI3
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to GENBUN
  6. C***LIBRARY SLATEC
  7. C***TYPE SINGLE PRECISION (TRI3-S, CMPTR3-C)
  8. C***AUTHOR (UNKNOWN)
  9. C***DESCRIPTION
  10. C
  11. C Subroutine to solve three linear systems whose common coefficient
  12. C matrix is a rational function in the matrix given by
  13. C
  14. C TRIDIAGONAL (...,A(I),B(I),C(I),...)
  15. C
  16. C***SEE ALSO GENBUN
  17. C***ROUTINES CALLED (NONE)
  18. C***REVISION HISTORY (YYMMDD)
  19. C 801001 DATE WRITTEN
  20. C 890206 REVISION DATE from Version 3.2
  21. C 891214 Prologue converted to Version 4.0 format. (BAB)
  22. C 900402 Added TYPE section. (WRB)
  23. C***END PROLOGUE TRI3
  24. DIMENSION A(*) ,B(*) ,C(*) ,K(4) ,
  25. 1 TCOS(*) ,Y1(*) ,Y2(*) ,Y3(*) ,
  26. 2 D(*) ,W1(*) ,W2(*) ,W3(*)
  27. INTEGER K1P1, K2P1, K3P1, K4P1
  28. C
  29. C***FIRST EXECUTABLE STATEMENT TRI3
  30. MM1 = M-1
  31. K1 = K(1)
  32. K2 = K(2)
  33. K3 = K(3)
  34. K4 = K(4)
  35. K1P1 = K1+1
  36. K2P1 = K2+1
  37. K3P1 = K3+1
  38. K4P1 = K4+1
  39. K2K3K4 = K2+K3+K4
  40. IF (K2K3K4 .EQ. 0) GO TO 101
  41. L1 = (K1+1)/(K2+1)
  42. L2 = (K1+1)/(K3+1)
  43. L3 = (K1+1)/(K4+1)
  44. LINT1 = 1
  45. LINT2 = 1
  46. LINT3 = 1
  47. KINT1 = K1
  48. KINT2 = KINT1+K2
  49. KINT3 = KINT2+K3
  50. 101 CONTINUE
  51. DO 115 N=1,K1
  52. X = TCOS(N)
  53. IF (K2K3K4 .EQ. 0) GO TO 107
  54. IF (N .NE. L1) GO TO 103
  55. DO 102 I=1,M
  56. W1(I) = Y1(I)
  57. 102 CONTINUE
  58. 103 IF (N .NE. L2) GO TO 105
  59. DO 104 I=1,M
  60. W2(I) = Y2(I)
  61. 104 CONTINUE
  62. 105 IF (N .NE. L3) GO TO 107
  63. DO 106 I=1,M
  64. W3(I) = Y3(I)
  65. 106 CONTINUE
  66. 107 CONTINUE
  67. Z = 1./(B(1)-X)
  68. D(1) = C(1)*Z
  69. Y1(1) = Y1(1)*Z
  70. Y2(1) = Y2(1)*Z
  71. Y3(1) = Y3(1)*Z
  72. DO 108 I=2,M
  73. Z = 1./(B(I)-X-A(I)*D(I-1))
  74. D(I) = C(I)*Z
  75. Y1(I) = (Y1(I)-A(I)*Y1(I-1))*Z
  76. Y2(I) = (Y2(I)-A(I)*Y2(I-1))*Z
  77. Y3(I) = (Y3(I)-A(I)*Y3(I-1))*Z
  78. 108 CONTINUE
  79. DO 109 IP=1,MM1
  80. I = M-IP
  81. Y1(I) = Y1(I)-D(I)*Y1(I+1)
  82. Y2(I) = Y2(I)-D(I)*Y2(I+1)
  83. Y3(I) = Y3(I)-D(I)*Y3(I+1)
  84. 109 CONTINUE
  85. IF (K2K3K4 .EQ. 0) GO TO 115
  86. IF (N .NE. L1) GO TO 111
  87. I = LINT1+KINT1
  88. XX = X-TCOS(I)
  89. DO 110 I=1,M
  90. Y1(I) = XX*Y1(I)+W1(I)
  91. 110 CONTINUE
  92. LINT1 = LINT1+1
  93. L1 = (LINT1*K1P1)/K2P1
  94. 111 IF (N .NE. L2) GO TO 113
  95. I = LINT2+KINT2
  96. XX = X-TCOS(I)
  97. DO 112 I=1,M
  98. Y2(I) = XX*Y2(I)+W2(I)
  99. 112 CONTINUE
  100. LINT2 = LINT2+1
  101. L2 = (LINT2*K1P1)/K3P1
  102. 113 IF (N .NE. L3) GO TO 115
  103. I = LINT3+KINT3
  104. XX = X-TCOS(I)
  105. DO 114 I=1,M
  106. Y3(I) = XX*Y3(I)+W3(I)
  107. 114 CONTINUE
  108. LINT3 = LINT3+1
  109. L3 = (LINT3*K1P1)/K4P1
  110. 115 CONTINUE
  111. RETURN
  112. END