180 SUBROUTINE zgels( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK,
189 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
192 COMPLEX*16 A( lda, * ), B( ldb, * ), WORK( * )
198 DOUBLE PRECISION ZERO, ONE
199 parameter( zero = 0.0d+0, one = 1.0d+0 )
201 parameter( czero = ( 0.0d+0, 0.0d+0 ) )
205 INTEGER BROW, I, IASCL, IBSCL, J, MN, NB, SCLLEN, WSIZE
206 DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM
209 DOUBLE PRECISION RWORK( 1 )
214 DOUBLE PRECISION DLAMCH, ZLANGE
215 EXTERNAL lsame, ilaenv, dlamch, zlange
222 INTRINSIC dble, max, min
230 lquery = ( lwork.EQ.-1 )
231 IF( .NOT.( lsame( trans,
'N' ) .OR. lsame( trans,
'C' ) ) )
THEN 233 ELSE IF( m.LT.0 )
THEN 235 ELSE IF( n.LT.0 )
THEN 237 ELSE IF( nrhs.LT.0 )
THEN 239 ELSE IF( lda.LT.max( 1, m ) )
THEN 241 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN 243 ELSE IF( lwork.LT.max( 1, mn+max( mn, nrhs ) ) .AND. .NOT.lquery )
250 IF( info.EQ.0 .OR. info.EQ.-10 )
THEN 253 IF( lsame( trans,
'N' ) )
257 nb = ilaenv( 1,
'ZGEQRF',
' ', m, n, -1, -1 )
259 nb = max( nb, ilaenv( 1,
'ZUNMQR',
'LN', m, nrhs, n,
262 nb = max( nb, ilaenv( 1,
'ZUNMQR',
'LC', m, nrhs, n,
266 nb = ilaenv( 1,
'ZGELQF',
' ', m, n, -1, -1 )
268 nb = max( nb, ilaenv( 1,
'ZUNMLQ',
'LC', n, nrhs, m,
271 nb = max( nb, ilaenv( 1,
'ZUNMLQ',
'LN', n, nrhs, m,
276 wsize = max( 1, mn+max( mn, nrhs )*nb )
277 work( 1 ) = dble( wsize )
282 CALL xerbla(
'ZGELS ', -info )
284 ELSE IF( lquery )
THEN 290 IF( min( m, n, nrhs ).EQ.0 )
THEN 291 CALL zlaset(
'Full', max( m, n ), nrhs, czero, czero, b, ldb )
297 smlnum = dlamch(
'S' ) / dlamch(
'P' )
298 bignum = one / smlnum
299 CALL dlabad( smlnum, bignum )
303 anrm = zlange(
'M', m, n, a, lda, rwork )
305 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN 309 CALL zlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
311 ELSE IF( anrm.GT.bignum )
THEN 315 CALL zlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
317 ELSE IF( anrm.EQ.zero )
THEN 321 CALL zlaset(
'F', max( m, n ), nrhs, czero, czero, b, ldb )
328 bnrm = zlange(
'M', brow, nrhs, b, ldb, rwork )
330 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN 334 CALL zlascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
337 ELSE IF( bnrm.GT.bignum )
THEN 341 CALL zlascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
350 CALL zgeqrf( m, n, a, lda, work( 1 ), work( mn+1 ), lwork-mn,
361 CALL zunmqr(
'Left',
'Conjugate transpose', m, nrhs, n, a,
362 $ lda, work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
369 CALL ztrtrs(
'Upper',
'No transpose',
'Non-unit', n, nrhs,
370 $ a, lda, b, ldb, info )
384 CALL ztrtrs(
'Upper',
'Conjugate transpose',
'Non-unit',
385 $ n, nrhs, a, lda, b, ldb, info )
401 CALL zunmqr(
'Left',
'No transpose', m, nrhs, n, a, lda,
402 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
415 CALL zgelqf( m, n, a, lda, work( 1 ), work( mn+1 ), lwork-mn,
426 CALL ztrtrs(
'Lower',
'No transpose',
'Non-unit', m, nrhs,
427 $ a, lda, b, ldb, info )
443 CALL zunmlq(
'Left',
'Conjugate transpose', n, nrhs, m, a,
444 $ lda, work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
457 CALL zunmlq(
'Left',
'No transpose', n, nrhs, m, a, lda,
458 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
465 CALL ztrtrs(
'Lower',
'Conjugate transpose',
'Non-unit',
466 $ m, nrhs, a, lda, b, ldb, info )
480 IF( iascl.EQ.1 )
THEN 481 CALL zlascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
483 ELSE IF( iascl.EQ.2 )
THEN 484 CALL zlascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
487 IF( ibscl.EQ.1 )
THEN 488 CALL zlascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
490 ELSE IF( ibscl.EQ.2 )
THEN 491 CALL zlascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
496 work( 1 ) = dble( wsize )
subroutine zgels(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
ZGELS solves overdetermined or underdetermined systems for GE matrices
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zunmlq(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
ZUNMLQ
subroutine ztrtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
ZTRTRS
subroutine zgeqrf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
ZGEQRF
subroutine zgelqf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
ZGELQF
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 zunmqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
ZUNMQR
subroutine dlabad(SMALL, LARGE)
DLABAD