236 SUBROUTINE zgeesx( JOBVS, SORT, SELECT, SENSE, N, A, LDA, SDIM, W,
237 $ VS, LDVS, RCONDE, RCONDV, WORK, LWORK, RWORK,
245 CHARACTER JOBVS, SENSE, SORT
246 INTEGER INFO, LDA, LDVS, LWORK, N, SDIM
247 DOUBLE PRECISION , RCONDV
251 DOUBLE PRECISION RWORK( * )
252 COMPLEX*16 A( LDA, * ), VS( LDVS, * ), W( * ), WORK( * )
262 DOUBLE PRECISION ZERO, ONE
263 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
266 LOGICAL LQUERY, , WANTSB, WANTSE, , WANTST,
268 INTEGER HSWORK, I, IBAL, ICOND, IERR, IEVAL, IHI, ILO,
269 $ ITAU, IWRK, LWRK, MAXWRK, MINWRK
270 DOUBLE PRECISION ANRM, BIGNUM, CSCALE, EPS, SMLNUM
273 DOUBLE PRECISION DUM( 1 )
282 DOUBLE PRECISION DLAMCH, ZLANGE
283 EXTERNAL lsame, ilaenv, dlamch, zlange
293 wantvs = lsame( jobvs,
'V' )
294 wantst = lsame( sort,
'S' )
295 wantsn = lsame( sense,
'N' )
296 wantse = lsame( sense,
'E' )
297 wantsv = lsame( sense,
'V' )
299 lquery = ( lwork.EQ.-1 )
301 IF( ( .NOT.wantvs ) .AND. ( .NOT.lsame( jobvs,
'N' ) ) )
THEN
303 ELSE IF( ( .NOT.wantst ) .AND. ( .NOT.lsame( sort,
'N' ) ) )
THEN
305 ELSE IF( .NOT.( wantsn .OR. wantse .OR. wantsv .OR. wantsb ) .OR.
306 $ ( .NOT.wantst .AND. .NOT.wantsn ) )
THEN
308 ELSE IF( n.LT.0 )
THEN
310 ELSE IF( lda.LT.
max( 1, n ) )
THEN
312 ELSE IF( ldvs.LT.1 .OR. ( wantvs .AND. ldvs.LT.n ) )
THEN
335 maxwrk = n + n*ilaenv( 1,
'ZGEHRD',
' ', n, 1, n, 0 )
338 CALL zhseqr(
'S', jobvs, n, 1, n, a, lda, w, vs, ldvs,
340 hswork = dble( work( 1 ) )
342 IF( .NOT.wantvs )
THEN
343 maxwrk =
max( maxwrk, hswork )
345 maxwrk =
max( maxwrk, n + ( n - 1 )*ilaenv( 1,
'ZUNGHR',
346 $
' ', n, 1, n, -1 ) )
347 maxwrk =
max( maxwrk, hswork )
351 $ lwrk =
max( lwrk, ( n*n )/2 )
355 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
361 CALL xerbla(
'ZGEESX', -info )
363 ELSE IF( lquery )
THEN
377 smlnum = dlamch( 's
' )
378 BIGNUM = ONE / SMLNUM
379 CALL DLABAD( SMLNUM, BIGNUM )
380 SMLNUM = SQRT( SMLNUM ) / EPS
381 BIGNUM = ONE / SMLNUM
385 ANRM = ZLANGE( 'm
', N, N, A, LDA, DUM )
387.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
390.GT.
ELSE IF( ANRMBIGNUM ) THEN
395 $ CALL ZLASCL( 'g
', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
403 CALL ZGEBAL( 'p
', N, A, LDA, ILO, IHI, RWORK( IBAL ), IERR )
411 CALL ZGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
412 $ LWORK-IWRK+1, IERR )
418 CALL ZLACPY( 'l
', N, N, A, LDA, VS, LDVS )
424 CALL ZUNGHR( N, ILO, IHI, VS, LDVS, WORK( ITAU ), WORK( IWRK ),
425 $ LWORK-IWRK+1, IERR )
435 CALL ZHSEQR( 's
', JOBVS, N, ILO, IHI, A, LDA, W, VS, LDVS,
436 $ WORK( IWRK ), LWORK-IWRK+1, IEVAL )
442.AND..EQ.
IF( WANTST INFO0 ) THEN
444 $ CALL ZLASCL( 'g
', 0, 0, CSCALE, ANRM, N, 1, W, N, IERR )
446 BWORK( I ) = SELECT( W( I ) )
455 CALL ZTRSEN( SENSE, JOBVS, BWORK, N, A, LDA, VS, LDVS, W, SDIM,
456 $ RCONDE, RCONDV, WORK( IWRK ), LWORK-IWRK+1,
459 $ MAXWRK = MAX( MAXWRK, 2*SDIM*( N-SDIM ) )
460.EQ.
IF( ICOND-14 ) THEN
474 CALL ZGEBAK( 'p
', 'r
', N, ILO, IHI, RWORK( IBAL ), N, VS, LDVS,
482 CALL ZLASCL( 'u
', 0, 0, CSCALE, ANRM, N, N, A, LDA, IERR )
483 CALL ZCOPY( N, A, LDA+1, W, 1 )
484.OR..AND..EQ.
IF( ( WANTSV WANTSB ) INFO0 ) THEN
486 CALL DLASCL( 'g
', 0, 0, CSCALE, ANRM, 1, 1, DUM, 1, IERR )
subroutine dlabad(small, large)
DLABAD
subroutine dlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine xerbla(srname, info)
XERBLA
subroutine zgebal(job, n, a, lda, ilo, ihi, scale, info)
ZGEBAL
subroutine zgehrd(n, ilo, ihi, a, lda, tau, work, lwork, info)
ZGEHRD
subroutine zgebak(job, side, n, ilo, ihi, scale, m, v, ldv, info)
ZGEBAK
subroutine zgeesx(jobvs, sort, select, sense, n, a, lda, sdim, w, vs, ldvs, rconde, rcondv, work, lwork, rwork, bwork, info)
ZGEESX 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 zhseqr(job, compz, n, ilo, ihi, h, ldh, w, z, ldz, work, lwork, info)
ZHSEQR
subroutine ztrsen(job, compq, select, n, t, ldt, q, ldq, w, m, s, sep, work, lwork, info)
ZTRSEN
subroutine zunghr(n, ilo, ihi, a, lda, tau, work, lwork, info)
ZUNGHR
subroutine zcopy(n, zx, incx, zy, incy)
ZCOPY