294 SUBROUTINE cdrgvx( NSIZE, THRESH, NIN, NOUT, A, LDA, B, AI, BI,
295 $ ALPHA, BETA, VL, VR, ILO, IHI, LSCALE, RSCALE,
296 $ S, STRU, DIF, DIFTRU, WORK, LWORK, RWORK,
297 $ IWORK, LIWORK, RESULT, BWORK, INFO )
304 INTEGER IHI, ILO, , LDA, LIWORK, LWORK, NIN, NOUT,
311 REAL DIF( * ), DIFTRU( * ), LSCALE( * ),
312 $ result( 4 ), rscale( * ), rwork( * ), s( * ),
314 COMPLEX A( LDA, * ), AI( LDA, * ), ALPHA( * ),
315 $ B( LDA, * ), BETA( * ), BI( LDA, * ),
316 $ VL( LDA, * ), VR( LDA, * ), WORK( * )
323 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0, ten = 1.0e+1,
324 $ tnth = 1.0e-1, half = 0.5e+0 )
327 INTEGER I, IPTYPE, IWA, IWB, IWX, IWY, J, LINFO,
328 $ MAXWRK, MINWRK, N, NERRS, NMAX, NPTKNT, NTESTT
329 REAL , ANORM, BNORM, RATIO1, RATIO2, THRSH2,
338 EXTERNAL ILAENV, CLANGE, SLAMCH
354 IF( nsize.LT.0 )
THEN
356 ELSE IF( thresh.LT.zero )
THEN
358 ELSE IF( nin.LE.0 )
THEN
360 ELSE IF( nout.LE.0 )
THEN
362 ELSE IF( lda.LT.1 .OR. lda.LT.nmax )
THEN
364 ELSE IF( liwork.LT.nmax+2 )
THEN
376 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
377 minwrk = 2*nmax*( nmax+1 )
378 maxwrk = nmax*( 1+ilaenv( 1,
'CGEQRF',
' ', nmax, 1, nmax,
380 maxwrk =
max( maxwrk, 2*nmax*( nmax+1 ) )
384 IF( lwork.LT.minwrk )
388 CALL xerbla(
'CDRGVX', -info )
405 weight( 1 ) =
cmplx( tnth, zero )
406 weight( 2 ) =
cmplx( half, zero )
408 weight( 4 ) = one / weight( 2 )
409 weight( 5 ) = one / weight( 1 )
419 CALL clatm6( iptype, 5, a, lda, b, vr, lda, vl,
420 $ lda, weight( iwa ), weight( iwb ),
421 $ weight( iwx ), weight( iwy ), stru,
428 CALL clacpy(
'F', n, n, a, lda, ai, lda )
429 CALL clacpy(
'F', n, n, b, lda, bi, lda )
431 CALL cggevx(
'N',
'V',
'V',
'B', n, ai, lda, bi,
432 $ lda, alpha, beta, vl, lda, vr, lda,
433 $ ilo, ihi, lscale, rscale, anorm,
434 $ bnorm, s, dif, work, lwork, rwork,
435 $ iwork, bwork, linfo )
436 IF( linfo.NE.0 )
THEN
437 WRITE( nout, fmt = 9999 )
'CGGEVX', linfo, n,
438 $ iptype, iwa, iwb, iwx, iwy
444 CALL clacpy(
'Full', n, n, ai, lda, work, n )
445 CALL clacpy(
'Full', n, n, bi, lda, work( n*n+1 ),
447 abnorm = clange(
'Fro', n, 2*n, work, n, rwork )
452 CALL cget52( .true., n, a, lda, b, lda, vl, lda,
453 $ alpha, beta, work, rwork,
455 IF( result( 2 ).GT.thresh )
THEN
456 WRITE( nout, fmt = 9998 )
'Left',
'CGGEVX',
457 $ result( 2 ), n, iptype, iwa, iwb, iwx, iwy
461 CALL cget52( .false., n, a, lda, b, lda, vr, lda,
462 $ alpha, beta, work, rwork,
464 IF( result( 3 ).GT.thresh )
THEN
465 WRITE( nout, fmt = 9998 )
'Right',
'CGGEVX',
466 $ result( 3 ), n, iptype, iwa, iwb, iwx, iwy
473 IF( s( i ).EQ.zero )
THEN
474 IF( stru( i ).GT.abnorm*ulp )
475 $ result( 3 ) = ulpinv
476 ELSE IF( stru( i ).EQ.zero )
THEN
477 IF( s( i ).GT.abnorm*ulp )
478 $ result( 3 ) = ulpinv
480 rwork( i ) =
max( abs( stru( i ) / s( i ) ),
481 $ abs( s( i ) / stru( i ) ) )
482 result( 3 ) =
max( result( 3 ), rwork( i ) )
489 IF( dif( 1 ).EQ.zero )
THEN
490 IF( diftru( 1 ).GT.abnorm*ulp )
491 $ result( 4 ) = ulpinv
492 ELSE IF( diftru( 1 ).EQ.zero )
THEN
493 IF( dif( 1 ).GT.abnorm*ulp )
494 $ result( 4 ) = ulpinv
495 ELSE IF( dif( 5 ).EQ.zero )
THEN
496 IF( diftru( 5 ).GT.abnorm*ulp )
497 $ result( 4 ) = ulpinv
498 ELSE IF( diftru( 5 ).EQ.zero )
THEN
499 IF( dif( 5 ).GT.abnorm*ulp )
500 $ result( 4 ) = ulpinv
502 ratio1 =
max( abs( diftru( 1 ) / dif( 1 ) ),
503 $ abs( dif( 1 ) / diftru( 1 ) ) )
504 ratio2 =
max( abs( diftru( 5 ) / dif( 5 ) ),
505 $ abs( dif( 5 ) / diftru( 5 ) ) )
506 result( 4 ) =
max( ratio1, ratio2 )
514 IF( ( result( j ).GE.thrsh2 .AND. j.GE.4 ) .OR.
515 $ ( result( j ).GE.thresh .AND. j.LE.3 ) )
521 IF( nerrs.EQ.0 )
THEN
522 WRITE( nout, fmt = 9997 )
'CXV'
528 WRITE( nout, fmt = 9995 )
529 WRITE( nout, fmt = 9994 )
530 WRITE( nout, fmt = 9993 )
534 WRITE( nout, fmt = 9992 )'
''',
539.LT.
IF( RESULT( J )10000.0 ) THEN
540 WRITE( NOUT, FMT = 9991 )IPTYPE, IWA,
541 $ IWB, IWX, IWY, J, RESULT( J )
543 WRITE( NOUT, FMT = 9990 )IPTYPE, IWA,
544 $ IWB, IWX, IWY, J, RESULT( J )
564 READ( NIN, FMT = *, END = 150 )N
568 READ( NIN, FMT = * )( A( I, J ), J = 1, N )
571 READ( NIN, FMT = * )( B( I, J ), J = 1, N )
573 READ( NIN, FMT = * )( STRU( I ), I = 1, N )
574 READ( NIN, FMT = * )( DIFTRU( I ), I = 1, N )
582 CALL CLACPY( 'f
', N, N, A, LDA, AI, LDA )
583 CALL CLACPY( 'f
', N, N, B, LDA, BI, LDA )
585 CALL CGGEVX( 'n
', 'v
', 'v
', 'b
', N, AI, LDA, BI, LDA, ALPHA, BETA,
586 $ VL, LDA, VR, LDA, ILO, IHI, LSCALE, RSCALE, ANORM,
587 $ BNORM, S, DIF, WORK, LWORK, RWORK, IWORK, BWORK,
590.NE.
IF( LINFO0 ) THEN
591 WRITE( NOUT, FMT = 9987 )'cggevx', LINFO, N, NPTKNT
597 CALL CLACPY( 'full
', N, N, AI, LDA, WORK, N )
598 CALL CLACPY( 'full
', N, N, BI, LDA, WORK( N*N+1 ), N )
599 ABNORM = CLANGE( 'fro
', N, 2*N, WORK, N, RWORK )
604 CALL CGET52( .TRUE., N, A, LDA, B, LDA, VL, LDA, ALPHA, BETA,
605 $ WORK, RWORK, RESULT( 1 ) )
606.GT.
IF( RESULT( 2 )THRESH ) THEN
607 WRITE( NOUT, FMT = 9986 )'left
', 'cggevx', RESULT( 2 ), N,
612 CALL CGET52( .FALSE., N, A, LDA, B, LDA, VR, LDA, ALPHA, BETA,
613 $ WORK, RWORK, RESULT( 2 ) )
614.GT.
IF( RESULT( 3 )THRESH ) THEN
615 WRITE( NOUT, FMT = 9986 )'right
', 'cggevx', RESULT( 3 ), N,
623.EQ.
IF( S( I )ZERO ) THEN
624.GT.
IF( STRU( I )ABNORM*ULP )
625 $ RESULT( 3 ) = ULPINV
626.EQ.
ELSE IF( STRU( I )ZERO ) THEN
627.GT.
IF( S( I )ABNORM*ULP )
628 $ RESULT( 3 ) = ULPINV
630 RWORK( I ) = MAX( ABS( STRU( I ) / S( I ) ),
631 $ ABS( S( I ) / STRU( I ) ) )
632 RESULT( 3 ) = MAX( RESULT( 3 ), RWORK( I ) )
639.EQ.
IF( DIF( 1 )ZERO ) THEN
640.GT.
IF( DIFTRU( 1 )ABNORM*ULP )
641 $ RESULT( 4 ) = ULPINV
642.EQ.
ELSE IF( DIFTRU( 1 )ZERO ) THEN
643.GT.
IF( DIF( 1 )ABNORM*ULP )
644 $ RESULT( 4 ) = ULPINV
645.EQ.
ELSE IF( DIF( 5 )ZERO ) THEN
646.GT.
IF( DIFTRU( 5 )ABNORM*ULP )
647 $ RESULT( 4 ) = ULPINV
648.EQ.
ELSE IF( DIFTRU( 5 )ZERO ) THEN
649.GT.
IF( DIF( 5 )ABNORM*ULP )
650 $ RESULT( 4 ) = ULPINV
652 RATIO1 = MAX( ABS( DIFTRU( 1 ) / DIF( 1 ) ),
653 $ ABS( DIF( 1 ) / DIFTRU( 1 ) ) )
654 RATIO2 = MAX( ABS( DIFTRU( 5 ) / DIF( 5 ) ),
655 $ ABS( DIF( 5 ) / DIFTRU( 5 ) ) )
656 RESULT( 4 ) = MAX( RATIO1, RATIO2 )
664.GE.
IF( RESULT( J )THRSH2 ) THEN
669.EQ.
IF( NERRS0 ) THEN
670 WRITE( NOUT, FMT = 9997 )'cxv
'
676 WRITE( NOUT, FMT = 9996 )
680 WRITE( NOUT, FMT = 9992 )'''', 'transpose
', ''''
684.LT.
IF( RESULT( J )10000.0 ) THEN
685 WRITE( NOUT, FMT = 9989 )NPTKNT, N, J, RESULT( J )
687 WRITE( NOUT, FMT = 9988 )NPTKNT, N, J, RESULT( J )
699 CALL ALASVM( 'cxv
', NOUT, NERRS, NTESTT, 0 )
705 9999 FORMAT( ' cdrgvx: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
706 $ i6,
', JTYPE=', i6,
')' )
708 9998
FORMAT(
' CDRGVX: ', a,
' Eigenvectors from ', a,
' incorrectly ',
709 $
'normalized.', /
' Bits of error='',', 9x
710 $
'N=', i6,
', JTYPE=', i6,
', IWA=', i5,
', IWB=', i5,
711 $
', IWX=', i5,
', IWY=', i5 )
713 9997
FORMAT( / 1x, a3,
' -- Complex Expert Eigenvalue/vector',
716 9996
FORMAT(
'Input Example' )
718 9995
FORMAT(
' Matrix types: ', / )
720 9994
FORMAT(
' TYPE 1: Da is diagonal, Db is identity, ',
721 $ / ' a = y^(-h) da x^(-1), b = y^(-h) db x^(-1)
',
722 $ / ' yh and x are left and right eigenvectors.
', / )
724 9993 FORMAT( ' TYPE 2: da is quasi-diagonal, db is identity,
',
725 $ / ' a = y^(-h) da x^(-1), b = y^(-h) db x^(-1)
',
726 $ / ' yh and x are left and right eigenvectors.
', / )
728 9992 FORMAT( / ' tests performed:
', / 4X,
729 $ ' a is alpha
', / 4X,
730 $ ' r is a right eigenvector and
', A, '', A, '.
',
731 $ / ' 1 =
max | ( b a - a b )
', A, ' l | / const.
',
732 $ / ' 2 =
max | ( b a - a b ) r | / const.
',
733 $ / ' 3 =
max( sest/stru, stru/sest )
',
734 $ ' over all eigenvalues
', /
735 $ ' 4 =
max( difest/diftru, diftru/difest )
',
736 $ ' over
the 1st and 5th eigenvectors
', / )
738 9991 FORMAT( ' type=
', I2, ',
', ' iwa=
', I2, ', iwb=
', I2, ', iwx=
',
739 $ I2, ', iwy=
', I2, ', result
', I2, ' is
', 0P, F8.2 )
741 9990 FORMAT( ' type=
', I2, ',
', ' iwa=
', I2, ', iwb=
', I2, ', iwx=
',
742 $ I2, ', iwy=
', I2, ', result
', I2, ' is
', 1P, E10.3 )
744 9989 FORMAT( ' input example
#', I2, ', matrix order=', I4, ',',
745 $
' result ', i2,
' is', 0p, f8.2 )
747 9988
FORMAT(
' Input example #', i2,
', matrix order=', i4,
',',
748 $
' result ', i2,
' is', 1p, e10.3 )
750 9987
FORMAT(
' CDRGVX: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
751 $ i6,
', Input example #', i2,
')' )
753 9986
FORMAT(
' CDRGVX: ', a,
' Eigenvectors from ', a,
' incorrectly ',
754 $
'normalized.', /
' Bits of error=', 0p, g10.3,
',', 9x,
755 $
'N=', i6,
', Input Example #', i2,
')' )
subroutine cggevx(balanc, jobvl, jobvr, sense, n, a, lda, b, ldb, alpha, beta, vl, ldvl, vr, ldvr, ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv, work, lwork, rwork, iwork, bwork, info)
CGGEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices