180 SUBROUTINE cgels( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK,
189 INTEGER INFO, LDA, LDB, LWORK, , N, NRHS
192 COMPLEX A( LDA, * ), B( LDB
199 parameter( zero = 0.0e+0, one = 1.0e+0 )
201 parameter( czero = ( 0.0e+0, 0.0e+0 ) )
205 INTEGER BROW, , , IBSCL, , MN, NB, SCLLEN,
206 REAL ANRM, BIGNUM, BNRM, SMLNUM
215 EXTERNAL lsame, ilaenv, clange, slamch
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.
250 IF( info.EQ.0 .OR. info.EQ.-10 )
THEN
253 IF(
lsame( trans,
'N' ) )
257 nb = ilaenv( 1,
'CGEQRF',
' ', m, n, -1, -1 )
259 nb =
max( nb, ilaenv( 1,
'CUNMQR', 'ln
', M, NRHS, N,
262 NB = MAX( NB, ILAENV( 1, 'cunmqr', 'lc
', M, NRHS, N,
266 NB = ILAENV( 1, 'cgelqf', ' ', M, N, -1, -1 )
268 NB = MAX( NB, ILAENV( 1, 'cunmlq', 'lc
', N, NRHS, M,
271 NB = MAX( NB, ILAENV( 1, 'cunmlq', 'ln
', N, NRHS, M,
276 WSIZE = MAX( 1, MN + MAX( MN, NRHS )*NB )
277 WORK( 1 ) = REAL( WSIZE )
282 CALL XERBLA( 'cgels ', -INFO )
284 ELSE IF( LQUERY ) THEN
290.EQ.
IF( MIN( M, N, NRHS )0 ) THEN
291 CALL CLASET( 'full
', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
297 SMLNUM = SLAMCH( 's
' ) / SLAMCH( 'p
' )
298 BIGNUM = ONE / SMLNUM
299 CALL SLABAD( SMLNUM, BIGNUM )
303 ANRM = CLANGE( 'm
', M, N, A, LDA, RWORK )
305.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
309 CALL CLASCL( 'g
', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
311.GT.
ELSE IF( ANRMBIGNUM ) THEN
315 CALL CLASCL( 'g
', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
317.EQ.
ELSE IF( ANRMZERO ) THEN
321 CALL CLASET( 'f
', MAX( M, N ), NRHS, CZERO, CZERO, B, LDB )
328 BNRM = CLANGE( 'm
', BROW, NRHS, B, LDB, RWORK )
330.GT..AND..LT.
IF( BNRMZERO BNRMSMLNUM ) THEN
334 CALL CLASCL( 'g
', 0, 0, BNRM, SMLNUM, BROW, NRHS, B, LDB,
337.GT.
ELSE IF( BNRMBIGNUM ) THEN
341 CALL CLASCL( 'g
', 0, 0, BNRM, BIGNUM, BROW, NRHS, B, LDB,
350 CALL CGEQRF( M, N, A, LDA, WORK( 1 ), WORK( MN+1 ), LWORK-MN,
361 CALL CUNMQR( 'left
', 'conjugate transpose
', M, NRHS, N, A,
362 $ LDA, WORK( 1 ), B, LDB, WORK( MN+1 ), LWORK-MN,
369 CALL CTRTRS( 'upper
', 'no transpose
', 'non-unit
', N, NRHS,
370 $ A, LDA, B, LDB, INFO )
384 CALL CTRTRS( 'upper
', 'conjugate transpose
','non-unit
',
385 $ N, NRHS, A, LDA, B, LDB, INFO )
401 CALL CUNMQR( 'left
', 'no transpose
', M, NRHS, N, A, LDA,
402 $ WORK( 1 ), B, LDB, WORK( MN+1 ), LWORK-MN,
415 CALL CGELQF( M, N, A, LDA, WORK( 1 ), WORK( MN+1 ), LWORK-MN,
426 CALL CTRTRS( 'lower
', 'no transpose
', 'non-unit
', M, NRHS,
427 $ A, LDA, B, LDB, INFO )
443 CALL CUNMLQ( 'left
', 'conjugate transpose
', N, NRHS, M, A,
444 $ LDA, WORK( 1 ), B, LDB, WORK( MN+1 ), LWORK-MN,
457 CALL CUNMLQ( 'left
', 'no transpose
', N, NRHS, M, A, LDA,
458 $ WORK( 1 ), B, LDB, WORK( MN+1 ), LWORK-MN,
465 CALL CTRTRS( 'lower
', 'conjugate transpose
', 'non-unit
',
466 $ M, NRHS, A, LDA, B, LDB, INFO )
480.EQ.
IF( IASCL1 ) THEN
481 CALL CLASCL( 'g
', 0, 0, ANRM, SMLNUM, SCLLEN, NRHS, B, LDB,
483.EQ.
ELSE IF( IASCL2 ) THEN
484 CALL CLASCL( 'g
', 0, 0, ANRM, BIGNUM, SCLLEN, NRHS, B, LDB,
487.EQ.
IF( IBSCL1 ) THEN
488 CALL CLASCL( 'g
', 0, 0, SMLNUM, BNRM, SCLLEN, NRHS, B, LDB,
490.EQ.
ELSE IF( IBSCL2 ) THEN
491 CALL CLASCL( 'g
', 0, 0, BIGNUM, BNRM, SCLLEN, NRHS, B, LDB,
496 WORK( 1 ) = REAL( WSIZE )
subroutine slabad(small, large)
SLABAD
subroutine xerbla(srname, info)
XERBLA
logical function lsame(ca, cb)
LSAME
subroutine cgeqrf(m, n, a, lda, tau, work, lwork, info)
CGEQRF
subroutine cgelqf(m, n, a, lda, tau, work, lwork, info)
CGELQF
subroutine cgels(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, info)
CGELS solves overdetermined or underdetermined systems for GE matrices
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 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 cunmqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
CUNMQR
subroutine cunmlq(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
CUNMLQ
subroutine ctrtrs(uplo, trans, diag, n, nrhs, a, lda, b, ldb, info)
CTRTRS