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
754 CALL clacpy(
'Full', n, n, a, lda, s, lda )
755 CALL clacpy(
'Full', n, n, b, lda, t, lda )
756 ntest = 1 + rsub + isort
757 result( 1+rsub+isort ) = ulpinv
758 CALL cgges3(
'V',
'V', sort, clctes, n, s, lda, t, lda,
759 $ sdim, alpha, beta, q, ldq, z, ldq, work,
760 $ lwork, rwork, bwork, iinfo )
761 IF( iinfo.NE.0 .AND. iinfo.NE.n+2 )
THEN
762 result( 1+rsub+isort ) = ulpinv
763 WRITE( nounit, fmt = 9999 )
'CGGES3', iinfo, n, jtype,
773 IF( isort.EQ.0 )
THEN
774 CALL cget51( 1, n, a, lda, s, lda, q, ldq, z, ldq,
775 $ work, rwork, result( 1 ) )
776 CALL cget51( 1, n, b, lda, t, lda, q, ldq, z, ldq,
777 $ work, rwork, result( 2 ) )
779 CALL cget54( n, a, lda, b, lda, s, lda, t, lda, q,
780 $ ldq, z, ldq, work, result( 2+rsub ) )
783 CALL cget51( 3, n, b, lda, t, lda, q, ldq, q, ldq, work,
784 $ rwork, result( 3+rsub ) )
785 CALL cget51( 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 IF( s( j+1, j ).NE.zero )
THEN
806 result( 5+rsub ) = ulpinv
810 IF( s( j, j-1 ).NE.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 IF( isort.GE.1 )
THEN
830 IF( clctes( alpha( i ), beta( i ) ) )
831 $ knteig = knteig + 1
834 $ result( 13 ) = ulpinv
843 ntestt = ntestt + ntest
848 IF( result( jr ).GE.thresh )
THEN
853 IF( nerrs.EQ.0 )
THEN
854 WRITE( nounit, fmt = 9997 )
'CGS'
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 IF( result( jr ).LT.10000.0 )
THEN
870 WRITE( nounit, fmt = 9992 )n, jtype, ioldsd, jr,
873 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
884 CALL alasvm(
'CGS', nounit, nerrs, ntestt, 0 )
890 9999
FORMAT(
' CDRGES3: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
891 $ i6,
', JTYPE=', i6,
', ISEED=(', 4( i4,
',' ), i5,
')' )
893 9998
FORMAT(
' CDRGES3: 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 CDRGES3 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:', /
' 22=(large, small) ',
916 $
'23=(small,large) 24=(small,small) 25=(large,large)',
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, e10.3 )
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine xlaenv(ISPEC, NVALUE)
XLAENV
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...