192 SUBROUTINE dgelst( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK,
201 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
204 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), WORK( * )
210 DOUBLE PRECISION ZERO, ONE
211 parameter( zero = 0.0d+0, one = 1.0d+0 )
215 INTEGER BROW, I, IASCL, IBSCL, J, LWOPT, MN, MNNRHS,
217 DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM
220 DOUBLE PRECISION RWORK( 1 )
225 DOUBLE PRECISION DLAMCH, DLANGE
226 EXTERNAL lsame, ilaenv, dlamch, dlange
233 INTRINSIC dble, max, min
241 lquery = ( lwork.EQ.-1 )
242 IF( .NOT.( lsame( trans,
'N' ) .OR. lsame( trans,
'T' ) ) )
THEN
244 ELSE IF( m.LT.0 )
THEN
246 ELSE IF( n.LT.0 )
THEN
248 ELSE IF( nrhs.LT.0 )
THEN
250 ELSE IF( lda.LT.max( 1, m ) )
THEN
252 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN
254 ELSE IF( lwork.LT.max( 1, mn+max( mn, nrhs ) ) .AND. .NOT.lquery )
261 IF( info.EQ.0 .OR. info.EQ.-10 )
THEN
264 IF( lsame( trans,
'N' ) )
267 nb = ilaenv( 1,
'DGELST',
' ', m, n, -1, -1 )
269 mnnrhs = max( mn, nrhs )
270 lwopt = max( 1, (mn+mnnrhs)*nb )
271 work( 1 ) = dble( lwopt )
276 CALL xerbla(
'DGELST ', -info )
278 ELSE IF( lquery )
THEN
284 IF( min( m, n, nrhs ).EQ.0 )
THEN
285 CALL dlaset(
'Full', max( m, n ), nrhs, zero, zero, b, ldb )
286 work( 1 ) = dble( lwopt )
292 IF( nb.GT.mn ) nb = mn
298 nb = min( nb, lwork/( mn + mnnrhs ) )
302 nbmin = max( 2, ilaenv( 2,
'DGELST',
' ', m, n, -1, -1 ) )
304 IF( nb.LT.nbmin )
THEN
310 smlnum = dlamch(
'S' ) / dlamch(
'P' )
311 bignum = one / smlnum
312 CALL dlabad( smlnum, bignum )
316 anrm = dlange(
'M', m, n, a, lda, rwork )
318 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
322 CALL dlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
324 ELSE IF( anrm.GT.bignum )
THEN
328 CALL dlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
330 ELSE IF( anrm.EQ.zero )
THEN
334 CALL dlaset(
'Full', max( m, n ), nrhs, zero, zero, b, ldb )
335 work( 1 ) = dble( lwopt )
342 bnrm = dlange(
'M', brow, nrhs, b, ldb, rwork )
344 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
348 CALL dlascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
351 ELSE IF( bnrm.GT.bignum )
THEN
355 CALL dlascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
367 CALL dgeqrt( m, n, nb, a, lda, work( 1 ), nb,
368 $ work( mn*nb+1 ), info )
380 CALL dgemqrt(
'Left',
'Transpose', m, nrhs, n, nb, a, lda,
381 $ work( 1 ), nb, b, ldb, work( mn*nb+1 ),
386 CALL dtrtrs(
'Upper',
'No transpose',
'Non-unit', n, nrhs,
387 $ a, lda, b, ldb, info )
405 CALL dtrtrs(
'Upper',
'Transpose',
'Non-unit', n, nrhs,
406 $ a, lda, b, ldb, info )
425 CALL dgemqrt(
'Left',
'No transpose', m, nrhs, n, nb,
426 $ a, lda, work( 1 ), nb, b, ldb,
427 $ work( mn*nb+1 ), info )
440 CALL dgelqt( m, n, nb, a, lda, work( 1 ), nb,
441 $ work( mn*nb+1 ), info )
453 CALL dtrtrs(
'Lower',
'No transpose',
'Non-unit', m, nrhs,
454 $ a, lda, b, ldb, info )
473 CALL dgemlqt(
'Left',
'Transpose', n, nrhs, m, nb, a, lda,
474 $ work( 1 ), nb, b, ldb,
475 $ work( mn*nb+1 ), info )
489 CALL dgemlqt(
'Left',
'No transpose', n, nrhs, m, nb,
490 $ a, lda, work( 1 ), nb, b, ldb,
491 $ work( mn*nb+1), info )
495 CALL dtrtrs(
'Lower',
'Transpose',
'Non-unit', m, nrhs,
496 $ a, lda, b, ldb, info )
510 IF( iascl.EQ.1 )
THEN
511 CALL dlascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
513 ELSE IF( iascl.EQ.2 )
THEN
514 CALL dlascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
517 IF( ibscl.EQ.1 )
THEN
518 CALL dlascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
520 ELSE IF( ibscl.EQ.2 )
THEN
521 CALL dlascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
525 work( 1 ) = dble( lwopt )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dgemlqt(SIDE, TRANS, M, N, K, MB, V, LDV, T, LDT, C, LDC, WORK, INFO)
DGEMLQT
subroutine dgeqrt(M, N, NB, A, LDA, T, LDT, WORK, INFO)
DGEQRT
subroutine dgemqrt(SIDE, TRANS, M, N, K, NB, V, LDV, T, LDT, C, LDC, WORK, INFO)
DGEMQRT
subroutine dgelqt(M, N, MB, A, LDA, T, LDT, WORK, INFO)
DGELQT
subroutine dgelst(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
DGELST solves overdetermined or underdetermined systems for GE matrices using QR or LQ factorization ...
subroutine dtrtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
DTRTRS