620 SUBROUTINE zchkst2stg( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
621 $ NOUNIT, A, LDA, AP, SD, SE, D1, D2, D3, D4, D5,
622 $ WA1, WA2, WA3, WR, U, LDU, V, VP, TAU, Z, WORK,
623 $ LWORK, RWORK, LRWORK, IWORK, LIWORK, RESULT,
631 INTEGER INFO, LDA, LDU, LIWORK, LRWORK, LWORK, NOUNIT,
633 DOUBLE PRECISION THRESH
637 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
638 DOUBLE PRECISION D1( * ), D2( * ), D3( * ), D4( * ), D5( * ),
639 $ RESULT( * ), RWORK( * ), SD( * ), SE( * ),
640 $ wa1( * ), wa2( * ), wa3( * ), wr( * )
641 COMPLEX*16 A( LDA, * ), AP( * ), TAU( * ), U( LDU, * ),
642 $ v( ldu, * ), vp( * ), work( * ), z( ldu, * )
648 DOUBLE PRECISION ZERO, ONE, TWO, EIGHT, TEN, HUN
649 PARAMETER ( ZERO = 0.0d0, one = 1.0d0, two = 2.0d0,
650 $ eight = 8.0d0, ten = 10.0d0, hun = 100.0d0 )
651 COMPLEX*16 CZERO, CONE
652 parameter( czero = ( 0.0d+0, 0.0d+0 ),
653 $ cone = ( 1.0d+0, 0.0d+0 ) )
654 DOUBLE PRECISION HALF
655 parameter( half = one / two )
657 PARAMETER ( MAXTYP = 21 )
659 parameter( crange = .false. )
661 parameter( crel = .false. )
664 LOGICAL BADNN, TRYRAC
665 INTEGER I, IINFO, IL, IMODE, INDE, INDRWK, ITEMP,
666 $ ITYPE, IU, J, JC, JR, JSIZE, JTYPE, LGN,
667 $ LIWEDC, LOG2UI, LRWEDC, LWEDC, M, M2, M3,
668 $ mtypes, n, nap, nblock, nerrs, nmats, nmax,
669 $ nsplit, ntest, ntestt, lh, lw
670 DOUBLE PRECISION ABSTOL, ANINV, ANORM, COND, OVFL, RTOVFL,
671 $ RTUNFL, TEMP1, TEMP2, TEMP3, TEMP4, ULP,
672 $ ULPINV, UNFL, VL, VU
675 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ),
676 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
678 DOUBLE PRECISION DUMMA( 1 )
682 DOUBLE PRECISION DLAMCH, DLARND, DSXT1
683 EXTERNAL ILAENV, DLAMCH, DLARND, DSXT1
693 INTRINSIC abs, dble, dconjg, int, log, max, min, sqrt
696 DATA ktype / 1, 2, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 8,
697 $ 8, 8, 9, 9, 9, 9, 9, 10 /
698 DATA kmagn / 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
699 $ 2, 3, 1, 1, 1, 2, 3, 1 /
700 DATA kmode / 0, 0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
701 $ 0, 0, 4, 3, 1, 4, 4, 3 /
719 nmax = max( nmax, nn( j ) )
724 nblock = ilaenv( 1,
'ZHETRD',
'L', nmax, -1, -1, -1 )
725 nblock = min( nmax, max( 1, nblock ) )
729 IF( nsizes.LT.0 )
THEN
731 ELSE IF( badnn )
THEN
733 ELSE IF( ntypes.LT.0 )
THEN
735 ELSE IF( lda.LT.nmax )
THEN
737 ELSE IF( ldu.LT.nmax )
THEN
739 ELSE IF( 2*max( 2, nmax )**2.GT.lwork )
THEN
744 CALL xerbla(
'ZCHKST2STG', -info )
750 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
755 unfl = dlamch(
'Safe minimum' )
758 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
760 log2ui = int( log( ulpinv ) / log( two ) )
761 rtunfl = sqrt( unfl )
762 rtovfl = sqrt( ovfl )
767 iseed2( i ) = iseed( i )
772 DO 310 jsize = 1, nsizes
775 lgn = int( log( dble( n ) ) / log( two ) )
780 lwedc = 1 + 4*n + 2*n*lgn + 4*n**2
781 lrwedc = 1 + 3*n + 2*n*lgn + 4*n**2
782 liwedc = 6 + 6*n + 5*n*lgn
788 nap = ( n*( n+1 ) ) / 2
789 aninv = one / dble( max( 1, n ) )
791 IF( nsizes.NE.1 )
THEN
792 mtypes = min( maxtyp, ntypes )
794 mtypes = min( maxtyp+1, ntypes )
797 DO 300 jtype = 1, mtypes
798 IF( .NOT.dotype( jtype ) )
804 ioldsd( j ) = iseed( j )
823 IF( mtypes.GT.maxtyp )
826 itype = ktype( jtype )
827 imode = kmode( jtype )
831 GO TO ( 40, 50, 60 )kmagn( jtype )
838 anorm = ( rtovfl*ulp )*aninv
842 anorm = rtunfl*n*ulpinv
847 CALL zlaset(
'Full', lda, n, czero, czero, a, lda )
849 IF( jtype.LE.15 )
THEN
852 cond = ulpinv*aninv / ten
859 IF( itype.EQ.1 )
THEN
862 ELSE IF( itype.EQ.2 )
THEN
870 ELSE IF( itype.EQ.4 )
THEN
874 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
875 $ anorm, 0, 0,
'N', a, lda, work, iinfo )
878 ELSE IF( itype.EQ.5 )
THEN
882 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
883 $ anorm, n, n,
'N', a, lda, work, iinfo )
885 ELSE IF( itype.EQ.7 )
THEN
889 CALL zlatmr( n, n,
'S', iseed,
'H', work, 6, one, cone,
890 $
'T',
'N', work( n+1 ), 1, one,
891 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
892 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
894 ELSE IF( itype.EQ.8 )
THEN
898 CALL zlatmr( n, n,
'S', iseed,
'H', work, 6, one, cone,
899 $
'T',
'N', work( n+1 ), 1, one,
900 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
901 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
903 ELSE IF( itype.EQ.9 )
THEN
907 CALL zlatms( n, n,
'S', iseed,
'P', rwork, imode, cond,
908 $ anorm, n, n,
'N', a, lda, work, iinfo )
910 ELSE IF( itype.EQ.10 )
THEN
914 CALL zlatms( n, n,
'S', iseed,
'P', rwork, imode, cond,
915 $ anorm, 1, 1,
'N', a, lda, work, iinfo )
917 temp1 = abs( a( i-1, i ) )
918 temp2 = sqrt( abs( a( i-1, i-1 )*a( i, i ) ) )
919 IF( temp1.GT.half*temp2 )
THEN
920 a( i-1, i ) = a( i-1, i )*
921 $ ( half*temp2 / ( unfl+temp1 ) )
922 a( i, i-1 ) = dconjg( a( i-1, i ) )
931 IF( iinfo.NE.0 )
THEN
932 WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n, jtype,
943 CALL zlacpy(
'U', n, n, a, lda, v, ldu )
946 CALL zhetrd(
'U', n, v, ldu, sd, se, tau, work, lwork,
949 IF( iinfo.NE.0 )
THEN
950 WRITE( nounit, fmt = 9999 )
'ZHETRD(U)', iinfo, n, jtype,
953 IF( iinfo.LT.0 )
THEN
961 CALL zlacpy(
'U', n, n, v, ldu, u, ldu )
964 CALL zungtr(
'U', n, u, ldu, tau, work, lwork, iinfo )
965 IF( iinfo.NE.0 )
THEN
966 WRITE( nounit, fmt = 9999 )
'ZUNGTR(U)', iinfo, n, jtype,
969 IF( iinfo.LT.0 )
THEN
979 CALL zhet21( 2,
'Upper', n, 1, a, lda, sd, se, u, ldu, v,
980 $ ldu, tau, work, rwork, result( 1 ) )
981 CALL zhet21( 3,
'Upper', n, 1, a, lda, sd, se, u, ldu, v,
982 $ ldu, tau, work, rwork, result( 2 ) )
991 CALL dcopy( n, sd, 1, d1, 1 )
993 $
CALL dcopy( n-1, se, 1, rwork, 1 )
995 CALL zsteqr(
'N', n, d1, rwork, work, ldu, rwork( n+1 ),
997 IF( iinfo.NE.0 )
THEN
998 WRITE( nounit, fmt = 9999 )
'ZSTEQR(N)', iinfo, n, jtype,
1001 IF( iinfo.LT.0 )
THEN
1004 result( 3 ) = ulpinv
1014 CALL dlaset(
'Full', n, 1, zero, zero, sd, n )
1015 CALL dlaset(
'Full', n, 1, zero, zero, se, n )
1016 CALL zlacpy(
'U', n, n, a, lda, v, ldu )
1020 $ work, lh, work( lh+1 ), lw, iinfo )
1024 CALL dcopy( n, sd, 1, d2, 1 )
1026 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1029 CALL zsteqr(
'N', n, d2, rwork, work, ldu, rwork( n+1 ),
1031 IF( iinfo.NE.0 )
THEN
1032 WRITE( nounit, fmt = 9999 )
'ZSTEQR(N)', iinfo, n, jtype,
1035 IF( iinfo.LT.0 )
THEN
1038 result( 3 ) = ulpinv
1048 CALL dlaset(
'Full', n, 1, zero, zero, sd, n )
1049 CALL dlaset(
'Full', n, 1, zero, zero, se, n )
1050 CALL zlacpy(
'L', n, n, a, lda, v, ldu )
1052 $ work, lh, work( lh+1 ), lw, iinfo )
1056 CALL dcopy( n, sd, 1, d3, 1 )
1058 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1061 CALL zsteqr(
'N', n, d3, rwork, work, ldu, rwork( n+1 ),
1063 IF( iinfo.NE.0 )
THEN
1064 WRITE( nounit, fmt = 9999 )
'ZSTEQR(N)', iinfo, n, jtype,
1067 IF( iinfo.LT.0 )
THEN
1070 result( 4 ) = ulpinv
1085 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1086 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1087 temp3 = max( temp3, abs( d1( j ) ), abs( d3( j ) ) )
1088 temp4 = max( temp4, abs( d1( j )-d3( j ) ) )
1091 result( 3 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1092 result( 4 ) = temp4 / max( unfl, ulp*max( temp3, temp4 ) )
1100 ap( i ) = a( jr, jc )
1106 CALL zcopy( nap, ap, 1, vp, 1 )
1109 CALL zhptrd(
'U', n, vp, sd, se, tau, iinfo )
1111 IF( iinfo.NE.0 )
THEN
1112 WRITE( nounit, fmt = 9999 )
'ZHPTRD(U)', iinfo, n, jtype,
1115 IF( iinfo.LT.0 )
THEN
1118 result( 5 ) = ulpinv
1124 CALL zupgtr(
'U', n, vp, tau, u, ldu, work, iinfo )
1125 IF( iinfo.NE.0 )
THEN
1126 WRITE( nounit, fmt = 9999 )
'ZUPGTR(U)', iinfo, n, jtype,
1129 IF( iinfo.LT.0 )
THEN
1132 result( 6 ) = ulpinv
1139 CALL zhpt21( 2,
'Upper', n, 1, ap, sd, se, u, ldu, vp, tau,
1140 $ work, rwork, result( 5 ) )
1141 CALL zhpt21( 3,
'Upper', n, 1, ap, sd, se, u, ldu, vp, tau,
1142 $ work, rwork, result( 6 ) )
1150 ap( i ) = a( jr, jc )
1156 CALL zcopy( nap, ap, 1, vp, 1 )
1159 CALL zhptrd(
'L', n, vp, sd, se, tau, iinfo )
1161 IF( iinfo.NE.0 )
THEN
1162 WRITE( nounit, fmt = 9999 )
'ZHPTRD(L)', iinfo, n, jtype,
1165 IF( iinfo.LT.0 )
THEN
1168 result( 7 ) = ulpinv
1174 CALL zupgtr(
'L', n, vp, tau, u, ldu, work, iinfo )
1175 IF( iinfo.NE.0 )
THEN
1176 WRITE( nounit, fmt = 9999 )
'ZUPGTR(L)', iinfo, n, jtype,
1179 IF( iinfo.LT.0 )
THEN
1182 result( 8 ) = ulpinv
1187 CALL zhpt21( 2,
'Lower', n, 1, ap, sd, se, u, ldu, vp, tau,
1188 $ work, rwork, result( 7 ) )
1189 CALL zhpt21( 3,
'Lower', n, 1, ap, sd, se, u, ldu, vp, tau,
1190 $ work, rwork, result( 8 ) )
1196 CALL dcopy( n, sd, 1, d1, 1 )
1198 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1199 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1202 CALL zsteqr(
'V', n, d1, rwork, z, ldu, rwork( n+1 ),
1204 IF( iinfo.NE.0 )
THEN
1205 WRITE( nounit, fmt = 9999 )
'ZSTEQR(V)', iinfo, n, jtype,
1208 IF( iinfo.LT.0 )
THEN
1211 result( 9 ) = ulpinv
1218 CALL dcopy( n, sd, 1, d2, 1 )
1220 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1223 CALL zsteqr(
'N', n, d2, rwork, work, ldu, rwork( n+1 ),
1225 IF( iinfo.NE.0 )
THEN
1226 WRITE( nounit, fmt = 9999 )
'ZSTEQR(N)', iinfo, n, jtype,
1229 IF( iinfo.LT.0 )
THEN
1232 result( 11 ) = ulpinv
1239 CALL dcopy( n, sd, 1, d3, 1 )
1241 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1244 CALL dsterf( n, d3, rwork, iinfo )
1245 IF( iinfo.NE.0 )
THEN
1246 WRITE( nounit, fmt = 9999 )
'DSTERF', iinfo, n, jtype,
1249 IF( iinfo.LT.0 )
THEN
1252 result( 12 ) = ulpinv
1259 CALL zstt21( n, 0, sd, se, d1, dumma, z, ldu, work, rwork,
1270 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1271 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1272 temp3 = max( temp3, abs( d1( j ) ), abs( d3( j ) ) )
1273 temp4 = max( temp4, abs( d1( j )-d3( j ) ) )
1276 result( 11 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1277 result( 12 ) = temp4 / max( unfl, ulp*max( temp3, temp4 ) )
1283 temp1 = thresh*( half-ulp )
1285 DO 160 j = 0, log2ui
1286 CALL dstech( n, sd, se, d1, temp1, rwork, iinfo )
1293 result( 13 ) = temp1
1298 IF( jtype.GT.15 )
THEN
1302 CALL dcopy( n, sd, 1, d4, 1 )
1304 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1305 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1308 CALL zpteqr(
'V', n, d4, rwork, z, ldu, rwork( n+1 ),
1310 IF( iinfo.NE.0 )
THEN
1311 WRITE( nounit, fmt = 9999 )
'ZPTEQR(V)', iinfo, n,
1314 IF( iinfo.LT.0 )
THEN
1317 result( 14 ) = ulpinv
1324 CALL zstt21( n, 0, sd, se, d4, dumma, z, ldu, work,
1325 $ rwork, result( 14 ) )
1329 CALL dcopy( n, sd, 1, d5, 1 )
1331 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1334 CALL zpteqr(
'N', n, d5, rwork, z, ldu, rwork( n+1 ),
1336 IF( iinfo.NE.0 )
THEN
1337 WRITE( nounit, fmt = 9999 )
'ZPTEQR(N)', iinfo, n,
1340 IF( iinfo.LT.0 )
THEN
1343 result( 16 ) = ulpinv
1353 temp1 = max( temp1, abs( d4( j ) ), abs( d5( j ) ) )
1354 temp2 = max( temp2, abs( d4( j )-d5( j ) ) )
1357 result( 16 ) = temp2 / max( unfl,
1358 $ hun*ulp*max( temp1, temp2 ) )
1374 IF( jtype.EQ.21 )
THEN
1376 abstol = unfl + unfl
1377 CALL dstebz(
'A',
'E', n, vl, vu, il, iu, abstol, sd, se,
1378 $ m, nsplit, wr, iwork( 1 ), iwork( n+1 ),
1379 $ rwork, iwork( 2*n+1 ), iinfo )
1380 IF( iinfo.NE.0 )
THEN
1381 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A,rel)', iinfo, n,
1384 IF( iinfo.LT.0 )
THEN
1387 result( 17 ) = ulpinv
1394 temp2 = two*( two*n-one )*ulp*( one+eight*half**2 ) /
1399 temp1 = max( temp1, abs( d4( j )-wr( n-j+1 ) ) /
1400 $ ( abstol+abs( d4( j ) ) ) )
1403 result( 17 ) = temp1 / temp2
1411 abstol = unfl + unfl
1412 CALL dstebz(
'A',
'E', n, vl, vu, il, iu, abstol, sd, se, m,
1413 $ nsplit, wa1, iwork( 1 ), iwork( n+1 ), rwork,
1414 $ iwork( 2*n+1 ), iinfo )
1415 IF( iinfo.NE.0 )
THEN
1416 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A)', iinfo, n, jtype,
1419 IF( iinfo.LT.0 )
THEN
1422 result( 18 ) = ulpinv
1432 temp1 = max( temp1, abs( d3( j ) ), abs( wa1( j ) ) )
1433 temp2 = max( temp2, abs( d3( j )-wa1( j ) ) )
1436 result( 18 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1446 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1447 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1455 CALL dstebz(
'I',
'E', n, vl, vu, il, iu, abstol, sd, se,
1456 $ m2, nsplit, wa2, iwork( 1 ), iwork( n+1 ),
1457 $ rwork, iwork( 2*n+1 ), iinfo )
1458 IF( iinfo.NE.0 )
THEN
1459 WRITE( nounit, fmt = 9999 )
'DSTEBZ(I)', iinfo, n, jtype,
1462 IF( iinfo.LT.0 )
THEN
1465 result( 19 ) = ulpinv
1475 vl = wa1( il ) - max( half*( wa1( il )-wa1( il-1 ) ),
1476 $ ulp*anorm, two*rtunfl )
1478 vl = wa1( 1 ) - max( half*( wa1( n )-wa1( 1 ) ),
1479 $ ulp*anorm, two*rtunfl )
1482 vu = wa1( iu ) + max( half*( wa1( iu+1 )-wa1( iu ) ),
1483 $ ulp*anorm, two*rtunfl )
1485 vu = wa1( n ) + max( half*( wa1( n )-wa1( 1 ) ),
1486 $ ulp*anorm, two*rtunfl )
1493 CALL dstebz(
'V',
'E', n, vl, vu, il, iu, abstol, sd, se,
1494 $ m3, nsplit, wa3, iwork( 1 ), iwork( n+1 ),
1495 $ rwork, iwork( 2*n+1 ), iinfo )
1496 IF( iinfo.NE.0 )
THEN
1497 WRITE( nounit, fmt = 9999 )
'DSTEBZ(V)', iinfo, n, jtype,
1500 IF( iinfo.LT.0 )
THEN
1503 result( 19 ) = ulpinv
1508 IF( m3.EQ.0 .AND. n.NE.0 )
THEN
1509 result( 19 ) = ulpinv
1515 temp1 = dsxt1( 1, wa2, m2, wa3, m3, abstol, ulp, unfl )
1516 temp2 = dsxt1( 1, wa3, m3, wa2, m2, abstol, ulp, unfl )
1518 temp3 = max( abs( wa1( n ) ), abs( wa1( 1 ) ) )
1523 result( 19 ) = ( temp1+temp2 ) / max( unfl, temp3*ulp )
1530 CALL dstebz(
'A',
'B', n, vl, vu, il, iu, abstol, sd, se, m,
1531 $ nsplit, wa1, iwork( 1 ), iwork( n+1 ), rwork,
1532 $ iwork( 2*n+1 ), iinfo )
1533 IF( iinfo.NE.0 )
THEN
1534 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A,B)', iinfo, n,
1537 IF( iinfo.LT.0 )
THEN
1540 result( 20 ) = ulpinv
1541 result( 21 ) = ulpinv
1546 CALL zstein( n, sd, se, m, wa1, iwork( 1 ), iwork( n+1 ), z,
1547 $ ldu, rwork, iwork( 2*n+1 ), iwork( 3*n+1 ),
1549 IF( iinfo.NE.0 )
THEN
1550 WRITE( nounit, fmt = 9999 )
'ZSTEIN', iinfo, n, jtype,
1553 IF( iinfo.LT.0 )
THEN
1556 result( 20 ) = ulpinv
1557 result( 21 ) = ulpinv
1564 CALL zstt21( n, 0, sd, se, wa1, dumma, z, ldu, work, rwork,
1573 CALL dcopy( n, sd, 1, d1, 1 )
1575 $
CALL dcopy( n-1, se, 1, rwork( inde ), 1 )
1576 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1579 CALL zstedc(
'I', n, d1, rwork( inde ), z, ldu, work, lwedc,
1580 $ rwork( indrwk ), lrwedc, iwork, liwedc, iinfo )
1581 IF( iinfo.NE.0 )
THEN
1582 WRITE( nounit, fmt = 9999 )
'ZSTEDC(I)', iinfo, n, jtype,
1585 IF( iinfo.LT.0 )
THEN
1588 result( 22 ) = ulpinv
1595 CALL zstt21( n, 0, sd, se, d1, dumma, z, ldu, work, rwork,
1602 CALL dcopy( n, sd, 1, d1, 1 )
1604 $
CALL dcopy( n-1, se, 1, rwork( inde ), 1 )
1605 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1608 CALL zstedc(
'V', n, d1, rwork( inde ), z, ldu, work, lwedc,
1609 $ rwork( indrwk ), lrwedc, iwork, liwedc, iinfo )
1610 IF( iinfo.NE.0 )
THEN
1611 WRITE( nounit, fmt = 9999 )
'ZSTEDC(V)', iinfo, n, jtype,
1614 IF( iinfo.LT.0 )
THEN
1617 result( 24 ) = ulpinv
1624 CALL zstt21( n, 0, sd, se, d1, dumma, z, ldu, work, rwork,
1631 CALL dcopy( n, sd, 1, d2, 1 )
1633 $
CALL dcopy( n-1, se, 1, rwork( inde ), 1 )
1634 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1637 CALL zstedc(
'N', n, d2, rwork( inde ), z, ldu, work, lwedc,
1638 $ rwork( indrwk ), lrwedc, iwork, liwedc, iinfo )
1639 IF( iinfo.NE.0 )
THEN
1640 WRITE( nounit, fmt = 9999 )
'ZSTEDC(N)', iinfo, n, jtype,
1643 IF( iinfo.LT.0 )
THEN
1646 result( 26 ) = ulpinv
1657 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1658 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1661 result( 26 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1665 IF( ilaenv( 10,
'ZSTEMR',
'VA', 1, 0, 0, 0 ).EQ.1 .AND.
1666 $ ilaenv( 11,
'ZSTEMR',
'VA', 1, 0, 0, 0 ).EQ.1 )
THEN
1677 IF( jtype.EQ.21 .AND. crel )
THEN
1679 abstol = unfl + unfl
1680 CALL zstemr(
'V',
'A', n, sd, se, vl, vu, il, iu,
1681 $ m, wr, z, ldu, n, iwork( 1 ), tryrac,
1682 $ rwork, lrwork, iwork( 2*n+1 ), lwork-2*n,
1684 IF( iinfo.NE.0 )
THEN
1685 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,A,rel)',
1686 $ iinfo, n, jtype, ioldsd
1688 IF( iinfo.LT.0 )
THEN
1691 result( 27 ) = ulpinv
1698 temp2 = two*( two*n-one )*ulp*( one+eight*half**2 ) /
1703 temp1 = max( temp1, abs( d4( j )-wr( n-j+1 ) ) /
1704 $ ( abstol+abs( d4( j ) ) ) )
1707 result( 27 ) = temp1 / temp2
1709 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1710 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1719 abstol = unfl + unfl
1720 CALL zstemr(
'V',
'I', n, sd, se, vl, vu, il, iu,
1721 $ m, wr, z, ldu, n, iwork( 1 ), tryrac,
1722 $ rwork, lrwork, iwork( 2*n+1 ),
1723 $ lwork-2*n, iinfo )
1725 IF( iinfo.NE.0 )
THEN
1726 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,I,rel)',
1727 $ iinfo, n, jtype, ioldsd
1729 IF( iinfo.LT.0 )
THEN
1732 result( 28 ) = ulpinv
1739 temp2 = two*( two*n-one )*ulp*
1740 $ ( one+eight*half**2 ) / ( one-half )**4
1744 temp1 = max( temp1, abs( wr( j-il+1 )-d4( n-j+
1745 $ 1 ) ) / ( abstol+abs( wr( j-il+1 ) ) ) )
1748 result( 28 ) = temp1 / temp2
1761 CALL dcopy( n, sd, 1, d5, 1 )
1763 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1764 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1768 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1769 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1775 CALL zstemr(
'V',
'I', n, d5, rwork, vl, vu, il, iu,
1776 $ m, d1, z, ldu, n, iwork( 1 ), tryrac,
1777 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1778 $ liwork-2*n, iinfo )
1779 IF( iinfo.NE.0 )
THEN
1780 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,I)', iinfo,
1783 IF( iinfo.LT.0 )
THEN
1786 result( 29 ) = ulpinv
1797 CALL dcopy( n, sd, 1, d5, 1 )
1799 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1802 CALL zstemr(
'N',
'I', n, d5, rwork, vl, vu, il, iu,
1803 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1804 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1805 $ liwork-2*n, iinfo )
1806 IF( iinfo.NE.0 )
THEN
1807 WRITE( nounit, fmt = 9999 )
'ZSTEMR(N,I)', iinfo,
1810 IF( iinfo.LT.0 )
THEN
1813 result( 31 ) = ulpinv
1823 DO 240 j = 1, iu - il + 1
1824 temp1 = max( temp1, abs( d1( j ) ),
1826 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1829 result( 31 ) = temp2 / max( unfl,
1830 $ ulp*max( temp1, temp2 ) )
1836 CALL dcopy( n, sd, 1, d5, 1 )
1838 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1839 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1845 vl = d2( il ) - max( half*
1846 $ ( d2( il )-d2( il-1 ) ), ulp*anorm,
1849 vl = d2( 1 ) - max( half*( d2( n )-d2( 1 ) ),
1850 $ ulp*anorm, two*rtunfl )
1853 vu = d2( iu ) + max( half*
1854 $ ( d2( iu+1 )-d2( iu ) ), ulp*anorm,
1857 vu = d2( n ) + max( half*( d2( n )-d2( 1 ) ),
1858 $ ulp*anorm, two*rtunfl )
1865 CALL zstemr(
'V',
'V', n, d5, rwork, vl, vu, il, iu,
1866 $ m, d1, z, ldu, m, iwork( 1 ), tryrac,
1867 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1868 $ liwork-2*n, iinfo )
1869 IF( iinfo.NE.0 )
THEN
1870 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,V)', iinfo,
1873 IF( iinfo.LT.0 )
THEN
1876 result( 32 ) = ulpinv
1883 CALL zstt22( n, m, 0, sd, se, d1, dumma, z, ldu, work,
1884 $ m, rwork, result( 32 ) )
1890 CALL dcopy( n, sd, 1, d5, 1 )
1892 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1895 CALL zstemr(
'N',
'V', n, d5, rwork, vl, vu, il, iu,
1896 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1897 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1898 $ liwork-2*n, iinfo )
1899 IF( iinfo.NE.0 )
THEN
1900 WRITE( nounit, fmt = 9999 )
'ZSTEMR(N,V)', iinfo,
1903 IF( iinfo.LT.0 )
THEN
1906 result( 34 ) = ulpinv
1916 DO 250 j = 1, iu - il + 1
1917 temp1 = max( temp1, abs( d1( j ) ),
1919 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1922 result( 34 ) = temp2 / max( unfl,
1923 $ ulp*max( temp1, temp2 ) )
1937 CALL dcopy( n, sd, 1, d5, 1 )
1939 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1943 CALL zstemr(
'V',
'A', n, d5, rwork, vl, vu, il, iu,
1944 $ m, d1, z, ldu, n, iwork( 1 ), tryrac,
1945 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1946 $ liwork-2*n, iinfo )
1947 IF( iinfo.NE.0 )
THEN
1948 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,A)', iinfo, n,
1951 IF( iinfo.LT.0 )
THEN
1954 result( 35 ) = ulpinv
1961 CALL zstt22( n, m, 0, sd, se, d1, dumma, z, ldu, work, m,
1962 $ rwork, result( 35 ) )
1968 CALL dcopy( n, sd, 1, d5, 1 )
1970 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1973 CALL zstemr(
'N',
'A', n, d5, rwork, vl, vu, il, iu,
1974 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1975 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1976 $ liwork-2*n, iinfo )
1977 IF( iinfo.NE.0 )
THEN
1978 WRITE( nounit, fmt = 9999 )
'ZSTEMR(N,A)', iinfo, n,
1981 IF( iinfo.LT.0 )
THEN
1984 result( 37 ) = ulpinv
1995 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1996 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1999 result( 37 ) = temp2 / max( unfl,
2000 $ ulp*max( temp1, temp2 ) )
2004 ntestt = ntestt + ntest
2010 DO 290 jr = 1, ntest
2011 IF( result( jr ).GE.thresh )
THEN
2016 IF( nerrs.EQ.0 )
THEN
2017 WRITE( nounit, fmt = 9998 )
'ZST'
2018 WRITE( nounit, fmt = 9997 )
2019 WRITE( nounit, fmt = 9996 )
2020 WRITE( nounit, fmt = 9995 )
'Hermitian'
2021 WRITE( nounit, fmt = 9994 )
2025 WRITE( nounit, fmt = 9987 )
2028 IF( result( jr ).LT.10000.0d0 )
THEN
2029 WRITE( nounit, fmt = 9989 )n, jtype, ioldsd, jr,
2032 WRITE( nounit, fmt = 9988 )n, jtype, ioldsd, jr,
2042 CALL dlasum(
'ZST', nounit, nerrs, ntestt )
2045 9999
FORMAT(
' ZCHKST2STG: ', a,
' returned INFO=', i6,
'.', / 9x,
2046 $
'N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
2048 9998
FORMAT( / 1x, a3,
' -- Complex Hermitian eigenvalue problem' )
2049 9997
FORMAT(
' Matrix types (see ZCHKST2STG for details): ' )
2051 9996
FORMAT( /
' Special Matrices:',
2052 $ /
' 1=Zero matrix. ',
2053 $
' 5=Diagonal: clustered entries.',
2054 $ /
' 2=Identity matrix. ',
2055 $
' 6=Diagonal: large, evenly spaced.',
2056 $ /
' 3=Diagonal: evenly spaced entries. ',
2057 $
' 7=Diagonal: small, evenly spaced.',
2058 $ /
' 4=Diagonal: geometr. spaced entries.' )
2059 9995
FORMAT(
' Dense ', a,
' Matrices:',
2060 $ /
' 8=Evenly spaced eigenvals. ',
2061 $
' 12=Small, evenly spaced eigenvals.',
2062 $ /
' 9=Geometrically spaced eigenvals. ',
2063 $
' 13=Matrix with random O(1) entries.',
2064 $ /
' 10=Clustered eigenvalues. ',
2065 $
' 14=Matrix with large random entries.',
2066 $ /
' 11=Large, evenly spaced eigenvals. ',
2067 $
' 15=Matrix with small random entries.' )
2068 9994
FORMAT(
' 16=Positive definite, evenly spaced eigenvalues',
2069 $ /
' 17=Positive definite, geometrically spaced eigenvlaues',
2070 $ /
' 18=Positive definite, clustered eigenvalues',
2071 $ /
' 19=Positive definite, small evenly spaced eigenvalues',
2072 $ /
' 20=Positive definite, large evenly spaced eigenvalues',
2073 $ /
' 21=Diagonally dominant tridiagonal, geometrically',
2074 $
' spaced eigenvalues' )
2076 9989
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
2077 $ 4( i4,
',' ),
' result ', i3,
' is', 0p, f8.2 )
2078 9988
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
2079 $ 4( i4,
',' ),
' result ', i3,
' is', 1p, d10.3 )
2081 9987
FORMAT( /
'Test performed: see ZCHKST2STG for details.', / )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dstebz(RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL, D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK, IWORK, INFO)
DSTEBZ
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
subroutine zstt22(N, M, KBAND, AD, AE, SD, SE, U, LDU, WORK, LDWORK, RWORK, RESULT)
ZSTT22
subroutine zstt21(N, KBAND, AD, AE, SD, SE, U, LDU, WORK, RWORK, RESULT)
ZSTT21
subroutine zhet21(ITYPE, UPLO, N, KBAND, A, LDA, D, E, U, LDU, V, LDV, TAU, WORK, RWORK, RESULT)
ZHET21
subroutine zchkst2stg(NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, NOUNIT, A, LDA, AP, SD, SE, D1, D2, D3, D4, D5, WA1, WA2, WA3, WR, U, LDU, V, VP, TAU, Z, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, RESULT, INFO)
ZCHKST2STG
subroutine zhpt21(ITYPE, UPLO, N, KBAND, AP, D, E, U, LDU, VP, TAU, WORK, RWORK, RESULT)
ZHPT21
subroutine zlatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
ZLATMS
subroutine zlatmr(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, RSIGN, GRADE, DL, MODEL, CONDL, DR, MODER, CONDR, PIVTNG, IPIVOT, KL, KU, SPARSE, ANORM, PACK, A, LDA, IWORK, INFO)
ZLATMR
subroutine zhetrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
ZHETRD_2STAGE
subroutine zhetrd(UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO)
ZHETRD
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zsteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
ZSTEQR
subroutine zstemr(JOBZ, RANGE, N, D, E, VL, VU, IL, IU, M, W, Z, LDZ, NZC, ISUPPZ, TRYRAC, WORK, LWORK, IWORK, LIWORK, INFO)
ZSTEMR
subroutine zungtr(UPLO, N, A, LDA, TAU, WORK, LWORK, INFO)
ZUNGTR
subroutine zhptrd(UPLO, N, AP, D, E, TAU, INFO)
ZHPTRD
subroutine zstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
ZSTEIN
subroutine zstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, RWORK, LRWORK, IWORK, LIWORK, INFO)
ZSTEDC
subroutine zupgtr(UPLO, N, AP, TAU, Q, LDQ, WORK, INFO)
ZUPGTR
subroutine zpteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
ZPTEQR
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dlasum(TYPE, IOUNIT, IE, NRUN)
DLASUM
subroutine dstech(N, A, B, EIG, TOL, WORK, INFO)
DSTECH