159 SUBROUTINE sgelq( M, N, A, LDA, T, TSIZE, WORK, LWORK,
168 INTEGER INFO, LDA, M, N, TSIZE, LWORK
171 REAL A( lda, * ), T( * ), WORK( * )
178 LOGICAL LQUERY, LMINWS, MINT, MINW
179 INTEGER MB, NB, MINTSZ, NBLCKS
189 INTRINSIC max, min, mod
201 lquery = ( tsize.EQ.-1 .OR. tsize.EQ.-2 .OR.
202 $ lwork.EQ.-1 .OR. lwork.EQ.-2 )
206 IF( tsize.EQ.-2 .OR. lwork.EQ.-2 )
THEN
207 IF( tsize.NE.-1 ) mint = .true.
208 IF( lwork.NE.-1 ) minw = .true.
213 IF( min( m, n ).GT.0 )
THEN
214 mb = ilaenv( 1,
'SGELQ ',
' ', m, n, 1, -1 )
215 nb = ilaenv( 1,
'SGELQ ',
' ', m, n, 2, -1 )
220 IF( mb.GT.min( m, n ) .OR. mb.LT.1 ) mb = 1
221 IF( nb.GT.n .OR. nb.LE.m ) nb = n
223 IF ( nb.GT.m .AND. n.GT.m )
THEN
224 IF( mod( n - m, nb - m ).EQ.0 )
THEN
225 nblcks = ( n - m ) / ( nb - m )
227 nblcks = ( n - m ) / ( nb - m ) + 1
236 IF( ( tsize.LT.max( 1, mb*m*nblcks + 5 ) .OR. lwork.LT.mb*m )
237 $ .AND. ( lwork.GE.m ) .AND. ( tsize.GE.mintsz )
238 $ .AND. ( .NOT.lquery ) )
THEN
239 IF( tsize.LT.max( 1, mb*m*nblcks + 5 ) )
THEN
244 IF( lwork.LT.mb*m )
THEN
252 ELSE IF( n.LT.0 )
THEN
254 ELSE IF( lda.LT.max( 1, m ) )
THEN
256 ELSE IF( tsize.LT.max( 1, mb*m*nblcks + 5 )
257 $ .AND. ( .NOT.lquery ) .AND. ( .NOT.lminws ) )
THEN
259 ELSE IF( ( lwork.LT.max( 1, m*mb ) ) .and .( .NOT.lquery )
260 $ .AND. ( .NOT.lminws ) )
THEN
268 t( 1 ) = mb*m*nblcks + 5
273 work( 1 ) = max( 1, n )
275 work( 1 ) = max( 1, mb*m )
279 CALL xerbla(
'SGELQ', -info )
281 ELSE IF( lquery )
THEN
287 IF( min( m, n ).EQ.0 )
THEN
293 IF( ( n.LE.m ) .OR. ( nb.LE.m ) .OR. ( nb.GE.n ) )
THEN
294 CALL sgelqt( m, n, mb, a, lda, t( 6 ), mb, work, info )
296 CALL slaswlq( m, n, mb, nb, a, lda, t( 6 ), mb, work,
300 work( 1 ) = max( 1, mb*m )
subroutine sgelqt(M, N, MB, A, LDA, T, LDT, WORK, INFO)
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slaswlq(M, N, MB, NB, A, LDA, T, LDT, WORK, LWORK, INFO)
subroutine sgelq(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)