You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

zgbmvf.f 14 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. SUBROUTINE ZGBMVF( TRANS, M, N, KL, KU, ALPHA, A, LDA, X, INCX,
  2. $ BETA, Y, INCY )
  3. * .. Scalar Arguments ..
  4. COMPLEX*16 ALPHA, BETA
  5. INTEGER INCX, INCY, KL, KU, LDA, M, N
  6. CHARACTER*1 TRANS
  7. * .. Array Arguments ..
  8. COMPLEX*16 A( LDA, * ), X( * ), Y( * )
  9. * ..
  10. *
  11. * Purpose
  12. * =======
  13. *
  14. * ZGBMV performs one of the matrix-vector operations
  15. *
  16. * y := alpha*A*x + beta*y, or y := alpha*A'*x + beta*y, or
  17. *
  18. * y := alpha*conjg( A' )*x + beta*y,
  19. *
  20. * where alpha and beta are scalars, x and y are vectors and A is an
  21. * m by n band matrix, with kl sub-diagonals and ku super-diagonals.
  22. *
  23. * Parameters
  24. * ==========
  25. *
  26. * TRANS - CHARACTER*1.
  27. * On entry, TRANS specifies the operation to be performed as
  28. * follows:
  29. *
  30. * TRANS = 'N' or 'n' y := alpha*A*x + beta*y.
  31. *
  32. * TRANS = 'T' or 't' y := alpha*A'*x + beta*y.
  33. *
  34. * TRANS = 'C' or 'c' y := alpha*conjg( A' )*x + beta*y.
  35. *
  36. * Unchanged on exit.
  37. *
  38. * M - INTEGER.
  39. * On entry, M specifies the number of rows of the matrix A.
  40. * M must be at least zero.
  41. * Unchanged on exit.
  42. *
  43. * N - INTEGER.
  44. * On entry, N specifies the number of columns of the matrix A.
  45. * N must be at least zero.
  46. * Unchanged on exit.
  47. *
  48. * KL - INTEGER.
  49. * On entry, KL specifies the number of sub-diagonals of the
  50. * matrix A. KL must satisfy 0 .le. KL.
  51. * Unchanged on exit.
  52. *
  53. * KU - INTEGER.
  54. * On entry, KU specifies the number of super-diagonals of the
  55. * matrix A. KU must satisfy 0 .le. KU.
  56. * Unchanged on exit.
  57. *
  58. * ALPHA - COMPLEX*16 .
  59. * On entry, ALPHA specifies the scalar alpha.
  60. * Unchanged on exit.
  61. *
  62. * A - COMPLEX*16 array of DIMENSION ( LDA, n ).
  63. * Before entry, the leading ( kl + ku + 1 ) by n part of the
  64. * array A must contain the matrix of coefficients, supplied
  65. * column by column, with the leading diagonal of the matrix in
  66. * row ( ku + 1 ) of the array, the first super-diagonal
  67. * starting at position 2 in row ku, the first sub-diagonal
  68. * starting at position 1 in row ( ku + 2 ), and so on.
  69. * Elements in the array A that do not correspond to elements
  70. * in the band matrix (such as the top left ku by ku triangle)
  71. * are not referenced.
  72. * The following program segment will transfer a band matrix
  73. * from conventional full matrix storage to band storage:
  74. *
  75. * DO 20, J = 1, N
  76. * K = KU + 1 - J
  77. * DO 10, I = MAX( 1, J - KU ), MIN( M, J + KL )
  78. * A( K + I, J ) = matrix( I, J )
  79. * 10 CONTINUE
  80. * 20 CONTINUE
  81. *
  82. * Unchanged on exit.
  83. *
  84. * LDA - INTEGER.
  85. * On entry, LDA specifies the first dimension of A as declared
  86. * in the calling (sub) program. LDA must be at least
  87. * ( kl + ku + 1 ).
  88. * Unchanged on exit.
  89. *
  90. * X - COMPLEX*16 array of DIMENSION at least
  91. * ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
  92. * and at least
  93. * ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
  94. * Before entry, the incremented array X must contain the
  95. * vector x.
  96. * Unchanged on exit.
  97. *
  98. * INCX - INTEGER.
  99. * On entry, INCX specifies the increment for the elements of
  100. * X. INCX must not be zero.
  101. * Unchanged on exit.
  102. *
  103. * BETA - COMPLEX*16 .
  104. * On entry, BETA specifies the scalar beta. When BETA is
  105. * supplied as zero then Y need not be set on input.
  106. * Unchanged on exit.
  107. *
  108. * Y - COMPLEX*16 array of DIMENSION at least
  109. * ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
  110. * and at least
  111. * ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
  112. * Before entry, the incremented array Y must contain the
  113. * vector y. On exit, Y is overwritten by the updated vector y.
  114. *
  115. *
  116. * INCY - INTEGER.
  117. * On entry, INCY specifies the increment for the elements of
  118. * Y. INCY must not be zero.
  119. * Unchanged on exit.
  120. *
  121. *
  122. * Level 2 Blas routine.
  123. *
  124. * -- Written on 22-October-1986.
  125. * Jack Dongarra, Argonne National Lab.
  126. * Jeremy Du Croz, Nag Central Office.
  127. * Sven Hammarling, Nag Central Office.
  128. * Richard Hanson, Sandia National Labs.
  129. *
  130. *
  131. * .. Parameters ..
  132. COMPLEX*16 ONE
  133. PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) )
  134. COMPLEX*16 ZERO
  135. PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) )
  136. * .. Local Scalars ..
  137. COMPLEX*16 TEMP
  138. INTEGER I, INFO, IX, IY, J, JX, JY, K, KUP1, KX, KY,
  139. $ LENX, LENY
  140. LOGICAL NOCONJ, NOTRANS, XCONJ
  141. * .. External Functions ..
  142. LOGICAL LSAME
  143. EXTERNAL LSAME
  144. * .. External Subroutines ..
  145. EXTERNAL XERBLA
  146. * .. Intrinsic Functions ..
  147. INTRINSIC DCONJG, MAX, MIN
  148. * ..
  149. * .. Executable Statements ..
  150. *
  151. * Test the input parameters.
  152. *
  153. INFO = 0
  154. IF ( .NOT.LSAME( TRANS, 'N' ).AND.
  155. $ .NOT.LSAME( TRANS, 'T' ).AND.
  156. $ .NOT.LSAME( TRANS, 'R' ).AND.
  157. $ .NOT.LSAME( TRANS, 'C' ).AND.
  158. $ .NOT.LSAME( TRANS, 'O' ).AND.
  159. $ .NOT.LSAME( TRANS, 'U' ).AND.
  160. $ .NOT.LSAME( TRANS, 'S' ).AND.
  161. $ .NOT.LSAME( TRANS, 'D' ) )THEN
  162. INFO = 1
  163. ELSE IF( M.LT.0 )THEN
  164. INFO = 2
  165. ELSE IF( N.LT.0 )THEN
  166. INFO = 3
  167. ELSE IF( KL.LT.0 )THEN
  168. INFO = 4
  169. ELSE IF( KU.LT.0 )THEN
  170. INFO = 5
  171. ELSE IF( LDA.LT.( KL + KU + 1 ) )THEN
  172. INFO = 8
  173. ELSE IF( INCX.EQ.0 )THEN
  174. INFO = 10
  175. ELSE IF( INCY.EQ.0 )THEN
  176. INFO = 13
  177. END IF
  178. IF( INFO.NE.0 )THEN
  179. CALL XERBLA( 'ZGBMV ', INFO )
  180. RETURN
  181. END IF
  182. *
  183. * Quick return if possible.
  184. *
  185. IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.
  186. $ ( ( ALPHA.EQ.ZERO ).AND.( BETA.EQ.ONE ) ) )
  187. $ RETURN
  188. *
  189. NOCONJ = (LSAME( TRANS, 'N' ) .OR. LSAME( TRANS, 'T' )
  190. $ .OR. LSAME( TRANS, 'O' ) .OR. LSAME( TRANS, 'U' ))
  191. NOTRANS = (LSAME( TRANS, 'N' ) .OR. LSAME( TRANS, 'R' )
  192. $ .OR. LSAME( TRANS, 'O' ) .OR. LSAME( TRANS, 'S' ))
  193. XCONJ = (LSAME( TRANS, 'N' ) .OR. LSAME( TRANS, 'T' )
  194. $ .OR. LSAME( TRANS, 'R' ) .OR. LSAME( TRANS, 'C' ))
  195. *
  196. * Set LENX and LENY, the lengths of the vectors x and y, and set
  197. * up the start points in X and Y.
  198. *
  199. IF(NOTRANS)THEN
  200. LENX = N
  201. LENY = M
  202. ELSE
  203. LENX = M
  204. LENY = N
  205. END IF
  206. IF( INCX.GT.0 )THEN
  207. KX = 1
  208. ELSE
  209. KX = 1 - ( LENX - 1 )*INCX
  210. END IF
  211. IF( INCY.GT.0 )THEN
  212. KY = 1
  213. ELSE
  214. KY = 1 - ( LENY - 1 )*INCY
  215. END IF
  216. *
  217. * Start the operations. In this version the elements of A are
  218. * accessed sequentially with one pass through the band part of A.
  219. *
  220. * First form y := beta*y.
  221. *
  222. IF( BETA.NE.ONE )THEN
  223. IF( INCY.EQ.1 )THEN
  224. IF( BETA.EQ.ZERO )THEN
  225. DO 10, I = 1, LENY
  226. Y( I ) = ZERO
  227. 10 CONTINUE
  228. ELSE
  229. DO 20, I = 1, LENY
  230. Y( I ) = BETA*Y( I )
  231. 20 CONTINUE
  232. END IF
  233. ELSE
  234. IY = KY
  235. IF( BETA.EQ.ZERO )THEN
  236. DO 30, I = 1, LENY
  237. Y( IY ) = ZERO
  238. IY = IY + INCY
  239. 30 CONTINUE
  240. ELSE
  241. DO 40, I = 1, LENY
  242. Y( IY ) = BETA*Y( IY )
  243. IY = IY + INCY
  244. 40 CONTINUE
  245. END IF
  246. END IF
  247. END IF
  248. IF( ALPHA.EQ.ZERO )
  249. $ RETURN
  250. KUP1 = KU + 1
  251. IF(XCONJ)THEN
  252. IF(NOTRANS)THEN
  253. *
  254. * Form y := alpha*A*x + y.
  255. *
  256. JX = KX
  257. IF( INCY.EQ.1 )THEN
  258. DO 60, J = 1, N
  259. IF( X( JX ).NE.ZERO )THEN
  260. TEMP = ALPHA*X( JX )
  261. K = KUP1 - J
  262. IF( NOCONJ )THEN
  263. DO 50, I = MAX( 1, J - KU ), MIN( M, J + KL )
  264. Y( I ) = Y( I ) + TEMP*A( K + I, J )
  265. 50 CONTINUE
  266. ELSE
  267. DO 55, I = MAX( 1, J - KU ), MIN( M, J + KL )
  268. Y( I ) = Y( I ) + TEMP*DCONJG(A( K + I, J ))
  269. 55 CONTINUE
  270. END IF
  271. END IF
  272. JX = JX + INCX
  273. 60 CONTINUE
  274. ELSE
  275. DO 80, J = 1, N
  276. IF( X( JX ).NE.ZERO )THEN
  277. TEMP = ALPHA*X( JX )
  278. IY = KY
  279. K = KUP1 - J
  280. IF( NOCONJ )THEN
  281. DO 70, I = MAX( 1, J - KU ), MIN( M, J + KL )
  282. Y( IY ) = Y( IY ) + TEMP*A( K + I, J )
  283. IY = IY + INCY
  284. 70 CONTINUE
  285. ELSE
  286. DO 75, I = MAX( 1, J - KU ), MIN( M, J + KL )
  287. Y( IY ) = Y( IY ) + TEMP*DCONJG(A( K + I, J ))
  288. IY = IY + INCY
  289. 75 CONTINUE
  290. END IF
  291. END IF
  292. JX = JX + INCX
  293. IF( J.GT.KU )
  294. $ KY = KY + INCY
  295. 80 CONTINUE
  296. END IF
  297. ELSE
  298. *
  299. * Form y := alpha*A'*x + y or y := alpha*conjg( A' )*x + y.
  300. *
  301. JY = KY
  302. IF( INCX.EQ.1 )THEN
  303. DO 110, J = 1, N
  304. TEMP = ZERO
  305. K = KUP1 - J
  306. IF( NOCONJ )THEN
  307. DO 90, I = MAX( 1, J - KU ), MIN( M, J + KL )
  308. TEMP = TEMP + A( K + I, J )*X( I )
  309. 90 CONTINUE
  310. ELSE
  311. DO 100, I = MAX( 1, J - KU ), MIN( M, J + KL )
  312. TEMP = TEMP + DCONJG( A( K + I, J ) )*X( I )
  313. 100 CONTINUE
  314. END IF
  315. Y( JY ) = Y( JY ) + ALPHA*TEMP
  316. JY = JY + INCY
  317. 110 CONTINUE
  318. ELSE
  319. DO 140, J = 1, N
  320. TEMP = ZERO
  321. IX = KX
  322. K = KUP1 - J
  323. IF( NOCONJ )THEN
  324. DO 120, I = MAX( 1, J - KU ), MIN( M, J + KL )
  325. TEMP = TEMP + A( K + I, J )*X( IX )
  326. IX = IX + INCX
  327. 120 CONTINUE
  328. ELSE
  329. DO 130, I = MAX( 1, J - KU ), MIN( M, J + KL )
  330. TEMP = TEMP + DCONJG( A( K + I, J ) )*X( IX )
  331. IX = IX + INCX
  332. 130 CONTINUE
  333. END IF
  334. Y( JY ) = Y( JY ) + ALPHA*TEMP
  335. JY = JY + INCY
  336. IF( J.GT.KU )
  337. $ KX = KX + INCX
  338. 140 CONTINUE
  339. END IF
  340. END IF
  341. ELSE
  342. IF(NOTRANS)THEN
  343. *
  344. * Form y := alpha*A*x + y.
  345. *
  346. JX = KX
  347. IF( INCY.EQ.1 )THEN
  348. DO 160, J = 1, N
  349. IF( X( JX ).NE.ZERO )THEN
  350. TEMP = ALPHA*DCONJG(X( JX ))
  351. K = KUP1 - J
  352. IF( NOCONJ )THEN
  353. DO 150, I = MAX( 1, J - KU ), MIN( M, J + KL )
  354. Y( I ) = Y( I ) + TEMP*A( K + I, J )
  355. 150 CONTINUE
  356. ELSE
  357. DO 155, I = MAX( 1, J - KU ), MIN( M, J + KL )
  358. Y( I ) = Y( I ) + TEMP*DCONJG(A( K + I, J ))
  359. 155 CONTINUE
  360. END IF
  361. END IF
  362. JX = JX + INCX
  363. 160 CONTINUE
  364. ELSE
  365. DO 180, J = 1, N
  366. IF( X( JX ).NE.ZERO )THEN
  367. TEMP = ALPHA*DCONJG(X( JX ))
  368. IY = KY
  369. K = KUP1 - J
  370. IF( NOCONJ )THEN
  371. DO 170, I = MAX( 1, J - KU ), MIN( M, J + KL )
  372. Y( IY ) = Y( IY ) + TEMP*A( K + I, J )
  373. IY = IY + INCY
  374. 170 CONTINUE
  375. ELSE
  376. DO 175, I = MAX( 1, J - KU ), MIN( M, J + KL )
  377. Y( IY ) = Y( IY ) + TEMP*DCONJG(A( K + I, J ))
  378. IY = IY + INCY
  379. 175 CONTINUE
  380. END IF
  381. END IF
  382. JX = JX + INCX
  383. IF( J.GT.KU )
  384. $ KY = KY + INCY
  385. 180 CONTINUE
  386. END IF
  387. ELSE
  388. *
  389. * Form y := alpha*A'*x + y or y := alpha*conjg( A' )*x + y.
  390. *
  391. JY = KY
  392. IF( INCX.EQ.1 )THEN
  393. DO 210, J = 1, N
  394. TEMP = ZERO
  395. K = KUP1 - J
  396. IF( NOCONJ )THEN
  397. DO 190, I = MAX( 1, J - KU ), MIN( M, J + KL )
  398. TEMP = TEMP + A( K + I, J )*DCONJG(X( I ))
  399. 190 CONTINUE
  400. ELSE
  401. DO 200, I = MAX( 1, J - KU ), MIN( M, J + KL )
  402. TEMP = TEMP + DCONJG( A( K + I, J ) )*DCONJG(X( I ))
  403. 200 CONTINUE
  404. END IF
  405. Y( JY ) = Y( JY ) + ALPHA*TEMP
  406. JY = JY + INCY
  407. 210 CONTINUE
  408. ELSE
  409. DO 240, J = 1, N
  410. TEMP = ZERO
  411. IX = KX
  412. K = KUP1 - J
  413. IF( NOCONJ )THEN
  414. DO 220, I = MAX( 1, J - KU ), MIN( M, J + KL )
  415. TEMP = TEMP + A( K + I, J )*DCONJG(X( IX ))
  416. IX = IX + INCX
  417. 220 CONTINUE
  418. ELSE
  419. DO 230, I = MAX( 1, J - KU ), MIN( M, J + KL )
  420. TEMP = TEMP + DCONJG( A( K + I, J ) )*DCONJG(X(IX ))
  421. IX = IX + INCX
  422. 230 CONTINUE
  423. END IF
  424. Y( JY ) = Y( JY ) + ALPHA*TEMP
  425. JY = JY + INCY
  426. IF( J.GT.KU )
  427. $ KX = KX + INCX
  428. 240 CONTINUE
  429. END IF
  430. END IF
  431. END IF
  432. *
  433. RETURN
  434. *
  435. * End of ZGBMV .
  436. *
  437. END