dtrsm.f 12 KB

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