182 SUBROUTINE cgelsx( M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK,
183 $ WORK, RWORK, INFO )
190 INTEGER INFO, LDA, , M, N, NRHS, RANK
196 COMPLEX A( LDA, * ), B( LDB, * ), WORK( * )
203 parameter( imax = 1, imin = 2 )
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, , 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.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
275 CALL CLASCL( 'g
', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
277.GT.
ELSE IF( ANRMBIGNUM ) THEN
281 CALL CLASCL( 'g
', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
283.EQ.
ELSE IF( ANRMZERO ) THEN
287 CALL CLASET( 'f
', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
292 BNRM = CLANGE( 'm
', M, NRHS, B, LDB, RWORK )
294.GT..AND..LT.
IF( BNRMZERO BNRMSMLNUM ) THEN
298 CALL CLASCL( 'g
', 0, 0, BNRM, SMLNUM, M, NRHS, B, LDB, INFO )
300.GT.
ELSE IF( BNRMBIGNUM ) 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.EQ.
IF( ABS( A( 1, 1 ) )ZERO ) THEN
325 CALL CLASET( 'f
', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
332.LT.
IF( RANKMN ) 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.LE.
IF( SMAXPR*RCONDSMINPR ) 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.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 CLASCL( 'g
', 0, 0, ANRM, SMLNUM, N, NRHS, B, LDB, INFO )
425 CALL CLASCL( 'u
', 0, 0, SMLNUM, ANRM, RANK, RANK, A, LDA,
427.EQ.
ELSE IF( IASCL2 ) 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.EQ.
IF( IBSCL1 ) THEN
433 CALL CLASCL( 'g
', 0, 0, SMLNUM, BNRM, N, NRHS, B, LDB, INFO )
434.EQ.
ELSE IF( IBSCL2 ) THEN
435 CALL CLASCL( 'g
', 0, 0, BIGNUM, BNRM, N, NRHS, B, LDB, INFO )
subroutine slabad(small, large)
SLABAD
subroutine xerbla(srname, info)
XERBLA
subroutine cgeqpf(m, n, a, lda, jpvt, tau, work, rwork, info)
CGEQPF
subroutine cgelsx(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, work, rwork, info)
CGELSX solves overdetermined or underdetermined systems for GE matrices
subroutine clascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
CLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine claset(uplo, m, n, alpha, beta, a, lda)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine claic1(job, j, x, sest, w, gamma, sestpr, s, c)
CLAIC1 applies one step of incremental condition estimation.
subroutine ctzrqf(m, n, a, lda, tau, info)
CTZRQF
subroutine clatzm(side, m, n, v, incv, tau, c1, c2, ldc, work)
CLATZM
subroutine cunm2r(side, trans, m, n, k, a, lda, tau, c, ldc, work, info)
CUNM2R multiplies a general matrix by the unitary matrix from a QR factorization determined by cgeqrf...
subroutine ctrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
CTRSM