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
1069 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1070 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1071 temp3 = max( temp3, abs( d1( j ) ), abs( d3( j ) ) )
1072 temp4 = max( temp4, abs( d1( j )-d3( j ) ) )
1075 result( 3 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1076 result( 4 ) = temp4 / max( unfl, ulp*max( temp3, temp4 ) )
1084 ap( i ) = a( jr, jc )
1090 CALL dcopy( nap, ap, 1, vp, 1 )
1093 CALL dsptrd(
'U', n, vp, sd, se, tau, iinfo )
1095 IF( iinfo.NE.0 )
THEN
1096 WRITE( nounit, fmt = 9999 )
'DSPTRD(U)', iinfo, n, jtype,
1099 IF( iinfo.LT.0 )
THEN
1102 result( 5 ) = ulpinv
1108 CALL dopgtr(
'U', n, vp, tau, u, ldu, work, iinfo )
1109 IF( iinfo.NE.0 )
THEN
1110 WRITE( nounit, fmt = 9999 )
'DOPGTR(U)', iinfo, n, jtype,
1113 IF( iinfo.LT.0 )
THEN
1116 result( 6 ) = ulpinv
1123 CALL dspt21( 2,
'Upper', n, 1, ap, sd, se, u, ldu, vp, tau,
1124 $ work, result( 5 ) )
1125 CALL dspt21( 3,
'Upper', n, 1, ap, sd, se, u, ldu, vp, tau,
1126 $ work, result( 6 ) )
1134 ap( i ) = a( jr, jc )
1140 CALL dcopy( nap, ap, 1, vp, 1 )
1143 CALL dsptrd(
'L', n, vp, sd, se, tau, iinfo )
1145 IF( iinfo.NE.0 )
THEN
1146 WRITE( nounit, fmt = 9999 )
'DSPTRD(L)', iinfo, n, jtype,
1149 IF( iinfo.LT.0 )
THEN
1152 result( 7 ) = ulpinv
1158 CALL dopgtr(
'L', n, vp, tau, u, ldu, work, iinfo )
1159 IF( iinfo.NE.0 )
THEN
1160 WRITE( nounit, fmt = 9999 )
'DOPGTR(L)', iinfo, n, jtype,
1163 IF( iinfo.LT.0 )
THEN
1166 result( 8 ) = ulpinv
1171 CALL dspt21( 2,
'Lower', n, 1, ap, sd, se, u, ldu, vp, tau,
1172 $ work, result( 7 ) )
1173 CALL dspt21( 3,
'Lower', n, 1, ap, sd, se, u, ldu, vp, tau,
1174 $ work, result( 8 ) )
1180 CALL dcopy( n, sd, 1, d1, 1 )
1182 $
CALL dcopy( n-1, se, 1, work, 1 )
1183 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1186 CALL dsteqr(
'V', n, d1, work, z, ldu, work( n+1 ), iinfo )
1187 IF( iinfo.NE.0 )
THEN
1188 WRITE( nounit, fmt = 9999 )
'DSTEQR(V)', iinfo, n, jtype,
1191 IF( iinfo.LT.0 )
THEN
1194 result( 9 ) = ulpinv
1201 CALL dcopy( n, sd, 1, d2, 1 )
1203 $
CALL dcopy( n-1, se, 1, work, 1 )
1206 CALL dsteqr(
'N', n, d2, work, work( n+1 ), ldu,
1207 $ work( n+1 ), iinfo )
1208 IF( iinfo.NE.0 )
THEN
1209 WRITE( nounit, fmt = 9999 )
'DSTEQR(N)', iinfo, n, jtype,
1212 IF( iinfo.LT.0 )
THEN
1215 result( 11 ) = ulpinv
1222 CALL dcopy( n, sd, 1, d3, 1 )
1224 $
CALL dcopy( n-1, se, 1, work, 1 )
1227 CALL dsterf( n, d3, work, iinfo )
1228 IF( iinfo.NE.0 )
THEN
1229 WRITE( nounit, fmt = 9999 )
'DSTERF', iinfo, n, jtype,
1232 IF( iinfo.LT.0 )
THEN
1235 result( 12 ) = ulpinv
1242 CALL dstt21( n, 0, sd, se, d1, dumma, z, ldu, work,
1253 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1254 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1255 temp3 = max( temp3, abs( d1( j ) ), abs( d3( j ) ) )
1256 temp4 = max( temp4, abs( d1( j )-d3( j ) ) )
1259 result( 11 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1260 result( 12 ) = temp4 / max( unfl, ulp*max( temp3, temp4 ) )
1266 temp1 = thresh*( half-ulp )
1268 DO 160 j = 0, log2ui
1269 CALL dstech( n, sd, se, d1, temp1, work, iinfo )
1276 result( 13 ) = temp1
1281 IF( jtype.GT.15 )
THEN
1285 CALL dcopy( n, sd, 1, d4, 1 )
1287 $
CALL dcopy( n-1, se, 1, work, 1 )
1288 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1291 CALL dpteqr(
'V', n, d4, work, z, ldu, work( n+1 ),
1293 IF( iinfo.NE.0 )
THEN
1294 WRITE( nounit, fmt = 9999 )
'DPTEQR(V)', iinfo, n,
1297 IF( iinfo.LT.0 )
THEN
1300 result( 14 ) = ulpinv
1307 CALL dstt21( n, 0, sd, se, d4, dumma, z, ldu, work,
1312 CALL dcopy( n, sd, 1, d5, 1 )
1314 $
CALL dcopy( n-1, se, 1, work, 1 )
1317 CALL dpteqr(
'N', n, d5, work, z, ldu, work( n+1 ),
1319 IF( iinfo.NE.0 )
THEN
1320 WRITE( nounit, fmt = 9999 )
'DPTEQR(N)', iinfo, n,
1323 IF( iinfo.LT.0 )
THEN
1326 result( 16 ) = ulpinv
1336 temp1 = max( temp1, abs( d4( j ) ), abs( d5( j ) ) )
1337 temp2 = max( temp2, abs( d4( j )-d5( j ) ) )
1340 result( 16 ) = temp2 / max( unfl,
1341 $ hun*ulp*max( temp1, temp2 ) )
1357 IF( jtype.EQ.21 )
THEN
1359 abstol = unfl + unfl
1360 CALL dstebz(
'A',
'E', n, vl, vu, il, iu, abstol, sd, se,
1361 $ m, nsplit, wr, iwork( 1 ), iwork( n+1 ),
1362 $ work, iwork( 2*n+1 ), iinfo )
1363 IF( iinfo.NE.0 )
THEN
1364 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A,rel)', iinfo, n,
1367 IF( iinfo.LT.0 )
THEN
1370 result( 17 ) = ulpinv
1377 temp2 = two*( two*n-one )*ulp*( one+eight*half**2 ) /
1382 temp1 = max( temp1, abs( d4( j )-wr( n-j+1 ) ) /
1383 $ ( abstol+abs( d4( j ) ) ) )
1386 result( 17 ) = temp1 / temp2
1394 abstol = unfl + unfl
1395 CALL dstebz(
'A',
'E', n, vl, vu, il, iu, abstol, sd, se, m,
1396 $ nsplit, wa1, iwork( 1 ), iwork( n+1 ), work,
1397 $ iwork( 2*n+1 ), iinfo )
1398 IF( iinfo.NE.0 )
THEN
1399 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A)', iinfo, n, jtype,
1402 IF( iinfo.LT.0 )
THEN
1405 result( 18 ) = ulpinv
1415 temp1 = max( temp1, abs( d3( j ) ), abs( wa1( j ) ) )
1416 temp2 = max( temp2, abs( d3( j )-wa1( j ) ) )
1419 result( 18 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1429 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1430 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1438 CALL dstebz(
'I',
'E', n, vl, vu, il, iu, abstol, sd, se,
1439 $ m2, nsplit, wa2, iwork( 1 ), iwork( n+1 ),
1440 $ work, iwork( 2*n+1 ), iinfo )
1441 IF( iinfo.NE.0 )
THEN
1442 WRITE( nounit, fmt = 9999 )
'DSTEBZ(I)', iinfo, n, jtype,
1445 IF( iinfo.LT.0 )
THEN
1448 result( 19 ) = ulpinv
1458 vl = wa1( il ) - max( half*( wa1( il )-wa1( il-1 ) ),
1459 $ ulp*anorm, two*rtunfl )
1461 vl = wa1( 1 ) - max( half*( wa1( n )-wa1( 1 ) ),
1462 $ ulp*anorm, two*rtunfl )
1465 vu = wa1( iu ) + max( half*( wa1( iu+1 )-wa1( iu ) ),
1466 $ ulp*anorm, two*rtunfl )
1468 vu = wa1( n ) + max( half*( wa1( n )-wa1( 1 ) ),
1469 $ ulp*anorm, two*rtunfl )
1476 CALL dstebz(
'V',
'E', n, vl, vu, il, iu, abstol, sd, se,
1477 $ m3, nsplit, wa3, iwork( 1 ), iwork( n+1 ),
1478 $ work, iwork( 2*n+1 ), iinfo )
1479 IF( iinfo.NE.0 )
THEN
1480 WRITE( nounit, fmt = 9999 )
'DSTEBZ(V)', iinfo, n, jtype,
1483 IF( iinfo.LT.0 )
THEN
1486 result( 19 ) = ulpinv
1491 IF( m3.EQ.0 .AND. n.NE.0 )
THEN
1492 result( 19 ) = ulpinv
1498 temp1 = dsxt1( 1, wa2, m2, wa3, m3, abstol, ulp, unfl )
1499 temp2 = dsxt1( 1, wa3, m3, wa2, m2, abstol, ulp, unfl )
1501 temp3 = max( abs( wa1( n ) ), abs( wa1( 1 ) ) )
1506 result( 19 ) = ( temp1+temp2 ) / max( unfl, temp3*ulp )
1513 CALL dstebz(
'A',
'B', n, vl, vu, il, iu, abstol, sd, se, m,
1514 $ nsplit, wa1, iwork( 1 ), iwork( n+1 ), work,
1515 $ iwork( 2*n+1 ), iinfo )
1516 IF( iinfo.NE.0 )
THEN
1517 WRITE( nounit, fmt = 9999 )
'DSTEBZ(A,B)', iinfo, n,
1520 IF( iinfo.LT.0 )
THEN
1523 result( 20 ) = ulpinv
1524 result( 21 ) = ulpinv
1529 CALL dstein( n, sd, se, m, wa1, iwork( 1 ), iwork( n+1 ), z,
1530 $ ldu, work, iwork( 2*n+1 ), iwork( 3*n+1 ),
1532 IF( iinfo.NE.0 )
THEN
1533 WRITE( nounit, fmt = 9999 )
'DSTEIN', iinfo, n, jtype,
1536 IF( iinfo.LT.0 )
THEN
1539 result( 20 ) = ulpinv
1540 result( 21 ) = ulpinv
1547 CALL dstt21( n, 0, sd, se, wa1, dumma, z, ldu, work,
1554 CALL dcopy( n, sd, 1, d1, 1 )
1556 $
CALL dcopy( n-1, se, 1, work, 1 )
1557 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1560 CALL dstedc(
'I', n, d1, work, z, ldu, work( n+1 ), lwedc-n,
1561 $ iwork, liwedc, iinfo )
1562 IF( iinfo.NE.0 )
THEN
1563 WRITE( nounit, fmt = 9999 )
'DSTEDC(I)', iinfo, n, jtype,
1566 IF( iinfo.LT.0 )
THEN
1569 result( 22 ) = ulpinv
1576 CALL dstt21( n, 0, sd, se, d1, dumma, z, ldu, work,
1583 CALL dcopy( n, sd, 1, d1, 1 )
1585 $
CALL dcopy( n-1, se, 1, work, 1 )
1586 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1589 CALL dstedc(
'V', n, d1, work, z, ldu, work( n+1 ), lwedc-n,
1590 $ iwork, liwedc, iinfo )
1591 IF( iinfo.NE.0 )
THEN
1592 WRITE( nounit, fmt = 9999 )
'DSTEDC(V)', iinfo, n, jtype,
1595 IF( iinfo.LT.0 )
THEN
1598 result( 24 ) = ulpinv
1605 CALL dstt21( n, 0, sd, se, d1, dumma, z, ldu, work,
1612 CALL dcopy( n, sd, 1, d2, 1 )
1614 $
CALL dcopy( n-1, se, 1, work, 1 )
1615 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1618 CALL dstedc(
'N', n, d2, work, z, ldu, work( n+1 ), lwedc-n,
1619 $ iwork, liwedc, iinfo )
1620 IF( iinfo.NE.0 )
THEN
1621 WRITE( nounit, fmt = 9999 )
'DSTEDC(N)', iinfo, n, jtype,
1624 IF( iinfo.LT.0 )
THEN
1627 result( 26 ) = ulpinv
1638 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1639 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1642 result( 26 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
1646 IF( ilaenv( 10,
'DSTEMR',
'VA', 1, 0, 0, 0 ).EQ.1 .AND.
1647 $ ilaenv( 11,
'DSTEMR',
'VA', 1, 0, 0, 0 ).EQ.1 )
THEN
1658 IF( jtype.EQ.21 .AND. srel )
THEN
1660 abstol = unfl + unfl
1661 CALL dstemr(
'V',
'A', n, sd, se, vl, vu, il, iu,
1662 $ m, wr, z, ldu, n, iwork( 1 ), tryrac,
1663 $ work, lwork, iwork( 2*n+1 ), lwork-2*n,
1665 IF( iinfo.NE.0 )
THEN
1666 WRITE( nounit, fmt = 9999 )
'DSTEMR(V,A,rel)',
1667 $ iinfo, n, jtype, ioldsd
1669 IF( iinfo.LT.0 )
THEN
1672 result( 27 ) = ulpinv
1679 temp2 = two*( two*n-one )*ulp*( one+eight*half**2 ) /
1684 temp1 = max( temp1, abs( d4( j )-wr( n-j+1 ) ) /
1685 $ ( abstol+abs( d4( j ) ) ) )
1688 result( 27 ) = temp1 / temp2
1690 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1691 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1700 abstol = unfl + unfl
1701 CALL dstemr(
'V',
'I', n, sd, se, vl, vu, il, iu,
1702 $ m, wr, z, ldu, n, iwork( 1 ), tryrac,
1703 $ work, lwork, iwork( 2*n+1 ),
1704 $ lwork-2*n, iinfo )
1706 IF( iinfo.NE.0 )
THEN
1707 WRITE( nounit, fmt = 9999 )
'DSTEMR(V,I,rel)',
1708 $ iinfo, n, jtype, ioldsd
1710 IF( iinfo.LT.0 )
THEN
1713 result( 28 ) = ulpinv
1721 temp2 = two*( two*n-one )*ulp*
1722 $ ( one+eight*half**2 ) / ( one-half )**4
1726 temp1 = max( temp1, abs( wr( j-il+1 )-d4( n-j+
1727 $ 1 ) ) / ( abstol+abs( wr( j-il+1 ) ) ) )
1730 result( 28 ) = temp1 / temp2
1743 CALL dcopy( n, sd, 1, d5, 1 )
1745 $
CALL dcopy( n-1, se, 1, work, 1 )
1746 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1750 il = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1751 iu = 1 + ( n-1 )*int( dlarnd( 1, iseed2 ) )
1757 CALL dstemr(
'V',
'I', n, d5, work, vl, vu, il, iu,
1758 $ m, d1, z, ldu, n, iwork( 1 ), tryrac,
1759 $ work( n+1 ), lwork-n, iwork( 2*n+1 ),
1760 $ liwork-2*n, iinfo )
1761 IF( iinfo.NE.0 )
THEN
1762 WRITE( nounit, fmt = 9999 )
'DSTEMR(V,I)', iinfo,
1765 IF( iinfo.LT.0 )
THEN
1768 result( 29 ) = ulpinv
1775 CALL dstt22( n, m, 0, sd, se, d1, dumma, z, ldu, work,
1782 CALL dcopy( n, sd, 1, d5, 1 )
1784 $
CALL dcopy( n-1, se, 1, work, 1 )
1787 CALL dstemr(
'N',
'I', n, d5, work, vl, vu, il, iu,
1788 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1789 $ work( n+1 ), lwork-n, iwork( 2*n+1 ),
1790 $ liwork-2*n, iinfo )
1791 IF( iinfo.NE.0 )
THEN
1792 WRITE( nounit, fmt = 9999 )
'DSTEMR(N,I)', iinfo,
1795 IF( iinfo.LT.0 )
THEN
1798 result( 31 ) = ulpinv
1808 DO 240 j = 1, iu - il + 1
1809 temp1 = max( temp1, abs( d1( j ) ),
1811 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1814 result( 31 ) = temp2 / max( unfl,
1815 $ ulp*max( temp1, temp2 ) )
1822 CALL dcopy( n, sd, 1, d5, 1 )
1824 $
CALL dcopy( n-1, se, 1, work, 1 )
1825 CALL dlaset(
'Full', n, n, zero, one, z, ldu )
1831 vl = d2( il ) - max( half*
1832 $ ( d2( il )-d2( il-1 ) ), ulp*anorm,
1835 vl = d2( 1 ) - max( half*( d2( n )-d2( 1 ) ),
1836 $ ulp*anorm, two*rtunfl )
1839 vu = d2( iu ) + max( half*
1840 $ ( d2( iu+1 )-d2( iu ) ), ulp*anorm,
1843 vu = d2( n ) + max( half*( d2( n )-d2( 1 ) ),
1844 $ ulp*anorm, two*rtunfl )
1851 CALL dstemr(
'V',
'V', n, d5, work, vl, vu, il, iu,
1852 $ m, d1, z, ldu, n, iwork( 1 ), tryrac,
1853 $ work( n+1 ), lwork-n, iwork( 2*n+1 ),
1854 $ liwork-2*n, iinfo )
1855 IF( iinfo.NE.0 )
THEN
1856 WRITE( nounit, fmt = 9999 )
'DSTEMR(V,V)', iinfo,
1859 IF( iinfo.LT.0 )
THEN
1862 result( 32 ) = ulpinv
1869 CALL dstt22( n, m, 0, sd, se, d1, dumma, z, ldu, work,
1876 CALL dcopy( n, sd, 1, d5, 1 )
1878 $
CALL dcopy( n-1, se, 1, work, 1 )
1881 CALL dstemr(
'N',
'V', n, d5, work, vl, vu, il, iu,
1882 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1883 $ work( n+1 ), lwork-n, iwork( 2*n+1 ),
1884 $ liwork-2*n, iinfo )
1885 IF( iinfo.NE.0 )
THEN
1886 WRITE( nounit, fmt = 9999 )
'DSTEMR(N,V)', iinfo,
1889 IF( iinfo.LT.0 )
THEN
1892 result( 34 ) = ulpinv
1902 DO 250 j = 1, iu - il + 1
1903 temp1 = max( temp1, abs( d1( j ) ),
1905 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1908 result( 34 ) = temp2 / max( unfl,
1909 $ ulp*max( temp1, temp2 ) )
1924 CALL dcopy( n, sd, 1, d5, 1 )
1926 $
CALL dcopy( n-1, se, 1, work, 1 )
1930 CALL dstemr(
'V',
'A', n, d5, work, vl, vu, il, iu,
1931 $ m, d1, z, ldu, n, iwork( 1 ), tryrac,
1932 $ work( n+1 ), lwork-n, iwork( 2*n+1 ),
1933 $ liwork-2*n, iinfo )
1934 IF( iinfo.NE.0 )
THEN
1935 WRITE( nounit, fmt = 9999 )
'DSTEMR(V,A)', iinfo, n,
1938 IF( iinfo.LT.0 )
THEN
1941 result( 35 ) = ulpinv
1948 CALL dstt22( n, m, 0, sd, se, d1, dumma, z, ldu, work, m,
1955 CALL dcopy( n, sd, 1, d5, 1 )
1957 $
CALL dcopy( n-1, se, 1, work, 1 )
1960 CALL dstemr(
'N',
'A', n, d5, work, vl, vu, il, iu,
1961 $ m, d2, z, ldu, n, iwork( 1 ), tryrac,
1962 $ work( n+1 ), lwork-n, iwork( 2*n+1 ),
1963 $ liwork-2*n, iinfo )
1964 IF( iinfo.NE.0 )
THEN
1965 WRITE( nounit, fmt = 9999 )
'DSTEMR(N,A)', iinfo, n,
1968 IF( iinfo.LT.0 )
THEN
1971 result( 37 ) = ulpinv
1982 temp1 = max( temp1, abs( d1( j ) ), abs( d2( j ) ) )
1983 temp2 = max( temp2, abs( d1( j )-d2( j ) ) )
1986 result( 37 ) = temp2 / max( unfl,
1987 $ ulp*max( temp1, temp2 ) )
1991 ntestt = ntestt + ntest
1998 DO 290 jr = 1, ntest
1999 IF( result( jr ).GE.thresh )
THEN
2004 IF( nerrs.EQ.0 )
THEN
2005 WRITE( nounit, fmt = 9998 )
'DST'
2006 WRITE( nounit, fmt = 9997 )
2007 WRITE( nounit, fmt = 9996 )
2008 WRITE( nounit, fmt = 9995 )
'Symmetric'
2009 WRITE( nounit, fmt = 9994 )
2013 WRITE( nounit, fmt = 9988 )
2016 WRITE( nounit, fmt = 9990 )n, ioldsd, jtype, jr,
2025 CALL dlasum(
'DST', nounit, nerrs, ntestt )
2028 9999
FORMAT(
' DCHKST2STG: ', a,
' returned INFO=', i6,
'.', / 9x,
2029 $
'N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
2031 9998
FORMAT( / 1x, a3,
' -- Real Symmetric eigenvalue problem' )
2032 9997
FORMAT(
' Matrix types (see DCHKST2STG for details): ' )
2034 9996
FORMAT( /
' Special Matrices:',
2035 $ /
' 1=Zero matrix. ',
2036 $
' 5=Diagonal: clustered entries.',
2037 $ /
' 2=Identity matrix. ',
2038 $
' 6=Diagonal: large, evenly spaced.',
2039 $ /
' 3=Diagonal: evenly spaced entries. ',
2040 $
' 7=Diagonal: small, evenly spaced.',
2041 $ /
' 4=Diagonal: geometr. spaced entries.' )
2042 9995
FORMAT(
' Dense ', a,
' Matrices:',
2043 $ /
' 8=Evenly spaced eigenvals. ',
2044 $
' 12=Small, evenly spaced eigenvals.',
2045 $ /
' 9=Geometrically spaced eigenvals. ',
2046 $
' 13=Matrix with random O(1) entries.',
2047 $ /
' 10=Clustered eigenvalues. ',
2048 $
' 14=Matrix with large random entries.',
2049 $ /
' 11=Large, evenly spaced eigenvals. ',
2050 $
' 15=Matrix with small random entries.' )
2051 9994
FORMAT(
' 16=Positive definite, evenly spaced eigenvalues',
2052 $ /
' 17=Positive definite, geometrically spaced eigenvlaues',
2053 $ /
' 18=Positive definite, clustered eigenvalues',
2054 $ /
' 19=Positive definite, small evenly spaced eigenvalues',
2055 $ /
' 20=Positive definite, large evenly spaced eigenvalues',
2056 $ /
' 21=Diagonally dominant tridiagonal, geometrically',
2057 $
' spaced eigenvalues' )
2059 9990
FORMAT(
' N=', i5,
', seed=', 4( i4,
',' ),
' type ', i2,
2060 $
', test(', i2,
')=', g10.3 )
2062 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