199 SUBROUTINE dgelst( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK,
209 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
212 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), WORK( * )
218 DOUBLE PRECISION ZERO, ONE
219 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
223 INTEGER BROW, I, IASCL, IBSCL, J, LWOPT, MN, MNNRHS,
225 DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM
228 DOUBLE PRECISION RWORK( 1 )
233 DOUBLE PRECISION DLAMCH, DLANGE
234 EXTERNAL lsame, ilaenv, dlamch, dlange
242 INTRINSIC dble, max, min
250 lquery = ( lwork.EQ.-1 )
251 IF( .NOT.( lsame( trans,
'N' ) .OR.
252 $ lsame( trans,
'T' ) ) )
THEN
254 ELSE IF( m.LT.0 )
THEN
256 ELSE IF( n.LT.0 )
THEN
258 ELSE IF( nrhs.LT.0 )
THEN
260 ELSE IF( lda.LT.max( 1, m ) )
THEN
262 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN
264 ELSE IF( lwork.LT.max( 1, mn+max( mn, nrhs ) ) .AND. .NOT.lquery )
271 IF( info.EQ.0 .OR. info.EQ.-10 )
THEN
274 IF( lsame( trans,
'N' ) )
277 nb = ilaenv( 1,
'DGELST',
' ', m, n, -1, -1 )
279 mnnrhs = max( mn, nrhs )
280 lwopt = max( 1, (mn+mnnrhs)*nb )
281 work( 1 ) = dble( lwopt )
286 CALL xerbla(
'DGELST ', -info )
288 ELSE IF( lquery )
THEN
294 IF( min( m, n, nrhs ).EQ.0 )
THEN
295 CALL dlaset(
'Full', max( m, n ), nrhs, zero, zero, b, ldb )
296 work( 1 ) = dble( lwopt )
302 IF( nb.GT.mn ) nb = mn
308 nb = min( nb, lwork/( mn + mnnrhs ) )
312 nbmin = max( 2, ilaenv( 2,
'DGELST',
' ', m, n, -1, -1 ) )
314 IF( nb.LT.nbmin )
THEN
320 smlnum = dlamch(
'S' ) / dlamch(
'P' )
321 bignum = one / smlnum
325 anrm = dlange(
'M', m, n, a, lda, rwork )
327 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
331 CALL dlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
333 ELSE IF( anrm.GT.bignum )
THEN
337 CALL dlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
339 ELSE IF( anrm.EQ.zero )
THEN
343 CALL dlaset(
'Full', max( m, n ), nrhs, zero, zero, b, ldb )
344 work( 1 ) = dble( lwopt )
351 bnrm = dlange(
'M', brow, nrhs, b, ldb, rwork )
353 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
357 CALL dlascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
360 ELSE IF( bnrm.GT.bignum )
THEN
364 CALL dlascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
376 CALL dgeqrt( m, n, nb, a, lda, work( 1 ), nb,
377 $ work( mn*nb+1 ), info )
389 CALL dgemqrt(
'Left',
'Transpose', m, nrhs, n, nb, a,
391 $ work( 1 ), nb, b, ldb, work( mn*nb+1 ),
396 CALL dtrtrs(
'Upper',
'No transpose',
'Non-unit', n,
398 $ a, lda, b, ldb, info )
416 CALL dtrtrs(
'Upper',
'Transpose',
'Non-unit', n, nrhs,
417 $ a, lda, b, ldb, info )
436 CALL dgemqrt(
'Left',
'No transpose', m, nrhs, n, nb,
437 $ a, lda, work( 1 ), nb, b, ldb,
438 $ work( mn*nb+1 ), info )
451 CALL dgelqt( m, n, nb, a, lda, work( 1 ), nb,
452 $ work( mn*nb+1 ), info )
464 CALL dtrtrs(
'Lower',
'No transpose',
'Non-unit', m,
466 $ a, lda, b, ldb, info )
485 CALL dgemlqt(
'Left',
'Transpose', n, nrhs, m, nb, a,
487 $ work( 1 ), nb, b, ldb,
488 $ work( mn*nb+1 ), info )
502 CALL dgemlqt(
'Left',
'No transpose', n, nrhs, m, nb,
503 $ a, lda, work( 1 ), nb, b, ldb,
504 $ work( mn*nb+1), info )
508 CALL dtrtrs(
'Lower',
'Transpose',
'Non-unit', m, nrhs,
509 $ a, lda, b, ldb, info )
523 IF( iascl.EQ.1 )
THEN
524 CALL dlascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
526 ELSE IF( iascl.EQ.2 )
THEN
527 CALL dlascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
530 IF( ibscl.EQ.1 )
THEN
531 CALL dlascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
533 ELSE IF( ibscl.EQ.2 )
THEN
534 CALL dlascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
538 work( 1 ) = dble( lwopt )