608 SUBROUTINE dchkst2stg( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
609 $ NOUNIT, A, LDA, AP, SD, SE, D1, D2, D3, D4, D5,
610 $ WA1, WA2, WA3, WR, U, LDU, V, VP, TAU, Z, WORK,
611 $ LWORK, IWORK, LIWORK, RESULT, INFO )
618 INTEGER INFO, LDA, LDU, LIWORK, LWORK, NOUNIT, NSIZES,
620 DOUBLE PRECISION THRESH
624 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
625 DOUBLE PRECISION A( LDA, * ), AP( * ), D1( * ), D2( * ),
626 $ d3( * ), d4( * ), d5( * ), result( * ),
627 $ sd( * ), se( * ), tau( * ), u( ldu, * ),
628 $ v( ldu, * ), vp( * ), wa1( * ), wa2( * ),
629 $ wa3( * ), work( * ), wr( * ), z( ldu, * )
635 DOUBLE PRECISION ZERO, ONE, TWO, EIGHT, TEN, HUN
636 PARAMETER ( ZERO = 0.0d0, one = 1.0d0, two = 2.0d0,
637 $ eight = 8.0d0, ten = 10.0d0, hun = 100.0d0 )
638 DOUBLE PRECISION HALF
639 parameter( half = one / two )
641 parameter( maxtyp = 21 )
643 parameter( srange = .false. )
645 parameter( srel = .false. )
648 LOGICAL BADNN, TRYRAC
649 INTEGER I, IINFO, IL, IMODE, ITEMP, ITYPE, IU, J, JC,
650 $ JR, JSIZE, JTYPE, LGN, LIWEDC, LOG2UI, LWEDC,
651 $ m, m2, m3, mtypes, n, nap, nblock, nerrs,
652 $ nmats, nmax, nsplit, ntest, ntestt, lh, lw
653 DOUBLE PRECISION ABSTOL, ANINV, ANORM, COND, OVFL, RTOVFL,
654 $ RTUNFL, TEMP1, TEMP2, TEMP3, TEMP4, ULP,
655 $ ULPINV, UNFL, VL, VU
658 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ),
659 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
661 DOUBLE PRECISION DUMMA( 1 )
665 DOUBLE PRECISION DLAMCH, DLARND, DSXT1
666 EXTERNAL ILAENV, DLAMCH, DLARND, DSXT1
676 INTRINSIC abs, dble, int, log, max, min, sqrt
679 DATA ktype / 1, 2, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 8,
680 $ 8, 8, 9, 9, 9, 9, 9, 10 /
681 DATA kmagn / 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
682 $ 2, 3, 1, 1, 1, 2, 3, 1 /
683 DATA kmode / 0, 0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
684 $ 0, 0, 4, 3, 1, 4, 4, 3 /
702 nmax = max( nmax, nn( j ) )
707 nblock = ilaenv( 1,
'DSYTRD',
'L', nmax, -1, -1, -1 )
708 nblock = min( nmax, max( 1, nblock ) )
712 IF( nsizes.LT.0 )
THEN
714 ELSE IF( badnn )
THEN
716 ELSE IF( ntypes.LT.0 )
THEN
718 ELSE IF( lda.LT.nmax )
THEN
720 ELSE IF( ldu.LT.nmax )
THEN
722 ELSE IF( 2*max( 2, nmax )**2.GT.lwork )
THEN
727 CALL xerbla(
'DCHKST2STG', -info )
733 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
738 unfl = dlamch(
'Safe minimum' )
741 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
743 log2ui = int( log( ulpinv ) / log( two ) )
744 rtunfl = sqrt( unfl )
745 rtovfl = sqrt( ovfl )
750 iseed2( i ) = iseed( i )
755 DO 310 jsize = 1, nsizes
758 lgn = int( log( dble( n ) ) / log( two ) )
763 lwedc = 1 + 4*n + 2*n*lgn + 4*n**2
764 liwedc = 6 + 6*n + 5*n*lgn
769 nap = ( n*( n+1 ) ) / 2
770 aninv = one / dble( max( 1, n ) )
772 IF( nsizes.NE.1 )
THEN
773 mtypes = min( maxtyp, ntypes )
775 mtypes = min( maxtyp+1, ntypes )
778 DO 300 jtype = 1, mtypes
779 IF( .NOT.dotype( jtype ) )
785 ioldsd( j ) = iseed( j )
804 IF( mtypes.GT.maxtyp )
807 itype = ktype( jtype )
808 imode = kmode( jtype )
812 GO TO ( 40, 50, 60 )kmagn( jtype )
819 anorm = ( rtovfl*ulp )*aninv
823 anorm = rtunfl*n*ulpinv
828 CALL dlaset(
'Full', lda, n, zero, zero, a, lda )
830 IF( jtype.LE.15 )
THEN
833 cond = ulpinv*aninv / ten
840 IF( itype.EQ.1 )
THEN
843 ELSE IF( itype.EQ.2 )
THEN
851 ELSE IF( itype.EQ.4 )
THEN
855 CALL dlatms( n, n,
'S', iseed,
'S', work, imode, cond,
856 $ anorm, 0, 0,
'N', a, lda, work( n+1 ),
860 ELSE IF( itype.EQ.5 )
THEN
864 CALL dlatms( n, n,
'S', iseed,
'S', work, imode, cond,
865 $ anorm, n, n,
'N', a, lda, work( n+1 ),
868 ELSE IF( itype.EQ.7 )
THEN
872 CALL dlatmr( n, n,
'S', iseed,
'S', work, 6, one, one,
873 $
'T',
'N', work( n+1 ), 1, one,
874 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
875 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
877 ELSE IF( itype.EQ.8 )
THEN
881 CALL dlatmr( n, n,
'S', iseed,
'S', work, 6, one, one,
882 $
'T',
'N', work( n+1 ), 1, one,
883 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
884 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
886 ELSE IF( itype.EQ.9 )
THEN
890 CALL dlatms( n, n,
'S', iseed,
'P', work, imode, cond,
891 $ anorm, n, n,
'N', a, lda, work( n+1 ),
894 ELSE IF( itype.EQ.10 )
THEN
898 CALL dlatms( n, n,
'S', iseed,
'P', work, imode, cond,
899 $ anorm, 1, 1,
'N', a, lda, work( n+1 ),
902 temp1 = abs( a( i-1, i ) ) /
903 $ sqrt( abs( a( i-1, i-1 )*a( i, i ) ) )
904 IF( temp1.GT.half )
THEN
905 a( i-1, i ) = half*sqrt( abs( a( i-1, i-1 )*a( i,
907 a( i, i-1 ) = a( i-1, i )
916 IF( iinfo.NE.0 )
THEN
917 WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n, jtype,
928 CALL dlacpy(
'U', n, n, a, lda, v, ldu )
931 CALL dsytrd(
'U', n, v, ldu, sd, se, tau, work, lwork,
934 IF( iinfo.NE.0 )
THEN
935 WRITE( nounit, fmt = 9999 )
'DSYTRD(U)', iinfo, n, jtype,
938 IF( iinfo.LT.0 )
THEN
946 CALL dlacpy(
'U', n, n, v, ldu, u, ldu )
949 CALL dorgtr(
'U', n, u, ldu, tau, work, lwork, iinfo )
950 IF( iinfo.NE.0 )
THEN
951 WRITE( nounit, fmt = 9999 )
'DORGTR(U)', iinfo, n, jtype,
954 IF( iinfo.LT.0 )
THEN
964 CALL dsyt21( 2,
'Upper', n, 1, a, lda, sd, se, u, ldu, v,
965 $ ldu, tau, work, result( 1 ) )
966 CALL dsyt21( 3,
'Upper', n, 1, a, lda, sd, se, u, ldu, v,
967 $ ldu, tau, work, result( 2 ) )
976 CALL dcopy( n, sd, 1, d1, 1 )
978 $
CALL dcopy( n-1, se, 1, work, 1 )
980 CALL dsteqr(
'N', n, d1, work, work( n+1 ), ldu,
981 $ work( n+1 ), iinfo )
982 IF( iinfo.NE.0 )
THEN
983 WRITE( nounit, fmt = 9999 )
'DSTEQR(N)', iinfo, n, jtype,
986 IF( iinfo.LT.0 )
THEN
999 CALL dlaset(
'Full', n, 1, zero, zero, sd, n )
1000 CALL dlaset(
'Full', n, 1, zero, zero, se, n )
1001 CALL dlacpy(
"U", n, n, a, lda, v, ldu )
1005 $ work, lh, work( lh+1 ), lw, iinfo )
1009 CALL dcopy( n, sd, 1, d2, 1 )
1011 $
CALL dcopy( n-1, se, 1, work, 1 )
1013 CALL dsteqr(
'N', n, d2, work, work( n+1 ), ldu,
1014 $ work( n+1 ), iinfo )
1015 IF( iinfo.NE.0 )
THEN
1016 WRITE( nounit, fmt = 9999 )
'DSTEQR(N)', iinfo, n, jtype,
1019 IF( iinfo.LT.0 )
THEN
1022 result( 3 ) = ulpinv
1032 CALL dlaset(
'Full', n, 1, zero, zero, sd, n )
1033 CALL dlaset(
'Full', n, 1, zero, zero, se, n )
1034 CALL dlacpy(
"L", n, n, a, lda, v, ldu )
1036 $ work, lh, work( lh+1 ), lw, iinfo )
1040 CALL dcopy( n, sd, 1, d3, 1 )
1042 $
CALL dcopy( n-1, se, 1, work, 1 )
1044 CALL dsteqr(
'N', n, d3, work, work( n+1 ), ldu,
1045 $ work( n+1 ), iinfo )
1046 IF( iinfo.NE.0 )
THEN
1047 WRITE( nounit, fmt = 9999 )
'DSTEQR(N)', iinfo, n, jtype,
1050 IF( iinfo.LT.0 )
THEN
1053 result( 4 ) = ulpinv
1068 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1069 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1070 temp3 = max( temp3, abs( d1( j ) ), abs( d3( j ) ) )
1071 temp4 = max( temp4, abs( d1( j )-d3( j ) ) )
1074 result( 3 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1075 result( 4 ) = temp4 / max( unfl, ulp*max( temp3, temp4 ) )
1083 ap( i ) = a( jr, jc )
1089 CALL dcopy( nap, ap, 1, vp, 1 )
1092 CALL dsptrd(
'U', n, vp, sd, se, tau, iinfo )
1094 IF( iinfo.NE.0 )
THEN
1095 WRITE( nounit, fmt = 9999 )
'DSPTRD(U)', iinfo, n, jtype,
1098 IF( iinfo.LT.0 )
THEN
1101 result( 5 ) = ulpinv
1107 CALL dopgtr(
'U', n, vp, tau, u, ldu, work, iinfo )
1108 IF( iinfo.NE.0 )
THEN
1109 WRITE( nounit, fmt = 9999 )
'DOPGTR(U)', iinfo, n, jtype,
1112 IF( iinfo.LT.0 )
THEN
1115 result( 6 ) = ulpinv
1122 CALL dspt21( 2,
'Upper', n, 1, ap, sd, se, u, ldu, vp, tau,
1123 $ work, result( 5 ) )
1124 CALL dspt21( 3,
'Upper', n, 1, ap, sd, se, u, ldu, vp, tau,
1125 $ work, result( 6 ) )
1133 ap( i ) = a( jr, jc )
1139 CALL dcopy( nap, ap, 1, vp, 1 )
1142 CALL dsptrd(
'L', n, vp, sd, se, tau, iinfo )
1144 IF( iinfo.NE.0 )
THEN
1145 WRITE( nounit, fmt = 9999 )
'DSPTRD(L)', iinfo, n, jtype,
1148 IF( iinfo.LT.0 )
THEN
1151 result( 7 ) = ulpinv
1157 CALL dopgtr(
'L', n, vp, tau, u, ldu, work, iinfo )
1158 IF( iinfo.NE.0 )
THEN
1159 WRITE( nounit, fmt = 9999 )
'DOPGTR(L)', iinfo, n, jtype,
1162 IF( iinfo.LT.0 )
THEN
1165 result( 8 ) = ulpinv
1170 CALL dspt21( 2,
'Lower', n, 1, ap, sd, se, u, ldu, vp, tau,
1171 $ work, result( 7 ) )
1172 CALL dspt21( 3,
'Lower', n, 1, ap, sd, se, u, ldu, vp, tau,
1173 $ work, result( 8 ) )
1179 CALL dcopy( n, sd, 1, d1, 1 )
1181 $
CALL dcopy( n-1, se, 1, work, 1 )
1182 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1185 CALL dsteqr(
'V', n, d1, work, z, ldu, work( n+1 ), iinfo )
1186 IF( iinfo.NE.0 )
THEN
1187 WRITE( nounit, fmt = 9999 )
'DSTEQR(V)', iinfo, n, jtype,
1190 IF( iinfo.LT.0 )
THEN
1193 result( 9 ) = ulpinv
1200 CALL dcopy( n, sd, 1, d2, 1 )
1202 $
CALL dcopy( n-1, se, 1, work, 1 )
1205 CALL dsteqr(
'N', n, d2, work, work( n+1 ), ldu,
1206 $ work( n+1 ), iinfo )
1207 IF( iinfo.NE.0 )
THEN
1208 WRITE( nounit, fmt = 9999 )
'DSTEQR(N)', iinfo, n, jtype,
1211 IF( iinfo.LT.0 )
THEN
1214 result( 11 ) = ulpinv
1221 CALL dcopy( n, sd, 1, d3, 1 )
1223 $
CALL dcopy( n-1, se, 1, work, 1 )
1226 CALL dsterf( n, d3, work, iinfo )
1227 IF( iinfo.NE.0 )
THEN
1228 WRITE( nounit, fmt = 9999 )
'DSTERF', iinfo, n, jtype,
1231 IF( iinfo.LT.0 )
THEN
1234 result( 12 ) = ulpinv
1241 CALL dstt21( n, 0, sd, se, d1, dumma, z, ldu, work,
1252 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1253 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1254 temp3 = max( temp3, abs( d1( j ) ), abs( d3( j ) ) )
1255 temp4 = max( temp4, abs( d1( j )-d3( j ) ) )
1258 result( 11 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1259 result( 12 ) = temp4 / max( unfl, ulp*max( temp3, temp4 ) )
1265 temp1 = thresh*( half-ulp )
1267 DO 160 j = 0, log2ui
1268 CALL dstech( n, sd, se, d1, temp1, work, iinfo )
1275 result( 13 ) = temp1
1280 IF( jtype.GT.15 )
THEN
1284 CALL dcopy( n, sd, 1, d4, 1 )
1286 $
CALL dcopy( n-1, se, 1, work, 1 )
1287 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1290 CALL dpteqr(
'V', n, d4, work, z, ldu, work( n+1 ),
1292 IF( iinfo.NE.0 )
THEN
1293 WRITE( nounit, fmt = 9999 )
'DPTEQR(V)', iinfo, n,
1296 IF( iinfo.LT.0 )
THEN
1299 result( 14 ) = ulpinv
1306 CALL dstt21( n, 0, sd, se, d4, dumma, z, ldu, work,
1311 CALL dcopy( n, sd, 1, d5, 1 )
1313 $
CALL dcopy( n-1, se, 1, work, 1 )
1316 CALL dpteqr(
'N', n, d5, work, z, ldu, work( n+1 ),
1318 IF( iinfo.NE.0 )
THEN
1319 WRITE( nounit, fmt = 9999 )
'DPTEQR(N)', iinfo, n,
1322 IF( iinfo.LT.0 )
THEN
1325 result( 16 ) = ulpinv
1335 temp1 = max( temp1, abs( d4( j ) ), abs( d5( j ) ) )
1336 temp2 = max( temp2, abs( d4( j )-d5( j ) ) )
1339 result( 16 ) = temp2 / max( unfl,
1340 $ hun*ulp*max( temp1, temp2 ) )
1356 IF( jtype.EQ.21 )
THEN
1358 abstol = unfl + unfl
1359 CALL dstebz(
'A',
'E', n, vl, vu, il, iu, abstol, sd, se,
1360 $ m, nsplit, wr, iwork( 1 ), iwork( n+1 ),
1361 $ work, iwork( 2*n+1 ), iinfo )
1362 IF( iinfo.NE.0 )
THEN
1363 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A,rel)', iinfo, n,
1366 IF( iinfo.LT.0 )
THEN
1369 result( 17 ) = ulpinv
1376 temp2 = two*( two*n-one )*ulp*( one+eight*half**2 ) /
1381 temp1 = max( temp1, abs( d4( j )-wr( n-j+1 ) ) /
1382 $ ( abstol+abs( d4( j ) ) ) )
1385 result( 17 ) = temp1 / temp2
1393 abstol = unfl + unfl
1394 CALL dstebz(
'A',
'E', n, vl, vu, il, iu, abstol, sd, se, m,
1395 $ nsplit, wa1, iwork( 1 ), iwork( n+1 ), work,
1396 $ iwork( 2*n+1 ), iinfo )
1397 IF( iinfo.NE.0 )
THEN
1398 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A)', iinfo, n, jtype,
1401 IF( iinfo.LT.0 )
THEN
1404 result( 18 ) = ulpinv
1414 temp1 = max( temp1, abs( d3( j ) ), abs( wa1( j ) ) )
1415 temp2 = max( temp2, abs( d3( j )-wa1( j ) ) )
1418 result( 18 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1428 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1429 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1437 CALL dstebz(
'I',
'E', n, vl, vu, il, iu, abstol, sd, se,
1438 $ m2, nsplit, wa2, iwork( 1 ), iwork( n+1 ),
1439 $ work, iwork( 2*n+1 ), iinfo )
1440 IF( iinfo.NE.0 )
THEN
1441 WRITE( nounit, fmt = 9999 )
'DSTEBZ(I)', iinfo, n, jtype,
1444 IF( iinfo.LT.0 )
THEN
1447 result( 19 ) = ulpinv
1457 vl = wa1( il ) - max( half*( wa1( il )-wa1( il-1 ) ),
1458 $ ulp*anorm, two*rtunfl )
1460 vl = wa1( 1 ) - max( half*( wa1( n )-wa1( 1 ) ),
1461 $ ulp*anorm, two*rtunfl )
1464 vu = wa1( iu ) + max( half*( wa1( iu+1 )-wa1( iu ) ),
1465 $ ulp*anorm, two*rtunfl )
1467 vu = wa1( n ) + max( half*( wa1( n )-wa1( 1 ) ),
1468 $ ulp*anorm, two*rtunfl )
1475 CALL dstebz(
'V',
'E', n, vl, vu, il, iu, abstol, sd, se,
1476 $ m3, nsplit, wa3, iwork( 1 ), iwork( n+1 ),
1477 $ work, iwork( 2*n+1 ), iinfo )
1478 IF( iinfo.NE.0 )
THEN
1479 WRITE( nounit, fmt = 9999 )
'DSTEBZ(V)', iinfo, n, jtype,
1482 IF( iinfo.LT.0 )
THEN
1485 result( 19 ) = ulpinv
1490 IF( m3.EQ.0 .AND. n.NE.0 )
THEN
1491 result( 19 ) = ulpinv
1497 temp1 = dsxt1( 1, wa2, m2, wa3, m3, abstol, ulp, unfl )
1498 temp2 = dsxt1( 1, wa3, m3, wa2, m2, abstol, ulp, unfl )
1500 temp3 = max( abs( wa1( n ) ), abs( wa1( 1 ) ) )
1505 result( 19 ) = ( temp1+temp2 ) / max( unfl, temp3*ulp )
1512 CALL dstebz(
'A',
'B', n, vl, vu, il, iu, abstol, sd, se, m,
1513 $ nsplit, wa1, iwork( 1 ), iwork( n+1 ), work,
1514 $ iwork( 2*n+1 ), iinfo )
1515 IF( iinfo.NE.0 )
THEN
1516 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A,B)', iinfo, n,
1519 IF( iinfo.LT.0 )
THEN
1522 result( 20 ) = ulpinv
1523 result( 21 ) = ulpinv
1528 CALL dstein( n, sd, se, m, wa1, iwork( 1 ), iwork( n+1 ), z,
1529 $ ldu, work, iwork( 2*n+1 ), iwork( 3*n+1 ),
1531 IF( iinfo.NE.0 )
THEN
1532 WRITE( nounit, fmt = 9999 )
'DSTEIN', iinfo, n, jtype,
1535 IF( iinfo.LT.0 )
THEN
1538 result( 20 ) = ulpinv
1539 result( 21 ) = ulpinv
1546 CALL dstt21( n, 0, sd, se, wa1, dumma, z, ldu, work,
1553 CALL dcopy( n, sd, 1, d1, 1 )
1555 $
CALL dcopy( n-1, se, 1, work, 1 )
1556 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1559 CALL dstedc(
'I', n, d1, work, z, ldu, work( n+1 ), lwedc-n,
1560 $ iwork, liwedc, iinfo )
1561 IF( iinfo.NE.0 )
THEN
1562 WRITE( nounit, fmt = 9999 )
'DSTEDC(I)', iinfo, n, jtype,
1565 IF( iinfo.LT.0 )
THEN
1568 result( 22 ) = ulpinv
1575 CALL dstt21( n, 0, sd, se, d1, dumma, z, ldu, work,
1582 CALL dcopy( n, sd, 1, d1, 1 )
1584 $
CALL dcopy( n-1, se, 1, work, 1 )
1585 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1588 CALL dstedc(
'V', n, d1, work, z, ldu, work( n+1 ), lwedc-n,
1589 $ iwork, liwedc, iinfo )
1590 IF( iinfo.NE.0 )
THEN
1591 WRITE( nounit, fmt = 9999 )
'DSTEDC(V)', iinfo, n, jtype,
1594 IF( iinfo.LT.0 )
THEN
1597 result( 24 ) = ulpinv
1604 CALL dstt21( n, 0, sd, se, d1, dumma, z, ldu, work,
1611 CALL dcopy( n, sd, 1, d2, 1 )
1613 $
CALL dcopy( n-1, se, 1, work, 1 )
1614 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1617 CALL dstedc(
'N', n, d2, work, z, ldu, work( n+1 ), lwedc-n,
1618 $ iwork, liwedc, iinfo )
1619 IF( iinfo.NE.0 )
THEN
1620 WRITE( nounit, fmt = 9999 )
'DSTEDC(N)', iinfo, n, jtype,
1623 IF( iinfo.LT.0 )
THEN
1626 result( 26 ) = ulpinv
1637 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1638 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1641 result( 26 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1645 IF( ilaenv( 10,
'DSTEMR',
'VA', 1, 0, 0, 0 ).EQ.1 .AND.
1646 $ ilaenv( 11,
'DSTEMR',
'VA', 1, 0, 0, 0 ).EQ.1 )
THEN
1657 IF( jtype.EQ.21 .AND. srel )
THEN
1659 abstol = unfl + unfl
1660 CALL dstemr(
'V',
'A', n, sd, se, vl, vu, il, iu,
1661 $ m, wr, z, ldu, n, iwork( 1 ), tryrac,
1662 $ work, lwork, iwork( 2*n+1 ), lwork-2*n,
1664 IF( iinfo.NE.0 )
THEN
1665 WRITE( nounit, fmt = 9999 )
'DSTEMR(V,A,rel)',
1666 $ iinfo, n, jtype, ioldsd
1668 IF( iinfo.LT.0 )
THEN
1671 result( 27 ) = ulpinv
1678 temp2 = two*( two*n-one )*ulp*( one+eight*half**2 ) /
1683 temp1 = max( temp1, abs( d4( j )-wr( n-j+1 ) ) /
1684 $ ( abstol+abs( d4( j ) ) ) )
1687 result( 27 ) = temp1 / temp2
1689 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1690 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1699 abstol = unfl + unfl
1700 CALL dstemr(
'V',
'I', n, sd, se, vl, vu, il, iu,
1701 $ m, wr, z, ldu, n, iwork( 1 ), tryrac,
1702 $ work, lwork, iwork( 2*n+1 ),
1703 $ lwork-2*n, iinfo )
1705 IF( iinfo.NE.0 )
THEN
1706 WRITE( nounit, fmt = 9999 )
'DSTEMR(V,I,rel)',
1707 $ iinfo, n, jtype, ioldsd
1709 IF( iinfo.LT.0 )
THEN
1712 result( 28 ) = ulpinv
1719 temp2 = two*( two*n-one )*ulp*
1720 $ ( one+eight*half**2 ) / ( one-half )**4
1724 temp1 = max( temp1, abs( wr( j-il+1 )-d4( n-j+
1725 $ 1 ) ) / ( abstol+abs( wr( j-il+1 ) ) ) )
1728 result( 28 ) = temp1 / temp2
1741 CALL dcopy( n, sd, 1, d5, 1 )
1743 $
CALL dcopy( n-1, se, 1, work, 1 )
1744 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1748 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1749 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1755 CALL dstemr(
'V',
'I', n, d5, work, vl, vu, il, iu,
1756 $ m, d1, z, ldu, n, iwork( 1 ), tryrac,
1757 $ work( n+1 ), lwork-n, iwork( 2*n+1 ),
1758 $ liwork-2*n, iinfo )
1759 IF( iinfo.NE.0 )
THEN
1760 WRITE( nounit, fmt = 9999 )
'DSTEMR(V,I)', iinfo,
1763 IF( iinfo.LT.0 )
THEN
1766 result( 29 ) = ulpinv
1773 CALL dstt22( n, m, 0, sd, se, d1, dumma, z, ldu, work,
1780 CALL dcopy( n, sd, 1, d5, 1 )
1782 $
CALL dcopy( n-1, se, 1, work, 1 )
1785 CALL dstemr(
'N',
'I', n, d5, work, vl, vu, il, iu,
1786 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1787 $ work( n+1 ), lwork-n, iwork( 2*n+1 ),
1788 $ liwork-2*n, iinfo )
1789 IF( iinfo.NE.0 )
THEN
1790 WRITE( nounit, fmt = 9999 )
'DSTEMR(N,I)', iinfo,
1793 IF( iinfo.LT.0 )
THEN
1796 result( 31 ) = ulpinv
1806 DO 240 j = 1, iu - il + 1
1807 temp1 = max( temp1, abs( d1( j ) ),
1809 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1812 result( 31 ) = temp2 / max( unfl,
1813 $ ulp*max( temp1, temp2 ) )
1819 CALL dcopy( n, sd, 1, d5, 1 )
1821 $
CALL dcopy( n-1, se, 1, work, 1 )
1822 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1828 vl = d2( il ) - max( half*
1829 $ ( d2( il )-d2( il-1 ) ), ulp*anorm,
1832 vl = d2( 1 ) - max( half*( d2( n )-d2( 1 ) ),
1833 $ ulp*anorm, two*rtunfl )
1836 vu = d2( iu ) + max( half*
1837 $ ( d2( iu+1 )-d2( iu ) ), ulp*anorm,
1840 vu = d2( n ) + max( half*( d2( n )-d2( 1 ) ),
1841 $ ulp*anorm, two*rtunfl )
1848 CALL dstemr(
'V',
'V', n, d5, work, vl, vu, il, iu,
1849 $ m, d1, z, ldu, n, iwork( 1 ), tryrac,
1850 $ work( n+1 ), lwork-n, iwork( 2*n+1 ),
1851 $ liwork-2*n, iinfo )
1852 IF( iinfo.NE.0 )
THEN
1853 WRITE( nounit, fmt = 9999 )
'DSTEMR(V,V)', iinfo,
1856 IF( iinfo.LT.0 )
THEN
1859 result( 32 ) = ulpinv
1866 CALL dstt22( n, m, 0, sd, se, d1, dumma, z, ldu, work,
1873 CALL dcopy( n, sd, 1, d5, 1 )
1875 $
CALL dcopy( n-1, se, 1, work, 1 )
1878 CALL dstemr(
'N',
'V', n, d5, work, vl, vu, il, iu,
1879 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1880 $ work( n+1 ), lwork-n, iwork( 2*n+1 ),
1881 $ liwork-2*n, iinfo )
1882 IF( iinfo.NE.0 )
THEN
1883 WRITE( nounit, fmt = 9999 )
'DSTEMR(N,V)', iinfo,
1886 IF( iinfo.LT.0 )
THEN
1889 result( 34 ) = ulpinv
1899 DO 250 j = 1, iu - il + 1
1900 temp1 = max( temp1, abs( d1( j ) ),
1902 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1905 result( 34 ) = temp2 / max( unfl,
1906 $ ulp*max( temp1, temp2 ) )
1920 CALL dcopy( n, sd, 1, d5, 1 )
1922 $
CALL dcopy( n-1, se, 1, work, 1 )
1926 CALL dstemr(
'V',
'A', n, d5, work, vl, vu, il, iu,
1927 $ m, d1, z, ldu, n, iwork( 1 ), tryrac,
1928 $ work( n+1 ), lwork-n, iwork( 2*n+1 ),
1929 $ liwork-2*n, iinfo )
1930 IF( iinfo.NE.0 )
THEN
1931 WRITE( nounit, fmt = 9999 )
'DSTEMR(V,A)', iinfo, n,
1934 IF( iinfo.LT.0 )
THEN
1937 result( 35 ) = ulpinv
1944 CALL dstt22( n, m, 0, sd, se, d1, dumma, z, ldu, work, m,
1951 CALL dcopy( n, sd, 1, d5, 1 )
1953 $
CALL dcopy( n-1, se, 1, work, 1 )
1956 CALL dstemr(
'N',
'A', n, d5, work, vl, vu, il, iu,
1957 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1958 $ work( n+1 ), lwork-n, iwork( 2*n+1 ),
1959 $ liwork-2*n, iinfo )
1960 IF( iinfo.NE.0 )
THEN
1961 WRITE( nounit, fmt = 9999 )
'DSTEMR(N,A)', iinfo, n,
1964 IF( iinfo.LT.0 )
THEN
1967 result( 37 ) = ulpinv
1978 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1979 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1982 result( 37 ) = temp2 / max( unfl,
1983 $ ulp*max( temp1, temp2 ) )
1987 ntestt = ntestt + ntest
1993 DO 290 jr = 1, ntest
1994 IF( result( jr ).GE.thresh )
THEN
1999 IF( nerrs.EQ.0 )
THEN
2000 WRITE( nounit, fmt = 9998 )
'DST'
2001 WRITE( nounit, fmt = 9997 )
2002 WRITE( nounit, fmt = 9996 )
2003 WRITE( nounit, fmt = 9995 )
'Symmetric'
2004 WRITE( nounit, fmt = 9994 )
2008 WRITE( nounit, fmt = 9988 )
2011 WRITE( nounit, fmt = 9990 )n, ioldsd, jtype, jr,
2020 CALL dlasum(
'DST', nounit, nerrs, ntestt )
2023 9999
FORMAT(
' DCHKST2STG: ', a,
' returned INFO=', i6,
'.', / 9x,
2024 $
'N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
2026 9998
FORMAT( / 1x, a3,
' -- Real Symmetric eigenvalue problem' )
2027 9997
FORMAT(
' Matrix types (see DCHKST2STG for details): ' )
2029 9996
FORMAT( /
' Special Matrices:',
2030 $ /
' 1=Zero matrix. ',
2031 $
' 5=Diagonal: clustered entries.',
2032 $ /
' 2=Identity matrix. ',
2033 $
' 6=Diagonal: large, evenly spaced.',
2034 $ /
' 3=Diagonal: evenly spaced entries. ',
2035 $
' 7=Diagonal: small, evenly spaced.',
2036 $ /
' 4=Diagonal: geometr. spaced entries.' )
2037 9995
FORMAT(
' Dense ', a,
' Matrices:',
2038 $ /
' 8=Evenly spaced eigenvals. ',
2039 $
' 12=Small, evenly spaced eigenvals.',
2040 $ /
' 9=Geometrically spaced eigenvals. ',
2041 $
' 13=Matrix with random O(1) entries.',
2042 $ /
' 10=Clustered eigenvalues. ',
2043 $
' 14=Matrix with large random entries.',
2044 $ /
' 11=Large, evenly spaced eigenvals. ',
2045 $
' 15=Matrix with small random entries.' )
2046 9994
FORMAT(
' 16=Positive definite, evenly spaced eigenvalues',
2047 $ /
' 17=Positive definite, geometrically spaced eigenvlaues',
2048 $ /
' 18=Positive definite, clustered eigenvalues',
2049 $ /
' 19=Positive definite, small evenly spaced eigenvalues',
2050 $ /
' 20=Positive definite, large evenly spaced eigenvalues',
2051 $ /
' 21=Diagonally dominant tridiagonal, geometrically',
2052 $
' spaced eigenvalues' )
2054 9990
FORMAT(
' N=', i5,
', seed=', 4( i4,
',' ),
' type ', i2,
2055 $
', test(', i2,
')=', g10.3 )
2057 9988
FORMAT( /
'Test performed: see DCHKST2STG for details.', / )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
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 dsteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
DSTEQR
subroutine dstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
DSTEDC
subroutine dsterf(N, D, E, INFO)
DSTERF
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dchkst2stg(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, IWORK, LIWORK, RESULT, INFO)
DCHKST2STG
subroutine dlasum(TYPE, IOUNIT, IE, NRUN)
DLASUM
subroutine dstt22(N, M, KBAND, AD, AE, SD, SE, U, LDU, WORK, LDWORK, RESULT)
DSTT22
subroutine dspt21(ITYPE, UPLO, N, KBAND, AP, D, E, U, LDU, VP, TAU, WORK, RESULT)
DSPT21
subroutine dstech(N, A, B, EIG, TOL, WORK, INFO)
DSTECH
subroutine dsyt21(ITYPE, UPLO, N, KBAND, A, LDA, D, E, U, LDU, V, LDV, TAU, WORK, RESULT)
DSYT21
subroutine dstt21(N, KBAND, AD, AE, SD, SE, U, LDU, WORK, RESULT)
DSTT21
subroutine dlatmr(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)
DLATMR
subroutine dlatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
DLATMS
subroutine dstemr(JOBZ, RANGE, N, D, E, VL, VU, IL, IU, M, W, Z, LDZ, NZC, ISUPPZ, TRYRAC, WORK, LWORK, IWORK, LIWORK, INFO)
DSTEMR
subroutine dsptrd(UPLO, N, AP, D, E, TAU, INFO)
DSPTRD
subroutine dstein(N, D, E, M, W, IBLOCK, ISPLIT, Z, LDZ, WORK, IWORK, IFAIL, INFO)
DSTEIN
subroutine dopgtr(UPLO, N, AP, TAU, Q, LDQ, WORK, INFO)
DOPGTR
subroutine dorgtr(UPLO, N, A, LDA, TAU, WORK, LWORK, INFO)
DORGTR
subroutine dpteqr(COMPZ, N, D, E, Z, LDZ, WORK, INFO)
DPTEQR
subroutine dsytrd_2stage(VECT, UPLO, N, A, LDA, D, E, TAU, HOUS2, LHOUS2, WORK, LWORK, INFO)
DSYTRD_2STAGE
subroutine dsytrd(UPLO, N, A, LDA, D, E, TAU, WORK, LWORK, INFO)
DSYTRD