182 SUBROUTINE zgelsx( M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK,
183 $ WORK, RWORK, INFO )
190 INTEGER info, lda, ldb, m, n, nrhs, rank
191 DOUBLE PRECISION rcond
195 DOUBLE PRECISION rwork( * )
196 COMPLEX*16 a( lda, * ), b( ldb, * ), work( * )
203 parameter( imax = 1, imin = 2 )
204 DOUBLE PRECISION zero, one, done, ntdone
205 parameter( zero = 0.0d+0, one = 1.0d+0, done = zero,
207 COMPLEX*16 czero, cone
208 parameter( czero = ( 0.0d+0, 0.0d+0 ),
209 $ cone = ( 1.0d+0, 0.0d+0 ) )
212 INTEGER i, iascl, ibscl, ismax, ismin, j, k, mn
213 DOUBLE PRECISION anrm, bignum, bnrm, smax, smaxpr, smin, sminpr,
215 COMPLEX*16 c1, c2, s1, s2, t1, t2
226 INTRINSIC abs, dconjg, 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(
'ZGELSX', -info )
256 IF( min( m, n, nrhs ).EQ.0 )
THEN 264 bignum = one / smlnum
265 CALL dlabad( smlnum, bignum )
269 anrm =
zlange(
'M', m, n, a, lda, rwork )
271 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN 275 CALL zlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
277 ELSE IF( anrm.GT.bignum )
THEN 281 CALL zlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
283 ELSE IF( anrm.EQ.zero )
THEN 287 CALL zlaset(
'F', max( m, n ), nrhs, czero, czero, b, ldb )
292 bnrm =
zlange(
'M', m, nrhs, b, ldb, rwork )
294 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN 298 CALL zlascl(
'G', 0, 0, bnrm, smlnum, m, nrhs, b, ldb, info )
300 ELSE IF( bnrm.GT.bignum )
THEN 304 CALL zlascl(
'G', 0, 0, bnrm, bignum, m, nrhs, b, ldb, info )
311 CALL zgeqpf( 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 zlaset(
'F', max( m, n ), nrhs, czero, czero, b, ldb )
332 IF( rank.LT.mn )
THEN 334 CALL zlaic1( imin, rank, work( ismin ), smin, a( 1, i ),
335 $ a( i, i ), sminpr, s1, c1 )
336 CALL zlaic1( 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 ztzrqf( rank, n, a, lda, work( mn+1 ), info )
366 CALL zunm2r(
'Left',
'Conjugate transpose', m, nrhs, mn, a, lda,
367 $ work( 1 ), b, ldb, work( 2*mn+1 ), info )
373 CALL ztrsm(
'Left',
'Upper',
'No transpose',
'Non-unit', rank,
374 $ nrhs, cone, a, lda, b, ldb )
376 DO 40 i = rank + 1, n
386 CALL zlatzm(
'Left', n-rank+1, nrhs, a( i, rank+1 ), lda,
387 $ dconjg( 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 zlascl(
'G', 0, 0, anrm, smlnum, n, nrhs, b, ldb, info )
425 CALL zlascl(
'U', 0, 0, smlnum, anrm, rank, rank, a, lda,
427 ELSE IF( iascl.EQ.2 )
THEN 428 CALL zlascl(
'G', 0, 0, anrm, bignum, n, nrhs, b, ldb, info )
429 CALL zlascl(
'U', 0, 0, bignum, anrm, rank, rank, a, lda,
432 IF( ibscl.EQ.1 )
THEN 433 CALL zlascl(
'G', 0, 0, smlnum, bnrm, n, nrhs, b, ldb, info )
434 ELSE IF( ibscl.EQ.2 )
THEN 435 CALL zlascl(
'G', 0, 0, bignum, bnrm, n, nrhs, b, ldb, info )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zunm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
ZUNM2R multiplies a general matrix by the unitary matrix from a QR factorization determined by cgeqrf...
subroutine ztrsm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
ZTRSM
subroutine zlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zlaic1(JOB, J, X, SEST, W, GAMMA, SESTPR, S, C)
ZLAIC1 applies one step of incremental condition estimation.
double precision function dlamch(CMACH)
DLAMCH
double precision function zlange(NORM, M, N, A, LDA, WORK)
ZLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine dlabad(SMALL, LARGE)
DLABAD