dsbmv.f 10 KB

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