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
1086 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1087 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1088 temp3 = max( temp3, abs( d1( j ) ), abs( d3( j ) ) )
1089 temp4 = max( temp4, abs( d1( j )-d3( j ) ) )
1092 result( 3 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1093 result( 4 ) = temp4 / max( unfl, ulp*max( temp3, temp4 ) )
1101 ap( i ) = a( jr, jc )
1107 CALL zcopy( nap, ap, 1, vp, 1 )
1110 CALL zhptrd(
'U', n, vp, sd, se, tau, iinfo )
1112 IF( iinfo.NE.0 )
THEN
1113 WRITE( nounit, fmt = 9999 )
'ZHPTRD(U)', iinfo, n, jtype,
1116 IF( iinfo.LT.0 )
THEN
1119 result( 5 ) = ulpinv
1125 CALL zupgtr(
'U', n, vp, tau, u, ldu, work, iinfo )
1126 IF( iinfo.NE.0 )
THEN
1127 WRITE( nounit, fmt = 9999 )
'ZUPGTR(U)', iinfo, n, jtype,
1130 IF( iinfo.LT.0 )
THEN
1133 result( 6 ) = ulpinv
1140 CALL zhpt21( 2,
'Upper', n, 1, ap, sd, se, u, ldu, vp, tau,
1141 $ work, rwork, result( 5 ) )
1142 CALL zhpt21( 3,
'Upper', n, 1, ap, sd, se, u, ldu, vp, tau,
1143 $ work, rwork, result( 6 ) )
1151 ap( i ) = a( jr, jc )
1157 CALL zcopy( nap, ap, 1, vp, 1 )
1160 CALL zhptrd(
'L', n, vp, sd, se, tau, iinfo )
1162 IF( iinfo.NE.0 )
THEN
1163 WRITE( nounit, fmt = 9999 )
'ZHPTRD(L)', iinfo, n, jtype,
1166 IF( iinfo.LT.0 )
THEN
1169 result( 7 ) = ulpinv
1175 CALL zupgtr(
'L', n, vp, tau, u, ldu, work, iinfo )
1176 IF( iinfo.NE.0 )
THEN
1177 WRITE( nounit, fmt = 9999 )
'ZUPGTR(L)', iinfo, n, jtype,
1180 IF( iinfo.LT.0 )
THEN
1183 result( 8 ) = ulpinv
1188 CALL zhpt21( 2,
'Lower', n, 1, ap, sd, se, u, ldu, vp, tau,
1189 $ work, rwork, result( 7 ) )
1190 CALL zhpt21( 3,
'Lower', n, 1, ap, sd, se, u, ldu, vp, tau,
1191 $ work, rwork, result( 8 ) )
1197 CALL dcopy( n, sd, 1, d1, 1 )
1199 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1200 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1203 CALL zsteqr(
'V', n, d1, rwork, z, ldu, rwork( n+1 ),
1205 IF( iinfo.NE.0 )
THEN
1206 WRITE( nounit, fmt = 9999 )
'ZSTEQR(V)', iinfo, n, jtype,
1209 IF( iinfo.LT.0 )
THEN
1212 result( 9 ) = ulpinv
1219 CALL dcopy( n, sd, 1, d2, 1 )
1221 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1224 CALL zsteqr(
'N', n, d2, rwork, work, ldu, rwork( n+1 ),
1226 IF( iinfo.NE.0 )
THEN
1227 WRITE( nounit, fmt = 9999 )
'ZSTEQR(N)', iinfo, n, jtype,
1230 IF( iinfo.LT.0 )
THEN
1233 result( 11 ) = ulpinv
1240 CALL dcopy( n, sd, 1, d3, 1 )
1242 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1245 CALL dsterf( n, d3, rwork, iinfo )
1246 IF( iinfo.NE.0 )
THEN
1247 WRITE( nounit, fmt = 9999 )
'DSTERF', iinfo, n, jtype,
1250 IF( iinfo.LT.0 )
THEN
1253 result( 12 ) = ulpinv
1260 CALL zstt21( n, 0, sd, se, d1, dumma, z, ldu, work, rwork,
1271 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1272 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1273 temp3 = max( temp3, abs( d1( j ) ), abs( d3( j ) ) )
1274 temp4 = max( temp4, abs( d1( j )-d3( j ) ) )
1277 result( 11 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1278 result( 12 ) = temp4 / max( unfl, ulp*max( temp3, temp4 ) )
1284 temp1 = thresh*( half-ulp )
1286 DO 160 j = 0, log2ui
1287 CALL dstech( n, sd, se, d1, temp1, rwork, iinfo )
1294 result( 13 ) = temp1
1299 IF( jtype.GT.15 )
THEN
1303 CALL dcopy( n, sd, 1, d4, 1 )
1305 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1306 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1309 CALL zpteqr(
'V', n, d4, rwork, z, ldu, rwork( n+1 ),
1311 IF( iinfo.NE.0 )
THEN
1312 WRITE( nounit, fmt = 9999 )
'ZPTEQR(V)', iinfo, n,
1315 IF( iinfo.LT.0 )
THEN
1318 result( 14 ) = ulpinv
1325 CALL zstt21( n, 0, sd, se, d4, dumma, z, ldu, work,
1326 $ rwork, result( 14 ) )
1330 CALL dcopy( n, sd, 1, d5, 1 )
1332 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1335 CALL zpteqr(
'N', n, d5, rwork, z, ldu, rwork( n+1 ),
1337 IF( iinfo.NE.0 )
THEN
1338 WRITE( nounit, fmt = 9999 )
'ZPTEQR(N)', iinfo, n,
1341 IF( iinfo.LT.0 )
THEN
1344 result( 16 ) = ulpinv
1354 temp1 = max( temp1, abs( d4( j ) ), abs( d5( j ) ) )
1355 temp2 = max( temp2, abs( d4( j )-d5( j ) ) )
1358 result( 16 ) = temp2 / max( unfl,
1359 $ hun*ulp*max( temp1, temp2 ) )
1375 IF( jtype.EQ.21 )
THEN
1377 abstol = unfl + unfl
1378 CALL dstebz(
'A',
'E', n, vl, vu, il, iu, abstol, sd, se,
1379 $ m, nsplit, wr, iwork( 1 ), iwork( n+1 ),
1380 $ rwork, iwork( 2*n+1 ), iinfo )
1381 IF( iinfo.NE.0 )
THEN
1382 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A,rel)', iinfo, n,
1385 IF( iinfo.LT.0 )
THEN
1388 result( 17 ) = ulpinv
1395 temp2 = two*( two*n-one )*ulp*( one+eight*half**2 ) /
1400 temp1 = max( temp1, abs( d4( j )-wr( n-j+1 ) ) /
1401 $ ( abstol+abs( d4( j ) ) ) )
1404 result( 17 ) = temp1 / temp2
1412 abstol = unfl + unfl
1413 CALL dstebz(
'A',
'E', n, vl, vu, il, iu, abstol, sd, se, m,
1414 $ nsplit, wa1, iwork( 1 ), iwork( n+1 ), rwork,
1415 $ iwork( 2*n+1 ), iinfo )
1416 IF( iinfo.NE.0 )
THEN
1417 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A)', iinfo, n, jtype,
1420 IF( iinfo.LT.0 )
THEN
1423 result( 18 ) = ulpinv
1433 temp1 = max( temp1, abs( d3( j ) ), abs( wa1( j ) ) )
1434 temp2 = max( temp2, abs( d3( j )-wa1( j ) ) )
1437 result( 18 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1447 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1448 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1456 CALL dstebz(
'I',
'E', n, vl, vu, il, iu, abstol, sd, se,
1457 $ m2, nsplit, wa2, iwork( 1 ), iwork( n+1 ),
1458 $ rwork, iwork( 2*n+1 ), iinfo )
1459 IF( iinfo.NE.0 )
THEN
1460 WRITE( nounit, fmt = 9999 )
'DSTEBZ(I)', iinfo, n, jtype,
1463 IF( iinfo.LT.0 )
THEN
1466 result( 19 ) = ulpinv
1476 vl = wa1( il ) - max( half*( wa1( il )-wa1( il-1 ) ),
1477 $ ulp*anorm, two*rtunfl )
1479 vl = wa1( 1 ) - max( half*( wa1( n )-wa1( 1 ) ),
1480 $ ulp*anorm, two*rtunfl )
1483 vu = wa1( iu ) + max( half*( wa1( iu+1 )-wa1( iu ) ),
1484 $ ulp*anorm, two*rtunfl )
1486 vu = wa1( n ) + max( half*( wa1( n )-wa1( 1 ) ),
1487 $ ulp*anorm, two*rtunfl )
1494 CALL dstebz(
'V',
'E', n, vl, vu, il, iu, abstol, sd, se,
1495 $ m3, nsplit, wa3, iwork( 1 ), iwork( n+1 ),
1496 $ rwork, iwork( 2*n+1 ), iinfo )
1497 IF( iinfo.NE.0 )
THEN
1498 WRITE( nounit, fmt = 9999 )
'DSTEBZ(V)', iinfo, n, jtype,
1501 IF( iinfo.LT.0 )
THEN
1504 result( 19 ) = ulpinv
1509 IF( m3.EQ.0 .AND. n.NE.0 )
THEN
1510 result( 19 ) = ulpinv
1516 temp1 = dsxt1( 1, wa2, m2, wa3, m3, abstol, ulp, unfl )
1517 temp2 = dsxt1( 1, wa3, m3, wa2, m2, abstol, ulp, unfl )
1519 temp3 = max( abs( wa1( n ) ), abs( wa1( 1 ) ) )
1524 result( 19 ) = ( temp1+temp2 ) / max( unfl, temp3*ulp )
1531 CALL dstebz(
'A',
'B', n, vl, vu, il, iu, abstol, sd, se, m,
1532 $ nsplit, wa1, iwork( 1 ), iwork( n+1 ), rwork,
1533 $ iwork( 2*n+1 ), iinfo )
1534 IF( iinfo.NE.0 )
THEN
1535 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A,B)', iinfo, n,
1538 IF( iinfo.LT.0 )
THEN
1541 result( 20 ) = ulpinv
1542 result( 21 ) = ulpinv
1547 CALL zstein( n, sd, se, m, wa1, iwork( 1 ), iwork( n+1 ), z,
1548 $ ldu, rwork, iwork( 2*n+1 ), iwork( 3*n+1 ),
1550 IF( iinfo.NE.0 )
THEN
1551 WRITE( nounit, fmt = 9999 )
'ZSTEIN', iinfo, n, jtype,
1554 IF( iinfo.LT.0 )
THEN
1557 result( 20 ) = ulpinv
1558 result( 21 ) = ulpinv
1565 CALL zstt21( n, 0, sd, se, wa1, dumma, z, ldu, work, rwork,
1574 CALL dcopy( n, sd, 1, d1, 1 )
1576 $
CALL dcopy( n-1, se, 1, rwork( inde ), 1 )
1577 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1580 CALL zstedc(
'I', n, d1, rwork( inde ), z, ldu, work, lwedc,
1581 $ rwork( indrwk ), lrwedc, iwork, liwedc, iinfo )
1582 IF( iinfo.NE.0 )
THEN
1583 WRITE( nounit, fmt = 9999 )
'ZSTEDC(I)', iinfo, n, jtype,
1586 IF( iinfo.LT.0 )
THEN
1589 result( 22 ) = ulpinv
1596 CALL zstt21( n, 0, sd, se, d1, dumma, z, ldu, work, rwork,
1603 CALL dcopy( n, sd, 1, d1, 1 )
1605 $
CALL dcopy( n-1, se, 1, rwork( inde ), 1 )
1606 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1609 CALL zstedc(
'V', n, d1, rwork( inde ), z, ldu, work, lwedc,
1610 $ rwork( indrwk ), lrwedc, iwork, liwedc, iinfo )
1611 IF( iinfo.NE.0 )
THEN
1612 WRITE( nounit, fmt = 9999 )
'ZSTEDC(V)', iinfo, n, jtype,
1615 IF( iinfo.LT.0 )
THEN
1618 result( 24 ) = ulpinv
1625 CALL zstt21( n, 0, sd, se, d1, dumma, z, ldu, work, rwork,
1632 CALL dcopy( n, sd, 1, d2, 1 )
1634 $
CALL dcopy( n-1, se, 1, rwork( inde ), 1 )
1635 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1638 CALL zstedc(
'N', n, d2, rwork( inde ), z, ldu, work, lwedc,
1639 $ rwork( indrwk ), lrwedc, iwork, liwedc, iinfo )
1640 IF( iinfo.NE.0 )
THEN
1641 WRITE( nounit, fmt = 9999 )
'ZSTEDC(N)', iinfo, n, jtype,
1644 IF( iinfo.LT.0 )
THEN
1647 result( 26 ) = ulpinv
1658 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1659 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1662 result( 26 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1666 IF( ilaenv( 10,
'ZSTEMR',
'VA', 1, 0, 0, 0 ).EQ.1 .AND.
1667 $ ilaenv( 11,
'ZSTEMR',
'VA', 1, 0, 0, 0 ).EQ.1 )
THEN
1678 IF( jtype.EQ.21 .AND. crel )
THEN
1680 abstol = unfl + unfl
1681 CALL zstemr(
'V',
'A', n, sd, se, vl, vu, il, iu,
1682 $ m, wr, z, ldu, n, iwork( 1 ), tryrac,
1683 $ rwork, lrwork, iwork( 2*n+1 ), lwork-2*n,
1685 IF( iinfo.NE.0 )
THEN
1686 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,A,rel)',
1687 $ iinfo, n, jtype, ioldsd
1689 IF( iinfo.LT.0 )
THEN
1692 result( 27 ) = ulpinv
1699 temp2 = two*( two*n-one )*ulp*( one+eight*half**2 ) /
1704 temp1 = max( temp1, abs( d4( j )-wr( n-j+1 ) ) /
1705 $ ( abstol+abs( d4( j ) ) ) )
1708 result( 27 ) = temp1 / temp2
1710 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1711 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1720 abstol = unfl + unfl
1721 CALL zstemr(
'V',
'I', n, sd, se, vl, vu, il, iu,
1722 $ m, wr, z, ldu, n, iwork( 1 ), tryrac,
1723 $ rwork, lrwork, iwork( 2*n+1 ),
1724 $ lwork-2*n, iinfo )
1726 IF( iinfo.NE.0 )
THEN
1727 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,I,rel)',
1728 $ iinfo, n, jtype, ioldsd
1730 IF( iinfo.LT.0 )
THEN
1733 result( 28 ) = ulpinv
1741 temp2 = two*( two*n-one )*ulp*
1742 $ ( one+eight*half**2 ) / ( one-half )**4
1746 temp1 = max( temp1, abs( wr( j-il+1 )-d4( n-j+
1747 $ 1 ) ) / ( abstol+abs( wr( j-il+1 ) ) ) )
1750 result( 28 ) = temp1 / temp2
1763 CALL dcopy( n, sd, 1, d5, 1 )
1765 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1766 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1770 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1771 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1777 CALL zstemr(
'V',
'I', n, d5, rwork, vl, vu, il, iu,
1778 $ m, d1, z, ldu, n, iwork( 1 ), tryrac,
1779 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1780 $ liwork-2*n, iinfo )
1781 IF( iinfo.NE.0 )
THEN
1782 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,I)', iinfo,
1785 IF( iinfo.LT.0 )
THEN
1788 result( 29 ) = ulpinv
1800 CALL dcopy( n, sd, 1, d5, 1 )
1802 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1805 CALL zstemr(
'N',
'I', n, d5, rwork, vl, vu, il, iu,
1806 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1807 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1808 $ liwork-2*n, iinfo )
1809 IF( iinfo.NE.0 )
THEN
1810 WRITE( nounit, fmt = 9999 )
'ZSTEMR(N,I)', iinfo,
1813 IF( iinfo.LT.0 )
THEN
1816 result( 31 ) = ulpinv
1826 DO 240 j = 1, iu - il + 1
1827 temp1 = max( temp1, abs( d1( j ) ),
1829 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1832 result( 31 ) = temp2 / max( unfl,
1833 $ ulp*max( temp1, temp2 ) )
1840 CALL dcopy( n, sd, 1, d5, 1 )
1842 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1843 CALL zlaset(
'Full', n, n, czero, cone, z, ldu )
1849 vl = d2( il ) - max( half*
1850 $ ( d2( il )-d2( il-1 ) ), ulp*anorm,
1853 vl = d2( 1 ) - max( half*( d2( n )-d2( 1 ) ),
1854 $ ulp*anorm, two*rtunfl )
1857 vu = d2( iu ) + max( half*
1858 $ ( d2( iu+1 )-d2( iu ) ), ulp*anorm,
1861 vu = d2( n ) + max( half*( d2( n )-d2( 1 ) ),
1862 $ ulp*anorm, two*rtunfl )
1869 CALL zstemr(
'V',
'V', n, d5, rwork, vl, vu, il, iu,
1870 $ m, d1, z, ldu, m, iwork( 1 ), tryrac,
1871 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1872 $ liwork-2*n, iinfo )
1873 IF( iinfo.NE.0 )
THEN
1874 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,V)', iinfo,
1877 IF( iinfo.LT.0 )
THEN
1880 result( 32 ) = ulpinv
1887 CALL zstt22( n, m, 0, sd, se, d1, dumma, z, ldu, work,
1888 $ m, rwork, result( 32 ) )
1894 CALL dcopy( n, sd, 1, d5, 1 )
1896 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1899 CALL zstemr(
'N',
'V', n, d5, rwork, vl, vu, il, iu,
1900 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1901 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1902 $ liwork-2*n, iinfo )
1903 IF( iinfo.NE.0 )
THEN
1904 WRITE( nounit, fmt = 9999 )
'ZSTEMR(N,V)', iinfo,
1907 IF( iinfo.LT.0 )
THEN
1910 result( 34 ) = ulpinv
1920 DO 250 j = 1, iu - il + 1
1921 temp1 = max( temp1, abs( d1( j ) ),
1923 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1926 result( 34 ) = temp2 / max( unfl,
1927 $ ulp*max( temp1, temp2 ) )
1942 CALL dcopy( n, sd, 1, d5, 1 )
1944 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1948 CALL zstemr(
'V',
'A', n, d5, rwork, vl, vu, il, iu,
1949 $ m, d1, z, ldu, n, iwork( 1 ), tryrac,
1950 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1951 $ liwork-2*n, iinfo )
1952 IF( iinfo.NE.0 )
THEN
1953 WRITE( nounit, fmt = 9999 )
'ZSTEMR(V,A)', iinfo, n,
1956 IF( iinfo.LT.0 )
THEN
1959 result( 35 ) = ulpinv
1966 CALL zstt22( n, m, 0, sd, se, d1, dumma, z, ldu, work, m,
1967 $ rwork, result( 35 ) )
1973 CALL dcopy( n, sd, 1, d5, 1 )
1975 $
CALL dcopy( n-1, se, 1, rwork, 1 )
1978 CALL zstemr(
'N',
'A', n, d5, rwork, vl, vu, il, iu,
1979 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1980 $ rwork( n+1 ), lrwork-n, iwork( 2*n+1 ),
1981 $ liwork-2*n, iinfo )
1982 IF( iinfo.NE.0 )
THEN
1983 WRITE( nounit, fmt = 9999 )
'ZSTEMR(N,A)', iinfo, n,
1986 IF( iinfo.LT.0 )
THEN
1989 result( 37 ) = ulpinv
2000 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
2001 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
2004 result( 37 ) = temp2 / max( unfl,
2005 $ ulp*max( temp1, temp2 ) )
2009 ntestt = ntestt + ntest
2016 DO 290 jr = 1, ntest
2017 IF( result( jr ).GE.thresh )
THEN
2022 IF( nerrs.EQ.0 )
THEN
2023 WRITE( nounit, fmt = 9998 )
'ZST'
2024 WRITE( nounit, fmt = 9997 )
2025 WRITE( nounit, fmt = 9996 )
2026 WRITE( nounit, fmt = 9995 )
'Hermitian'
2027 WRITE( nounit, fmt = 9994 )
2031 WRITE( nounit, fmt = 9987 )
2034 IF( result( jr ).LT.10000.0d0 )
THEN
2035 WRITE( nounit, fmt = 9989 )n, jtype, ioldsd, jr,
2038 WRITE( nounit, fmt = 9988 )n, jtype, ioldsd, jr,
2048 CALL dlasum(
'ZST', nounit, nerrs, ntestt )
2051 9999
FORMAT(
' ZCHKST2STG: ', a,
' returned INFO=', i6,
'.', / 9x,
2052 $
'N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
2054 9998
FORMAT( / 1x, a3,
' -- Complex Hermitian eigenvalue problem' )
2055 9997
FORMAT(
' Matrix types (see ZCHKST2STG for details): ' )
2057 9996
FORMAT( /
' Special Matrices:',
2058 $ /
' 1=Zero matrix. ',
2059 $
' 5=Diagonal: clustered entries.',
2060 $ /
' 2=Identity matrix. ',
2061 $
' 6=Diagonal: large, evenly spaced.',
2062 $ /
' 3=Diagonal: evenly spaced entries. ',
2063 $
' 7=Diagonal: small, evenly spaced.',
2064 $ /
' 4=Diagonal: geometr. spaced entries.' )
2065 9995
FORMAT(
' Dense ', a,
' Matrices:',
2066 $ /
' 8=Evenly spaced eigenvals. ',
2067 $
' 12=Small, evenly spaced eigenvals.',
2068 $ /
' 9=Geometrically spaced eigenvals. ',
2069 $
' 13=Matrix with random O(1) entries.',
2070 $ /
' 10=Clustered eigenvalues. ',
2071 $
' 14=Matrix with large random entries.',
2072 $ /
' 11=Large, evenly spaced eigenvals. ',
2073 $
' 15=Matrix with small random entries.' )
2074 9994
FORMAT(
' 16=Positive definite, evenly spaced eigenvalues',
2075 $ /
' 17=Positive definite, geometrically spaced eigenvlaues',
2076 $ /
' 18=Positive definite, clustered eigenvalues',
2077 $ /
' 19=Positive definite, small evenly spaced eigenvalues',
2078 $ /
' 20=Positive definite, large evenly spaced eigenvalues',
2079 $ /
' 21=Diagonally dominant tridiagonal, geometrically',
2080 $
' spaced eigenvalues' )
2082 9989
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
2083 $ 4( i4,
',' ),
' result ', i3,
' is', 0p, f8.2 )
2084 9988
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
2085 $ 4( i4,
',' ),
' result ', i3,
' is', 1p, d10.3 )
2087 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