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,