cmptrx.f 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. *DECK CMPTRX
  2. SUBROUTINE CMPTRX (IDEGBR, IDEGCR, M, A, B, C, Y, TCOS, D, W)
  3. C***BEGIN PROLOGUE CMPTRX
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to CMGNBN
  6. C***LIBRARY SLATEC
  7. C***TYPE COMPLEX (TRIX-S, CMPTRX-C)
  8. C***AUTHOR (UNKNOWN)
  9. C***DESCRIPTION
  10. C
  11. C Subroutine to solve a system of linear equations where the
  12. C coefficient matrix is a rational function in the matrix given by
  13. C tridiagonal ( . . . , A(I), B(I), C(I), . . . ).
  14. C
  15. C***SEE ALSO CMGNBN
  16. C***ROUTINES CALLED (NONE)
  17. C***REVISION HISTORY (YYMMDD)
  18. C 801001 DATE WRITTEN
  19. C 890531 Changed all specific intrinsics to generic. (WRB)
  20. C 890531 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 CMPTRX
  24. C
  25. COMPLEX A ,B ,C ,Y ,
  26. 1 TCOS ,D ,W ,X ,
  27. 2 XX ,Z
  28. DIMENSION A(*) ,B(*) ,C(*) ,Y(*) ,
  29. 1 TCOS(*) ,D(*) ,W(*)
  30. INTEGER KB, KC
  31. C***FIRST EXECUTABLE STATEMENT CMPTRX
  32. MM1 = M-1
  33. KB = IDEGBR+1
  34. KC = IDEGCR+1
  35. L = KB/KC
  36. LINT = 1
  37. DO 108 K=1,IDEGBR
  38. X = TCOS(K)
  39. IF (K .NE. L) GO TO 102
  40. I = IDEGBR+LINT
  41. XX = X-TCOS(I)
  42. DO 101 I=1,M
  43. W(I) = Y(I)
  44. Y(I) = XX*Y(I)
  45. 101 CONTINUE
  46. 102 CONTINUE
  47. Z = 1./(B(1)-X)
  48. D(1) = C(1)*Z
  49. Y(1) = Y(1)*Z
  50. DO 103 I=2,MM1
  51. Z = 1./(B(I)-X-A(I)*D(I-1))
  52. D(I) = C(I)*Z
  53. Y(I) = (Y(I)-A(I)*Y(I-1))*Z
  54. 103 CONTINUE
  55. Z = B(M)-X-A(M)*D(MM1)
  56. IF (ABS(Z) .NE. 0.) GO TO 104
  57. Y(M) = (0.,0.)
  58. GO TO 105
  59. 104 Y(M) = (Y(M)-A(M)*Y(MM1))/Z
  60. 105 CONTINUE
  61. DO 106 IP=1,MM1
  62. I = M-IP
  63. Y(I) = Y(I)-D(I)*Y(I+1)
  64. 106 CONTINUE
  65. IF (K .NE. L) GO TO 108
  66. DO 107 I=1,M
  67. Y(I) = Y(I)+W(I)
  68. 107 CONTINUE
  69. LINT = LINT+1
  70. L = (LINT*KB)/KC
  71. 108 CONTINUE
  72. RETURN
  73. END