169 SUBROUTINE sgetsls( TRANS, M, N, NRHS, A, LDA, B, LDB,
170 $ WORK, LWORK, INFO )
178 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
181 REAL A( LDA, * ), B( LDB, * ), WORK( * )
189 parameter( zero = 0.0e0, one = 1.0e0 )
193 INTEGER I, IASCL, IBSCL, J, MAXMN, BROW,
194 $ scllen, tszo, tszm, lwo, lwm, lw1, lw2,
195 $ wsizeo, wsizem, info2
196 REAL ANRM, BIGNUM, BNRM, SMLNUM, TQ( 5 ), WORKQ( 1 )
200 REAL SLAMCH, SLANGE, SROUNDUP_LWORK
201 EXTERNAL lsame, slamch, slange,
209 INTRINSIC max, min, int
217 tran = lsame( trans,
'T' )
219 lquery = ( lwork.EQ.-1 .OR. lwork.EQ.-2 )
220 IF( .NOT.( lsame( trans,
'N' ) .OR.
221 $ lsame( trans,
'T' ) ) )
THEN
223 ELSE IF( m.LT.0 )
THEN
225 ELSE IF( n.LT.0 )
THEN
227 ELSE IF( nrhs.LT.0 )
THEN
229 ELSE IF( lda.LT.max( 1, m ) )
THEN
231 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN
239 IF( min( m, n, nrhs ).EQ.0 )
THEN
242 ELSE IF( m.GE.n )
THEN
243 CALL sgeqr( m, n, a, lda, tq, -1, workq, -1, info2 )
244 tszo = int( tq( 1 ) )
245 lwo = int( workq( 1 ) )
246 CALL sgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
247 $ tszo, b, ldb, workq, -1, info2 )
248 lwo = max( lwo, int( workq( 1 ) ) )
249 CALL sgeqr( m, n, a, lda, tq, -2, workq, -2, info2 )
250 tszm = int( tq( 1 ) )
251 lwm = int( workq( 1 ) )
252 CALL sgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
253 $ tszm, b, ldb, workq, -1, info2 )
254 lwm = max( lwm, int( workq( 1 ) ) )
258 CALL sgelq( m, n, a, lda, tq, -1, workq, -1, info2 )
259 tszo = int( tq( 1 ) )
260 lwo = int( workq( 1 ) )
261 CALL sgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
262 $ tszo, b, ldb, workq, -1, info2 )
263 lwo = max( lwo, int( workq( 1 ) ) )
264 CALL sgelq( m, n, a, lda, tq, -2, workq, -2, info2 )
265 tszm = int( tq( 1 ) )
266 lwm = int( workq( 1 ) )
267 CALL sgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
268 $ tszm, b, ldb, workq, -1, info2 )
269 lwm = max( lwm, int( workq( 1 ) ) )
274 IF( ( lwork.LT.wsizem ).AND.( .NOT.lquery ) )
THEN
278 work( 1 ) = sroundup_lwork( wsizeo )
283 CALL xerbla(
'SGETSLS', -info )
287 IF( lwork.EQ.-2 ) work( 1 ) = sroundup_lwork( wsizem )
290 IF( lwork.LT.wsizeo )
THEN
300 IF( min( m, n, nrhs ).EQ.0 )
THEN
301 CALL slaset(
'FULL', max( m, n ), nrhs, zero, zero,
308 smlnum = slamch(
'S' ) / slamch(
'P' )
309 bignum = one / smlnum
313 anrm = slange(
'M', m, n, a, lda, work )
315 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
319 CALL slascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
321 ELSE IF( anrm.GT.bignum )
THEN
325 CALL slascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
327 ELSE IF( anrm.EQ.zero )
THEN
331 CALL slaset(
'F', maxmn, nrhs, zero, zero, b, ldb )
339 bnrm = slange(
'M', brow, nrhs, b, ldb, work )
341 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
345 CALL slascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
348 ELSE IF( bnrm.GT.bignum )
THEN
352 CALL slascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
361 CALL sgeqr( m, n, a, lda, work( lw2+1 ), lw1,
362 $ work( 1 ), lw2, info )
363 IF ( .NOT.tran )
THEN
369 CALL sgemqr(
'L' ,
'T', m, nrhs, n, a, lda,
370 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
375 CALL strtrs(
'U',
'N',
'N', n, nrhs,
376 $ a, lda, b, ldb, info )
387 CALL strtrs(
'U',
'T',
'N', n, nrhs,
388 $ a, lda, b, ldb, info )
404 CALL sgemqr(
'L',
'N', m, nrhs, n, a, lda,
405 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
416 CALL sgelq( m, n, a, lda, work( lw2+1 ), lw1,
417 $ work( 1 ), lw2, info )
427 CALL strtrs(
'L',
'N',
'N', m, nrhs,
428 $ a, lda, b, ldb, info )
444 CALL sgemlq(
'L',
'T', n, nrhs, m, a, lda,
445 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
458 CALL sgemlq(
'L',
'N', n, nrhs, m, a, lda,
459 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
466 CALL strtrs(
'Lower',
'Transpose',
'Non-unit', m, nrhs,
467 $ a, lda, b, ldb, info )
481 IF( iascl.EQ.1 )
THEN
482 CALL slascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
484 ELSE IF( iascl.EQ.2 )
THEN
485 CALL slascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
488 IF( ibscl.EQ.1 )
THEN
489 CALL slascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
491 ELSE IF( ibscl.EQ.2 )
THEN
492 CALL slascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
497 work( 1 ) = sroundup_lwork( tszo + lwo )