stbmv.f 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. *DECK STBMV
  2. SUBROUTINE STBMV (UPLO, TRANS, DIAG, N, K, A, LDA, X, INCX)
  3. C***BEGIN PROLOGUE STBMV
  4. C***PURPOSE Multiply a real vector by a real triangular band matrix.
  5. C***LIBRARY SLATEC (BLAS)
  6. C***CATEGORY D1B4
  7. C***TYPE SINGLE PRECISION (STBMV-S, DTBMV-D, CTBMV-C)
  8. C***KEYWORDS LEVEL 2 BLAS, LINEAR ALGEBRA
  9. C***AUTHOR Dongarra, J. J., (ANL)
  10. C Du Croz, J., (NAG)
  11. C Hammarling, S., (NAG)
  12. C Hanson, R. J., (SNLA)
  13. C***DESCRIPTION
  14. C
  15. C STBMV performs one of the matrix-vector operations
  16. C
  17. C x := A*x, or x := A'*x,
  18. C
  19. C where x is an n element vector and A is an n by n unit, or non-unit,
  20. C upper or lower triangular band matrix, with ( k + 1) diagonals.
  21. C
  22. C Parameters
  23. C ==========
  24. C
  25. C UPLO - CHARACTER*1.
  26. C On entry, UPLO specifies whether the matrix is an upper or
  27. C lower triangular matrix as follows:
  28. C
  29. C UPLO = 'U' or 'u' A is an upper triangular matrix.
  30. C
  31. C UPLO = 'L' or 'l' A is a lower triangular matrix.
  32. C
  33. C Unchanged on exit.
  34. C
  35. C TRANS - CHARACTER*1.
  36. C On entry, TRANS specifies the operation to be performed as
  37. C follows:
  38. C
  39. C TRANS = 'N' or 'n' x := A*x.
  40. C
  41. C TRANS = 'T' or 't' x := A'*x.
  42. C
  43. C TRANS = 'C' or 'c' x := A'*x.
  44. C
  45. C Unchanged on exit.
  46. C
  47. C DIAG - CHARACTER*1.
  48. C On entry, DIAG specifies whether or not A is unit
  49. C triangular as follows:
  50. C
  51. C DIAG = 'U' or 'u' A is assumed to be unit triangular.
  52. C
  53. C DIAG = 'N' or 'n' A is not assumed to be unit
  54. C triangular.
  55. C
  56. C Unchanged on exit.
  57. C
  58. C N - INTEGER.
  59. C On entry, N specifies the order of the matrix A.
  60. C N must be at least zero.
  61. C Unchanged on exit.
  62. C
  63. C K - INTEGER.
  64. C On entry with UPLO = 'U' or 'u', K specifies the number of
  65. C super-diagonals of the matrix A.
  66. C On entry with UPLO = 'L' or 'l', K specifies the number of
  67. C sub-diagonals of the matrix A.
  68. C K must satisfy 0 .le. K.
  69. C Unchanged on exit.
  70. C
  71. C A - REAL array of DIMENSION ( LDA, n ).
  72. C Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )
  73. C by n part of the array A must contain the upper triangular
  74. C band part of the matrix of coefficients, supplied column by
  75. C column, with the leading diagonal of the matrix in row
  76. C ( k + 1 ) of the array, the first super-diagonal starting at
  77. C position 2 in row k, and so on. The top left k by k triangle
  78. C of the array A is not referenced.
  79. C The following program segment will transfer an upper
  80. C triangular band matrix from conventional full matrix storage
  81. C to band storage:
  82. C
  83. C DO 20, J = 1, N
  84. C M = K + 1 - J
  85. C DO 10, I = MAX( 1, J - K ), J
  86. C A( M + I, J ) = matrix( I, J )
  87. C 10 CONTINUE
  88. C 20 CONTINUE
  89. C
  90. C Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )
  91. C by n part of the array A must contain the lower triangular
  92. C band part of the matrix of coefficients, supplied column by
  93. C column, with the leading diagonal of the matrix in row 1 of
  94. C the array, the first sub-diagonal starting at position 1 in
  95. C row 2, and so on. The bottom right k by k triangle of the
  96. C array A is not referenced.
  97. C The following program segment will transfer a lower
  98. C triangular band matrix from conventional full matrix storage
  99. C to band storage:
  100. C
  101. C DO 20, J = 1, N
  102. C M = 1 - J
  103. C DO 10, I = J, MIN( N, J + K )
  104. C A( M + I, J ) = matrix( I, J )
  105. C 10 CONTINUE
  106. C 20 CONTINUE
  107. C
  108. C Note that when DIAG = 'U' or 'u' the elements of the array A
  109. C corresponding to the diagonal elements of the matrix are not
  110. C referenced, but are assumed to be unity.
  111. C Unchanged on exit.
  112. C
  113. C LDA - INTEGER.
  114. C On entry, LDA specifies the first dimension of A as declared
  115. C in the calling (sub) program. LDA must be at least
  116. C ( k + 1 ).
  117. C Unchanged on exit.
  118. C
  119. C X - REAL array of dimension at least
  120. C ( 1 + ( n - 1 )*abs( INCX ) ).
  121. C Before entry, the incremented array X must contain the n
  122. C element vector x. On exit, X is overwritten with the
  123. C transformed vector x.
  124. C
  125. C INCX - INTEGER.
  126. C On entry, INCX specifies the increment for the elements of
  127. C X. INCX must not be zero.
  128. C Unchanged on exit.
  129. C
  130. C***REFERENCES Dongarra, J. J., Du Croz, J., Hammarling, S., and
  131. C Hanson, R. J. An extended set of Fortran basic linear
  132. C algebra subprograms. ACM TOMS, Vol. 14, No. 1,
  133. C pp. 1-17, March 1988.
  134. C***ROUTINES CALLED LSAME, XERBLA
  135. C***REVISION HISTORY (YYMMDD)
  136. C 861022 DATE WRITTEN
  137. C 910605 Modified to meet SLATEC prologue standards. Only comment
  138. C lines were modified. (BKS)
  139. C***END PROLOGUE STBMV
  140. C .. Scalar Arguments ..
  141. INTEGER INCX, K, LDA, N
  142. CHARACTER*1 DIAG, TRANS, UPLO
  143. C .. Array Arguments ..
  144. REAL A( LDA, * ), X( * )
  145. C .. Parameters ..
  146. REAL ZERO
  147. PARAMETER ( ZERO = 0.0E+0 )
  148. C .. Local Scalars ..
  149. REAL TEMP
  150. INTEGER I, INFO, IX, J, JX, KPLUS1, KX, L
  151. LOGICAL NOUNIT
  152. C .. External Functions ..
  153. LOGICAL LSAME
  154. EXTERNAL LSAME
  155. C .. External Subroutines ..
  156. EXTERNAL XERBLA
  157. C .. Intrinsic Functions ..
  158. INTRINSIC MAX, MIN
  159. C***FIRST EXECUTABLE STATEMENT STBMV
  160. C
  161. C Test the input parameters.
  162. C
  163. INFO = 0
  164. IF ( .NOT.LSAME( UPLO , 'U' ).AND.
  165. $ .NOT.LSAME( UPLO , 'L' ) )THEN
  166. INFO = 1
  167. ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND.
  168. $ .NOT.LSAME( TRANS, 'T' ).AND.
  169. $ .NOT.LSAME( TRANS, 'C' ) )THEN
  170. INFO = 2
  171. ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND.
  172. $ .NOT.LSAME( DIAG , 'N' ) )THEN
  173. INFO = 3
  174. ELSE IF( N.LT.0 )THEN
  175. INFO = 4
  176. ELSE IF( K.LT.0 )THEN
  177. INFO = 5
  178. ELSE IF( LDA.LT.( K + 1 ) )THEN
  179. INFO = 7
  180. ELSE IF( INCX.EQ.0 )THEN
  181. INFO = 9
  182. END IF
  183. IF( INFO.NE.0 )THEN
  184. CALL XERBLA( 'STBMV ', INFO )
  185. RETURN
  186. END IF
  187. C
  188. C Quick return if possible.
  189. C
  190. IF( N.EQ.0 )
  191. $ RETURN
  192. C
  193. NOUNIT = LSAME( DIAG, 'N' )
  194. C
  195. C Set up the start point in X if the increment is not unity. This
  196. C will be ( N - 1 )*INCX too small for descending loops.
  197. C
  198. IF( INCX.LE.0 )THEN
  199. KX = 1 - ( N - 1 )*INCX
  200. ELSE IF( INCX.NE.1 )THEN
  201. KX = 1
  202. END IF
  203. C
  204. C Start the operations. In this version the elements of A are
  205. C accessed sequentially with one pass through A.
  206. C
  207. IF( LSAME( TRANS, 'N' ) )THEN
  208. C
  209. C Form x := A*x.
  210. C
  211. IF( LSAME( UPLO, 'U' ) )THEN
  212. KPLUS1 = K + 1
  213. IF( INCX.EQ.1 )THEN
  214. DO 20, J = 1, N
  215. IF( X( J ).NE.ZERO )THEN
  216. TEMP = X( J )
  217. L = KPLUS1 - J
  218. DO 10, I = MAX( 1, J - K ), J - 1
  219. X( I ) = X( I ) + TEMP*A( L + I, J )
  220. 10 CONTINUE
  221. IF( NOUNIT )
  222. $ X( J ) = X( J )*A( KPLUS1, J )
  223. END IF
  224. 20 CONTINUE
  225. ELSE
  226. JX = KX
  227. DO 40, J = 1, N
  228. IF( X( JX ).NE.ZERO )THEN
  229. TEMP = X( JX )
  230. IX = KX
  231. L = KPLUS1 - J
  232. DO 30, I = MAX( 1, J - K ), J - 1
  233. X( IX ) = X( IX ) + TEMP*A( L + I, J )
  234. IX = IX + INCX
  235. 30 CONTINUE
  236. IF( NOUNIT )
  237. $ X( JX ) = X( JX )*A( KPLUS1, J )
  238. END IF
  239. JX = JX + INCX
  240. IF( J.GT.K )
  241. $ KX = KX + INCX
  242. 40 CONTINUE
  243. END IF
  244. ELSE
  245. IF( INCX.EQ.1 )THEN
  246. DO 60, J = N, 1, -1
  247. IF( X( J ).NE.ZERO )THEN
  248. TEMP = X( J )
  249. L = 1 - J
  250. DO 50, I = MIN( N, J + K ), J + 1, -1
  251. X( I ) = X( I ) + TEMP*A( L + I, J )
  252. 50 CONTINUE
  253. IF( NOUNIT )
  254. $ X( J ) = X( J )*A( 1, J )
  255. END IF
  256. 60 CONTINUE
  257. ELSE
  258. KX = KX + ( N - 1 )*INCX
  259. JX = KX
  260. DO 80, J = N, 1, -1
  261. IF( X( JX ).NE.ZERO )THEN
  262. TEMP = X( JX )
  263. IX = KX
  264. L = 1 - J
  265. DO 70, I = MIN( N, J + K ), J + 1, -1
  266. X( IX ) = X( IX ) + TEMP*A( L + I, J )
  267. IX = IX - INCX
  268. 70 CONTINUE
  269. IF( NOUNIT )
  270. $ X( JX ) = X( JX )*A( 1, J )
  271. END IF
  272. JX = JX - INCX
  273. IF( ( N - J ).GE.K )
  274. $ KX = KX - INCX
  275. 80 CONTINUE
  276. END IF
  277. END IF
  278. ELSE
  279. C
  280. C Form x := A'*x.
  281. C
  282. IF( LSAME( UPLO, 'U' ) )THEN
  283. KPLUS1 = K + 1
  284. IF( INCX.EQ.1 )THEN
  285. DO 100, J = N, 1, -1
  286. TEMP = X( J )
  287. L = KPLUS1 - J
  288. IF( NOUNIT )
  289. $ TEMP = TEMP*A( KPLUS1, J )
  290. DO 90, I = J - 1, MAX( 1, J - K ), -1
  291. TEMP = TEMP + A( L + I, J )*X( I )
  292. 90 CONTINUE
  293. X( J ) = TEMP
  294. 100 CONTINUE
  295. ELSE
  296. KX = KX + ( N - 1 )*INCX
  297. JX = KX
  298. DO 120, J = N, 1, -1
  299. TEMP = X( JX )
  300. KX = KX - INCX
  301. IX = KX
  302. L = KPLUS1 - J
  303. IF( NOUNIT )
  304. $ TEMP = TEMP*A( KPLUS1, J )
  305. DO 110, I = J - 1, MAX( 1, J - K ), -1
  306. TEMP = TEMP + A( L + I, J )*X( IX )
  307. IX = IX - INCX
  308. 110 CONTINUE
  309. X( JX ) = TEMP
  310. JX = JX - INCX
  311. 120 CONTINUE
  312. END IF
  313. ELSE
  314. IF( INCX.EQ.1 )THEN
  315. DO 140, J = 1, N
  316. TEMP = X( J )
  317. L = 1 - J
  318. IF( NOUNIT )
  319. $ TEMP = TEMP*A( 1, J )
  320. DO 130, I = J + 1, MIN( N, J + K )
  321. TEMP = TEMP + A( L + I, J )*X( I )
  322. 130 CONTINUE
  323. X( J ) = TEMP
  324. 140 CONTINUE
  325. ELSE
  326. JX = KX
  327. DO 160, J = 1, N
  328. TEMP = X( JX )
  329. KX = KX + INCX
  330. IX = KX
  331. L = 1 - J
  332. IF( NOUNIT )
  333. $ TEMP = TEMP*A( 1, J )
  334. DO 150, I = J + 1, MIN( N, J + K )
  335. TEMP = TEMP + A( L + I, J )*X( IX )
  336. IX = IX + INCX
  337. 150 CONTINUE
  338. X( JX ) = TEMP
  339. JX = JX + INCX
  340. 160 CONTINUE
  341. END IF
  342. END IF
  343. END IF
  344. C
  345. RETURN
  346. C
  347. C End of STBMV .
  348. C
  349. END