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 clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
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 xerbla(SRNAME, INFO)
XERBLA
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
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 slabad(SMALL, LARGE)
SLABAD
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 ctrsen(JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, W, M, S, SEP, WORK, LWORK, INFO)
CTRSEN
subroutine cgehrd(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
CGEHRD
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
subroutine cgebak(JOB, SIDE, N, ILO, IHI, SCALE, M, V, LDV, INFO)
CGEBAK
subroutine cgebal(JOB, N, A, LDA, ILO, IHI, SCALE, INFO)
CGEBAL