326 SUBROUTINE zggesx( JOBVSL, JOBVSR, SORT, SELCTG, SENSE, N, A, LDA,
327 $ B, LDB, SDIM, ALPHA, BETA, VSL, LDVSL, VSR,
328 $ LDVSR, RCONDE, RCONDV, WORK, LWORK, RWORK,
329 $ IWORK, LIWORK, BWORK, INFO )
337INTEGER INFO, LDA, LDB, LDVSL, LDVSR, , LWORK, N,
343 DOUBLE PRECISION RCONDE( 2 ), RCONDV( 2 ), RWORK( * )
344 COMPLEX*16 A( LDA, * ), ALPHA( * ), B( LDB
356 DOUBLE PRECISION ZERO, ONE
357 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
358 COMPLEX*16 CZERO, CONE
359 parameter( czero = ( 0.0d+0, 0.0d+0 ),
360 $ cone = ( 1.0d+0, 0.0d+0 ) )
363 LOGICAL CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL,
364 $ LQUERY, WANTSB, WANTSE, WANTSN, WANTST, WANTSV
365 INTEGER I, ICOLS, IERR, IHI, IJOB, IJOBVL, IJOBVR,
366 $ ileft, ilo, iright, irows, irwrk, itau, iwrk,
367 $ liwmin, lwrk, maxwrk, minwrk
368 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PL,
372 DOUBLE PRECISION DIF( 2 )
382 DOUBLE PRECISION DLAMCH, ZLANGE
383 EXTERNAL lsame, ilaenv, dlamch, zlange
392 IF( lsame( jobvsl,
'N' ) )
THEN
395 ELSE IF( lsame( jobvsl,
'V' ) )
THEN
403 IF( lsame( jobvsr,
'N' ) )
THEN
406 ELSE IF( lsame( jobvsr,
'V' ) )
THEN
414 wantst = lsame( sort,
'S' )
415 wantsn = lsame( sense,
'N' )
416 wantse = lsame( sense,
'E' )
417 wantsv = lsame( sense,
'V'
418 wantsb = lsame( sense,
'B' )
419 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
422 ELSE IF( wantse )
THEN
424 ELSE IF( wantsv )
THEN
426 ELSE IF( wantsb )
THEN
433 IF( ijobvl.LE.0 )
THEN
435 ELSE IF( ijobvr.LE.0 )
THEN
437 ELSE IF( ( .NOT.wantst ) .AND. ( .NOT.lsame( sort, 'n
' ) ) ) THEN
439.NOT..OR..OR..OR..OR.
ELSE IF( ( WANTSN WANTSE WANTSV WANTSB )
440.NOT..AND..NOT.
$ ( WANTST WANTSN ) ) THEN
442.LT.
ELSE IF( N0 ) THEN
444.LT.
ELSE IF( LDAMAX( 1, N ) ) THEN
446.LT.
ELSE IF( LDBMAX( 1, N ) ) THEN
448.LT..OR..AND..LT.
ELSE IF( LDVSL1 ( ILVSL LDVSLN ) ) THEN
450.LT..OR..AND..LT.
ELSE IF( LDVSR1 ( ILVSR LDVSRN ) ) THEN
464 MAXWRK = N*(1 + ILAENV( 1, 'zgeqrf', ' ', N, 1, N, 0 ) )
465 MAXWRK = MAX( MAXWRK, N*( 1 +
466 $ ILAENV( 1, 'zunmqr', '', N, 1, N, -1 ) ) )
468 MAXWRK = MAX( MAXWRK, N*( 1 +
469 $ ILAENV( 1, 'zungqr', ' ', N, 1, N, -1 ) ) )
473 $ LWRK = MAX( LWRK, N*N/2 )
480.OR..EQ.
IF( WANTSN N0 ) THEN
487.LT..AND..NOT.
IF( LWORKMINWRK LQUERY ) THEN
489.LT..AND..NOT.
ELSE IF( LIWORKLIWMIN LQUERY) THEN
495 CALL XERBLA( 'zggesx', -INFO )
497 ELSE IF (LQUERY) THEN
511 SMLNUM = DLAMCH( 's
' )
512 BIGNUM = ONE / SMLNUM
513 CALL DLABAD( SMLNUM, BIGNUM )
514 SMLNUM = SQRT( SMLNUM ) / EPS
515 BIGNUM = ONE / SMLNUM
519 ANRM = ZLANGE( 'm
', N, N, A, LDA, RWORK )
521.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
524.GT.
ELSE IF( ANRMBIGNUM ) THEN
529 $ CALL ZLASCL( 'g
', 0, 0, ANRM, ANRMTO, N, N, A, LDA, IERR )
533 BNRM = ZLANGE( 'm
', N, N, B, LDB, RWORK )
535.GT..AND..LT.
IF( BNRMZERO BNRMSMLNUM ) THEN
538.GT.
ELSE IF( BNRMBIGNUM ) THEN
543 $ CALL ZLASCL( 'g
', 0, 0, BNRM, BNRMTO, N, N, B, LDB, IERR )
551 CALL ZGGBAL( 'p
', N, A, LDA, B, LDB, ILO, IHI, RWORK( ILEFT ),
552 $ RWORK( IRIGHT ), RWORK( IRWRK ), IERR )
557 IROWS = IHI + 1 - ILO
561 CALL ZGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
562 $ WORK( IWRK ), LWORK+1-IWRK, IERR )
567 CALL ZUNMQR( 'l
', 'c
', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
568 $ WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWRK ),
569 $ LWORK+1-IWRK, IERR )
575 CALL ZLASET( 'full
', N, N, CZERO, CONE, VSL, LDVSL )
576.GT.
IF( IROWS1 ) THEN
577 CALL ZLACPY( 'l
', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
578 $ VSL( ILO+1, ILO ), LDVSL )
580 CALL ZUNGQR( IROWS, IROWS, IROWS, VSL( ILO, ILO ), LDVSL,
581 $ WORK( ITAU ), WORK( IWRK ), LWORK+1-IWRK, IERR )
587 $ CALL ZLASET( 'full
', N, N, CZERO, CONE, VSR, LDVSR )
592 CALL ZGGHRD( JOBVSL, JOBVSR, N, ILO, IHI, A, LDA, B, LDB, VSL,
593 $ LDVSL, VSR, LDVSR, IERR )
602 CALL ZHGEQZ( 's
', JOBVSL, JOBVSR, N, ILO, IHI, A, LDA, B, LDB,
603 $ ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK( IWRK ),
604 $ LWORK+1-IWRK, RWORK( IRWRK ), IERR )
606.GT..AND..LE.
IF( IERR0 IERRN ) THEN
608.GT..AND..LE.
ELSE IF( IERRN IERR2*N ) THEN
624 $ CALL ZLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHA, N, IERR )
626 $ CALL ZLASCL( 'g
', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
631 BWORK( I ) = SELCTG( ALPHA( I ), BETA( I ) )
639 CALL ZTGSEN( IJOB, ILVSL, ILVSR, BWORK, N, A, LDA, B, LDB,
640 $ ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, SDIM, PL, PR,
641 $ DIF, WORK( IWRK ), LWORK-IWRK+1, IWORK, LIWORK,
645 $ MAXWRK = MAX( MAXWRK, 2*SDIM*( N-SDIM ) )
646.EQ.
IF( IERR-21 ) THEN
652.EQ..OR..EQ.
IF( IJOB1 IJOB4 ) THEN
656.EQ..OR..EQ.
IF( IJOB2 IJOB4 ) THEN
657 RCONDV( 1 ) = DIF( 1 )
658 RCONDV( 2 ) = DIF( 2 )
670 $ CALL ZGGBAK( 'p
', 'l
', N, ILO, IHI, RWORK( ILEFT ),
671 $ RWORK( IRIGHT ), N, VSL, LDVSL, IERR )
674 $ CALL ZGGBAK( 'p
', 'r
', N, ILO, IHI, RWORK( ILEFT ),
675 $ RWORK( IRIGHT ), N, VSR, LDVSR, IERR )
680 CALL ZLASCL( 'u
', 0, 0, ANRMTO, ANRM, N, N, A, LDA, IERR )
681 CALL ZLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHA, N, IERR )
685 CALL ZLASCL( 'u
', 0, 0, BNRMTO, BNRM, N, N, B, LDB, IERR )
686 CALL ZLASCL( 'g
', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
696 CURSL = SELCTG( ALPHA( I ), BETA( I ) )
699.AND..NOT.
IF( CURSL LASTSL )
subroutine dlabad(small, large)
DLABAD
subroutine xerbla(srname, info)
XERBLA
subroutine zggbak(job, side, n, ilo, ihi, lscale, rscale, m, v, ldv, info)
ZGGBAK
subroutine zggbal(job, n, a, lda, b, ldb, ilo, ihi, lscale, rscale, work, info)
ZGGBAL
subroutine zhgeqz(job, compq, compz, n, ilo, ihi, h, ldh, t, ldt, alpha, beta, q, ldq, z, ldz, work, lwork, rwork, info)
ZHGEQZ
subroutine zggesx(jobvsl, jobvsr, sort, selctg, sense, n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, rconde, rcondv, work, lwork, rwork, iwork, liwork, bwork, info)
ZGGESX 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 zgghrd(compq, compz, n, ilo, ihi, a, lda, b, ldb, q, ldq, z, ldz, info)
ZGGHRD
subroutine zunmqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
ZUNMQR
subroutine zungqr(m, n, k, a, lda, tau, work, lwork, info)
ZUNGQR
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 zgeqrf(m, n, a, lda, tau, work, lwork, info)
ZGEQRF VARIANT: left-looking Level 3 BLAS of the algorithm.