181 SUBROUTINE dgels( TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK,
190 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
193 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), WORK( * )
199 DOUBLE PRECISION ZERO, ONE
200 parameter( zero = 0.0d0, one = 1.0d0 )
204 INTEGER BROW, I, IASCL, IBSCL, J, MN, NB, 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
221 INTRINSIC dble, max, min
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', n, nrhs, m, a, lda,
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 )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dgeqrf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
DGEQRF
subroutine dgelqf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
DGELQF
subroutine dgels(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
DGELS solves overdetermined or underdetermined systems for GE matrices
subroutine dormqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMQR
subroutine dtrtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
DTRTRS
subroutine dormlq(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
DORMLQ