214 SUBROUTINE dggrqf( M, P, N, A, LDA, TAUA, B, LDB, TAUB, WORK,
223 INTEGER INFO, LDA, LDB, LWORK, M, N, P
226 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), TAUA( * ), TAUB( * ),
234 INTEGER LOPT, LWKOPT, NB, NB1, NB2, NB3
244 INTRINSIC int, max, min
251 nb1 = ilaenv( 1,
'DGERQF',
' ', m, n, -1, -1 )
252 nb2 = ilaenv( 1,
'DGEQRF',
' ', p, n, -1, -1 )
253 nb3 = ilaenv( 1,
'DORMRQ',
' ', m, n, p, -1 )
254 nb = max( nb1, nb2, nb3 )
255 lwkopt = max( n, m, p )*nb
257 lquery = ( lwork.EQ.-1 )
260 ELSE IF( p.LT.0 )
THEN
262 ELSE IF( n.LT.0 )
THEN
264 ELSE IF( lda.LT.max( 1, m ) )
THEN
266 ELSE IF( ldb.LT.max( 1, p ) )
THEN
268 ELSE IF( lwork.LT.max( 1, m, p, n ) .AND. .NOT.lquery )
THEN
272 CALL xerbla(
'DGGRQF', -info )
274 ELSE IF( lquery )
THEN
280 CALL dgerqf( m, n, a, lda, taua, work, lwork, info )
285 CALL dormrq(
'Right',
'Transpose', p, n, min( m, n ),
286 $ a( max( 1, m-n+1 ), 1 ), lda, taua, b, ldb, work,
288 lopt = max( lopt, int( work( 1 ) ) )
292 CALL dgeqrf( p, n, b, ldb, taub, work, lwork, info )
293 work( 1 ) = max( lopt, int( work( 1 ) ) )