363 SUBROUTINE ddrvbd( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
364 $ A, LDA, U, LDU, VT, LDVT, ASAV, USAV, VTSAV, S,
365 $ SSAV, E, WORK, LWORK, IWORK, NOUT, INFO )
374 INTEGER INFO, LDA, LDU, LDVT, LWORK, NOUT, NSIZES
376DOUBLE PRECISION THRESH
380 INTEGER ISEED( 4 ), IWORK( * ), MM( * ), NN( * )
381 DOUBLE PRECISION A( LDA, * ), ASAV( LDA, * ), E( * ), S( * ),
382 $ ssav( * ), u( ldu, * ), usav( ldu, * ),
383 $ vt( ldvt, * ), vtsav( ldvt, * ), work( * )
389 DOUBLE PRECISION ZERO, ONE, TWO, HALF
390 PARAMETER ( = 0.0d0, one = 1.0d0, two = 2.0d0,
393 PARAMETER ( MAXTYP = 5 )
397 CHARACTER , JOBU, JOBVT, RANGE
399 INTEGER , IINFO, IJQ, IJU, IJVT, IL,IU, IWS, IWTMP,
400 $ itemp, j, jsize, jtype, lswork, m, minwrk,
401 $ mmax, mnmax, mnmin, mtypes, n, nfail,
402 $ nmax, ns, nsi, nsv, ntest
403 DOUBLE PRECISION ANORM, DIF, DIV, OVFL, RTUNFL, ULP,
404 $ ULPINV, UNFL, VL, VU
407 INTEGER LIWORK, , NUMRANK
410 DOUBLE PRECISION ( 2 )
413 CHARACTER CJOB( 4 ), CJOBR( 3 ), CJOBV( 2 )
414 INTEGER IOLDSD( 4 ), ISEED2( 4 )
415 DOUBLE PRECISION RESULT( 39 )
418 DOUBLE PRECISION , DLARND
419 EXTERNAL DLAMCH, DLARND
427 INTRINSIC abs, dble, int,
max,
min
435 COMMON / infoc / infot, nunit, ok, lerr
436 COMMON / srnamc / srnamt
439 DATA cjob /
'N',
'O',
'S',
'A' /
440 DATA cjobr /
'A',
'V',
'I' /
441 DATA cjobv /
'N',
'V' /
455 mmax =
max( mmax, mm( j ) )
458 nmax =
max( nmax, nn( j ) )
461 mnmax =
max( mnmax,
min( mm( j ), nn( j ) ) )
462 minwrk =
max( minwrk,
max( 3*
min( mm( j ),
463 $ nn( j ) )+
max( mm( j ), nn( j ) ), 5*
min( mm( j ),
464 $ nn( j )-4 ) )+2*
min( mm( j ), nn( j ) )**2 )
469 IF( nsizes.LT.0 )
THEN
471 ELSE IF( badmm )
THEN
473 ELSE IF( badnn )
THEN
475 ELSE IF( ntypes.LT.0 )
THEN
477 ELSE IF( lda.LT.
max( 1, mmax ) )
THEN
479 ELSE IF( ldu.LT.
max( 1, mmax ) )
THEN
481 ELSE IF( ldvt.LT.
max( 1, nmax ) )
THEN
483 ELSE IF( minwrk.GT.lwork )
THEN
488 CALL xerbla(
'DDRVBD', -info )
494 path( 1: 1 ) =
'Double precision'
498 unfl = dlamch(
'Safe minimum' )
501 ulp = dlamch(
'Precision' )
502 rtunfl = sqrt( unfl )
508 DO 240 jsize = 1, nsizes
513 IF( nsizes.NE.1 )
THEN
514 mtypes =
min( maxtyp, ntypes )
516 mtypes =
min( maxtyp+1, ntypes )
519 DO 230 jtype = 1, mtypes
520 IF( .NOT.dotype( jtype ) )
524 ioldsd( j ) = iseed( j )
529 IF( mtypes.GT.maxtyp )
532 IF( jtype.EQ.1 )
THEN
536 CALL dlaset(
'Full', m, n, zero, zero, a, lda )
538 ELSE IF( jtype.EQ.2 )
THEN
542 CALL dlaset(
'Full', m, n, zero, one, a, lda )
554 CALL dlatms( m, n,
'U', iseed,
'N', s, 4, dble( mnmin ),
555 $ anorm, m-1, n-1,
'N', a, lda, work, iinfo )
556 IF( iinfo.NE.0 )
THEN
557 WRITE( nout, fmt = 9996 )
'Generator', iinfo, m, n,
565 CALL dlacpy( 'f
', M, N, A, LDA, ASAV, LDA )
577 IWTMP = MAX( 3*MIN( M, N )+MAX( M, N ), 5*MIN( M, N ) )
578 LSWORK = IWTMP + ( IWS-1 )*( LWORK-IWTMP ) / 3
579 LSWORK = MIN( LSWORK, LWORK )
580 LSWORK = MAX( LSWORK, 1 )
585 $ CALL DLACPY( 'f
', M, N, ASAV, LDA, A, LDA )
587 CALL DGESVD( 'a
', 'a
', M, N, A, LDA, SSAV, USAV, LDU,
588 $ VTSAV, LDVT, WORK, LSWORK, IINFO )
589.NE.
IF( IINFO0 ) THEN
590 WRITE( NOUT, FMT = 9995 )'gesvd
', IINFO, M, N, JTYPE,
598 CALL DBDT01( M, N, 0, ASAV, LDA, USAV, LDU, SSAV, E,
599 $ VTSAV, LDVT, WORK, RESULT( 1 ) )
600.NE..AND..NE.
IF( M0 N0 ) THEN
601 CALL DORT01( 'columns
', M, M, USAV, LDU, WORK, LWORK,
603 CALL DORT01( 'rows
', N, N, VTSAV, LDVT, WORK, LWORK,
607 DO 50 I = 1, MNMIN - 1
608.LT.
IF( SSAV( I )SSAV( I+1 ) )
609 $ RESULT( 4 ) = ULPINV
610.LT.
IF( SSAV( I )ZERO )
611 $ RESULT( 4 ) = ULPINV
613.GE.
IF( MNMIN1 ) THEN
614.LT.
IF( SSAV( MNMIN )ZERO )
615 $ RESULT( 4 ) = ULPINV
625.EQ..AND..EQ..OR.
IF( ( IJU3 IJVT3 )
626.EQ..AND..EQ.
$ ( IJU1 IJVT1 ) )GO TO 70
628 JOBVT = CJOB( IJVT+1 )
629 CALL DLACPY( 'f
', M, N, ASAV, LDA, A, LDA )
631 CALL DGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU,
632 $ VT, LDVT, WORK, LSWORK, IINFO )
637.GT..AND..GT.
IF( M0 N0 ) THEN
639 CALL DORT03( 'c
', M, MNMIN, M, MNMIN, USAV,
640 $ LDU, A, LDA, WORK, LWORK, DIF,
642.EQ.
ELSE IF( IJU2 ) THEN
643 CALL DORT03( 'c
', M, MNMIN, M, MNMIN, USAV,
644 $ LDU, U, LDU, WORK, LWORK, DIF,
646.EQ.
ELSE IF( IJU3 ) THEN
647 CALL DORT03( 'c
', M, M, M, MNMIN, USAV, LDU,
648 $ U, LDU, WORK, LWORK, DIF,
652 RESULT( 5 ) = MAX( RESULT( 5 ), DIF )
657.GT..AND..GT.
IF( M0 N0 ) THEN
659 CALL DORT03( 'r
', N, MNMIN, N, MNMIN, VTSAV,
660 $ LDVT, A, LDA, WORK, LWORK, DIF,
662.EQ.
ELSE IF( IJVT2 ) THEN
663 CALL DORT03( 'r
', N, MNMIN, N, MNMIN, VTSAV,
664 $ LDVT, VT, LDVT, WORK, LWORK,
666.EQ.
ELSE IF( IJVT3 ) THEN
667 CALL DORT03( 'r
', N, N, N, MNMIN, VTSAV,
668 $ LDVT, VT, LDVT, WORK, LWORK,
672 RESULT( 6 ) = MAX( RESULT( 6 ), DIF )
677 DIV = MAX( MNMIN*ULP*S( 1 ), UNFL )
678 DO 60 I = 1, MNMIN - 1
679.LT.
IF( SSAV( I )SSAV( I+1 ) )
681.LT.
IF( SSAV( I )ZERO )
683 DIF = MAX( DIF, ABS( SSAV( I )-S( I ) ) / DIV )
685 RESULT( 7 ) = MAX( RESULT( 7 ), DIF )
691 IWTMP = 5*MNMIN*MNMIN + 9*MNMIN + MAX( M, N )
692 LSWORK = IWTMP + ( IWS-1 )*( LWORK-IWTMP ) / 3
693 LSWORK = MIN( LSWORK, LWORK )
694 LSWORK = MAX( LSWORK, 1 )
698 CALL DLACPY( 'f
', M, N, ASAV, LDA, A, LDA )
700 CALL DGESDD( 'a
', M, N, A, LDA, SSAV, USAV, LDU, VTSAV,
701 $ LDVT, WORK, LSWORK, IWORK, IINFO )
702.NE.
IF( IINFO0 ) THEN
703 WRITE( NOUT, FMT = 9995 )'gesdd
', IINFO, M, N, JTYPE,
711 CALL DBDT01( M, N, 0, ASAV, LDA, USAV, LDU, SSAV, E,
712 $ VTSAV, LDVT, WORK, RESULT( 8 ) )
713.NE..AND..NE.
IF( M0 N0 ) THEN
714 CALL DORT01( 'columns
', M, M, USAV, LDU, WORK, LWORK,
716 CALL DORT01( 'rows
', N, N, VTSAV, LDVT, WORK, LWORK,
720 DO 90 I = 1, MNMIN - 1
721.LT.
IF( SSAV( I )SSAV( I+1 ) )
722 $ RESULT( 11 ) = ULPINV
723.LT.
IF( SSAV( I )ZERO )
724 $ RESULT( 11 ) = ULPINV
726.GE.
IF( MNMIN1 ) THEN
727.LT.
IF( SSAV( MNMIN )ZERO )
728 $ RESULT( 11 ) = ULPINV
738 CALL DLACPY( 'f
', M, N, ASAV, LDA, A, LDA )
740 CALL DGESDD( JOBQ, M, N, A, LDA, S, U, LDU, VT, LDVT,
741 $ WORK, LSWORK, IWORK, IINFO )
746.GT..AND..GT.
IF( M0 N0 ) THEN
749 CALL DORT03( 'c
', M, MNMIN, M, MNMIN, USAV,
750 $ LDU, A, LDA, WORK, LWORK, DIF,
753 CALL DORT03( 'c
', M, MNMIN, M, MNMIN, USAV,
754 $ LDU, U, LDU, WORK, LWORK, DIF,
757.EQ.
ELSE IF( IJQ2 ) THEN
758 CALL DORT03( 'c
', M, MNMIN, M, MNMIN, USAV, LDU,
759 $ U, LDU, WORK, LWORK, DIF, INFO )
762 RESULT( 12 ) = MAX( RESULT( 12 ), DIF )
767.GT..AND..GT.
IF( M0 N0 ) THEN
770 CALL DORT03( 'r
', N, MNMIN, N, MNMIN, VTSAV,
771 $ LDVT, VT, LDVT, WORK, LWORK,
774 CALL DORT03( 'r', n, mnmin, n, mnmin, vtsav,
775 $ ldvt, a, lda, work, lwork, dif,
778 ELSE IF( ijq.EQ.2 )
THEN
779 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
780 $ ldvt, vt, ldvt, work, lwork, dif,
784 result( 13 ) =
max( result( 13 ), dif )
789 div =
max( mnmin*ulp*s( 1 ), unfl )
790 DO 100 i = 1, mnmin - 1
791 IF( ssav( i ).LT.ssav( i+1 ) )
793 IF( ssav( i ).LT.zero )
795 dif =
max( dif, abs( ssav( i )-s( i ) ) / div )
797 result( 14 ) =
max( result( 14 ), dif )
809 iwtmp = 5*mnmin*mnmin + 9*mnmin +
max( m, n )
810 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
811 lswork =
min( lswork, lwork )
812 lswork =
max( lswork, 1 )
816 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
821 CALL dgesvdq(
'H',
'N',
'N',
'A',
'A',
822 $ m, n, a, lda, ssav, usav, ldu,
823 $ vtsav, ldvt, numrank, iwork, liwork,
824 $ work, lwork, rwork, lrwork, iinfo )
826 IF( iinfo.NE.0 )
THEN
827 WRITE( nout, fmt = 9995 )
'DGESVDQ', iinfo, m, n,
828 $ jtype, lswork, ioldsd
835 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
836 $ vtsav, ldvt, work, result( 36 ) )
837 IF( m.NE.0 .AND. n.NE.0 )
THEN
838 CALL dort01(
'Columns', m, m, usav, ldu, work,
839 $ lwork, result( 37 ) )
840 CALL dort01(
'Rows', n, n, vtsav, ldvt, work,
841 $ lwork, result( 38 ) )
844 DO 199 i = 1, mnmin - 1
845 IF( ssav( i ).LT.ssav( i+1 ) )
846 $ result( 39 ) = ulpinv
847 IF( ssav( i ).LT.zero )
848 $ result( 39 ) = ulpinv
850 IF( mnmin.GE.1 )
THEN
851 IF( ssav( mnmin ).LT.zero )
852 $ result( 39 ) = ulpinv
865 iwtmp = 5*mnmin*mnmin + 9*mnmin +
max( m, n )
866 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
867 lswork =
min( lswork, lwork )
868 lswork =
max( lswork, 1 )
872 CALL dlacpy(
'F', m, n, asav, lda, usav, lda )
874 CALL dgesvj(
'G',
'U',
'V', m, n, usav, lda, ssav,
875 & 0, a, ldvt, work, lwork, info )
885 IF( iinfo.NE.0 )
THEN
886 WRITE( nout, fmt = 9995 )
'GESVJ', iinfo, m, n,
887 $ jtype, lswork, ioldsd
894 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
895 $ vtsav, ldvt, work, result( 15 ) )
896 IF( m.NE.0 .AND. n.NE.0 )
THEN
897 CALL dort01(
'Columns', m, m, usav, ldu, work,
898 $ lwork, result( 16 ) )
899 CALL dort01(
'Rows', n, n, vtsav, ldvt, work,
900 $ lwork, result( 17 ) )
903 DO 120 i = 1, mnmin - 1
904 IF( ssav( i ).LT.ssav( i+1 ) )
905 $ result( 18 ) = ulpinv
906 IF( ssav( i ).LT.zero )
907 $ result( 18 ) = ulpinv
909 IF( mnmin.GE.1 )
THEN
910 IF( ssav( mnmin ).LT.zero )
911 $ result( 18 ) = ulpinv
923 iwtmp = 5*mnmin*mnmin + 9*mnmin +
max( m, n )
924 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
925 lswork =
min( lswork, lwork )
926 lswork =
max( lswork, 1 )
930 CALL dlacpy(
'F', m, n, asav, lda, vtsav, lda )
932 CALL dgejsv(
'G', 'u
', 'v
', 'r
', 'n',
'N',
933 & m, n, vtsav, lda, ssav, usav, ldu, a, ldvt,
934 & work, lwork, iwork, info )
944 IF( iinfo.NE.0 )
THEN
945 WRITE( nout, fmt = 9995 )
'GEJSV', iinfo, m, n,
946 $ jtype, lswork, ioldsd
953 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
954 $ vtsav, ldvt, work, result( 19 ) )
955 IF( m.NE.0 .AND. n.NE.0 )
THEN
956 CALL dort01(
'Columns', m, m, usav, ldu, work,
957 $ lwork, result( 20 ) )
958 CALL dort01(
'Rows', n, n, vtsav, ldvt, work,
959 $ lwork, result( 21 ) )
962 DO 150 i = 1, mnmin - 1
963 IF( ssav( i ).LT.ssav( i+1 ) )
964 $ result( 22 ) = ulpinv
965 IF( ssav( i ).LT.zero )
966 $ result( 22 ) = ulpinv
968 IF( mnmin.GE.1 )
THEN
969 IF( ssav( mnmin ).LT.zero )
970 $ result( 22 ) = ulpinv
976 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
977 CALL dgesvdx( 'v
', 'v
', 'a
', M, N, A, LDA,
978 $ VL, VU, IL, IU, NS, SSAV, USAV, LDU,
979 $ VTSAV, LDVT, WORK, LWORK, IWORK,
981.NE.
IF( IINFO0 ) THEN
982 WRITE( NOUT, FMT = 9995 )'gesvdx
', IINFO, M, N,
983 $ JTYPE, LSWORK, IOLDSD
993 CALL DBDT01( M, N, 0, ASAV, LDA, USAV, LDU, SSAV, E,
994 $ VTSAV, LDVT, WORK, RESULT( 23 ) )
995.NE..AND..NE.
IF( M0 N0 ) THEN
996 CALL DORT01( 'columns', m, m, usav, ldu, work, lwork,
998 CALL dort01(
'Rows', n, n, vtsav, ldvt, work, lwork,
1002 DO 160 i = 1, mnmin - 1
1003 IF( ssav( i ).LT.ssav( i+1 ) )
1004 $ result( 26 ) = ulpinv
1005 IF( ssav( i ).LT.zero )
1006 $ result( 26 ) = ulpinv
1008 IF( mnmin.GE.1 )
THEN
1009 IF( ssav( mnmin ).LT.zero )
1020 IF( ( iju.EQ.0 .AND. ijvt.EQ.0 ) .OR.
1021 $ ( iju.EQ.1 .AND. ijvt.EQ.1 ) )
GO TO 170
1022 jobu = cjobv( iju+1 )
1023 jobvt = cjobv( ijvt+1 )
1025 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
1026 CALL dgesvdx( jobu, jobvt, range, m, n, a, lda,
1027 $ vl, vu, il, iu, ns, s, u, ldu,
1028 $ vt, ldvt, work, lwork, iwork,
1034 IF( m.GT.0 .AND. n.GT.0 )
THEN
1036 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
1037 $ ldu, u, ldu, work, lwork, dif,
1041 result( 27 ) =
max( result( 27 ), dif )
1046 IF( m.GT.0 .AND. n.GT.0 )
THEN
1047 IF( ijvt.EQ.1 )
THEN
1048 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
1049 $ ldvt, vt, ldvt, work, lwork,
1053 result( 28 ) =
max( result( 28 ), dif )
1058 div =
max( mnmin*ulp*s( 1 ), unfl )
1059 DO 190 i = 1, mnmin - 1
1060 IF( ssav( i ).LT.ssav( i+1 ) )
1062 IF( ssav( i ).LT.zero )
1064 dif =
max( dif, abs( ssav( i )-s( i ) ) / div )
1066 result( 29 ) =
max( result( 29 ), dif )
1073 iseed2( i ) = iseed( i )
1075 IF( mnmin.LE.1 )
THEN
1077 iu =
max( 1, mnmin )
1079 il = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1080 iu = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1087 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
1088 CALL dgesvdx(
'V',
'V',
'I', m, n, a, lda,
1089 $ vl, vu, il, iu, nsi, s, u, ldu,
1090 $ vt, ldvt, work, lwork, iwork,
1092 IF( iinfo.NE.0 )
THEN
1093 WRITE( nout, fmt = 9995 )
'GESVDX', iinfo, m, n,
1094 $ jtype, lswork, ioldsd
1102 CALL dbdt05( m, n, asav, lda, s, nsi, u, ldu,
1103 $ vt, ldvt, work, result( 30 ) )
1104 CALL dort01(
'Columns', m, nsi, u, ldu, work, lwork,
1106 CALL dort01(
'Rows', nsi, n, vt, ldvt, work, lwork,
1111 IF( mnmin.GT.0 .AND. nsi.GT.1 )
THEN
1114 $
max( half*abs( ssav( il )-ssav( il-1 ) ),
1115 $ ulp*anorm, two*rtunfl )
1118 $
max( half*abs( ssav( ns )-ssav( 1 ) ),
1119 $ ulp*anorm, two*rtunfl )
1122 vl = ssav( iu ) -
max( ulp*anorm, two*rtunfl,
1123 $ half*abs( ssav( iu+1 )-ssav( iu ) ) )
1125 vl = ssav( ns ) -
max( ulp*anorm, two*rtunfl,
1126 $ half*abs( ssav( ns )-ssav( 1 ) ) )
1130 IF( vl.GE.vu ) vu =
max( vu*2, vu+vl+half )
1135 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
1136 CALL dgesvdx(
'V',
'V',
'V', m, n, a, lda,
1137 $ vl, vu, il, iu, nsv, s, u, ldu,
1138 $ vt, ldvt, work, lwork, iwork,
1140 IF( iinfo.NE.0 )
THEN
1141 WRITE( nout, fmt = 9995 )
'GESVDX', iinfo, m, n,
1142 $ jtype, lswork, ioldsd
1150 CALL dbdt05( m, n, asav, lda, s, nsv, u, ldu,
1151 $ vt, ldvt, work, result( 33 ) )
1152 CALL dort01(
'Columns', m, nsv, u, ldu, work, lwork,
1154 CALL dort01(
'Rows', nsv, n, vt, ldvt, work, lwork,
1160 IF( result( j ).GE.thresh )
THEN
1161 IF( nfail.EQ.0 )
THEN
1162 WRITE( nout, fmt = 9999 )
1163 WRITE( nout, fmt = 9998 )
1165 WRITE( nout, fmt = 9997 )m, n, jtype, iws, ioldsd,
1177 CALL alasvm( path, nout, nfail, ntest, 0 )
1179 9999
FORMAT(
' SVD -- Real Singular Value Decomposition Driver ',
1180 $ /
' Matrix types (see DDRVBD for details):',
1181 $ / /
' 1 = Zero matrix', /
' 2 = Identity matrix',
1182 $ /
' 3 = Evenly spaced singular values near 1',
1183 $ /
' 4 = Evenly spaced singular values near underflow',
1184 $ /
' 5 = Evenly spaced singular values near overflow', / /
1185 $
' Tests performed: ( A is dense, U and V are orthogonal,',
1186 $ / 19x,
' S is an array, and Upartial, VTpartial, and',
1187 $ / 19x,
' Spartial are partially computed U, VT and S),', / )
1188 9998
FORMAT(
' 1 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1189 $ /
' 2 = | I - U**T U | / ( M ulp ) ',
1190 $ /
' 3 = | I - VT VT**T | / ( N ulp ) ',
1191 $ /
' 4 = 0 if S contains min(M,N) nonnegative values in',
1192 $
' decreasing order, else 1/ulp',
1193 $ /
' 5 = | U - Upartial | / ( M ulp )',
1194 $ /
' 6 = | VT - VTpartial | / ( N ulp )',
1195 $ /
' 7 = | S - Spartial | / ( min(M,N) ulp |S| )',
1196 $ /
' 8 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1197 $ /
' 9 = | I - U**T U | / ( M ulp ) ',
1198 $ /
'10 = | I - VT VT**T | / ( N ulp ) ',
1199 $ /
'11 = 0 if S contains min(M,N) nonnegative values in',
1200 $
' decreasing order, else 1/ulp',
1201 $ /
'12 = | U - Upartial | / ( M ulp )',
1202 $ /
'13 = | VT - VTpartial | / ( N ulp )',
1203 $ /
'14 = | S - Spartial | / ( min(M,N) ulp |S| )',
1204 $ /
'15 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1205 $ /
'16 = | I - U**T U | / ( M ulp ) ',
1206 $ /
'17 = | I - VT VT**T | / ( N ulp ) ',
1207 $ /
'18 = 0 if S contains min(M,N) nonnegative values in',
1208 $
' decreasing order, else 1/ulp',
1209 $ /
'19 = | U - Upartial | / ( M ulp )',
1210 $ /
'20 = | VT - VTpartial | / ( N ulp )',
1211 $ /
'21 = | S - Spartial | / ( min(M,N) ulp |S| )',
1212 $ /
'22 = 0 if S contains min(M,N) nonnegative values in',
1213 $
' decreasing order, else 1/ulp',
1214 $ /
'23 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ),',
1215 $
' DGESVDX(V,V,A) ',
1216 $ /
'24 = | I - U**T U | / ( M ulp ) ',
1217 $ /
'25 = | I - VT VT**T | / ( N ulp ) ',
1218 $ /
'26 = 0 if S contains min(M,N) nonnegative values in',
1219 $
' decreasing order, else 1/ulp',
1220 $ /
'27 = | U - Upartial | / ( M ulp )',
1221 $ /
'28 = | VT - VTpartial | / ( N ulp )',
1222 $ /
'29 = | S - Spartial | / ( min(M,N) ulp |S| )',
1223 $ /
'30 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp ),',
1224 $
' DGESVDX(V,V,I) ',
1225 $ /
'31 = | I - U**T U | / ( M ulp ) ',
1226 $ /
'32 = | I - VT VT**T | / ( N ulp ) ',
1227 $ /
'33 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp ),',
1228 $
' DGESVDX(V,V,V) ',
1229 $ /
'34 = | I - U**T U | / ( M ulp ) ',
1230 $ /
'35 = | I - VT VT**T | / ( N ulp ) ',
1231 $
' DGESVDQ(H,N,N,A,A',
1232 $ /
'36 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1233 $ /
'37 = | I - U**T U | / ( M ulp ) ',
1234 $ /
'38 = | I - VT VT**T | / ( N ulp ) ',
1235 $ /
'39 = 0 if S contains min(M,N) nonnegative values in',
1236 $
' decreasing order, else 1/ulp',
1238 9997
FORMAT(
' M=', i5,
', N=', i5,
', type ', i1,
', IWS=', i1,
1239 $
', seed=', 4( i4,
',' ),
' test(', i2,
')=', g11.4 )
1240 9996
FORMAT(
' DDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1241 $ i6,
', N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
1243 9995
FORMAT(
' DDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1244 $ i6,
', N=', i6,
', JTYPE=', i6,
', LSWORK=', i6, / 9x,
1245 $
'ISEED=(', 3( i5,
',' ), i5,
')' )