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 )