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 ( LDA, * ), B( LDB, * ), WORK( * )
198 DOUBLE PRECISION ZERO,
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
230 lquery = ( lwork.EQ.-1 )
231 IF( .NOT.( lsame( trans,
'N' ) .OR. lsame( trans, 'c
' ) ) ) THEN
233.LT.
ELSE IF( M0 ) THEN
235.LT.
ELSE IF( N0 ) THEN
237.LT.
ELSE IF( NRHS0 ) THEN
239.LT.
ELSE IF( LDAMAX( 1, M ) ) THEN
241.LT.
ELSE IF( LDBMAX( 1, M, N ) ) THEN
243.LT..AND..NOT.
ELSE IF( LWORKMAX( 1, MN+MAX( MN, NRHS ) ) LQUERY )
250.EQ..OR..EQ.
IF( INFO0 INFO-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.EQ.
IF( MIN( M, N, NRHS )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.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
309 CALL ZLASCL( 'g
', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
311.GT.
ELSE IF( ANRMBIGNUM ) THEN
315 CALL ZLASCL( 'g
', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
317.EQ.
ELSE IF( ANRMZERO ) THEN
321 CALL ZLASET( 'f
', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
328 BNRM = ZLANGE( 'm
', BROW, NRHS, B, LDB, RWORK )
330.GT..AND..LT.
IF( BNRMZERO BNRMSMLNUM ) THEN
334 CALL ZLASCL( 'g
', 0, 0, BNRM, SMLNUM, BROW, NRHS, B, LDB,
337.GT.
ELSE IF( BNRMBIGNUM ) 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 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 zunmlq(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
ZUNMLQ
subroutine zunmqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
ZUNMQR
subroutine ztrtrs(uplo, trans, diag, n, nrhs, a, lda, b, ldb, info)
ZTRTRS
subroutine zgeqrf(m, n, a, lda, tau, work, lwork, info)
ZGEQRF VARIANT: left-looking Level 3 BLAS of the algorithm.