210 SUBROUTINE sggrqf( M, P, N, A, LDA, TAUA, B, LDB, TAUB, WORK,
218 INTEGER INFO, LDA, LDB, LWORK, M, N, P
221 REAL A( LDA, * ), B( LDB, * ), TAUA( * ), TAUB( * ),
229 INTEGER LOPT, LWKOPT, NB, NB1, NB2, NB3
237 EXTERNAL ilaenv, sroundup_lwork
240 INTRINSIC int, max, min
247 nb1 = ilaenv( 1,
'SGERQF',
' ', m, n, -1, -1 )
248 nb2 = ilaenv( 1,
'SGEQRF',
' ', p, n, -1, -1 )
249 nb3 = ilaenv( 1,
'SORMRQ',
' ', m, n, p, -1 )
250 nb = max( nb1, nb2, nb3 )
251 lwkopt = max( 1, max( n, m, p )*nb )
252 work( 1 ) = sroundup_lwork(lwkopt)
253 lquery = ( lwork.EQ.-1 )
256 ELSE IF( p.LT.0 )
THEN
258 ELSE IF( n.LT.0 )
THEN
260 ELSE IF( lda.LT.max( 1, m ) )
THEN
262 ELSE IF( ldb.LT.max( 1, p ) )
THEN
264 ELSE IF( lwork.LT.max( 1, m, p, n ) .AND. .NOT.lquery )
THEN
268 CALL xerbla(
'SGGRQF', -info )
270 ELSE IF( lquery )
THEN
276 CALL sgerqf( m, n, a, lda, taua, work, lwork, info )
277 lopt = int( work( 1 ) )
281 CALL sormrq(
'Right',
'Transpose', p, n, min( m, n ),
282 $ a( max( 1, m-n+1 ), 1 ), lda, taua, b, ldb, work,
284 lopt = max( lopt, int( work( 1 ) ) )
288 CALL sgeqrf( p, n, b, ldb, taub, work, lwork, info )
289 lwkopt = max( lopt, int( work( 1 ) ) )
290 work( 1 ) = sroundup_lwork( lwkopt )
subroutine sgeqrf(m, n, a, lda, tau, work, lwork, info)
SGEQRF
subroutine sgerqf(m, n, a, lda, tau, work, lwork, info)
SGERQF
subroutine sggrqf(m, p, n, a, lda, taua, b, ldb, taub, work, lwork, info)
SGGRQF
subroutine sormrq(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
SORMRQ