214 SUBROUTINE cggev3( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
215 $ VL, LDVL, VR, LDVR, WORK, LWORK, RWORK, INFO )
222 CHARACTER JOBVL, JOBVR
223 INTEGER INFO, LDA, LDB, LDVL, LDVR, LWORK, N
227 COMPLEX A( LDA, * ), ALPHA( * ), B( LDB, * ),
228 $ beta( * ), vl( ldvl, * ), vr( ldvr, * ),
236 parameter( zero = 0.0e0, one = 1.0e0 )
238 parameter( czero = ( 0.0e0, 0.0e0 ),
239 $ cone = ( 1.0e0, 0.0e0 ) )
242 LOGICAL ILASCL, ILBSCL, ILV, ILVL, ILVR, LQUERY
244 INTEGER ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT, ILO,
245 $ in, iright, irows, irwrk, itau, iwrk,
jc, jr,
247 REAL ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS,
262 EXTERNAL lsame, clange, slamch
265 INTRINSIC abs, aimag,
max, real, sqrt
271 abs1( x ) = abs( real( x ) ) + abs( aimag( x ) )
277 IF( lsame( jobvl,
'N' ) )
THEN
280 ELSE IF( lsame( jobvl,
'V' ) )
THEN
288 IF( lsame( jobvr,
'N' ) )
THEN
291 ELSE IF( lsame( jobvr,
'V' ) )
THEN
303 lquery = ( lwork.EQ.-1 )
304 IF( ijobvl.LE.0 )
THEN
308 ELSE IF( n.LT.0 )
THEN
310 ELSE IF( lda.LT.
max( 1, n ) )
THEN
312 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
314 ELSE IF( ldvl.LT.
THEN
316 ELSE IF( ldvr.LT.1 .OR. ( ilvr .AND. ldvr.LT.n ) )
THEN
318 ELSE IF( lwork.LT.
max( 1, 2*n ) .AND. .NOT.lquery )
THEN
325 CALL cgeqrf( n, n, b, ldb, work, work, -1, ierr )
326 lwkopt =
max( n, n+int( work( 1 ) ) )
327 CALL cunmqr(
'L',
'C', n, n, n, b, ldb, work, a, lda, work,
329 lwkopt =
max( lwkopt, n+int( work( 1 ) ) )
331 CALL cungqr( n, n, n, vl, ldvl, work, work, -1, ierr )
332 lwkopt =
max( lwkopt, n+int( work( 1 ) ) )
335 CALL cgghd3( jobvl, jobvr, n, 1, n, a, lda, b, ldb, vl,
336 $ ldvl, vr, ldvr, work, -1, ierr )
337 lwkopt =
max( lwkopt, n+int( work( 1 ) ) )
338 CALL claqz0(
'S', jobvl, jobvr, n, 1, n, a, lda, b, ldb,
339 $ alpha, beta, vl, ldvl, vr, ldvr, work, -1,
341 lwkopt =
max( lwkopt, n+int( work( 1 ) ) )
343 CALL cgghd3(
'N',
'N', n, 1, n, a, lda, b, ldb, vl, ldvl,
344 $ vr, ldvr, work, -1, ierr )
345 lwkopt =
max( lwkopt, n+int( work( 1 ) ) )
346 CALL claqz0( 'e
', JOBVL, JOBVR, N, 1, N, A, LDA, B, LDB,
347 $ ALPHA, BETA, VL, LDVL, VR, LDVR, WORK, -1,
349 LWKOPT = MAX( LWKOPT, N+INT( WORK( 1 ) ) )
351 WORK( 1 ) = CMPLX( LWKOPT )
355 CALL XERBLA( 'cggev3 ', -INFO )
357 ELSE IF( LQUERY ) THEN
368 EPS = SLAMCH( 'e
' )*SLAMCH( 'b
' )
369 SMLNUM = SLAMCH( 's
' )
370 BIGNUM = ONE / SMLNUM
371 CALL SLABAD( SMLNUM, BIGNUM )
372 SMLNUM = SQRT( SMLNUM ) / EPS
373 BIGNUM = ONE / SMLNUM
377 ANRM = CLANGE( 'm
', N, N, A, LDA, RWORK )
379.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
382.GT.
ELSE IF( ANRMBIGNUM ) THEN
387 $ CALL CLASCL( 'g
', 0, 0, ANRM, ANRMTO, N, N, A, LDA, IERR )
391 BNRM = CLANGE( 'm
', N, N, B, LDB, RWORK )
393.GT..AND..LT.
IF( BNRMZERO BNRMSMLNUM ) THEN
396.GT.
ELSE IF( BNRMBIGNUM ) THEN
401 $ CALL CLASCL( 'g
', 0, 0, BNRM, BNRMTO, N, N, B, LDB, IERR )
408 CALL CGGBAL( 'p
', N, A, LDA, B, LDB, ILO, IHI, RWORK( ILEFT ),
409 $ RWORK( IRIGHT ), RWORK( IRWRK ), IERR )
413 IROWS = IHI + 1 - ILO
421 CALL CGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
422 $ WORK( IWRK ), LWORK+1-IWRK, IERR )
426 CALL CUNMQR( 'l
', 'c
', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
427 $ WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWRK ),
428 $ LWORK+1-IWRK, IERR )
433 CALL CLASET( 'full
', N, N, CZERO, CONE, VL, LDVL )
434.GT.
IF( IROWS1 ) THEN
435 CALL CLACPY( 'l
', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
436 $ VL( ILO+1, ILO ), LDVL )
438 CALL CUNGQR( IROWS, IROWS, IROWS, VL( ILO, ILO ), LDVL,
439 $ WORK( ITAU ), WORK( IWRK ), LWORK+1-IWRK, IERR )
445 $ CALL CLASET( 'full
', N, N, CZERO, CONE, VR, LDVR )
453 CALL CGGHD3( JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB, VL,
454 $ LDVL, VR, LDVR, WORK( IWRK ), LWORK+1-IWRK,
457 CALL CGGHD3( 'n
', 'n
', IROWS, 1, IROWS, A( ILO, ILO ), LDA,
458 $ B( ILO, ILO ), LDB, VL, LDVL, VR, LDVR,
459 $ WORK( IWRK ), LWORK+1-IWRK, IERR )
471 CALL CLAQZ0( CHTEMP, JOBVL, JOBVR, N, ILO, IHI, A, LDA, B, LDB,
472 $ ALPHA, BETA, VL, LDVL, VR, LDVR, WORK( IWRK ),
473 $ LWORK+1-IWRK, RWORK( IRWRK ), 0, IERR )
475.GT..AND..LE.
IF( IERR0 IERRN ) THEN
477.GT..AND..LE.
ELSE IF( IERRN IERR2*N ) THEN
498 CALL CTGEVC( CHTEMP, 'b
', LDUMMA, N, A, LDA, B, LDB, VL, LDVL,
499 $ VR, LDVR, N, IN, WORK( IWRK ), RWORK( IRWRK ),
509 CALL CGGBAK( 'p
', 'l
', N, ILO, IHI, RWORK( ILEFT ),
510 $ RWORK( IRIGHT ), N, VL, LDVL, IERR )
514 TEMP = MAX( TEMP, ABS1( VL( JR, JC ) ) )
520 VL( JR, JC ) = VL( JR, JC )*TEMP
525 CALL CGGBAK( 'p
', 'r
', N, ILO, IHI, RWORK( ILEFT ),
526 $ RWORK( IRIGHT ), N, VR, LDVR, IERR )
530 TEMP = MAX( TEMP, ABS1( VR( JR, JC ) ) )
536 VR( JR, JC ) = VR( JR, JC )*TEMP
547 $ CALL CLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHA, N, IERR )
550 $ CALL CLASCL( 'g
', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
552 WORK( 1 ) = CMPLX( LWKOPT )
recursive subroutine claqz0(wants, wantq, wantz, n, ilo, ihi, a, lda, b, ldb, alpha, beta, q, ldq, z, ldz, work, lwork, rwork, rec, info)
CLAQZ0
subroutine cggev3(jobvl, jobvr, n, a, lda, b, ldb, alpha, beta, vl, ldvl, vr, ldvr, work, lwork, rwork, info)
CGGEV3 computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices (...