160 SUBROUTINE zgetsls( TRANS, M, N, NRHS, A, LDA, B, LDB,
161 $ WORK, LWORK, INFO )
169 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS
172 COMPLEX*16 A( LDA, * ), B( LDB, * ), WORK( * )
179 DOUBLE PRECISION ZERO, ONE
180 parameter( zero = 0.0d0, one = 1.0d0 )
182 parameter( czero = ( 0.0d+0, 0.0d+0 ) )
186 INTEGER I, IASCL, IBSCL, J, MINMN, MAXMN, BROW,
187 $ scllen, mnk, tszo, tszm, lwo, lwm, lw1, lw2,
188 $ wsizeo, wsizem, info2
189 DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM, DUM( 1 )
190 COMPLEX*16 TQ( 5 ), WORKQ( 1 )
195 DOUBLE PRECISION DLAMCH, ZLANGE
196 EXTERNAL lsame, ilaenv,
dlabad, dlamch, zlange
203 INTRINSIC dble, 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 zgeqr( m, n, a, lda, tq, -1, workq, -1, info2 )
237 tszo = int( tq( 1 ) )
238 lwo = int( workq( 1 ) )
239 CALL zgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
240 $ tszo, b, ldb, workq, -1, info2 )
241 lwo = max( lwo, int( workq( 1 ) ) )
242 CALL zgeqr( m, n, a, lda, tq, -2, workq, -2, info2 )
243 tszm = int( tq( 1 ) )
244 lwm = int( workq( 1 ) )
245 CALL zgemqr(
'L', trans, m, nrhs, n, a, lda, tq,
246 $ tszm, b, ldb, workq, -1, info2 )
247 lwm = max( lwm, int( workq( 1 ) ) )
251 CALL zgelq( m, n, a, lda, tq, -1, workq, -1, info2 )
252 tszo = int( tq( 1 ) )
253 lwo = int( workq( 1 ) )
254 CALL zgemlq(
'L', trans, n, nrhs, m, a, lda, tq,
255 $ tszo, b, ldb, workq, -1, info2 )
256 lwo = max( lwo, int( workq( 1 ) ) )
257 CALL zgelq( m, n, a, lda, tq, -2, workq, -2, info2 )
258 tszm = int( tq( 1 ) )
259 lwm = int( workq( 1 ) )
260 CALL zgemlq(
'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(
'ZGETSLS', -info )
275 work( 1 ) = dble( 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 zlaset(
'FULL', max( m, n ), nrhs, czero, czero,
301 smlnum = dlamch(
'S' ) / dlamch(
'P' )
302 bignum = one / smlnum
303 CALL dlabad( smlnum, bignum )
307 anrm = zlange(
'M', m, n, a, lda, dum )
309 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
313 CALL zlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
315 ELSE IF( anrm.GT.bignum )
THEN
319 CALL zlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
321 ELSE IF( anrm.EQ.zero )
THEN
325 CALL zlaset(
'F', maxmn, nrhs, czero, czero, b, ldb )
333 bnrm = zlange(
'M', brow, nrhs, b, ldb, dum )
335 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
339 CALL zlascl(
'G', 0, 0, bnrm, smlnum, brow, nrhs, b, ldb,
342 ELSE IF( bnrm.GT.bignum )
THEN
346 CALL zlascl(
'G', 0, 0, bnrm, bignum, brow, nrhs, b, ldb,
355 CALL zgeqr( m, n, a, lda, work( lw2+1 ), lw1,
356 $ work( 1 ), lw2, info )
357 IF ( .NOT.tran )
THEN
363 CALL zgemqr(
'L' ,
'C', m, nrhs, n, a, lda,
364 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
369 CALL ztrtrs(
'U',
'N',
'N', n, nrhs,
370 $ a, lda, b, ldb, info )
381 CALL ztrtrs(
'U',
'C',
'N', n, nrhs,
382 $ a, lda, b, ldb, info )
398 CALL zgemqr(
'L',
'N', m, nrhs, n, a, lda,
399 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
410 CALL zgelq( m, n, a, lda, work( lw2+1 ), lw1,
411 $ work( 1 ), lw2, info )
421 CALL ztrtrs(
'L',
'N',
'N', m, nrhs,
422 $ a, lda, b, ldb, info )
438 CALL zgemlq(
'L',
'C', n, nrhs, m, a, lda,
439 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
452 CALL zgemlq(
'L',
'N', n, nrhs, m, a, lda,
453 $ work( lw2+1 ), lw1, b, ldb, work( 1 ), lw2,
460 CALL ztrtrs(
'L',
'C',
'N', m, nrhs,
461 $ a, lda, b, ldb, info )
475 IF( iascl.EQ.1 )
THEN
476 CALL zlascl(
'G', 0, 0, anrm, smlnum, scllen, nrhs, b, ldb,
478 ELSE IF( iascl.EQ.2 )
THEN
479 CALL zlascl(
'G', 0, 0, anrm, bignum, scllen, nrhs, b, ldb,
482 IF( ibscl.EQ.1 )
THEN
483 CALL zlascl(
'G', 0, 0, smlnum, bnrm, scllen, nrhs, b, ldb,
485 ELSE IF( ibscl.EQ.2 )
THEN
486 CALL zlascl(
'G', 0, 0, bignum, bnrm, scllen, nrhs, b, ldb,
491 work( 1 ) = dble( tszo + lwo )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zgetsls(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
ZGETSLS
subroutine zlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine ztrtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
ZTRTRS
subroutine zgelq(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
ZGELQ
subroutine zgemlq(SIDE, TRANS, M, N, K, A, LDA, T, TSIZE, C, LDC, WORK, LWORK, INFO)
ZGEMLQ
subroutine zgemqr(SIDE, TRANS, M, N, K, A, LDA, T, TSIZE, C, LDC, WORK, LWORK, INFO)
ZGEMQR
subroutine zgeqr(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
ZGEQR