162 SUBROUTINE cgetsls( TRANS, M, N, NRHS, A, LDA, B, LDB,
163 $ WORK, LWORK, INFO )
172 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
175 COMPLEX A( LDA, * ), B( LDB, * ), WORK( * )
183 parameter( zero = 0.0e0, one = 1.0e0 )
185 parameter( czero = ( 0.0e+0, 0.0e+0 ) )
189 INTEGER I, IASCL, IBSCL, J, MINMN, MAXMN, BROW,
190 $ scllen, mnk, tszo, tszm, lwo, lwm, lw1, lw2,
191 $ wsizeo, wsizem, info2
192 REAL ANRM, BIGNUM, BNRM, SMLNUM, DUM( 1 )
193 COMPLEX TQ( 5 ), WORKQ( 1 )
199 EXTERNAL lsame, ilaenv,
slabad, slamch, clange
206 INTRINSIC real, max, min, int
215 mnk = max( minmn, nrhs )
216 tran = lsame( trans,
'C' )
218 lquery = ( lwork.EQ.-1 .OR. lwork.EQ.-2 )
219 IF( .NOT.( lsame( trans,
'N' ) .OR.
220 $ lsame( trans,
'C' ) ) )
THEN
222 ELSE IF( m.LT.0 )
THEN
224 ELSE IF( n.LT.0 )
THEN
226 ELSE IF( nrhs.LT.0 )
THEN
228 ELSE IF( lda.LT.max( 1, m ) )
THEN
230 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN
239 CALL cgeqr( m, n, a, lda, tq, -1, workq, -1, info2 )
240 tszo = int( tq( 1 ) )
241 lwo = int( workq( 1 ) )
242 CALL cgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
243 $ tszo, b, ldb, workq, -1, info2 )
244 lwo = max( lwo, int( workq( 1 ) ) )
245 CALL cgeqr( m, n, a, lda, tq, -2, workq, -2, info2 )
246 tszm = int( tq( 1 ) )
247 lwm = int( workq( 1 ) )
248 CALL cgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
249 $ tszm, b, ldb, workq, -1, info2 )
250 lwm = max( lwm, int( workq( 1 ) ) )
254 CALL cgelq( m, n, a, lda, tq, -1, workq, -1, info2 )
255 tszo = int( tq( 1 ) )
256 lwo = int( workq( 1 ) )
257 CALL cgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
258 $ tszo, b, ldb, workq, -1, info2 )
259 lwo = max( lwo, int( workq( 1 ) ) )
260 CALL cgelq( m, n, a, lda, tq, -2, workq, -2, info2 )
261 tszm = int( tq( 1 ) )
262 lwm = int( workq( 1 ) )
263 CALL cgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
264 $ tszo, b, ldb, workq, -1, info2 )
265 lwm = max( lwm, int( workq( 1 ) ) )
270 IF( ( lwork.LT.wsizem ).AND.( .NOT.lquery ) )
THEN
277 CALL xerbla(
'CGETSLS', -info )
278 work( 1 ) = real( wsizeo )
282 IF( lwork.EQ.-1 ) work( 1 ) = real( wsizeo )
283 IF( lwork.EQ.-2 ) work( 1 ) = real( wsizem )
286 IF( lwork.LT.wsizeo )
THEN
296 IF( min( m, n, nrhs ).EQ.0 )
THEN
297 CALL claset(
'FULL', max( m, n ), nrhs, czero, czero,
304 smlnum = slamch(
'S' ) / slamch(
'P' )
305 bignum = one / smlnum
306 CALL slabad( smlnum, bignum )
310 anrm = clange(
'M', m, n, a, lda, dum )
312 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
316 CALL clascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
318 ELSE IF( anrm.GT.bignum )
THEN
322 CALL clascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
324 ELSE IF( anrm.EQ.zero )
THEN
328 CALL claset(
'F', maxmn, nrhs, czero, czero, b, ldb )
336 bnrm = clange(
'M', brow, nrhs, b, ldb, dum )
338 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
342 CALL clascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
345 ELSE IF( bnrm.GT.bignum )
THEN
349 CALL clascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
358 CALL cgeqr( m, n, a, lda, work( lw2+1 ), lw1,
359 $ work( 1 ), lw2, info )
360 IF ( .NOT.tran )
THEN
366 CALL cgemqr(
'L' ,
'C', m, nrhs, n, a, lda,
367 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
372 CALL ctrtrs(
'U',
'N',
'N', n, nrhs,
373 $ a, lda, b, ldb, info )
384 CALL ctrtrs(
'U',
'C',
'N', n, nrhs,
385 $ a, lda, b, ldb, info )
401 CALL cgemqr(
'L',
'N', m, nrhs, n, a, lda,
402 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
413 CALL cgelq( m, n, a, lda, work( lw2+1 ), lw1,
414 $ work( 1 ), lw2, info )
424 CALL ctrtrs(
'L',
'N',
'N', m, nrhs,
425 $ a, lda, b, ldb, info )
441 CALL cgemlq(
'L',
'C', n, nrhs, m, a, lda,
442 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
455 CALL cgemlq(
'L',
'N', n, nrhs, m, a, lda,
456 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
463 CALL ctrtrs(
'L',
'C',
'N', m, nrhs,
464 $ a, lda, b, ldb, info )
478 IF( iascl.EQ.1 )
THEN
479 CALL clascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
481 ELSE IF( iascl.EQ.2 )
THEN
482 CALL clascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
485 IF( ibscl.EQ.1 )
THEN
486 CALL clascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
488 ELSE IF( ibscl.EQ.2 )
THEN
489 CALL clascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
494 work( 1 ) = real( tszo + lwo )