599 SUBROUTINE zchkst( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
600 $ NOUNIT, A, LDA, AP, SD, SE, D1, D2, D3, D4, D5,
601 $ WA1, WA2, WA3, WR, U, LDU, V, VP, TAU, Z, WORK,
602 $ LWORK, RWORK, LRWORK, IWORK, LIWORK, RESULT,
610 INTEGER INFO, LDA, LDU, LIWORK, LRWORK, LWORK, NOUNIT,
612 DOUBLE PRECISION THRESH
616 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
617 DOUBLE PRECISION D1( * ), D2( * ), D3( * ), D4( * ), D5( * ),
618 $ RESULT( * ), RWORK( * ), SD( * ), SE( * ),
619 $ wa1( * ), wa2( * ), wa3( * ), wr( * )
620 COMPLEX*16 A( LDA, * ), AP( * ), TAU( * ), U( LDU, * ),
621 $ v( ldu, * ), vp( * ), work( * ), z( ldu, * )
627 DOUBLE PRECISION ZERO, ONE, TWO, EIGHT, TEN, HUN
628 PARAMETER ( ZERO = 0.0d0, one = 1.0d0, two = 2.0d0,
629 $ eight = 8.0d0, ten = 10.0d0, hun = 100.0d0 )
630 COMPLEX*16 CZERO, CONE
631 parameter( czero = ( 0.0d+0, 0.0d+0 ),
632 $ cone = ( 1.0d+0, 0.0d+0 ) )
633 DOUBLE PRECISION HALF
634 parameter( half = one / two )
636 PARAMETER ( MAXTYP = 21 )
638 parameter( crange = .false. )
640 parameter( crel = .false. )
643 LOGICAL BADNN, TRYRAC
644 INTEGER I, IINFO, IL, IMODE, INDE, INDRWK, ITEMP,
645 $ ITYPE, IU, J, JC, JR, JSIZE, JTYPE, LGN,
646 $ LIWEDC, LOG2UI, LRWEDC, LWEDC, M, M2, M3,
647 $ mtypes, n, nap, nblock, nerrs, nmats, nmax,
648 $ nsplit, ntest, ntestt
649 DOUBLE PRECISION ABSTOL, ANINV, ANORM, COND, OVFL, RTOVFL,
650 $ RTUNFL, TEMP1, TEMP2, TEMP3, TEMP4, ULP,
651 $ ULPINV, UNFL, VL, VU
654 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ),
655 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
657 DOUBLE PRECISION DUMMA( 1 )
661 DOUBLE PRECISION DLAMCH, DLARND, DSXT1
662 EXTERNAL ILAENV, DLAMCH, DLARND, DSXT1
672 INTRINSIC abs, dble, dconjg, int, log, max, min, sqrt
675 DATA ktype / 1, 2, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 8,
676 $ 8, 8, 9, 9, 9, 9, 9, 10 /
677 DATA kmagn / 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
678 $ 2, 3, 1, 1, 1, 2, 3, 1 /
679 DATA kmode / 0, 0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
680 $ 0, 0, 4, 3, 1, 4, 4, 3 /
698 nmax = max( nmax, nn( j ) )
703 nblock = ilaenv( 1,
'ZHETRD',
'L', nmax, -1, -1, -1 )
704 nblock = min( nmax, max( 1, nblock ) )
708 IF( nsizes.LT.0 )
THEN
710 ELSE IF( badnn )
THEN
712 ELSE IF( ntypes.LT.0 )
THEN
714 ELSE IF( lda.LT.nmax )
THEN
716 ELSE IF( ldu.LT.nmax )
THEN
718 ELSE IF( 2*max( 2, nmax )**2.GT.lwork )
THEN
723 CALL xerbla(
'ZCHKST', -info )
729 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
734 unfl = dlamch(
'Safe minimum' )
737 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
739 log2ui = int( log( ulpinv ) / log( two ) )
740 rtunfl = sqrt( unfl )
741 rtovfl = sqrt( ovfl )
746 iseed2( i ) = iseed( i )
751 DO 310 jsize = 1, nsizes
754 lgn = int( log( dble( n ) ) / log( two ) )
759 lwedc = 1 + 4*n + 2*n*lgn + 4*n**2
760 lrwedc = 1 + 3*n + 2*n*lgn + 4*n**2
761 liwedc = 6 + 6*n + 5*n*lgn
767 nap = ( n*( n+1 ) ) / 2
768 aninv = one / dble( max( 1, n ) )
770 IF( nsizes.NE.1 )
THEN
771 mtypes = min( maxtyp, ntypes )
773 mtypes = min( maxtyp+1, ntypes )
776 DO 300 jtype = 1, mtypes
777 IF( .NOT.dotype( jtype ) )
783 ioldsd( j ) = iseed( j )
802 IF( mtypes.GT.maxtyp )
805 itype = ktype( jtype )
806 imode = kmode( jtype )
810 GO TO ( 40, 50, 60 )kmagn( jtype )
817 anorm = ( rtovfl*ulp )*aninv
821 anorm = rtunfl*n*ulpinv
826 CALL zlaset(
'Full', lda, n, czero, czero, a, lda )
828 IF( jtype.LE.15 )
THEN
831 cond = ulpinv*aninv / ten
838 IF( itype.EQ.1 )
THEN
841 ELSE IF( itype.EQ.2 )
THEN
849 ELSE IF( itype.EQ.4 )
THEN
853 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
854 $ anorm, 0, 0,
'N', a, lda, work, iinfo )
857 ELSE IF( itype.EQ.5 )
THEN
861 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
862 $ anorm, n, n,
'N', a, lda, work, iinfo )
864 ELSE IF( itype.EQ.7 )
THEN
868 CALL zlatmr( n, n,
'S', iseed,
'H', work, 6, one, cone,
869 $
'T',
'N', work( n+1 ), 1, one,
870 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
871 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
873 ELSE IF( itype.EQ.8 )
THEN
877 CALL zlatmr( n, n,
'S', iseed,
'H', work, 6, one, cone,
878 $
'T',
'N', work( n+1 ), 1, one,
879 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
880 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
882 ELSE IF( itype.EQ.9 )
THEN
886 CALL zlatms( n, n,
'S', iseed,
'P', rwork, imode, cond,
887 $ anorm, n, n,
'N', a, lda, work, iinfo )
889 ELSE IF( itype.EQ.10 )
THEN
893 CALL zlatms( n, n,
'S', iseed,
'P', rwork, imode, cond,
894 $ anorm, 1, 1,
'N', a, lda, work, iinfo )
896 temp1 = abs( a( i-1, i ) )
897 temp2 = sqrt( abs( a( i-1, i-1 )*a( i, i ) ) )
898 IF( temp1.GT.half*temp2 )
THEN
899 a( i-1, i ) = a( i-1, i )*
900 $ ( half*temp2 / ( unfl+temp1 ) )
901 a( i, i-1 ) = dconjg( a( i-1, i ) )
910 IF( iinfo.NE.0 )
THEN
911 WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n, jtype,
922 CALL zlacpy(
'U', n, n, a, lda, v, ldu )
925 CALL zhetrd(
'U', n, v, ldu, sd, se, tau, work, lwork,
928 IF( iinfo.NE.0 )
THEN
929 WRITE( nounit, fmt = 9999 )
'ZHETRD(U)', iinfo, n, jtype,
932 IF( iinfo.LT.0 )
THEN
940 CALL zlacpy(
'U', n, n, v, ldu, u, ldu )
943 CALL zungtr(
'U', n, u, ldu, tau, work, lwork, iinfo )
944 IF( iinfo.NE.0 )
THEN
945 WRITE( nounit, fmt = 9999 )
'ZUNGTR(U)', iinfo, n, jtype,
948 IF( iinfo.LT.0 )
THEN
958 CALL zhet21( 2,
'Upper', n, 1, a, lda, sd, se, u, ldu, v,
959 $ ldu, tau, work, rwork, result( 1 ) )
960 CALL zhet21( 3,
'Upper', n, 1, a, lda, sd, se, u, ldu, v,
961 $ ldu, tau, work, rwork, result( 2 ) )
966 CALL zlacpy(
'L', n, n, a, lda, v, ldu )
969 CALL zhetrd(
'L', n, v, ldu, sd, se, tau, work, lwork,
972 IF( iinfo.NE.0 )
THEN
973 WRITE( nounit, fmt = 9999 )
'ZHETRD(L)', iinfo, n, jtype,
976 IF( iinfo.LT.0 )
THEN
984 CALL zlacpy(
'L', n, n, v, ldu, u, ldu )
987 CALL zungtr(
'L', n, u, ldu, tau, work, lwork, iinfo )
988 IF( iinfo.NE.0 )
THEN
989 WRITE( nounit, fmt = 9999 )
'ZUNGTR(L)', iinfo, n, jtype,
992 IF( iinfo.LT.0 )
THEN
1000 CALL zhet21( 2,
'Lower', n, 1, a, lda, sd, se, u, ldu, v,
1001 $ ldu, tau, work, rwork, result( 3 ) )
1002 CALL zhet21( 3,
'Lower', n, 1, a, lda, sd, se, u, ldu, v,
1003 $ ldu, tau, work, rwork, result( 4 ) )
1011 ap( i ) = a( jr, jc )
1017 CALL zcopy( nap, ap, 1, vp, 1 )
1020 CALL zhptrd(
'U', n, vp, sd, se, tau, iinfo )
1022 IF( iinfo.NE.0 )
THEN
1023 WRITE( nounit, fmt = 9999 )
'ZHPTRD(U)', iinfo, n, jtype,
1026 IF( iinfo.LT.0 )
THEN
1029 result( 5 ) = ulpinv
1035 CALL zupgtr(
'U', n, vp, tau, u, ldu, work, iinfo )
1036 IF( iinfo.NE.0 )
THEN
1037 WRITE( nounit, fmt = 9999 )
'ZUPGTR(U)', iinfo, n, jtype,
1040 IF( iinfo.LT.0 )
THEN
1043 result( 6 ) = ulpinv
1050 CALL zhpt21( 2,
'Upper', n, 1, ap, sd, se, u, ldu, vp, tau,
1051 $ work, rwork, result( 5 ) )
1052 CALL zhpt21( 3,
'Upper', n, 1, ap, sd, se, u, ldu, vp, tau,
1053 $ work, rwork, result( 6 ) )
1061 ap( i ) = a( jr, jc )
1067 CALL zcopy( nap, ap, 1, vp, 1 )
1070 CALL zhptrd(
'L', n, vp, sd, se, tau, iinfo )
1072 IF( iinfo.NE.0 )
THEN
1073 WRITE( nounit, fmt = 9999 )
'ZHPTRD(L)', iinfo, n, jtype,
1076 IF( iinfo.LT.0 )
THEN
1079 result( 7 ) = ulpinv
1085 CALL zupgtr(
'L', n, vp, tau, u, ldu, work, iinfo )
1086 IF( iinfo.NE.0 )
THEN
1087 WRITE( nounit, fmt = 9999 )
'ZUPGTR(L)', iinfo, n, jtype,
1090 IF( iinfo.LT.0 )
THEN
1093 result( 8 ) = ulpinv
1098 CALL zhpt21( 2,
'Lower', n, 1, ap, sd, se, u, ldu, vp, tau,
1099 $ work, rwork, result( 7 ) )
1100 CALL zhpt21( 3,
'Lower', n, 1, ap, sd, se, u, ldu, vp, tau,
1101 $ work, rwork, result( 8 ) )
1107 CALL dcopy( n, sd, 1, d1, 1 )
1109 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1110 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1113 CALL zsteqr(
'V', n, d1, rwork, z, ldu, rwork( n+1 ),
1115 IF( iinfo.NE.0 )
THEN
1116 WRITE( nounit, fmt = 9999 )
'ZSTEQR(V)', iinfo, n, jtype,
1119 IF( iinfo.LT.0 )
THEN
1122 result( 9 ) = ulpinv
1129 CALL dcopy( n, sd, 1, d2, 1 )
1131 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1134 CALL zsteqr(
'N', n, d2, rwork, work, ldu, rwork( n+1 ),
1136 IF( iinfo.NE.0 )
THEN
1137 WRITE( nounit, fmt = 9999 )
'ZSTEQR(N)', iinfo, n, jtype,
1140 IF( iinfo.LT.0 )
THEN
1143 result( 11 ) = ulpinv
1150 CALL dcopy( n, sd, 1, d3, 1 )
1152 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1155 CALL dsterf( n, d3, rwork, iinfo )
1156 IF( iinfo.NE.0 )
THEN
1157 WRITE( nounit, fmt = 9999 )
'DSTERF', iinfo, n, jtype,
1160 IF( iinfo.LT.0 )
THEN
1163 result( 12 ) = ulpinv
1170 CALL zstt21( n, 0, sd, se, d1, dumma, z, ldu, work, rwork,
1181 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1182 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1183 temp3 = max( temp3, abs( d1( j ) ), abs( d3( j ) ) )
1184 temp4 = max( temp4, abs( d1( j )-d3( j ) ) )
1187 result( 11 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1188 result( 12 ) = temp4 / max( unfl, ulp*max( temp3, temp4 ) )
1194 temp1 = thresh*( half-ulp )
1196 DO 160 j = 0, log2ui
1197 CALL dstech( n, sd, se, d1, temp1, rwork, iinfo )
1204 result( 13 ) = temp1
1209 IF( jtype.GT.15 )
THEN
1213 CALL dcopy( n, sd, 1, d4, 1 )
1215 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1216 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1219 CALL zpteqr(
'V', n, d4, rwork, z, ldu, rwork( n+1 ),
1221 IF( iinfo.NE.0 )
THEN
1222 WRITE( nounit, fmt = 9999 )
'ZPTEQR(V)', iinfo, n,
1225 IF( iinfo.LT.0 )
THEN
1228 result( 14 ) = ulpinv
1235 CALL zstt21( n, 0, sd, se, d4, dumma, z, ldu, work,
1236 $ rwork, result( 14 ) )
1240 CALL dcopy( n, sd, 1, d5, 1 )
1242 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1245 CALL zpteqr(
'N', n, d5, rwork, z, ldu, rwork( n+1 ),
1247 IF( iinfo.NE.0 )
THEN
1248 WRITE( nounit, fmt = 9999 )
'ZPTEQR(N)', iinfo, n,
1251 IF( iinfo.LT.0 )
THEN
1254 result( 16 ) = ulpinv
1264 temp1 = max( temp1, abs( d4( j ) ), abs( d5( j ) ) )
1265 temp2 = max( temp2, abs( d4( j )-d5( j ) ) )
1268 result( 16 ) = temp2 / max( unfl,
1269 $ hun*ulp*max( temp1, temp2 ) )
1285 IF( jtype.EQ.21 )
THEN
1287 abstol = unfl + unfl
1288 CALL dstebz(
'A',
'E', n, vl, vu, il, iu, abstol, sd, se,
1289 $ m, nsplit, wr, iwork( 1 ), iwork( n+1 ),
1290 $ rwork, iwork( 2*n+1 ), iinfo )
1291 IF( iinfo.NE.0 )
THEN
1292 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A,rel)', iinfo, n,
1295 IF( iinfo.LT.0 )
THEN
1298 result( 17 ) = ulpinv
1305 temp2 = two*( two*n-one )*ulp*( one+eight*half**2 ) /
1310 temp1 = max( temp1, abs( d4( j )-wr( n-j+1 ) ) /
1311 $ ( abstol+abs( d4( j ) ) ) )
1314 result( 17 ) = temp1 / temp2
1322 abstol = unfl + unfl
1323 CALL dstebz(
'A',
'E', n, vl, vu, il, iu, abstol, sd, se, m,
1324 $ nsplit, wa1, iwork( 1 ), iwork( n+1 ), rwork,
1325 $ iwork( 2*n+1 ), iinfo )
1326 IF( iinfo.NE.0 )
THEN
1327 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A)', iinfo, n, jtype,
1330 IF( iinfo.LT.0 )
THEN
1333 result( 18 ) = ulpinv
1343 temp1 = max( temp1, abs( d3( j ) ), abs( wa1( j ) ) )
1344 temp2 = max( temp2, abs( d3( j )-wa1( j ) ) )
1347 result( 18 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1357 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1358 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1366 CALL dstebz(
'I',
'E', n, vl, vu, il, iu, abstol, sd, se,
1367 $ m2, nsplit, wa2, iwork( 1 ), iwork( n+1 ),
1368 $ rwork, iwork( 2*n+1 ), iinfo )
1369 IF( iinfo.NE.0 )
THEN
1370 WRITE( nounit, fmt = 9999 )
'DSTEBZ(I)', iinfo, n, jtype,
1373 IF( iinfo.LT.0 )
THEN
1376 result( 19 ) = ulpinv
1386 vl = wa1( il ) - max( half*( wa1( il )-wa1( il-1 ) ),
1387 $ ulp*anorm, two*rtunfl )
1389 vl = wa1( 1 ) - max( half*( wa1( n )-wa1( 1 ) ),
1390 $ ulp*anorm, two*rtunfl )
1393 vu = wa1( iu ) + max( half*( wa1( iu+1 )-wa1( iu ) ),
1394 $ ulp*anorm, two*rtunfl )
1396 vu = wa1( n ) + max( half*( wa1( n )-wa1( 1 ) ),
1397 $ ulp*anorm, two*rtunfl )
1404 CALL dstebz(
'V',
'E', n, vl, vu, il, iu, abstol, sd, se,
1405 $ m3, nsplit, wa3, iwork( 1 ), iwork( n+1 ),
1406 $ rwork, iwork( 2*n+1 ), iinfo )
1407 IF( iinfo.NE.0 )
THEN
1408 WRITE( nounit, fmt = 9999 )
'DSTEBZ(V)', iinfo, n, jtype,
1411 IF( iinfo.LT.0 )
THEN
1414 result( 19 ) = ulpinv
1419 IF( m3.EQ.0 .AND. n.NE.0 )
THEN
1420 result( 19 ) = ulpinv
1426 temp1 = dsxt1( 1, wa2, m2, wa3, m3, abstol, ulp, unfl )
1427 temp2 = dsxt1( 1, wa3, m3, wa2, m2, abstol, ulp, unfl )
1429 temp3 = max( abs( wa1( n ) ), abs( wa1( 1 ) ) )
1434 result( 19 ) = ( temp1+temp2 ) / max( unfl, temp3*ulp )
1441 CALL dstebz(
'A',
'B', n, vl, vu, il, iu, abstol, sd, se, m,
1442 $ nsplit, wa1, iwork( 1 ), iwork( n+1 ), rwork,
1443 $ iwork( 2*n+1 ), iinfo )
1444 IF( iinfo.NE.0 )
THEN
1445 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A,B)', iinfo, n,
1448 IF( iinfo.LT.0 )
THEN
1451 result( 20 ) = ulpinv
1452 result( 21 ) = ulpinv
1457 CALL zstein( n, sd, se, m, wa1, iwork( 1 ), iwork( n+1 ), z,
1458 $ ldu, rwork, iwork( 2*n+1 ), iwork( 3*n+1 ),
1460 IF( iinfo.NE.0 )
THEN
1461 WRITE( nounit, fmt = 9999 )
'ZSTEIN', iinfo, n, jtype,
1464 IF( iinfo.LT.0 )
THEN
1467 result( 20 ) = ulpinv
1468 result( 21 ) = ulpinv
1475 CALL zstt21( n, 0, sd, se, wa1, dumma, z, ldu, work, rwork,
1484 CALL dcopy( n, sd, 1, d1, 1 )
1486 $
CALL dcopy( n-1, se, 1, rwork( inde ), 1 )
1487 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1490 CALL zstedc(
'I', n, d1, rwork( inde ), z, ldu, work, lwedc,
1491 $ rwork( indrwk ), lrwedc, iwork, liwedc, iinfo )
1492 IF( iinfo.NE.0 )
THEN
1493 WRITE( nounit, fmt = 9999 )
'ZSTEDC(I)', iinfo, n, jtype,
1496 IF( iinfo.LT.0 )
THEN
1499 result( 22 ) = ulpinv
1506 CALL zstt21( n, 0, sd, se, d1, dumma, z, ldu, work, rwork,
1513 CALL dcopy( n, sd, 1, d1, 1 )
1515 $
CALL dcopy( n-1, se, 1, rwork( inde ), 1 )
1516 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1519 CALL zstedc(
'V', n, d1, rwork( inde ), z, ldu, work, lwedc,
1520 $ rwork( indrwk ), lrwedc, iwork, liwedc, iinfo )
1521 IF( iinfo.NE.0 )
THEN
1522 WRITE( nounit, fmt = 9999 )
'ZSTEDC(V)', iinfo, n, jtype,
1525 IF( iinfo.LT.0 )
THEN
1528 result( 24 ) = ulpinv
1535 CALL zstt21( n, 0, sd, se, d1, dumma, z, ldu, work, rwork,
1542 CALL dcopy( n, sd, 1, d2, 1 )
1544 $
CALL dcopy( n-1, se, 1, rwork( inde ), 1 )
1545 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1548 CALL zstedc(
'N', n, d2, rwork( inde ), z, ldu, work, lwedc,
1549 $ rwork( indrwk ), lrwedc, iwork, liwedc, iinfo )
1550 IF( iinfo.NE.0 )
THEN
1551 WRITE( nounit, fmt = 9999 )
'ZSTEDC(N)', iinfo, n, jtype,
1554 IF( iinfo.LT.0 )
THEN
1557 result( 26 ) = ulpinv
1568 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1569 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1572 result( 26 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1576 IF( ilaenv( 10,
'ZSTEMR',
'VA', 1, 0, 0, 0 ).EQ.1 .AND.
1577 $ ilaenv( 11,
'ZSTEMR',
'VA', 1, 0, 0, 0 ).EQ.1 )
THEN
1588 IF( jtype.EQ.21 .AND. crel )
THEN
1590 abstol = unfl + unfl
1591 CALL zstemr(
'V',
'A', n, sd, se, vl, vu, il, iu,
1592 $ m, wr, z, ldu, n, iwork( 1 ), tryrac,
1593 $ rwork, lrwork, iwork( 2*n+1 ), lwork-2*n,
1595 IF( iinfo.NE.0 )
THEN
1596 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,A,rel)',
1597 $ iinfo, n, jtype, ioldsd
1599 IF( iinfo.LT.0 )
THEN
1602 result( 27 ) = ulpinv
1609 temp2 = two*( two*n-one )*ulp*( one+eight*half**2 ) /
1614 temp1 = max( temp1, abs( d4( j )-wr( n-j+1 ) ) /
1615 $ ( abstol+abs( d4( j ) ) ) )
1618 result( 27 ) = temp1 / temp2
1620 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1621 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1630 abstol = unfl + unfl
1631 CALL zstemr(
'V',
'I', n, sd, se, vl, vu, il, iu,
1632 $ m, wr, z, ldu, n, iwork( 1 ), tryrac,
1633 $ rwork, lrwork, iwork( 2*n+1 ),
1634 $ lwork-2*n, iinfo )
1636 IF( iinfo.NE.0 )
THEN
1637 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,I,rel)',
1638 $ iinfo, n, jtype, ioldsd
1640 IF( iinfo.LT.0 )
THEN
1643 result( 28 ) = ulpinv
1651 temp2 = two*( two*n-one )*ulp*
1652 $ ( one+eight*half**2 ) / ( one-half )**4
1656 temp1 = max( temp1, abs( wr( j-il+1 )-d4( n-j+
1657 $ 1 ) ) / ( abstol+abs( wr( j-il+1 ) ) ) )
1660 result( 28 ) = temp1 / temp2
1673 CALL dcopy( n, sd, 1, d5, 1 )
1675 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1676 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1680 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1681 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1687 CALL zstemr(
'V',
'I', n, d5, rwork, vl, vu, il, iu,
1688 $ m, d1, z, ldu, n, iwork( 1 ), tryrac,
1689 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1690 $ liwork-2*n, iinfo )
1691 IF( iinfo.NE.0 )
THEN
1692 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,I)', iinfo,
1695 IF( iinfo.LT.0 )
THEN
1698 result( 29 ) = ulpinv
1710 CALL dcopy( n, sd, 1, d5, 1 )
1712 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1715 CALL zstemr(
'N',
'I', n, d5, rwork, vl, vu, il, iu,
1716 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1717 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1718 $ liwork-2*n, iinfo )
1719 IF( iinfo.NE.0 )
THEN
1720 WRITE( nounit, fmt = 9999 )
'ZSTEMR(N,I)', iinfo,
1723 IF( iinfo.LT.0 )
THEN
1726 result( 31 ) = ulpinv
1736 DO 240 j = 1, iu - il + 1
1737 temp1 = max( temp1, abs( d1( j ) ),
1739 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1742 result( 31 ) = temp2 / max( unfl,
1743 $ ulp*max( temp1, temp2 ) )
1750 CALL dcopy( n, sd, 1, d5, 1 )
1752 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1753 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1759 vl = d2( il ) - max( half*
1760 $ ( d2( il )-d2( il-1 ) ), ulp*anorm,
1763 vl = d2( 1 ) - max( half*( d2( n )-d2( 1 ) ),
1764 $ ulp*anorm, two*rtunfl )
1767 vu = d2( iu ) + max( half*
1768 $ ( d2( iu+1 )-d2( iu ) ), ulp*anorm,
1771 vu = d2( n ) + max( half*( d2( n )-d2( 1 ) ),
1772 $ ulp*anorm, two*rtunfl )
1779 CALL zstemr(
'V',
'V', n, d5, rwork, vl, vu, il, iu,
1780 $ m, d1, z, ldu, m, iwork( 1 ), tryrac,
1781 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1782 $ liwork-2*n, iinfo )
1783 IF( iinfo.NE.0 )
THEN
1784 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,V)', iinfo,
1787 IF( iinfo.LT.0 )
THEN
1790 result( 32 ) = ulpinv
1797 CALL zstt22( n, m, 0, sd, se, d1, dumma, z, ldu, work,
1798 $ m, rwork, result( 32 ) )
1804 CALL dcopy( n, sd, 1, d5, 1 )
1806 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1809 CALL zstemr(
'N',
'V', n, d5, rwork, vl, vu, il, iu,
1810 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1811 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1812 $ liwork-2*n, iinfo )
1813 IF( iinfo.NE.0 )
THEN
1814 WRITE( nounit, fmt = 9999 )
'ZSTEMR(N,V)', iinfo,
1817 IF( iinfo.LT.0 )
THEN
1820 result( 34 ) = ulpinv
1830 DO 250 j = 1, iu - il + 1
1831 temp1 = max( temp1, abs( d1( j ) ),
1833 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1836 result( 34 ) = temp2 / max( unfl,
1837 $ ulp*max( temp1, temp2 ) )
1852 CALL dcopy( n, sd, 1, d5, 1 )
1854 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1858 CALL zstemr(
'V',
'A', n, d5, rwork, vl, vu, il, iu,
1859 $ m, d1, z, ldu, n, iwork( 1 ), tryrac,
1860 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1861 $ liwork-2*n, iinfo )
1862 IF( iinfo.NE.0 )
THEN
1863 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,A)', iinfo, n,
1866 IF( iinfo.LT.0 )
THEN
1869 result( 35 ) = ulpinv
1876 CALL zstt22( n, m, 0, sd, se, d1, dumma, z, ldu, work, m,
1877 $ rwork, result( 35 ) )
1883 CALL dcopy( n, sd, 1, d5, 1 )
1885 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1888 CALL zstemr(
'N',
'A', n, d5, rwork, vl, vu, il, iu,
1889 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1890 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1891 $ liwork-2*n, iinfo )
1892 IF( iinfo.NE.0 )
THEN
1893 WRITE( nounit, fmt = 9999 )
'ZSTEMR(N,A)', iinfo, n,
1896 IF( iinfo.LT.0 )
THEN
1899 result( 37 ) = ulpinv
1910 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1911 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1914 result( 37 ) = temp2 / max( unfl,
1915 $ ulp*max( temp1, temp2 ) )
1919 ntestt = ntestt + ntest
1926 DO 290 jr = 1, ntest
1927 IF( result( jr ).GE.thresh )
THEN
1932 IF( nerrs.EQ.0 )
THEN
1933 WRITE( nounit, fmt = 9998 )
'ZST'
1934 WRITE( nounit, fmt = 9997 )
1935 WRITE( nounit, fmt = 9996 )
1936 WRITE( nounit, fmt = 9995 )
'Hermitian'
1937 WRITE( nounit, fmt = 9994 )
1941 WRITE( nounit, fmt = 9987 )
1944 IF( result( jr ).LT.10000.0d0 )
THEN
1945 WRITE( nounit, fmt = 9989 )n, jtype, ioldsd, jr,
1948 WRITE( nounit, fmt = 9988 )n, jtype, ioldsd, jr,
1958 CALL dlasum(
'ZST', nounit, nerrs, ntestt )
1961 9999
FORMAT(
' ZCHKST: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
1962 $ i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
1964 9998
FORMAT( / 1x, a3,
' -- Complex Hermitian eigenvalue problem' )
1965 9997
FORMAT(
' Matrix types (see ZCHKST for details): ' )
1967 9996
FORMAT( /
' Special Matrices:',
1968 $ /
' 1=Zero matrix. ',
1969 $
' 5=Diagonal: clustered entries.',
1970 $ /
' 2=Identity matrix. ',
1971 $
' 6=Diagonal: large, evenly spaced.',
1972 $ /
' 3=Diagonal: evenly spaced entries. ',
1973 $
' 7=Diagonal: small, evenly spaced.',
1974 $ /
' 4=Diagonal: geometr. spaced entries.' )
1975 9995
FORMAT(
' Dense ', a,
' Matrices:',
1976 $ /
' 8=Evenly spaced eigenvals. ',
1977 $
' 12=Small, evenly spaced eigenvals.',
1978 $ /
' 9=Geometrically spaced eigenvals. ',
1979 $
' 13=Matrix with random O(1) entries.',
1980 $ /
' 10=Clustered eigenvalues. ',
1981 $
' 14=Matrix with large random entries.',
1982 $ /
' 11=Large, evenly spaced eigenvals. ',
1983 $
' 15=Matrix with small random entries.' )
1984 9994
FORMAT(
' 16=Positive definite, evenly spaced eigenvalues',
1985 $ /
' 17=Positive definite, geometrically spaced eigenvlaues',
1986 $ /
' 18=Positive definite, clustered eigenvalues',
1987 $ /
' 19=Positive definite, small evenly spaced eigenvalues',
1988 $ /
' 20=Positive definite, large evenly spaced eigenvalues',
1989 $ /
' 21=Diagonally dominant tridiagonal, geometrically',
1990 $
' spaced eigenvalues' )
1992 9989
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
1993 $ 4( i4,
',' ),
' result ', i3,
' is', 0p, f8.2 )
1994 9988
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
1995 $ 4( i4,
',' ),
' result ', i3,
' is', 1p, d10.3 )
1997 9987
FORMAT( /
'Test performed: see ZCHKST for details.', / )
subroutine dlabad(SMALL, LARGE)
DLABAD
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 zchkst(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)
ZCHKST
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 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(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