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
222 DOUBLE PRECISION DLAMCH, ZLANGE
223 EXTERNAL dlamch, zlange
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
263 smlnum = dlamch(
'S' ) / dlamch(
'P' )
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 dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ztrsm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
ZTRSM
subroutine zgeqpf(M, N, A, LDA, JPVT, TAU, WORK, RWORK, INFO)
ZGEQPF
subroutine zgelsx(M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK, WORK, RWORK, INFO)
ZGELSX solves overdetermined or underdetermined systems for GE matrices
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.
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 ztzrqf(M, N, A, LDA, TAU, INFO)
ZTZRQF
subroutine zlatzm(SIDE, M, N, V, INCV, TAU, C1, C2, LDC, WORK)
ZLATZM
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...