378 SUBROUTINE cdrges3( 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 INFO, LDA, LDQ, LWORK, NOUNIT, NSIZES, NTYPES
392 LOGICAL BWORK( * ), DOTYPE( * )
393 INTEGER ISEED( 4 ), NN( * )
394 REAL RESULT( 13 ), RWORK( * )
395 COMPLEX A( LDA, * ), ALPHA( * ), B( LDA, * ),
396 $ beta( * ), q( ldq, * ), s( lda, * ),
397 $ t( lda, * ), work( * ), z( ldq, * )
404 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
406 parameter( czero = ( 0.0e+0, 0.0e+0 ),
407 $ cone = ( 1.0e+0, 0.0e+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 REAL 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 ), kz2( 6 )
435 EXTERNAL clctes, ilaenv, slamch, clarnd
442 INTRINSIC abs, aimag, conjg, max, min, real, sign
448 abs1( x ) = abs( real( x ) ) + abs( aimag( 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,
'CGEQRF',
' ', nmax, nmax, -1, -1 ),
514 $ ilaenv( 1,
'CUNMQR',
'LC', nmax, nmax, nmax, -1 ),
515 $ ilaenv( 1,
'CUNGQR',
' ', nmax, nmax, nmax, -1 ) )
516 maxwrk = max( nmax+nmax*nb, 3*nmax*nmax)
520 IF( lwork.LT.minwrk )
524 CALL xerbla(
'CDRGES3', -info )
530 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
533 ulp = slamch(
'Precision' )
534 safmin = slamch(
'Safe minimum' )
535 safmin = safmin / ulp
536 safmax = one / safmin
537 CALL slabad( safmin, safmax )
551 DO 190 jsize = 1, nsizes
554 rmagn( 2 ) = safmax*ulp / real( n1 )
555 rmagn( 3 ) = safmin*ulpinv*real( 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 claset(
'Full', n, n, czero, czero, a, lda )
618 CALL clatm4( 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 claset(
'Full', n, n, czero, czero, b, lda )
636 CALL clatm4( 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 ) = clarnd( 3, iseed )
655 z( jr, jc ) = clarnd( 3, iseed )
657 CALL clarfg( n+1-jc, q( jc, jc ), q( jc+1, jc ), 1,
659 work( 2*n+jc ) = sign( one, real( q( jc, jc ) ) )
661 CALL clarfg( n+1-jc, z( jc, jc ), z( jc+1, jc ), 1,
663 work( 3*n+jc ) = sign( one, real( z( jc, jc ) ) )
666 ctemp = clarnd( 3, iseed )
669 work( 3*n ) = ctemp / abs( ctemp )
670 ctemp = clarnd( 3, iseed )
673 work( 4*n ) = ctemp / abs( ctemp )
679 a( jr, jc ) = work( 2*n+jr )*
680 $ conjg( work( 3*n+jc ) )*
682 b( jr, jc ) = work( 2*n+jr )*
683 $ conjg( work( 3*n+jc ) )*
687 CALL cunm2r(
'L',
'N', n, n, n-1, q, ldq, work, a,
688 $ lda, work( 2*n+1 ), iinfo )
691 CALL cunm2r(
'R',
'C', n, n, n-1, z, ldq, work( n+1 ),
692 $ a, lda, work( 2*n+1 ), iinfo )
695 CALL cunm2r(
'L',
'N', n, n, n-1, q, ldq, work, b,
696 $ lda, work( 2*n+1 ), iinfo )
699 CALL cunm2r(
'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 IF( iinfo.NE.0 )
THEN
721 WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n, jtype,
736 IF( isort.EQ.0 )
THEN
746 CALL clacpy(
'Full', n, n, a, lda, s, lda )
747 CALL clacpy(
'Full', n, n, b, lda, t, lda )
748 ntest = 1 + rsub + isort
749 result( 1+rsub+isort ) = ulpinv
750 CALL cgges3(
'V',
'V', sort, clctes, n, s, lda, t, lda,
751 $ sdim, alpha, beta, q, ldq, z, ldq, work,
752 $ lwork, rwork, bwork, iinfo )
753 IF( iinfo.NE.0 .AND. iinfo.NE.n+2 )
THEN
754 result( 1+rsub+isort ) = ulpinv
755 WRITE( nounit, fmt = 9999 )
'CGGES3', iinfo, n, jtype,
765 IF( isort.EQ.0 )
THEN
766 CALL cget51( 1, n, a, lda, s, lda, q, ldq, z, ldq,
767 $ work, rwork, result( 1 ) )
768 CALL cget51( 1, n, b, lda, t, lda, q, ldq, z, ldq,
769 $ work, rwork, result( 2 ) )
771 CALL cget54( n, a, lda, b, lda, s, lda, t, lda, q,
772 $ ldq, z, ldq, work, result( 2+rsub ) )
775 CALL cget51( 3, n, b, lda, t, lda, q, ldq, q, ldq, work,
776 $ rwork, result( 3+rsub ) )
777 CALL cget51( 3, n, b, lda, t, lda, z, ldq, z, ldq, work,
778 $ rwork, result( 4+rsub ) )
789 temp2 = ( abs1( alpha( j )-s( j, j ) ) /
790 $ max( safmin, abs1( alpha( j ) ), abs1( s( j,
791 $ j ) ) )+abs1( beta( j )-t( j, j ) ) /
792 $ max( safmin, abs1( beta( j ) ), abs1( t( j,
796 IF( s( j+1, j ).NE.zero )
THEN
798 result( 5+rsub ) = ulpinv
802 IF( s( j, j-1 ).NE.zero )
THEN
804 result( 5+rsub ) = ulpinv
807 temp1 = max( temp1, temp2 )
809 WRITE( nounit, fmt = 9998 )j, n, jtype, ioldsd
812 result( 6+rsub ) = temp1
814 IF( isort.GE.1 )
THEN
822 IF( clctes( alpha( i ), beta( i ) ) )
823 $ knteig = knteig + 1
826 $ result( 13 ) = ulpinv
835 ntestt = ntestt + ntest
840 IF( result( jr ).GE.thresh )
THEN
845 IF( nerrs.EQ.0 )
THEN
846 WRITE( nounit, fmt = 9997 )
'CGS'
850 WRITE( nounit, fmt = 9996 )
851 WRITE( nounit, fmt = 9995 )
852 WRITE( nounit, fmt = 9994 )
'Unitary'
856 WRITE( nounit, fmt = 9993 )
'unitary',
'''',
857 $
'transpose', (
'''', j = 1, 8 )
861 IF( result( jr ).LT.10000.0 )
THEN
862 WRITE( nounit, fmt = 9992 )n, jtype, ioldsd, jr,
865 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
876 CALL alasvm(
'CGS', nounit, nerrs, ntestt, 0 )
882 9999
FORMAT(
' CDRGES3: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
883 $ i6,
', JTYPE=', i6,
', ISEED=(', 4( i4,
',' ), i5,
')' )
885 9998
FORMAT(
' CDRGES3: S not in Schur form at eigenvalue ', i6,
'.',
886 $ / 9x,
'N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
889 9997
FORMAT( / 1x, a3,
' -- Complex Generalized Schur from problem ',
892 9996
FORMAT(
' Matrix types (see CDRGES3 for details): ' )
894 9995
FORMAT(
' Special Matrices:', 23x,
895 $
'(J''=transposed Jordan block)',
896 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'') ',
897 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
898 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
899 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
900 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
901 $
' 14=(small*D, small*I)', /
' 15=(D, reversed D)' )
902 9994
FORMAT(
' Matrices Rotated by Random ', a,
' Matrices U, V:',
903 $ /
' 16=Transposed Jordan Blocks 19=geometric ',
904 $
'alpha, beta=0,1', /
' 17=arithm. alpha&beta ',
905 $
' 20=arithmetic alpha, beta=0,1', /
' 18=clustered ',
906 $
'alpha, beta=0,1 21=random alpha, beta=0,1',
907 $ /
' Large & Small Matrices:', /
' 22=(large, small) ',
908 $
'23=(small,large) 24=(small,small) 25=(large,large)',
909 $ /
' 26=random O(1) matrices.' )
911 9993
FORMAT( /
' Tests performed: (S is Schur, T is triangular, ',
912 $
'Q and Z are ', a,
',', / 19x,
913 $
'l and r are the appropriate left and right', / 19x,
914 $
'eigenvectors, resp., a is alpha, b is beta, and', / 19x, a,
915 $
' means ', a,
'.)', /
' Without ordering: ',
916 $ /
' 1 = | A - Q S Z', a,
917 $
' | / ( |A| n ulp ) 2 = | B - Q T Z', a,
918 $
' | / ( |B| n ulp )', /
' 3 = | I - QQ', a,
919 $
' | / ( n ulp ) 4 = | I - ZZ', a,
920 $
' | / ( n ulp )', /
' 5 = A is in Schur form S',
921 $ /
' 6 = difference between (alpha,beta)',
922 $
' and diagonals of (S,T)', /
' With ordering: ',
923 $ /
' 7 = | (A,B) - Q (S,T) Z', a,
' | / ( |(A,B)| n ulp )',
924 $ /
' 8 = | I - QQ', a,
925 $
' | / ( n ulp ) 9 = | I - ZZ', a,
926 $
' | / ( n ulp )', /
' 10 = A is in Schur form S',
927 $ /
' 11 = difference between (alpha,beta) and diagonals',
928 $
' of (S,T)', /
' 12 = SDIM is the correct number of ',
929 $
'selected eigenvalues', / )
930 9992
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
931 $ 4( i4,
',' ),
' result ', i2,
' is', 0p, f8.2 )
932 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
933 $ 4( i4,
',' ),
' result ', i2,
' is', 1p, e10.3 )
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine clatm4(ITYPE, N, NZ1, NZ2, RSIGN, AMAGN, RCOND, TRIANG, IDIST, ISEED, A, LDA)
CLATM4
subroutine cdrges3(NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, NOUNIT, A, LDA, B, S, T, Q, LDQ, Z, ALPHA, BETA, WORK, LWORK, RWORK, RESULT, BWORK, INFO)
CDRGES3
subroutine cget51(ITYPE, N, A, LDA, B, LDB, U, LDU, V, LDV, WORK, RWORK, RESULT)
CGET51
subroutine cget54(N, A, LDA, B, LDB, S, LDS, T, LDT, U, LDU, V, LDV, WORK, RESULT)
CGET54
subroutine cgges3(JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB, SDIM, ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK, LWORK, RWORK, BWORK, INFO)
CGGES3 computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE ...
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine clarfg(N, ALPHA, X, INCX, TAU)
CLARFG generates an elementary reflector (Householder matrix).
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine cunm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
CUNM2R multiplies a general matrix by the unitary matrix from a QR factorization determined by cgeqrf...