172 SUBROUTINE sgeqr( M, N, A, LDA, T, TSIZE, WORK, LWORK,
180 INTEGER INFO, LDA, M, N, TSIZE, LWORK
183 REAL A( LDA, * ), T( * ), WORK( * )
190 LOGICAL LQUERY, LMINWS, MINT, MINW
191 INTEGER MB, NB, MINTSZ, NBLCKS
201 INTRINSIC max, min, mod
213 lquery = ( tsize.EQ.-1 .OR. tsize.EQ.-2 .OR.
214 $ lwork.EQ.-1 .OR. lwork.EQ.-2 )
218 IF( tsize.EQ.-2 .OR. lwork.EQ.-2 )
THEN
219 IF( tsize.NE.-1 ) mint = .true.
220 IF( lwork.NE.-1 ) minw = .true.
225 IF( min( m, n ).GT.0 )
THEN
226 mb = ilaenv( 1,
'SGEQR ',
' ', m, n, 1, -1 )
227 nb = ilaenv( 1,
'SGEQR ',
' ', m, n, 2, -1 )
232 IF( mb.GT.m .OR. mb.LE.n ) mb = m
233 IF( nb.GT.min( m, n ) .OR. nb.LT.1 ) nb = 1
235 IF ( mb.GT.n .AND. m.GT.n )
THEN
236 IF( mod( m - n, mb - n ).EQ.0 )
THEN
237 nblcks = ( m - n ) / ( mb - n )
239 nblcks = ( m - n ) / ( mb - n ) + 1
248 IF( ( tsize.LT.max( 1, nb*n*nblcks + 5 ) .OR. lwork.LT.nb*n )
249 $ .AND. ( lwork.GE.n ) .AND. ( tsize.GE.mintsz )
250 $ .AND. ( .NOT.lquery ) )
THEN
251 IF( tsize.LT.max( 1, nb*n*nblcks + 5 ) )
THEN
256 IF( lwork.LT.nb*n )
THEN
264 ELSE IF( n.LT.0 )
THEN
266 ELSE IF( lda.LT.max( 1, m ) )
THEN
268 ELSE IF( tsize.LT.max( 1, nb*n*nblcks + 5 )
269 $ .AND. ( .NOT.lquery ) .AND. ( .NOT.lminws ) )
THEN
271 ELSE IF( ( lwork.LT.max( 1, n*nb ) ) .AND. ( .NOT.lquery )
272 $ .AND. ( .NOT.lminws ) )
THEN
280 t( 1 ) = nb*n*nblcks + 5
285 work( 1 ) = max( 1, n )
287 work( 1 ) = max( 1, nb*n )
291 CALL xerbla(
'SGEQR', -info )
293 ELSE IF( lquery )
THEN
299 IF( min( m, n ).EQ.0 )
THEN
305 IF( ( m.LE.n ) .OR. ( mb.LE.n ) .OR. ( mb.GE.m ) )
THEN
306 CALL sgeqrt( m, n, nb, a, lda, t( 6 ), nb, work, info )
308 CALL slatsqr( m, n, mb, nb, a, lda, t( 6 ), nb, work,
312 work( 1 ) = max( 1, nb*n )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sgeqrt(M, N, NB, A, LDA, T, LDT, WORK, INFO)
SGEQRT
subroutine sgeqr(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
SGEQR
subroutine slatsqr(M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK, INFO)
SLATSQR