169 SUBROUTINE cgetsls( TRANS, M, N, NRHS, A, LDA, B, LDB,
170 $ WORK, LWORK, INFO )
178 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
181 COMPLEX A( LDA, * ), B( LDB, * ), WORK( * )
189 parameter( zero = 0.0e0, one = 1.0e0 )
191 parameter( czero = ( 0.0e+0, 0.0e+0 ) )
195 INTEGER I, IASCL, IBSCL, J, MAXMN, BROW,
196 $ scllen, tszo, tszm, lwo, lwm, lw1, lw2,
197 $ wsizeo, wsizem, info2
198 REAL ANRM, BIGNUM, BNRM, SMLNUM, DUM( 1 )
199 COMPLEX TQ( 5 ), WORKQ( 1 )
203 REAL SLAMCH, CLANGE, SROUNDUP_LWORK
204 EXTERNAL lsame, slamch, clange,
212 INTRINSIC max, min, int
220 tran = lsame( trans,
'C' )
222 lquery = ( lwork.EQ.-1 .OR. lwork.EQ.-2 )
223 IF( .NOT.( lsame( trans,
'N' ) .OR.
224 $ lsame( trans,
'C' ) ) )
THEN
226 ELSE IF( m.LT.0 )
THEN
228 ELSE IF( n.LT.0 )
THEN
230 ELSE IF( nrhs.LT.0 )
THEN
232 ELSE IF( lda.LT.max( 1, m ) )
THEN
234 ELSE IF( ldb.LT.max( 1, m, n ) )
THEN
242 IF( min( m, n, nrhs ).EQ.0 )
THEN
245 ELSE IF ( m.GE.n )
THEN
246 CALL cgeqr( m, n, a, lda, tq, -1, workq, -1, info2 )
247 tszo = int( tq( 1 ) )
248 lwo = int( workq( 1 ) )
249 CALL cgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
250 $ tszo, b, ldb, workq, -1, info2 )
251 lwo = max( lwo, int( workq( 1 ) ) )
252 CALL cgeqr( m, n, a, lda, tq, -2, workq, -2, info2 )
253 tszm = int( tq( 1 ) )
254 lwm = int( workq( 1 ) )
255 CALL cgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
256 $ tszm, b, ldb, workq, -1, info2 )
257 lwm = max( lwm, int( workq( 1 ) ) )
261 CALL cgelq( m, n, a, lda, tq, -1, workq, -1, info2 )
262 tszo = int( tq( 1 ) )
263 lwo = int( workq( 1 ) )
264 CALL cgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
265 $ tszo, b, ldb, workq, -1, info2 )
266 lwo = max( lwo, int( workq( 1 ) ) )
267 CALL cgelq( m, n, a, lda, tq, -2, workq, -2, info2 )
268 tszm = int( tq( 1 ) )
269 lwm = int( workq( 1 ) )
270 CALL cgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
271 $ tszm, b, ldb, workq, -1, info2 )
272 lwm = max( lwm, int( workq( 1 ) ) )
277 IF( ( lwork.LT.wsizem ).AND.( .NOT.lquery ) )
THEN
281 work( 1 ) = sroundup_lwork( wsizeo )
286 CALL xerbla(
'CGETSLS', -info )
290 IF( lwork.EQ.-2 ) work( 1 ) = sroundup_lwork( wsizem )
293 IF( lwork.LT.wsizeo )
THEN
303 IF( min( m, n, nrhs ).EQ.0 )
THEN
304 CALL claset(
'FULL', max( m, n ), nrhs, czero, czero,
311 smlnum = slamch(
'S' ) / slamch(
'P' )
312 bignum = one / smlnum
316 anrm = clange(
'M', m, n, a, lda, dum )
318 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
322 CALL clascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
324 ELSE IF( anrm.GT.bignum )
THEN
328 CALL clascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
330 ELSE IF( anrm.EQ.zero )
THEN
334 CALL claset(
'F', maxmn, nrhs, czero, czero, b, ldb )
342 bnrm = clange(
'M', brow, nrhs, b, ldb, dum )
344 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
348 CALL clascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
351 ELSE IF( bnrm.GT.bignum )
THEN
355 CALL clascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
364 CALL cgeqr( m, n, a, lda, work( lw2+1 ), lw1,
365 $ work( 1 ), lw2, info )
366 IF ( .NOT.tran )
THEN
372 CALL cgemqr(
'L' ,
'C', m, nrhs, n, a, lda,
373 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
378 CALL ctrtrs(
'U',
'N',
'N', n, nrhs,
379 $ a, lda, b, ldb, info )
390 CALL ctrtrs(
'U',
'C',
'N', n, nrhs,
391 $ a, lda, b, ldb, info )
407 CALL cgemqr(
'L',
'N', m, nrhs, n, a, lda,
408 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
419 CALL cgelq( m, n, a, lda, work( lw2+1 ), lw1,
420 $ work( 1 ), lw2, info )
430 CALL ctrtrs(
'L',
'N',
'N', m, nrhs,
431 $ a, lda, b, ldb, info )
447 CALL cgemlq(
'L',
'C', n, nrhs, m, a, lda,
448 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
461 CALL cgemlq(
'L',
'N', n, nrhs, m, a, lda,
462 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
469 CALL ctrtrs(
'L',
'C',
'N', m, nrhs,
470 $ a, lda, b, ldb, info )
484 IF( iascl.EQ.1 )
THEN
485 CALL clascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
487 ELSE IF( iascl.EQ.2 )
THEN
488 CALL clascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
491 IF( ibscl.EQ.1 )
THEN
492 CALL clascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
494 ELSE IF( ibscl.EQ.2 )
THEN
495 CALL clascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
500 work( 1 ) = sroundup_lwork( tszo + lwo )