378 SUBROUTINE zdrges3( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
379 $ NOUNIT, A, LDA, B, S, T, Q, LDQ, Z, ALPHA,
380 $ BETA, WORK, LWORK, RWORK, RESULT, BWORK,
388 INTEGER , LDA, LDQ, LWORK, NOUNIT, NSIZES, NTYPES
389 DOUBLE PRECISION THRESH
392 LOGICAL BWORK( * ), DOTYPE( * )
393 INTEGER ISEED( 4 ), NN( * )
394 DOUBLE PRECISION RESULT( 13 ), RWORK( * )
395 COMPLEX*16 A( LDA, * ), ALPHA( * ), B( LDA, * ),
396 $ beta( * ), q( ldq, * ), s( lda, * ),
397 $ t( lda, * ), work( * ), z( ldq, * )
403 DOUBLE PRECISION ZERO, ONE
404 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
405 COMPLEX*16 CZERO, CONE
406 parameter( czero = ( 0.0d+0, 0.0d+0 ),
407 $ cone = ( 1.0d+0, 0.0d+0 ) )
409 parameter( maxtyp = 26 )
412 LOGICAL BADNN, ILABAD
414 INTEGER I, IADD, IINFO, IN, ISORT, J, JC, JR, JSIZE,
415 $ jtype, knteig, maxwrk, minwrk, mtypes, n, n1,
416 $ nb, nerrs, nmats, nmax, ntest, ntestt, rsub,
418 DOUBLE PRECISION SAFMAX, SAFMIN, TEMP1, TEMP2, ULP, ULPINV
422 LOGICAL LASIGN( MAXTYP ), LBSIGN( MAXTYP )
423 INTEGER IOLDSD( 4 ), KADD( 6 ), KAMAGN( MAXTYP ),
424 $ KATYPE( MAXTYP ), KAZERO( MAXTYP ),
425 $ kbmagn( maxtyp ), kbtype( maxtyp ),
426 $ kbzero( maxtyp ), kclass( maxtyp ),
427 $ ktrian( maxtyp ), kz1( 6
428 DOUBLE PRECISION RMAGN( 0: 3 )
433 DOUBLE PRECISION DLAMCH
435 EXTERNAL zlctes, ilaenv, dlamch, zlarnd
442 INTRINSIC abs, dble, dconjg, dimag,
max,
min, sign
445 DOUBLE PRECISION ABS1
448 abs1( x ) = abs( dble( x ) ) + abs( dimag( x ) )
451 DATA kclass / 15*1, 10*2, 1*3 /
452 DATA kz1 / 0, 1, 2, 1, 3, 3 /
453 DATA kz2 / 0, 0, 1, 2, 1, 1 /
454 DATA kadd / 0, 0, 0, 0, 3, 2 /
455 DATA katype / 0, 1, 0, 1, 2, 3, 4, 1, 4, 4, 1, 1, 4,
456 $ 4, 4, 2, 4, 5, 8, 7, 9, 4*4, 0 /
457 DATA kbtype / 0, 0, 1, 1, 2, -3, 1, 4, 1, 1, 4, 4,
458 $ 1, 1, -4, 2, -4, 8*8, 0 /
459 DATA kazero / 6*1, 2, 1, 2*2, 2*1, 2*2, 3, 1, 3,
461 DATA kbzero / 6*1, 1, 2, 2*1, 2*2, 2*1, 4, 1, 4,
463 DATA kamagn / 8*1, 2, 3, 2, 3, 2, 3, 7*1, 2, 3, 3,
465 DATA kbmagn / 8*1, 3, 2, 3, 2, 2, 3, 7*1, 3, 2, 3,
467 DATA ktrian / 16*0, 10*1 /
468 DATA lasign / 6*.false., .true., .false., 2*.true.,
469 $ 2*.false., 3*.true., .false., .true.,
470 $ 3*.false., 5*.true., .false. /
471 DATA lbsign / 7*.false., .true., 2*.false.,
472 $ 2*.true., 2*.false., .true., .false., .true.,
484 nmax =
max( nmax, nn( j ) )
489 IF( nsizes.LT.0 )
THEN
491 ELSE IF( badnn )
THEN
493 ELSE IF( ntypes.LT.0 )
THEN
495 ELSE IF( thresh.LT.zero )
THEN
497 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
499 ELSE IF( ldq.LE.1 .OR. ldq.LT.nmax )
THEN
511 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
513 nb =
max( 1, ilaenv( 1,
'ZGEQRF',
' ', nmax, nmax, -1, -1 ),
514 $ ilaenv( 1,
'ZUNMQR',
'LC', nmax, nmax
515 $ ilaenv( 1,
'ZUNGQR',
' ', nmax, nmax, nmax, -1 ) )
516 maxwrk =
max( nmax+nmax*nb, 3*nmax*nmax )
520 IF( lwork.LT.minwrk )
524 CALL xerbla(
'ZDRGES3', -info )
530 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
533 ulp = dlamch(
'Precision' )
534 safmin = dlamch(
'Safe minimum' )
535 safmin = safmin / ulp
536 safmax = one / safmin
537 CALL dlabad( safmin, safmax )
551 DO 190 jsize = 1, nsizes
554 rmagn( 2 ) = safmax*ulp / dble( n1 )
557 IF( nsizes.NE.1 )
THEN
558 mtypes =
min( maxtyp, ntypes )
560 mtypes =
min( maxtyp+1, ntypes )
565 DO 180 jtype = 1, mtypes
566 IF( .NOT.dotype( jtype ) )
574 ioldsd( j ) = iseed( j )
604 IF( mtypes.GT.maxtyp )
607 IF( kclass( jtype ).LT.3 )
THEN
611 IF( abs( katype( jtype ) ).EQ.3 )
THEN
612 in = 2*( ( n-1 ) / 2 ) + 1
614 $
CALL zlaset(
'Full', n, n, czero, czero, a, lda )
618 CALL zlatm4( katype( jtype ), in, kz1( kazero( jtype ) ),
619 $ kz2( kazero( jtype ) ), lasign( jtype ),
620 $ rmagn( kamagn( jtype ) ), ulp,
621 $ rmagn( ktrian( jtype )*kamagn( jtype ) ), 2,
623 iadd = kadd( kazero( jtype ) )
624 IF( iadd.GT.0 .AND. iadd.LE.n )
625 $ a( iadd, iadd ) = rmagn( kamagn( jtype ) )
629 IF( abs( kbtype( jtype ) ).EQ.3 )
THEN
630 in = 2*( ( n-1 ) / 2 ) + 1
632 $
CALL zlaset(
'Full', n, n, czero, czero, b, lda )
636 CALL zlatm4( kbtype( jtype ), in, kz1( kbzero( jtype ) ),
637 $ kz2( kbzero( jtype ) ), lbsign( jtype ),
638 $ rmagn( kbmagn( jtype ) ), one,
639 $ rmagn( ktrian( jtype )*kbmagn( jtype ) ), 2,
641 iadd = kadd( kbzero( jtype ) )
642 IF( iadd.NE.0 .AND. iadd.LE.n )
643 $ b( iadd, iadd ) = rmagn( kbmagn( jtype ) )
645 IF( kclass( jtype ).EQ.2 .AND. n.GT.0 )
THEN
654 q( jr, jc ) = zlarnd( 3, iseed )
655 z( jr, jc ) = zlarnd( 3, iseed )
657 CALL zlarfg( n+1-jc, q( jc, jc ), q( jc+1, jc ), 1,
659 work( 2*n+jc ) = sign( one, dble( q( jc, jc ) ) )
661 CALL zlarfg( n+1-jc, z( jc, jc ), z( jc+1, jc ), 1,
663 work( 3*n+jc ) = sign( one, dble( z( jc, jc ) ) )
666 ctemp = zlarnd( 3, iseed )
669 work( 3*n ) = ctemp / abs( ctemp )
670 ctemp = zlarnd( 3, iseed )
673 work( 4*n ) = ctemp / abs( ctemp )
679 a( jr, jc ) = work( 2*n+jr )*
680 $ dconjg( work( 3*n+jc ) )*
682 b( jr, jc ) = work( 2*n+jr )*
683 $ dconjg( work( 3*n+jc ) )*
687 CALL zunm2r(
'L',
'N', n, n, n-1, q, ldq, work, a,
688 $ lda, work( 2*n+1 ), iinfo )
691 CALL zunm2r(
'R',
'C', n, n, n-1, z, ldq, work( n+1 ),
692 $ a, lda, work( 2*n+1 ), iinfo )
695 CALL zunm2r( 'l
', 'n
', N, N, N-1, Q, LDQ, WORK, B,
696 $ LDA, WORK( 2*N+1 ), IINFO )
699 CALL ZUNM2R( 'r
', 'c
', N, N, N-1, Z, LDQ, WORK( N+1 ),
700 $ B, LDA, WORK( 2*N+1 ), IINFO )
710 A( JR, JC ) = RMAGN( KAMAGN( JTYPE ) )*
712 B( JR, JC ) = RMAGN( KBMAGN( JTYPE ) )*
720.NE.
IF( IINFO0 ) THEN
721 WRITE( NOUNIT, FMT = 9999 )'generator
', IINFO, N, JTYPE,
736.EQ.
IF( ISORT0 ) THEN
746 CALL XLAENV( 12, 10 )
747 CALL XLAENV( 13, 12 )
748 CALL XLAENV( 14, 13 )
750 CALL XLAENV( 17, 10 )
754 CALL ZLACPY( 'full
', N, N, A, LDA, S, LDA )
755 CALL ZLACPY( 'full
', N, N, B, LDA, T, LDA )
756 NTEST = 1 + RSUB + ISORT
757 RESULT( 1+RSUB+ISORT ) = ULPINV
758 CALL ZGGES3( 'v
', 'v
', SORT, ZLCTES, N, S, LDA, T, LDA,
759 $ SDIM, ALPHA, BETA, Q, LDQ, Z, LDQ, WORK,
760 $ LWORK, RWORK, BWORK, IINFO )
761.NE..AND..NE.
IF( IINFO0 IINFON+2 ) THEN
762 RESULT( 1+RSUB+ISORT ) = ULPINV
763 WRITE( NOUNIT, FMT = 9999 )'zgges3', IINFO, N, JTYPE,
773.EQ.
IF( ISORT0 ) THEN
774 CALL ZGET51( 1, N, A, LDA, S, LDA, Q, LDQ, Z, LDQ,
775 $ WORK, RWORK, RESULT( 1 ) )
776 CALL ZGET51( 1, N, B, LDA, T, LDA, Q, LDQ, Z, LDQ,
777 $ WORK, RWORK, RESULT( 2 ) )
779 CALL ZGET54( N, A, LDA, B, LDA, S, LDA, T, LDA, Q,
780 $ LDQ, Z, LDQ, WORK, RESULT( 2+RSUB ) )
783 CALL ZGET51( 3, N, B, LDA, T, LDA, Q, LDQ, Q, LDQ, WORK,
784 $ RWORK, RESULT( 3+RSUB ) )
785 CALL ZGET51( 3, N, B, LDA, T, LDA, Z, LDQ, Z, LDQ, WORK,
786 $ RWORK, RESULT( 4+RSUB ) )
797 TEMP2 = ( ABS1( ALPHA( J )-S( J, J ) ) /
798 $ MAX( SAFMIN, ABS1( ALPHA( J ) ), ABS1( S( J,
799 $ J ) ) )+ABS1( BETA( J )-T( J, J ) ) /
800 $ MAX( SAFMIN, ABS1( BETA( J ) ), ABS1( T( J,
804.NE.
IF( S( J+1, J )ZERO ) THEN
806 RESULT( 5+RSUB ) = ULPINV
810.NE.
IF( S( J, J-1 )ZERO ) THEN
812 RESULT( 5+RSUB ) = ULPINV
815 TEMP1 = MAX( TEMP1, TEMP2 )
817 WRITE( NOUNIT, FMT = 9998 )J, N, JTYPE, IOLDSD
820 RESULT( 6+RSUB ) = TEMP1
822.GE.
IF( ISORT1 ) THEN
830 IF( ZLCTES( ALPHA( I ), BETA( I ) ) )
831 $ KNTEIG = KNTEIG + 1
834 $ RESULT( 13 ) = ULPINV
843 NTESTT = NTESTT + NTEST
848.GE.
IF( RESULT( JR )THRESH ) THEN
853.EQ.
IF( NERRS0 ) THEN
854 WRITE( NOUNIT, FMT = 9997 )'zgs
'
858 WRITE( NOUNIT, FMT = 9996 )
859 WRITE( NOUNIT, FMT = 9995 )
860 WRITE( NOUNIT, FMT = 9994 )'unitary
'
864 WRITE( NOUNIT, FMT = 9993 )'unitary
', '''',
865 $ 'transpose
', ( '''', J = 1, 8 )
869.LT.
IF( RESULT( JR )10000.0D0 ) THEN
870 WRITE( NOUNIT, FMT = 9992 )N, JTYPE, IOLDSD, JR,
873 WRITE( NOUNIT, FMT = 9991 )N, JTYPE, IOLDSD, JR,
884 CALL ALASVM( 'zgs
', NOUNIT, NERRS, NTESTT, 0 )
890 9999 FORMAT( ' zdrges3:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
891 $ I6, ', jtype=
', I6, ', iseed=(
', 4( I4, ',
' ), I5, ')
' )
893 9998 FORMAT( ' zdrges3: s not in schur form at eigenvalue
', I6, '.
',
894 $ / 9X, 'n=
', I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ),
897 9997 FORMAT( / 1X, A3, ' --
Complex Generalized Schur from problem
',
900 9996 FORMAT( ' Matrix types (see ZDRGES3 for details):
' )
902 9995 FORMAT( ' Special Matrices:
', 23X,
903 $ '(J
''=transposed jordan block)
',
904 $ / ' 1=(0,0) 2=(i,0) 3=(0,i) 4=(i,i) 5=(j
'',j
'')
',
905 $ '6=(diag(j
'',i), diag(i,j
''))
', / ' diagonal matrices: (
',
906 $ 'd=diag(0,1,2,...) )
', / ' 7=(d,i) 9=(large*d, small*i
',
907 $ ') 11=(large*i, small*d) 13=(large*d, large*i)
', /
908 $ ' 8=(i,d) 10=(small*d, large*i) 12=(small*i, large*d)
',
909 $ ' 14=(small*d, small*i)
', / ' 15=(d, reversed d)
' )
910 9994 FORMAT( ' matrices rotated by random
', A, ' matrices u, v:
',
911 $ / ' 16=transposed jordan blocks 19=geometric
',
912 $ 'alpha, beta=0,1
', / ' 17=arithm. alpha&beta
',
913 $ ' 20=arithmetic alpha, beta=0,1
', / ' 18=clustered
',
914 $ 'alpha, beta=0,1 21=random alpha, beta=0,1
',
915 $ / ' large & small matrices:
', / '',
916 $ '23=(small,large) 24=(small
',
917 $ / ' 26=random o(1) matrices.
' )
919 9993 FORMAT( / ' tests performed: (s is schur, t is triangular, ',
920 $
'Q and Z are ', a,
',', / 19x,
921 $
'l and r are the appropriate left and right', / 19x,
922 $
'eigenvectors, resp., a is alpha, b is beta, and', / 19x, a,
923 $
' means ', a,
'.)', /
' Without ordering: ',
924 $ /
' 1 = | A - Q S Z', a,
925 $
' | / ( |A| n ulp ) 2 = | B - Q T Z', a,
926 $
' | / ( |B| n ulp )', /
' 3 = | I - QQ', a,
927 $
' | / ( n ulp ) 4 = | I - ZZ', a,
928 $
' | / ( n ulp )', /
' 5 = A is in Schur form S',
929 $ /
' 6 = difference between (alpha,beta)',
930 $
' and diagonals of (S,T)', /
' With ordering: ',
931 $ /
' 7 = | (A,B) - Q (S,T) Z', a,
' | / ( |(A,B)| n ulp )',
932 $ /
' 8 = | I - QQ', a,
933 $
' | / ( n ulp ) 9 = | I - ZZ', a,
934 $
' | / ( n ulp )', /
' 10 = A is in Schur form S',
935 $ /
' 11 = difference between (alpha,beta) and diagonals',
936 $
' of (S,T)', /
' 12 = SDIM is the correct number of ',
937 $
'selected eigenvalues', / )
938 9992
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
939 $ 4( i4,
',' ),
' result ', i2,
' is', 0p, f8.2 )
940 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
941 $ 4( i4,
',' ), ' result
', I2, ' is
', 1P, D10.3 )