ctrmv.f 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. *DECK CTRMV
  2. SUBROUTINE CTRMV (UPLO, TRANS, DIAG, N, A, LDA, X, INCX)
  3. C***BEGIN PROLOGUE CTRMV
  4. C***PURPOSE Multiply a complex vector by a complex triangular matrix.
  5. C***LIBRARY SLATEC (BLAS)
  6. C***CATEGORY D1B4
  7. C***TYPE COMPLEX (STRMV-S, DTRMV-D, CTRMV-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 CTRMV performs one of the matrix-vector operations
  16. C
  17. C x := A*x, or x := A'*x, or x := conjg( 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 matrix.
  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 := conjg( 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 A - COMPLEX array of DIMENSION ( LDA, n ).
  64. C Before entry with UPLO = 'U' or 'u', the leading n by n
  65. C upper triangular part of the array A must contain the upper
  66. C triangular matrix and the strictly lower triangular part of
  67. C A is not referenced.
  68. C Before entry with UPLO = 'L' or 'l', the leading n by n
  69. C lower triangular part of the array A must contain the lower
  70. C triangular matrix and the strictly upper triangular part of
  71. C A is not referenced.
  72. C Note that when DIAG = 'U' or 'u', the diagonal elements of
  73. C A are not referenced either, but are assumed to be unity.
  74. C Unchanged on exit.
  75. C
  76. C LDA - INTEGER.
  77. C On entry, LDA specifies the first dimension of A as declared
  78. C in the calling (sub) program. LDA must be at least
  79. C max( 1, n ).
  80. C Unchanged on exit.
  81. C
  82. C X - COMPLEX array of dimension at least
  83. C ( 1 + ( n - 1 )*abs( INCX ) ).
  84. C Before entry, the incremented array X must contain the n
  85. C element vector x. On exit, X is overwritten with the
  86. C transformed vector x.
  87. C
  88. C INCX - INTEGER.
  89. C On entry, INCX specifies the increment for the elements of
  90. C X. INCX must not be zero.
  91. C Unchanged on exit.
  92. C
  93. C***REFERENCES Dongarra, J. J., Du Croz, J., Hammarling, S., and
  94. C Hanson, R. J. An extended set of Fortran basic linear
  95. C algebra subprograms. ACM TOMS, Vol. 14, No. 1,
  96. C pp. 1-17, March 1988.
  97. C***ROUTINES CALLED LSAME, XERBLA
  98. C***REVISION HISTORY (YYMMDD)
  99. C 861022 DATE WRITTEN
  100. C 910605 Modified to meet SLATEC prologue standards. Only comment
  101. C lines were modified. (BKS)
  102. C***END PROLOGUE CTRMV
  103. C .. Scalar Arguments ..
  104. INTEGER INCX, LDA, N
  105. CHARACTER*1 DIAG, TRANS, UPLO
  106. C .. Array Arguments ..
  107. COMPLEX A( LDA, * ), X( * )
  108. C .. Parameters ..
  109. COMPLEX ZERO
  110. PARAMETER ( ZERO = ( 0.0E+0, 0.0E+0 ) )
  111. C .. Local Scalars ..
  112. COMPLEX TEMP
  113. INTEGER I, INFO, IX, J, JX, KX
  114. LOGICAL NOCONJ, NOUNIT
  115. C .. External Functions ..
  116. LOGICAL LSAME
  117. EXTERNAL LSAME
  118. C .. External Subroutines ..
  119. EXTERNAL XERBLA
  120. C .. Intrinsic Functions ..
  121. INTRINSIC CONJG, MAX
  122. C***FIRST EXECUTABLE STATEMENT CTRMV
  123. C
  124. C Test the input parameters.
  125. C
  126. INFO = 0
  127. IF ( .NOT.LSAME( UPLO , 'U' ).AND.
  128. $ .NOT.LSAME( UPLO , 'L' ) )THEN
  129. INFO = 1
  130. ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND.
  131. $ .NOT.LSAME( TRANS, 'T' ).AND.
  132. $ .NOT.LSAME( TRANS, 'C' ) )THEN
  133. INFO = 2
  134. ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND.
  135. $ .NOT.LSAME( DIAG , 'N' ) )THEN
  136. INFO = 3
  137. ELSE IF( N.LT.0 )THEN
  138. INFO = 4
  139. ELSE IF( LDA.LT.MAX( 1, N ) )THEN
  140. INFO = 6
  141. ELSE IF( INCX.EQ.0 )THEN
  142. INFO = 8
  143. END IF
  144. IF( INFO.NE.0 )THEN
  145. CALL XERBLA( 'CTRMV ', INFO )
  146. RETURN
  147. END IF
  148. C
  149. C Quick return if possible.
  150. C
  151. IF( N.EQ.0 )
  152. $ RETURN
  153. C
  154. NOCONJ = LSAME( TRANS, 'T' )
  155. NOUNIT = LSAME( DIAG , 'N' )
  156. C
  157. C Set up the start point in X if the increment is not unity. This
  158. C will be ( N - 1 )*INCX too small for descending loops.
  159. C
  160. IF( INCX.LE.0 )THEN
  161. KX = 1 - ( N - 1 )*INCX
  162. ELSE IF( INCX.NE.1 )THEN
  163. KX = 1
  164. END IF
  165. C
  166. C Start the operations. In this version the elements of A are
  167. C accessed sequentially with one pass through A.
  168. C
  169. IF( LSAME( TRANS, 'N' ) )THEN
  170. C
  171. C Form x := A*x.
  172. C
  173. IF( LSAME( UPLO, 'U' ) )THEN
  174. IF( INCX.EQ.1 )THEN
  175. DO 20, J = 1, N
  176. IF( X( J ).NE.ZERO )THEN
  177. TEMP = X( J )
  178. DO 10, I = 1, J - 1
  179. X( I ) = X( I ) + TEMP*A( I, J )
  180. 10 CONTINUE
  181. IF( NOUNIT )
  182. $ X( J ) = X( J )*A( J, J )
  183. END IF
  184. 20 CONTINUE
  185. ELSE
  186. JX = KX
  187. DO 40, J = 1, N
  188. IF( X( JX ).NE.ZERO )THEN
  189. TEMP = X( JX )
  190. IX = KX
  191. DO 30, I = 1, J - 1
  192. X( IX ) = X( IX ) + TEMP*A( I, J )
  193. IX = IX + INCX
  194. 30 CONTINUE
  195. IF( NOUNIT )
  196. $ X( JX ) = X( JX )*A( J, J )
  197. END IF
  198. JX = JX + INCX
  199. 40 CONTINUE
  200. END IF
  201. ELSE
  202. IF( INCX.EQ.1 )THEN
  203. DO 60, J = N, 1, -1
  204. IF( X( J ).NE.ZERO )THEN
  205. TEMP = X( J )
  206. DO 50, I = N, J + 1, -1
  207. X( I ) = X( I ) + TEMP*A( I, J )
  208. 50 CONTINUE
  209. IF( NOUNIT )
  210. $ X( J ) = X( J )*A( J, J )
  211. END IF
  212. 60 CONTINUE
  213. ELSE
  214. KX = KX + ( N - 1 )*INCX
  215. JX = KX
  216. DO 80, J = N, 1, -1
  217. IF( X( JX ).NE.ZERO )THEN
  218. TEMP = X( JX )
  219. IX = KX
  220. DO 70, I = N, J + 1, -1
  221. X( IX ) = X( IX ) + TEMP*A( I, J )
  222. IX = IX - INCX
  223. 70 CONTINUE
  224. IF( NOUNIT )
  225. $ X( JX ) = X( JX )*A( J, J )
  226. END IF
  227. JX = JX - INCX
  228. 80 CONTINUE
  229. END IF
  230. END IF
  231. ELSE
  232. C
  233. C Form x := A'*x or x := conjg( A' )*x.
  234. C
  235. IF( LSAME( UPLO, 'U' ) )THEN
  236. IF( INCX.EQ.1 )THEN
  237. DO 110, J = N, 1, -1
  238. TEMP = X( J )
  239. IF( NOCONJ )THEN
  240. IF( NOUNIT )
  241. $ TEMP = TEMP*A( J, J )
  242. DO 90, I = J - 1, 1, -1
  243. TEMP = TEMP + A( I, J )*X( I )
  244. 90 CONTINUE
  245. ELSE
  246. IF( NOUNIT )
  247. $ TEMP = TEMP*CONJG( A( J, J ) )
  248. DO 100, I = J - 1, 1, -1
  249. TEMP = TEMP + CONJG( A( I, J ) )*X( I )
  250. 100 CONTINUE
  251. END IF
  252. X( J ) = TEMP
  253. 110 CONTINUE
  254. ELSE
  255. JX = KX + ( N - 1 )*INCX
  256. DO 140, J = N, 1, -1
  257. TEMP = X( JX )
  258. IX = JX
  259. IF( NOCONJ )THEN
  260. IF( NOUNIT )
  261. $ TEMP = TEMP*A( J, J )
  262. DO 120, I = J - 1, 1, -1
  263. IX = IX - INCX
  264. TEMP = TEMP + A( I, J )*X( IX )
  265. 120 CONTINUE
  266. ELSE
  267. IF( NOUNIT )
  268. $ TEMP = TEMP*CONJG( A( J, J ) )
  269. DO 130, I = J - 1, 1, -1
  270. IX = IX - INCX
  271. TEMP = TEMP + CONJG( A( I, J ) )*X( IX )
  272. 130 CONTINUE
  273. END IF
  274. X( JX ) = TEMP
  275. JX = JX - INCX
  276. 140 CONTINUE
  277. END IF
  278. ELSE
  279. IF( INCX.EQ.1 )THEN
  280. DO 170, J = 1, N
  281. TEMP = X( J )
  282. IF( NOCONJ )THEN
  283. IF( NOUNIT )
  284. $ TEMP = TEMP*A( J, J )
  285. DO 150, I = J + 1, N
  286. TEMP = TEMP + A( I, J )*X( I )
  287. 150 CONTINUE
  288. ELSE
  289. IF( NOUNIT )
  290. $ TEMP = TEMP*CONJG( A( J, J ) )
  291. DO 160, I = J + 1, N
  292. TEMP = TEMP + CONJG( A( I, J ) )*X( I )
  293. 160 CONTINUE
  294. END IF
  295. X( J ) = TEMP
  296. 170 CONTINUE
  297. ELSE
  298. JX = KX
  299. DO 200, J = 1, N
  300. TEMP = X( JX )
  301. IX = JX
  302. IF( NOCONJ )THEN
  303. IF( NOUNIT )
  304. $ TEMP = TEMP*A( J, J )
  305. DO 180, I = J + 1, N
  306. IX = IX + INCX
  307. TEMP = TEMP + A( I, J )*X( IX )
  308. 180 CONTINUE
  309. ELSE
  310. IF( NOUNIT )
  311. $ TEMP = TEMP*CONJG( A( J, J ) )
  312. DO 190, I = J + 1, N
  313. IX = IX + INCX
  314. TEMP = TEMP + CONJG( A( I, J ) )*X( IX )
  315. 190 CONTINUE
  316. END IF
  317. X( JX ) = TEMP
  318. JX = JX + INCX
  319. 200 CONTINUE
  320. END IF
  321. END IF
  322. END IF
  323. C
  324. RETURN
  325. C
  326. C End of CTRMV .
  327. C
  328. END