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( , * ), B( , * ), 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,
208 parameter( czero = ( 0.0d+0, 0.0d+0 ),
209 $ cone = ( 1.0d+0, 0.0d+0 ) )
212 INTEGER I, IASCL, IBSCL, ISMAX, , J, K, MN
213 DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMAX, SMAXPR, SMIN, SMINPR,
215 COMPLEX*16 C1, C2, S1, , 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.EQ.
IF( WORK( 2*MN+I )NTDONE ) THEN
402.NE.
IF( JPVT( I )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.EQ.
IF( IASCL1 ) 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.EQ.
ELSE IF( IASCL2 ) 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.EQ.
IF( IBSCL1 ) THEN
433 CALL ZLASCL( 'g
', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
434.EQ.
ELSE IF( IBSCL2 ) THEN
435 CALL ZLASCL( 'g
', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
subroutine zgelsx(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, work, rwork, info)
ZGELSX solves overdetermined or underdetermined systems for GE matrices