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 ) ) )