365 SUBROUTINE ddrvbd( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
366 $ A, LDA, U, LDU, VT, LDVT, ASAV, USAV, VTSAV, S,
367 $ SSAV, E, WORK, LWORK, IWORK, NOUT, INFO )
377 INTEGER INFO, LDA, LDU, LDVT, LWORK, NOUT, NSIZES,
379 DOUBLE PRECISION THRESH
383 INTEGER ISEED( 4 ), IWORK( * ), MM( * ), NN( * )
384 DOUBLE PRECISION A( LDA, * ), ASAV( LDA, * ), E( * ), S( * ),
385 $ ssav( * ), u( ldu, * ), usav( ldu, * ),
386 $ vt( ldvt, * ), vtsav( ldvt, * ), work( * )
392 DOUBLE PRECISION ZERO, ONE, TWO, HALF
393 PARAMETER ( ZERO = 0.0d0, one = 1.0d0, two = 2.0d0,
396 PARAMETER ( MAXTYP = 5 )
400 CHARACTER JOBQ, JOBU, JOBVT, RANGE
402 INTEGER I, IINFO, IJQ, IJU, IJVT, IL,IU, IWS, IWTMP,
403 $ itemp, j, jsize, jtype, lswork, m, minwrk,
404 $ mmax, mnmax, mnmin, mtypes, n, nfail,
405 $ nmax, ns, nsi, nsv, ntest
406 DOUBLE PRECISION ANORM, DIF, DIV, OVFL, RTUNFL, ULP,
407 $ ULPINV, UNFL, VL, VU
410 INTEGER LIWORK, LRWORK, NUMRANK
413 DOUBLE PRECISION RWORK( 2 )
416 CHARACTER CJOB( 4 ), CJOBR( 3 ), CJOBV( 2 )
417 INTEGER IOLDSD( 4 ), ISEED2( 4 )
418 DOUBLE PRECISION RESULT( 39 )
421 DOUBLE PRECISION DLAMCH, DLARND
422 EXTERNAL DLAMCH, DLARND
430 INTRINSIC abs, dble, int, max, min
438 COMMON / infoc / infot, nunit, ok, lerr
439 COMMON / srnamc / srnamt
442 DATA cjob /
'N',
'O',
'S',
'A' /
443 DATA cjobr /
'A',
'V',
'I' /
444 DATA cjobv /
'N',
'V' /
458 mmax = max( mmax, mm( j ) )
461 nmax = max( nmax, nn( j ) )
464 mnmax = max( mnmax, min( mm( j ), nn( j ) ) )
465 minwrk = max( minwrk, max( 3*min( mm( j ),
466 $ nn( j ) )+max( mm( j ), nn( j ) ), 5*min( mm( j ),
467 $ nn( j )-4 ) )+2*min( mm( j ), nn( j ) )**2 )
472 IF( nsizes.LT.0 )
THEN
474 ELSE IF( badmm )
THEN
476 ELSE IF( badnn )
THEN
478 ELSE IF( ntypes.LT.0 )
THEN
480 ELSE IF( lda.LT.max( 1, mmax ) )
THEN
482 ELSE IF( ldu.LT.max( 1, mmax ) )
THEN
484 ELSE IF( ldvt.LT.max( 1, nmax ) )
THEN
486 ELSE IF( minwrk.GT.lwork )
THEN
491 CALL xerbla(
'DDRVBD', -info )
497 path( 1: 1 ) =
'Double precision'
501 unfl = dlamch(
'Safe minimum' )
504 ulp = dlamch(
'Precision' )
505 rtunfl = sqrt( unfl )
511 DO 240 jsize = 1, nsizes
516 IF( nsizes.NE.1 )
THEN
517 mtypes = min( maxtyp, ntypes )
519 mtypes = min( maxtyp+1, ntypes )
522 DO 230 jtype = 1, mtypes
523 IF( .NOT.dotype( jtype ) )
527 ioldsd( j ) = iseed( j )
532 IF( mtypes.GT.maxtyp )
535 IF( jtype.EQ.1 )
THEN
539 CALL dlaset(
'Full', m, n, zero, zero, a, lda )
541 ELSE IF( jtype.EQ.2 )
THEN
545 CALL dlaset(
'Full', m, n, zero, one, a, lda )
557 CALL dlatms( m, n,
'U', iseed,
'N', s, 4, dble( mnmin ),
558 $ anorm, m-1, n-1,
'N', a, lda, work, iinfo )
559 IF( iinfo.NE.0 )
THEN
560 WRITE( nout, fmt = 9996 )
'Generator', iinfo, m, n,
568 CALL dlacpy(
'F', m, n, a, lda, asav, lda )
580 iwtmp = max( 3*min( m, n )+max( m, n ), 5*min( m, n ) )
581 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
582 lswork = min( lswork, lwork )
583 lswork = max( lswork, 1 )
588 $
CALL dlacpy(
'F', m, n, asav, lda, a, lda )
590 CALL dgesvd(
'A',
'A', m, n, a, lda, ssav, usav, ldu,
591 $ vtsav, ldvt, work, lswork, iinfo )
592 IF( iinfo.NE.0 )
THEN
593 WRITE( nout, fmt = 9995 )
'GESVD', iinfo, m, n, jtype,
601 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
602 $ vtsav, ldvt, work, result( 1 ) )
603 IF( m.NE.0 .AND. n.NE.0 )
THEN
604 CALL dort01(
'Columns', m, m, usav, ldu, work, lwork,
606 CALL dort01(
'Rows', n, n, vtsav, ldvt, work, lwork,
610 DO 50 i = 1, mnmin - 1
611 IF( ssav( i ).LT.ssav( i+1 ) )
612 $ result( 4 ) = ulpinv
613 IF( ssav( i ).LT.zero )
614 $ result( 4 ) = ulpinv
616 IF( mnmin.GE.1 )
THEN
617 IF( ssav( mnmin ).LT.zero )
618 $ result( 4 ) = ulpinv
628 IF( ( iju.EQ.3 .AND. ijvt.EQ.3 ) .OR.
629 $ ( iju.EQ.1 .AND. ijvt.EQ.1 ) )
GO TO 70
631 jobvt = cjob( ijvt+1 )
632 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
634 CALL dgesvd( jobu, jobvt, m, n, a, lda, s, u, ldu,
635 $ vt, ldvt, work, lswork, iinfo )
640 IF( m.GT.0 .AND. n.GT.0 )
THEN
642 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
643 $ ldu, a, lda, work, lwork, dif,
645 ELSE IF( iju.EQ.2 )
THEN
646 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
647 $ ldu, u, ldu, work, lwork, dif,
649 ELSE IF( iju.EQ.3 )
THEN
650 CALL dort03(
'C', m, m, m, mnmin, usav, ldu,
651 $ u, ldu, work, lwork, dif,
655 result( 5 ) = max( result( 5 ), dif )
660 IF( m.GT.0 .AND. n.GT.0 )
THEN
662 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
663 $ ldvt, a, lda, work, lwork, dif,
665 ELSE IF( ijvt.EQ.2 )
THEN
666 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
667 $ ldvt, vt, ldvt, work, lwork,
669 ELSE IF( ijvt.EQ.3 )
THEN
670 CALL dort03(
'R', n, n, n, mnmin, vtsav,
671 $ ldvt, vt, ldvt, work, lwork,
675 result( 6 ) = max( result( 6 ), dif )
680 div = max( mnmin*ulp*s( 1 ), unfl )
681 DO 60 i = 1, mnmin - 1
682 IF( ssav( i ).LT.ssav( i+1 ) )
684 IF( ssav( i ).LT.zero )
686 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
688 result( 7 ) = max( result( 7 ), dif )
694 iwtmp = 5*mnmin*mnmin + 9*mnmin + max( m, n )
695 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
696 lswork = min( lswork, lwork )
697 lswork = max( lswork, 1 )
701 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
703 CALL dgesdd(
'A', m, n, a, lda, ssav, usav, ldu, vtsav,
704 $ ldvt, work, lswork, iwork, iinfo )
705 IF( iinfo.NE.0 )
THEN
706 WRITE( nout, fmt = 9995 )
'GESDD', iinfo, m, n, jtype,
714 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
715 $ vtsav, ldvt, work, result( 8 ) )
716 IF( m.NE.0 .AND. n.NE.0 )
THEN
717 CALL dort01(
'Columns', m, m, usav, ldu, work, lwork,
719 CALL dort01(
'Rows', n, n, vtsav, ldvt, work, lwork,
723 DO 90 i = 1, mnmin - 1
724 IF( ssav( i ).LT.ssav( i+1 ) )
725 $ result( 11 ) = ulpinv
726 IF( ssav( i ).LT.zero )
727 $ result( 11 ) = ulpinv
729 IF( mnmin.GE.1 )
THEN
730 IF( ssav( mnmin ).LT.zero )
731 $ result( 11 ) = ulpinv
741 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
743 CALL dgesdd( jobq, m, n, a, lda, s, u, ldu, vt, ldvt,
744 $ work, lswork, iwork, iinfo )
749 IF( m.GT.0 .AND. n.GT.0 )
THEN
752 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
753 $ ldu, a, lda, work, lwork, dif,
756 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
757 $ ldu, u, ldu, work, lwork, dif,
760 ELSE IF( ijq.EQ.2 )
THEN
761 CALL dort03(
'C', m, mnmin, m, mnmin, usav, ldu,
762 $ u, ldu, work, lwork, dif, info )
765 result( 12 ) = max( result( 12 ), dif )
770 IF( m.GT.0 .AND. n.GT.0 )
THEN
773 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
774 $ ldvt, vt, ldvt, work, lwork,
777 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
778 $ ldvt, a, lda, work, lwork, dif,
781 ELSE IF( ijq.EQ.2 )
THEN
782 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
783 $ ldvt, vt, ldvt, work, lwork, dif,
787 result( 13 ) = max( result( 13 ), dif )
792 div = max( mnmin*ulp*s( 1 ), unfl )
793 DO 100 i = 1, mnmin - 1
794 IF( ssav( i ).LT.ssav( i+1 ) )
796 IF( ssav( i ).LT.zero )
798 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
800 result( 14 ) = max( result( 14 ), dif )
812 iwtmp = 5*mnmin*mnmin + 9*mnmin + max( m, n )
813 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
814 lswork = min( lswork, lwork )
815 lswork = max( lswork, 1 )
819 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
824 CALL dgesvdq(
'H',
'N',
'N',
'A',
'A',
825 $ m, n, a, lda, ssav, usav, ldu,
826 $ vtsav, ldvt, numrank, iwork, liwork,
827 $ work, lwork, rwork, lrwork, iinfo )
829 IF( iinfo.NE.0 )
THEN
830 WRITE( nout, fmt = 9995 )
'DGESVDQ', iinfo, m, n,
831 $ jtype, lswork, ioldsd
838 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
839 $ vtsav, ldvt, work, result( 36 ) )
840 IF( m.NE.0 .AND. n.NE.0 )
THEN
841 CALL dort01(
'Columns', m, m, usav, ldu, work,
842 $ lwork, result( 37 ) )
843 CALL dort01(
'Rows', n, n, vtsav, ldvt, work,
844 $ lwork, result( 38 ) )
847 DO 199 i = 1, mnmin - 1
848 IF( ssav( i ).LT.ssav( i+1 ) )
849 $ result( 39 ) = ulpinv
850 IF( ssav( i ).LT.zero )
851 $ result( 39 ) = ulpinv
853 IF( mnmin.GE.1 )
THEN
854 IF( ssav( mnmin ).LT.zero )
855 $ result( 39 ) = ulpinv
868 iwtmp = 5*mnmin*mnmin + 9*mnmin + max( m, n )
869 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
870 lswork = min( lswork, lwork )
871 lswork = max( lswork, 1 )
875 CALL dlacpy(
'F', m, n, asav, lda, usav, lda )
877 CALL dgesvj(
'G',
'U',
'V', m, n, usav, lda, ssav,
878 & 0, a, ldvt, work, lwork, info )
888 IF( iinfo.NE.0 )
THEN
889 WRITE( nout, fmt = 9995 )
'GESVJ', iinfo, m, n,
890 $ jtype, lswork, ioldsd
897 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
898 $ vtsav, ldvt, work, result( 15 ) )
899 IF( m.NE.0 .AND. n.NE.0 )
THEN
900 CALL dort01(
'Columns', m, m, usav, ldu, work,
901 $ lwork, result( 16 ) )
902 CALL dort01(
'Rows', n, n, vtsav, ldvt, work,
903 $ lwork, result( 17 ) )
906 DO 120 i = 1, mnmin - 1
907 IF( ssav( i ).LT.ssav( i+1 ) )
908 $ result( 18 ) = ulpinv
909 IF( ssav( i ).LT.zero )
910 $ result( 18 ) = ulpinv
912 IF( mnmin.GE.1 )
THEN
913 IF( ssav( mnmin ).LT.zero )
914 $ result( 18 ) = ulpinv
926 iwtmp = 5*mnmin*mnmin + 9*mnmin + max( m, n )
927 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
928 lswork = min( lswork, lwork )
929 lswork = max( lswork, 1 )
933 CALL dlacpy(
'F', m, n, asav, lda, vtsav, lda )
935 CALL dgejsv(
'G',
'U',
'V',
'R',
'N',
'N',
936 & m, n, vtsav, lda, ssav, usav, ldu, a, ldvt,
937 & work, lwork, iwork, info )
947 IF( iinfo.NE.0 )
THEN
948 WRITE( nout, fmt = 9995 )
'GEJSV', iinfo, m, n,
949 $ jtype, lswork, ioldsd
956 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
957 $ vtsav, ldvt, work, result( 19 ) )
958 IF( m.NE.0 .AND. n.NE.0 )
THEN
959 CALL dort01(
'Columns', m, m, usav, ldu, work,
960 $ lwork, result( 20 ) )
961 CALL dort01(
'Rows', n, n, vtsav, ldvt, work,
962 $ lwork, result( 21 ) )
965 DO 150 i = 1, mnmin - 1
966 IF( ssav( i ).LT.ssav( i+1 ) )
967 $ result( 22 ) = ulpinv
968 IF( ssav( i ).LT.zero )
969 $ result( 22 ) = ulpinv
971 IF( mnmin.GE.1 )
THEN
972 IF( ssav( mnmin ).LT.zero )
973 $ result( 22 ) = ulpinv
979 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
980 CALL dgesvdx(
'V',
'V',
'A', m, n, a, lda,
981 $ vl, vu, il, iu, ns, ssav, usav, ldu,
982 $ vtsav, ldvt, work, lwork, iwork,
984 IF( iinfo.NE.0 )
THEN
985 WRITE( nout, fmt = 9995 )
'GESVDX', iinfo, m, n,
986 $ jtype, lswork, ioldsd
996 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
997 $ vtsav, ldvt, work, result( 23 ) )
998 IF( m.NE.0 .AND. n.NE.0 )
THEN
999 CALL dort01(
'Columns', m, m, usav, ldu, work, lwork,
1001 CALL dort01(
'Rows', n, n, vtsav, ldvt, work, lwork,
1005 DO 160 i = 1, mnmin - 1
1006 IF( ssav( i ).LT.ssav( i+1 ) )
1007 $ result( 26 ) = ulpinv
1008 IF( ssav( i ).LT.zero )
1009 $ result( 26 ) = ulpinv
1011 IF( mnmin.GE.1 )
THEN
1012 IF( ssav( mnmin ).LT.zero )
1013 $ result( 26 ) = ulpinv
1023 IF( ( iju.EQ.0 .AND. ijvt.EQ.0 ) .OR.
1024 $ ( iju.EQ.1 .AND. ijvt.EQ.1 ) )
GO TO 170
1025 jobu = cjobv( iju+1 )
1026 jobvt = cjobv( ijvt+1 )
1028 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
1029 CALL dgesvdx( jobu, jobvt, range, m, n, a, lda,
1030 $ vl, vu, il, iu, ns, s, u, ldu,
1031 $ vt, ldvt, work, lwork, iwork,
1037 IF( m.GT.0 .AND. n.GT.0 )
THEN
1039 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
1040 $ ldu, u, ldu, work, lwork, dif,
1044 result( 27 ) = max( result( 27 ), dif )
1049 IF( m.GT.0 .AND. n.GT.0 )
THEN
1050 IF( ijvt.EQ.1 )
THEN
1051 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
1052 $ ldvt, vt, ldvt, work, lwork,
1056 result( 28 ) = max( result( 28 ), dif )
1061 div = max( mnmin*ulp*s( 1 ), unfl )
1062 DO 190 i = 1, mnmin - 1
1063 IF( ssav( i ).LT.ssav( i+1 ) )
1065 IF( ssav( i ).LT.zero )
1067 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
1069 result( 29 ) = max( result( 29 ), dif )
1076 iseed2( i ) = iseed( i )
1078 IF( mnmin.LE.1 )
THEN
1080 iu = max( 1, mnmin )
1082 il = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1083 iu = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1090 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
1091 CALL dgesvdx(
'V',
'V',
'I', m, n, a, lda,
1092 $ vl, vu, il, iu, nsi, s, u, ldu,
1093 $ vt, ldvt, work, lwork, iwork,
1095 IF( iinfo.NE.0 )
THEN
1096 WRITE( nout, fmt = 9995 )
'GESVDX', iinfo, m, n,
1097 $ jtype, lswork, ioldsd
1105 CALL dbdt05( m, n, asav, lda, s, nsi, u, ldu,
1106 $ vt, ldvt, work, result( 30 ) )
1107 CALL dort01(
'Columns', m, nsi, u, ldu, work, lwork,
1109 CALL dort01(
'Rows', nsi, n, vt, ldvt, work, lwork,
1114 IF( mnmin.GT.0 .AND. nsi.GT.1 )
THEN
1117 $ max( half*abs( ssav( il )-ssav( il-1 ) ),
1118 $ ulp*anorm, two*rtunfl )
1121 $ max( half*abs( ssav( ns )-ssav( 1 ) ),
1122 $ ulp*anorm, two*rtunfl )
1125 vl = ssav( iu ) - max( ulp*anorm, two*rtunfl,
1126 $ half*abs( ssav( iu+1 )-ssav( iu ) ) )
1128 vl = ssav( ns ) - max( ulp*anorm, two*rtunfl,
1129 $ half*abs( ssav( ns )-ssav( 1 ) ) )
1133 IF( vl.GE.vu ) vu = max( vu*2, vu+vl+half )
1138 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
1139 CALL dgesvdx(
'V',
'V',
'V', m, n, a, lda,
1140 $ vl, vu, il, iu, nsv, s, u, ldu,
1141 $ vt, ldvt, work, lwork, iwork,
1143 IF( iinfo.NE.0 )
THEN
1144 WRITE( nout, fmt = 9995 )
'GESVDX', iinfo, m, n,
1145 $ jtype, lswork, ioldsd
1153 CALL dbdt05( m, n, asav, lda, s, nsv, u, ldu,
1154 $ vt, ldvt, work, result( 33 ) )
1155 CALL dort01(
'Columns', m, nsv, u, ldu, work, lwork,
1157 CALL dort01(
'Rows', nsv, n, vt, ldvt, work, lwork,
1163 IF( result( j ).GE.thresh )
THEN
1164 IF( nfail.EQ.0 )
THEN
1165 WRITE( nout, fmt = 9999 )
1166 WRITE( nout, fmt = 9998 )
1168 WRITE( nout, fmt = 9997 )m, n, jtype, iws, ioldsd,
1180 CALL alasvm( path, nout, nfail, ntest, 0 )
1182 9999
FORMAT(
' SVD -- Real Singular Value Decomposition Driver ',
1183 $ /
' Matrix types (see DDRVBD for details):',
1184 $ / /
' 1 = Zero matrix', /
' 2 = Identity matrix',
1185 $ /
' 3 = Evenly spaced singular values near 1',
1186 $ /
' 4 = Evenly spaced singular values near underflow',
1187 $ /
' 5 = Evenly spaced singular values near overflow', / /
1188 $
' Tests performed: ( A is dense, U and V are orthogonal,',
1189 $ / 19x,
' S is an array, and Upartial, VTpartial, and',
1190 $ / 19x,
' Spartial are partially computed U, VT and S),', / )
1191 9998
FORMAT(
' 1 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1192 $ /
' 2 = | I - U**T U | / ( M ulp ) ',
1193 $ /
' 3 = | I - VT VT**T | / ( N ulp ) ',
1194 $ /
' 4 = 0 if S contains min(M,N) nonnegative values in',
1195 $
' decreasing order, else 1/ulp',
1196 $ /
' 5 = | U - Upartial | / ( M ulp )',
1197 $ /
' 6 = | VT - VTpartial | / ( N ulp )',
1198 $ /
' 7 = | S - Spartial | / ( min(M,N) ulp |S| )',
1199 $ /
' 8 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1200 $ /
' 9 = | I - U**T U | / ( M ulp ) ',
1201 $ /
'10 = | I - VT VT**T | / ( N ulp ) ',
1202 $ /
'11 = 0 if S contains min(M,N) nonnegative values in',
1203 $
' decreasing order, else 1/ulp',
1204 $ /
'12 = | U - Upartial | / ( M ulp )',
1205 $ /
'13 = | VT - VTpartial | / ( N ulp )',
1206 $ /
'14 = | S - Spartial | / ( min(M,N) ulp |S| )',
1207 $ /
'15 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1208 $ /
'16 = | I - U**T U | / ( M ulp ) ',
1209 $ /
'17 = | I - VT VT**T | / ( N ulp ) ',
1210 $ /
'18 = 0 if S contains min(M,N) nonnegative values in',
1211 $
' decreasing order, else 1/ulp',
1212 $ /
'19 = | U - Upartial | / ( M ulp )',
1213 $ /
'20 = | VT - VTpartial | / ( N ulp )',
1214 $ /
'21 = | S - Spartial | / ( min(M,N) ulp |S| )',
1215 $ /
'22 = 0 if S contains min(M,N) nonnegative values in',
1216 $
' decreasing order, else 1/ulp',
1217 $ /
'23 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ),',
1218 $
' DGESVDX(V,V,A) ',
1219 $ /
'24 = | I - U**T U | / ( M ulp ) ',
1220 $ /
'25 = | I - VT VT**T | / ( N ulp ) ',
1221 $ /
'26 = 0 if S contains min(M,N) nonnegative values in',
1222 $
' decreasing order, else 1/ulp',
1223 $ /
'27 = | U - Upartial | / ( M ulp )',
1224 $ /
'28 = | VT - VTpartial | / ( N ulp )',
1225 $ /
'29 = | S - Spartial | / ( min(M,N) ulp |S| )',
1226 $ /
'30 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp ),',
1227 $
' DGESVDX(V,V,I) ',
1228 $ /
'31 = | I - U**T U | / ( M ulp ) ',
1229 $ /
'32 = | I - VT VT**T | / ( N ulp ) ',
1230 $ /
'33 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp ),',
1231 $
' DGESVDX(V,V,V) ',
1232 $ /
'34 = | I - U**T U | / ( M ulp ) ',
1233 $ /
'35 = | I - VT VT**T | / ( N ulp ) ',
1234 $
' DGESVDQ(H,N,N,A,A',
1235 $ /
'36 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1236 $ /
'37 = | I - U**T U | / ( M ulp ) ',
1237 $ /
'38 = | I - VT VT**T | / ( N ulp ) ',
1238 $ /
'39 = 0 if S contains min(M,N) nonnegative values in',
1239 $
' decreasing order, else 1/ulp',
1241 9997
FORMAT(
' M=', i5,
', N=', i5,
', type ', i1,
', IWS=', i1,
1242 $
', seed=', 4( i4,
',' ),
' test(', i2,
')=', g11.4 )
1243 9996
FORMAT(
' DDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1244 $ i6,
', N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
1246 9995
FORMAT(
' DDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1247 $ i6,
', N=', i6,
', JTYPE=', i6,
', LSWORK=', i6, / 9x,
1248 $
'ISEED=(', 3( i5,
',' ), i5,
')' )