194 SUBROUTINE sormbr( VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C,
195 $ LDC, WORK, LWORK, INFO )
202 CHARACTER SIDE, TRANS, VECT
203 INTEGER INFO, K, LDA, LDC, LWORK, M, N
206 REAL A( lda, * ), C( ldc, * ), TAU( * ),
213 LOGICAL APPLYQ, LEFT, LQUERY, NOTRAN
215 INTEGER I1, I2, IINFO, LWKOPT, MI, NB, NI, NQ, NW
220 EXTERNAL ilaenv, lsame
233 applyq = lsame( vect,
'Q' )
234 left = lsame( side,
'L' )
235 notran = lsame( trans,
'N' )
236 lquery = ( lwork.EQ.-1 )
247 IF( .NOT.applyq .AND. .NOT.lsame( vect,
'P' ) )
THEN 249 ELSE IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN 251 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) )
THEN 253 ELSE IF( m.LT.0 )
THEN 255 ELSE IF( n.LT.0 )
THEN 257 ELSE IF( k.LT.0 )
THEN 259 ELSE IF( ( applyq .AND. lda.LT.max( 1, nq ) ) .OR.
260 $ ( .NOT.applyq .AND. lda.LT.max( 1, min( nq, k ) ) ) )
263 ELSE IF( ldc.LT.max( 1, m ) )
THEN 265 ELSE IF( lwork.LT.nw .AND. .NOT.lquery )
THEN 272 nb = ilaenv( 1,
'SORMQR', side // trans, m-1, n, m-1,
275 nb = ilaenv( 1,
'SORMQR', side // trans, m, n-1, n-1,
280 nb = ilaenv( 1,
'SORMLQ', side // trans, m-1, n, m-1,
283 nb = ilaenv( 1,
'SORMLQ', side // trans, m, n-1, n-1,
292 CALL xerbla(
'SORMBR', -info )
294 ELSE IF( lquery )
THEN 301 IF( m.EQ.0 .OR. n.EQ.0 )
312 CALL sormqr( side, trans, m, n, k, a, lda, tau, c, ldc,
313 $ work, lwork, iinfo )
314 ELSE IF( nq.GT.1 )
THEN 329 CALL sormqr( side, trans, mi, ni, nq-1, a( 2, 1 ), lda, tau,
330 $ c( i1, i2 ), ldc, work, lwork, iinfo )
345 CALL sormlq( side, transt, m, n, k, a, lda, tau, c, ldc,
346 $ work, lwork, iinfo )
347 ELSE IF( nq.GT.1 )
THEN 362 CALL sormlq( side, transt, mi, ni, nq-1, a( 1, 2 ), lda,
363 $ tau, c( i1, i2 ), ldc, work, lwork, iinfo )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sormqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMQR
subroutine sormlq(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMLQ
subroutine sormbr(VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMBR