sgbsl.f 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. *DECK SGBSL
  2. SUBROUTINE SGBSL (ABD, LDA, N, ML, MU, IPVT, B, JOB)
  3. C***BEGIN PROLOGUE SGBSL
  4. C***PURPOSE Solve the real band system A*X=B or TRANS(A)*X=B using
  5. C the factors computed by SGBCO or SGBFA.
  6. C***LIBRARY SLATEC (LINPACK)
  7. C***CATEGORY D2A2
  8. C***TYPE SINGLE PRECISION (SGBSL-S, DGBSL-D, CGBSL-C)
  9. C***KEYWORDS BANDED, LINEAR ALGEBRA, LINPACK, MATRIX, SOLVE
  10. C***AUTHOR Moler, C. B., (U. of New Mexico)
  11. C***DESCRIPTION
  12. C
  13. C SGBSL solves the real band system
  14. C A * X = B or TRANS(A) * X = B
  15. C using the factors computed by SBGCO or SGBFA.
  16. C
  17. C On Entry
  18. C
  19. C ABD REAL(LDA, N)
  20. C the output from SBGCO or SGBFA.
  21. C
  22. C LDA INTEGER
  23. C the leading dimension of the array ABD .
  24. C
  25. C N INTEGER
  26. C the order of the original matrix.
  27. C
  28. C ML INTEGER
  29. C number of diagonals below the main diagonal.
  30. C
  31. C MU INTEGER
  32. C number of diagonals above the main diagonal.
  33. C
  34. C IPVT INTEGER(N)
  35. C the pivot vector from SBGCO or SGBFA.
  36. C
  37. C B REAL(N)
  38. C the right hand side vector.
  39. C
  40. C JOB INTEGER
  41. C = 0 to solve A*X = B ,
  42. C = nonzero to solve TRANS(A)*X = B , where
  43. C TRANS(A) is the transpose.
  44. C
  45. C On Return
  46. C
  47. C B the solution vector X .
  48. C
  49. C Error Condition
  50. C
  51. C A division by zero will occur if the input factor contains a
  52. C zero on the diagonal. Technically, this indicates singularity,
  53. C but it is often caused by improper arguments or improper
  54. C setting of LDA . It will not occur if the subroutines are
  55. C called correctly and if SBGCO has set RCOND .GT. 0.0
  56. C or SGBFA has set INFO .EQ. 0 .
  57. C
  58. C To compute INVERSE(A) * C where C is a matrix
  59. C with P columns
  60. C CALL SBGCO(ABD,LDA,N,ML,MU,IPVT,RCOND,Z)
  61. C If (RCOND is too small) GO TO ...
  62. C DO 10 J = 1, P
  63. C CALL SGBSL(ABD,LDA,N,ML,MU,IPVT,C(1,J),0)
  64. C 10 CONTINUE
  65. C
  66. C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
  67. C Stewart, LINPACK Users' Guide, SIAM, 1979.
  68. C***ROUTINES CALLED SAXPY, SDOT
  69. C***REVISION HISTORY (YYMMDD)
  70. C 780814 DATE WRITTEN
  71. C 890531 Changed all specific intrinsics to generic. (WRB)
  72. C 890831 Modified array declarations. (WRB)
  73. C 890831 REVISION DATE from Version 3.2
  74. C 891214 Prologue converted to Version 4.0 format. (BAB)
  75. C 900326 Removed duplicate information from DESCRIPTION section.
  76. C (WRB)
  77. C 920501 Reformatted the REFERENCES section. (WRB)
  78. C***END PROLOGUE SGBSL
  79. INTEGER LDA,N,ML,MU,IPVT(*),JOB
  80. REAL ABD(LDA,*),B(*)
  81. C
  82. REAL SDOT,T
  83. INTEGER K,KB,L,LA,LB,LM,M,NM1
  84. C***FIRST EXECUTABLE STATEMENT SGBSL
  85. M = MU + ML + 1
  86. NM1 = N - 1
  87. IF (JOB .NE. 0) GO TO 50
  88. C
  89. C JOB = 0 , SOLVE A * X = B
  90. C FIRST SOLVE L*Y = B
  91. C
  92. IF (ML .EQ. 0) GO TO 30
  93. IF (NM1 .LT. 1) GO TO 30
  94. DO 20 K = 1, NM1
  95. LM = MIN(ML,N-K)
  96. L = IPVT(K)
  97. T = B(L)
  98. IF (L .EQ. K) GO TO 10
  99. B(L) = B(K)
  100. B(K) = T
  101. 10 CONTINUE
  102. CALL SAXPY(LM,T,ABD(M+1,K),1,B(K+1),1)
  103. 20 CONTINUE
  104. 30 CONTINUE
  105. C
  106. C NOW SOLVE U*X = Y
  107. C
  108. DO 40 KB = 1, N
  109. K = N + 1 - KB
  110. B(K) = B(K)/ABD(M,K)
  111. LM = MIN(K,M) - 1
  112. LA = M - LM
  113. LB = K - LM
  114. T = -B(K)
  115. CALL SAXPY(LM,T,ABD(LA,K),1,B(LB),1)
  116. 40 CONTINUE
  117. GO TO 100
  118. 50 CONTINUE
  119. C
  120. C JOB = NONZERO, SOLVE TRANS(A) * X = B
  121. C FIRST SOLVE TRANS(U)*Y = B
  122. C
  123. DO 60 K = 1, N
  124. LM = MIN(K,M) - 1
  125. LA = M - LM
  126. LB = K - LM
  127. T = SDOT(LM,ABD(LA,K),1,B(LB),1)
  128. B(K) = (B(K) - T)/ABD(M,K)
  129. 60 CONTINUE
  130. C
  131. C NOW SOLVE TRANS(L)*X = Y
  132. C
  133. IF (ML .EQ. 0) GO TO 90
  134. IF (NM1 .LT. 1) GO TO 90
  135. DO 80 KB = 1, NM1
  136. K = N - KB
  137. LM = MIN(ML,N-K)
  138. B(K) = B(K) + SDOT(LM,ABD(M+1,K),1,B(K+1),1)
  139. L = IPVT(K)
  140. IF (L .EQ. K) GO TO 70
  141. T = B(L)
  142. B(L) = B(K)
  143. B(K) = T
  144. 70 CONTINUE
  145. 80 CONTINUE
  146. 90 CONTINUE
  147. 100 CONTINUE
  148. RETURN
  149. END