174 SUBROUTINE dgelsx( M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND,
182 INTEGER INFO, LDA, LDB, M, N, NRHS, RANK
183 DOUBLE PRECISION RCOND
187 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), WORK( * )
194 parameter( imax = 1, imin = 2 )
195 DOUBLE PRECISION ZERO, ONE, DONE, NTDONE
196 parameter( zero = 0.0d0, one = 1.0d0, done = zero,
200 INTEGER I, IASCL, IBSCL, ISMAX, ISMIN, J, K, MN
201 DOUBLE PRECISION ANRM, BIGNUM, BNRM, C1, C2, S1, S2, SMAX,
202 $ smaxpr, smin, sminpr, smlnum, t1, t2
205 DOUBLE PRECISION DLAMCH, DLANGE
206 EXTERNAL dlamch, dlange
213 INTRINSIC abs, max, min
226 ELSE IF( n.LT.0 )
THEN
228 ELSE IF( nrhs.LT.0 )
THEN
230 ELSE IF( lda.LT.max( 1, m ) )
THEN
232 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN
237 CALL xerbla(
'DGELSX', -info )
243 IF( min( m, n, nrhs ).EQ.0 )
THEN
250 smlnum = dlamch(
'S' ) / dlamch(
'P' )
251 bignum = one / smlnum
255 anrm = dlange(
'M', m, n, a, lda, work )
257 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
261 CALL dlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
263 ELSE IF( anrm.GT.bignum )
THEN
267 CALL dlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
269 ELSE IF( anrm.EQ.zero )
THEN
273 CALL dlaset(
'F', max( m, n ), nrhs, zero, zero, b, ldb )
278 bnrm = dlange(
'M', m, nrhs, b, ldb, work )
280 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
284 CALL dlascl(
'G', 0, 0, bnrm, smlnum, m, nrhs, b, ldb,
287 ELSE IF( bnrm.GT.bignum )
THEN
291 CALL dlascl(
'G', 0, 0, bnrm, bignum, m, nrhs, b, ldb,
299 CALL dgeqpf( m, n, a, lda, jpvt, work( 1 ), work( mn+1 ),
309 smax = abs( a( 1, 1 ) )
311 IF( abs( a( 1, 1 ) ).EQ.zero )
THEN
313 CALL dlaset(
'F', max( m, n ), nrhs, zero, zero, b, ldb )
320 IF( rank.LT.mn )
THEN
322 CALL dlaic1( imin, rank, work( ismin ), smin, a( 1, i ),
323 $ a( i, i ), sminpr, s1, c1 )
324 CALL dlaic1( imax, rank, work( ismax ), smax, a( 1, i ),
325 $ a( i, i ), smaxpr, s2, c2 )
327 IF( smaxpr*rcond.LE.sminpr )
THEN
329 work( ismin+i-1 ) = s1*work( ismin+i-1 )
330 work( ismax+i-1 ) = s2*work( ismax+i-1 )
332 work( ismin+rank ) = c1
333 work( ismax+rank ) = c2
348 $
CALL dtzrqf( rank, n, a, lda, work( mn+1 ), info )
354 CALL dorm2r(
'Left',
'Transpose', m, nrhs, mn, a, lda,
355 $ work( 1 ), b, ldb, work( 2*mn+1 ), info )
361 CALL dtrsm(
'Left',
'Upper',
'No transpose',
'Non-unit', rank,
362 $ nrhs, one, a, lda, b, ldb )
364 DO 40 i = rank + 1, n
374 CALL dlatzm(
'Left', n-rank+1, nrhs, a( i, rank+1 ), lda,
375 $ work( mn+i ), b( i, 1 ), b( rank+1, 1 ), ldb,
386 work( 2*mn+i ) = ntdone
389 IF( work( 2*mn+i ).EQ.ntdone )
THEN
390 IF( jpvt( i ).NE.i )
THEN
393 t2 = b( jpvt( k ), j )
395 b( jpvt( k ), j ) = t1
396 work( 2*mn+k ) = done
399 t2 = b( jpvt( k ), j )
403 work( 2*mn+k ) = done
411 IF( iascl.EQ.1 )
THEN
412 CALL dlascl(
'G', 0, 0, anrm, smlnum, n, nrhs, b, ldb,
414 CALL dlascl(
'U', 0, 0, smlnum, anrm, rank, rank, a, lda,
416 ELSE IF( iascl.EQ.2 )
THEN
417 CALL dlascl(
'G', 0, 0, anrm, bignum, n, nrhs, b, ldb,
419 CALL dlascl(
'U', 0, 0, bignum, anrm, rank, rank, a, lda,
422 IF( ibscl.EQ.1 )
THEN
423 CALL dlascl(
'G', 0, 0, smlnum, bnrm, n, nrhs, b, ldb,
425 ELSE IF( ibscl.EQ.2 )
THEN
426 CALL dlascl(
'G', 0, 0, bignum, bnrm, n, nrhs, b, ldb,