192 SUBROUTINE sgelst( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK,
201 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
204 REAL A( lda, * ), B( ldb, * ), WORK( * )
211 parameter( zero = 0.0e+0, one = 1.0e+0 )
215 INTEGER BROW, I, IASCL, IBSCL, J, LWOPT, MN, MNNRHS,
217 REAL ANRM, BIGNUM, BNRM, SMLNUM
226 EXTERNAL lsame, ilaenv, slamch, slange
233 INTRINSIC REAL, 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,
'SGELST',
' ', m, n, -1, -1 )
269 mnnrhs = max( mn, nrhs )
270 lwopt = max( 1, (mn+mnnrhs)*nb )
271 work( 1 ) =
REAL( lwopt )
276 CALL xerbla(
'SGELST ', -info )
278 ELSE IF( lquery )
THEN 284 IF( min( m, n, nrhs ).EQ.0 )
THEN 285 CALL slaset(
'Full', max( m, n ), nrhs, zero, zero, b, ldb )
286 work( 1 ) =
REAL( lwopt )
292 IF( nb.GT.mn ) nb = mn
298 nb = min( nb, lwork/( mn + mnnrhs ) )
302 nbmin = max( 2, ilaenv( 2,
'SGELST',
' ', m, n, -1, -1 ) )
304 IF( nb.LT.nbmin )
THEN 310 smlnum = slamch(
'S' ) / slamch(
'P' )
311 bignum = one / smlnum
312 CALL slabad( smlnum, bignum )
316 anrm = slange(
'M', m, n, a, lda, rwork )
318 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN 322 CALL slascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
324 ELSE IF( anrm.GT.bignum )
THEN 328 CALL slascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
330 ELSE IF( anrm.EQ.zero )
THEN 334 CALL slaset(
'Full', max( m, n ), nrhs, zero, zero, b, ldb )
335 work( 1 ) =
REAL( lwopt )
342 bnrm = slange(
'M', brow, nrhs, b, ldb, rwork )
344 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN 348 CALL slascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
351 ELSE IF( bnrm.GT.bignum )
THEN 355 CALL slascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
367 CALL sgeqrt( m, n, nb, a, lda, work( 1 ), nb,
368 $ work( mn*nb+1 ), info )
380 CALL sgemqrt(
'Left',
'Transpose', m, nrhs, n, nb, a, lda,
381 $ work( 1 ), nb, b, ldb, work( mn*nb+1 ),
386 CALL strtrs(
'Upper',
'No transpose',
'Non-unit', n, nrhs,
387 $ a, lda, b, ldb, info )
405 CALL strtrs(
'Upper',
'Transpose',
'Non-unit', n, nrhs,
406 $ a, lda, b, ldb, info )
425 CALL sgemqrt(
'Left',
'No transpose', m, nrhs, n, nb,
426 $ a, lda, work( 1 ), nb, b, ldb,
427 $ work( mn*nb+1 ), info )
440 CALL sgelqt( m, n, nb, a, lda, work( 1 ), nb,
441 $ work( mn*nb+1 ), info )
453 CALL strtrs(
'Lower',
'No transpose',
'Non-unit', m, nrhs,
454 $ a, lda, b, ldb, info )
473 CALL sgemlqt(
'Left',
'Transpose', n, nrhs, m, nb, a, lda,
474 $ work( 1 ), nb, b, ldb,
475 $ work( mn*nb+1 ), info )
489 CALL sgemlqt(
'Left',
'No transpose', n, nrhs, m, nb,
490 $ a, lda, work( 1 ), nb, b, ldb,
491 $ work( mn*nb+1), info )
495 CALL strtrs(
'Lower',
'Transpose',
'Non-unit', m, nrhs,
496 $ a, lda, b, ldb, info )
510 IF( iascl.EQ.1 )
THEN 511 CALL slascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
513 ELSE IF( iascl.EQ.2 )
THEN 514 CALL slascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
517 IF( ibscl.EQ.1 )
THEN 518 CALL slascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
520 ELSE IF( ibscl.EQ.2 )
THEN 521 CALL slascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
525 work( 1 ) =
REAL( lwopt )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sgemlqt(SIDE, TRANS, M, N, K, MB, V, LDV, T, LDT, C, LDC, WORK, INFO)
SGEMLQT
subroutine sgeqrt(M, N, NB, A, LDA, T, LDT, WORK, INFO)
SGEQRT
subroutine slascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine sgelst(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
SGELST solves overdetermined or underdetermined systems for GE matrices using QR or LQ factorization...
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine strtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
STRTRS
subroutine sgemqrt(SIDE, TRANS, M, N, K, NB, V, LDV, T, LDT, C, LDC, WORK, INFO)
SGEMQRT
subroutine sgelqt(M, N, MB, A, LDA, T, LDT, WORK, INFO)
SGELQT