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
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
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
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 )