snbsl.f 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. *DECK SNBSL
  2. SUBROUTINE SNBSL (ABE, LDA, N, ML, MU, IPVT, B, JOB)
  3. C***BEGIN PROLOGUE SNBSL
  4. C***PURPOSE Solve a real band system using the factors computed by
  5. C SNBCO or SNBFA.
  6. C***LIBRARY SLATEC
  7. C***CATEGORY D2A2
  8. C***TYPE SINGLE PRECISION (SNBSL-S, DNBSL-D, CNBSL-C)
  9. C***KEYWORDS BANDED, LINEAR EQUATIONS, NONSYMMETRIC, SOLVE
  10. C***AUTHOR Voorhees, E. A., (LANL)
  11. C***DESCRIPTION
  12. C
  13. C SNBSL solves the real band system
  14. C A * X = B or TRANS(A) * X = B
  15. C using the factors computed by SNBCO or SNBFA.
  16. C
  17. C On Entry
  18. C
  19. C ABE REAL(LDA, NC)
  20. C the output from SNBCO or SNBFA.
  21. C NC must be .GE. 2*ML+MU+1 .
  22. C
  23. C LDA INTEGER
  24. C the leading dimension of the array ABE .
  25. C
  26. C N INTEGER
  27. C the order of the original matrix.
  28. C
  29. C ML INTEGER
  30. C number of diagonals below the main diagonal.
  31. C
  32. C MU INTEGER
  33. C number of diagonals above the main diagonal.
  34. C
  35. C IPVT INTEGER(N)
  36. C the pivot vector from SNBCO or SNBFA.
  37. C
  38. C B REAL(N)
  39. C the right hand side vector.
  40. C
  41. C JOB INTEGER
  42. C = 0 to solve A*X = B .
  43. C = nonzero to solve TRANS(A)*X = B , where
  44. C TRANS(A) is the transpose.
  45. C
  46. C On Return
  47. C
  48. C B the solution vector X .
  49. C
  50. C Error Condition
  51. C
  52. C A division by zero will occur if the input factor contains a
  53. C zero on the diagonal. Technically, this indicates singularity,
  54. C but it is often caused by improper arguments or improper
  55. C setting of LDA. It will not occur if the subroutines are
  56. C called correctly and if SNBCO has set RCOND .GT. 0.0
  57. C or SNBFA has set INFO .EQ. 0 .
  58. C
  59. C To compute INVERSE(A) * C where C is a matrix
  60. C with P columns
  61. C CALL SNBCO(ABE,LDA,N,ML,MU,IPVT,RCOND,Z)
  62. C IF (RCOND is too small) GO TO ...
  63. C DO 10 J = 1, P
  64. C CALL SNBSL(ABE,LDA,N,ML,MU,IPVT,C(1,J),0)
  65. C 10 CONTINUE
  66. C
  67. C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
  68. C Stewart, LINPACK Users' Guide, SIAM, 1979.
  69. C***ROUTINES CALLED SAXPY, SDOT
  70. C***REVISION HISTORY (YYMMDD)
  71. C 800717 DATE WRITTEN
  72. C 890531 Changed all specific intrinsics to generic. (WRB)
  73. C 890831 Modified array declarations. (WRB)
  74. C 890831 REVISION DATE from Version 3.2
  75. C 891214 Prologue converted to Version 4.0 format. (BAB)
  76. C 920501 Reformatted the REFERENCES section. (WRB)
  77. C***END PROLOGUE SNBSL
  78. INTEGER LDA,N,ML,MU,IPVT(*),JOB
  79. REAL ABE(LDA,*),B(*)
  80. C
  81. REAL SDOT,T
  82. INTEGER K,KB,L,LB,LDB,LM,M,MLM,NM1
  83. C***FIRST EXECUTABLE STATEMENT SNBSL
  84. M=MU+ML+1
  85. NM1=N-1
  86. LDB=1-LDA
  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. MLM=ML-(LM-1)
  103. CALL SAXPY(LM,T,ABE(K+LM,MLM),LDB,B(K+1),1)
  104. 20 CONTINUE
  105. 30 CONTINUE
  106. C
  107. C NOW SOLVE U*X = Y
  108. C
  109. DO 40 KB=1,N
  110. K=N+1-KB
  111. B(K)=B(K)/ABE(K,ML+1)
  112. LM=MIN(K,M)-1
  113. LB=K-LM
  114. T=-B(K)
  115. CALL SAXPY(LM,T,ABE(K-1,ML+2),LDB,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. LB = K - LM
  126. T = SDOT(LM,ABE(K-1,ML+2),LDB,B(LB),1)
  127. B(K) = (B(K) - T)/ABE(K,ML+1)
  128. 60 CONTINUE
  129. C
  130. C NOW SOLVE TRANS(L)*X = Y
  131. C
  132. IF (ML .EQ. 0) GO TO 90
  133. IF (NM1 .LT. 1) GO TO 90
  134. DO 80 KB = 1, NM1
  135. K = N - KB
  136. LM = MIN(ML,N-K)
  137. MLM = ML - (LM - 1)
  138. B(K) = B(K) + SDOT(LM,ABE(K+LM,MLM),LDB,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