strmm.f 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. *DECK STRMM
  2. SUBROUTINE STRMM (SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA,
  3. $ B, LDB)
  4. C***BEGIN PROLOGUE STRMM
  5. C***PURPOSE Multiply a real general matrix by a real triangular matrix.
  6. C***LIBRARY SLATEC (BLAS)
  7. C***CATEGORY D1B6
  8. C***TYPE SINGLE PRECISION (STRMM-S, DTRMM-D, CTRMM-C)
  9. C***KEYWORDS LEVEL 3 BLAS, LINEAR ALGEBRA
  10. C***AUTHOR Dongarra, J., (ANL)
  11. C Duff, I., (AERE)
  12. C Du Croz, J., (NAG)
  13. C Hammarling, S. (NAG)
  14. C***DESCRIPTION
  15. C
  16. C STRMM performs one of the matrix-matrix operations
  17. C
  18. C B := alpha*op( A )*B, or B := alpha*B*op( A ),
  19. C
  20. C where alpha is a scalar, B is an m by n matrix, A is a unit, or
  21. C non-unit, upper or lower triangular matrix and op( A ) is one of
  22. C
  23. C op( A ) = A or op( A ) = A'.
  24. C
  25. C Parameters
  26. C ==========
  27. C
  28. C SIDE - CHARACTER*1.
  29. C On entry, SIDE specifies whether op( A ) multiplies B from
  30. C the left or right as follows:
  31. C
  32. C SIDE = 'L' or 'l' B := alpha*op( A )*B.
  33. C
  34. C SIDE = 'R' or 'r' B := alpha*B*op( A ).
  35. C
  36. C Unchanged on exit.
  37. C
  38. C UPLO - CHARACTER*1.
  39. C On entry, UPLO specifies whether the matrix A is an upper or
  40. C lower triangular matrix as follows:
  41. C
  42. C UPLO = 'U' or 'u' A is an upper triangular matrix.
  43. C
  44. C UPLO = 'L' or 'l' A is a lower triangular matrix.
  45. C
  46. C Unchanged on exit.
  47. C
  48. C TRANSA - CHARACTER*1.
  49. C On entry, TRANSA specifies the form of op( A ) to be used in
  50. C the matrix multiplication as follows:
  51. C
  52. C TRANSA = 'N' or 'n' op( A ) = A.
  53. C
  54. C TRANSA = 'T' or 't' op( A ) = A'.
  55. C
  56. C TRANSA = 'C' or 'c' op( A ) = A'.
  57. C
  58. C Unchanged on exit.
  59. C
  60. C DIAG - CHARACTER*1.
  61. C On entry, DIAG specifies whether or not A is unit triangular
  62. C as follows:
  63. C
  64. C DIAG = 'U' or 'u' A is assumed to be unit triangular.
  65. C
  66. C DIAG = 'N' or 'n' A is not assumed to be unit
  67. C triangular.
  68. C
  69. C Unchanged on exit.
  70. C
  71. C M - INTEGER.
  72. C On entry, M specifies the number of rows of B. M must be at
  73. C least zero.
  74. C Unchanged on exit.
  75. C
  76. C N - INTEGER.
  77. C On entry, N specifies the number of columns of B. N must be
  78. C at least zero.
  79. C Unchanged on exit.
  80. C
  81. C ALPHA - REAL .
  82. C On entry, ALPHA specifies the scalar alpha. When alpha is
  83. C zero then A is not referenced and B need not be set before
  84. C entry.
  85. C Unchanged on exit.
  86. C
  87. C A - REAL array of DIMENSION ( LDA, k ), where k is m
  88. C when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'.
  89. C Before entry with UPLO = 'U' or 'u', the leading k by k
  90. C upper triangular part of the array A must contain the upper
  91. C triangular matrix and the strictly lower triangular part of
  92. C A is not referenced.
  93. C Before entry with UPLO = 'L' or 'l', the leading k by k
  94. C lower triangular part of the array A must contain the lower
  95. C triangular matrix and the strictly upper triangular part of
  96. C A is not referenced.
  97. C Note that when DIAG = 'U' or 'u', the diagonal elements of
  98. C A are not referenced either, but are assumed to be unity.
  99. C Unchanged on exit.
  100. C
  101. C LDA - INTEGER.
  102. C On entry, LDA specifies the first dimension of A as declared
  103. C in the calling (sub) program. When SIDE = 'L' or 'l' then
  104. C LDA must be at least max( 1, m ), when SIDE = 'R' or 'r'
  105. C then LDA must be at least max( 1, n ).
  106. C Unchanged on exit.
  107. C
  108. C B - REAL array of DIMENSION ( LDB, n ).
  109. C Before entry, the leading m by n part of the array B must
  110. C contain the matrix B, and on exit is overwritten by the
  111. C transformed matrix.
  112. C
  113. C LDB - INTEGER.
  114. C On entry, LDB specifies the first dimension of B as declared
  115. C in the calling (sub) program. LDB must be at least
  116. C max( 1, m ).
  117. C Unchanged on exit.
  118. C
  119. C***REFERENCES Dongarra, J., Du Croz, J., Duff, I., and Hammarling, S.
  120. C A set of level 3 basic linear algebra subprograms.
  121. C ACM TOMS, Vol. 16, No. 1, pp. 1-17, March 1990.
  122. C***ROUTINES CALLED LSAME, XERBLA
  123. C***REVISION HISTORY (YYMMDD)
  124. C 890208 DATE WRITTEN
  125. C 910605 Modified to meet SLATEC prologue standards. Only comment
  126. C lines were modified. (BKS)
  127. C***END PROLOGUE STRMM
  128. C .. Scalar Arguments ..
  129. CHARACTER*1 SIDE, UPLO, TRANSA, DIAG
  130. INTEGER M, N, LDA, LDB
  131. REAL ALPHA
  132. C .. Array Arguments ..
  133. REAL A( LDA, * ), B( LDB, * )
  134. C .. External Functions ..
  135. LOGICAL LSAME
  136. EXTERNAL LSAME
  137. C .. External Subroutines ..
  138. EXTERNAL XERBLA
  139. C .. Intrinsic Functions ..
  140. INTRINSIC MAX
  141. C .. Local Scalars ..
  142. LOGICAL LSIDE, NOUNIT, UPPER
  143. INTEGER I, INFO, J, K, NROWA
  144. REAL TEMP
  145. C .. Parameters ..
  146. REAL ONE , ZERO
  147. PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
  148. C***FIRST EXECUTABLE STATEMENT STRMM
  149. C
  150. C Test the input parameters.
  151. C
  152. LSIDE = LSAME( SIDE , 'L' )
  153. IF( LSIDE )THEN
  154. NROWA = M
  155. ELSE
  156. NROWA = N
  157. END IF
  158. NOUNIT = LSAME( DIAG , 'N' )
  159. UPPER = LSAME( UPLO , 'U' )
  160. C
  161. INFO = 0
  162. IF( ( .NOT.LSIDE ).AND.
  163. $ ( .NOT.LSAME( SIDE , 'R' ) ) )THEN
  164. INFO = 1
  165. ELSE IF( ( .NOT.UPPER ).AND.
  166. $ ( .NOT.LSAME( UPLO , 'L' ) ) )THEN
  167. INFO = 2
  168. ELSE IF( ( .NOT.LSAME( TRANSA, 'N' ) ).AND.
  169. $ ( .NOT.LSAME( TRANSA, 'T' ) ).AND.
  170. $ ( .NOT.LSAME( TRANSA, 'C' ) ) )THEN
  171. INFO = 3
  172. ELSE IF( ( .NOT.LSAME( DIAG , 'U' ) ).AND.
  173. $ ( .NOT.LSAME( DIAG , 'N' ) ) )THEN
  174. INFO = 4
  175. ELSE IF( M .LT.0 )THEN
  176. INFO = 5
  177. ELSE IF( N .LT.0 )THEN
  178. INFO = 6
  179. ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN
  180. INFO = 9
  181. ELSE IF( LDB.LT.MAX( 1, M ) )THEN
  182. INFO = 11
  183. END IF
  184. IF( INFO.NE.0 )THEN
  185. CALL XERBLA( 'STRMM ', INFO )
  186. RETURN
  187. END IF
  188. C
  189. C Quick return if possible.
  190. C
  191. IF( N.EQ.0 )
  192. $ RETURN
  193. C
  194. C And when alpha.eq.zero.
  195. C
  196. IF( ALPHA.EQ.ZERO )THEN
  197. DO 20, J = 1, N
  198. DO 10, I = 1, M
  199. B( I, J ) = ZERO
  200. 10 CONTINUE
  201. 20 CONTINUE
  202. RETURN
  203. END IF
  204. C
  205. C Start the operations.
  206. C
  207. IF( LSIDE )THEN
  208. IF( LSAME( TRANSA, 'N' ) )THEN
  209. C
  210. C Form B := alpha*A*B.
  211. C
  212. IF( UPPER )THEN
  213. DO 50, J = 1, N
  214. DO 40, K = 1, M
  215. IF( B( K, J ).NE.ZERO )THEN
  216. TEMP = ALPHA*B( K, J )
  217. DO 30, I = 1, K - 1
  218. B( I, J ) = B( I, J ) + TEMP*A( I, K )
  219. 30 CONTINUE
  220. IF( NOUNIT )
  221. $ TEMP = TEMP*A( K, K )
  222. B( K, J ) = TEMP
  223. END IF
  224. 40 CONTINUE
  225. 50 CONTINUE
  226. ELSE
  227. DO 80, J = 1, N
  228. DO 70 K = M, 1, -1
  229. IF( B( K, J ).NE.ZERO )THEN
  230. TEMP = ALPHA*B( K, J )
  231. B( K, J ) = TEMP
  232. IF( NOUNIT )
  233. $ B( K, J ) = B( K, J )*A( K, K )
  234. DO 60, I = K + 1, M
  235. B( I, J ) = B( I, J ) + TEMP*A( I, K )
  236. 60 CONTINUE
  237. END IF
  238. 70 CONTINUE
  239. 80 CONTINUE
  240. END IF
  241. ELSE
  242. C
  243. C Form B := alpha*B*A'.
  244. C
  245. IF( UPPER )THEN
  246. DO 110, J = 1, N
  247. DO 100, I = M, 1, -1
  248. TEMP = B( I, J )
  249. IF( NOUNIT )
  250. $ TEMP = TEMP*A( I, I )
  251. DO 90, K = 1, I - 1
  252. TEMP = TEMP + A( K, I )*B( K, J )
  253. 90 CONTINUE
  254. B( I, J ) = ALPHA*TEMP
  255. 100 CONTINUE
  256. 110 CONTINUE
  257. ELSE
  258. DO 140, J = 1, N
  259. DO 130, I = 1, M
  260. TEMP = B( I, J )
  261. IF( NOUNIT )
  262. $ TEMP = TEMP*A( I, I )
  263. DO 120, K = I + 1, M
  264. TEMP = TEMP + A( K, I )*B( K, J )
  265. 120 CONTINUE
  266. B( I, J ) = ALPHA*TEMP
  267. 130 CONTINUE
  268. 140 CONTINUE
  269. END IF
  270. END IF
  271. ELSE
  272. IF( LSAME( TRANSA, 'N' ) )THEN
  273. C
  274. C Form B := alpha*B*A.
  275. C
  276. IF( UPPER )THEN
  277. DO 180, J = N, 1, -1
  278. TEMP = ALPHA
  279. IF( NOUNIT )
  280. $ TEMP = TEMP*A( J, J )
  281. DO 150, I = 1, M
  282. B( I, J ) = TEMP*B( I, J )
  283. 150 CONTINUE
  284. DO 170, K = 1, J - 1
  285. IF( A( K, J ).NE.ZERO )THEN
  286. TEMP = ALPHA*A( K, J )
  287. DO 160, I = 1, M
  288. B( I, J ) = B( I, J ) + TEMP*B( I, K )
  289. 160 CONTINUE
  290. END IF
  291. 170 CONTINUE
  292. 180 CONTINUE
  293. ELSE
  294. DO 220, J = 1, N
  295. TEMP = ALPHA
  296. IF( NOUNIT )
  297. $ TEMP = TEMP*A( J, J )
  298. DO 190, I = 1, M
  299. B( I, J ) = TEMP*B( I, J )
  300. 190 CONTINUE
  301. DO 210, K = J + 1, N
  302. IF( A( K, J ).NE.ZERO )THEN
  303. TEMP = ALPHA*A( K, J )
  304. DO 200, I = 1, M
  305. B( I, J ) = B( I, J ) + TEMP*B( I, K )
  306. 200 CONTINUE
  307. END IF
  308. 210 CONTINUE
  309. 220 CONTINUE
  310. END IF
  311. ELSE
  312. C
  313. C Form B := alpha*B*A'.
  314. C
  315. IF( UPPER )THEN
  316. DO 260, K = 1, N
  317. DO 240, J = 1, K - 1
  318. IF( A( J, K ).NE.ZERO )THEN
  319. TEMP = ALPHA*A( J, K )
  320. DO 230, I = 1, M
  321. B( I, J ) = B( I, J ) + TEMP*B( I, K )
  322. 230 CONTINUE
  323. END IF
  324. 240 CONTINUE
  325. TEMP = ALPHA
  326. IF( NOUNIT )
  327. $ TEMP = TEMP*A( K, K )
  328. IF( TEMP.NE.ONE )THEN
  329. DO 250, I = 1, M
  330. B( I, K ) = TEMP*B( I, K )
  331. 250 CONTINUE
  332. END IF
  333. 260 CONTINUE
  334. ELSE
  335. DO 300, K = N, 1, -1
  336. DO 280, J = K + 1, N
  337. IF( A( J, K ).NE.ZERO )THEN
  338. TEMP = ALPHA*A( J, K )
  339. DO 270, I = 1, M
  340. B( I, J ) = B( I, J ) + TEMP*B( I, K )
  341. 270 CONTINUE
  342. END IF
  343. 280 CONTINUE
  344. TEMP = ALPHA
  345. IF( NOUNIT )
  346. $ TEMP = TEMP*A( K, K )
  347. IF( TEMP.NE.ONE )THEN
  348. DO 290, I = 1, M
  349. B( I, K ) = TEMP*B( I, K )
  350. 290 CONTINUE
  351. END IF
  352. 300 CONTINUE
  353. END IF
  354. END IF
  355. END IF
  356. C
  357. RETURN
  358. C
  359. C End of STRMM .
  360. C
  361. END