211 SUBROUTINE dggqrf( N, M, P, A, LDA, TAUA, B, LDB, TAUB, WORK,
219 INTEGER INFO, LDA, LDB, LWORK, M, N, P
222 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), TAUA( * ), TAUB( * ),
230 INTEGER LOPT, LWKOPT, NB, NB1, NB2, NB3
240 INTRINSIC int, max, min
247 nb1 = ilaenv( 1,
'DGEQRF',
' ', n, m, -1, -1 )
248 nb2 = ilaenv( 1,
'DGERQF',
' ', n, p, -1, -1 )
249 nb3 = ilaenv( 1,
'DORMQR',
' ', n, m, p, -1 )
250 nb = max( nb1, nb2, nb3 )
251 lwkopt = max( 1, max( n, m, p )*nb )
253 lquery = ( lwork.EQ.-1 )
256 ELSE IF( m.LT.0 )
THEN
258 ELSE IF( p.LT.0 )
THEN
260 ELSE IF( lda.LT.max( 1, n ) )
THEN
262 ELSE IF( ldb.LT.max( 1, n ) )
THEN
264 ELSE IF( lwork.LT.max( 1, n, m, p ) .AND. .NOT.lquery )
THEN
268 CALL xerbla(
'DGGQRF', -info )
270 ELSE IF( lquery )
THEN
276 CALL dgeqrf( n, m, a, lda, taua, work, lwork, info )
277 lopt = int( work( 1 ) )
281 CALL dormqr(
'Left',
'Transpose', n, p, min( n, m ), a, lda,
283 $ b, ldb, work, lwork, info )
284 lopt = max( lopt, int( work( 1 ) ) )
288 CALL dgerqf( n, p, b, ldb, taub, work, lwork, info )
290 work( 1 ) = max( lopt, int( work( 1 ) ) )
subroutine dgeqrf(m, n, a, lda, tau, work, lwork, info)
DGEQRF
subroutine dgerqf(m, n, a, lda, tau, work, lwork, info)
DGERQF
subroutine dggqrf(n, m, p, a, lda, taua, b, ldb, taub, work, lwork, info)
DGGQRF
subroutine dormqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
DORMQR