296 SUBROUTINE ddrgvx( NSIZE, THRESH, NIN, NOUT, A, LDA, B, AI, BI,
297 $ ALPHAR, ALPHAI, BETA, VL, VR, ILO, IHI, LSCALE,
298 $ RSCALE, S, DTRU, DIF, DIFTRU, WORK, LWORK,
299 $ IWORK, LIWORK, RESULT, BWORK, INFO )
306 INTEGER IHI, LDA, LIWORK, LWORK, NIN, NOUT,
308 DOUBLE PRECISION THRESH
313 DOUBLE PRECISION A( LDA, * ), AI( LDA, * ), ALPHAI(
315 $ bi( lda, * ), dif( * ), diftru( * ), dtru( * ),
316 $ lscale( * ), result( 4 ), rscale( * ), s( * ),
317 $ vl( lda, * ), vr( lda, * ), work( * )
323 DOUBLE PRECISION ZERO, ONE, TEN, , HALF
324 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0, ten = 1.0d+1,
325 $ tnth = 1.0d-1, half = 0.5d
328 INTEGER I, IPTYPE, IWA, IWB, IWX, IWY, J, LINFO,
330DOUBLE PRECISION , ANORM, , RATIO1, RATIO2, THRSH2,
334 DOUBLE PRECISION WEIGHT( 5 )
338 DOUBLE PRECISION DLAMCH
339 EXTERNAL ILAENV, DLAMCH, DLANGE
345 INTRINSIC abs,
max, sqrt
355 IF( nsize.LT.0 )
THEN
357 ELSE IF( thresh.LT.zero )
THEN
359 ELSE IF( nin.LE.0 )
THEN
361 ELSE IF( nout.LE.0 )
THEN
363 ELSE IF( lda.LT.1 .OR. lda.LT.nmax )
THEN
365 ELSE IF( liwork.LT.nmax+6 )
THEN
377 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
378 minwrk = 2*nmax*nmax + 12*nmax + 16
379 maxwrk = 6*nmax + nmax*ilaenv( 1,
'DGEQRF',
' ', nmax, 1, nmax,
385 IF( lwork.LT.minwrk )
389 CALL xerbla(
'DDRGVX', -info )
409 weight( 4 ) = one / weight( 2 )
410 weight( 5 ) = one / weight( 1 )
420 CALL dlatm6( iptype, 5, a, lda, b, vr, lda, vl,
421 $ lda, weight( iwa ), weight( iwb ),
422 $ weight( iwx ), weight( iwy ), dtru,
429 CALL dlacpy(
'F', n, n, a, lda, ai, lda )
430 CALL dlacpy(
'F', n, n, b, lda, bi, lda )
432 CALL dggevx(
'N',
'V',
'V',
'B', n, ai, lda, bi,
433 $ lda, alphar, alphai, beta, vl, lda,
434 $ vr, lda, ilo, ihi, lscale, rscale,
435 $ anorm, bnorm, s, dif, work, lwork,
436 $ iwork, bwork, linfo )
437 IF( linfo.NE.0 )
THEN
439 WRITE( nout, fmt = 9999 )
'DGGEVX', linfo, n,
446 CALL dlacpy(
'Full', n, n, ai, lda, work, n )
447 CALL dlacpy(
'Full', n, n, bi, lda, work( n*n+1 ),
449 abnorm = dlange(
'Fro', n, 2*n, work, n, work )
454 CALL dget52( .true., n, a, lda, b, lda, vl, lda,
455 $ alphar, alphai, beta, work,
457 IF( result( 2 ).GT.thresh )
THEN
458 WRITE( nout, fmt = 9998 )
'Left',
'DGGEVX',
459 $ result( 2 ), n, iptype, iwa, iwb, iwx, iwy
463 CALL dget52( .false., n, a, lda, b, lda, vr, lda,
464 $ alphar, alphai, beta, work,
466 IF( result( 3 ).GT.thresh )
THEN
467 WRITE( nout, fmt = 9998 )
'Right',
'DGGEVX',
468 $ result( 3 ), n, iptype, iwa, iwb, iwx, iwy
475 IF( s( i ).EQ.zero )
THEN
476 IF( dtru( i ).GT.abnorm*ulp )
478 ELSE IF( dtru( i ).EQ.zero )
THEN
479 IF( s( i ).GT.abnorm*ulp )
480 $ result( 3 ) = ulpinv
482 work( i ) =
max( abs( dtru( i ) / s( i ) ),
483 $ abs( s( i ) / dtru( i ) ) )
484 result( 3 ) =
max( result( 3 ), work( i ) )
491 IF( dif( 1 ).EQ.zero )
THEN
492 IF( diftru( 1 ).GT.abnorm*ulp )
493 $ result( 4 ) = ulpinv
494 ELSE IF( diftru( 1 ).EQ.zero )
THEN
495 IF( dif( 1 ).GT.abnorm*ulp )
496 $ result( 4 ) = ulpinv
497 ELSE IF( dif( 5 ).EQ.zero )
THEN
498 IF( diftru( 5 ).GT.abnorm*ulp )
499 $ result( 4 ) = ulpinv
500 ELSE IF( diftru( 5 ).EQ.zero )
THEN
501 IF( dif( 5 ).GT.abnorm*ulp )
502 $ result( 4 ) = ulpinv
504 ratio1 =
max( abs( diftru( 1 ) / dif( 1 ) ),
505 $ abs( dif( 1 ) / diftru( 1 ) ) )
506 ratio2 =
max( abs( diftru( 5 ) / dif( 5 ) ),
507 $ abs( dif( 5 ) / diftru( 5 ) ) )
508 result( 4 ) =
max( ratio1, ratio2 )
516 IF( ( result( j ).GE.thrsh2 .AND. j.GE.4 ) .OR.
517 $ ( result( j ).GE.thresh .AND. j.LE.3 ) )
523 IF( nerrs.EQ.0 )
THEN
524 WRITE( nout, fmt = 9997 )
'DXV'
530 WRITE( nout, fmt = 9995 )
531 WRITE( nout, fmt = 9994 )
532 WRITE( nout, fmt = 9993 )
536 WRITE( nout, fmt = 9992 )
'''',
541 IF( result( j ).LT.10000.0d0 )
THEN
542 WRITE( nout, fmt = 9991 )iptype, iwa,
543 $ iwb, iwx, iwy, j, result( j )
545 WRITE( nout, fmt = 9990 )iptype, iwa,
546 $ iwb, iwx, iwy, j, result( j )
566 READ( nin, fmt = *,
END = 150 )n
570 READ( nin, fmt = * )( a( i, j ), j = 1, n )
573 READ( nin, fmt = * )( b( i, j ), j = 1, n )
575 READ( nin, fmt = * )( dtru( i ), i = 1, n )
576 READ( nin, fmt = * )( diftru( i ), i = 1, n )
584 CALL dlacpy(
'F', n, n, a, lda, ai, lda )
585 CALL dlacpy(
'F', n, n, b, lda, bi, lda )
587 CALL dggevx( 'n
', 'v
', 'v
', 'b
', N, AI, LDA, BI, LDA, ALPHAR,
588 $ ALPHAI, BETA, VL, LDA, VR, LDA, ILO, IHI, LSCALE,
589 $ RSCALE, ANORM, BNORM, S, DIF, WORK, LWORK, IWORK,
592.NE.
IF( LINFO0 ) THEN
594 WRITE( NOUT, FMT = 9987 )'dggevx', LINFO, N, NPTKNT
600 CALL DLACPY( 'full
', N, N, AI, LDA, WORK, N )
601 CALL DLACPY( 'full
', N, N, BI, LDA, WORK( N*N+1 ), N )
602 ABNORM = DLANGE( 'fro
', N, 2*N, WORK, N, WORK )
607 CALL DGET52( .TRUE., N, A, LDA, B, LDA, VL, LDA, ALPHAR, ALPHAI,
608 $ BETA, WORK, RESULT( 1 ) )
609.GT.
IF( RESULT( 2 )THRESH ) THEN
610 WRITE( NOUT, FMT = 9986 )'left
', 'dggevx', RESULT( 2 ), N,
615 CALL DGET52( .FALSE., N, A, LDA, B, LDA, VR, LDA, ALPHAR, ALPHAI,
616 $ BETA, WORK, RESULT( 2 ) )
617.GT.
IF( RESULT( 3 )THRESH ) THEN
618 WRITE( NOUT, FMT = 9986 )'right
', 'dggevx', RESULT( 3 ), N,
626.EQ.
IF( S( I )ZERO ) THEN
627.GT.
IF( DTRU( I )ABNORM*ULP )
628 $ RESULT( 3 ) = ULPINV
629.EQ.
ELSE IF( DTRU( I )ZERO ) THEN
630.GT.
IF( S( I )ABNORM*ULP )
631 $ RESULT( 3 ) = ULPINV
633 WORK( I ) = MAX( ABS( DTRU( I ) / S( I ) ),
634 $ ABS( S( I ) / DTRU( I ) ) )
635 RESULT( 3 ) = MAX( RESULT( 3 ), WORK( I ) )
642.EQ.
IF( DIF( 1 )ZERO ) THEN
643.GT.
IF( DIFTRU( 1 )ABNORM*ULP )
644 $ RESULT( 4 ) = ULPINV
645.EQ.
ELSE IF( DIFTRU( 1 )ZERO ) THEN
646.GT.
IF( DIF( 1 )ABNORM*ULP )
647 $ RESULT( 4 ) = ULPINV
648.EQ.
ELSE IF( DIF( 5 )ZERO ) THEN
649.GT.
IF( DIFTRU( 5 )ABNORM*ULP )
650 $ RESULT( 4 ) = ULPINV
651.EQ.
ELSE IF( DIFTRU( 5 )ZERO ) THEN
652.GT.
IF( DIF( 5 )ABNORM*ULP )
653 $ RESULT( 4 ) = ULPINV
655 RATIO1 = MAX( ABS( DIFTRU( 1 ) / DIF( 1 ) ),
656 $ ABS( DIF( 1 ) / DIFTRU( 1 ) ) )
657 RATIO2 = MAX( ABS( DIFTRU( 5 ) / DIF( 5 ) ),
658 $ ABS( DIF( 5 ) / DIFTRU( 5 ) ) )
659 RESULT( 4 ) = MAX( RATIO1, RATIO2 )
667.GE.
IF( RESULT( J )THRSH2 ) THEN
672.EQ.
IF( NERRS0 ) THEN
673 WRITE( NOUT, FMT = 9997 )'dxv
'
679 WRITE( NOUT, FMT = 9996 )
683 WRITE( NOUT, FMT = 9992 )'''', 'transpose
', ''''
687.LT.
IF( RESULT( J )10000.0D0 ) THEN
688 WRITE( NOUT, FMT = 9989 )NPTKNT, N, J, RESULT( J )
690 WRITE( NOUT, FMT = 9988 )NPTKNT, N, J, RESULT( J )
702 CALL ALASVM( 'dxv
', NOUT, NERRS, NTESTT, 0 )
708 9999 FORMAT( ' ddrgvx:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
709 $ I6, ', jtype=
', I6, ')
' )
711 9998 FORMAT( ' ddrgvx:
', A, ' eigenvectors from
', A, ' incorrectly
',
712 $ 'normalized.
', / ' bits of error=
', 0P, G10.3, ',
', 9X,
713 $ 'n=
', I6, ', jtype=
', I6, ', iwa=
', I5, ', iwb=', i5,
714 $
', IWX=', i5,
', IWY=', i5 )
716 9997
FORMAT( / 1x, a3,
' -- Real Expert Eigenvalue/vector',
717 $ ' problem driver
' )
719 9996 FORMAT( ' input example
' )
721 9995 FORMAT( ' matrix types:
', / )
723 9994 FORMAT( ' TYPE 1: da is diagonal, db is identity,
',
724 $ / ' a = y^(-h) da x^(-1), b = y^(-h) db x^(-1)
',
725 $ / ' yh and x are left and right eigenvectors.
', / )
727 9993 FORMAT( ' TYPE 2: da is quasi-diagonal, db is identity,
',
728 $ / ' a = y^(-h) da x^(-1), b = y^(-h) db x^(-1)
',
729 $ / ' yh and x are left and right eigenvectors.
', / )
731 9992 FORMAT( / ' tests performed:
', / 4X,
732 $ ' a is
alpha, b is beta, l is a left eigenvector,
', / 4X,
733 $ ' r is a right eigenvector and
', A, ' means
', A, '.
',
734 $ / ' 1 =
max | ( b a - a b )
', A, ' l | / const.
',
735 $ / ' 2 =
max | ( b a - a b ) r | / const.
',
736 $ / ' 3 =
max( sest/stru, stru/sest )
',
737 $ ' over all eigenvalues
', /
738 $ ' 4 =
max( difest/diftru, diftru/difest )
',
739 $ ' over
the 1st and 5th eigenvectors
', / )
741 9991 FORMAT( ' type=
', I2, ',
', ' iwa=
', I2, ', iwb=
', I2, ', iwx=
',
742 $ I2, ', iwy=
', I2, ', result
', I2, ' is
', 0P, F8.2 )
743 9990 FORMAT( ' type=
', I2, ',
', ' iwa=
', I2, ', iwb=
', I2, ', iwx=
',
744 $ I2, ', iwy=
', I2, ', result
', I2, ' is
', 1P, D10.3 )
745 9989 FORMAT( ' input example
#', I2, ', matrix order=', I4, ',',
746 $
' result ', i2,
' is', 0p, f8.2 )
747 9988
FORMAT(
' Input example #', i2,
', matrix order=', i4,
',',
748 $
' result ', i2,
' is', 1p, d10.3 )
749 9987
FORMAT(
' DDRGVX: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
750 $ i6,
', Input example #', i2,
')' )
752 9986
FORMAT(
' DDRGVX: ', a,
' Eigenvectors from ', a,
' incorrectly ',
753 $
'normalized.', /
' Bits of error=', 0p, g10.3,
',', 9x,
754 $
'N=', i6,
', Input Example #', i2,
')' )
subroutine dggevx(balanc, jobvl, jobvr, sense, n, a, lda, b, ldb, alphar, alphai, beta, vl, ldvl, vr, ldvr, ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv, work, lwork, iwork, bwork, info)
DGGEVX computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices