374 SUBROUTINE zdrvsg2stg( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
375 $ NOUNIT, A, LDA, B, LDB, D, D2, Z, LDZ, AB,
376 $ BB, AP, BP, WORK, NWORK, RWORK, LRWORK,
377 $ IWORK, LIWORK, RESULT, INFO )
387 INTEGER INFO, LDA, LDB, LDZ, LIWORK, LRWORK, NOUNIT,
388 $ NSIZES, NTYPES, NWORK
389 DOUBLE PRECISION THRESH
393 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
394 DOUBLE PRECISION D( * ), D2( * ), RESULT( * ), RWORK( * )
395 COMPLEX*16 A( LDA, * ), AB( LDA, * ), AP( * ),
396 $ b( ldb, * ), bb( ldb, * ), bp( * ), work( * ),
403 DOUBLE PRECISION ZERO, ONE, TEN
404 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0, ten = 10.0d+0 )
405 COMPLEX*16 CZERO, CONE
406 parameter( czero = ( 0.0d+0, 0.0d+0 ),
407 $ cone = ( 1.0d+0, 0.0d+0 ) )
409 parameter( maxtyp = 21 )
414 INTEGER I, IBTYPE, IBUPLO, IINFO, IJ, IL, IMODE, ITEMP,
415 $ itype, iu, j, jcol, jsize, jtype, ka, ka9, kb,
416 $ kb9, m, mtypes, n, nerrs, nmats, nmax, ntest,
418 DOUBLE PRECISION ABSTOL, ANINV, ANORM, COND, OVFL, RTOVFL,
419 $ RTUNFL, ULP, ULPINV, UNFL, VL, VU, TEMP1, TEMP2
422 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISEED2( 4 ),
423 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
428 DOUBLE PRECISION DLAMCH, DLARND
429 EXTERNAL LSAME, DLAMCH, DLARND
438 INTRINSIC abs, dble, max, min, sqrt
441 DATA ktype / 1, 2, 5*4, 5*5, 3*8, 6*9 /
442 DATA kmagn / 2*1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
444 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
457 nmax = max( nmax, nn( j ) )
464 IF( nsizes.LT.0 )
THEN
466 ELSE IF( badnn )
THEN
468 ELSE IF( ntypes.LT.0 )
THEN
470 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
472 ELSE IF( ldz.LE.1 .OR. ldz.LT.nmax )
THEN
474 ELSE IF( 2*max( nmax, 2 )**2.GT.nwork )
THEN
476 ELSE IF( 2*max( nmax, 2 )**2.GT.lrwork )
THEN
478 ELSE IF( 2*max( nmax, 2 )**2.GT.liwork )
THEN
483 CALL xerbla(
'ZDRVSG2STG', -info )
489 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
494 unfl = dlamch(
'Safe minimum' )
495 ovfl = dlamch(
'Overflow' )
497 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
499 rtunfl = sqrt( unfl )
500 rtovfl = sqrt( ovfl )
503 iseed2( i ) = iseed( i )
511 DO 650 jsize = 1, nsizes
513 aninv = one / dble( max( 1, n ) )
515 IF( nsizes.NE.1 )
THEN
516 mtypes = min( maxtyp, ntypes )
518 mtypes = min( maxtyp+1, ntypes )
523 DO 640 jtype = 1, mtypes
524 IF( .NOT.dotype( jtype ) )
530 ioldsd( j ) = iseed( j )
548 IF( mtypes.GT.maxtyp )
551 itype = ktype( jtype )
552 imode = kmode( jtype )
556 GO TO ( 40, 50, 60 )kmagn( jtype )
563 anorm = ( rtovfl*ulp )*aninv
567 anorm = rtunfl*n*ulpinv
577 IF( itype.EQ.1 )
THEN
583 CALL zlaset(
'Full', lda, n, czero, czero, a, lda )
585 ELSE IF( itype.EQ.2 )
THEN
591 CALL zlaset(
'Full', lda, n, czero, czero, a, lda )
593 a( jcol, jcol ) = anorm
596 ELSE IF( itype.EQ.4 )
THEN
602 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
603 $ anorm, 0, 0,
'N', a, lda, work, iinfo )
605 ELSE IF( itype.EQ.5 )
THEN
611 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
612 $ anorm, n, n,
'N', a, lda, work, iinfo )
614 ELSE IF( itype.EQ.7 )
THEN
620 CALL zlatmr( n, n,
'S', iseed,
'H', work, 6, one, cone,
621 $
'T',
'N', work( n+1 ), 1, one,
622 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
623 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
625 ELSE IF( itype.EQ.8 )
THEN
631 CALL zlatmr( n, n,
'S', iseed,
'H', work, 6, one, cone,
632 $
'T',
'N', work( n+1 ), 1, one,
633 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
634 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
636 ELSE IF( itype.EQ.9 )
THEN
650 IF( kb9.GT.ka9 )
THEN
654 ka = max( 0, min( n-1, ka9 ) )
655 kb = max( 0, min( n-1, kb9 ) )
656 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
657 $ anorm, ka, ka,
'N', a, lda, work, iinfo )
664 IF( iinfo.NE.0 )
THEN
665 WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n, jtype,
678 il = 1 + int( ( n-1 )*dlarnd( 1, iseed2 ) )
679 iu = 1 + int( ( n-1 )*dlarnd( 1, iseed2 ) )
708 CALL zlatms( n, n,
'U', iseed,
'P', rwork, 5, ten,
709 $ one, kb, kb, uplo, b, ldb, work( n+1 ),
716 CALL zlacpy(
' ', n, n, a, lda, z, ldz )
717 CALL zlacpy( uplo, n, n, b, ldb, bb, ldb )
719 CALL zhegv( ibtype,
'V', uplo, n, z, ldz, bb, ldb, d,
720 $ work, nwork, rwork, iinfo )
721 IF( iinfo.NE.0 )
THEN
722 WRITE( nounit, fmt = 9999 )
'ZHEGV(V,' // uplo //
723 $
')', iinfo, n, jtype, ioldsd
725 IF( iinfo.LT.0 )
THEN
728 result( ntest ) = ulpinv
735 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
736 $ ldz, d, work, rwork, result( ntest ) )
742 CALL zlacpy(
' ', n, n, a, lda, z, ldz )
743 CALL zlacpy( uplo, n, n, b, ldb, bb, ldb )
746 $ bb, ldb, d2, work, nwork, rwork,
748 IF( iinfo.NE.0 )
THEN
749 WRITE( nounit, fmt = 9999 )
750 $
'ZHEGV_2STAGE(V,' // uplo //
751 $
')', iinfo, n, jtype, ioldsd
753 IF( iinfo.LT.0 )
THEN
756 result( ntest ) = ulpinv
773 temp1 = max( temp1, abs( d( j ) ),
775 temp2 = max( temp2, abs( d( j )-d2( j ) ) )
778 result( ntest ) = temp2 /
779 $ max( unfl, ulp*max( temp1, temp2 ) )
785 CALL zlacpy(
' ', n, n, a, lda, z, ldz )
786 CALL zlacpy( uplo, n, n, b, ldb, bb, ldb )
788 CALL zhegvd( ibtype,
'V', uplo, n, z, ldz, bb, ldb, d,
789 $ work, nwork, rwork, lrwork, iwork,
791 IF( iinfo.NE.0 )
THEN
792 WRITE( nounit, fmt = 9999 )
'ZHEGVD(V,' // uplo //
793 $
')', iinfo, n, jtype, ioldsd
795 IF( iinfo.LT.0 )
THEN
798 result( ntest ) = ulpinv
805 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
806 $ ldz, d, work, rwork, result( ntest ) )
812 CALL zlacpy(
' ', n, n, a, lda, ab, lda )
813 CALL zlacpy( uplo, n, n, b, ldb, bb, ldb )
815 CALL zhegvx( ibtype,
'V',
'A', uplo, n, ab, lda, bb,
816 $ ldb, vl, vu, il, iu, abstol, m, d, z,
817 $ ldz, work, nwork, rwork, iwork( n+1 ),
819 IF( iinfo.NE.0 )
THEN
820 WRITE( nounit, fmt = 9999 )
'ZHEGVX(V,A' // uplo //
821 $
')', iinfo, n, jtype, ioldsd
823 IF( iinfo.LT.0 )
THEN
826 result( ntest ) = ulpinv
833 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
834 $ ldz, d, work, rwork, result( ntest ) )
838 CALL zlacpy(
' ', n, n, a, lda, ab, lda )
839 CALL zlacpy( uplo, n, n, b, ldb, bb, ldb )
848 CALL zhegvx( ibtype,
'V',
'V', uplo, n, ab, lda, bb,
849 $ ldb, vl, vu, il, iu, abstol, m, d, z,
850 $ ldz, work, nwork, rwork, iwork( n+1 ),
852 IF( iinfo.NE.0 )
THEN
853 WRITE( nounit, fmt = 9999 )
'ZHEGVX(V,V,' //
854 $ uplo //
')', iinfo, n, jtype, ioldsd
856 IF( iinfo.LT.0 )
THEN
859 result( ntest ) = ulpinv
866 CALL zsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
867 $ ldz, d, work, rwork, result( ntest ) )
871 CALL zlacpy(
' ', n, n, a, lda, ab, lda )
872 CALL zlacpy( uplo, n, n, b, ldb, bb, ldb )
874 CALL zhegvx( ibtype,
'V',
'I', uplo, n, ab, lda, bb,
875 $ ldb, vl, vu, il, iu, abstol, m, d, z,
876 $ ldz, work, nwork, rwork, iwork( n+1 ),
878 IF( iinfo.NE.0 )
THEN
879 WRITE( nounit, fmt = 9999 )
'ZHEGVX(V,I,' //
880 $ uplo //
')', iinfo, n, jtype, ioldsd
882 IF( iinfo.LT.0 )
THEN
885 result( ntest ) = ulpinv
892 CALL zsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
893 $ ldz, d, work, rwork, result( ntest ) )
903 IF( lsame( uplo,
'U' ) )
THEN
923 CALL zhpgv( ibtype,
'V', uplo, n, ap, bp, d, z, ldz,
924 $ work, rwork, iinfo )
925 IF( iinfo.NE.0 )
THEN
926 WRITE( nounit, fmt = 9999 )
'ZHPGV(V,' // uplo //
927 $
')', iinfo, n, jtype, ioldsd
929 IF( iinfo.LT.0 )
THEN
932 result( ntest ) = ulpinv
939 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
940 $ ldz, d, work, rwork, result( ntest ) )
948 IF( lsame( uplo,
'U' ) )
THEN
968 CALL zhpgvd( ibtype,
'V', uplo, n, ap, bp, d, z, ldz,
969 $ work, nwork, rwork, lrwork, iwork,
971 IF( iinfo.NE.0 )
THEN
972 WRITE( nounit, fmt = 9999 )
'ZHPGVD(V,' // uplo //
973 $
')', iinfo, n, jtype, ioldsd
975 IF( iinfo.LT.0 )
THEN
978 result( ntest ) = ulpinv
985 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
986 $ ldz, d, work, rwork, result( ntest ) )
994 IF( lsame( uplo,
'U' ) )
THEN
1007 ap( ij ) = a( i, j )
1008 bp( ij ) = b( i, j )
1014 CALL zhpgvx( ibtype,
'V',
'A', uplo, n, ap, bp, vl,
1015 $ vu, il, iu, abstol, m, d, z, ldz, work,
1016 $ rwork, iwork( n+1 ), iwork, info )
1017 IF( iinfo.NE.0 )
THEN
1018 WRITE( nounit, fmt = 9999 )
'ZHPGVX(V,A' // uplo //
1019 $
')', iinfo, n, jtype, ioldsd
1021 IF( iinfo.LT.0 )
THEN
1024 result( ntest ) = ulpinv
1031 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1032 $ ldz, d, work, rwork, result( ntest ) )
1038 IF( lsame( uplo,
'U' ) )
THEN
1042 ap( ij ) = a( i, j )
1043 bp( ij ) = b( i, j )
1051 ap( ij ) = a( i, j )
1052 bp( ij ) = b( i, j )
1060 CALL zhpgvx( ibtype,
'V',
'V', uplo, n, ap, bp, vl,
1061 $ vu, il, iu, abstol, m, d, z, ldz, work,
1062 $ rwork, iwork( n+1 ), iwork, info )
1063 IF( iinfo.NE.0 )
THEN
1064 WRITE( nounit, fmt = 9999 )
'ZHPGVX(V,V' // uplo //
1065 $
')', iinfo, n, jtype, ioldsd
1067 IF( iinfo.LT.0 )
THEN
1070 result( ntest ) = ulpinv
1077 CALL zsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1078 $ ldz, d, work, rwork, result( ntest ) )
1084 IF( lsame( uplo,
'U' ) )
THEN
1088 ap( ij ) = a( i, j )
1089 bp( ij ) = b( i, j )
1097 ap( ij ) = a( i, j )
1098 bp( ij ) = b( i, j )
1104 CALL zhpgvx( ibtype,
'V',
'I', uplo, n, ap, bp, vl,
1105 $ vu, il, iu, abstol, m, d, z, ldz, work,
1106 $ rwork, iwork( n+1 ), iwork, info )
1107 IF( iinfo.NE.0 )
THEN
1108 WRITE( nounit, fmt = 9999 )
'ZHPGVX(V,I' // uplo //
1109 $
')', iinfo, n, jtype, ioldsd
1111 IF( iinfo.LT.0 )
THEN
1114 result( ntest ) = ulpinv
1121 CALL zsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1122 $ ldz, d, work, rwork, result( ntest ) )
1126 IF( ibtype.EQ.1 )
THEN
1134 IF( lsame( uplo,
'U' ) )
THEN
1136 DO 320 i = max( 1, j-ka ), j
1137 ab( ka+1+i-j, j ) = a( i, j )
1139 DO 330 i = max( 1, j-kb ), j
1140 bb( kb+1+i-j, j ) = b( i, j )
1145 DO 350 i = j, min( n, j+ka )
1146 ab( 1+i-j, j ) = a( i, j )
1148 DO 360 i = j, min( n, j+kb )
1149 bb( 1+i-j, j ) = b( i, j )
1154 CALL zhbgv(
'V', uplo, n, ka, kb, ab, lda, bb, ldb,
1155 $ d, z, ldz, work, rwork, iinfo )
1156 IF( iinfo.NE.0 )
THEN
1157 WRITE( nounit, fmt = 9999 )
'ZHBGV(V,' //
1158 $ uplo //
')', iinfo, n, jtype, ioldsd
1160 IF( iinfo.LT.0 )
THEN
1163 result( ntest ) = ulpinv
1170 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1171 $ ldz, d, work, rwork, result( ntest ) )
1179 IF( lsame( uplo,
'U' ) )
THEN
1181 DO 380 i = max( 1, j-ka ), j
1182 ab( ka+1+i-j, j ) = a( i, j )
1184 DO 390 i = max( 1, j-kb ), j
1185 bb( kb+1+i-j, j ) = b( i, j )
1190 DO 410 i = j, min( n, j+ka )
1191 ab( 1+i-j, j ) = a( i, j )
1193 DO 420 i = j, min( n, j+kb )
1194 bb( 1+i-j, j ) = b( i, j )
1199 CALL zhbgvd(
'V', uplo, n, ka, kb, ab, lda, bb,
1200 $ ldb, d, z, ldz, work, nwork, rwork,
1201 $ lrwork, iwork, liwork, iinfo )
1202 IF( iinfo.NE.0 )
THEN
1203 WRITE( nounit, fmt = 9999 )
'ZHBGVD(V,' //
1204 $ uplo //
')', iinfo, n, jtype, ioldsd
1206 IF( iinfo.LT.0 )
THEN
1209 result( ntest ) = ulpinv
1216 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1217 $ ldz, d, work, rwork, result( ntest ) )
1225 IF( lsame( uplo,
'U' ) )
THEN
1227 DO 440 i = max( 1, j-ka ), j
1228 ab( ka+1+i-j, j ) = a( i, j )
1230 DO 450 i = max( 1, j-kb ), j
1231 bb( kb+1+i-j, j ) = b( i, j )
1236 DO 470 i = j, min( n, j+ka )
1237 ab( 1+i-j, j ) = a( i, j )
1239 DO 480 i = j, min( n, j+kb )
1240 bb( 1+i-j, j ) = b( i, j )
1245 CALL zhbgvx(
'V',
'A', uplo, n, ka, kb, ab, lda,
1246 $ bb, ldb, bp, max( 1, n ), vl, vu, il,
1247 $ iu, abstol, m, d, z, ldz, work, rwork,
1248 $ iwork( n+1 ), iwork, iinfo )
1249 IF( iinfo.NE.0 )
THEN
1250 WRITE( nounit, fmt = 9999 )
'ZHBGVX(V,A' //
1251 $ uplo //
')', iinfo, n, jtype, ioldsd
1253 IF( iinfo.LT.0 )
THEN
1256 result( ntest ) = ulpinv
1263 CALL zsgt01( ibtype, uplo, n, n, a, lda, b, ldb, z,
1264 $ ldz, d, work, rwork, result( ntest ) )
1270 IF( lsame( uplo,
'U' ) )
THEN
1272 DO 500 i = max( 1, j-ka ), j
1273 ab( ka+1+i-j, j ) = a( i, j )
1275 DO 510 i = max( 1, j-kb ), j
1276 bb( kb+1+i-j, j ) = b( i, j )
1281 DO 530 i = j, min( n, j+ka )
1282 ab( 1+i-j, j ) = a( i, j )
1284 DO 540 i = j, min( n, j+kb )
1285 bb( 1+i-j, j ) = b( i, j )
1292 CALL zhbgvx(
'V',
'V', uplo, n, ka, kb, ab, lda,
1293 $ bb, ldb, bp, max( 1, n ), vl, vu, il,
1294 $ iu, abstol, m, d, z, ldz, work, rwork,
1295 $ iwork( n+1 ), iwork, iinfo )
1296 IF( iinfo.NE.0 )
THEN
1297 WRITE( nounit, fmt = 9999 )
'ZHBGVX(V,V' //
1298 $ uplo //
')', iinfo, n, jtype, ioldsd
1300 IF( iinfo.LT.0 )
THEN
1303 result( ntest ) = ulpinv
1310 CALL zsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1311 $ ldz, d, work, rwork, result( ntest ) )
1317 IF( lsame( uplo,
'U' ) )
THEN
1319 DO 560 i = max( 1, j-ka ), j
1320 ab( ka+1+i-j, j ) = a( i, j )
1322 DO 570 i = max( 1, j-kb ), j
1323 bb( kb+1+i-j, j ) = b( i, j )
1328 DO 590 i = j, min( n, j+ka )
1329 ab( 1+i-j, j ) = a( i, j )
1331 DO 600 i = j, min( n, j+kb )
1332 bb( 1+i-j, j ) = b( i, j )
1337 CALL zhbgvx(
'V',
'I', uplo, n, ka, kb, ab, lda,
1338 $ bb, ldb, bp, max( 1, n ), vl, vu, il,
1339 $ iu, abstol, m, d, z, ldz, work, rwork,
1340 $ iwork( n+1 ), iwork, iinfo )
1341 IF( iinfo.NE.0 )
THEN
1342 WRITE( nounit, fmt = 9999 )
'ZHBGVX(V,I' //
1343 $ uplo //
')', iinfo, n, jtype, ioldsd
1345 IF( iinfo.LT.0 )
THEN
1348 result( ntest ) = ulpinv
1355 CALL zsgt01( ibtype, uplo, n, m, a, lda, b, ldb, z,
1356 $ ldz, d, work, rwork, result( ntest ) )
1365 ntestt = ntestt + ntest
1366 CALL dlafts(
'ZSG', n, n, jtype, ntest, result, ioldsd,
1367 $ thresh, nounit, nerrs )
1373 CALL dlasum(
'ZSG', nounit, nerrs, ntestt )
1377 9999
FORMAT(
' ZDRVSG2STG: ', a,
' returned INFO=', i6,
'.', / 9x,
1378 $
'N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )