331 SUBROUTINE zget24( COMP, JTYPE, THRESH, ISEED, NOUNIT, N, A, LDA,
332 $ H, HT, W, WT, WTMP, VS, LDVS, VS1, RCDEIN,
333 $ RCDVIN, NSLCT, ISLCT, ISRT, RESULT, WORK,
334 $ LWORK, RWORK, BWORK, INFO )
342 INTEGER INFO, ISRT, JTYPE, LDA, LDVS, LWORK, N, NOUNIT,
344 DOUBLE PRECISION RCDEIN, RCDVIN, THRESH
348 INTEGER ISEED( 4 ), ISLCT( * )
349 DOUBLE PRECISION RESULT( 17 ), RWORK( * )
350 COMPLEX*16 A( LDA, * ), H( LDA, * ), HT( LDA, * ),
351 $ vs( ldvs, * ), vs1( ldvs, * ), w( * ),
352 $ work( * ), wt( * ), wtmp( * )
358 COMPLEX*16 CZERO, CONE
359 PARAMETER ( CZERO = ( 0.0d+0, 0.0d+0 ),
360 $ cone = ( 1.0d+0, 0.0d+0 ) )
361 DOUBLE PRECISION ZERO, ONE
362 parameter( zero = 0.0d+0, one = 1.0d+0 )
363 DOUBLE PRECISION EPSIN
364 parameter( epsin = 5.9605d-8 )
368 INTEGER I, IINFO, ISORT, ITMP, J, KMIN, KNTEIG, RSUB,
370 DOUBLE PRECISION ANORM, EPS, RCNDE1, RCNDV1, RCONDE, ,
371 $ smlnum, tol, tolin, ulp, ulpinv, v, vricmp,
380 DOUBLE PRECISION DLAMCH, ZLANGE
381 EXTERNAL ZSLECT, DLAMCH, ZLANGE
387 INTRINSIC abs, dble, dimag,
max,
min
391 DOUBLE PRECISION SELWI( 20 ), SELWR( 20 )
394 INTEGER SELDIM, SELOPT
397 COMMON / sslct / selopt, seldim, selval, selwr, selwi
404 IF( thresh.LT.zero )
THEN
406 ELSE IF( nounit.LE.0 )
THEN
408 ELSE IF( n.LT.0 )
THEN
410 ELSE IF( lda.LT.1 .OR. lda.LT.n )
THEN
412 ELSE IF( ldvs.LT.1 .OR. ldvs.LT.n )
THEN
414 ELSE IF( lwork.LT.2*n )
THEN
419 CALL xerbla(
'ZGET24', -info )
434 smlnum = dlamch(
'Safe minimum' )
435 ulp = dlamch(
'Precision' )
442 IF( isort.EQ.0 )
THEN
452 CALL zlacpy(
'F', n, n, a, lda, h, lda )
453 CALL zgeesx(
'V', sort, zslect,
'N', n, h, lda, sdim, w, vs,
454 $ ldvs, rconde, rcondv, work, lwork, rwork, bwork,
456 IF( iinfo.NE.0 )
THEN
457 result( 1+rsub ) = ulpinv
458 IF( jtype.NE.22 )
THEN
459 WRITE( nounit, fmt = 9998 )
'ZGEESX1', iinfo, n, jtype,
462 WRITE( nounit, fmt = 9999 )
'ZGEESX1', iinfo, n,
468 IF( isort.EQ.0 )
THEN
469 CALL zcopy( n, w, 1, wtmp, 1 )
474 result( 1+rsub ) = zero
477 IF( h( i, j ).NE.czero )
478 $ result( 1+rsub ) = ulpinv
486 CALL zlacpy(
' ', n, n, a, lda, vs1, ldvs )
490 CALL zgemm(
'No transpose',
'No transpose', n, n, n, cone, vs,
491 $ ldvs, h, lda, czero, ht, lda )
495 CALL zgemm(
'No transpose', 'conjugate transpose
', N, N, N,
496 $ -CONE, HT, LDA, VS, LDVS, CONE, VS1, LDVS )
498 ANORM = MAX( ZLANGE( '1
', N, N, A, LDA, RWORK ), SMLNUM )
499 WNORM = ZLANGE( '1
', N, N, VS1, LDVS, RWORK )
501.GT.
IF( ANORMWNORM ) THEN
502 RESULT( 2+RSUB ) = ( WNORM / ANORM ) / ( N*ULP )
504.LT.
IF( ANORMONE ) THEN
505 RESULT( 2+RSUB ) = ( MIN( WNORM, N*ANORM ) / ANORM ) /
508 RESULT( 2+RSUB ) = MIN( WNORM / ANORM, DBLE( N ) ) /
515 CALL ZUNT01( 'columns
', N, N, VS, LDVS, WORK, LWORK, RWORK,
520 RESULT( 4+RSUB ) = ZERO
522.NE.
IF( H( I, I )W( I ) )
523 $ RESULT( 4+RSUB ) = ULPINV
528 CALL ZLACPY( 'f
', N, N, A, LDA, HT, LDA )
529 CALL ZGEESX( 'n
', SORT, ZSLECT, 'n
', N, HT, LDA, SDIM, WT, VS,
530 $ LDVS, RCONDE, RCONDV, WORK, LWORK, RWORK, BWORK,
532.NE.
IF( IINFO0 ) THEN
533 RESULT( 5+RSUB ) = ULPINV
534.NE.
IF( JTYPE22 ) THEN
535 WRITE( NOUNIT, FMT = 9998 )'zgeesx2
', IINFO, N, JTYPE,
538 WRITE( NOUNIT, FMT = 9999 )'zgeesx2
', IINFO, N,
545 RESULT( 5+RSUB ) = ZERO
548.NE.
IF( H( I, J )HT( I, J ) )
549 $ RESULT( 5+RSUB ) = ULPINV
555 RESULT( 6+RSUB ) = ZERO
557.NE.
IF( W( I )WT( I ) )
558 $ RESULT( 6+RSUB ) = ULPINV
563.EQ.
IF( ISORT1 ) THEN
567 IF( ZSLECT( W( I ) ) )
568 $ KNTEIG = KNTEIG + 1
570.AND.
IF( ZSLECT( W( I+1 ) )
571.NOT.
$ ( ZSLECT( W( I ) ) ) )RESULT( 13 ) = ULPINV
575 $ RESULT( 13 ) = ULPINV
583.GE.
IF( LWORK( N*( N+1 ) ) / 2 ) THEN
590 CALL ZLACPY( 'f', n, n, a, lda, ht, lda )
591 CALL zgeesx(
'V', sort, zslect,
'B', n, ht, lda, sdim1, wt,
592 $ vs1, ldvs, rconde, rcondv, work, lwork, rwork,
594 IF( iinfo.NE.0 )
THEN
595 result( 14 ) = ulpinv
596 result( 15 ) = ulpinv
597 IF( jtype.NE.22 )
THEN
598 WRITE( nounit, fmt = 9998 )
'ZGEESX3', iinfo, n, jtype,
601 WRITE( nounit, fmt = 9999 )
'ZGEESX3', iinfo, n,
611 IF( w( i ).NE.wt( i ) )
612 $ result( 10 ) = ulpinv
614 IF( h( i, j ).NE.ht( i, j ) )
615 $ result( 11 ) = ulpinv
616 IF( vs( i, j ).NE.vs1( i, j ) )
617 $ result( 12 ) = ulpinv
621 $ result( 13 ) = ulpinv
625 CALL zlacpy(
'F', n, n, a, lda, ht
626 CALL zgeesx(
'N', sort, zslect,
'B', n, ht, lda, sdim1, wt,
627 $ vs1, ldvs, rcnde1, rcndv1, work, lwork, rwork,
629 IF( iinfo.NE.0 )
THEN
630 result( 14 ) = ulpinv
631 result( 15 ) = ulpinv
632 IF( jtype.NE.22 )
THEN
633 WRITE( nounit, fmt = 9998 )
'ZGEESX4', iinfo, n, jtype,
636 WRITE( nounit, fmt = 9999 )
'ZGEESX4', iinfo, n,
645 IF( rcnde1.NE.rconde )
646 $ result( 14 ) = ulpinv
647 IF( rcndv1.NE.rcondv )
648 $ result( 15 ) = ulpinv
653 IF( w( i ).NE.wt( i ) )
654 $ result( 10 ) = ulpinv
656 IF( h( i, j ).NE.ht( i, j ) )
657 $ result( 11 ) = ulpinv
658 IF( vs( i, j ).NE.vs1( i, j ) )
659 $ result( 12 ) = ulpinv
663 $ result( 13 ) = ulpinv
667 CALL zlacpy(
'F', n, n, a, lda, ht, lda )
668 CALL zgeesx(
'V', sort, zslect,
'E', n, ht, lda, sdim1, wt,
669 $ vs1, ldvs, rcnde1, rcndv1, work, lwork, rwork,
671 IF( iinfo.NE.0 )
THEN
672 result( 14 ) = ulpinv
673 IF( jtype.NE.22 )
THEN
674 WRITE( nounit, fmt = 9998 )
'ZGEESX5', iinfo, n, jtype,
677 WRITE( nounit, fmt = 9999 )
'ZGEESX5', iinfo, n,
686 IF( rcnde1.NE.rconde )
687 $ result( 14 ) = ulpinv
692 IF( w( i ).NE.wt( i ) )
693 $ result( 10 ) = ulpinv
695 IF( h( i, j ).NE.ht( i, j ) )
696 $ result( 11 ) = ulpinv
697 IF( vs( i, j ).NE.vs1( i, j ) )
698 $ result( 12 ) = ulpinv
702 $ result( 13 ) = ulpinv
706 CALL zlacpy(
'F', n, n, a, lda, ht, lda )
707 CALL zgeesx(
'N', sort, zslect,
'E', n, ht, lda, sdim1, wt,
708 $ vs1, ldvs, rcnde1, rcndv1, work, lwork, rwork,
710 IF( iinfo.NE.0 )
THEN
711 result( 14 ) = ulpinv
712 IF( jtype.NE.22 )
THEN
713 WRITE( nounit, fmt = 9998 )
'ZGEESX6', iinfo, n, jtype,
716 WRITE( nounit, fmt = 9999 )
'ZGEESX6', iinfo, n,
725 IF( rcnde1.NE.rconde )
726 $ result( 14 ) = ulpinv
731 IF( w( i ).NE.wt( i ) )
732 $ result( 10 ) = ulpinv
734 IF( h( i, j ).NE.ht( i, j ) )
735 $ result( 11 ) = ulpinv
736 IF( vs( i, j ).NE.vs1( i, j ) )
737 $ result( 12 ) = ulpinv
741 $ result( 13 ) = ulpinv
745 CALL zlacpy(
'F', n, n, a, lda, ht, lda )
746 CALL zgeesx(
'V', sort, zslect,
'V', n, ht, lda, sdim1, wt,
747 $ vs1, ldvs, rcnde1, rcndv1, work, lwork, rwork,
749 IF( iinfo.NE.0 )
THEN
750 result( 15 ) = ulpinv
751 IF( jtype.NE.22 )
THEN
752 WRITE( nounit, fmt = 9998 )
'ZGEESX7', iinfo, n, jtype,
755 WRITE( nounit, fmt = 9999 )
'ZGEESX7', iinfo, n,
764 IF( rcndv1.NE.rcondv )
765 $ result( 15 ) = ulpinv
770 IF( w( i ).NE.wt( i ) )
771 $ result( 10 ) = ulpinv
773 IF( h( i, j ).NE.ht( i, j ) )
774 $ result( 11 ) = ulpinv
775 IF( vs( i, j ).NE.vs1( i, j ) )
776 $ result( 12 ) = ulpinv
780 $ result( 13 ) = ulpinv
784 CALL zlacpy(
'F', n, n, a, lda, ht, lda )
785 CALL zgeesx(
'N', sort, zslect,
'V', n, ht, lda, sdim1, wt,
786 $ vs1, ldvs, rcnde1, rcndv1, work, lwork, rwork,
788 IF( iinfo.NE.0 )
THEN
789 result( 15 ) = ulpinv
790 IF( jtype.NE.22 )
THEN
791 WRITE( nounit, fmt = 9998 )
'ZGEESX8', iinfo, n, jtype,
794 WRITE( nounit, fmt = 9999 )
'ZGEESX8', iinfo, n,
803 IF( rcndv1.NE.rcondv )
804 $ result( 15 ) = ulpinv
809 IF( w( i ).NE.wt( i ) )
810 $ result( 10 ) = ulpinv
812 IF( h( i, j ).NE.ht( i, j ) )
813 $ result( 11 ) = ulpinv
814 IF( vs( i, j ).NE.vs1( i, j ) )
815 $ result( 12 ) = ulpinv
819 $ result( 13 ) = ulpinv
836 eps =
max( ulp, epsin )
839 selval( i ) = .false.
840 selwr( i ) = dble( wtmp( i ) )
841 selwi( i ) = dimag( wtmp( i ) )
846 vrimin = dble( wtmp( i ) )
848 vrimin = dimag( wtmp( i ) )
852 vricmp = dble( wtmp( j ) )
854 vricmp = dimag( wtmp( j ) )
856 IF( vricmp.LT.vrimin )
THEN
862 wtmp( kmin ) = wtmp( i )
865 ipnt( i ) = ipnt( kmin )
869 selval( ipnt( islct( i ) ) ) = .true.
874 CALL zlacpy(
'F', n, n, a, lda, ht, lda )
875 CALL zgeesx(
'N', 's
', ZSLECT, 'b
', N, HT, LDA, SDIM1, WT, VS1,
876 $ LDVS, RCONDE, RCONDV, WORK, LWORK, RWORK, BWORK,
878.NE.
IF( IINFO0 ) THEN
879 RESULT( 16 ) = ULPINV
880 RESULT( 17 ) = ULPINV
881 WRITE( NOUNIT, FMT = 9999 )'zgeesx9', iinfo, n, iseed( 1 )
889 anorm = zlange( '1
', N, N, A, LDA, RWORK )
890 V = MAX( DBLE( N )*EPS*ANORM, SMLNUM )
893.GT.
IF( VRCONDV ) THEN
898.GT.
IF( VRCDVIN ) THEN
903 TOL = MAX( TOL, SMLNUM / EPS )
904 TOLIN = MAX( TOLIN, SMLNUM / EPS )
905.GT.
IF( EPS*( RCDEIN-TOLIN )RCONDE+TOL ) THEN
906 RESULT( 16 ) = ULPINV
907.GT.
ELSE IF( RCDEIN-TOLINRCONDE+TOL ) THEN
908 RESULT( 16 ) = ( RCDEIN-TOLIN ) / ( RCONDE+TOL )
909.LT.
ELSE IF( RCDEIN+TOLINEPS*( RCONDE-TOL ) ) THEN
910 RESULT( 16 ) = ULPINV
911.LT.
ELSE IF( RCDEIN+TOLINRCONDE-TOL ) THEN
912 RESULT( 16 ) = ( RCONDE-TOL ) / ( RCDEIN+TOLIN )
920.GT.
IF( VRCONDV*RCONDE ) THEN
925.GT.
IF( VRCDVIN*RCDEIN ) THEN
930 TOL = MAX( TOL, SMLNUM / EPS )
931 TOLIN = MAX( TOLIN, SMLNUM / EPS )
932.GT.
IF( EPS*( RCDVIN-TOLIN )RCONDV+TOL ) THEN
933 RESULT( 17 ) = ULPINV
934.GT.
ELSE IF( RCDVIN-TOLINRCONDV+TOL ) THEN
935 RESULT( 17 ) = ( RCDVIN-TOLIN ) / ( RCONDV+TOL )
936.LT.
ELSE IF( RCDVIN+TOLINEPS*( RCONDV-TOL ) ) THEN
937 RESULT( 17 ) = ULPINV
938.LT.
ELSE IF( RCDVIN+TOLINRCONDV-TOL ) THEN
939 RESULT( 17 ) = ( RCONDV-TOL ) / ( RCDVIN+TOLIN )
948 9999 FORMAT( ' zget24:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
949 $ I6, ', input example number =
', I4 )
950 9998 FORMAT( ' zget24:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
951 $ I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )