sgemv.f 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. *DECK SGEMV
  2. SUBROUTINE SGEMV (TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y,
  3. $ INCY)
  4. C***BEGIN PROLOGUE SGEMV
  5. C***PURPOSE Multiply a real vector by a real general matrix.
  6. C***LIBRARY SLATEC (BLAS)
  7. C***CATEGORY D1B4
  8. C***TYPE SINGLE PRECISION (SGEMV-S, DGEMV-D, CGEMV-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 SGEMV performs one of the matrix-vector operations
  17. C
  18. C y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y,
  19. C
  20. C where alpha and beta are scalars, x and y are vectors and A is an
  21. C m by n matrix.
  22. C
  23. C Parameters
  24. C ==========
  25. C
  26. C TRANS - CHARACTER*1.
  27. C On entry, TRANS specifies the operation to be performed as
  28. C follows:
  29. C
  30. C TRANS = 'N' or 'n' y := alpha*A*x + beta*y.
  31. C
  32. C TRANS = 'T' or 't' y := alpha*A'*x + beta*y.
  33. C
  34. C TRANS = 'C' or 'c' y := alpha*A'*x + beta*y.
  35. C
  36. C Unchanged on exit.
  37. C
  38. C M - INTEGER.
  39. C On entry, M specifies the number of rows of the matrix A.
  40. C M must be at least zero.
  41. C Unchanged on exit.
  42. C
  43. C N - INTEGER.
  44. C On entry, N specifies the number of columns of the matrix A.
  45. C N must be at least zero.
  46. C Unchanged on exit.
  47. C
  48. C ALPHA - REAL .
  49. C On entry, ALPHA specifies the scalar alpha.
  50. C Unchanged on exit.
  51. C
  52. C A - REAL array of DIMENSION ( LDA, n ).
  53. C Before entry, the leading m by n part of the array A must
  54. C contain the matrix of coefficients.
  55. C Unchanged on exit.
  56. C
  57. C LDA - INTEGER.
  58. C On entry, LDA specifies the first dimension of A as declared
  59. C in the calling (sub) program. LDA must be at least
  60. C max( 1, m ).
  61. C Unchanged on exit.
  62. C
  63. C X - REAL array of DIMENSION at least
  64. C ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
  65. C and at least
  66. C ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
  67. C Before entry, the incremented array X must contain the
  68. C vector x.
  69. C Unchanged on exit.
  70. C
  71. C INCX - INTEGER.
  72. C On entry, INCX specifies the increment for the elements of
  73. C X. INCX must not be zero.
  74. C Unchanged on exit.
  75. C
  76. C BETA - REAL .
  77. C On entry, BETA specifies the scalar beta. When BETA is
  78. C supplied as zero then Y need not be set on input.
  79. C Unchanged on exit.
  80. C
  81. C Y - REAL array of DIMENSION at least
  82. C ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
  83. C and at least
  84. C ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
  85. C Before entry with BETA non-zero, the incremented array Y
  86. C must contain the vector y. On exit, Y is overwritten by the
  87. C updated vector y.
  88. C
  89. C INCY - INTEGER.
  90. C On entry, INCY specifies the increment for the elements of
  91. C Y. INCY must not be zero.
  92. C Unchanged on exit.
  93. C
  94. C***REFERENCES Dongarra, J. J., Du Croz, J., Hammarling, S., and
  95. C Hanson, R. J. An extended set of Fortran basic linear
  96. C algebra subprograms. ACM TOMS, Vol. 14, No. 1,
  97. C pp. 1-17, March 1988.
  98. C***ROUTINES CALLED LSAME, XERBLA
  99. C***REVISION HISTORY (YYMMDD)
  100. C 861022 DATE WRITTEN
  101. C 910605 Modified to meet SLATEC prologue standards. Only comment
  102. C lines were modified. (BKS)
  103. C***END PROLOGUE SGEMV
  104. C .. Scalar Arguments ..
  105. REAL ALPHA, BETA
  106. INTEGER INCX, INCY, LDA, M, N
  107. CHARACTER*1 TRANS
  108. C .. Array Arguments ..
  109. REAL A( LDA, * ), X( * ), Y( * )
  110. C .. Parameters ..
  111. REAL ONE , ZERO
  112. PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
  113. C .. Local Scalars ..
  114. REAL TEMP
  115. INTEGER I, INFO, IX, IY, J, JX, JY, KX, KY, LENX, LENY
  116. C .. External Functions ..
  117. LOGICAL LSAME
  118. EXTERNAL LSAME
  119. C .. External Subroutines ..
  120. EXTERNAL XERBLA
  121. C .. Intrinsic Functions ..
  122. INTRINSIC MAX
  123. C***FIRST EXECUTABLE STATEMENT SGEMV
  124. C
  125. C Test the input parameters.
  126. C
  127. INFO = 0
  128. IF ( .NOT.LSAME( TRANS, 'N' ).AND.
  129. $ .NOT.LSAME( TRANS, 'T' ).AND.
  130. $ .NOT.LSAME( TRANS, 'C' ) )THEN
  131. INFO = 1
  132. ELSE IF( M.LT.0 )THEN
  133. INFO = 2
  134. ELSE IF( N.LT.0 )THEN
  135. INFO = 3
  136. ELSE IF( LDA.LT.MAX( 1, M ) )THEN
  137. INFO = 6
  138. ELSE IF( INCX.EQ.0 )THEN
  139. INFO = 8
  140. ELSE IF( INCY.EQ.0 )THEN
  141. INFO = 11
  142. END IF
  143. IF( INFO.NE.0 )THEN
  144. CALL XERBLA( 'SGEMV ', INFO )
  145. RETURN
  146. END IF
  147. C
  148. C Quick return if possible.
  149. C
  150. IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.
  151. $ ( ( ALPHA.EQ.ZERO ).AND.( BETA.EQ.ONE ) ) )
  152. $ RETURN
  153. C
  154. C Set LENX and LENY, the lengths of the vectors x and y, and set
  155. C up the start points in X and Y.
  156. C
  157. IF( LSAME( TRANS, 'N' ) )THEN
  158. LENX = N
  159. LENY = M
  160. ELSE
  161. LENX = M
  162. LENY = N
  163. END IF
  164. IF( INCX.GT.0 )THEN
  165. KX = 1
  166. ELSE
  167. KX = 1 - ( LENX - 1 )*INCX
  168. END IF
  169. IF( INCY.GT.0 )THEN
  170. KY = 1
  171. ELSE
  172. KY = 1 - ( LENY - 1 )*INCY
  173. END IF
  174. C
  175. C Start the operations. In this version the elements of A are
  176. C accessed sequentially with one pass through A.
  177. C
  178. C First form y := beta*y.
  179. C
  180. IF( BETA.NE.ONE )THEN
  181. IF( INCY.EQ.1 )THEN
  182. IF( BETA.EQ.ZERO )THEN
  183. DO 10, I = 1, LENY
  184. Y( I ) = ZERO
  185. 10 CONTINUE
  186. ELSE
  187. DO 20, I = 1, LENY
  188. Y( I ) = BETA*Y( I )
  189. 20 CONTINUE
  190. END IF
  191. ELSE
  192. IY = KY
  193. IF( BETA.EQ.ZERO )THEN
  194. DO 30, I = 1, LENY
  195. Y( IY ) = ZERO
  196. IY = IY + INCY
  197. 30 CONTINUE
  198. ELSE
  199. DO 40, I = 1, LENY
  200. Y( IY ) = BETA*Y( IY )
  201. IY = IY + INCY
  202. 40 CONTINUE
  203. END IF
  204. END IF
  205. END IF
  206. IF( ALPHA.EQ.ZERO )
  207. $ RETURN
  208. IF( LSAME( TRANS, 'N' ) )THEN
  209. C
  210. C Form y := alpha*A*x + y.
  211. C
  212. JX = KX
  213. IF( INCY.EQ.1 )THEN
  214. DO 60, J = 1, N
  215. IF( X( JX ).NE.ZERO )THEN
  216. TEMP = ALPHA*X( JX )
  217. DO 50, I = 1, M
  218. Y( I ) = Y( I ) + TEMP*A( I, J )
  219. 50 CONTINUE
  220. END IF
  221. JX = JX + INCX
  222. 60 CONTINUE
  223. ELSE
  224. DO 80, J = 1, N
  225. IF( X( JX ).NE.ZERO )THEN
  226. TEMP = ALPHA*X( JX )
  227. IY = KY
  228. DO 70, I = 1, M
  229. Y( IY ) = Y( IY ) + TEMP*A( I, J )
  230. IY = IY + INCY
  231. 70 CONTINUE
  232. END IF
  233. JX = JX + INCX
  234. 80 CONTINUE
  235. END IF
  236. ELSE
  237. C
  238. C Form y := alpha*A'*x + y.
  239. C
  240. JY = KY
  241. IF( INCX.EQ.1 )THEN
  242. DO 100, J = 1, N
  243. TEMP = ZERO
  244. DO 90, I = 1, M
  245. TEMP = TEMP + A( I, J )*X( I )
  246. 90 CONTINUE
  247. Y( JY ) = Y( JY ) + ALPHA*TEMP
  248. JY = JY + INCY
  249. 100 CONTINUE
  250. ELSE
  251. DO 120, J = 1, N
  252. TEMP = ZERO
  253. IX = KX
  254. DO 110, I = 1, M
  255. TEMP = TEMP + A( I, J )*X( IX )
  256. IX = IX + INCX
  257. 110 CONTINUE
  258. Y( JY ) = Y( JY ) + ALPHA*TEMP
  259. JY = JY + INCY
  260. 120 CONTINUE
  261. END IF
  262. END IF
  263. C
  264. RETURN
  265. C
  266. C End of SGEMV .
  267. C
  268. END