189 SUBROUTINE sgels( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK,
199 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
202 REAL A( LDA, * ), B( LDB, * ), WORK( * )
209 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
213 INTEGER BROW, I, IASCL, IBSCL, J, MN, NB, SCLLEN, WSIZE
214 REAL ANRM, BIGNUM, BNRM, SMLNUM
222 REAL SLAMCH, SLANGE, SROUNDUP_LWORK
223 EXTERNAL lsame, ilaenv, slamch, slange,
240 lquery = ( lwork.EQ.-1 )
241 IF( .NOT.( lsame( trans,
'N' ) .OR.
242 $ lsame( trans,
'T' ) ) )
THEN
244 ELSE IF( m.LT.0 )
THEN
246 ELSE IF( n.LT.0 )
THEN
248 ELSE IF( nrhs.LT.0 )
THEN
250 ELSE IF( lda.LT.max( 1, m ) )
THEN
252 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN
254 ELSE IF( lwork.LT.max( 1, mn + max( mn, nrhs ) ) .AND.
261 IF( info.EQ.0 .OR. info.EQ.-10 )
THEN
264 IF( lsame( trans,
'N' ) )
268 nb = ilaenv( 1,
'SGEQRF',
' ', m, n, -1, -1 )
270 nb = max( nb, ilaenv( 1,
'SORMQR',
'LN', m, nrhs, n,
273 nb = max( nb, ilaenv( 1,
'SORMQR',
'LT', m, nrhs, n,
277 nb = ilaenv( 1,
'SGELQF',
' ', m, n, -1, -1 )
279 nb = max( nb, ilaenv( 1,
'SORMLQ',
'LT', n, nrhs, m,
282 nb = max( nb, ilaenv( 1,
'SORMLQ',
'LN', n, nrhs, m,
287 wsize = max( 1, mn + max( mn, nrhs )*nb )
288 work( 1 ) = sroundup_lwork( wsize )
293 CALL xerbla(
'SGELS ', -info )
295 ELSE IF( lquery )
THEN
301 IF( min( m, n, nrhs ).EQ.0 )
THEN
302 CALL slaset(
'Full', max( m, n ), nrhs, zero, zero, b, ldb )
308 smlnum = slamch(
'S' ) / slamch(
'P' )
309 bignum = one / smlnum
313 anrm = slange(
'M', m, n, a, lda, rwork )
315 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
319 CALL slascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
321 ELSE IF( anrm.GT.bignum )
THEN
325 CALL slascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
327 ELSE IF( anrm.EQ.zero )
THEN
331 CALL slaset(
'F', max( m, n ), nrhs, zero, zero, b, ldb )
338 bnrm = slange(
'M', brow, nrhs, b, ldb, rwork )
340 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
344 CALL slascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
347 ELSE IF( bnrm.GT.bignum )
THEN
351 CALL slascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
360 CALL sgeqrf( m, n, a, lda, work( 1 ), work( mn+1 ),
372 CALL sormqr(
'Left',
'Transpose', m, nrhs, n, a, lda,
373 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
380 CALL strtrs(
'Upper',
'No transpose',
'Non-unit', n,
382 $ a, lda, b, ldb, info )
396 CALL strtrs(
'Upper',
'Transpose',
'Non-unit', n, nrhs,
397 $ a, lda, b, ldb, info )
413 CALL sormqr(
'Left',
'No transpose', m, nrhs, n, a, lda,
414 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
427 CALL sgelqf( m, n, a, lda, work( 1 ), work( mn+1 ),
439 CALL strtrs(
'Lower',
'No transpose',
'Non-unit', m,
441 $ a, lda, b, ldb, info )
457 CALL sormlq(
'Left',
'Transpose', n, nrhs, m, a, lda,
458 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
471 CALL sormlq(
'Left',
'No transpose', n, nrhs, m, a, lda,
472 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
479 CALL strtrs(
'Lower',
'Transpose',
'Non-unit', m, nrhs,
480 $ a, lda, b, ldb, info )
494 IF( iascl.EQ.1 )
THEN
495 CALL slascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
497 ELSE IF( iascl.EQ.2 )
THEN
498 CALL slascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
501 IF( ibscl.EQ.1 )
THEN
502 CALL slascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
504 ELSE IF( ibscl.EQ.2 )
THEN
505 CALL slascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
510 work( 1 ) = sroundup_lwork( wsize )