stpmv.f 9.8 KB

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