1
SUBROUTINE STRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB)
2
* .. Scalar Arguments ..
5
CHARACTER DIAG,SIDE,TRANSA,UPLO
7
* .. Array Arguments ..
14
* STRMM performs one of the matrix-matrix operations
16
* B := alpha*op( A )*B, or B := alpha*B*op( A ),
18
* where alpha is a scalar, B is an m by n matrix, A is a unit, or
19
* non-unit, upper or lower triangular matrix and op( A ) is one of
21
* op( A ) = A or op( A ) = A'.
27
* On entry, SIDE specifies whether op( A ) multiplies B from
28
* the left or right as follows:
30
* SIDE = 'L' or 'l' B := alpha*op( A )*B.
32
* SIDE = 'R' or 'r' B := alpha*B*op( A ).
37
* On entry, UPLO specifies whether the matrix A is an upper or
38
* lower triangular matrix as follows:
40
* UPLO = 'U' or 'u' A is an upper triangular matrix.
42
* UPLO = 'L' or 'l' A is a lower triangular matrix.
46
* TRANSA - CHARACTER*1.
47
* On entry, TRANSA specifies the form of op( A ) to be used in
48
* the matrix multiplication as follows:
50
* TRANSA = 'N' or 'n' op( A ) = A.
52
* TRANSA = 'T' or 't' op( A ) = A'.
54
* TRANSA = 'C' or 'c' op( A ) = A'.
59
* On entry, DIAG specifies whether or not A is unit triangular
62
* DIAG = 'U' or 'u' A is assumed to be unit triangular.
64
* DIAG = 'N' or 'n' A is not assumed to be unit
70
* On entry, M specifies the number of rows of B. M must be at
75
* On entry, N specifies the number of columns of B. N must be
80
* On entry, ALPHA specifies the scalar alpha. When alpha is
81
* zero then A is not referenced and B need not be set before
85
* A - REAL array of DIMENSION ( LDA, k ), where k is m
86
* when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'.
87
* Before entry with UPLO = 'U' or 'u', the leading k by k
88
* upper triangular part of the array A must contain the upper
89
* triangular matrix and the strictly lower triangular part of
90
* A is not referenced.
91
* Before entry with UPLO = 'L' or 'l', the leading k by k
92
* lower triangular part of the array A must contain the lower
93
* triangular matrix and the strictly upper triangular part of
94
* A is not referenced.
95
* Note that when DIAG = 'U' or 'u', the diagonal elements of
96
* A are not referenced either, but are assumed to be unity.
100
* On entry, LDA specifies the first dimension of A as declared
101
* in the calling (sub) program. When SIDE = 'L' or 'l' then
102
* LDA must be at least max( 1, m ), when SIDE = 'R' or 'r'
103
* then LDA must be at least max( 1, n ).
106
* B - REAL array of DIMENSION ( LDB, n ).
107
* Before entry, the leading m by n part of the array B must
108
* contain the matrix B, and on exit is overwritten by the
109
* transformed matrix.
112
* On entry, LDB specifies the first dimension of B as declared
113
* in the calling (sub) program. LDB must be at least
118
* Level 3 Blas routine.
120
* -- Written on 8-February-1989.
121
* Jack Dongarra, Argonne National Laboratory.
122
* Iain Duff, AERE Harwell.
123
* Jeremy Du Croz, Numerical Algorithms Group Ltd.
124
* Sven Hammarling, Numerical Algorithms Group Ltd.
127
* .. External Functions ..
131
* .. External Subroutines ..
134
* .. Intrinsic Functions ..
137
* .. Local Scalars ..
139
INTEGER I,INFO,J,K,NROWA
140
LOGICAL LSIDE,NOUNIT,UPPER
144
PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
147
* Test the input parameters.
149
LSIDE = LSAME(SIDE,'L')
155
NOUNIT = LSAME(DIAG,'N')
156
UPPER = LSAME(UPLO,'U')
159
IF ((.NOT.LSIDE) .AND. (.NOT.LSAME(SIDE,'R'))) THEN
161
ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THEN
163
ELSE IF ((.NOT.LSAME(TRANSA,'N')) .AND.
164
+ (.NOT.LSAME(TRANSA,'T')) .AND.
165
+ (.NOT.LSAME(TRANSA,'C'))) THEN
167
ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THEN
169
ELSE IF (M.LT.0) THEN
171
ELSE IF (N.LT.0) THEN
173
ELSE IF (LDA.LT.MAX(1,NROWA)) THEN
175
ELSE IF (LDB.LT.MAX(1,M)) THEN
179
CALL XERBLA('STRMM ',INFO)
183
* Quick return if possible.
185
IF (M.EQ.0 .OR. N.EQ.0) RETURN
187
* And when alpha.eq.zero.
189
IF (ALPHA.EQ.ZERO) THEN
198
* Start the operations.
201
IF (LSAME(TRANSA,'N')) THEN
203
* Form B := alpha*A*B.
208
IF (B(K,J).NE.ZERO) THEN
211
B(I,J) = B(I,J) + TEMP*A(I,K)
213
IF (NOUNIT) TEMP = TEMP*A(K,K)
221
IF (B(K,J).NE.ZERO) THEN
224
IF (NOUNIT) B(K,J) = B(K,J)*A(K,K)
226
B(I,J) = B(I,J) + TEMP*A(I,K)
234
* Form B := alpha*A'*B.
240
IF (NOUNIT) TEMP = TEMP*A(I,I)
242
TEMP = TEMP + A(K,I)*B(K,J)
251
IF (NOUNIT) TEMP = TEMP*A(I,I)
253
TEMP = TEMP + A(K,I)*B(K,J)
261
IF (LSAME(TRANSA,'N')) THEN
263
* Form B := alpha*B*A.
268
IF (NOUNIT) TEMP = TEMP*A(J,J)
273
IF (A(K,J).NE.ZERO) THEN
276
B(I,J) = B(I,J) + TEMP*B(I,K)
284
IF (NOUNIT) TEMP = TEMP*A(J,J)
289
IF (A(K,J).NE.ZERO) THEN
292
B(I,J) = B(I,J) + TEMP*B(I,K)
300
* Form B := alpha*B*A'.
305
IF (A(J,K).NE.ZERO) THEN
308
B(I,J) = B(I,J) + TEMP*B(I,K)
313
IF (NOUNIT) TEMP = TEMP*A(K,K)
314
IF (TEMP.NE.ONE) THEN
323
IF (A(J,K).NE.ZERO) THEN
326
B(I,J) = B(I,J) + TEMP*B(I,K)
331
IF (NOUNIT) TEMP = TEMP*A(K,K)
332
IF (TEMP.NE.ONE) THEN