180      SUBROUTINE cgelsx( M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND,
 
  181     $                   RANK, WORK, RWORK, INFO )
 
  188      INTEGER            INFO, LDA, LDB, M, N, NRHS, RANK
 
  194      COMPLEX            A( LDA, * ), B( LDB, * ), WORK( * )
 
  201      parameter( imax = 1, imin = 2 )
 
  202      REAL               ZERO, ONE, DONE, NTDONE
 
  203      parameter( zero = 0.0e+0, one = 1.0e+0, done = zero,
 
  206      parameter( czero = ( 0.0e+0, 0.0e+0 ),
 
  207     $                   cone = ( 1.0e+0, 0.0e+0 ) )
 
  210      INTEGER            I, IASCL, IBSCL, ISMAX, ISMIN, J, K, MN
 
  211      REAL               ANRM, BIGNUM, BNRM, SMAX, SMAXPR, SMIN, SMINPR,
 
  213      COMPLEX            C1, C2, S1, S2, T1, T2
 
  221      EXTERNAL           clange, slamch
 
  224      INTRINSIC          abs, conjg, max, min
 
  237      ELSE IF( n.LT.0 ) 
THEN 
  239      ELSE IF( nrhs.LT.0 ) 
THEN 
  241      ELSE IF( lda.LT.max( 1, m ) ) 
THEN 
  243      ELSE IF( ldb.LT.max( 1, m, n ) ) 
THEN 
  248         CALL xerbla( 
'CGELSX', -info )
 
  254      IF( min( m, n, nrhs ).EQ.0 ) 
THEN 
  261      smlnum = slamch( 
'S' ) / slamch( 
'P' )
 
  262      bignum = one / smlnum
 
  266      anrm = clange( 
'M', m, n, a, lda, rwork )
 
  268      IF( anrm.GT.zero .AND. anrm.LT.smlnum ) 
THEN 
  272         CALL clascl( 
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
 
  274      ELSE IF( anrm.GT.bignum ) 
THEN 
  278         CALL clascl( 
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
 
  280      ELSE IF( anrm.EQ.zero ) 
THEN 
  284         CALL claset( 
'F', max( m, n ), nrhs, czero, czero, b, ldb )
 
  289      bnrm = clange( 
'M', m, nrhs, b, ldb, rwork )
 
  291      IF( bnrm.GT.zero .AND. bnrm.LT.smlnum ) 
THEN 
  295         CALL clascl( 
'G', 0, 0, bnrm, smlnum, m, nrhs, b, ldb,
 
  298      ELSE IF( bnrm.GT.bignum ) 
THEN 
  302         CALL clascl( 
'G', 0, 0, bnrm, bignum, m, nrhs, b, ldb,
 
  310      CALL cgeqpf( m, n, a, lda, jpvt, work( 1 ), work( mn+1 ), rwork,
 
  320      smax = abs( a( 1, 1 ) )
 
  322      IF( abs( a( 1, 1 ) ).EQ.zero ) 
THEN 
  324         CALL claset( 
'F', max( m, n ), nrhs, czero, czero, b, ldb )
 
  331      IF( rank.LT.mn ) 
THEN 
  333         CALL claic1( imin, rank, work( ismin ), smin, a( 1, i ),
 
  334     $                a( i, i ), sminpr, s1, c1 )
 
  335         CALL claic1( imax, rank, work( ismax ), smax, a( 1, i ),
 
  336     $                a( i, i ), smaxpr, s2, c2 )
 
  338         IF( smaxpr*rcond.LE.sminpr ) 
THEN 
  340               work( ismin+i-1 ) = s1*work( ismin+i-1 )
 
  341               work( ismax+i-1 ) = s2*work( ismax+i-1 )
 
  343            work( ismin+rank ) = c1
 
  344            work( ismax+rank ) = c2
 
  359     $   
CALL ctzrqf( rank, n, a, lda, work( mn+1 ), info )
 
  365      CALL cunm2r( 
'Left', 
'Conjugate transpose', m, nrhs, mn, a,
 
  366     $             lda, work( 1 ), b, ldb, work( 2*mn+1 ), info )
 
  372      CALL ctrsm( 
'Left', 
'Upper', 
'No transpose', 
'Non-unit', rank,
 
  373     $            nrhs, cone, a, lda, b, ldb )
 
  375      DO 40 i = rank + 1, n
 
  385            CALL clatzm( 
'Left', n-rank+1, nrhs, a( i, rank+1 ), lda,
 
  386     $                   conjg( work( mn+i ) ), b( i, 1 ),
 
  387     $                   b( rank+1, 1 ), ldb, work( 2*mn+1 ) )
 
  397            work( 2*mn+i ) = ntdone
 
  400            IF( work( 2*mn+i ).EQ.ntdone ) 
THEN 
  401               IF( jpvt( i ).NE.i ) 
THEN 
  404                  t2 = b( jpvt( k ), j )
 
  406                  b( jpvt( k ), j ) = t1
 
  407                  work( 2*mn+k ) = done
 
  410                  t2 = b( jpvt( k ), j )
 
  414                  work( 2*mn+k ) = done
 
  422      IF( iascl.EQ.1 ) 
THEN 
  423         CALL clascl( 
'G', 0, 0, anrm, smlnum, n, nrhs, b, ldb,
 
  425         CALL clascl( 
'U', 0, 0, smlnum, anrm, rank, rank, a, lda,
 
  427      ELSE IF( iascl.EQ.2 ) 
THEN 
  428         CALL clascl( 
'G', 0, 0, anrm, bignum, n, nrhs, b, ldb,
 
  430         CALL clascl( 
'U', 0, 0, bignum, anrm, rank, rank, a, lda,
 
  433      IF( ibscl.EQ.1 ) 
THEN 
  434         CALL clascl( 
'G', 0, 0, smlnum, bnrm, n, nrhs, b, ldb,
 
  436      ELSE IF( ibscl.EQ.2 ) 
THEN 
  437         CALL clascl( 
'G', 0, 0, bignum, bnrm, n, nrhs, b, ldb,