378 SUBROUTINE cdrges( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
379 $ NOUNIT, A, LDA, B, S, T, Q, LDQ, Z, ALPHA,
380 $ BETA, WORK, LWORK, RWORK, RESULT, BWORK, INFO )
387 INTEGER INFO, LDA, LDQ, LWORK, NOUNIT, NSIZES, NTYPES
391 LOGICAL BWORK( * ), DOTYPE( * )
392 INTEGER ISEED( 4 ), NN( * )
393 REAL RESULT( 13 ), RWORK( * )
394 COMPLEX A( LDA, * ), ALPHA( * ), B( LDA, * ),
395 $ beta( * ), q( ldq, * ), s( lda, * ),
396 $ t( lda, * ), work( * ), z( ldq, * )
403 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
405 parameter( czero = ( 0.0e+0, 0.0e+0 ),
406 $ cone = ( 1.0e+0, 0.0e+0 ) )
408 PARAMETER ( MAXTYP = 26 )
411 LOGICAL BADNN, ILABAD
413 INTEGER I, IADD, IINFO, IN, ISORT, J, JC, JR, JSIZE,
414 $ jtype, knteig, maxwrk, minwrk, mtypes, n, n1,
415 $ nb, nerrs, nmats, nmax, ntest, ntestt, rsub,
417 REAL SAFMAX, SAFMIN, , TEMP2, ULP, ULPINV
421 LOGICAL LASIGN( MAXTYP ), ( MAXTYP )
422 INTEGER IOLDSD( 4 ), KADD( 6 ), KAMAGN( MAXTYP ),
423 $ katype( maxtyp ), kazero( maxtyp ),
424 $ kbmagn( maxtyp ), kbtype( maxtyp ),
425 $ kbzero( maxtyp ), kclass( maxtyp ),
426 $ ktrian( maxtyp ), kz1( 6 ), kz2( 6 )
434 EXTERNAL clctes, ilaenv, slamch, clarnd
441 INTRINSIC abs, aimag, conjg,
max,
min, real, sign
447 abs1( x ) = abs( real( x ) ) + abs( aimag( x ) )
450 DATA kclass / 15*1, 10*2, 1*3 /
451 DATA kz1 / 0, 1, 2, 1, 3, 3 /
452 DATA kz2 / 0, 0, 1, 2, 1, 1 /
453 DATA kadd / 0, 0, 0, 0, 3, 2 /
454 DATA katype / 0, 1, 0, 1, 2, 3, 4, 1, 4, 4, 1, 1, 4,
455 $ 4, 4, 2, 4, 5, 8, 7, 9, 4*4, 0 /
456 DATA kbtype / 0, 0, 1, 1, 2, -3, 1, 4, 1, 1, 4, 4,
457 $ 1, 1, -4, 2, -4, 8*8, 0 /
458 DATA kazero / 6*1, 2, 1, 2*2, 2*1, 2*2, 3, 1, 3,
460 DATA kbzero / 6*1, 1, 2, 2*1, 2*2, 2*1, 4, 1, 4,
462 DATA kamagn / 8*1, 2, 3, 2, 3, 2, 3, 7*1, 2, 3, 3,
464 DATA kbmagn / 8*1, 3, 2, 3, 2, 2, 3, 7*1, 3, 2, 3,
466 DATA ktrian / 16*0, 10*1 /
467 DATA lasign / 6*.false., .true., .false., 2*.true.,
468 $ 2*.false., 3*.true., .false., .true.,
469 $ 3*.false., 5*.true., .false. /
470 DATA lbsign / 7*.false., .true., 2*.false.,
471 $ 2*.true., 2*.false., .true., .false., .true.,
483 nmax =
max( nmax, nn( j ) )
488 IF( nsizes.LT.0 )
THEN
490 ELSE IF( badnn )
THEN
492 ELSE IF( ntypes.LT.0 )
THEN
494 ELSE IF( thresh.LT.zero )
THEN
496 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
498 ELSE IF( ldq.LE.1 .OR. ldq.LT.nmax )
THEN
510 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
512 nb =
max( 1, ilaenv( 1,
'CGEQRF',
' ', nmax, nmax, -1, -1 ),
513 $ ilaenv( 1,
'CUNMQR',
'LC', nmax, nmax, nmax, -1 ),
514 $ ilaenv( 1,
'CUNGQR',
' ', nmax, nmax, nmax, -1 ) )
515 maxwrk =
max( nmax+nmax*nb, 3*nmax*nmax
519 IF( lwork.LT.minwrk )
523 CALL xerbla(
'CDRGES', -info )
529 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
532 ulp = slamch(
'Precision' )
533 safmin = slamch(
'Safe minimum' )
534 safmin = safmin / ulp
535 safmax = one / safmin
536 CALL slabad( safmin, safmax )
550 DO 190 jsize = 1, nsizes
553 rmagn( 2 ) = safmax*ulp / real( n1 )
554 rmagn( 3 ) = safmin*ulpinv*real( n1 )
556 IF( nsizes.NE.1 )
THEN
557 mtypes =
min( maxtyp, ntypes )
559 mtypes =
min( maxtyp+1, ntypes )
564 DO 180 jtype = 1, mtypes
565 IF( .NOT.dotype( jtype ) )
573 ioldsd( j ) = iseed( j )
603 IF( mtypes.GT.maxtyp )
606 IF( kclass( jtype ).LT.3 )
THEN
610 IF( abs( katype( jtype ) ).EQ.3 )
THEN
611 in = 2*( ( n-1 ) / 2 ) + 1
613 $
CALL claset(
'Full', n, n, czero, czero, a, lda )
617 CALL clatm4( katype( jtype ), in, kz1( kazero( jtype ) ),
618 $ kz2( kazero( jtype ) ), lasign( jtype ),
619 $ rmagn( kamagn( jtype ) ), ulp,
620 $ rmagn( ktrian( jtype )*kamagn( jtype ) ), 2,
622 iadd = kadd( kazero( jtype ) )
623 IF( iadd.GT.0 .AND. iadd.LE.n )
624 $ a( iadd, iadd ) = rmagn( kamagn( jtype ) )
628 IF( abs( kbtype( jtype ) ).EQ.3 )
THEN
629 in = 2*( ( n-1 ) / 2 ) + 1
631 $
CALL claset( 'full
', N, N, CZERO, CZERO, B, LDA )
635 CALL CLATM4( KBTYPE( JTYPE ), IN, KZ1( KBZERO( JTYPE ) ),
636 $ KZ2( KBZERO( JTYPE ) ), LBSIGN( JTYPE ),
637 $ RMAGN( KBMAGN( JTYPE ) ), ONE,
638 $ RMAGN( KTRIAN( JTYPE )*KBMAGN( JTYPE ) ), 2,
640 IADD = KADD( KBZERO( JTYPE ) )
641.NE..AND..LE.
IF( IADD0 IADDN )
642 $ B( IADD, IADD ) = RMAGN( KBMAGN( JTYPE ) )
644.EQ..AND..GT.
IF( KCLASS( JTYPE )2 N0 ) THEN
653 Q( JR, JC ) = CLARND( 3, ISEED )
654 Z( JR, JC ) = CLARND( 3, ISEED )
656 CALL CLARFG( N+1-JC, Q( JC, JC ), Q( JC+1, JC ), 1,
658 WORK( 2*N+JC ) = SIGN( ONE, REAL( Q( JC, JC ) ) )
660 CALL CLARFG( N+1-JC, Z( JC, JC ), Z( JC+1, JC ), 1,
662 WORK( 3*N+JC ) = SIGN( ONE, REAL( Z( JC, JC ) ) )
665 CTEMP = CLARND( 3, ISEED )
668 WORK( 3*N ) = CTEMP / ABS( CTEMP )
669 CTEMP = CLARND( 3, ISEED )
672 WORK( 4*N ) = CTEMP / ABS( CTEMP )
678 A( JR, JC ) = WORK( 2*N+JR )*
679 $ CONJG( WORK( 3*N+JC ) )*
681 B( JR, JC ) = WORK( 2*N+JR )*
682 $ CONJG( WORK( 3*N+JC ) )*
686 CALL CUNM2R( 'l
', 'n
', N, N, N-1, Q, LDQ, WORK, A,
687 $ LDA, WORK( 2*N+1 ), IINFO )
690 CALL CUNM2R( 'r
', 'c
', N, N, N-1, Z, LDQ, WORK( N+1 ),
691 $ A, LDA, WORK( 2*N+1 ), IINFO )
694 CALL CUNM2R( 'l
', 'n
', N, N, N-1, Q, LDQ, WORK, B,
695 $ LDA, WORK( 2*N+1 ), IINFO )
698 CALL CUNM2R( 'r
', 'c
', N, N, N-1, Z, LDQ, WORK( N+1 ),
699 $ B, LDA, WORK( 2*N+1 ), IINFO )
709 A( JR, JC ) = RMAGN( KAMAGN( JTYPE ) )*
711 B( JR, JC ) = RMAGN( KBMAGN( JTYPE ) )*
719.NE.
IF( IINFO0 ) THEN
720 WRITE( NOUNIT, FMT = 9999 )'generator
', IINFO, N, JTYPE,
735.EQ.
IF( ISORT0 ) THEN
745 CALL CLACPY( 'full
', N, N, A, LDA, S, LDA )
746 CALL CLACPY( 'full
', N, N, B, LDA, T, LDA )
747 NTEST = 1 + RSUB + ISORT
748 RESULT( 1+RSUB+ISORT ) = ULPINV
749 CALL CGGES( 'v
', 'v
', SORT, CLCTES, N, S, LDA, T, LDA,
750 $ SDIM, ALPHA, BETA, Q, LDQ, Z, LDQ, WORK,
751 $ LWORK, RWORK, BWORK, IINFO )
752.NE..AND..NE.
IF( IINFO0 IINFON+2 ) THEN
753 RESULT( 1+RSUB+ISORT ) = ULPINV
754 WRITE( NOUNIT, FMT = 9999 )'cgges', IINFO, N, JTYPE,
764.EQ.
IF( ISORT0 ) THEN
765 CALL CGET51( 1, N, A, LDA, S, LDA, Q, LDQ, Z, LDQ,
766 $ WORK, RWORK, RESULT( 1 ) )
767 CALL CGET51( 1, N, B, LDA, T, LDA, Q, LDQ, Z, LDQ,
768 $ WORK, RWORK, RESULT( 2 ) )
770 CALL CGET54( N, A, LDA, B, LDA, S, LDA, T, LDA, Q,
771 $ LDQ, Z, LDQ, WORK, RESULT( 2+RSUB ) )
774 CALL CGET51( 3, N, B, LDA, T, LDA, Q, LDQ, Q, LDQ, WORK,
775 $ RWORK, RESULT( 3+RSUB ) )
776 CALL CGET51( 3, N, B, LDA, T, LDA, Z, LDQ, Z, LDQ, WORK,
777 $ RWORK, RESULT( 4+RSUB ) )
788 TEMP2 = ( ABS1( ALPHA( J )-S( J, J ) ) /
789 $ MAX( SAFMIN, ABS1( ALPHA( J ) ), ABS1( S( J,
790 $ J ) ) )+ABS1( BETA( J )-T( J, J ) ) /
791 $ MAX( SAFMIN, ABS1( BETA( J ) ), ABS1( T( J,
795.NE.
IF( S( J+1, J )ZERO ) THEN
797 RESULT( 5+RSUB ) = ULPINV
801.NE.
IF( S( J, J-1 )ZERO ) THEN
803 RESULT( 5+RSUB ) = ULPINV
806 TEMP1 = MAX( TEMP1, TEMP2 )
808 WRITE( NOUNIT, FMT = 9998 )J, N, JTYPE, IOLDSD
811 RESULT( 6+RSUB ) = TEMP1
813.GE.
IF( ISORT1 ) THEN
821 IF( CLCTES( ALPHA( I ), BETA( I ) ) )
822 $ KNTEIG = KNTEIG + 1
825 $ RESULT( 13 ) = ULPINV
834 NTESTT = NTESTT + NTEST
839.GE.
IF( RESULT( JR )THRESH ) THEN
844.EQ.
IF( NERRS0 ) THEN
845 WRITE( NOUNIT, FMT = 9997 )'cgs
'
849 WRITE( NOUNIT, FMT = 9996 )
850 WRITE( NOUNIT, FMT = 9995 )
851 WRITE( NOUNIT, FMT = 9994 )'unitary
'
855 WRITE( NOUNIT, FMT = 9993 )'unitary
', '''',
856 $ 'transpose
', ( '''', J = 1, 8 )
860.LT.
IF( RESULT( JR )10000.0 ) THEN
861 WRITE( NOUNIT, FMT = 9992 )N, JTYPE, IOLDSD, JR,
864 WRITE( NOUNIT, FMT = 9991 )N, JTYPE, IOLDSD, JR,
875 CALL ALASVM( 'cgs
', NOUNIT, NERRS, NTESTT, 0 )
881 9999 FORMAT( ' cdrges:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
882 $ I6, ', jtype=
', I6, ', iseed=(
', 4( I4, ',
' ), I5, ')
' )
884 9998 FORMAT( ' cdrges: s not in schur form at eigenvalue
', I6, '.
',
885 $ / 9X, 'n=
', I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ),
888 9997 FORMAT( / 1X, A3, ' --
Complex Generalized Schur from problem
',
891 9996 FORMAT( ' Matrix types (see CDRGES for details):
' )
893 9995 FORMAT( ' Special Matrices:
', 23X,
894 $ '(J
''=transposed jordan block)
',
895 $ / ' 1=(0,0) 2=(i,0) 3=(0,i) 4=(i,i) 5=(j
'',j
'')
',
896 $ '6=(diag(j
'',i), diag(i,j
''))
', / ' diagonal matrices: (
',
897 $ 'd=diag(0,1,2,...) )
', / ' 7=(d,i) 9=(large*d, small*i
',
898 $ ') 11=(large*i, small*d) 13=(large*d, large*i)
', /
899 $ ' 8=(i,d) 10=(small*d, large*i) 12=(small*i, large*d)
',
900 $ ' 14=(small*d, small*i)
', / ' 15=(d, reversed d)
' )
901 9994 FORMAT( ' matrices rotated by random
', A, ' matrices u, v:
',
902 $ / ' 16=transposed jordan blocks 19=geometric
',
903 $ 'alpha, beta=0,1
', / ' 17=arithm. alpha&beta
',
904 $ ' 20=arithmetic alpha, beta=0,1
', / ' 18=clustered
',
905 $ 'alpha, beta=0,1 21=random alpha, beta=0,1
',
906 $ / ' large & small matrices:
', / ' 22=(large, small) ',
907 $
'23=(small,large) 24=(small,small) 25=(large,large)',
908 $ /
' 26=random O(1) matrices.' )
910 9993
FORMAT( /
' Tests performed: (S is Schur, T is triangular, ',
911 $
'Q and Z are ', a,
',', / 19x,
912 $
'l and r are the appropriate left and right', / 19x,
913 $
'eigenvectors, resp., a is alpha, b is beta, and', / 19x, a,
914 $
' means ', a,
'.)', / ' without ordering:
',
915 $ / ' 1 = | a - q s z
', A,
916 $ ' | / ( |a| n ulp ) 2 = | b - q t z
', A,
917 $ ' | / ( |b| n ulp )
', / ' 3 = | i - qq
', A,
918 $ ' | / ( n ulp ) 4 = | i - zz
', A,
919 $ ' | / ( n ulp )
', / ' 5 = a is in schur form s
',
920 $ / ' 6 = difference between(alpha,beta)
',
921 $ ' and diagonals of(s,t)
', / ' with ordering:
',
922 $ / ' 7 = | (a,b) - q(s,t) z
', A, ' | / ( |(a,b)| n ulp )
',
923 $ / ' 8 = | i - qq
', A,
924 $ ' | / ( n ulp ) 9 = | i - zz
', A,
925 $ ' | / ( n ulp )
', / ' 10 = a is in schur form s
',
926 $ / ' 11 = difference between(alpha,beta) and diagonals
',
927 $ ' of(s,t)
', / ' 12 = sdim is
the correct number of
',
928 $ 'selected eigenvalues
', / )
929 9992 FORMAT( ' matrix order=
', I5, ', type=
', I2, ',
seed=
',
930 $ 4( I4, ',
' ), ' result
', I2, ' is
', 0P, F8.2 )
931 9991 FORMAT( ' matrix order=
', I5, ', type=
', I2, ',
seed=
',
932 $ 4( I4, ',
' ), ' result
', I2, ' is
', 1P, E10.3 )