399 SUBROUTINE zdrvbd( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
400 $ A, LDA, U, LDU, VT, LDVT, ASAV, USAV, VTSAV, S,
401 $ SSAV, E, WORK, LWORK, RWORK, IWORK, NOUNIT,
412 INTEGER INFO, LDA, LDU, LDVT, LWORK, NOUNIT, NSIZES,
414 DOUBLE PRECISION THRESH
418 INTEGER ISEED( 4 ), IWORK( * ), MM( * ), NN( * )
419 DOUBLE PRECISION E( * ), RWORK( * ), S( * ), SSAV( * )
420 COMPLEX*16 A( LDA, * ), ASAV( LDA, * ), U( LDU, * ),
421 $ usav( ldu, * ), vt( ldvt, * ),
422 $ vtsav( ldvt, * ), work( * )
428 DOUBLE PRECISION ZERO, ONE, TWO, HALF
429 PARAMETER ( ZERO = 0.0d0, one = 1.0d0, two = 2.0d0,
431 COMPLEX*16 CZERO, CONE
432 parameter( czero = ( 0.0d+0, 0.0d+0 ),
433 $ cone = ( 1.0d+0, 0.0d+0 ) )
435 parameter( maxtyp = 5 )
439 CHARACTER JOBQ, JOBU, JOBVT, RANGE
440 INTEGER I, IINFO, IJQ, IJU, IJVT, IL, IU, ITEMP,
441 $ iwspc, iwtmp, j, jsize, jtype, lswork, m,
442 $ minwrk, mmax, mnmax, mnmin, mtypes, n,
443 $ nerrs, nfail, nmax, ns, nsi, nsv, ntest,
444 $ ntestf, ntestt, lrwork
445 DOUBLE PRECISION ANORM, DIF, DIV, OVFL, RTUNFL, ULP, ULPINV,
449 INTEGER LIWORK, NUMRANK
452 CHARACTER CJOB( 4 ), CJOBR( 3 ), CJOBV( 2 )
453 INTEGER IOLDSD( 4 ), ISEED2( 4 )
454 DOUBLE PRECISION RESULT( 39 )
457 DOUBLE PRECISION DLAMCH, DLARND
458 EXTERNAL DLAMCH, DLARND
466 INTRINSIC abs, dble, max, min
472 COMMON / srnamc / srnamt
475 DATA cjob /
'N',
'O',
'S',
'A' /
476 DATA cjobr /
'A',
'V',
'I' /
477 DATA cjobv /
'N',
'V' /
497 mmax = max( mmax, mm( j ) )
500 nmax = max( nmax, nn( j ) )
503 mnmax = max( mnmax, min( mm( j ), nn( j ) ) )
504 minwrk = max( minwrk, max( 3*min( mm( j ),
505 $ nn( j ) )+max( mm( j ), nn( j ) )**2, 5*min( mm( j ),
506 $ nn( j ) ), 3*max( mm( j ), nn( j ) ) ) )
511 IF( nsizes.LT.0 )
THEN
513 ELSE IF( badmm )
THEN
515 ELSE IF( badnn )
THEN
517 ELSE IF( ntypes.LT.0 )
THEN
519 ELSE IF( lda.LT.max( 1, mmax ) )
THEN
521 ELSE IF( ldu.LT.max( 1, mmax ) )
THEN
523 ELSE IF( ldvt.LT.max( 1, nmax ) )
THEN
525 ELSE IF( minwrk.GT.lwork )
THEN
530 CALL xerbla(
'ZDRVBD', -info )
536 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
545 rtunfl = sqrt( unfl )
551 DO 230 jsize = 1, nsizes
556 IF( nsizes.NE.1 )
THEN
557 mtypes = min( maxtyp, ntypes )
559 mtypes = min( maxtyp+1, ntypes )
562 DO 220 jtype = 1, mtypes
563 IF( .NOT.dotype( jtype ) )
568 ioldsd( j ) = iseed( j )
573 IF( mtypes.GT.maxtyp )
576 IF( jtype.EQ.1 )
THEN
580 CALL zlaset(
'Full', m, n, czero, czero, a, lda )
581 DO 30 i = 1, min( m, n )
585 ELSE IF( jtype.EQ.2 )
THEN
589 CALL zlaset(
'Full', m, n, czero, cone, a, lda )
590 DO 40 i = 1, min( m, n )
604 CALL zlatms( m, n,
'U', iseed,
'N', s, 4, dble( mnmin ),
605 $ anorm, m-1, n-1,
'N', a, lda, work, iinfo )
606 IF( iinfo.NE.0 )
THEN
607 WRITE( nounit, fmt = 9996 )
'Generator', iinfo, m, n,
615 CALL zlacpy(
'F', m, n, a, lda, asav, lda )
623 iwtmp = 2*min( m, n )+max( m, n )
624 lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
625 lswork = min( lswork, lwork )
626 lswork = max( lswork, 1 )
637 $
CALL zlacpy(
'F', m, n, asav, lda, a, lda )
639 CALL zgesvd(
'A',
'A', m, n, a, lda, ssav, usav, ldu,
640 $ vtsav, ldvt, work, lswork, rwork, iinfo )
641 IF( iinfo.NE.0 )
THEN
642 WRITE( nounit, fmt = 9995 )
'GESVD', iinfo, m, n,
643 $ jtype, lswork, ioldsd
650 CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
651 $ vtsav, ldvt, work, rwork, result( 1 ) )
652 IF( m.NE.0 .AND. n.NE.0 )
THEN
653 CALL zunt01(
'Columns', mnmin, m, usav, ldu, work,
654 $ lwork, rwork, result( 2 ) )
655 CALL zunt01(
'Rows', mnmin, n, vtsav, ldvt, work,
656 $ lwork, rwork, result( 3 ) )
659 DO 70 i = 1, mnmin - 1
660 IF( ssav( i ).LT.ssav( i+1 ) )
661 $ result( 4 ) = ulpinv
662 IF( ssav( i ).LT.zero )
663 $ result( 4 ) = ulpinv
665 IF( mnmin.GE.1 )
THEN
666 IF( ssav( mnmin ).LT.zero )
667 $ result( 4 ) = ulpinv
677 IF( ( iju.EQ.3 .AND. ijvt.EQ.3 ) .OR.
678 $ ( iju.EQ.1 .AND. ijvt.EQ.1 ) )
GO TO 90
680 jobvt = cjob( ijvt+1 )
681 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
683 CALL zgesvd( jobu, jobvt, m, n, a, lda, s, u, ldu,
684 $ vt, ldvt, work, lswork, rwork, iinfo )
689 IF( m.GT.0 .AND. n.GT.0 )
THEN
691 CALL zunt03(
'C', m, mnmin, m, mnmin, usav,
692 $ ldu, a, lda, work, lwork, rwork,
694 ELSE IF( iju.EQ.2 )
THEN
695 CALL zunt03(
'C', m, mnmin, m, mnmin, usav,
696 $ ldu, u, ldu, work, lwork, rwork,
698 ELSE IF( iju.EQ.3 )
THEN
699 CALL zunt03(
'C', m, m, m, mnmin, usav, ldu,
700 $ u, ldu, work, lwork, rwork, dif,
704 result( 5 ) = max( result( 5 ), dif )
709 IF( m.GT.0 .AND. n.GT.0 )
THEN
711 CALL zunt03(
'R', n, mnmin, n, mnmin, vtsav,
712 $ ldvt, a, lda, work, lwork,
713 $ rwork, dif, iinfo )
714 ELSE IF( ijvt.EQ.2 )
THEN
715 CALL zunt03(
'R', n, mnmin, n, mnmin, vtsav,
716 $ ldvt, vt, ldvt, work, lwork,
717 $ rwork, dif, iinfo )
718 ELSE IF( ijvt.EQ.3 )
THEN
719 CALL zunt03(
'R', n, n, n, mnmin, vtsav,
720 $ ldvt, vt, ldvt, work, lwork,
721 $ rwork, dif, iinfo )
724 result( 6 ) = max( result( 6 ), dif )
729 div = max( dble( mnmin )*ulp*s( 1 ),
730 $ dlamch(
'Safe minimum' ) )
731 DO 80 i = 1, mnmin - 1
732 IF( ssav( i ).LT.ssav( i+1 ) )
734 IF( ssav( i ).LT.zero )
736 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
738 result( 7 ) = max( result( 7 ), dif )
744 iwtmp = 2*mnmin*mnmin + 2*mnmin + max( m, n )
745 lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
746 lswork = min( lswork, lwork )
747 lswork = max( lswork, 1 )
753 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
755 CALL zgesdd(
'A', m, n, a, lda, ssav, usav, ldu, vtsav,
756 $ ldvt, work, lswork, rwork, iwork, iinfo )
757 IF( iinfo.NE.0 )
THEN
758 WRITE( nounit, fmt = 9995 )
'GESDD', iinfo, m, n,
759 $ jtype, lswork, ioldsd
766 CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
767 $ vtsav, ldvt, work, rwork, result( 8 ) )
768 IF( m.NE.0 .AND. n.NE.0 )
THEN
769 CALL zunt01(
'Columns', mnmin, m, usav, ldu, work,
770 $ lwork, rwork, result( 9 ) )
771 CALL zunt01(
'Rows', mnmin, n, vtsav, ldvt, work,
772 $ lwork, rwork, result( 10 ) )
775 DO 110 i = 1, mnmin - 1
776 IF( ssav( i ).LT.ssav( i+1 ) )
777 $ result( 11 ) = ulpinv
778 IF( ssav( i ).LT.zero )
779 $ result( 11 ) = ulpinv
781 IF( mnmin.GE.1 )
THEN
782 IF( ssav( mnmin ).LT.zero )
783 $ result( 11 ) = ulpinv
793 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
795 CALL zgesdd( jobq, m, n, a, lda, s, u, ldu, vt, ldvt,
796 $ work, lswork, rwork, iwork, iinfo )
801 IF( m.GT.0 .AND. n.GT.0 )
THEN
804 CALL zunt03(
'C', m, mnmin, m, mnmin, usav,
805 $ ldu, a, lda, work, lwork, rwork,
808 CALL zunt03(
'C', m, mnmin, m, mnmin, usav,
809 $ ldu, u, ldu, work, lwork, rwork,
812 ELSE IF( ijq.EQ.2 )
THEN
813 CALL zunt03(
'C', m, mnmin, m, mnmin, usav, ldu,
814 $ u, ldu, work, lwork, rwork, dif,
818 result( 12 ) = max( result( 12 ), dif )
823 IF( m.GT.0 .AND. n.GT.0 )
THEN
826 CALL zunt03(
'R', n, mnmin, n, mnmin, vtsav,
827 $ ldvt, vt, ldvt, work, lwork,
828 $ rwork, dif, iinfo )
830 CALL zunt03(
'R', n, mnmin, n, mnmin, vtsav,
831 $ ldvt, a, lda, work, lwork,
832 $ rwork, dif, iinfo )
834 ELSE IF( ijq.EQ.2 )
THEN
835 CALL zunt03(
'R', n, mnmin, n, mnmin, vtsav,
836 $ ldvt, vt, ldvt, work, lwork, rwork,
840 result( 13 ) = max( result( 13 ), dif )
845 div = max( dble( mnmin )*ulp*s( 1 ),
846 $ dlamch(
'Safe minimum' ) )
847 DO 120 i = 1, mnmin - 1
848 IF( ssav( i ).LT.ssav( i+1 ) )
850 IF( ssav( i ).LT.zero )
852 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
854 result( 14 ) = max( result( 14 ), dif )
866 iwtmp = 2*mnmin*mnmin + 2*mnmin + max( m, n )
867 lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
868 lswork = min( lswork, lwork )
869 lswork = max( lswork, 1 )
873 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
876 lrwork = max(2, m, 5*n)
878 CALL zgesvdq(
'H',
'N',
'N',
'A',
'A',
879 $ m, n, a, lda, ssav, usav, ldu,
880 $ vtsav, ldvt, numrank, iwork, liwork,
881 $ work, lwork, rwork, lrwork, iinfo )
883 IF( iinfo.NE.0 )
THEN
884 WRITE( nounit, fmt = 9995 )
'ZGESVDQ', iinfo, m, n,
885 $ jtype, lswork, ioldsd
892 CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
893 $ vtsav, ldvt, work, rwork, result( 36 ) )
894 IF( m.NE.0 .AND. n.NE.0 )
THEN
895 CALL zunt01(
'Columns', m, m, usav, ldu, work,
896 $ lwork, rwork, result( 37 ) )
897 CALL zunt01(
'Rows', n, n, vtsav, ldvt, work,
898 $ lwork, rwork, result( 38 ) )
901 DO 199 i = 1, mnmin - 1
902 IF( ssav( i ).LT.ssav( i+1 ) )
903 $ result( 39 ) = ulpinv
904 IF( ssav( i ).LT.zero )
905 $ result( 39 ) = ulpinv
907 IF( mnmin.GE.1 )
THEN
908 IF( ssav( mnmin ).LT.zero )
909 $ result( 39 ) = ulpinv
922 iwtmp = 2*mnmin*mnmin + 2*mnmin + max( m, n )
923 lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
924 lswork = min( lswork, lwork )
925 lswork = max( lswork, 1 )
930 CALL zlacpy(
'F', m, n, asav, lda, usav, lda )
932 CALL zgesvj(
'G',
'U',
'V', m, n, usav, lda, ssav,
933 & 0, a, ldvt, work, lwork, rwork,
940 vtsav(j,i) = conjg(a(i,j))
944 IF( iinfo.NE.0 )
THEN
945 WRITE( nounit, fmt = 9995 )
'GESVJ', iinfo, m, n,
946 $ jtype, lswork, ioldsd
953 CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
954 $ vtsav, ldvt, work, rwork, result( 15 ) )
955 IF( m.NE.0 .AND. n.NE.0 )
THEN
956 CALL zunt01(
'Columns', m, m, usav, ldu, work,
957 $ lwork, rwork, result( 16 ) )
958 CALL zunt01(
'Rows', n, n, vtsav, ldvt, work,
959 $ lwork, rwork, result( 17 ) )
962 DO 131 i = 1, mnmin - 1
963 IF( ssav( i ).LT.ssav( i+1 ) )
964 $ result( 18 ) = ulpinv
965 IF( ssav( i ).LT.zero )
966 $ result( 18 ) = ulpinv
968 IF( mnmin.GE.1 )
THEN
969 IF( ssav( mnmin ).LT.zero )
970 $ result( 18 ) = ulpinv
982 iwtmp = 2*mnmin*mnmin + 2*mnmin + max( m, n )
983 lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
984 lswork = min( lswork, lwork )
985 lswork = max( lswork, 1 )
988 lrwork = max( 7, n + 2*m)
990 CALL zlacpy(
'F', m, n, asav, lda, vtsav, lda )
992 CALL zgejsv(
'G',
'U',
'V',
'R',
'N',
'N',
993 & m, n, vtsav, lda, ssav, usav, ldu, a, ldvt,
994 & work, lwork, rwork,
995 & lrwork, iwork, iinfo )
1001 vtsav(j,i) = conjg(a(i,j))
1005 IF( iinfo.NE.0 )
THEN
1006 WRITE( nounit, fmt = 9995 )
'GEJSV', iinfo, m, n,
1007 $ jtype, lswork, ioldsd
1014 CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
1015 $ vtsav, ldvt, work, rwork, result( 19 ) )
1016 IF( m.NE.0 .AND. n.NE.0 )
THEN
1017 CALL zunt01(
'Columns', m, m, usav, ldu, work,
1018 $ lwork, rwork, result( 20 ) )
1019 CALL zunt01(
'Rows', n, n, vtsav, ldvt, work,
1020 $ lwork, rwork, result( 21 ) )
1023 DO 134 i = 1, mnmin - 1
1024 IF( ssav( i ).LT.ssav( i+1 ) )
1025 $ result( 22 ) = ulpinv
1026 IF( ssav( i ).LT.zero )
1027 $ result( 22 ) = ulpinv
1029 IF( mnmin.GE.1 )
THEN
1030 IF( ssav( mnmin ).LT.zero )
1031 $ result( 22 ) = ulpinv
1039 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
1041 CALL zgesvdx(
'V',
'V',
'A', m, n, a, lda,
1042 $ vl, vu, il, iu, ns, ssav, usav, ldu,
1043 $ vtsav, ldvt, work, lwork, rwork,
1045 IF( iinfo.NE.0 )
THEN
1046 WRITE( nounit, fmt = 9995 )
'GESVDX', iinfo, m, n,
1047 $ jtype, lswork, ioldsd
1057 CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
1058 $ vtsav, ldvt, work, rwork, result( 23 ) )
1059 IF( m.NE.0 .AND. n.NE.0 )
THEN
1060 CALL zunt01(
'Columns', mnmin, m, usav, ldu, work,
1061 $ lwork, rwork, result( 24 ) )
1062 CALL zunt01(
'Rows', mnmin, n, vtsav, ldvt, work,
1063 $ lwork, rwork, result( 25 ) )
1066 DO 140 i = 1, mnmin - 1
1067 IF( ssav( i ).LT.ssav( i+1 ) )
1068 $ result( 26 ) = ulpinv
1069 IF( ssav( i ).LT.zero )
1070 $ result( 26 ) = ulpinv
1072 IF( mnmin.GE.1 )
THEN
1073 IF( ssav( mnmin ).LT.zero )
1074 $ result( 26 ) = ulpinv
1084 IF( ( iju.EQ.0 .AND. ijvt.EQ.0 ) .OR.
1085 $ ( iju.EQ.1 .AND. ijvt.EQ.1 ) )
GO TO 160
1086 jobu = cjobv( iju+1 )
1087 jobvt = cjobv( ijvt+1 )
1089 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
1091 CALL zgesvdx( jobu, jobvt,
'A', m, n, a, lda,
1092 $ vl, vu, il, iu, ns, ssav, u, ldu,
1093 $ vt, ldvt, work, lwork, rwork,
1099 IF( m.GT.0 .AND. n.GT.0 )
THEN
1101 CALL zunt03(
'C', m, mnmin, m, mnmin, usav,
1102 $ ldu, u, ldu, work, lwork, rwork,
1106 result( 27 ) = max( result( 27 ), dif )
1111 IF( m.GT.0 .AND. n.GT.0 )
THEN
1112 IF( ijvt.EQ.1 )
THEN
1113 CALL zunt03(
'R', n, mnmin, n, mnmin, vtsav,
1114 $ ldvt, vt, ldvt, work, lwork,
1115 $ rwork, dif, iinfo )
1118 result( 28 ) = max( result( 28 ), dif )
1123 div = max( dble( mnmin )*ulp*s( 1 ),
1124 $ dlamch(
'Safe minimum' ) )
1125 DO 150 i = 1, mnmin - 1
1126 IF( ssav( i ).LT.ssav( i+1 ) )
1128 IF( ssav( i ).LT.zero )
1130 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
1132 result( 29) = max( result( 29 ), dif )
1139 iseed2( i ) = iseed( i )
1141 IF( mnmin.LE.1 )
THEN
1143 iu = max( 1, mnmin )
1145 il = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1146 iu = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1153 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
1155 CALL zgesvdx(
'V',
'V',
'I', m, n, a, lda,
1156 $ vl, vu, il, iu, nsi, s, u, ldu,
1157 $ vt, ldvt, work, lwork, rwork,
1159 IF( iinfo.NE.0 )
THEN
1160 WRITE( nounit, fmt = 9995 )
'GESVDX', iinfo, m, n,
1161 $ jtype, lswork, ioldsd
1169 CALL zbdt05( m, n, asav, lda, s, nsi, u, ldu,
1170 $ vt, ldvt, work, result( 30 ) )
1171 IF( m.NE.0 .AND. n.NE.0 )
THEN
1172 CALL zunt01(
'Columns', m, nsi, u, ldu, work,
1173 $ lwork, rwork, result( 31 ) )
1174 CALL zunt01(
'Rows', nsi, n, vt, ldvt, work,
1175 $ lwork, rwork, result( 32 ) )
1180 IF( mnmin.GT.0 .AND. nsi.GT.1 )
THEN
1183 $ max( half*abs( ssav( il )-ssav( il-1 ) ),
1184 $ ulp*anorm, two*rtunfl )
1187 $ max( half*abs( ssav( ns )-ssav( 1 ) ),
1188 $ ulp*anorm, two*rtunfl )
1191 vl = ssav( iu ) - max( ulp*anorm, two*rtunfl,
1192 $ half*abs( ssav( iu+1 )-ssav( iu ) ) )
1194 vl = ssav( ns ) - max( ulp*anorm, two*rtunfl,
1195 $ half*abs( ssav( ns )-ssav( 1 ) ) )
1199 IF( vl.GE.vu ) vu = max( vu*2, vu+vl+half )
1204 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
1206 CALL zgesvdx(
'V',
'V',
'V', m, n, a, lda,
1207 $ vl, vu, il, iu, nsv, s, u, ldu,
1208 $ vt, ldvt, work, lwork, rwork,
1210 IF( iinfo.NE.0 )
THEN
1211 WRITE( nounit, fmt = 9995 )
'GESVDX', iinfo, m, n,
1212 $ jtype, lswork, ioldsd
1220 CALL zbdt05( m, n, asav, lda, s, nsv, u, ldu,
1221 $ vt, ldvt, work, result( 33 ) )
1222 IF( m.NE.0 .AND. n.NE.0 )
THEN
1223 CALL zunt01(
'Columns', m, nsv, u, ldu, work,
1224 $ lwork, rwork, result( 34 ) )
1225 CALL zunt01(
'Rows', nsv, n, vt, ldvt, work,
1226 $ lwork, rwork, result( 35 ) )
1234 IF( result( j ).GE.zero )
1236 IF( result( j ).GE.thresh )
1241 $ ntestf = ntestf + 1
1242 IF( ntestf.EQ.1 )
THEN
1243 WRITE( nounit, fmt = 9999 )
1244 WRITE( nounit, fmt = 9998 )thresh
1249 IF( result( j ).GE.thresh )
THEN
1250 WRITE( nounit, fmt = 9997 )m, n, jtype, iwspc,
1251 $ ioldsd, j, result( j )
1255 nerrs = nerrs + nfail
1256 ntestt = ntestt + ntest
1265 CALL alasvm(
'ZBD', nounit, nerrs, ntestt, 0 )
1267 9999
FORMAT(
' SVD -- Complex Singular Value Decomposition Driver ',
1268 $ /
' Matrix types (see ZDRVBD for details):',
1269 $ / /
' 1 = Zero matrix', /
' 2 = Identity matrix',
1270 $ /
' 3 = Evenly spaced singular values near 1',
1271 $ /
' 4 = Evenly spaced singular values near underflow',
1272 $ /
' 5 = Evenly spaced singular values near overflow',
1273 $ / /
' Tests performed: ( A is dense, U and V are unitary,',
1274 $ / 19x,
' S is an array, and Upartial, VTpartial, and',
1275 $ / 19x,
' Spartial are partially computed U, VT and S),', / )
1276 9998
FORMAT(
' Tests performed with Test Threshold = ', f8.2,
1278 $
' 1 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1279 $ /
' 2 = | I - U**T U | / ( M ulp ) ',
1280 $ /
' 3 = | I - VT VT**T | / ( N ulp ) ',
1281 $ /
' 4 = 0 if S contains min(M,N) nonnegative values in',
1282 $
' decreasing order, else 1/ulp',
1283 $ /
' 5 = | U - Upartial | / ( M ulp )',
1284 $ /
' 6 = | VT - VTpartial | / ( N ulp )',
1285 $ /
' 7 = | S - Spartial | / ( min(M,N) ulp |S| )',
1287 $
' 8 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1288 $ /
' 9 = | I - U**T U | / ( M ulp ) ',
1289 $ /
'10 = | I - VT VT**T | / ( N ulp ) ',
1290 $ /
'11 = 0 if S contains min(M,N) nonnegative values in',
1291 $
' decreasing order, else 1/ulp',
1292 $ /
'12 = | U - Upartial | / ( M ulp )',
1293 $ /
'13 = | VT - VTpartial | / ( N ulp )',
1294 $ /
'14 = | S - Spartial | / ( min(M,N) ulp |S| )',
1296 $ /
'15 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1297 $ /
'16 = | I - U**T U | / ( M ulp ) ',
1298 $ /
'17 = | I - VT VT**T | / ( N ulp ) ',
1299 $ /
'18 = 0 if S contains min(M,N) nonnegative values in',
1300 $
' decreasing order, else 1/ulp',
1302 $ /
'19 = | A - U diag(S) VT | / ( |A| max(M,N) ulp )',
1303 $ /
'20 = | I - U**T U | / ( M ulp ) ',
1304 $ /
'21 = | I - VT VT**T | / ( N ulp ) ',
1305 $ /
'22 = 0 if S contains min(M,N) nonnegative values in',
1306 $
' decreasing order, else 1/ulp',
1307 $ /
' ZGESVDX(V,V,A): ', /
1308 $
'23 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1309 $ /
'24 = | I - U**T U | / ( M ulp ) ',
1310 $ /
'25 = | I - VT VT**T | / ( N ulp ) ',
1311 $ /
'26 = 0 if S contains min(M,N) nonnegative values in',
1312 $
' decreasing order, else 1/ulp',
1313 $ /
'27 = | U - Upartial | / ( M ulp )',
1314 $ /
'28 = | VT - VTpartial | / ( N ulp )',
1315 $ /
'29 = | S - Spartial | / ( min(M,N) ulp |S| )',
1316 $ /
' ZGESVDX(V,V,I): ',
1317 $ /
'30 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp )',
1318 $ /
'31 = | I - U**T U | / ( M ulp ) ',
1319 $ /
'32 = | I - VT VT**T | / ( N ulp ) ',
1320 $ /
' ZGESVDX(V,V,V) ',
1321 $ /
'33 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp )',
1322 $ /
'34 = | I - U**T U | / ( M ulp ) ',
1323 $ /
'35 = | I - VT VT**T | / ( N ulp ) ',
1324 $
' ZGESVDQ(H,N,N,A,A',
1325 $ /
'36 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1326 $ /
'37 = | I - U**T U | / ( M ulp ) ',
1327 $ /
'38 = | I - VT VT**T | / ( N ulp ) ',
1328 $ /
'39 = 0 if S contains min(M,N) nonnegative values in',
1329 $
' decreasing order, else 1/ulp',
1331 9997
FORMAT(
' M=', i5,
', N=', i5,
', type ', i1,
', IWS=', i1,
1332 $
', seed=', 4( i4,
',' ),
' test(', i2,
')=', g11.4 )
1333 9996
FORMAT(
' ZDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1334 $ i6,
', N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
1336 9995
FORMAT(
' ZDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1337 $ i6,
', N=', i6,
', JTYPE=', i6,
', LSWORK=', i6, / 9x,
1338 $
'ISEED=(', 3( i5,
',' ), i5,
')' )