180 SUBROUTINE cgels( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK,
189 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
192 COMPLEX A( LDA, * ), B( LDB, * ), WORK( * )
199 parameter( zero = 0.0e+0, one = 1.0e+0 )
201 parameter( czero = ( 0.0e+0, 0.0e+0 ) )
205 INTEGER BROW, I, IASCL, IBSCL, J, MN, NB, SCLLEN, WSIZE
206 REAL ANRM, BIGNUM, BNRM, SMLNUM
215 EXTERNAL lsame, ilaenv, clange, slamch
222 INTRINSIC max, min, real
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 IF( min( m, n, nrhs ).EQ.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 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
309 CALL clascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
311 ELSE IF( anrm.GT.bignum )
THEN
315 CALL clascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
317 ELSE IF( anrm.EQ.zero )
THEN
321 CALL claset(
'F', max( m, n ), nrhs, czero, czero, b, ldb )
328 bnrm = clange(
'M', brow, nrhs, b, ldb, rwork )
330 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
334 CALL clascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
337 ELSE IF( bnrm.GT.bignum )
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 IF( iascl.EQ.1 )
THEN
481 CALL clascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
483 ELSE IF( iascl.EQ.2 )
THEN
484 CALL clascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
487 IF( ibscl.EQ.1 )
THEN
488 CALL clascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
490 ELSE IF( ibscl.EQ.2 )
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
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 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 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 ctrtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
CTRTRS
subroutine cunmlq(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
CUNMLQ
subroutine cunmqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
CUNMQR