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 sormbr(VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMBR
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