188 SUBROUTINE zgels( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK,
198 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
201 COMPLEX*16 A( LDA, * ), B( LDB, * ), WORK( * )
207 DOUBLE PRECISION ZERO, ONE
208 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
210 parameter( czero = ( 0.0d+0, 0.0d+0 ) )
214 INTEGER BROW, I, IASCL, IBSCL, J, MN, NB, SCLLEN, WSIZE
215 DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM
218 DOUBLE PRECISION RWORK( 1 )
223 DOUBLE PRECISION DLAMCH, ZLANGE
224 EXTERNAL lsame, ilaenv, dlamch, zlange
232 INTRINSIC dble, max, min
240 lquery = ( lwork.EQ.-1 )
241 IF( .NOT.( lsame( trans,
'N' ) .OR.
242 $ lsame( trans,
'C' ) ) )
THEN
244 ELSE IF( m.LT.0 )
THEN
246 ELSE IF( n.LT.0 )
THEN
248 ELSE IF( nrhs.LT.0 )
THEN
250 ELSE IF( lda.LT.max( 1, m ) )
THEN
252 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN
254 ELSE IF( lwork.LT.max( 1, mn+max( mn, nrhs ) ) .AND. .NOT.lquery )
261 IF( info.EQ.0 .OR. info.EQ.-10 )
THEN
264 IF( lsame( trans,
'N' ) )
268 nb = ilaenv( 1,
'ZGEQRF',
' ', m, n, -1, -1 )
270 nb = max( nb, ilaenv( 1,
'ZUNMQR',
'LN', m, nrhs, n,
273 nb = max( nb, ilaenv( 1,
'ZUNMQR',
'LC', m, nrhs, n,
277 nb = ilaenv( 1,
'ZGELQF',
' ', m, n, -1, -1 )
279 nb = max( nb, ilaenv( 1,
'ZUNMLQ',
'LC', n, nrhs, m,
282 nb = max( nb, ilaenv( 1,
'ZUNMLQ',
'LN', n, nrhs, m,
287 wsize = max( 1, mn+max( mn, nrhs )*nb )
288 work( 1 ) = dble( wsize )
293 CALL xerbla(
'ZGELS ', -info )
295 ELSE IF( lquery )
THEN
301 IF( min( m, n, nrhs ).EQ.0 )
THEN
302 CALL zlaset(
'Full', max( m, n ), nrhs, czero, czero, b,
309 smlnum = dlamch(
'S' ) / dlamch(
'P' )
310 bignum = one / smlnum
314 anrm = zlange(
'M', m, n, a, lda, rwork )
316 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
320 CALL zlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
322 ELSE IF( anrm.GT.bignum )
THEN
326 CALL zlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
328 ELSE IF( anrm.EQ.zero )
THEN
332 CALL zlaset(
'F', max( m, n ), nrhs, czero, czero, b, ldb )
339 bnrm = zlange(
'M', brow, nrhs, b, ldb, rwork )
341 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
345 CALL zlascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
348 ELSE IF( bnrm.GT.bignum )
THEN
352 CALL zlascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
361 CALL zgeqrf( m, n, a, lda, work( 1 ), work( mn+1 ),
373 CALL zunmqr(
'Left',
'Conjugate transpose', m, nrhs, n,
375 $ lda, work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
382 CALL ztrtrs(
'Upper',
'No transpose',
'Non-unit', n,
384 $ a, lda, b, ldb, info )
398 CALL ztrtrs(
'Upper',
'Conjugate transpose',
'Non-unit',
399 $ n, nrhs, a, lda, b, ldb, info )
415 CALL zunmqr(
'Left',
'No transpose', m, nrhs, n, a, lda,
416 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
429 CALL zgelqf( m, n, a, lda, work( 1 ), work( mn+1 ),
441 CALL ztrtrs(
'Lower',
'No transpose',
'Non-unit', m,
443 $ a, lda, b, ldb, info )
459 CALL zunmlq(
'Left',
'Conjugate transpose', n, nrhs, m,
461 $ lda, work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
474 CALL zunmlq(
'Left',
'No transpose', n, nrhs, m, a, lda,
475 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
482 CALL ztrtrs(
'Lower',
'Conjugate transpose',
'Non-unit',
483 $ m, nrhs, a, lda, b, ldb, info )
497 IF( iascl.EQ.1 )
THEN
498 CALL zlascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
500 ELSE IF( iascl.EQ.2 )
THEN
501 CALL zlascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
504 IF( ibscl.EQ.1 )
THEN
505 CALL zlascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
507 ELSE IF( ibscl.EQ.2 )
THEN
508 CALL zlascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
513 work( 1 ) = dble( wsize )