189 SUBROUTINE dgels( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK,
199 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
202 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), WORK( * )
208 DOUBLE PRECISION ZERO, ONE
209 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
213 INTEGER BROW, I, IASCL, IBSCL, J, MN, NB, SCLLEN, WSIZE
214 DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM
217 DOUBLE PRECISION RWORK( 1 )
222 DOUBLE PRECISION DLAMCH, DLANGE
223 EXTERNAL lsame, ilaenv, dlamch, dlange
231 INTRINSIC dble, max, min
239 lquery = ( lwork.EQ.-1 )
240 IF( .NOT.( lsame( trans,
'N' ) .OR.
241 $ lsame( trans,
'T' ) ) )
THEN
243 ELSE IF( m.LT.0 )
THEN
245 ELSE IF( n.LT.0 )
THEN
247 ELSE IF( nrhs.LT.0 )
THEN
249 ELSE IF( lda.LT.max( 1, m ) )
THEN
251 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN
253 ELSE IF( lwork.LT.max( 1, mn+max( mn, nrhs ) ) .AND. .NOT.lquery )
260 IF( info.EQ.0 .OR. info.EQ.-10 )
THEN
263 IF( lsame( trans,
'N' ) )
267 nb = ilaenv( 1,
'DGEQRF',
' ', m, n, -1, -1 )
269 nb = max( nb, ilaenv( 1,
'DORMQR',
'LN', m, nrhs, n,
272 nb = max( nb, ilaenv( 1,
'DORMQR',
'LT', m, nrhs, n,
276 nb = ilaenv( 1,
'DGELQF',
' ', m, n, -1, -1 )
278 nb = max( nb, ilaenv( 1,
'DORMLQ',
'LT', n, nrhs, m,
281 nb = max( nb, ilaenv( 1,
'DORMLQ',
'LN', n, nrhs, m,
286 wsize = max( 1, mn+max( mn, nrhs )*nb )
287 work( 1 ) = dble( wsize )
292 CALL xerbla(
'DGELS ', -info )
294 ELSE IF( lquery )
THEN
300 IF( min( m, n, nrhs ).EQ.0 )
THEN
301 CALL dlaset(
'Full', max( m, n ), nrhs, zero, zero, b, ldb )
307 smlnum = dlamch(
'S' ) / dlamch(
'P' )
308 bignum = one / smlnum
312 anrm = dlange(
'M', m, n, a, lda, rwork )
314 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
318 CALL dlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
320 ELSE IF( anrm.GT.bignum )
THEN
324 CALL dlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
326 ELSE IF( anrm.EQ.zero )
THEN
330 CALL dlaset(
'F', max( m, n ), nrhs, zero, zero, b, ldb )
337 bnrm = dlange(
'M', brow, nrhs, b, ldb, rwork )
339 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
343 CALL dlascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
346 ELSE IF( bnrm.GT.bignum )
THEN
350 CALL dlascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
359 CALL dgeqrf( m, n, a, lda, work( 1 ), work( mn+1 ),
371 CALL dormqr(
'Left',
'Transpose', m, nrhs, n, a, lda,
372 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
379 CALL dtrtrs(
'Upper',
'No transpose',
'Non-unit', n,
381 $ a, lda, b, ldb, info )
395 CALL dtrtrs(
'Upper',
'Transpose',
'Non-unit', n, nrhs,
396 $ a, lda, b, ldb, info )
412 CALL dormqr(
'Left',
'No transpose', m, nrhs, n, a, lda,
413 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
426 CALL dgelqf( m, n, a, lda, work( 1 ), work( mn+1 ),
438 CALL dtrtrs(
'Lower',
'No transpose',
'Non-unit', m,
440 $ a, lda, b, ldb, info )
456 CALL dormlq(
'Left',
'Transpose', n, nrhs, m, a, lda,
457 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
470 CALL dormlq(
'Left',
'No transpose', n, nrhs, m, a, lda,
471 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
478 CALL dtrtrs(
'Lower',
'Transpose',
'Non-unit', m, nrhs,
479 $ a, lda, b, ldb, info )
493 IF( iascl.EQ.1 )
THEN
494 CALL dlascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
496 ELSE IF( iascl.EQ.2 )
THEN
497 CALL dlascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
500 IF( ibscl.EQ.1 )
THEN
501 CALL dlascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
503 ELSE IF( ibscl.EQ.2 )
THEN
504 CALL dlascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
509 work( 1 ) = dble( wsize )