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
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
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 ) )
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 ) ) )
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
', M, NRHS,
455 $ A, LDA, B, LDB, INFO )
469.EQ.
IF( IASCL1 ) THEN
470 CALL SLASCL( 'g
', 0, 0, ANRM, SMLNUM, SCLLEN, NRHS, B, LDB,
472.EQ.
ELSE IF( IASCL2 ) THEN
473 CALL SLASCL( 'g
', 0, 0, ANRM, BIGNUM, SCLLEN, NRHS, B, LDB,
476.EQ.
IF( IBSCL1 ) THEN
477 CALL SLASCL( 'g
', 0, 0, SMLNUM, BNRM, SCLLEN, NRHS, B, LDB,
479.EQ.
ELSE IF( IBSCL2 ) THEN
480 CALL SLASCL( 'g
', 0, 0, BIGNUM, BNRM, SCLLEN, NRHS, B, LDB,
485 WORK( 1 ) = REAL( TSZO + LWO )