178 SUBROUTINE zgeev( JOBVL, JOBVR, N, A, LDA, W, VL, LDVL, VR, LDVR,
179 $ WORK, LWORK, RWORK, INFO )
187 CHARACTER JOBVL, JOBVR
188 INTEGER INFO, LDA, LDVL, LDVR, LWORK, N
191 DOUBLE PRECISION RWORK( * )
192 COMPLEX*16 A( LDA, * ), VL( LDVL, * ), VR( LDVR, * ),
199 DOUBLE PRECISION ZERO, ONE
200 parameter( zero = 0.0d0, one = 1.0d0 )
203 LOGICAL LQUERY, SCALEA, WANTVL, WANTVR
205 INTEGER HSWORK, I, IBAL, IERR, IHI, ILO, IRWORK, ITAU,
206 $ iwrk, k, lwork_trevc, maxwrk, minwrk, nout
207 DOUBLE PRECISION ANRM, BIGNUM, CSCALE, EPS, SCL, SMLNUM
212 DOUBLE PRECISION DUM( 1 )
220 INTEGER IDAMAX, ILAENV
221 DOUBLE PRECISION DLAMCH, DZNRM2, ZLANGE
222 EXTERNAL lsame, idamax, ilaenv, dlamch, dznrm2, zlange
225 INTRINSIC dble, dcmplx, conjg, aimag, max, sqrt
232 lquery = ( lwork.EQ.-1 )
233 wantvl = lsame( jobvl,
'V' )
234 wantvr = lsame( jobvr,
'V' )
235 IF( ( .NOT.wantvl ) .AND. ( .NOT.lsame( jobvl,
'N' ) ) )
THEN
237 ELSE IF( ( .NOT.wantvr ) .AND. ( .NOT.lsame( jobvr,
'N' ) ) )
THEN
239 ELSE IF( n.LT.0 )
THEN
241 ELSE IF( lda.LT.max( 1, n ) )
THEN
243 ELSE IF( ldvl.LT.1 .OR. ( wantvl .AND. ldvl.LT.n ) )
THEN
245 ELSE IF( ldvr.LT.1 .OR. ( wantvr .AND. ldvr.LT.n ) )
THEN
265 maxwrk = n + n*ilaenv( 1,
'ZGEHRD',
' ', n, 1, n, 0 )
268 maxwrk = max( maxwrk, n + ( n - 1 )*ilaenv( 1,
'ZUNGHR',
269 $
' ', n, 1, n, -1 ) )
270 CALL ztrevc3(
'L',
'B',
SELECT, n, a, lda,
271 $ vl, ldvl, vr, ldvr,
272 $ n, nout, work, -1, rwork, -1, ierr )
273 lwork_trevc = int( work(1) )
274 maxwrk = max( maxwrk, n + lwork_trevc )
275 CALL zhseqr(
'S',
'V', n, 1, n, a, lda, w, vl, ldvl,
277 ELSE IF( wantvr )
THEN
278 maxwrk = max( maxwrk, n + ( n - 1 )*ilaenv( 1,
'ZUNGHR',
279 $
' ', n, 1, n, -1 ) )
280 CALL ztrevc3(
'R',
'B',
SELECT, n, a, lda,
281 $ vl, ldvl, vr, ldvr,
282 $ n, nout, work, -1, rwork, -1, ierr )
283 lwork_trevc = int( work(1) )
284 maxwrk = max( maxwrk, n + lwork_trevc )
285 CALL zhseqr(
'S',
'V', n, 1, n, a, lda, w, vr, ldvr,
288 CALL zhseqr(
'E',
'N', n, 1, n, a, lda, w, vr, ldvr,
291 hswork = int( work(1) )
292 maxwrk = max( maxwrk, hswork, minwrk )
296 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
302 CALL xerbla(
'ZGEEV ', -info )
304 ELSE IF( lquery )
THEN
316 smlnum = dlamch(
'S' )
317 bignum = one / smlnum
318 CALL dlabad( smlnum, bignum )
319 smlnum = sqrt( smlnum ) / eps
320 bignum = one / smlnum
324 anrm = zlange(
'M', n, n, a, lda, dum )
326 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
329 ELSE IF( anrm.GT.bignum )
THEN
334 $
CALL zlascl(
'G', 0, 0, anrm, cscale, n, n, a, lda, ierr )
341 CALL zgebal(
'B', n, a, lda, ilo, ihi, rwork( ibal ), ierr )
349 CALL zgehrd( n, ilo, ihi, a, lda, work( itau ), work( iwrk ),
350 $ lwork-iwrk+1, ierr )
358 CALL zlacpy(
'L', n, n, a, lda, vl, ldvl )
364 CALL zunghr( n, ilo, ihi, vl, ldvl, work( itau ), work( iwrk ),
365 $ lwork-iwrk+1, ierr )
372 CALL zhseqr(
'S',
'V', n, ilo, ihi, a, lda, w, vl, ldvl,
373 $ work( iwrk ), lwork-iwrk+1, info )
381 CALL zlacpy(
'F', n, n, vl, ldvl, vr, ldvr )
384 ELSE IF( wantvr )
THEN
390 CALL zlacpy(
'L', n, n, a, lda, vr, ldvr )
396 CALL zunghr( n, ilo, ihi, vr, ldvr, work( itau ), work( iwrk ),
397 $ lwork-iwrk+1, ierr )
404 CALL zhseqr(
'S',
'V', n, ilo, ihi, a, lda, w, vr, ldvr,
405 $ work( iwrk ), lwork-iwrk+1, info )
414 CALL zhseqr(
'E',
'N', n, ilo, ihi, a, lda, w, vr, ldvr,
415 $ work( iwrk ), lwork-iwrk+1, info )
423 IF( wantvl .OR. wantvr )
THEN
430 CALL ztrevc3( side,
'B',
SELECT, n, a, lda, vl, ldvl, vr, ldvr,
431 $ n, nout, work( iwrk ), lwork-iwrk+1,
432 $ rwork( irwork ), n, ierr )
441 CALL zgebak(
'B',
'L', n, ilo, ihi, rwork( ibal ), n, vl, ldvl,
447 scl = one / dznrm2( n, vl( 1, i ), 1 )
448 CALL zdscal( n, scl, vl( 1, i ), 1 )
450 rwork( irwork+k-1 ) = dble( vl( k, i ) )**2 +
451 $ aimag( vl( k, i ) )**2
453 k = idamax( n, rwork( irwork ), 1 )
454 tmp = conjg( vl( k, i ) ) / sqrt( rwork( irwork+k-1 ) )
455 CALL zscal( n, tmp, vl( 1, i ), 1 )
456 vl( k, i ) = dcmplx( dble( vl( k, i ) ), zero )
466 CALL zgebak(
'B',
'R', n, ilo, ihi, rwork( ibal ), n, vr, ldvr,
472 scl = one / dznrm2( n, vr( 1, i ), 1 )
473 CALL zdscal( n, scl, vr( 1, i ), 1 )
475 rwork( irwork+k-1 ) = dble( vr( k, i ) )**2 +
476 $ aimag( vr( k, i ) )**2
478 k = idamax( n, rwork( irwork ), 1 )
479 tmp = conjg( vr( k, i ) ) / sqrt( rwork( irwork+k-1 ) )
480 CALL zscal( n, tmp, vr( 1, i ), 1 )
481 vr( k, i ) = dcmplx( dble( vr( k, i ) ), zero )
489 CALL zlascl(
'G', 0, 0, cscale, anrm, n-info, 1, w( info+1 ),
490 $ max( n-info, 1 ), ierr )
492 CALL zlascl(
'G', 0, 0, cscale, anrm, ilo-1, 1, w, n, ierr )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
subroutine zscal(N, ZA, ZX, INCX)
ZSCAL
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 zgeev(JOBVL, JOBVR, N, A, LDA, W, VL, LDVL, VR, LDVR, WORK, LWORK, RWORK, INFO)
ZGEEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices
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 ztrevc3(SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, LDVR, MM, M, WORK, LWORK, RWORK, LRWORK, INFO)
ZTREVC3
subroutine zunghr(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
ZUNGHR