234 SUBROUTINE zgeesx( JOBVS, SORT, SELECT, SENSE, N, A, LDA, SDIM,
236 $ VS, LDVS, RCONDE, RCONDV, WORK, LWORK, RWORK,
244 CHARACTER JOBVS, SENSE, SORT
245 INTEGER INFO, LDA, LDVS, LWORK, N, SDIM
246 DOUBLE PRECISION RCONDE, RCONDV
250 DOUBLE PRECISION RWORK( * )
251 COMPLEX*16 A( LDA, * ), VS( LDVS, * ), W( * ), WORK( * )
261 DOUBLE PRECISION ZERO, ONE
262 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
265 LOGICAL LQUERY, SCALEA, WANTSB, WANTSE, WANTSN, WANTST,
267 INTEGER HSWORK, I, IBAL, ICOND, IERR, IEVAL, IHI, ILO,
268 $ itau, iwrk, lwrk, maxwrk, minwrk
269 DOUBLE PRECISION ANRM, BIGNUM, CSCALE, EPS, SMLNUM
272 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' )
298 wantsb = lsame( sense,
'B' )
299 lquery = ( lwork.EQ.-1 )
301 IF( ( .NOT.wantvs ) .AND. ( .NOT.lsame( jobvs,
'N' ) ) )
THEN
303 ELSE IF( ( .NOT.wantst ) .AND.
304 $ ( .NOT.lsame( sort,
'N' ) ) )
THEN
306 ELSE IF( .NOT.( wantsn .OR. wantse .OR. wantsv .OR. wantsb ) .OR.
307 $ ( .NOT.wantst .AND. .NOT.wantsn ) )
THEN
309 ELSE IF( n.LT.0 )
THEN
311 ELSE IF( lda.LT.max( 1, n ) )
THEN
313 ELSE IF( ldvs.LT.1 .OR. ( wantvs .AND. ldvs.LT.n ) )
THEN
336 maxwrk = n + n*ilaenv( 1,
'ZGEHRD',
' ', n, 1, n, 0 )
339 CALL zhseqr(
'S', jobvs, n, 1, n, a, lda, w, vs, ldvs,
341 hswork = int( work( 1 ) )
343 IF( .NOT.wantvs )
THEN
344 maxwrk = max( maxwrk, hswork )
346 maxwrk = max( maxwrk, n + ( n - 1 )*ilaenv( 1,
348 $
' ', n, 1, n, -1 ) )
349 maxwrk = max( maxwrk, hswork )
353 $ lwrk = max( lwrk, ( n*n )/2 )
357 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
363 CALL xerbla(
'ZGEESX', -info )
365 ELSE IF( lquery )
THEN
379 smlnum = dlamch(
'S' )
380 bignum = one / smlnum
381 smlnum = sqrt( smlnum ) / eps
382 bignum = one / smlnum
386 anrm = zlange(
'M', n, n, a, lda, dum )
388 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
391 ELSE IF( anrm.GT.bignum )
THEN
396 $
CALL zlascl(
'G', 0, 0, anrm, cscale, n, n, a, lda, ierr )
404 CALL zgebal(
'P', n, a, lda, ilo, ihi, rwork( ibal ), ierr )
412 CALL zgehrd( n, ilo, ihi, a, lda, work( itau ), work( iwrk ),
413 $ lwork-iwrk+1, ierr )
419 CALL zlacpy(
'L', n, n, a, lda, vs, ldvs )
425 CALL zunghr( n, ilo, ihi, vs, ldvs, work( itau ),
427 $ lwork-iwrk+1, ierr )
437 CALL zhseqr(
'S', jobvs, n, ilo, ihi, a, lda, w, vs, ldvs,
438 $ work( iwrk ), lwork-iwrk+1, ieval )
444 IF( wantst .AND. info.EQ.0 )
THEN
446 $
CALL zlascl(
'G', 0, 0, cscale, anrm, n, 1, w, n, ierr )
448 bwork( i ) =
SELECT( w( i ) )
457 CALL ztrsen( sense, jobvs, bwork, n, a, lda, vs, ldvs, w,
459 $ rconde, rcondv, work( iwrk ), lwork-iwrk+1,
462 $ maxwrk = max( maxwrk, 2*sdim*( n-sdim ) )
463 IF( icond.EQ.-14 )
THEN
477 CALL zgebak(
'P',
'R', n, ilo, ihi, rwork( ibal ), n, vs,
486 CALL zlascl(
'U', 0, 0, cscale, anrm, n, n, a, lda, ierr )
487 CALL zcopy( n, a, lda+1, w, 1 )
488 IF( ( wantsv .OR. wantsb ) .AND. info.EQ.0 )
THEN
490 CALL dlascl(
'G', 0, 0, cscale, anrm, 1, 1, dum, 1,
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 ...