236 SUBROUTINE cgeesx( 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
252 COMPLEX A( LDA, * ), VS( LDVS, * ), W( * ), WORK( * )
263 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
266 LOGICAL LQUERY, SCALEA, WANTSB, WANTSE, WANTSN, WANTST,
268 INTEGER HSWORK, I, IBAL, ICOND, IERR, IEVAL, IHI, ILO,
269 $ ITAU, IWRK, LWRK, MAXWRK, MINWRK
270 REAL ANRM, BIGNUM, CSCALE, EPS, SMLNUM
283 EXTERNAL lsame, ilaenv, clange, slamch
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. ( .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,
'CGEHRD',
' ', n, 1, n, 0 )
338 CALL chseqr(
'S', jobvs, n, 1, n, a, lda, w, vs, ldvs,
340 hswork = int( work( 1 ) )
342 IF( .NOT.wantvs )
THEN
343 maxwrk = max( maxwrk, hswork )
345 maxwrk = max( maxwrk, n + ( n - 1 )*ilaenv( 1,
'CUNGHR',
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(
'CGEESX', -info )
363 ELSE IF( lquery )
THEN
377 smlnum = slamch(
'S' )
378 bignum = one / smlnum
379 CALL slabad( smlnum, bignum )
380 smlnum = sqrt( smlnum ) / eps
381 bignum = one / smlnum
385 anrm = clange(
'M', n, n, a, lda, dum )
387 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
390 ELSE IF( anrm.GT.bignum )
THEN
395 $
CALL clascl(
'G', 0, 0, anrm, cscale, n, n, a, lda, ierr )
403 CALL cgebal(
'P', n, a, lda, ilo, ihi, rwork( ibal ), ierr )
411 CALL cgehrd( n, ilo, ihi, a, lda, work( itau ), work( iwrk ),
412 $ lwork-iwrk+1, ierr )
418 CALL clacpy(
'L', n, n, a, lda, vs, ldvs )
424 CALL cunghr( n, ilo, ihi, vs, ldvs, work( itau ), work( iwrk ),
425 $ lwork-iwrk+1, ierr )
435 CALL chseqr(
'S', jobvs, n, ilo, ihi, a, lda, w, vs, ldvs,
436 $ work( iwrk ), lwork-iwrk+1, ieval )
442 IF( wantst .AND. info.EQ.0 )
THEN
444 $
CALL clascl(
'G', 0, 0, cscale, anrm, n, 1, w, n, ierr )
446 bwork( i ) =
SELECT( w( i ) )
455 CALL ctrsen( 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 IF( icond.EQ.-14 )
THEN
474 CALL cgebak(
'P',
'R', n, ilo, ihi, rwork( ibal ), n, vs, ldvs,
482 CALL clascl(
'U', 0, 0, cscale, anrm, n, n, a, lda, ierr )
483 CALL ccopy( n, a, lda+1, w, 1 )
484 IF( ( wantsv .OR. wantsb ) .AND. info.EQ.0 )
THEN
486 CALL slascl(
'G', 0, 0, cscale, anrm, 1, 1, dum, 1, ierr )
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine slascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
subroutine cgehrd(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
CGEHRD
subroutine cgebal(JOB, N, A, LDA, ILO, IHI, SCALE, INFO)
CGEBAL
subroutine cgebak(JOB, SIDE, N, ILO, IHI, SCALE, M, V, LDV, INFO)
CGEBAK
subroutine cgeesx(JOBVS, SORT, SELECT, SENSE, N, A, LDA, SDIM, W, VS, LDVS, RCONDE, RCONDV, WORK, LWORK, RWORK, BWORK, INFO)
CGEESX computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE ...
subroutine clascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
CLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine ctrsen(JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, W, M, S, SEP, WORK, LWORK, INFO)
CTRSEN
subroutine cunghr(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
CUNGHR
subroutine chseqr(JOB, COMPZ, N, ILO, IHI, H, LDH, W, Z, LDZ, WORK, LWORK, INFO)
CHSEQR