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, MAXMN, BROW,
185 $ scllen, tszo, tszm, lwo, lwm, lw1, lw2,
186 $ wsizeo, wsizem, info2
187 REAL ANRM, BIGNUM, BNRM, SMLNUM, TQ( 5 ), WORKQ( 1 )
192 EXTERNAL lsame,
slabad, slamch, slange
199 INTRINSIC REAL, MAX, MIN, INT
207 tran = lsame( trans,
'T' )
209 lquery = ( lwork.EQ.-1 .OR. lwork.EQ.-2 )
210 IF( .NOT.( lsame( trans,
'N' ) .OR.
211 $ lsame( trans,
'T' ) ) )
THEN 213 ELSE IF( m.LT.0 )
THEN 215 ELSE IF( n.LT.0 )
THEN 217 ELSE IF( nrhs.LT.0 )
THEN 219 ELSE IF( lda.LT.max( 1, m ) )
THEN 221 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN 230 CALL sgeqr( m, n, a, lda, tq, -1, workq, -1, info2 )
231 tszo = int( tq( 1 ) )
232 lwo = int( workq( 1 ) )
233 CALL sgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
234 $ tszo, b, ldb, workq, -1, info2 )
235 lwo = max( lwo, int( workq( 1 ) ) )
236 CALL sgeqr( m, n, a, lda, tq, -2, workq, -2, info2 )
237 tszm = int( tq( 1 ) )
238 lwm = int( workq( 1 ) )
239 CALL sgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
240 $ tszm, b, ldb, workq, -1, info2 )
241 lwm = max( lwm, int( workq( 1 ) ) )
245 CALL sgelq( m, n, a, lda, tq, -1, workq, -1, info2 )
246 tszo = int( tq( 1 ) )
247 lwo = int( workq( 1 ) )
248 CALL sgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
249 $ tszo, b, ldb, workq, -1, info2 )
250 lwo = max( lwo, int( workq( 1 ) ) )
251 CALL sgelq( m, n, a, lda, tq, -2, workq, -2, info2 )
252 tszm = int( tq( 1 ) )
253 lwm = int( workq( 1 ) )
254 CALL sgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
255 $ tszm, b, ldb, workq, -1, info2 )
256 lwm = max( lwm, int( workq( 1 ) ) )
261 IF( ( lwork.LT.wsizem ).AND.( .NOT.lquery ) )
THEN 265 work( 1 ) =
REAL( wsizeo )
270 CALL xerbla(
'SGETSLS', -info )
274 IF( lwork.EQ.-2 ) work( 1 ) =
REAL( wsizem )
277 IF( lwork.LT.wsizeo )
THEN 287 IF( min( m, n, nrhs ).EQ.0 )
THEN 288 CALL slaset(
'FULL', max( m, n ), nrhs, zero, zero,
295 smlnum = slamch(
'S' ) / slamch(
'P' )
296 bignum = one / smlnum
297 CALL slabad( smlnum, bignum )
301 anrm = slange(
'M', m, n, a, lda, work )
303 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN 307 CALL slascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
309 ELSE IF( anrm.GT.bignum )
THEN 313 CALL slascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
315 ELSE IF( anrm.EQ.zero )
THEN 319 CALL slaset(
'F', maxmn, nrhs, zero, zero, b, ldb )
327 bnrm = slange(
'M', brow, nrhs, b, ldb, work )
329 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN 333 CALL slascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
336 ELSE IF( bnrm.GT.bignum )
THEN 340 CALL slascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
349 CALL sgeqr( m, n, a, lda, work( lw2+1 ), lw1,
350 $ work( 1 ), lw2, info )
351 IF ( .NOT.tran )
THEN 357 CALL sgemqr(
'L' ,
'T', m, nrhs, n, a, lda,
358 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
363 CALL strtrs(
'U',
'N',
'N', n, nrhs,
364 $ a, lda, b, ldb, info )
375 CALL strtrs(
'U',
'T',
'N', n, nrhs,
376 $ a, lda, b, ldb, info )
392 CALL sgemqr(
'L',
'N', m, nrhs, n, a, lda,
393 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
404 CALL sgelq( m, n, a, lda, work( lw2+1 ), lw1,
405 $ work( 1 ), lw2, info )
415 CALL strtrs(
'L',
'N',
'N', m, nrhs,
416 $ a, lda, b, ldb, info )
432 CALL sgemlq(
'L',
'T', n, nrhs, m, a, lda,
433 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
446 CALL sgemlq(
'L',
'N', n, nrhs, m, a, lda,
447 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
454 CALL strtrs(
'Lower',
'Transpose',
'Non-unit', m, nrhs,
455 $ a, lda, b, ldb, info )
469 IF( iascl.EQ.1 )
THEN 470 CALL slascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
472 ELSE IF( iascl.EQ.2 )
THEN 473 CALL slascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
476 IF( ibscl.EQ.1 )
THEN 477 CALL slascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
479 ELSE IF( ibscl.EQ.2 )
THEN 480 CALL slascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
485 work( 1 ) =
REAL( tszo + lwo )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sgeqr(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
SGEQR
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 slabad(SMALL, LARGE)
SLABAD
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 strtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
STRTRS
subroutine sgetsls(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
SGETSLS
subroutine sgelq(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
SGELQ