211 SUBROUTINE sggqrf( N, M, P, A, LDA, TAUA, B, LDB, TAUB, WORK,
219 INTEGER INFO, LDA, LDB, LWORK, M, N, P
222 REAL A( LDA, * ), B( LDB, * ), TAUA( * ), TAUB( * ),
230 INTEGER LOPT, LWKOPT, NB, NB1, NB2, NB3
239 EXTERNAL sroundup_lwork
242 INTRINSIC int, max, min
249 nb1 = ilaenv( 1,
'SGEQRF',
' ', n, m, -1, -1 )
250 nb2 = ilaenv( 1,
'SGERQF',
' ', n, p, -1, -1 )
251 nb3 = ilaenv( 1,
'SORMQR',
' ', n, m, p, -1 )
252 nb = max( nb1, nb2, nb3 )
253 lwkopt = max( 1, max( n, m, p )*nb )
254 work( 1 ) = sroundup_lwork( lwkopt )
256 lquery = ( lwork.EQ.-1 )
259 ELSE IF( m.LT.0 )
THEN
261 ELSE IF( p.LT.0 )
THEN
263 ELSE IF( lda.LT.max( 1, n ) )
THEN
265 ELSE IF( ldb.LT.max( 1, n ) )
THEN
267 ELSE IF( lwork.LT.max( 1, n, m, p ) .AND. .NOT.lquery )
THEN
271 CALL xerbla(
'SGGQRF', -info )
273 ELSE IF( lquery )
THEN
279 CALL sgeqrf( n, m, a, lda, taua, work, lwork, info )
280 lopt = int( work( 1 ) )
284 CALL sormqr(
'Left',
'Transpose', n, p, min( n, m ), a, lda,
286 $ b, ldb, work, lwork, info )
287 lopt = max( lopt, int( work( 1 ) ) )
291 CALL sgerqf( n, p, b, ldb, taub, work, lwork, info )
292 lwkopt = max( lopt, int( work( 1 ) ) )
294 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 sggqrf(n, m, p, a, lda, taua, b, ldb, taub, work, lwork, info)
SGGQRF
subroutine sormqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
SORMQR