cgemv.f 8.5 KB

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