360 SUBROUTINE ddrvsg2stg( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
361 $ NOUNIT, A, LDA, B, LDB, D, D2, Z, LDZ, AB,
362 $ BB, AP, BP, WORK, NWORK, IWORK, LIWORK,
373 INTEGER INFO, LDA, LDB, LDZ, LIWORK, NOUNIT, NSIZES,
375 DOUBLE PRECISION THRESH
379 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
380 DOUBLE PRECISION A( LDA, * ), AB( LDA, * ), AP( * ),
381 $ b( ldb, * ), bb( ldb, * ), bp( * ), d( * ),
382 $ d2( * ), result( * ), work( * ), z( ldz, * )
388 DOUBLE PRECISION ZERO, ONE, TEN
389 PARAMETER ( ZERO = 0.0d0, one = 1.0d0, ten = 10.0d0 )
391 parameter( maxtyp = 21 )
396 INTEGER I, IBTYPE, IBUPLO, IINFO, IJ, IL, IMODE, ITEMP,
397 $ itype, iu, j, jcol, jsize, jtype, ka, ka9, kb,
398 $ kb9, m, mtypes, n, nerrs, nmats, nmax, ntest,
400 DOUBLE PRECISION ABSTOL, ANINV, ANORM, COND, OVFL, RTOVFL,
401 $ RTUNFL, ULP, ULPINV, UNFL, VL, VU, TEMP1, TEMP2
404 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ),
405 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
410 DOUBLE PRECISION DLAMCH, DLARND
411 EXTERNAL LSAME, DLAMCH, DLARND
420 INTRINSIC abs, dble, max, min, sqrt
423 DATA ktype / 1, 2, 5*4, 5*5, 3*8, 6*9 /
424 DATA kmagn / 2*1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
426 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
439 nmax = max( nmax, nn( j ) )
446 IF( nsizes.LT.0 )
THEN
448 ELSE IF( badnn )
THEN
450 ELSE IF( ntypes.LT.0 )
THEN
452 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
454 ELSE IF( ldz.LE.1 .OR. ldz.LT.nmax )
THEN
456 ELSE IF( 2*max( nmax, 3 )**2.GT.nwork )
THEN
458 ELSE IF( 2*max( nmax, 3 )**2.GT.liwork )
THEN
463 CALL xerbla(
'DDRVSG2STG', -info )
469 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
474 unfl = dlamch(
'Safe minimum' )
475 ovfl = dlamch(
'Overflow' )
477 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
479 rtunfl = sqrt( unfl )
480 rtovfl = sqrt( ovfl )
483 iseed2( i ) = iseed( i )
491 DO 650 jsize = 1, nsizes
493 aninv = one / dble( max( 1, n ) )
495 IF( nsizes.NE.1 )
THEN
496 mtypes = min( maxtyp, ntypes )
498 mtypes = min( maxtyp+1, ntypes )
503 DO 640 jtype = 1, mtypes
504 IF( .NOT.dotype( jtype ) )
510 ioldsd( j ) = iseed( j )
528 IF( mtypes.GT.maxtyp )
531 itype = ktype( jtype )
532 imode = kmode( jtype )
536 GO TO ( 40, 50, 60 )kmagn( jtype )
543 anorm = ( rtovfl*ulp )*aninv
547 anorm = rtunfl*n*ulpinv
557 IF( itype.EQ.1 )
THEN
563 CALL dlaset(
'Full', lda, n, zero, zero, a, lda )
565 ELSE IF( itype.EQ.2 )
THEN
571 CALL dlaset(
'Full', lda, n, zero, zero, a, lda )
573 a( jcol, jcol ) = anorm
576 ELSE IF( itype.EQ.4 )
THEN
582 CALL dlatms( n, n,
'S', iseed,
'S', work, imode, cond,
583 $ anorm, 0, 0,
'N', a, lda, work( n+1 ),
586 ELSE IF( itype.EQ.5 )
THEN
592 CALL dlatms( n, n,
'S', iseed,
'S', work, imode, cond,
593 $ anorm, n, n,
'N', a, lda, work( n+1 ),
596 ELSE IF( itype.EQ.7 )
THEN
602 CALL dlatmr( n, n,
'S', iseed,
'S', work, 6, one, one,
603 $
'T',
'N', work( n+1 ), 1, one,
604 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
605 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
607 ELSE IF( itype.EQ.8 )
THEN
613 CALL dlatmr( n, n,
'S', iseed,
'H', work, 6, one, one,
614 $
'T',
'N', work( n+1 ), 1, one,
615 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
616 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
618 ELSE IF( itype.EQ.9 )
THEN
632 IF( kb9.GT.ka9 )
THEN
636 ka = max( 0, min( n-1, ka9 ) )
637 kb = max( 0, min( n-1, kb9 ) )
638 CALL dlatms( n, n,
'S', iseed,
'S', work, imode, cond,
639 $ anorm, ka, ka,
'N', a, lda, work( n+1 ),
647 IF( iinfo.NE.0 )
THEN
648 WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n, jtype,
661 il = 1 + int( ( n-1 )*dlarnd( 1, iseed2 ) )
662 iu = 1 + int( ( n-1 )*dlarnd( 1, iseed2 ) )
691 CALL dlatms( n, n,
'U', iseed,
'P', work, 5, ten, one,
692 $ kb, kb, uplo, b, ldb, work( n+1 ),
699 CALL dlacpy(
' ', n, n, a, lda, z, ldz )
700 CALL dlacpy( uplo, n, n, b, ldb, bb, ldb )
702 CALL dsygv( ibtype,
'V', uplo, n, z, ldz, bb, ldb, d,
703 $ work, nwork, iinfo )
704 IF( iinfo.NE.0 )
THEN
705 WRITE( nounit, fmt = 9999 )
'DSYGV(V,' // uplo //
706 $
')', iinfo, n, jtype, ioldsd
708 IF( iinfo.LT.0 )
THEN
711 result( ntest ) = ulpinv
718 CALL dsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
719 $ ldz, d, work, result( ntest ) )
725 CALL dlacpy(
' ', n, n, a, lda, z, ldz )
726 CALL dlacpy( uplo, n, n, b, ldb, bb, ldb )
729 $ bb, ldb, d2, work, nwork, iinfo )
730 IF( iinfo.NE.0 )
THEN
731 WRITE( nounit, fmt = 9999 )
732 $
'DSYGV_2STAGE(V,' // uplo //
733 $
')', iinfo, n, jtype, ioldsd
735 IF( iinfo.LT.0 )
THEN
738 result( ntest ) = ulpinv
755 temp1 = max( temp1, abs( d( j ) ),
757 temp2 = max( temp2, abs( d( j )-d2( j ) ) )
760 result( ntest ) = temp2 /
761 $ max( unfl, ulp*max( temp1, temp2 ) )
767 CALL dlacpy(
' ', n, n, a, lda, z, ldz )
768 CALL dlacpy( uplo, n, n, b, ldb, bb, ldb )
770 CALL dsygvd( ibtype,
'V', uplo, n, z, ldz, bb, ldb, d,
771 $ work, nwork, iwork, liwork, iinfo )
772 IF( iinfo.NE.0 )
THEN
773 WRITE( nounit, fmt = 9999 )
'DSYGVD(V,' // uplo //
774 $
')', iinfo, n, jtype, ioldsd
776 IF( iinfo.LT.0 )
THEN
779 result( ntest ) = ulpinv
786 CALL dsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
787 $ ldz, d, work, result( ntest ) )
793 CALL dlacpy(
' ', n, n, a, lda, ab, lda )
794 CALL dlacpy( uplo, n, n, b, ldb, bb, ldb )
796 CALL dsygvx( ibtype,
'V',
'A', uplo, n, ab, lda, bb,
797 $ ldb, vl, vu, il, iu, abstol, m, d, z,
798 $ ldz, work, nwork, iwork( n+1 ), iwork,
800 IF( iinfo.NE.0 )
THEN
801 WRITE( nounit, fmt = 9999 )
'DSYGVX(V,A' // uplo //
802 $
')', iinfo, n, jtype, ioldsd
804 IF( iinfo.LT.0 )
THEN
807 result( ntest ) = ulpinv
814 CALL dsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
815 $ ldz, d, work, result( ntest ) )
819 CALL dlacpy(
' ', n, n, a, lda, ab, lda )
820 CALL dlacpy( uplo, n, n, b, ldb, bb, ldb )
829 CALL dsygvx( ibtype,
'V',
'V', uplo, n, ab, lda, bb,
830 $ ldb, vl, vu, il, iu, abstol, m, d, z,
831 $ ldz, work, nwork, iwork( n+1 ), iwork,
833 IF( iinfo.NE.0 )
THEN
834 WRITE( nounit, fmt = 9999 )
'DSYGVX(V,V,' //
835 $ uplo //
')', iinfo, n, jtype, ioldsd
837 IF( iinfo.LT.0 )
THEN
840 result( ntest ) = ulpinv
847 CALL dsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
848 $ ldz, d, work, result( ntest ) )
852 CALL dlacpy(
' ', n, n, a, lda, ab, lda )
853 CALL dlacpy( uplo, n, n, b, ldb, bb, ldb )
855 CALL dsygvx( ibtype,
'V',
'I', uplo, n, ab, lda, bb,
856 $ ldb, vl, vu, il, iu, abstol, m, d, z,
857 $ ldz, work, nwork, iwork( n+1 ), iwork,
859 IF( iinfo.NE.0 )
THEN
860 WRITE( nounit, fmt = 9999 )
'DSYGVX(V,I,' //
861 $ uplo //
')', iinfo, n, jtype, ioldsd
863 IF( iinfo.LT.0 )
THEN
866 result( ntest ) = ulpinv
873 CALL dsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
874 $ ldz, d, work, result( ntest ) )
884 IF( lsame( uplo,
'U' ) )
THEN
904 CALL dspgv( ibtype,
'V', uplo, n, ap, bp, d, z, ldz,
906 IF( iinfo.NE.0 )
THEN
907 WRITE( nounit, fmt = 9999 )
'DSPGV(V,' // uplo //
908 $
')', iinfo, n, jtype, ioldsd
910 IF( iinfo.LT.0 )
THEN
913 result( ntest ) = ulpinv
920 CALL dsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
921 $ ldz, d, work, result( ntest ) )
929 IF( lsame( uplo,
'U' ) )
THEN
949 CALL dspgvd( ibtype,
'V', uplo, n, ap, bp, d, z, ldz,
950 $ work, nwork, iwork, liwork, iinfo )
951 IF( iinfo.NE.0 )
THEN
952 WRITE( nounit, fmt = 9999 )
'DSPGVD(V,' // uplo //
953 $
')', iinfo, n, jtype, ioldsd
955 IF( iinfo.LT.0 )
THEN
958 result( ntest ) = ulpinv
965 CALL dsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
966 $ ldz, d, work, result( ntest ) )
974 IF( lsame( uplo,
'U' ) )
THEN
994 CALL dspgvx( ibtype,
'V',
'A', uplo, n, ap, bp, vl,
995 $ vu, il, iu, abstol, m, d, z, ldz, work,
996 $ iwork( n+1 ), iwork, info )
997 IF( iinfo.NE.0 )
THEN
998 WRITE( nounit, fmt = 9999 )
'DSPGVX(V,A' // uplo //
999 $
')', iinfo, n, jtype, ioldsd
1001 IF( iinfo.LT.0 )
THEN
1004 result( ntest ) = ulpinv
1011 CALL dsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1012 $ ldz, d, work, result( ntest ) )
1018 IF( lsame( uplo,
'U' ) )
THEN
1022 ap( ij ) = a( i, j )
1023 bp( ij ) = b( i, j )
1031 ap( ij ) = a( i, j )
1032 bp( ij ) = b( i, j )
1040 CALL dspgvx( ibtype,
'V',
'V', uplo, n, ap, bp, vl,
1041 $ vu, il, iu, abstol, m, d, z, ldz, work,
1042 $ iwork( n+1 ), iwork, info )
1043 IF( iinfo.NE.0 )
THEN
1044 WRITE( nounit, fmt = 9999 )
'DSPGVX(V,V' // uplo //
1045 $
')', iinfo, n, jtype, ioldsd
1047 IF( iinfo.LT.0 )
THEN
1050 result( ntest ) = ulpinv
1057 CALL dsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1058 $ ldz, d, work, result( ntest ) )
1064 IF( lsame( uplo,
'U' ) )
THEN
1068 ap( ij ) = a( i, j )
1069 bp( ij ) = b( i, j )
1077 ap( ij ) = a( i, j )
1078 bp( ij ) = b( i, j )
1084 CALL dspgvx( ibtype,
'V',
'I', uplo, n, ap, bp, vl,
1085 $ vu, il, iu, abstol, m, d, z, ldz, work,
1086 $ iwork( n+1 ), iwork, info )
1087 IF( iinfo.NE.0 )
THEN
1088 WRITE( nounit, fmt = 9999 )
'DSPGVX(V,I' // uplo //
1089 $
')', iinfo, n, jtype, ioldsd
1091 IF( iinfo.LT.0 )
THEN
1094 result( ntest ) = ulpinv
1101 CALL dsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1102 $ ldz, d, work, result( ntest ) )
1106 IF( ibtype.EQ.1 )
THEN
1114 IF( lsame( uplo,
'U' ) )
THEN
1116 DO 320 i = max( 1, j-ka ), j
1117 ab( ka+1+i-j, j ) = a( i, j )
1119 DO 330 i = max( 1, j-kb ), j
1120 bb( kb+1+i-j, j ) = b( i, j )
1125 DO 350 i = j, min( n, j+ka )
1126 ab( 1+i-j, j ) = a( i, j )
1128 DO 360 i = j, min( n, j+kb )
1129 bb( 1+i-j, j ) = b( i, j )
1134 CALL dsbgv(
'V', uplo, n, ka, kb, ab, lda, bb, ldb,
1135 $ d, z, ldz, work, iinfo )
1136 IF( iinfo.NE.0 )
THEN
1137 WRITE( nounit, fmt = 9999 )
'DSBGV(V,' //
1138 $ uplo //
')', iinfo, n, jtype, ioldsd
1140 IF( iinfo.LT.0 )
THEN
1143 result( ntest ) = ulpinv
1150 CALL dsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1151 $ ldz, d, work, result( ntest ) )
1159 IF( lsame( uplo,
'U' ) )
THEN
1161 DO 380 i = max( 1, j-ka ), j
1162 ab( ka+1+i-j, j ) = a( i, j )
1164 DO 390 i = max( 1, j-kb ), j
1165 bb( kb+1+i-j, j ) = b( i, j )
1170 DO 410 i = j, min( n, j+ka )
1171 ab( 1+i-j, j ) = a( i, j )
1173 DO 420 i = j, min( n, j+kb )
1174 bb( 1+i-j, j ) = b( i, j )
1179 CALL dsbgvd(
'V', uplo, n, ka, kb, ab, lda, bb,
1180 $ ldb, d, z, ldz, work, nwork, iwork,
1182 IF( iinfo.NE.0 )
THEN
1183 WRITE( nounit, fmt = 9999 )
'DSBGVD(V,' //
1184 $ uplo //
')', iinfo, n, jtype, ioldsd
1186 IF( iinfo.LT.0 )
THEN
1189 result( ntest ) = ulpinv
1196 CALL dsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1197 $ ldz, d, work, result( ntest ) )
1205 IF( lsame( uplo,
'U' ) )
THEN
1207 DO 440 i = max( 1, j-ka ), j
1208 ab( ka+1+i-j, j ) = a( i, j )
1210 DO 450 i = max( 1, j-kb ), j
1211 bb( kb+1+i-j, j ) = b( i, j )
1216 DO 470 i = j, min( n, j+ka )
1217 ab( 1+i-j, j ) = a( i, j )
1219 DO 480 i = j, min( n, j+kb )
1220 bb( 1+i-j, j ) = b( i, j )
1225 CALL dsbgvx(
'V',
'A', uplo, n, ka, kb, ab, lda,
1226 $ bb, ldb, bp, max( 1, n ), vl, vu, il,
1227 $ iu, abstol, m, d, z, ldz, work,
1228 $ iwork( n+1 ), iwork, iinfo )
1229 IF( iinfo.NE.0 )
THEN
1230 WRITE( nounit, fmt = 9999 )
'DSBGVX(V,A' //
1231 $ uplo //
')', iinfo, n, jtype, ioldsd
1233 IF( iinfo.LT.0 )
THEN
1236 result( ntest ) = ulpinv
1243 CALL dsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1244 $ ldz, d, work, result( ntest ) )
1251 IF( lsame( uplo,
'U' ) )
THEN
1253 DO 500 i = max( 1, j-ka ), j
1254 ab( ka+1+i-j, j ) = a( i, j )
1256 DO 510 i = max( 1, j-kb ), j
1257 bb( kb+1+i-j, j ) = b( i, j )
1262 DO 530 i = j, min( n, j+ka )
1263 ab( 1+i-j, j ) = a( i, j )
1265 DO 540 i = j, min( n, j+kb )
1266 bb( 1+i-j, j ) = b( i, j )
1273 CALL dsbgvx(
'V',
'V', uplo, n, ka, kb, ab, lda,
1274 $ bb, ldb, bp, max( 1, n ), vl, vu, il,
1275 $ iu, abstol, m, d, z, ldz, work,
1276 $ iwork( n+1 ), iwork, iinfo )
1277 IF( iinfo.NE.0 )
THEN
1278 WRITE( nounit, fmt = 9999 )
'DSBGVX(V,V' //
1279 $ uplo //
')', iinfo, n, jtype, ioldsd
1281 IF( iinfo.LT.0 )
THEN
1284 result( ntest ) = ulpinv
1291 CALL dsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1292 $ ldz, d, work, result( ntest ) )
1298 IF( lsame( uplo,
'U' ) )
THEN
1300 DO 560 i = max( 1, j-ka ), j
1301 ab( ka+1+i-j, j ) = a( i, j )
1303 DO 570 i = max( 1, j-kb ), j
1304 bb( kb+1+i-j, j ) = b( i, j )
1309 DO 590 i = j, min( n, j+ka )
1310 ab( 1+i-j, j ) = a( i, j )
1312 DO 600 i = j, min( n, j+kb )
1313 bb( 1+i-j, j ) = b( i, j )
1318 CALL dsbgvx(
'V',
'I', uplo, n, ka, kb, ab, lda,
1319 $ bb, ldb, bp, max( 1, n ), vl, vu, il,
1320 $ iu, abstol, m, d, z, ldz, work,
1321 $ iwork( n+1 ), iwork, iinfo )
1322 IF( iinfo.NE.0 )
THEN
1323 WRITE( nounit, fmt = 9999 )
'DSBGVX(V,I' //
1324 $ uplo //
')', iinfo, n, jtype, ioldsd
1326 IF( iinfo.LT.0 )
THEN
1329 result( ntest ) = ulpinv
1336 CALL dsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1337 $ ldz, d, work, result( ntest ) )
1346 ntestt = ntestt + ntest
1347 CALL dlafts(
'DSG', n, n, jtype, ntest, result, ioldsd,
1348 $ thresh, nounit, nerrs )
1354 CALL dlasum(
'DSG', nounit, nerrs, ntestt )
1360 9999
FORMAT(
' DDRVSG2STG: ', a,
' returned INFO=', i6,
'.', / 9x,
1361 $
'N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )