266 SUBROUTINE zgges3( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B,
267 $ LDB, SDIM, ALPHA, BETA, VSL, LDVSL, VSR, LDVSR,
268 $ WORK, LWORK, RWORK, BWORK, INFO )
275 CHARACTER JOBVSL, JOBVSR, SORT
276 INTEGER INFO, LDA, LDB, LDVSL, LDVSR, LWORK, N, SDIM
280 DOUBLE PRECISION RWORK( * )
281 COMPLEX*16 A( LDA, * ), ALPHA( * ), B( LDB, * ),
282 $ beta( * ), vsl( ldvsl, * ), vsr( ldvsr, * ),
293 DOUBLE PRECISION ZERO, ONE
294 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
295 COMPLEX*16 CZERO, CONE
296 parameter( czero = ( 0.0d0, 0.0d0 ),
297 $ cone = ( 1.0d0, 0.0d0 ) )
300 LOGICAL CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL,
302 INTEGER I, ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT,
303 $ ILO, IRIGHT, IROWS, IRWRK, ITAU, IWRK, LWKOPT
304 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PVSL,
309 DOUBLE PRECISION DIF( 2 )
318 DOUBLE PRECISION DLAMCH, ZLANGE
319 EXTERNAL lsame, dlamch, zlange
328 IF( lsame( jobvsl,
'N' ) )
THEN
331 ELSE IF( lsame( jobvsl,
'V' ) )
THEN
339 IF( lsame( jobvsr,
'N' ) )
THEN
342 ELSE IF( lsame( jobvsr,
'V' ) )
THEN
350 wantst = lsame( sort,
'S' )
355 lquery = ( lwork.EQ.-1 )
356 IF( ijobvl.LE.0 )
THEN
358 ELSE IF( ijobvr.LE.0 )
THEN
360 ELSE IF( ( .NOT.wantst ) .AND. ( .NOT.lsame( sort,
'N' ) ) )
THEN
362 ELSE IF( n.LT.0 )
THEN
364 ELSE IF( lda.LT.max( 1, n ) )
THEN
366 ELSE IF( ldb.LT.max( 1, n ) )
THEN
368 ELSE IF( ldvsl.LT.1 .OR. ( ilvsl .AND. ldvsl.LT.n ) )
THEN
370 ELSE IF( ldvsr.LT.1 .OR. ( ilvsr .AND. ldvsr.LT.n ) )
THEN
372 ELSE IF( lwork.LT.max( 1, 2*n ) .AND. .NOT.lquery )
THEN
379 CALL zgeqrf( n, n, b, ldb, work, work, -1, ierr )
380 lwkopt = max( 1, n + int( work( 1 ) ) )
381 CALL zunmqr(
'L',
'C', n, n, n, b, ldb, work, a, lda, work,
383 lwkopt = max( lwkopt, n + int( work( 1 ) ) )
385 CALL zungqr( n, n, n, vsl, ldvsl, work, work, -1, ierr )
386 lwkopt = max( lwkopt, n + int( work( 1 ) ) )
388 CALL zgghd3( jobvsl, jobvsr, n, 1, n, a, lda, b, ldb, vsl,
389 $ ldvsl, vsr, ldvsr, work, -1, ierr )
390 lwkopt = max( lwkopt, n + int( work( 1 ) ) )
391 CALL zlaqz0(
'S', jobvsl, jobvsr, n, 1, n, a, lda, b, ldb,
392 $ alpha, beta, vsl, ldvsl, vsr, ldvsr, work, -1,
394 lwkopt = max( lwkopt, int( work( 1 ) ) )
396 CALL ztgsen( 0, ilvsl, ilvsr, bwork, n, a, lda, b, ldb,
397 $ alpha, beta, vsl, ldvsl, vsr, ldvsr, sdim,
398 $ pvsl, pvsr, dif, work, -1, idum, 1, ierr )
399 lwkopt = max( lwkopt, int( work( 1 ) ) )
401 work( 1 ) = dcmplx( lwkopt )
405 CALL xerbla(
'ZGGES3 ', -info )
407 ELSE IF( lquery )
THEN
421 smlnum = dlamch(
'S' )
422 bignum = one / smlnum
423 CALL dlabad( smlnum, bignum )
424 smlnum = sqrt( smlnum ) / eps
425 bignum = one / smlnum
429 anrm = zlange(
'M', n, n, a, lda, rwork )
431 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
434 ELSE IF( anrm.GT.bignum )
THEN
440 $
CALL zlascl(
'G', 0, 0, anrm, anrmto, n, n, a, lda, ierr )
444 bnrm = zlange(
'M', n, n, b, ldb, rwork )
446 IF( bnrm.GT.zero .AND. bnrm.LT.smlnum )
THEN
449 ELSE IF( bnrm.GT.bignum )
THEN
455 $
CALL zlascl(
'G', 0, 0, bnrm, bnrmto, n, n, b, ldb, ierr )
462 CALL zggbal(
'P', n, a, lda, b, ldb, ilo, ihi, rwork( ileft ),
463 $ rwork( iright ), rwork( irwrk ), ierr )
467 irows = ihi + 1 - ilo
471 CALL zgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
472 $ work( iwrk ), lwork+1-iwrk, ierr )
476 CALL zunmqr(
'L',
'C', irows, icols, irows, b( ilo, ilo ), ldb,
477 $ work( itau ), a( ilo, ilo ), lda, work( iwrk ),
478 $ lwork+1-iwrk, ierr )
483 CALL zlaset(
'Full', n, n, czero, cone, vsl, ldvsl )
484 IF( irows.GT.1 )
THEN
485 CALL zlacpy(
'L', irows-1, irows-1, b( ilo+1, ilo ), ldb,
486 $ vsl( ilo+1, ilo ), ldvsl )
488 CALL zungqr( irows, irows, irows, vsl( ilo, ilo ), ldvsl,
489 $ work( itau ), work( iwrk ), lwork+1-iwrk, ierr )
495 $
CALL zlaset(
'Full', n, n, czero, cone, vsr, ldvsr )
499 CALL zgghd3( jobvsl, jobvsr, n, ilo, ihi, a, lda, b, ldb, vsl,
500 $ ldvsl, vsr, ldvsr, work( iwrk ), lwork+1-iwrk, ierr )
507 CALL zlaqz0(
'S', jobvsl, jobvsr, n, ilo, ihi, a, lda, b, ldb,
508 $ alpha, beta, vsl, ldvsl, vsr, ldvsr, work( iwrk ),
509 $ lwork+1-iwrk, rwork( irwrk ), 0, ierr )
511 IF( ierr.GT.0 .AND. ierr.LE.n )
THEN
513 ELSE IF( ierr.GT.n .AND. ierr.LE.2*n )
THEN
528 $
CALL zlascl(
'G', 0, 0, anrm, anrmto, n, 1, alpha, n, ierr )
530 $
CALL zlascl(
'G', 0, 0, bnrm, bnrmto, n, 1, beta, n, ierr )
535 bwork( i ) = selctg( alpha( i ), beta( i ) )
538 CALL ztgsen( 0, ilvsl, ilvsr, bwork, n, a, lda, b, ldb, alpha,
539 $ beta, vsl, ldvsl, vsr, ldvsr, sdim, pvsl, pvsr,
540 $ dif, work( iwrk ), lwork-iwrk+1, idum, 1, ierr )
549 $
CALL zggbak(
'P',
'L', n, ilo, ihi, rwork( ileft ),
550 $ rwork( iright ), n, vsl, ldvsl, ierr )
552 $
CALL zggbak(
'P',
'R', n, ilo, ihi, rwork( ileft ),
553 $ rwork( iright ), n, vsr, ldvsr, ierr )
558 CALL zlascl(
'U', 0, 0, anrmto, anrm, n, n, a, lda, ierr )
559 CALL zlascl(
'G', 0, 0, anrmto, anrm, n, 1, alpha, n, ierr )
563 CALL zlascl(
'U', 0, 0, bnrmto, bnrm, n, n, b, ldb, ierr )
564 CALL zlascl(
'G', 0, 0, bnrmto, bnrm, n, 1, beta, n, ierr )
574 cursl = selctg( alpha( i ), beta( i ) )
577 IF( cursl .AND. .NOT.lastsl )
586 work( 1 ) = dcmplx( lwkopt )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zggbal(JOB, N, A, LDA, B, LDB, ILO, IHI, LSCALE, RSCALE, WORK, INFO)
ZGGBAL
subroutine zggbak(JOB, SIDE, N, ILO, IHI, LSCALE, RSCALE, M, V, LDV, INFO)
ZGGBAK
recursive subroutine zlaqz0(WANTS, WANTQ, WANTZ, N, ILO, IHI, A, LDA, B, LDB, ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, RWORK, REC, INFO)
ZLAQZ0
subroutine zgges3(JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB, SDIM, ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK, LWORK, RWORK, BWORK, INFO)
ZGGES3 computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE ...
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 zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
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 ztgsen(IJOB, WANTQ, WANTZ, SELECT, N, A, LDA, B, LDB, ALPHA, BETA, Q, LDQ, Z, LDZ, M, PL, PR, DIF, WORK, LWORK, IWORK, LIWORK, INFO)
ZTGSEN
subroutine zungqr(M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
ZUNGQR
subroutine zgghd3(COMPQ, COMPZ, N, ILO, IHI, A, LDA, B, LDB, Q, LDQ, Z, LDZ, WORK, LWORK, INFO)
ZGGHD3
subroutine zunmqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
ZUNMQR
subroutine zgeqrf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
ZGEQRF VARIANT: left-looking Level 3 BLAS of the algorithm.