267 SUBROUTINE zgges( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB,
268 $ SDIM, ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK,
269 $ LWORK, RWORK, BWORK, INFO )
276 CHARACTER JOBVSL, JOBVSR, SORT
277 INTEGER INFO, LDA, LDB, LDVSL, LDVSR, LWORK, N, SDIM
281 DOUBLE PRECISION RWORK( * )
282 COMPLEX*16 A( LDA, * ), ALPHA( * ), B( LDB, * ),
283 $ beta( * ), vsl( ldvsl, * ), vsr( ldvsr, * ),
294 DOUBLE PRECISION ZERO, ONE
295 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
296 COMPLEX*16 CZERO, CONE
297 parameter( czero = ( 0.0d0, 0.0d0 ),
298 $ cone = ( 1.0d0, 0.0d0 ) )
301 LOGICAL CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL,
303 INTEGER I, ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT,
304 $ ILO, IRIGHT, IROWS, IRWRK, ITAU, IWRK, LWKMIN,
306 DOUBLE PRECISION ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PVSL,
311 DOUBLE PRECISION DIF( 2 )
321 DOUBLE PRECISION DLAMCH, ZLANGE
322 EXTERNAL lsame, ilaenv, dlamch, zlange
331 IF( lsame( jobvsl,
'N' ) )
THEN
334 ELSE IF( lsame( jobvsl,
'V' ) )
THEN
342 IF( lsame( jobvsr,
'N' ) )
THEN
345 ELSE IF( lsame( jobvsr,
'V' ) )
THEN
353 wantst = lsame( sort,
'S' )
358 lquery = ( lwork.EQ.-1 )
359 IF( ijobvl.LE.0 )
THEN
361 ELSE IF( ijobvr.LE.0 )
THEN
363 ELSE IF( ( .NOT.wantst ) .AND. ( .NOT.lsame( sort,
'N' ) ) )
THEN
365 ELSE IF( n.LT.0 )
THEN
367 ELSE IF( lda.LT.
max( 1, n ) )
THEN
369 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
371 ELSE IF( ldvsl.LT.1 .OR. ( ilvsl .AND. ldvsl.LT.n ) )
THEN
373 ELSE IF( ldvsr.LT.1 .OR. ( ilvsr .AND. ldvsr.LT.n ) )
THEN
385 lwkmin =
max( 1, 2*n )
386 lwkopt =
max( 1, n + n*ilaenv( 1, '
zgeqrf', ' ', N, 1, N, 0 ) )
387 LWKOPT = MAX( LWKOPT, N +
388 $ N*ILAENV( 1, 'zunmqr', ' ', N, 1, N, -1 ) )
390 LWKOPT = MAX( LWKOPT, N +
391 $ N*ILAENV( 1, 'zungqr', ' ', N, 1, N, -1 ) )
395.LT..AND..NOT.
IF( LWORKLWKMIN LQUERY )
400 CALL XERBLA( 'zgges ', -INFO )
402 ELSE IF( LQUERY ) THEN
416 SMLNUM = DLAMCH( 's
' )
417 BIGNUM = ONE / SMLNUM
418 CALL DLABAD( SMLNUM, BIGNUM )
419 SMLNUM = SQRT( SMLNUM ) / EPS
420 BIGNUM = ONE / SMLNUM
424 ANRM = ZLANGE( 'm
', N, N, A, LDA, RWORK )
426.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
429.GT.
ELSE IF( ANRMBIGNUM ) THEN
435 $ CALL ZLASCL( 'g
', 0, 0, ANRM, ANRMTO, N, N, A, LDA, IERR )
439 BNRM = ZLANGE( 'm
', N, N, B, LDB, RWORK )
441.GT..AND..LT.
IF( BNRMZERO BNRMSMLNUM ) THEN
444.GT.
ELSE IF( BNRMBIGNUM ) THEN
450 $ CALL ZLASCL( 'g
', 0, 0, BNRM, BNRMTO, N, N, B, LDB, IERR )
458 CALL ZGGBAL( 'p
', N, A, LDA, B, LDB, ILO, IHI, RWORK( ILEFT ),
459 $ RWORK( IRIGHT ), RWORK( IRWRK ), IERR )
464 IROWS = IHI + 1 - ILO
468 CALL ZGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
469 $ WORK( IWRK ), LWORK+1-IWRK, IERR )
474 CALL ZUNMQR( 'l
', 'c
', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
475 $ WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWRK ),
476 $ LWORK+1-IWRK, IERR )
482 CALL ZLASET( 'full
', N, N, CZERO, CONE, VSL, LDVSL )
483.GT.
IF( IROWS1 ) THEN
484 CALL ZLACPY( 'l
', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
485 $ VSL( ILO+1, ILO ), LDVSL )
487 CALL ZUNGQR( IROWS, IROWS, IROWS, VSL( ILO, ILO ), LDVSL,
488 $ WORK( ITAU ), WORK( IWRK ), LWORK+1-IWRK, IERR )
494 $ CALL ZLASET( 'full
', N, N, CZERO, CONE, VSR, LDVSR )
499 CALL ZGGHRD( JOBVSL, JOBVSR, N, ILO, IHI, A, LDA, B, LDB, VSL,
500 $ LDVSL, VSR, LDVSR, IERR )
509 CALL ZHGEQZ( 's
', JOBVSL, JOBVSR, N, ILO, IHI, A, LDA, B, LDB,
510 $ ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK( IWRK ),
511 $ LWORK+1-IWRK, RWORK( IRWRK ), IERR )
513.GT..AND..LE.
IF( IERR0 IERRN ) THEN
515.GT..AND..LE.
ELSE IF( IERRN IERR2*N ) THEN
531 $ CALL ZLASCL( 'g
', 0, 0, ANRM, ANRMTO, N, 1, ALPHA, N, IERR )
533 $ CALL ZLASCL( 'g
', 0, 0, BNRM, BNRMTO, N, 1, BETA, N, IERR )
538 BWORK( I ) = SELCTG( ALPHA( I ), BETA( I ) )
541 CALL ZTGSEN( 0, ILVSL, ILVSR, BWORK, N, A, LDA, B, LDB, ALPHA,
542 $ BETA, VSL, LDVSL, VSR, LDVSR, SDIM, PVSL, PVSR,
543 $ DIF, WORK( IWRK ), LWORK-IWRK+1, IDUM, 1, IERR )
553 $ CALL ZGGBAK( 'p
', 'l
', N, ILO, IHI, RWORK( ILEFT ),
554 $ RWORK( IRIGHT ), N, VSL, LDVSL, IERR )
556 $ CALL ZGGBAK( 'p
', 'r
', N, ILO, IHI, RWORK( ILEFT ),
557 $ RWORK( IRIGHT ), N, VSR, LDVSR, IERR )
562 CALL ZLASCL( 'u
', 0, 0, ANRMTO, ANRM, N, N, A, LDA, IERR )
563 CALL ZLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHA, N, IERR )
567 CALL ZLASCL( 'u
', 0, 0, BNRMTO, BNRM, N, N, B, LDB, IERR )
568 CALL ZLASCL( 'g
', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
578 CURSL = SELCTG( ALPHA( I ), BETA( I ) )
581.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 zgges(jobvsl, jobvsr, sort, selctg, n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, rwork, bwork, info)
ZGGES computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE m...
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.