182 SUBROUTINE cgelsx( M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK,
183 $ WORK, RWORK, INFO )
190 INTEGER INFO, LDA, LDB, M, N, NRHS, RANK
196 COMPLEX A( LDA, * ), B( LDB, * ), WORK( * )
203 parameter( imax = 1, imin = 2 )
204 REAL ZERO, ONE, DONE, NTDONE
205 parameter( zero = 0.0e+0, one = 1.0e+0, done = zero,
208 parameter( czero = ( 0.0e+0, 0.0e+0 ),
209 $ cone = ( 1.0e+0, 0.0e+0 ) )
212 INTEGER I, IASCL, IBSCL, ISMAX, ISMIN, J, K, MN
213 REAL ANRM, BIGNUM, BNRM, SMAX, SMAXPR, SMIN, SMINPR,
215 COMPLEX C1, C2, S1, S2, T1, T2
223 EXTERNAL clange, slamch
226 INTRINSIC abs, conjg,
max,
min
239 ELSE IF( n.LT.0 )
THEN
241 ELSE IF( nrhs.LT.0 )
THEN
243 ELSE IF( lda.LT.
max( 1, m ) )
THEN
245 ELSE IF( ldb.LT.
max( 1, m, n ) )
THEN
250 CALL xerbla(
'CGELSX', -info )
256 IF(
min( m, n, nrhs ).EQ.0 )
THEN
263 smlnum = slamch(
'S' ) / slamch(
'P' )
264 bignum = one / smlnum
265 CALL slabad( smlnum, bignum )
269 anrm = clange(
'M', m, n, a, lda, rwork )
271 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
275 CALL clascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
277 ELSE IF( anrm.GT.bignum )
THEN
281 CALL clascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
283 ELSE IF( anrm.EQ.zero )
THEN
287 CALL claset(
'F',
max( m, n ), nrhs, czero, czero, b, ldb )
292 bnrm = clange(
'M', m, nrhs, b, ldb, rwork )
294 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
298 CALL clascl(
'G', 0, 0, bnrm, smlnum, m, nrhs, b, ldb, info )
300 ELSE IF( bnrm.GT.bignum )
THEN
304 CALL clascl(
'G', 0, 0, bnrm, bignum, m, nrhs, b, ldb, info )
311 CALL cgeqpf( m, n, a, lda, jpvt, work( 1 ), work( mn+1 ), rwork,
321 smax = abs( a( 1, 1 ) )
323 IF( abs( a( 1, 1 ) ).EQ.zero )
THEN
325 CALL claset(
'F',
max( m, n ), nrhs, czero, czero, b, ldb )
332 IF( rank.LT.mn )
THEN
334 CALL claic1( imin, rank, work( ismin ), smin, a( 1, i ),
335 $ a( i, i ), sminpr, s1, c1 )
336 CALL claic1( imax, rank, work( ismax ), smax, a( 1, i ),
337 $ a( i, i ), smaxpr, s2, c2 )
339 IF( smaxpr*rcond.LE.sminpr )
THEN
341 work( ismin+i-1 ) = s1*work( ismin+i-1 )
342 work( ismax+i-1 ) = s2*work( ismax+i-1 )
344 work( ismin+rank ) = c1
345 work( ismax+rank ) = c2
360 $
CALL ctzrqf( rank, n, a, lda, work( mn+1 ), info )
366 CALL cunm2r(
'Left',
'Conjugate transpose', m, nrhs, mn, a, lda,
367 $ work( 1 ), b, ldb, work( 2*mn+1 ), info )
373 CALL ctrsm(
'Left',
'Upper',
'No transpose',
'Non-unit', rank,
374 $ nrhs, cone, a, lda, b, ldb )
376 DO 40 i = rank + 1, n
386 CALL clatzm(
'Left', n-rank+1, nrhs, a( i, rank+1 ), lda,
387 $ conjg( work( mn+i ) ), b( i, 1 ),
388 $ b( rank+1, 1 ), ldb, work( 2*mn+1 ) )
398 work( 2*mn+i ) = ntdone
401 IF( work( 2*mn+i ).EQ.ntdone )
THEN
402 IF( jpvt( i ).NE.i )
THEN
405 t2 = b( jpvt( k ), j )
407 b( jpvt( k ), j ) = t1
408 work( 2*mn+k ) = done
411 t2 = b( jpvt( k ), j )
415 work( 2*mn+k ) = done
423 IF( iascl.EQ.1 )
THEN
424 CALL clascl(
'G', 0, 0, anrm, smlnum, n, nrhs, b, ldb, info )
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, info )
429 CALL clascl(
'U', 0, 0, bignum, anrm, rank, rank, a, lda,
432 IF( ibscl.EQ.1 )
THEN
433 CALL clascl(
'G', 0, 0, smlnum, bnrm, n, nrhs, b, ldb, info )
434 ELSE IF( ibscl.EQ.2 )
THEN
435 CALL clascl(
'G', 0, 0, bignum, bnrm, n, nrhs, b, ldb, info )