162 SUBROUTINE sgetsls( TRANS, M, N, NRHS, A, LDA, B, LDB,
163 $ WORK, LWORK, INFO )
172 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
175 REAL A( LDA, * ), B( LDB, * ), WORK( * )
183 parameter( zero = 0.0e0, one = 1.0e0 )
187 INTEGER I, IASCL, IBSCL, J, MINMN, MAXMN, BROW,
188 $ scllen, mnk, tszo, tszm, lwo, lwm, lw1, lw2,
189 $ wsizeo, wsizem, info2
190 REAL ANRM, BIGNUM, BNRM, SMLNUM, TQ( 5 ), WORKQ( 1 )
196 EXTERNAL lsame, ilaenv,
slabad, slamch, slange
203 INTRINSIC real, max, min, int
212 mnk = max( minmn, nrhs )
213 tran = lsame( trans,
'T' )
215 lquery = ( lwork.EQ.-1 .OR. lwork.EQ.-2 )
216 IF( .NOT.( lsame( trans,
'N' ) .OR.
217 $ lsame( trans,
'T' ) ) )
THEN
219 ELSE IF( m.LT.0 )
THEN
221 ELSE IF( n.LT.0 )
THEN
223 ELSE IF( nrhs.LT.0 )
THEN
225 ELSE IF( lda.LT.max( 1, m ) )
THEN
227 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN
236 CALL sgeqr( m, n, a, lda, tq, -1, workq, -1, info2 )
237 tszo = int( tq( 1 ) )
238 lwo = int( workq( 1 ) )
239 CALL sgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
240 $ tszo, b, ldb, workq, -1, info2 )
241 lwo = max( lwo, int( workq( 1 ) ) )
242 CALL sgeqr( m, n, a, lda, tq, -2, workq, -2, info2 )
243 tszm = int( tq( 1 ) )
244 lwm = int( workq( 1 ) )
245 CALL sgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
246 $ tszm, b, ldb, workq, -1, info2 )
247 lwm = max( lwm, int( workq( 1 ) ) )
251 CALL sgelq( m, n, a, lda, tq, -1, workq, -1, info2 )
252 tszo = int( tq( 1 ) )
253 lwo = int( workq( 1 ) )
254 CALL sgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
255 $ tszo, b, ldb, workq, -1, info2 )
256 lwo = max( lwo, int( workq( 1 ) ) )
257 CALL sgelq( m, n, a, lda, tq, -2, workq, -2, info2 )
258 tszm = int( tq( 1 ) )
259 lwm = int( workq( 1 ) )
260 CALL sgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
261 $ tszo, b, ldb, workq, -1, info2 )
262 lwm = max( lwm, int( workq( 1 ) ) )
267 IF( ( lwork.LT.wsizem ).AND.( .NOT.lquery ) )
THEN
274 CALL xerbla(
'SGETSLS', -info )
275 work( 1 ) = real( wsizeo )
279 IF( lwork.EQ.-1 ) work( 1 ) = real( wsizeo )
280 IF( lwork.EQ.-2 ) work( 1 ) = real( wsizem )
283 IF( lwork.LT.wsizeo )
THEN
293 IF( min( m, n, nrhs ).EQ.0 )
THEN
294 CALL slaset(
'FULL', max( m, n ), nrhs, zero, zero,
301 smlnum = slamch(
'S' ) / slamch(
'P' )
302 bignum = one / smlnum
303 CALL slabad( smlnum, bignum )
307 anrm = slange(
'M', m, n, a, lda, work )
309 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
313 CALL slascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
315 ELSE IF( anrm.GT.bignum )
THEN
319 CALL slascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
321 ELSE IF( anrm.EQ.zero )
THEN
325 CALL slaset(
'F', maxmn, nrhs, zero, zero, b, ldb )
333 bnrm = slange(
'M', brow, nrhs, b, ldb, work )
335 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
339 CALL slascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
342 ELSE IF( bnrm.GT.bignum )
THEN
346 CALL slascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
355 CALL sgeqr( m, n, a, lda, work( lw2+1 ), lw1,
356 $ work( 1 ), lw2, info )
357 IF ( .NOT.tran )
THEN
363 CALL sgemqr(
'L' ,
'T', m, nrhs, n, a, lda,
364 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
369 CALL strtrs(
'U',
'N',
'N', n, nrhs,
370 $ a, lda, b, ldb, info )
381 CALL strtrs(
'U',
'T',
'N', n, nrhs,
382 $ a, lda, b, ldb, info )
398 CALL sgemqr(
'L',
'N', m, nrhs, n, a, lda,
399 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
410 CALL sgelq( m, n, a, lda, work( lw2+1 ), lw1,
411 $ work( 1 ), lw2, info )
421 CALL strtrs(
'L',
'N',
'N', m, nrhs,
422 $ a, lda, b, ldb, info )
438 CALL sgemlq(
'L',
'T', n, nrhs, m, a, lda,
439 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
452 CALL sgemlq(
'L',
'N', n, nrhs, m, a, lda,
453 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
460 CALL strtrs(
'Lower',
'Transpose',
'Non-unit', m, nrhs,
461 $ a, lda, b, ldb, info )
475 IF( iascl.EQ.1 )
THEN
476 CALL slascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
478 ELSE IF( iascl.EQ.2 )
THEN
479 CALL slascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
482 IF( ibscl.EQ.1 )
THEN
483 CALL slascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
485 ELSE IF( ibscl.EQ.2 )
THEN
486 CALL slascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
491 work( 1 ) = real( tszo + lwo )