192 SUBROUTINE zgelst( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK,
201 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
204 COMPLEX*16 A( LDA, * ), B( LDB, * ), WORK( * )
210 DOUBLE PRECISION ZERO, ONE
211 parameter( zero = 0.0d+0, one = 1.0d+0 )
213 parameter( czero = ( 0.0d+0, 0.0d+0 ) )
217 INTEGER BROW, I, IASCL, IBSCL, J, LWOPT, MN, MNNRHS,
219 DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM
222 DOUBLE PRECISION RWORK( 1 )
227 DOUBLE PRECISION DLAMCH, ZLANGE
228 EXTERNAL lsame, ilaenv, dlamch, zlange
235 INTRINSIC dble, 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,
'ZGELST',
' ', m, n, -1, -1 )
271 mnnrhs = max( mn, nrhs )
272 lwopt = max( 1, (mn+mnnrhs)*nb )
273 work( 1 ) = dble( lwopt )
278 CALL xerbla(
'ZGELST ', -info )
280 ELSE IF( lquery )
THEN
286 IF( min( m, n, nrhs ).EQ.0 )
THEN
287 CALL zlaset(
'Full', max( m, n ), nrhs, czero, czero, b, ldb )
288 work( 1 ) = dble( lwopt )
294 IF( nb.GT.mn ) nb = mn
300 nb = min( nb, lwork/( mn + mnnrhs ) )
304 nbmin = max( 2, ilaenv( 2,
'ZGELST',
' ', m, n, -1, -1 ) )
306 IF( nb.LT.nbmin )
THEN
312 smlnum = dlamch(
'S' ) / dlamch(
'P' )
313 bignum = one / smlnum
314 CALL dlabad( smlnum, bignum )
318 anrm = zlange(
'M', m, n, a, lda, rwork )
320 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
324 CALL zlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
326 ELSE IF( anrm.GT.bignum )
THEN
330 CALL zlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
332 ELSE IF( anrm.EQ.zero )
THEN
336 CALL zlaset(
'Full', max( m, n ), nrhs, czero, czero, b, ldb )
337 work( 1 ) = dble( lwopt )
344 bnrm = zlange(
'M', brow, nrhs, b, ldb, rwork )
346 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
350 CALL zlascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
353 ELSE IF( bnrm.GT.bignum )
THEN
357 CALL zlascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
369 CALL zgeqrt( m, n, nb, a, lda, work( 1 ), nb,
370 $ work( mn*nb+1 ), info )
382 CALL zgemqrt(
'Left',
'Conjugate transpose', m, nrhs, n, nb,
383 $ a, lda, work( 1 ), nb, b, ldb,
384 $ work( mn*nb+1 ), info )
388 CALL ztrtrs(
'Upper',
'No transpose',
'Non-unit', n, nrhs,
389 $ a, lda, b, ldb, info )
407 CALL ztrtrs(
'Upper',
'Conjugate transpose',
'Non-unit',
408 $ n, nrhs, a, lda, b, ldb, info )
427 CALL zgemqrt(
'Left',
'No transpose', m, nrhs, n, nb,
428 $ a, lda, work( 1 ), nb, b, ldb,
429 $ work( mn*nb+1 ), info )
442 CALL zgelqt( m, n, nb, a, lda, work( 1 ), nb,
443 $ work( mn*nb+1 ), info )
455 CALL ztrtrs(
'Lower',
'No transpose',
'Non-unit', m, nrhs,
456 $ a, lda, b, ldb, info )
475 CALL zgemlqt(
'Left',
'Conjugate transpose', n, nrhs, m, nb,
476 $ a, lda, work( 1 ), nb, b, ldb,
477 $ work( mn*nb+1 ), info )
491 CALL zgemlqt(
'Left',
'No transpose', n, nrhs, m, nb,
492 $ a, lda, work( 1 ), nb, b, ldb,
493 $ work( mn*nb+1), info )
497 CALL ztrtrs(
'Lower',
'Conjugate transpose',
'Non-unit',
498 $ m, nrhs, a, lda, b, ldb, info )
512 IF( iascl.EQ.1 )
THEN
513 CALL zlascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
515 ELSE IF( iascl.EQ.2 )
THEN
516 CALL zlascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
519 IF( ibscl.EQ.1 )
THEN
520 CALL zlascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
522 ELSE IF( ibscl.EQ.2 )
THEN
523 CALL zlascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
527 work( 1 ) = dble( lwopt )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zgemqrt(SIDE, TRANS, M, N, K, NB, V, LDV, T, LDT, C, LDC, WORK, INFO)
ZGEMQRT
subroutine zgeqrt(M, N, NB, A, LDA, T, LDT, WORK, INFO)
ZGEQRT
subroutine zgelst(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
ZGELST solves overdetermined or underdetermined systems for GE matrices using QR or LQ factorization ...
subroutine zlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine ztrtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
ZTRTRS
subroutine zgemlqt(SIDE, TRANS, M, N, K, MB, V, LDV, T, LDT, C, LDC, WORK, INFO)
ZGEMLQT
subroutine zgelqt(M, N, MB, A, LDA, T, LDT, WORK, INFO)
ZGELQT