169 SUBROUTINE dgetsls( TRANS, M, N, NRHS, A, LDA, B, LDB,
170 $ WORK, LWORK, INFO )
178 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
181 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), WORK( * )
188 DOUBLE PRECISION ZERO, ONE
189 parameter( zero = 0.0d0, one = 1.0d0 )
193 INTEGER I, IASCL, IBSCL, J, MAXMN, BROW,
194 $ scllen, tszo, tszm, lwo, lwm, lw1, lw2,
195 $ wsizeo, wsizem, info2
196 DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM, TQ( 5 ), WORKQ( 1 )
200 DOUBLE PRECISION DLAMCH, DLANGE
201 EXTERNAL lsame, dlamch, dlange
208 INTRINSIC dble, max, min, int
216 tran = lsame( trans,
'T' )
218 lquery = ( lwork.EQ.-1 .OR. lwork.EQ.-2 )
219 IF( .NOT.( lsame( trans,
'N' ) .OR.
220 $ lsame( trans,
'T' ) ) )
THEN
222 ELSE IF( m.LT.0 )
THEN
224 ELSE IF( n.LT.0 )
THEN
226 ELSE IF( nrhs.LT.0 )
THEN
228 ELSE IF( lda.LT.max( 1, m ) )
THEN
230 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN
238 IF( min( m, n, nrhs ).EQ.0 )
THEN
241 ELSE IF( m.GE.n )
THEN
242 CALL dgeqr( m, n, a, lda, tq, -1, workq, -1, info2 )
243 tszo = int( tq( 1 ) )
244 lwo = int( workq( 1 ) )
245 CALL dgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
246 $ tszo, b, ldb, workq, -1, info2 )
247 lwo = max( lwo, int( workq( 1 ) ) )
248 CALL dgeqr( m, n, a, lda, tq, -2, workq, -2, info2 )
249 tszm = int( tq( 1 ) )
250 lwm = int( workq( 1 ) )
251 CALL dgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
252 $ tszm, b, ldb, workq, -1, info2 )
253 lwm = max( lwm, int( workq( 1 ) ) )
257 CALL dgelq( m, n, a, lda, tq, -1, workq, -1, info2 )
258 tszo = int( tq( 1 ) )
259 lwo = int( workq( 1 ) )
260 CALL dgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
261 $ tszo, b, ldb, workq, -1, info2 )
262 lwo = max( lwo, int( workq( 1 ) ) )
263 CALL dgelq( m, n, a, lda, tq, -2, workq, -2, info2 )
264 tszm = int( tq( 1 ) )
265 lwm = int( workq( 1 ) )
266 CALL dgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
267 $ tszm, b, ldb, workq, -1, info2 )
268 lwm = max( lwm, int( workq( 1 ) ) )
273 IF( ( lwork.LT.wsizem ).AND.( .NOT.lquery ) )
THEN
277 work( 1 ) = dble( wsizeo )
282 CALL xerbla(
'DGETSLS', -info )
286 IF( lwork.EQ.-2 ) work( 1 ) = dble( wsizem )
289 IF( lwork.LT.wsizeo )
THEN
299 IF( min( m, n, nrhs ).EQ.0 )
THEN
300 CALL dlaset(
'FULL', max( m, n ), nrhs, zero, zero,
307 smlnum = dlamch(
'S' ) / dlamch(
'P' )
308 bignum = one / smlnum
312 anrm = dlange(
'M', m, n, a, lda, work )
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', maxmn, nrhs, zero, zero, b, ldb )
338 bnrm = dlange(
'M', brow, nrhs, b, ldb, work )
340 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
344 CALL dlascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
347 ELSE IF( bnrm.GT.bignum )
THEN
351 CALL dlascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
360 CALL dgeqr( m, n, a, lda, work( lw2+1 ), lw1,
361 $ work( 1 ), lw2, info )
362 IF ( .NOT.tran )
THEN
368 CALL dgemqr(
'L' ,
'T', m, nrhs, n, a, lda,
369 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
374 CALL dtrtrs(
'U',
'N',
'N', n, nrhs,
375 $ a, lda, b, ldb, info )
386 CALL dtrtrs(
'U',
'T',
'N', n, nrhs,
387 $ a, lda, b, ldb, info )
403 CALL dgemqr(
'L',
'N', m, nrhs, n, a, lda,
404 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
415 CALL dgelq( m, n, a, lda, work( lw2+1 ), lw1,
416 $ work( 1 ), lw2, info )
426 CALL dtrtrs(
'L',
'N',
'N', m, nrhs,
427 $ a, lda, b, ldb, info )
443 CALL dgemlq(
'L',
'T', n, nrhs, m, a, lda,
444 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
457 CALL dgemlq(
'L',
'N', n, nrhs, m, a, lda,
458 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
465 CALL dtrtrs(
'Lower',
'Transpose',
'Non-unit', m, nrhs,
466 $ a, lda, b, ldb, info )
480 IF( iascl.EQ.1 )
THEN
481 CALL dlascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
483 ELSE IF( iascl.EQ.2 )
THEN
484 CALL dlascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
487 IF( ibscl.EQ.1 )
THEN
488 CALL dlascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
490 ELSE IF( ibscl.EQ.2 )
THEN
491 CALL dlascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
496 work( 1 ) = dble( tszo + lwo )