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 ( ZERO = 0.0d0, one = 1.0d0, two = 2.0d0,
393 PARAMETER ( MAXTYP = 5 )
397 CHARACTER JOBQ, JOBU, JOBVT, RANGE
399 INTEGER I, 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, LRWORK, NUMRANK
410 DOUBLE PRECISION RWORK( 2 )
413 CHARACTER CJOB( 4 ), CJOBR( 3 ), CJOBV( 2 )
414 INTEGER IOLDSD( 4 ), ISEED2( 4 )
415 DOUBLE PRECISION RESULT( 39 )
418 DOUBLE PRECISION DLAMCH, 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.LT.
IF( NSIZES0 ) THEN
471 ELSE IF( BADMM ) THEN
473 ELSE IF( BADNN ) THEN
475.LT.
ELSE IF( NTYPES0 ) THEN
477.LT.
ELSE IF( LDAMAX( 1, MMAX ) ) THEN
479.LT.
ELSE IF( LDUMAX( 1, MMAX ) ) THEN
481.LT.
ELSE IF( LDVTMAX( 1, NMAX ) ) THEN
483.GT.
ELSE IF( MINWRKLWORK ) THEN
488 CALL XERBLA( 'ddrvbd', -INFO )
494 PATH( 1: 1 ) = 'double precision
'
498 UNFL = DLAMCH( 'safe minimum
' )
500 CALL DLABAD( UNFL, OVFL )
501 ULP = DLAMCH( 'precision
' )
502 RTUNFL = SQRT( UNFL )
508 DO 240 JSIZE = 1, NSIZES
513.NE.
IF( NSIZES1 ) THEN
514 MTYPES = MIN( MAXTYP, NTYPES )
516 MTYPES = MIN( MAXTYP+1, NTYPES )
519 DO 230 JTYPE = 1, MTYPES
520.NOT.
IF( DOTYPE( JTYPE ) )
524 IOLDSD( J ) = ISEED( J )
529.GT.
IF( MTYPESMAXTYP )
532.EQ.
IF( JTYPE1 ) THEN
536 CALL DLASET( 'full
', M, N, ZERO, ZERO, A, LDA )
538.EQ.
ELSE IF( JTYPE2 ) 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.NE.
IF( IINFO0 ) 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.EQ.
ELSE IF( IJQ2 ) 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 IF( iinfo.NE.0 )
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 IF( m.NE.0 .AND. n.NE.0 )
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 )
1010 $ result( 26 ) = ulpinv
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,
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.GE.
IF( RESULT( J )THRESH ) THEN
1161.EQ.
IF( NFAIL0 ) 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 ),
',
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 ),
',
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 ),
',
1229 $ / '34 = | i - u**t u | / ( m ulp )
',
1230 $ / '35 = | i - vt vt**t | / ( n ulp )
',
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, ')
' )