160 SUBROUTINE sgetsls( TRANS, M, N, NRHS, A, LDA, B, LDB,
161 $ WORK, LWORK, INFO )
169 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
172 REAL A( LDA, * ), B( LDB, * ), WORK( * )
180 parameter( zero = 0.0e0, one = 1.0e0 )
184 INTEGER I, IASCL, IBSCL, J, MINMN, MAXMN, BROW,
185 $ scllen, mnk, tszo, tszm, lwo, lwm, lw1, lw2,
186 $ wsizeo, wsizem, info2
187 REAL ANRM, BIGNUM, BNRM, SMLNUM, TQ( 5 ), WORKQ( 1 )
193 EXTERNAL lsame, ilaenv,
slabad, slamch, slange
200 INTRINSIC real, 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 sgeqr( m, n, a, lda, tq, -1, workq, -1, info2 )
234 tszo = int( tq( 1 ) )
235 lwo = int( workq( 1 ) )
236 CALL sgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
237 $ tszo, b, ldb, workq, -1, info2 )
238 lwo = max( lwo, int( workq( 1 ) ) )
239 CALL sgeqr( m, n, a, lda, tq, -2, workq, -2, info2 )
240 tszm = int( tq( 1 ) )
241 lwm = int( workq( 1 ) )
242 CALL sgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
243 $ tszm, b, ldb, workq, -1, info2 )
244 lwm = max( lwm, int( workq( 1 ) ) )
248 CALL sgelq( m, n, a, lda, tq, -1, workq, -1, info2 )
249 tszo = int( tq( 1 ) )
250 lwo = int( workq( 1 ) )
251 CALL sgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
252 $ tszo, b, ldb, workq, -1, info2 )
253 lwo = max( lwo, int( workq( 1 ) ) )
254 CALL sgelq( m, n, a, lda, tq, -2, workq, -2, info2 )
255 tszm = int( tq( 1 ) )
256 lwm = int( workq( 1 ) )
257 CALL sgemlq(
'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(
'SGETSLS', -info )
272 work( 1 ) = real( 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 slaset(
'FULL', max( m, n ), nrhs, zero, zero,
298 smlnum = slamch(
'S' ) / slamch(
'P' )
299 bignum = one / smlnum
300 CALL slabad( smlnum, bignum )
304 anrm = slange(
'M', m, n, a, lda, work )
306 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
310 CALL slascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
312 ELSE IF( anrm.GT.bignum )
THEN
316 CALL slascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
318 ELSE IF( anrm.EQ.zero )
THEN
322 CALL slaset(
'F', maxmn, nrhs, zero, zero, b, ldb )
330 bnrm = slange(
'M', brow, nrhs, b, ldb, work )
332 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
336 CALL slascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
339 ELSE IF( bnrm.GT.bignum )
THEN
343 CALL slascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
352 CALL sgeqr( m, n, a, lda, work( lw2+1 ), lw1,
353 $ work( 1 ), lw2, info )
354 IF ( .NOT.tran )
THEN
360 CALL sgemqr(
'L' ,
'T', m, nrhs, n, a, lda,
361 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
366 CALL strtrs(
'U',
'N',
'N', n, nrhs,
367 $ a, lda, b, ldb, info )
378 CALL strtrs(
'U',
'T',
'N', n, nrhs,
379 $ a, lda, b, ldb, info )
395 CALL sgemqr(
'L',
'N', m, nrhs, n, a, lda,
396 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
407 CALL sgelq( m, n, a, lda, work( lw2+1 ), lw1,
408 $ work( 1 ), lw2, info )
418 CALL strtrs(
'L',
'N',
'N', m, nrhs,
419 $ a, lda, b, ldb, info )
435 CALL sgemlq(
'L',
'T', n, nrhs, m, a, lda,
436 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
449 CALL sgemlq(
'L',
'N', n, nrhs, m, a, lda,
450 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
457 CALL strtrs(
'Lower',
'Transpose',
'Non-unit', m, nrhs,
458 $ a, lda, b, ldb, info )
472 IF( iascl.EQ.1 )
THEN
473 CALL slascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
475 ELSE IF( iascl.EQ.2 )
THEN
476 CALL slascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
479 IF( ibscl.EQ.1 )
THEN
480 CALL slascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
482 ELSE IF( ibscl.EQ.2 )
THEN
483 CALL slascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
488 work( 1 ) = real( tszo + lwo )
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine slascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sgetsls(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
SGETSLS
subroutine strtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
STRTRS
subroutine sgelq(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
SGELQ
subroutine sgemlq(SIDE, TRANS, M, N, K, A, LDA, T, TSIZE, C, LDC, WORK, LWORK, INFO)
SGEMLQ
subroutine sgemqr(SIDE, TRANS, M, N, K, A, LDA, T, TSIZE, C, LDC, WORK, LWORK, INFO)
SGEMQR
subroutine sgeqr(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
SGEQR