181 SUBROUTINE dgels( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK,
190 INTEGER INFO, LDA, LDB
193 DOUBLE PRECISION A( LDA, * ), B( LDB
199 DOUBLE PRECISION ZERO,
200 parameter( zero = 0.0d0, one = 1.0d0 )
204 INTEGER BROW, I, IASCL, IBSCL, J, MN, , SCLLEN, WSIZE
205 DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM
208 DOUBLE PRECISION RWORK( 1 )
213 DOUBLE PRECISION DLAMCH, DLANGE
214 EXTERNAL lsame, ilaenv,
dlabad, dlamch, dlange
229 lquery = ( lwork.EQ.-1 )
230 IF( .NOT.( lsame( trans,
'N' ) .OR. lsame( trans,
'T' ) ) )
THEN
232 ELSE IF( m.LT.0 )
THEN
234 ELSE IF( n.LT.0 )
THEN
236 ELSE IF( nrhs.LT.0 )
THEN
238 ELSE IF( lda.LT.
max( 1, m ) )
THEN
240 ELSE IF( ldb.LT.
max( 1, m, n ) )
THEN
242 ELSE IF( lwork.LT.
max( 1, mn+
max( mn, nrhs ) ) .AND. .NOT.lquery )
249 IF( info.EQ.0 .OR. info.EQ.-10 )
THEN
252 IF( lsame( trans,
'N' ) )
256 nb = ilaenv( 1,
'DGEQRF',
' ', m, n, -1, -1 )
258 nb =
max( nb, ilaenv( 1,
'DORMQR',
'LN', m, nrhs, n,
261 nb =
max( nb, ilaenv( 1,
'DORMQR',
'LT', m, nrhs, n,
265 nb = ilaenv( 1,
'DGELQF',
' ', m, n, -1, -1 )
267 nb =
max( nb, ilaenv( 1,
'DORMLQ',
'LT', n, nrhs, m,
270 nb =
max( nb, ilaenv( 1,
'DORMLQ',
'LN', n, nrhs, m,
275 wsize =
max( 1, mn+
max( mn, nrhs )*nb )
276 work( 1 ) = dble( wsize )
281 CALL xerbla(
'DGELS ', -info )
283 ELSE IF( lquery )
THEN
289 IF(
min( m, n, nrhs ).EQ.0 )
THEN
290 CALL dlaset(
'Full',
max( m, n ), nrhs, zero, zero, b, ldb )
296 smlnum = dlamch(
'S' ) / dlamch(
'P' )
297 bignum = one / smlnum
298 CALL dlabad( smlnum, bignum )
302 anrm = dlange(
'M', m, n, a, lda, rwork )
304 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
308 CALL dlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
310 ELSE IF( anrm.GT.bignum )
THEN
314 CALL dlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
316 ELSE IF( anrm.EQ.zero )
THEN
320 CALL dlaset(
'F',
max( m, n ), nrhs, zero, zero, b, ldb )
327 bnrm = dlange(
'M', brow, nrhs, b, ldb, rwork )
329 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
333 CALL dlascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
336 ELSE IF( bnrm.GT.bignum )
THEN
340 CALL dlascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
349 CALL dgeqrf( m, n, a, lda, work( 1 ), work( mn+1 ), lwork-mn,
360 CALL dormqr(
'Left',
'Transpose', m, nrhs, n, a, lda,
361 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
368 CALL dtrtrs(
'Upper',
'No transpose',
'Non-unit', n, nrhs,
369 $ a, lda, b, ldb, info )
383 CALL dtrtrs(
'Upper',
'Transpose',
'Non-unit', n, nrhs,
384 $ a, lda, b, ldb, info )
400 CALL dormqr(
'Left',
'No transpose', m, nrhs, n, a, lda,
401 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
414 CALL dgelqf( m, n, a, lda, work( 1 ), work( mn+1 ), lwork-mn,
425 CALL dtrtrs(
'Lower',
'No transpose',
'Non-unit', m, nrhs,
426 $ a, lda, b, ldb, info )
442 CALL dormlq(
'Left',
'Transpose'
443 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
456 CALL dormlq(
'Left',
'No transpose', n, nrhs, m, a, lda,
457 $ work( 1 ), b, ldb, work( mn+1 ), lwork-mn,
464 CALL dtrtrs(
'Lower',
'Transpose',
'Non-unit', m, nrhs,
465 $ a, lda, b, ldb, info )
479 IF( iascl.EQ.1 )
THEN
480 CALL dlascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
482 ELSE IF( iascl.EQ.2 )
THEN
483 CALL dlascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
486 IF( ibscl.EQ.1 )
THEN
487 CALL dlascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
489 ELSE IF( ibscl.EQ.2 )
THEN
490 CALL dlascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
495 work( 1 ) = dble( wsize )