397 SUBROUTINE zdrvbd( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
398 $ A, LDA, U, LDU, VT, LDVT, ASAV, USAV, VTSAV, S,
399 $ SSAV, E, WORK, LWORK, RWORK, IWORK, NOUNIT,
409 INTEGER INFO, LDA, LDU, LDVT, LWORK, NOUNIT, NSIZES,
411 DOUBLE PRECISION THRESH
415 INTEGER ISEED( 4 ), IWORK( * ), MM( * ), NN( * )
416 DOUBLE PRECISION E( * ), RWORK( * ), S( * ), SSAV( * )
417 COMPLEX*16 A( LDA, * ), ASAV( LDA, * ), U( LDU, * ),
418 $ usav( ldu, * ), vt( ldvt, * ),
419 $ vtsav( ldvt, * ), work( * )
425 DOUBLE PRECISION ZERO, ONE, TWO, HALF
426 PARAMETER ( ZERO = 0.0d0, one = 1.0d0, two = 2.0d0,
428 COMPLEX*16 CZERO, CONE
429 parameter( czero = ( 0.0d+0, 0.0d+0 ),
430 $ cone = ( 1.0d+0, 0.0d+0 ) )
432 parameter( maxtyp = 5 )
436 CHARACTER JOBQ, JOBU, JOBVT, RANGE
437 INTEGER I, IINFO, IJQ, IJU, IJVT, IL, IU, ITEMP,
438 $ iwspc, iwtmp, j, jsize, jtype, lswork, m,
439 $ minwrk, mmax, mnmax, mnmin, mtypes, n,
440 $ nerrs, nfail, nmax, ns, nsi, nsv, ntest,
441 $ ntestf, ntestt, lrwork
442 DOUBLE PRECISION ANORM, DIF, DIV, OVFL, RTUNFL, ULP, ULPINV,
446 INTEGER LIWORK, NUMRANK
449 CHARACTER CJOB( 4 ), CJOBR( 3 ), CJOBV( 2 )
450 INTEGER IOLDSD( 4 ), ISEED2( 4 )
451 DOUBLE PRECISION RESULT( 39 )
454 DOUBLE PRECISION DLAMCH, DLARND
455 EXTERNAL DLAMCH, DLARND
463 INTRINSIC abs, dble, max, min
469 COMMON / srnamc / srnamt
472 DATA cjob /
'N',
'O',
'S',
'A' /
473 DATA cjobr /
'A',
'V',
'I' /
474 DATA cjobv /
'N',
'V' /
494 mmax = max( mmax, mm( j ) )
497 nmax = max( nmax, nn( j ) )
500 mnmax = max( mnmax, min( mm( j ), nn( j ) ) )
501 minwrk = max( minwrk, max( 3*min( mm( j ),
502 $ nn( j ) )+max( mm( j ), nn( j ) )**2, 5*min( mm( j ),
503 $ nn( j ) ), 3*max( mm( j ), nn( j ) ) ) )
508 IF( nsizes.LT.0 )
THEN
510 ELSE IF( badmm )
THEN
512 ELSE IF( badnn )
THEN
514 ELSE IF( ntypes.LT.0 )
THEN
516 ELSE IF( lda.LT.max( 1, mmax ) )
THEN
518 ELSE IF( ldu.LT.max( 1, mmax ) )
THEN
520 ELSE IF( ldvt.LT.max( 1, nmax ) )
THEN
522 ELSE IF( minwrk.GT.lwork )
THEN
527 CALL xerbla(
'ZDRVBD', -info )
533 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
542 rtunfl = sqrt( unfl )
548 DO 230 jsize = 1, nsizes
553 IF( nsizes.NE.1 )
THEN
554 mtypes = min( maxtyp, ntypes )
556 mtypes = min( maxtyp+1, ntypes )
559 DO 220 jtype = 1, mtypes
560 IF( .NOT.dotype( jtype ) )
565 ioldsd( j ) = iseed( j )
570 IF( mtypes.GT.maxtyp )
573 IF( jtype.EQ.1 )
THEN
577 CALL zlaset(
'Full', m, n, czero, czero, a, lda )
578 DO 30 i = 1, min( m, n )
582 ELSE IF( jtype.EQ.2 )
THEN
586 CALL zlaset(
'Full', m, n, czero, cone, a, lda )
587 DO 40 i = 1, min( m, n )
601 CALL zlatms( m, n,
'U', iseed,
'N', s, 4, dble( mnmin ),
602 $ anorm, m-1, n-1,
'N', a, lda, work, iinfo )
603 IF( iinfo.NE.0 )
THEN
604 WRITE( nounit, fmt = 9996 )
'Generator', iinfo, m, n,
612 CALL zlacpy(
'F', m, n, a, lda, asav, lda )
620 iwtmp = 2*min( m, n )+max( m, n )
621 lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
622 lswork = min( lswork, lwork )
623 lswork = max( lswork, 1 )
634 $
CALL zlacpy(
'F', m, n, asav, lda, a, lda )
636 CALL zgesvd(
'A',
'A', m, n, a, lda, ssav, usav, ldu,
637 $ vtsav, ldvt, work, lswork, rwork, iinfo )
638 IF( iinfo.NE.0 )
THEN
639 WRITE( nounit, fmt = 9995 )
'GESVD', iinfo, m, n,
640 $ jtype, lswork, ioldsd
647 CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
648 $ vtsav, ldvt, work, rwork, result( 1 ) )
649 IF( m.NE.0 .AND. n.NE.0 )
THEN
650 CALL zunt01(
'Columns', mnmin, m, usav, ldu, work,
651 $ lwork, rwork, result( 2 ) )
652 CALL zunt01(
'Rows', mnmin, n, vtsav, ldvt, work,
653 $ lwork, rwork, result( 3 ) )
656 DO 70 i = 1, mnmin - 1
657 IF( ssav( i ).LT.ssav( i+1 ) )
658 $ result( 4 ) = ulpinv
659 IF( ssav( i ).LT.zero )
660 $ result( 4 ) = ulpinv
662 IF( mnmin.GE.1 )
THEN
663 IF( ssav( mnmin ).LT.zero )
664 $ result( 4 ) = ulpinv
674 IF( ( iju.EQ.3 .AND. ijvt.EQ.3 ) .OR.
675 $ ( iju.EQ.1 .AND. ijvt.EQ.1 ) )
GO TO 90
677 jobvt = cjob( ijvt+1 )
678 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
680 CALL zgesvd( jobu, jobvt, m, n, a, lda, s, u, ldu,
681 $ vt, ldvt, work, lswork, rwork, iinfo )
686 IF( m.GT.0 .AND. n.GT.0 )
THEN
688 CALL zunt03(
'C', m, mnmin, m, mnmin, usav,
689 $ ldu, a, lda, work, lwork, rwork,
691 ELSE IF( iju.EQ.2 )
THEN
692 CALL zunt03(
'C', m, mnmin, m, mnmin, usav,
693 $ ldu, u, ldu, work, lwork, rwork,
695 ELSE IF( iju.EQ.3 )
THEN
696 CALL zunt03(
'C', m, m, m, mnmin, usav, ldu,
697 $ u, ldu, work, lwork, rwork, dif,
701 result( 5 ) = max( result( 5 ), dif )
706 IF( m.GT.0 .AND. n.GT.0 )
THEN
708 CALL zunt03(
'R', n, mnmin, n, mnmin, vtsav,
709 $ ldvt, a, lda, work, lwork,
710 $ rwork, dif, iinfo )
711 ELSE IF( ijvt.EQ.2 )
THEN
712 CALL zunt03(
'R', n, mnmin, n, mnmin, vtsav,
713 $ ldvt, vt, ldvt, work, lwork,
714 $ rwork, dif, iinfo )
715 ELSE IF( ijvt.EQ.3 )
THEN
716 CALL zunt03(
'R', n, n, n, mnmin, vtsav,
717 $ ldvt, vt, ldvt, work, lwork,
718 $ rwork, dif, iinfo )
721 result( 6 ) = max( result( 6 ), dif )
726 div = max( dble( mnmin )*ulp*s( 1 ),
727 $ dlamch(
'Safe minimum' ) )
728 DO 80 i = 1, mnmin - 1
729 IF( ssav( i ).LT.ssav( i+1 ) )
731 IF( ssav( i ).LT.zero )
733 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
735 result( 7 ) = max( result( 7 ), dif )
741 iwtmp = 2*mnmin*mnmin + 2*mnmin + max( m, n )
742 lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
743 lswork = min( lswork, lwork )
744 lswork = max( lswork, 1 )
750 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
752 CALL zgesdd(
'A', m, n, a, lda, ssav, usav, ldu, vtsav,
753 $ ldvt, work, lswork, rwork, iwork, iinfo )
754 IF( iinfo.NE.0 )
THEN
755 WRITE( nounit, fmt = 9995 )
'GESDD', iinfo, m, n,
756 $ jtype, lswork, ioldsd
763 CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
764 $ vtsav, ldvt, work, rwork, result( 8 ) )
765 IF( m.NE.0 .AND. n.NE.0 )
THEN
766 CALL zunt01(
'Columns', mnmin, m, usav, ldu, work,
767 $ lwork, rwork, result( 9 ) )
768 CALL zunt01(
'Rows', mnmin, n, vtsav, ldvt, work,
769 $ lwork, rwork, result( 10 ) )
772 DO 110 i = 1, mnmin - 1
773 IF( ssav( i ).LT.ssav( i+1 ) )
774 $ result( 11 ) = ulpinv
775 IF( ssav( i ).LT.zero )
776 $ result( 11 ) = ulpinv
778 IF( mnmin.GE.1 )
THEN
779 IF( ssav( mnmin ).LT.zero )
780 $ result( 11 ) = ulpinv
790 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
792 CALL zgesdd( jobq, m, n, a, lda, s, u, ldu, vt, ldvt,
793 $ work, lswork, rwork, iwork, iinfo )
798 IF( m.GT.0 .AND. n.GT.0 )
THEN
801 CALL zunt03(
'C', m, mnmin, m, mnmin, usav,
802 $ ldu, a, lda, work, lwork, rwork,
805 CALL zunt03(
'C', m, mnmin, m, mnmin, usav,
806 $ ldu, u, ldu, work, lwork, rwork,
809 ELSE IF( ijq.EQ.2 )
THEN
810 CALL zunt03(
'C', m, mnmin, m, mnmin, usav, ldu,
811 $ u, ldu, work, lwork, rwork, dif,
815 result( 12 ) = max( result( 12 ), dif )
820 IF( m.GT.0 .AND. n.GT.0 )
THEN
823 CALL zunt03(
'R', n, mnmin, n, mnmin, vtsav,
824 $ ldvt, vt, ldvt, work, lwork,
825 $ rwork, dif, iinfo )
827 CALL zunt03(
'R', n, mnmin, n, mnmin, vtsav,
828 $ ldvt, a, lda, work, lwork,
829 $ rwork, dif, iinfo )
831 ELSE IF( ijq.EQ.2 )
THEN
832 CALL zunt03(
'R', n, mnmin, n, mnmin, vtsav,
833 $ ldvt, vt, ldvt, work, lwork, rwork,
837 result( 13 ) = max( result( 13 ), dif )
842 div = max( dble( mnmin )*ulp*s( 1 ),
843 $ dlamch(
'Safe minimum' ) )
844 DO 120 i = 1, mnmin - 1
845 IF( ssav( i ).LT.ssav( i+1 ) )
847 IF( ssav( i ).LT.zero )
849 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
851 result( 14 ) = max( result( 14 ), dif )
863 iwtmp = 2*mnmin*mnmin + 2*mnmin + max( m, n )
864 lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
865 lswork = min( lswork, lwork )
866 lswork = max( lswork, 1 )
870 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
873 lrwork = max(2, m, 5*n)
875 CALL zgesvdq(
'H',
'N',
'N',
'A',
'A',
876 $ m, n, a, lda, ssav, usav, ldu,
877 $ vtsav, ldvt, numrank, iwork, liwork,
878 $ work, lwork, rwork, lrwork, iinfo )
880 IF( iinfo.NE.0 )
THEN
881 WRITE( nounit, fmt = 9995 )
'ZGESVDQ', iinfo, m, n,
882 $ jtype, lswork, ioldsd
889 CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
890 $ vtsav, ldvt, work, rwork, result( 36 ) )
891 IF( m.NE.0 .AND. n.NE.0 )
THEN
892 CALL zunt01(
'Columns', m, m, usav, ldu, work,
893 $ lwork, rwork, result( 37 ) )
894 CALL zunt01(
'Rows', n, n, vtsav, ldvt, work,
895 $ lwork, rwork, result( 38 ) )
898 DO 199 i = 1, mnmin - 1
899 IF( ssav( i ).LT.ssav( i+1 ) )
900 $ result( 39 ) = ulpinv
901 IF( ssav( i ).LT.zero )
902 $ result( 39 ) = ulpinv
904 IF( mnmin.GE.1 )
THEN
905 IF( ssav( mnmin ).LT.zero )
906 $ result( 39 ) = ulpinv
919 iwtmp = 2*mnmin*mnmin + 2*mnmin + max( m, n )
920 lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
921 lswork = min( lswork, lwork )
922 lswork = max( lswork, 1 )
927 CALL zlacpy(
'F', m, n, asav, lda, usav, lda )
929 CALL zgesvj(
'G',
'U',
'V', m, n, usav, lda, ssav,
930 & 0, a, ldvt, work, lwork, rwork,
937 vtsav(j,i) = conjg(a(i,j))
941 IF( iinfo.NE.0 )
THEN
942 WRITE( nounit, fmt = 9995 )
'GESVJ', iinfo, m, n,
943 $ jtype, lswork, ioldsd
950 CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
951 $ vtsav, ldvt, work, rwork, result( 15 ) )
952 IF( m.NE.0 .AND. n.NE.0 )
THEN
953 CALL zunt01(
'Columns', m, m, usav, ldu, work,
954 $ lwork, rwork, result( 16 ) )
955 CALL zunt01(
'Rows', n, n, vtsav, ldvt, work,
956 $ lwork, rwork, result( 17 ) )
959 DO 131 i = 1, mnmin - 1
960 IF( ssav( i ).LT.ssav( i+1 ) )
961 $ result( 18 ) = ulpinv
962 IF( ssav( i ).LT.zero )
963 $ result( 18 ) = ulpinv
965 IF( mnmin.GE.1 )
THEN
966 IF( ssav( mnmin ).LT.zero )
967 $ result( 18 ) = ulpinv
979 iwtmp = 2*mnmin*mnmin + 2*mnmin + max( m, n )
980 lswork = iwtmp + ( iwspc-1 )*( lwork-iwtmp ) / 3
981 lswork = min( lswork, lwork )
982 lswork = max( lswork, 1 )
985 lrwork = max( 7, n + 2*m)
987 CALL zlacpy(
'F', m, n, asav, lda, vtsav, lda )
989 CALL zgejsv(
'G',
'U',
'V',
'R',
'N',
'N',
990 & m, n, vtsav, lda, ssav, usav, ldu, a, ldvt,
991 & work, lwork, rwork,
992 & lrwork, iwork, iinfo )
998 vtsav(j,i) = conjg(a(i,j))
1002 IF( iinfo.NE.0 )
THEN
1003 WRITE( nounit, fmt = 9995 )
'GEJSV', iinfo, m, n,
1004 $ jtype, lswork, ioldsd
1011 CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
1012 $ vtsav, ldvt, work, rwork, result( 19 ) )
1013 IF( m.NE.0 .AND. n.NE.0 )
THEN
1014 CALL zunt01(
'Columns', m, m, usav, ldu, work,
1015 $ lwork, rwork, result( 20 ) )
1016 CALL zunt01(
'Rows', n, n, vtsav, ldvt, work,
1017 $ lwork, rwork, result( 21 ) )
1020 DO 134 i = 1, mnmin - 1
1021 IF( ssav( i ).LT.ssav( i+1 ) )
1022 $ result( 22 ) = ulpinv
1023 IF( ssav( i ).LT.zero )
1024 $ result( 22 ) = ulpinv
1026 IF( mnmin.GE.1 )
THEN
1027 IF( ssav( mnmin ).LT.zero )
1028 $ result( 22 ) = ulpinv
1036 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
1038 CALL zgesvdx(
'V',
'V',
'A', m, n, a, lda,
1039 $ vl, vu, il, iu, ns, ssav, usav, ldu,
1040 $ vtsav, ldvt, work, lwork, rwork,
1042 IF( iinfo.NE.0 )
THEN
1043 WRITE( nounit, fmt = 9995 )
'GESVDX', iinfo, m, n,
1044 $ jtype, lswork, ioldsd
1054 CALL zbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
1055 $ vtsav, ldvt, work, rwork, result( 23 ) )
1056 IF( m.NE.0 .AND. n.NE.0 )
THEN
1057 CALL zunt01(
'Columns', mnmin, m, usav, ldu, work,
1058 $ lwork, rwork, result( 24 ) )
1059 CALL zunt01(
'Rows', mnmin, n, vtsav, ldvt, work,
1060 $ lwork, rwork, result( 25 ) )
1063 DO 140 i = 1, mnmin - 1
1064 IF( ssav( i ).LT.ssav( i+1 ) )
1065 $ result( 26 ) = ulpinv
1066 IF( ssav( i ).LT.zero )
1067 $ result( 26 ) = ulpinv
1069 IF( mnmin.GE.1 )
THEN
1070 IF( ssav( mnmin ).LT.zero )
1071 $ result( 26 ) = ulpinv
1081 IF( ( iju.EQ.0 .AND. ijvt.EQ.0 ) .OR.
1082 $ ( iju.EQ.1 .AND. ijvt.EQ.1 ) )
GO TO 160
1083 jobu = cjobv( iju+1 )
1084 jobvt = cjobv( ijvt+1 )
1086 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
1088 CALL zgesvdx( jobu, jobvt,
'A', m, n, a, lda,
1089 $ vl, vu, il, iu, ns, ssav, u, ldu,
1090 $ vt, ldvt, work, lwork, rwork,
1096 IF( m.GT.0 .AND. n.GT.0 )
THEN
1098 CALL zunt03(
'C', m, mnmin, m, mnmin, usav,
1099 $ ldu, u, ldu, work, lwork, rwork,
1103 result( 27 ) = max( result( 27 ), dif )
1108 IF( m.GT.0 .AND. n.GT.0 )
THEN
1109 IF( ijvt.EQ.1 )
THEN
1110 CALL zunt03(
'R', n, mnmin, n, mnmin, vtsav,
1111 $ ldvt, vt, ldvt, work, lwork,
1112 $ rwork, dif, iinfo )
1115 result( 28 ) = max( result( 28 ), dif )
1120 div = max( dble( mnmin )*ulp*s( 1 ),
1121 $ dlamch(
'Safe minimum' ) )
1122 DO 150 i = 1, mnmin - 1
1123 IF( ssav( i ).LT.ssav( i+1 ) )
1125 IF( ssav( i ).LT.zero )
1127 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
1129 result( 29) = max( result( 29 ), dif )
1136 iseed2( i ) = iseed( i )
1138 IF( mnmin.LE.1 )
THEN
1140 iu = max( 1, mnmin )
1142 il = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1143 iu = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1150 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
1152 CALL zgesvdx(
'V',
'V',
'I', m, n, a, lda,
1153 $ vl, vu, il, iu, nsi, s, u, ldu,
1154 $ vt, ldvt, work, lwork, rwork,
1156 IF( iinfo.NE.0 )
THEN
1157 WRITE( nounit, fmt = 9995 )
'GESVDX', iinfo, m, n,
1158 $ jtype, lswork, ioldsd
1166 CALL zbdt05( m, n, asav, lda, s, nsi, u, ldu,
1167 $ vt, ldvt, work, result( 30 ) )
1168 IF( m.NE.0 .AND. n.NE.0 )
THEN
1169 CALL zunt01(
'Columns', m, nsi, u, ldu, work,
1170 $ lwork, rwork, result( 31 ) )
1171 CALL zunt01(
'Rows', nsi, n, vt, ldvt, work,
1172 $ lwork, rwork, result( 32 ) )
1177 IF( mnmin.GT.0 .AND. nsi.GT.1 )
THEN
1180 $ max( half*abs( ssav( il )-ssav( il-1 ) ),
1181 $ ulp*anorm, two*rtunfl )
1184 $ max( half*abs( ssav( ns )-ssav( 1 ) ),
1185 $ ulp*anorm, two*rtunfl )
1188 vl = ssav( iu ) - max( ulp*anorm, two*rtunfl,
1189 $ half*abs( ssav( iu+1 )-ssav( iu ) ) )
1191 vl = ssav( ns ) - max( ulp*anorm, two*rtunfl,
1192 $ half*abs( ssav( ns )-ssav( 1 ) ) )
1196 IF( vl.GE.vu ) vu = max( vu*2, vu+vl+half )
1201 CALL zlacpy(
'F', m, n, asav, lda, a, lda )
1203 CALL zgesvdx(
'V',
'V',
'V', m, n, a, lda,
1204 $ vl, vu, il, iu, nsv, s, u, ldu,
1205 $ vt, ldvt, work, lwork, rwork,
1207 IF( iinfo.NE.0 )
THEN
1208 WRITE( nounit, fmt = 9995 )
'GESVDX', iinfo, m, n,
1209 $ jtype, lswork, ioldsd
1217 CALL zbdt05( m, n, asav, lda, s, nsv, u, ldu,
1218 $ vt, ldvt, work, result( 33 ) )
1219 IF( m.NE.0 .AND. n.NE.0 )
THEN
1220 CALL zunt01(
'Columns', m, nsv, u, ldu, work,
1221 $ lwork, rwork, result( 34 ) )
1222 CALL zunt01(
'Rows', nsv, n, vt, ldvt, work,
1223 $ lwork, rwork, result( 35 ) )
1231 IF( result( j ).GE.zero )
1233 IF( result( j ).GE.thresh )
1238 $ ntestf = ntestf + 1
1239 IF( ntestf.EQ.1 )
THEN
1240 WRITE( nounit, fmt = 9999 )
1241 WRITE( nounit, fmt = 9998 )thresh
1246 IF( result( j ).GE.thresh )
THEN
1247 WRITE( nounit, fmt = 9997 )m, n, jtype, iwspc,
1248 $ ioldsd, j, result( j )
1252 nerrs = nerrs + nfail
1253 ntestt = ntestt + ntest
1262 CALL alasvm(
'ZBD', nounit, nerrs, ntestt, 0 )
1264 9999
FORMAT(
' SVD -- Complex Singular Value Decomposition Driver ',
1265 $ /
' Matrix types (see ZDRVBD for details):',
1266 $ / /
' 1 = Zero matrix', /
' 2 = Identity matrix',
1267 $ /
' 3 = Evenly spaced singular values near 1',
1268 $ /
' 4 = Evenly spaced singular values near underflow',
1269 $ /
' 5 = Evenly spaced singular values near overflow',
1270 $ / /
' Tests performed: ( A is dense, U and V are unitary,',
1271 $ / 19x,
' S is an array, and Upartial, VTpartial, and',
1272 $ / 19x,
' Spartial are partially computed U, VT and S),', / )
1273 9998
FORMAT(
' Tests performed with Test Threshold = ', f8.2,
1275 $
' 1 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1276 $ /
' 2 = | I - U**T U | / ( M ulp ) ',
1277 $ /
' 3 = | I - VT VT**T | / ( N ulp ) ',
1278 $ /
' 4 = 0 if S contains min(M,N) nonnegative values in',
1279 $
' decreasing order, else 1/ulp',
1280 $ /
' 5 = | U - Upartial | / ( M ulp )',
1281 $ /
' 6 = | VT - VTpartial | / ( N ulp )',
1282 $ /
' 7 = | S - Spartial | / ( min(M,N) ulp |S| )',
1284 $
' 8 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1285 $ /
' 9 = | I - U**T U | / ( M ulp ) ',
1286 $ /
'10 = | I - VT VT**T | / ( N ulp ) ',
1287 $ /
'11 = 0 if S contains min(M,N) nonnegative values in',
1288 $
' decreasing order, else 1/ulp',
1289 $ /
'12 = | U - Upartial | / ( M ulp )',
1290 $ /
'13 = | VT - VTpartial | / ( N ulp )',
1291 $ /
'14 = | S - Spartial | / ( min(M,N) ulp |S| )',
1293 $ /
'15 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1294 $ /
'16 = | I - U**T U | / ( M ulp ) ',
1295 $ /
'17 = | I - VT VT**T | / ( N ulp ) ',
1296 $ /
'18 = 0 if S contains min(M,N) nonnegative values in',
1297 $
' decreasing order, else 1/ulp',
1299 $ /
'19 = | A - U diag(S) VT | / ( |A| max(M,N) ulp )',
1300 $ /
'20 = | I - U**T U | / ( M ulp ) ',
1301 $ /
'21 = | I - VT VT**T | / ( N ulp ) ',
1302 $ /
'22 = 0 if S contains min(M,N) nonnegative values in',
1303 $
' decreasing order, else 1/ulp',
1304 $ /
' ZGESVDX(V,V,A): ', /
1305 $
'23 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1306 $ /
'24 = | I - U**T U | / ( M ulp ) ',
1307 $ /
'25 = | I - VT VT**T | / ( N ulp ) ',
1308 $ /
'26 = 0 if S contains min(M,N) nonnegative values in',
1309 $
' decreasing order, else 1/ulp',
1310 $ /
'27 = | U - Upartial | / ( M ulp )',
1311 $ /
'28 = | VT - VTpartial | / ( N ulp )',
1312 $ /
'29 = | S - Spartial | / ( min(M,N) ulp |S| )',
1313 $ /
' ZGESVDX(V,V,I): ',
1314 $ /
'30 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp )',
1315 $ /
'31 = | I - U**T U | / ( M ulp ) ',
1316 $ /
'32 = | I - VT VT**T | / ( N ulp ) ',
1317 $ /
' ZGESVDX(V,V,V) ',
1318 $ /
'33 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp )',
1319 $ /
'34 = | I - U**T U | / ( M ulp ) ',
1320 $ /
'35 = | I - VT VT**T | / ( N ulp ) ',
1321 $
' ZGESVDQ(H,N,N,A,A',
1322 $ /
'36 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1323 $ /
'37 = | I - U**T U | / ( M ulp ) ',
1324 $ /
'38 = | I - VT VT**T | / ( N ulp ) ',
1325 $ /
'39 = 0 if S contains min(M,N) nonnegative values in',
1326 $
' decreasing order, else 1/ulp',
1328 9997
FORMAT(
' M=', i5,
', N=', i5,
', type ', i1,
', IWS=', i1,
1329 $
', seed=', 4( i4,
',' ),
' test(', i2,
')=', g11.4 )
1330 9996
FORMAT(
' ZDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1331 $ i6,
', N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
1333 9995
FORMAT(
' ZDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1334 $ i6,
', N=', i6,
', JTYPE=', i6,
', LSWORK=', i6, / 9x,
1335 $
'ISEED=(', 3( i5,
',' ), i5,
')' )
subroutine alasvm(type, nout, nfail, nrun, nerrs)
ALASVM
subroutine xerbla(srname, info)
subroutine zgejsv(joba, jobu, jobv, jobr, jobt, jobp, m, n, a, lda, sva, u, ldu, v, ldv, cwork, lwork, rwork, lrwork, iwork, info)
ZGEJSV
subroutine zgesdd(jobz, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, rwork, iwork, info)
ZGESDD
subroutine zgesvd(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, rwork, info)
ZGESVD computes the singular value decomposition (SVD) for GE matrices
subroutine zgesvdq(joba, jobp, jobr, jobu, jobv, m, n, a, lda, s, u, ldu, v, ldv, numrank, iwork, liwork, cwork, lcwork, rwork, lrwork, info)
ZGESVDQ computes the singular value decomposition (SVD) with a QR-Preconditioned QR SVD Method for GE...
subroutine zgesvdx(jobu, jobvt, range, m, n, a, lda, vl, vu, il, iu, ns, s, u, ldu, vt, ldvt, work, lwork, rwork, iwork, info)
ZGESVDX computes the singular value decomposition (SVD) for GE matrices
subroutine zgesvj(joba, jobu, jobv, m, n, a, lda, sva, mv, v, ldv, cwork, lwork, rwork, lrwork, info)
ZGESVJ
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlaset(uplo, m, n, alpha, beta, a, lda)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zbdt01(m, n, kd, a, lda, q, ldq, d, e, pt, ldpt, work, rwork, resid)
ZBDT01
subroutine zbdt05(m, n, a, lda, s, ns, u, ldu, vt, ldvt, work, resid)
ZBDT05
subroutine zdrvbd(nsizes, mm, nn, ntypes, dotype, iseed, thresh, a, lda, u, ldu, vt, ldvt, asav, usav, vtsav, s, ssav, e, work, lwork, rwork, iwork, nounit, info)
ZDRVBD
subroutine zlatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
ZLATMS
subroutine zunt01(rowcol, m, n, u, ldu, work, lwork, rwork, resid)
ZUNT01
subroutine zunt03(rc, mu, mv, n, k, u, ldu, v, ldv, work, lwork, rwork, result, info)
ZUNT03