160 SUBROUTINE dgetsls( TRANS, M, N, NRHS, A, LDA, B, LDB,
161 $ WORK, LWORK, INFO )
169 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
172 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), WORK( * )
179 DOUBLE PRECISION ZERO, ONE
180 parameter( zero = 0.0d0, one = 1.0d0 )
184 INTEGER I, IASCL, IBSCL, J, MINMN, MAXMN, BROW,
185 $ scllen, mnk, tszo, tszm, lwo, lwm, lw1, lw2,
186 $ wsizeo, wsizem, info2
187 DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM, TQ( 5 ), WORKQ( 1 )
192 DOUBLE PRECISION DLAMCH, DLANGE
193 EXTERNAL lsame, ilaenv,
dlabad, dlamch, dlange
200 INTRINSIC dble, max, min, int
209 mnk = max( minmn, nrhs )
210 tran = lsame( trans,
'T' )
212 lquery = ( lwork.EQ.-1 .OR. lwork.EQ.-2 )
213 IF( .NOT.( lsame( trans,
'N' ) .OR.
214 $ lsame( trans,
'T' ) ) )
THEN
216 ELSE IF( m.LT.0 )
THEN
218 ELSE IF( n.LT.0 )
THEN
220 ELSE IF( nrhs.LT.0 )
THEN
222 ELSE IF( lda.LT.max( 1, m ) )
THEN
224 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN
233 CALL dgeqr( m, n, a, lda, tq, -1, workq, -1, info2 )
234 tszo = int( tq( 1 ) )
235 lwo = int( workq( 1 ) )
236 CALL dgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
237 $ tszo, b, ldb, workq, -1, info2 )
238 lwo = max( lwo, int( workq( 1 ) ) )
239 CALL dgeqr( m, n, a, lda, tq, -2, workq, -2, info2 )
240 tszm = int( tq( 1 ) )
241 lwm = int( workq( 1 ) )
242 CALL dgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
243 $ tszm, b, ldb, workq, -1, info2 )
244 lwm = max( lwm, int( workq( 1 ) ) )
248 CALL dgelq( m, n, a, lda, tq, -1, workq, -1, info2 )
249 tszo = int( tq( 1 ) )
250 lwo = int( workq( 1 ) )
251 CALL dgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
252 $ tszo, b, ldb, workq, -1, info2 )
253 lwo = max( lwo, int( workq( 1 ) ) )
254 CALL dgelq( m, n, a, lda, tq, -2, workq, -2, info2 )
255 tszm = int( tq( 1 ) )
256 lwm = int( workq( 1 ) )
257 CALL dgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
258 $ tszm, b, ldb, workq, -1, info2 )
259 lwm = max( lwm, int( workq( 1 ) ) )
264 IF( ( lwork.LT.wsizem ).AND.( .NOT.lquery ) )
THEN
271 CALL xerbla(
'DGETSLS', -info )
272 work( 1 ) = dble( wsizeo )
276 IF( lwork.EQ.-1 ) work( 1 ) = real( wsizeo )
277 IF( lwork.EQ.-2 ) work( 1 ) = real( wsizem )
280 IF( lwork.LT.wsizeo )
THEN
290 IF( min( m, n, nrhs ).EQ.0 )
THEN
291 CALL dlaset(
'FULL', max( m, n ), nrhs, zero, zero,
298 smlnum = dlamch(
'S' ) / dlamch(
'P' )
299 bignum = one / smlnum
300 CALL dlabad( smlnum, bignum )
304 anrm = dlange(
'M', m, n, a, lda, work )
306 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
310 CALL dlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
312 ELSE IF( anrm.GT.bignum )
THEN
316 CALL dlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
318 ELSE IF( anrm.EQ.zero )
THEN
322 CALL dlaset(
'F', maxmn, nrhs, zero, zero, b, ldb )
330 bnrm = dlange(
'M', brow, nrhs, b, ldb, work )
332 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
336 CALL dlascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
339 ELSE IF( bnrm.GT.bignum )
THEN
343 CALL dlascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
352 CALL dgeqr( m, n, a, lda, work( lw2+1 ), lw1,
353 $ work( 1 ), lw2, info )
354 IF ( .NOT.tran )
THEN
360 CALL dgemqr(
'L' ,
'T', m, nrhs, n, a, lda,
361 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
366 CALL dtrtrs(
'U',
'N',
'N', n, nrhs,
367 $ a, lda, b, ldb, info )
378 CALL dtrtrs(
'U',
'T',
'N', n, nrhs,
379 $ a, lda, b, ldb, info )
395 CALL dgemqr(
'L',
'N', m, nrhs, n, a, lda,
396 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
407 CALL dgelq( m, n, a, lda, work( lw2+1 ), lw1,
408 $ work( 1 ), lw2, info )
418 CALL dtrtrs(
'L',
'N',
'N', m, nrhs,
419 $ a, lda, b, ldb, info )
435 CALL dgemlq(
'L',
'T', n, nrhs, m, a, lda,
436 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
449 CALL dgemlq(
'L',
'N', n, nrhs, m, a, lda,
450 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
457 CALL dtrtrs(
'Lower',
'Transpose',
'Non-unit', m, nrhs,
458 $ a, lda, b, ldb, info )
472 IF( iascl.EQ.1 )
THEN
473 CALL dlascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
475 ELSE IF( iascl.EQ.2 )
THEN
476 CALL dlascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
479 IF( ibscl.EQ.1 )
THEN
480 CALL dlascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
482 ELSE IF( ibscl.EQ.2 )
THEN
483 CALL dlascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
488 work( 1 ) = dble( tszo + lwo )
subroutine dgelq(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
DGELQ
subroutine dgemlq(SIDE, TRANS, M, N, K, A, LDA, T, TSIZE, C, LDC, WORK, LWORK, INFO)
DGEMLQ
subroutine dgemqr(SIDE, TRANS, M, N, K, A, LDA, T, TSIZE, C, LDC, WORK, LWORK, INFO)
DGEMQR
subroutine dgeqr(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
DGEQR
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 dgetsls(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
DGETSLS
subroutine dtrtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
DTRTRS