189      SUBROUTINE dgels( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK,
 
  199      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS
 
  202      DOUBLE PRECISION   A( LDA, * ), B( LDB, * ), WORK( * )
 
  208      DOUBLE PRECISION   ZERO, ONE
 
  209      PARAMETER          ( ZERO = 0.0d0, one = 1.0d0 )
 
  213      INTEGER            BROW, I, IASCL, IBSCL, J, MN, NB, SCLLEN, WSIZE
 
  214      DOUBLE PRECISION   ANRM, BIGNUM, BNRM, SMLNUM
 
  217      DOUBLE PRECISION   RWORK( 1 )
 
  222      DOUBLE PRECISION   DLAMCH, DLANGE
 
  223      EXTERNAL           lsame, ilaenv, dlamch, dlange
 
  231      INTRINSIC          dble, max, min
 
  239      lquery = ( lwork.EQ.-1 )
 
  240      IF( .NOT.( lsame( trans, 
'N' ) .OR.
 
  241     $    lsame( trans, 
'T' ) ) ) 
THEN 
  243      ELSE IF( m.LT.0 ) 
THEN 
  245      ELSE IF( n.LT.0 ) 
THEN 
  247      ELSE IF( nrhs.LT.0 ) 
THEN 
  249      ELSE IF( lda.LT.max( 1, m ) ) 
THEN 
  251      ELSE IF( ldb.LT.max( 1, m, n ) ) 
THEN 
  253      ELSE IF( lwork.LT.max( 1, mn+max( mn, nrhs ) ) .AND. .NOT.lquery )
 
  260      IF( info.EQ.0 .OR. info.EQ.-10 ) 
THEN 
  263         IF( lsame( trans, 
'N' ) )
 
  267            nb = ilaenv( 1, 
'DGEQRF', 
' ', m, n, -1, -1 )
 
  269               nb = max( nb, ilaenv( 1, 
'DORMQR', 
'LN', m, nrhs, n,
 
  272               nb = max( nb, ilaenv( 1, 
'DORMQR', 
'LT', m, nrhs, n,
 
  276            nb = ilaenv( 1, 
'DGELQF', 
' ', m, n, -1, -1 )
 
  278               nb = max( nb, ilaenv( 1, 
'DORMLQ', 
'LT', n, nrhs, m,
 
  281               nb = max( nb, ilaenv( 1, 
'DORMLQ', 
'LN', n, nrhs, m,
 
  286         wsize = max( 1, mn+max( mn, nrhs )*nb )
 
  287         work( 1 ) = dble( wsize )
 
  292         CALL xerbla( 
'DGELS ', -info )
 
  294      ELSE IF( lquery ) 
THEN 
  300      IF( min( m, n, nrhs ).EQ.0 ) 
THEN 
  301         CALL dlaset( 
'Full', max( m, n ), nrhs, zero, zero, b, ldb )
 
  307      smlnum = dlamch( 
'S' ) / dlamch( 
'P' )
 
  308      bignum = one / smlnum
 
  312      anrm = dlange( 
'M', m, n, a, lda, rwork )
 
  314      IF( anrm.GT.zero .AND. anrm.LT.smlnum ) 
THEN 
  318         CALL dlascl( 
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
 
  320      ELSE IF( anrm.GT.bignum ) 
THEN 
  324         CALL dlascl( 
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
 
  326      ELSE IF( anrm.EQ.zero ) 
THEN 
  330         CALL dlaset( 
'F', max( m, n ), nrhs, zero, zero, b, ldb )
 
  337      bnrm = dlange( 
'M', brow, nrhs, b, ldb, rwork )
 
  339      IF( bnrm.GT.zero .AND. bnrm.LT.smlnum ) 
THEN 
  343         CALL dlascl( 
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
 
  346      ELSE IF( bnrm.GT.bignum ) 
THEN 
  350         CALL dlascl( 
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
 
  359         CALL dgeqrf( m, n, a, lda, work( 1 ), work( mn+1 ),
 
  371            CALL dormqr( 
'Left', 
'Transpose', m, nrhs, n, a, lda,
 
  372     $                   work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
 
  379            CALL dtrtrs( 
'Upper', 
'No transpose', 
'Non-unit', n,
 
  381     $                   a, lda, b, ldb, info )
 
  395            CALL dtrtrs( 
'Upper', 
'Transpose', 
'Non-unit', n, nrhs,
 
  396     $                   a, lda, b, ldb, info )
 
  412            CALL dormqr( 
'Left', 
'No transpose', m, nrhs, n, a, lda,
 
  413     $                   work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
 
  426         CALL dgelqf( m, n, a, lda, work( 1 ), work( mn+1 ),
 
  438            CALL dtrtrs( 
'Lower', 
'No transpose', 
'Non-unit', m,
 
  440     $                   a, lda, b, ldb, info )
 
  456            CALL dormlq( 
'Left', 
'Transpose', n, nrhs, m, a, lda,
 
  457     $                   work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
 
  470            CALL dormlq( 
'Left', 
'No transpose', n, nrhs, m, a, lda,
 
  471     $                   work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
 
  478            CALL dtrtrs( 
'Lower', 
'Transpose', 
'Non-unit', m, nrhs,
 
  479     $                   a, lda, b, ldb, info )
 
  493      IF( iascl.EQ.1 ) 
THEN 
  494         CALL dlascl( 
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
 
  496      ELSE IF( iascl.EQ.2 ) 
THEN 
  497         CALL dlascl( 
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
 
  500      IF( ibscl.EQ.1 ) 
THEN 
  501         CALL dlascl( 
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
 
  503      ELSE IF( ibscl.EQ.2 ) 
THEN 
  504         CALL dlascl( 
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
 
  509      work( 1 ) = dble( wsize )