190 SUBROUTINE dgeev( JOBVL, JOBVR, N, A, LDA, WR, WI, VL, LDVL, VR,
191 $ LDVR, WORK, LWORK, INFO )
200 INTEGER , LDA, LDVL, LDVR, LWORK, N
203 DOUBLE PRECISION A( LDA, * ), ( LDVL, * ), VR( LDVR, * ),
204 $ wi( * ), work( * ), wr( * )
210 DOUBLE PRECISION ZERO, ONE
211 parameter( zero = 0.0d0, one = 1.0d0 )
214 LOGICAL LQUERY, SCALEA, WANTVL, WANTVR
216 INTEGER HSWORK, I, IBAL, IERR, IHI, ILO, ITAU, IWRK, K,
217 $ lwork_trevc, maxwrk, minwrk, nout
218 DOUBLE PRECISION ANRM, BIGNUM, CS, CSCALE, EPS, R, SCL, SMLNUM,
223 DOUBLE PRECISION DUM( 1 )
232 INTEGER IDAMAX, ILAENV
233 DOUBLE PRECISION DLAMCH, DLANGE, DLAPY2, DNRM2
234 EXTERNAL lsame, idamax, ilaenv, dlamch, dlange, dlapy2,
245 lquery = ( lwork.EQ.-1 )
246 wantvl = lsame( jobvl,
'V' )
247 wantvr = lsame( jobvr, 'v
' )
248.NOT..AND..NOT.
IF( ( WANTVL ) ( LSAME( JOBVL, 'n
' ) ) ) THEN
250.NOT..AND..NOT.
ELSE IF( ( WANTVR ) ( LSAME( JOBVR, 'n
' ) ) ) THEN
252.LT.
ELSE IF( N0 ) THEN
254.LT.
ELSE IF( LDAMAX( 1, N ) ) THEN
256.LT..OR..AND..LT.
ELSE IF( LDVL1 ( WANTVL LDVLN ) ) THEN
258.LT..OR..AND..LT.
ELSE IF( LDVR1 ( WANTVR LDVRN ) ) THEN
277 MAXWRK = 2*N + N*ILAENV( 1, 'dgehrd', ' ', N, 1, N, 0 )
280 MAXWRK = MAX( MAXWRK, 2*N + ( N - 1 )*ILAENV( 1,
281 $ 'dorghr', ' ', n, 1, n, -1 ) )
282 CALL dhseqr(
'S',
'V', n, 1, n, a, lda, wr, wi, vl, ldvl,
284 hswork = int( work(1) )
285 maxwrk =
max( maxwrk, n + 1, n + hswork )
286 CALL dtrevc3(
'L',
'B',
SELECT, n, a, lda,
287 $ vl, ldvl, vr, ldvr, n, nout,
289 lwork_trevc = int( work(1) )
290 maxwrk =
max( maxwrk, n + lwork_trevc )
291 maxwrk =
max( maxwrk, 4*n )
292 ELSE IF( wantvr )
THEN
295 $
'DORGHR',
' ', n, 1, n, -1 ) )
296 CALL dhseqr(
'S',
'V', n, 1, n, a, lda, wr, wi, vr, ldvr,
298 hswork = int( work(1) )
299 maxwrk =
max( maxwrk, n
300 CALL dtrevc3(
'R',
'B',
SELECT, n, a, lda,
301 $ vl, ldvl, vr, ldvr, n, nout,
303 lwork_trevc = int( work(1) )
304 maxwrk =
max( maxwrk, n + lwork_trevc )
308 CALL dhseqr(
'E',
'N', n, 1, n, a, lda, wr, wi, vr, ldvr
310 hswork = int( work(1) )
311 maxwrk =
max( maxwrk, n + 1, n + hswork )
313 maxwrk =
max( maxwrk, minwrk )
317 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
323 CALL xerbla(
'DGEEV ', -info )
325 ELSE IF( lquery )
THEN
337 smlnum = dlamch( 's
' )
338 BIGNUM = ONE / SMLNUM
339 CALL DLABAD( SMLNUM, BIGNUM )
340 SMLNUM = SQRT( SMLNUM ) / EPS
341 BIGNUM = ONE / SMLNUM
345 ANRM = DLANGE( 'm
', N, N, A, LDA, DUM )
347.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
350.GT.
ELSE IF( ANRMBIGNUM ) THEN
355 $ CALL DLASCL( 'g
', 0, 0, ANRM, CSCALE, N, N, A, LDA, IERR )
361 CALL DGEBAL( 'b
', N, A, LDA, ILO, IHI, WORK( IBAL ), IERR )
368 CALL DGEHRD( N, ILO, IHI, A, LDA, WORK( ITAU ), WORK( IWRK ),
369 $ LWORK-IWRK+1, IERR )
377 CALL DLACPY( 'l
', N, N, A, LDA, VL, LDVL )
382 CALL DORGHR( N, ILO, IHI, VL, LDVL, WORK( ITAU ), WORK( IWRK ),
383 $ LWORK-IWRK+1, IERR )
389 CALL DHSEQR( 's
', 'v
', N, ILO, IHI, A, LDA, WR, WI, VL, LDVL,
390 $ WORK( IWRK ), LWORK-IWRK+1, INFO )
398 CALL DLACPY( 'f
', N, N, VL, LDVL, VR, LDVR )
401 ELSE IF( WANTVR ) THEN
407 CALL DLACPY( 'l
', N, N, A, LDA, VR, LDVR )
412 CALL DORGHR( N, ILO, IHI, VR, LDVR, WORK( ITAU ), WORK( IWRK ),
413 $ LWORK-IWRK+1, IERR )
419 CALL DHSEQR( 's
', 'v
', N, ILO, IHI, A, LDA, WR, WI, VR, LDVR,
420 $ WORK( IWRK ), LWORK-IWRK+1, INFO )
428 CALL DHSEQR( 'e
', 'n
', N, ILO, IHI, A, LDA, WR, WI, VR, LDVR,
429 $ WORK( IWRK ), LWORK-IWRK+1, INFO )
437.OR.
IF( WANTVL WANTVR ) THEN
442 CALL DTREVC3( SIDE, 'b
', SELECT, N, A, LDA, VL, LDVL, VR, LDVR,
443 $ N, NOUT, WORK( IWRK ), LWORK-IWRK+1, IERR )
451 CALL DGEBAK( 'b
', 'l
', N, ILO, IHI, WORK( IBAL ), N, VL, LDVL,
457.EQ.
IF( WI( I )ZERO ) THEN
458 SCL = ONE / DNRM2( N, VL( 1, I ), 1 )
459 CALL DSCAL( N, SCL, VL( 1, I ), 1 )
460.GT.
ELSE IF( WI( I )ZERO ) THEN
461 SCL = ONE / DLAPY2( DNRM2( N, VL( 1, I ), 1 ),
462 $ DNRM2( N, VL( 1, I+1 ), 1 ) )
463 CALL DSCAL( N, SCL, VL( 1, I ), 1 )
464 CALL DSCAL( N, SCL, VL( 1, I+1 ), 1 )
466 WORK( IWRK+K-1 ) = VL( K, I )**2 + VL( K, I+1 )**2
468 K = IDAMAX( N, WORK( IWRK ), 1 )
469 CALL DLARTG( VL( K, I ), VL( K, I+1 ), CS, SN, R )
470 CALL DROT( N, VL( 1, I ), 1, VL( 1, I+1 ), 1, CS, SN )
481 CALL DGEBAK( 'b
', 'r
', N, ILO, IHI, WORK( IBAL ), N, VR, LDVR,
487.EQ.
IF( WI( I )ZERO ) THEN
488 SCL = ONE / DNRM2( N, VR( 1, I ), 1 )
489 CALL DSCAL( N, SCL, VR( 1, I ), 1 )
490.GT.
ELSE IF( WI( I )ZERO ) THEN
491 SCL = ONE / DLAPY2( DNRM2( N, VR( 1, I ), 1 ),
492 $ DNRM2( N, VR( 1, I+1 ), 1 ) )
493 CALL DSCAL( N, SCL, VR( 1, I ), 1 )
494 CALL DSCAL( N, SCL, VR( 1, I+1 ), 1 )
496 WORK( IWRK+K-1 ) = VR( K, I )**2 + VR( K, I+1 )**2
498 K = IDAMAX( N, WORK( IWRK ), 1 )
499 CALL DLARTG( VR( K, I ), VR( K, I+1 ), CS, SN, R )
500 CALL DROT( N, VR( 1, I ), 1, VR( 1, I+1 ), 1, CS, SN )
510 CALL DLASCL( 'g
', 0, 0, CSCALE, ANRM, N-INFO, 1, WR( INFO+1 ),
511 $ MAX( N-INFO, 1 ), IERR )
512 CALL DLASCL( 'g
', 0, 0, CSCALE, ANRM, N-INFO, 1, WI( INFO+1 ),
513 $ MAX( N-INFO, 1 ), IERR )
515 CALL DLASCL( 'g
', 0, 0, CSCALE, ANRM, ILO-1, 1, WR, N,
517 CALL DLASCL( 'g
', 0, 0, CSCALE, ANRM, ILO-1, 1, WI, N,
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 dgeev(jobvl, jobvr, n, a, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info)
DGEEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices
subroutine dhseqr(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, work, lwork, info)
DHSEQR
subroutine dtrevc3(side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, mm, m, work, lwork, info)
DTREVC3