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,
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
', '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.EQ.
IF( MIN( M, N, NRHS )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.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
308 CALL DLASCL( 'g
', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
310.GT.
ELSE IF( ANRMBIGNUM ) THEN
314 CALL DLASCL( 'g
', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
316.EQ.
ELSE IF( ANRMZERO ) THEN
320 CALL DLASET( 'f
', MAX( M, N ), NRHS, ZERO, ZERO, B, LDB )
327 BNRM = DLANGE( 'm
', BROW, NRHS, B, LDB, RWORK )
329.GT..AND..LT.
IF( BNRMZERO BNRMSMLNUM ) THEN
333 CALL DLASCL( 'g
', 0, 0, BNRM, SMLNUM, BROW, NRHS, B, LDB,
336.GT.
ELSE IF( BNRMBIGNUM ) 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.EQ.
IF( IASCL1 ) THEN
480 CALL DLASCL( 'g
', 0, 0, ANRM, SMLNUM, SCLLEN, NRHS, B, LDB,
482.EQ.
ELSE IF( IASCL2 ) THEN
483 CALL DLASCL( 'g
', 0, 0, ANRM, BIGNUM, SCLLEN, NRHS, B, LDB,
486.EQ.
IF( IBSCL1 ) THEN
487 CALL DLASCL( 'g
', 0, 0, SMLNUM, BNRM, SCLLEN, NRHS, B, LDB,
489.EQ.
ELSE IF( IBSCL2 ) 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 dgelqf(m, n, a, lda, tau, work, lwork, info)
DGELQF
subroutine dgeqrf(m, n, a, lda, tau, work, lwork, info)
DGEQRF
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