192 SUBROUTINE cgelst( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK,
201 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
204 COMPLEX A( lda, * ), B( ldb, * ), WORK( * )
211 parameter( zero = 0.0e+0, one = 1.0e+0 )
213 parameter( czero = ( 0.0e+0, 0.0e+0 ) )
217 INTEGER BROW, I, IASCL, IBSCL, J, LWOPT, MN, MNNRHS,
219 REAL ANRM, BIGNUM, BNRM, SMLNUM
228 EXTERNAL lsame, ilaenv, slamch, clange
235 INTRINSIC REAL, MAX, MIN
243 lquery = ( lwork.EQ.-1 )
244 IF( .NOT.( lsame( trans,
'N' ) .OR. lsame( trans,
'C' ) ) )
THEN 246 ELSE IF( m.LT.0 )
THEN 248 ELSE IF( n.LT.0 )
THEN 250 ELSE IF( nrhs.LT.0 )
THEN 252 ELSE IF( lda.LT.max( 1, m ) )
THEN 254 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN 256 ELSE IF( lwork.LT.max( 1, mn+max( mn, nrhs ) ) .AND. .NOT.lquery )
263 IF( info.EQ.0 .OR. info.EQ.-10 )
THEN 266 IF( lsame( trans,
'N' ) )
269 nb = ilaenv( 1,
'CGELST',
' ', m, n, -1, -1 )
271 mnnrhs = max( mn, nrhs )
272 lwopt = max( 1, (mn+mnnrhs)*nb )
273 work( 1 ) =
REAL( lwopt )
278 CALL xerbla(
'CGELST ', -info )
280 ELSE IF( lquery )
THEN 286 IF( min( m, n, nrhs ).EQ.0 )
THEN 287 CALL claset(
'Full', max( m, n ), nrhs, czero, czero, b, ldb )
288 work( 1 ) =
REAL( lwopt )
294 IF( nb.GT.mn ) nb = mn
300 nb = min( nb, lwork/( mn + mnnrhs ) )
304 nbmin = max( 2, ilaenv( 2,
'CGELST',
' ', m, n, -1, -1 ) )
306 IF( nb.LT.nbmin )
THEN 312 smlnum = slamch(
'S' ) / slamch(
'P' )
313 bignum = one / smlnum
314 CALL slabad( smlnum, bignum )
318 anrm = clange(
'M', m, n, a, lda, rwork )
320 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN 324 CALL clascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
326 ELSE IF( anrm.GT.bignum )
THEN 330 CALL clascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
332 ELSE IF( anrm.EQ.zero )
THEN 336 CALL claset(
'Full', max( m, n ), nrhs, czero, czero, b, ldb )
337 work( 1 ) =
REAL( lwopt )
344 bnrm = clange(
'M', brow, nrhs, b, ldb, rwork )
346 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN 350 CALL clascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
353 ELSE IF( bnrm.GT.bignum )
THEN 357 CALL clascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
369 CALL cgeqrt( m, n, nb, a, lda, work( 1 ), nb,
370 $ work( mn*nb+1 ), info )
382 CALL cgemqrt(
'Left',
'Conjugate transpose', m, nrhs, n, nb,
383 $ a, lda, work( 1 ), nb, b, ldb,
384 $ work( mn*nb+1 ), info )
388 CALL ctrtrs(
'Upper',
'No transpose',
'Non-unit', n, nrhs,
389 $ a, lda, b, ldb, info )
407 CALL ctrtrs(
'Upper',
'Conjugate transpose',
'Non-unit',
408 $ n, nrhs, a, lda, b, ldb, info )
427 CALL cgemqrt(
'Left',
'No transpose', m, nrhs, n, nb,
428 $ a, lda, work( 1 ), nb, b, ldb,
429 $ work( mn*nb+1 ), info )
442 CALL cgelqt( m, n, nb, a, lda, work( 1 ), nb,
443 $ work( mn*nb+1 ), info )
455 CALL ctrtrs(
'Lower',
'No transpose',
'Non-unit', m, nrhs,
456 $ a, lda, b, ldb, info )
475 CALL cgemlqt(
'Left',
'Conjugate transpose', n, nrhs, m, nb,
476 $ a, lda, work( 1 ), nb, b, ldb,
477 $ work( mn*nb+1 ), info )
491 CALL cgemlqt(
'Left',
'No transpose', n, nrhs, m, nb,
492 $ a, lda, work( 1 ), nb, b, ldb,
493 $ work( mn*nb+1), info )
497 CALL ctrtrs(
'Lower',
'Conjugate transpose',
'Non-unit',
498 $ m, nrhs, a, lda, b, ldb, info )
512 IF( iascl.EQ.1 )
THEN 513 CALL clascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
515 ELSE IF( iascl.EQ.2 )
THEN 516 CALL clascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
519 IF( ibscl.EQ.1 )
THEN 520 CALL clascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
522 ELSE IF( ibscl.EQ.2 )
THEN 523 CALL clascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
527 work( 1 ) =
REAL( lwopt )
subroutine cgeqrt(M, N, NB, A, LDA, T, LDT, WORK, INFO)
CGEQRT
subroutine cgelqt(M, N, MB, A, LDA, T, LDT, WORK, INFO)
CGELQT
subroutine ctrtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
CTRTRS
subroutine xerbla(SRNAME, INFO)
XERBLA
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 slabad(SMALL, LARGE)
SLABAD
subroutine cgemqrt(SIDE, TRANS, M, N, K, NB, V, LDV, T, LDT, C, LDC, WORK, INFO)
CGEMQRT
subroutine cgelst(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
CGELST solves overdetermined or underdetermined systems for GE matrices using QR or LQ factorization...
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 cgemlqt(SIDE, TRANS, M, N, K, MB, V, LDV, T, LDT, C, LDC, WORK, INFO)
CGEMLQT