215 SUBROUTINE cggev( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
216 $ VL, LDVL, VR, LDVR, WORK, LWORK, RWORK, INFO )
223 CHARACTER JOBVL, JOBVR
224 INTEGER INFO, LDA, LDB, LDVL, LDVR, LWORK, N
228 COMPLEX A( LDA, * ), ALPHA( * ), B( LDB, * ),
229 $ beta( * ), vl( ldvl, * ), vr( ldvr, * ),
237 parameter( zero = 0.0e0, one = 1.0e0 )
239 parameter( czero = ( 0.0e0, 0.0e0 ),
240 $ cone = ( 1.0e0, 0.0e0 ) )
243 LOGICAL ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
245 INTEGER ICOLS, IERR, IHI, IJOBVL, IJOBVR, , ILO,
248 REAL ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
267 INTRINSIC abs, aimag,
max, real, sqrt
273 abs1( x ) = abs( real( x ) ) + abs( aimag( x ) )
279 IF( lsame( jobvl,
'N' ) )
THEN
282 ELSE IF( lsame( jobvl,
'V' ) )
THEN
290 IF( lsame( jobvr,
'N' ) )
THEN
293 ELSE IF( lsame( jobvr,
'V' ) )
THEN
305 lquery = ( lwork.EQ.-1 )
306 IF( ijobvl.LE.0 )
THEN
308 ELSE IF( ijobvr.LE.0 )
THEN
310 ELSE IF( n.LT.0 )
THEN
312 ELSE IF( lda.LT.
max( 1, n ) )
THEN
314 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
316 ELSE IF( ldvl.LT.1 .OR. ( ilvl .AND. ldvl.LT.n ) )
THEN
318 ELSE IF( ldvr.LT.1 .OR. ( ilvr .AND. ldvr.LT.n ) )
THEN
331 lwkmin =
max( 1, 2*n )
332 lwkopt =
max( 1, n + n*ilaenv( 1, '
cgeqrf', ' ', N, 1, N, 0 ) )
333 LWKOPT = MAX( LWKOPT, N +
334 $ N*ILAENV( 1, 'cunmqr',
' ', n, 1, n, 0 ) )
336 lwkopt =
max( lwkopt, n +
337 $ n*ilaenv( 1,
'CUNGQR',
' ', n, 1, n, -1 ) )
341 IF( lwork.LT.lwkmin .AND. .NOT.lquery )
346 CALL xerbla(
'CGGEV ', -info )
348 ELSE IF( lquery )
THEN
359 eps = slamch( 'e
' )*SLAMCH( 'b
' )
360 SMLNUM = SLAMCH( 's
' )
361 BIGNUM = ONE / SMLNUM
362 CALL SLABAD( SMLNUM, BIGNUM )
363 SMLNUM = SQRT( SMLNUM ) / EPS
364 BIGNUM = ONE / SMLNUM
368 ANRM = CLANGE( 'm
', N, N, A, LDA, RWORK )
370.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
373.GT.
ELSE IF( ANRMBIGNUM ) THEN
378 $ CALL CLASCL( 'g
', 0, 0, ANRM, ANRMTO, N, N, A, LDA, IERR )
382 BNRM = CLANGE( 'm
', N, N, B, LDB, RWORK )
384.GT..AND..LT.
IF( BNRMZERO BNRMSMLNUM ) THEN
387.GT.
ELSE IF( BNRMBIGNUM ) THEN
392 $ CALL CLASCL( 'g
', 0, 0, BNRM, BNRMTO, N, N, B, LDB, IERR )
400 CALL CGGBAL( 'p
', N, A, LDA, B, LDB, ILO, IHI, RWORK( ILEFT ),
401 $ RWORK( IRIGHT ), RWORK( IRWRK ), IERR )
406 IROWS = IHI + 1 - ILO
414 CALL CGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
415 $ WORK( IWRK ), LWORK+1-IWRK, IERR )
420 CALL CUNMQR( 'l
', 'c
', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
421 $ WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWRK ),
422 $ LWORK+1-IWRK, IERR )
428 CALL CLASET( 'full
', N, N, CZERO, CONE, VL, LDVL )
429.GT.
IF( IROWS1 ) THEN
430 CALL CLACPY( 'l
', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
431 $ VL( ILO+1, ILO ), LDVL )
433 CALL CUNGQR( IROWS, IROWS, IROWS, VL( ILO, ILO ), LDVL,
434 $ WORK( ITAU ), WORK( IWRK ), LWORK+1-IWRK, IERR )
440 $ CALL CLASET( 'full
', N, N, CZERO, CONE, VR, LDVR )
448 CALL CGGHRD( JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB, VL,
449 $ LDVL, VR, LDVR, IERR )
451 CALL CGGHRD( 'n
', 'n
', IROWS, 1, IROWS, A( ILO, ILO ), LDA,
452 $ B( ILO, ILO ), LDB, VL, LDVL, VR, LDVR, IERR )
466 CALL CHGEQZ( CHTEMP, JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB,
467 $ ALPHA, BETA, VL, LDVL, VR, LDVR, WORK( IWRK ),
468 $ LWORK+1-IWRK, RWORK( IRWRK ), IERR )
470.GT..AND..LE.
IF( IERR0 IERRN ) THEN
472.GT..AND..LE.
ELSE IF( IERRN IERR2*N ) THEN
495 CALL CTGEVC( CHTEMP, 'b
', LDUMMA, N, A, LDA, B, LDB, VL, LDVL,
496 $ VR, LDVR, N, IN, WORK( IWRK ), RWORK( IRWRK ),
507 CALL CGGBAK( 'p
', 'l
', N, ILO, IHI, RWORK( ILEFT ),
508 $ RWORK( IRIGHT ), N, VL, LDVL, IERR )
512 TEMP = MAX( TEMP, ABS1( VL( JR, JC ) ) )
518 VL( JR, JC ) = VL( JR, JC )*TEMP
523 CALL CGGBAK( 'p
', 'r
', N, ILO, IHI, RWORK( ILEFT ),
524 $ RWORK( IRIGHT ), N, VR, LDVR, IERR )
528 TEMP = MAX( TEMP, ABS1( VR( JR, JC ) ) )
534 VR( JR, JC ) = VR( JR, JC )*TEMP
545 $ CALL CLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHA, N, IERR )
548 $ CALL CLASCL( 'g
', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
subroutine slabad(small, large)
SLABAD
subroutine xerbla(srname, info)
XERBLA
subroutine cggbak(job, side, n, ilo, ihi, lscale, rscale, m, v, ldv, info)
CGGBAK
subroutine cggbal(job, n, a, lda, b, ldb, ilo, ihi, lscale, rscale, work, info)
CGGBAL
subroutine cgeqrf(m, n, a, lda, tau, work, lwork, info)
CGEQRF
subroutine ctgevc(side, howmny, select, n, s, lds, p, ldp, vl, ldvl, vr, ldvr, mm, m, work, rwork, info)
CTGEVC
subroutine chgeqz(job, compq, compz, n, ilo, ihi, h, ldh, t, ldt, alpha, beta, q, ldq, z, ldz, work, lwork, rwork, info)
CHGEQZ
subroutine cggev(jobvl, jobvr, n, a, lda, b, ldb, alpha, beta, vl, ldvl, vr, ldvr, work, lwork, rwork, info)
CGGEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices
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 claset(uplo, m, n, alpha, beta, a, lda)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine cunmqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
CUNMQR
subroutine cgghrd(compq, compz, n, ilo, ihi, a, lda, b, ldb, q, ldq, z, ldz, info)
CGGHRD
subroutine cungqr(m, n, k, a, lda, tau, work, lwork, info)
CUNGQR
subroutine jc(p, t, a, b, cm, cn, tref, tm, epsm, sigmam, jc_yield, tan_jc)