160 SUBROUTINE cgetsls( TRANS, M, N, NRHS, A, LDA, B, LDB,
161 $ WORK, LWORK, INFO )
169 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
172 COMPLEX A( LDA, * ), B( LDB, * ), WORK( * )
180 parameter( zero = 0.0e0, one = 1.0e0 )
182 parameter( czero = ( 0.0e+0, 0.0e+0 ) )
186 INTEGER I, IASCL, IBSCL, J, MINMN, MAXMN, BROW,
187 $ scllen, mnk, tszo, tszm, lwo, lwm, lw1, lw2,
188 $ wsizeo, wsizem, info2
189 REAL ANRM, BIGNUM, BNRM, SMLNUM, DUM( 1 )
190 COMPLEX TQ( 5 ), WORKQ( 1 )
196 EXTERNAL lsame, ilaenv,
slabad, slamch, clange
203 INTRINSIC real, max, min, int
212 mnk = max( minmn, nrhs )
213 tran = lsame( trans,
'C' )
215 lquery = ( lwork.EQ.-1 .OR. lwork.EQ.-2 )
216 IF( .NOT.( lsame( trans,
'N' ) .OR.
217 $ lsame( trans,
'C' ) ) )
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 cgeqr( m, n, a, lda, tq, -1, workq, -1, info2 )
237 tszo = int( tq( 1 ) )
238 lwo = int( workq( 1 ) )
239 CALL cgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
240 $ tszo, b, ldb, workq, -1, info2 )
241 lwo = max( lwo, int( workq( 1 ) ) )
242 CALL cgeqr( m, n, a, lda, tq, -2, workq, -2, info2 )
243 tszm = int( tq( 1 ) )
244 lwm = int( workq( 1 ) )
245 CALL cgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
246 $ tszm, b, ldb, workq, -1, info2 )
247 lwm = max( lwm, int( workq( 1 ) ) )
251 CALL cgelq( m, n, a, lda, tq, -1, workq, -1, info2 )
252 tszo = int( tq( 1 ) )
253 lwo = int( workq( 1 ) )
254 CALL cgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
255 $ tszo, b, ldb, workq, -1, info2 )
256 lwo = max( lwo, int( workq( 1 ) ) )
257 CALL cgelq( m, n, a, lda, tq, -2, workq, -2, info2 )
258 tszm = int( tq( 1 ) )
259 lwm = int( workq( 1 ) )
260 CALL cgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
261 $ tszm, b, ldb, workq, -1, info2 )
262 lwm = max( lwm, int( workq( 1 ) ) )
267 IF( ( lwork.LT.wsizem ).AND.( .NOT.lquery ) )
THEN
274 CALL xerbla(
'CGETSLS', -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 claset(
'FULL', max( m, n ), nrhs, czero, czero,
301 smlnum = slamch(
'S' ) / slamch(
'P' )
302 bignum = one / smlnum
303 CALL slabad( smlnum, bignum )
307 anrm = clange(
'M', m, n, a, lda, dum )
309 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
313 CALL clascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
315 ELSE IF( anrm.GT.bignum )
THEN
319 CALL clascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
321 ELSE IF( anrm.EQ.zero )
THEN
325 CALL claset(
'F', maxmn, nrhs, czero, czero, b, ldb )
333 bnrm = clange(
'M', brow, nrhs, b, ldb, dum )
335 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
339 CALL clascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
342 ELSE IF( bnrm.GT.bignum )
THEN
346 CALL clascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
355 CALL cgeqr( m, n, a, lda, work( lw2+1 ), lw1,
356 $ work( 1 ), lw2, info )
357 IF ( .NOT.tran )
THEN
363 CALL cgemqr(
'L' ,
'C', m, nrhs, n, a, lda,
364 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
369 CALL ctrtrs(
'U',
'N',
'N', n, nrhs,
370 $ a, lda, b, ldb, info )
381 CALL ctrtrs(
'U',
'C',
'N', n, nrhs,
382 $ a, lda, b, ldb, info )
398 CALL cgemqr(
'L',
'N', m, nrhs, n, a, lda,
399 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
410 CALL cgelq( m, n, a, lda, work( lw2+1 ), lw1,
411 $ work( 1 ), lw2, info )
421 CALL ctrtrs(
'L',
'N',
'N', m, nrhs,
422 $ a, lda, b, ldb, info )
438 CALL cgemlq(
'L',
'C', n, nrhs, m, a, lda,
439 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
452 CALL cgemlq(
'L',
'N', n, nrhs, m, a, lda,
453 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
460 CALL ctrtrs(
'L',
'C',
'N', m, nrhs,
461 $ a, lda, b, ldb, info )
475 IF( iascl.EQ.1 )
THEN
476 CALL clascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
478 ELSE IF( iascl.EQ.2 )
THEN
479 CALL clascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
482 IF( ibscl.EQ.1 )
THEN
483 CALL clascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
485 ELSE IF( ibscl.EQ.2 )
THEN
486 CALL clascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
491 work( 1 ) = real( tszo + lwo )
subroutine cgelq(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
CGELQ
subroutine cgemlq(SIDE, TRANS, M, N, K, A, LDA, T, TSIZE, C, LDC, WORK, LWORK, INFO)
CGEMLQ
subroutine cgemqr(SIDE, TRANS, M, N, K, A, LDA, T, TSIZE, C, LDC, WORK, LWORK, INFO)
CGEMQR
subroutine cgeqr(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
CGEQR
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine cgetsls(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
CGETSLS
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine clascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
CLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine ctrtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
CTRTRS