489 SUBROUTINE dchkbd( NSIZES, MVAL, NVAL, NTYPES, DOTYPE, NRHS,
490 $ ISEED, THRESH, A, LDA, BD, BE, S1, S2, X, LDX,
491 $ Y, Z, Q, LDQ, PT, LDPT, U, VT, WORK, LWORK,
492 $ IWORK, NOUT, INFO )
499 INTEGER INFO, LDA, LDPT, LDQ, LDX, LWORK, NOUT, NRHS,
501 DOUBLE PRECISION THRESH
505 INTEGER ISEED( 4 ), IWORK( * ), MVAL( * ), NVAL( * )
506 DOUBLE PRECISION A( LDA, * ), BD( * ), BE( * ), PT( LDPT, * ),
507 $ q( ldq, * ), s1( * ), s2( * ), u( ldpt, * ),
508 $ vt( ldpt, * ), work( * ), x( ldx, * ),
509 $ y( ldx, * ), z( ldx, * )
515 DOUBLE PRECISION ZERO, ONE, TWO, HALF
516 PARAMETER ( ZERO = 0.0d0, one = 1.0d0, two = 2.0d0,
519 parameter( maxtyp = 16 )
522 LOGICAL BADMM, BADNN, BIDIAG
525 INTEGER I, IINFO, IL, IMODE, ITEMP, ITYPE, IU, IWBD,
526 $ iwbe, iwbs, iwbz, iwwork, j, jcol, jsize,
527 $ jtype, log2ui, m, minwrk, mmax, mnmax, mnmin,
528 $ mnmin2, mq, mtypes, n, nfail, nmax,
530 DOUBLE PRECISION ABSTOL, AMNINV, ANORM, COND, OVFL, RTOVFL,
531 $ RTUNFL, TEMP1, TEMP2, ULP, ULPINV, UNFL,
535 INTEGER IDUM( 1 ), IOLDSD( 4 ), ISEED2( 4 ),
536 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
538 DOUBLE PRECISION DUM( 1 ), DUMMA( 1 ), RESULT( 40 )
541 DOUBLE PRECISION DLAMCH, DLARND, DSXT1
542 EXTERNAL DLAMCH, DLARND, DSXT1
551 INTRINSIC abs, exp, int, log, max, min, sqrt
559 COMMON / infoc / infot, nunit, ok, lerr
560 COMMON / srnamc / srnamt
563 DATA ktype / 1, 2, 5*4, 5*6, 3*9, 10 /
564 DATA kmagn / 2*1, 3*1, 2, 3, 3*1, 2, 3, 1, 2, 3, 0 /
565 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
581 mmax = max( mmax, mval( j ) )
584 nmax = max( nmax, nval( j ) )
587 mnmax = max( mnmax, min( mval( j ), nval( j ) ) )
588 minwrk = max( minwrk, 3*( mval( j )+nval( j ) ),
589 $ mval( j )*( mval( j )+max( mval( j ), nval( j ),
590 $ nrhs )+1 )+nval( j )*min( nval( j ), mval( j ) ) )
595 IF( nsizes.LT.0 )
THEN
597 ELSE IF( badmm )
THEN
599 ELSE IF( badnn )
THEN
601 ELSE IF( ntypes.LT.0 )
THEN
603 ELSE IF( nrhs.LT.0 )
THEN
605 ELSE IF( lda.LT.mmax )
THEN
607 ELSE IF( ldx.LT.mmax )
THEN
609 ELSE IF( ldq.LT.mmax )
THEN
611 ELSE IF( ldpt.LT.mnmax )
THEN
613 ELSE IF( minwrk.GT.lwork )
THEN
618 CALL xerbla(
'DCHKBD', -info )
624 path( 1: 1 ) =
'Double precision'
628 unfl = dlamch(
'Safe minimum' )
629 ovfl = dlamch(
'Overflow' )
630 ulp = dlamch(
'Precision' )
632 log2ui = int( log( ulpinv ) / log( two ) )
633 rtunfl = sqrt( unfl )
634 rtovfl = sqrt( ovfl )
640 DO 300 jsize = 1, nsizes
644 amninv = one / max( m, n, 1 )
646 IF( nsizes.NE.1 )
THEN
647 mtypes = min( maxtyp, ntypes )
649 mtypes = min( maxtyp+1, ntypes )
652 DO 290 jtype = 1, mtypes
653 IF( .NOT.dotype( jtype ) )
657 ioldsd( j ) = iseed( j )
682 IF( mtypes.GT.maxtyp )
685 itype = ktype( jtype )
686 imode = kmode( jtype )
690 GO TO ( 40, 50, 60 )kmagn( jtype )
697 anorm = ( rtovfl*ulp )*amninv
701 anorm = rtunfl*max( m, n )*ulpinv
706 CALL dlaset(
'Full', lda, n, zero, zero, a, lda )
711 IF( itype.EQ.1 )
THEN
717 ELSE IF( itype.EQ.2 )
THEN
721 DO 80 jcol = 1, mnmin
722 a( jcol, jcol ) = anorm
725 ELSE IF( itype.EQ.4 )
THEN
729 CALL dlatms( mnmin, mnmin,
'S', iseed,
'N', work, imode,
730 $ cond, anorm, 0, 0,
'N', a, lda,
731 $ work( mnmin+1 ), iinfo )
733 ELSE IF( itype.EQ.5 )
THEN
737 CALL dlatms( mnmin, mnmin,
'S', iseed,
'S', work, imode,
738 $ cond, anorm, m, n,
'N', a, lda,
739 $ work( mnmin+1 ), iinfo )
741 ELSE IF( itype.EQ.6 )
THEN
745 CALL dlatms( m, n,
'S', iseed,
'N', work, imode, cond,
746 $ anorm, m, n,
'N', a, lda, work( mnmin+1 ),
749 ELSE IF( itype.EQ.7 )
THEN
753 CALL dlatmr( mnmin, mnmin,
'S', iseed,
'N', work, 6, one,
754 $ one,
'T',
'N', work( mnmin+1 ), 1, one,
755 $ work( 2*mnmin+1 ), 1, one,
'N', iwork, 0, 0,
756 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
758 ELSE IF( itype.EQ.8 )
THEN
762 CALL dlatmr( mnmin, mnmin,
'S', iseed,
'S', work, 6, one,
763 $ one,
'T',
'N', work( mnmin+1 ), 1, one,
764 $ work( m+mnmin+1 ), 1, one,
'N', iwork, m, n,
765 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
767 ELSE IF( itype.EQ.9 )
THEN
771 CALL dlatmr( m, n,
'S', iseed,
'N', work, 6, one, one,
772 $
'T',
'N', work( mnmin+1 ), 1, one,
773 $ work( m+mnmin+1 ), 1, one,
'N', iwork, m, n,
774 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
776 ELSE IF( itype.EQ.10 )
THEN
780 temp1 = -two*log( ulp )
782 bd( j ) = exp( temp1*dlarnd( 2, iseed ) )
784 $ be( j ) = exp( temp1*dlarnd( 2, iseed ) )
798 IF( iinfo.EQ.0 )
THEN
803 CALL dlatmr( mnmin, nrhs,
'S', iseed,
'N', work, 6,
804 $ one, one,
'T',
'N', work( mnmin+1 ), 1,
805 $ one, work( 2*mnmin+1 ), 1, one,
'N',
806 $ iwork, mnmin, nrhs, zero, one,
'NO', y,
807 $ ldx, iwork, iinfo )
809 CALL dlatmr( m, nrhs,
'S', iseed,
'N', work, 6, one,
810 $ one,
'T',
'N', work( m+1 ), 1, one,
811 $ work( 2*m+1 ), 1, one,
'N', iwork, m,
812 $ nrhs, zero, one,
'NO', x, ldx, iwork,
819 IF( iinfo.NE.0 )
THEN
820 WRITE( nout, fmt = 9998 )
'Generator', iinfo, m, n,
830 IF( .NOT.bidiag )
THEN
835 CALL dlacpy(
' ', m, n, a, lda, q, ldq )
836 CALL dgebrd( m, n, q, ldq, bd, be, work, work( mnmin+1 ),
837 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
841 IF( iinfo.NE.0 )
THEN
842 WRITE( nout, fmt = 9998 )
'DGEBRD', iinfo, m, n,
848 CALL dlacpy(
' ', m, n, q, ldq, pt, ldpt )
860 CALL dorgbr(
'Q', m, mq, n, q, ldq, work,
861 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
865 IF( iinfo.NE.0 )
THEN
866 WRITE( nout, fmt = 9998 )
'DORGBR(Q)', iinfo, m, n,
874 CALL dorgbr(
'P', mnmin, n, m, pt, ldpt, work( mnmin+1 ),
875 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
879 IF( iinfo.NE.0 )
THEN
880 WRITE( nout, fmt = 9998 )
'DORGBR(P)', iinfo, m, n,
888 CALL dgemm(
'Transpose',
'No transpose', m, nrhs, m, one,
889 $ q, ldq, x, ldx, zero, y, ldx )
895 CALL dbdt01( m, n, 1, a, lda, q, ldq, bd, be, pt, ldpt,
896 $ work, result( 1 ) )
897 CALL dort01(
'Columns', m, mq, q, ldq, work, lwork,
899 CALL dort01(
'Rows', mnmin, n, pt, ldpt, work, lwork,
906 CALL dcopy( mnmin, bd, 1, s1, 1 )
908 $
CALL dcopy( mnmin-1, be, 1, work, 1 )
909 CALL dlacpy(
' ', m, nrhs, y, ldx, z, ldx )
910 CALL dlaset(
'Full', mnmin, mnmin, zero, one, u, ldpt )
911 CALL dlaset(
'Full', mnmin, mnmin, zero, one, vt, ldpt )
913 CALL dbdsqr( uplo, mnmin, mnmin, mnmin, nrhs, s1, work, vt,
914 $ ldpt, u, ldpt, z, ldx, work( mnmin+1 ), iinfo )
918 IF( iinfo.NE.0 )
THEN
919 WRITE( nout, fmt = 9998 )
'DBDSQR(vects)', iinfo, m, n,
922 IF( iinfo.LT.0 )
THEN
933 CALL dcopy( mnmin, bd, 1, s2, 1 )
935 $
CALL dcopy( mnmin-1, be, 1, work, 1 )
937 CALL dbdsqr( uplo, mnmin, 0, 0, 0, s2, work, vt, ldpt, u,
938 $ ldpt, z, ldx, work( mnmin+1 ), iinfo )
942 IF( iinfo.NE.0 )
THEN
943 WRITE( nout, fmt = 9998 )
'DBDSQR(values)', iinfo, m, n,
946 IF( iinfo.LT.0 )
THEN
959 CALL dbdt03( uplo, mnmin, 1, bd, be, u, ldpt, s1, vt, ldpt,
960 $ work, result( 4 ) )
961 CALL dbdt02( mnmin, nrhs, y, ldx, z, ldx, u, ldpt, work,
963 CALL dort01(
'Columns', mnmin, mnmin, u, ldpt, work, lwork,
965 CALL dort01(
'Rows', mnmin, mnmin, vt, ldpt, work, lwork,
972 DO 110 i = 1, mnmin - 1
973 IF( s1( i ).LT.s1( i+1 ) )
974 $ result( 8 ) = ulpinv
975 IF( s1( i ).LT.zero )
976 $ result( 8 ) = ulpinv
978 IF( mnmin.GE.1 )
THEN
979 IF( s1( mnmin ).LT.zero )
980 $ result( 8 ) = ulpinv
988 temp1 = abs( s1( j )-s2( j ) ) /
989 $ max( sqrt( unfl )*max( s1( 1 ), one ),
990 $ ulp*max( abs( s1( j ) ), abs( s2( j ) ) ) )
991 temp2 = max( temp1, temp2 )
999 temp1 = thresh*( half-ulp )
1001 DO 130 j = 0, log2ui
1009 result( 10 ) = temp1
1014 IF( .NOT.bidiag )
THEN
1015 CALL dcopy( mnmin, bd, 1, s2, 1 )
1017 $
CALL dcopy( mnmin-1, be, 1, work, 1 )
1019 CALL dbdsqr( uplo, mnmin, n, m, nrhs, s2, work, pt, ldpt,
1020 $ q, ldq, y, ldx, work( mnmin+1 ), iinfo )
1027 CALL dbdt01( m, n, 0, a, lda, q, ldq, s2, dumma, pt,
1028 $ ldpt, work, result( 11 ) )
1029 CALL dbdt02( m, nrhs, x, ldx, y, ldx, q, ldq, work,
1031 CALL dort01(
'Columns', m, mq, q, ldq, work, lwork,
1033 CALL dort01(
'Rows', mnmin, n, pt, ldpt, work, lwork,
1040 CALL dcopy( mnmin, bd, 1, s1, 1 )
1042 $
CALL dcopy( mnmin-1, be, 1, work, 1 )
1043 CALL dlaset(
'Full', mnmin, mnmin, zero, one, u, ldpt )
1044 CALL dlaset(
'Full', mnmin, mnmin, zero, one, vt, ldpt )
1046 CALL dbdsdc( uplo,
'I', mnmin, s1, work, u, ldpt, vt, ldpt,
1047 $ dum, idum, work( mnmin+1 ), iwork, iinfo )
1051 IF( iinfo.NE.0 )
THEN
1052 WRITE( nout, fmt = 9998 )
'DBDSDC(vects)', iinfo, m, n,
1055 IF( iinfo.LT.0 )
THEN
1058 result( 15 ) = ulpinv
1066 CALL dcopy( mnmin, bd, 1, s2, 1 )
1068 $
CALL dcopy( mnmin-1, be, 1, work, 1 )
1070 CALL dbdsdc( uplo,
'N', mnmin, s2, work, dum, 1, dum, 1,
1071 $ dum, idum, work( mnmin+1 ), iwork, iinfo )
1075 IF( iinfo.NE.0 )
THEN
1076 WRITE( nout, fmt = 9998 )
'DBDSDC(values)', iinfo, m, n,
1079 IF( iinfo.LT.0 )
THEN
1082 result( 18 ) = ulpinv
1091 CALL dbdt03( uplo, mnmin, 1, bd, be, u, ldpt, s1, vt, ldpt,
1092 $ work, result( 15 ) )
1093 CALL dort01(
'Columns', mnmin, mnmin, u, ldpt, work, lwork,
1095 CALL dort01(
'Rows', mnmin, mnmin, vt, ldpt, work, lwork,
1102 DO 150 i = 1, mnmin - 1
1103 IF( s1( i ).LT.s1( i+1 ) )
1104 $ result( 18 ) = ulpinv
1105 IF( s1( i ).LT.zero )
1106 $ result( 18 ) = ulpinv
1108 IF( mnmin.GE.1 )
THEN
1109 IF( s1( mnmin ).LT.zero )
1110 $ result( 18 ) = ulpinv
1118 temp1 = abs( s1( j )-s2( j ) ) /
1119 $ max( sqrt( unfl )*max( s1( 1 ), one ),
1120 $ ulp*max( abs( s1( 1 ) ), abs( s2( 1 ) ) ) )
1121 temp2 = max( temp1, temp2 )
1124 result( 19 ) = temp2
1130 IF( jtype.EQ.10 .OR. jtype.EQ.16 )
THEN
1134 result( 20:34 ) = zero
1142 iwwork = iwbz + 2*mnmin*(mnmin+1)
1143 mnmin2 = max( 1,mnmin*2 )
1145 CALL dcopy( mnmin, bd, 1, work( iwbd ), 1 )
1147 $
CALL dcopy( mnmin-1, be, 1, work( iwbe ), 1 )
1149 CALL dbdsvdx( uplo,
'V',
'A', mnmin, work( iwbd ),
1150 $ work( iwbe ), zero, zero, 0, 0, ns1, s1,
1151 $ work( iwbz ), mnmin2, work( iwwork ),
1156 IF( iinfo.NE.0 )
THEN
1157 WRITE( nout, fmt = 9998 )
'DBDSVDX(vects,A)', iinfo, m, n,
1160 IF( iinfo.LT.0 )
THEN
1163 result( 20 ) = ulpinv
1170 CALL dcopy( mnmin, work( j ), 1, u( 1,i ), 1 )
1172 CALL dcopy( mnmin, work( j ), 1, vt( i,1 ), ldpt )
1179 IF( jtype.EQ.9 )
THEN
1187 CALL dcopy( mnmin, bd, 1, work( iwbd ), 1 )
1189 $
CALL dcopy( mnmin-1, be, 1, work( iwbe ), 1 )
1191 CALL dbdsvdx( uplo,
'N',
'A', mnmin, work( iwbd ),
1192 $ work( iwbe ), zero, zero, 0, 0, ns2, s2,
1193 $ work( iwbz ), mnmin2, work( iwwork ),
1198 IF( iinfo.NE.0 )
THEN
1199 WRITE( nout, fmt = 9998 )
'DBDSVDX(values,A)', iinfo,
1200 $ m, n, jtype, ioldsd
1202 IF( iinfo.LT.0 )
THEN
1205 result( 24 ) = ulpinv
1212 CALL dcopy( mnmin, s1, 1, work( iwbs ), 1 )
1221 CALL dbdt03( uplo, mnmin, 1, bd, be, u, ldpt, s1, vt,
1222 $ ldpt, work( iwbs+mnmin ), result( 20 ) )
1223 CALL dort01(
'Columns', mnmin, mnmin, u, ldpt,
1224 $ work( iwbs+mnmin ), lwork-mnmin,
1226 CALL dort01(
'Rows', mnmin, mnmin, vt, ldpt,
1227 $ work( iwbs+mnmin ), lwork-mnmin,
1231 DO 180 i = 1, mnmin - 1
1232 IF( s1( i ).LT.s1( i+1 ) )
1233 $ result( 23 ) = ulpinv
1234 IF( s1( i ).LT.zero )
1235 $ result( 23 ) = ulpinv
1237 IF( mnmin.GE.1 )
THEN
1238 IF( s1( mnmin ).LT.zero )
1239 $ result( 23 ) = ulpinv
1244 temp1 = abs( s1( j )-s2( j ) ) /
1245 $ max( sqrt( unfl )*max( s1( 1 ), one ),
1246 $ ulp*max( abs( s1( 1 ) ), abs( s2( 1 ) ) ) )
1247 temp2 = max( temp1, temp2 )
1249 result( 24 ) = temp2
1257 iseed2( i ) = iseed( i )
1259 IF( mnmin.LE.1 )
THEN
1263 il = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1264 iu = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1272 CALL dcopy( mnmin, bd, 1, work( iwbd ), 1 )
1274 $
CALL dcopy( mnmin-1, be, 1, work( iwbe ), 1 )
1276 CALL dbdsvdx( uplo,
'V',
'I', mnmin, work( iwbd ),
1277 $ work( iwbe ), zero, zero, il, iu, ns1, s1,
1278 $ work( iwbz ), mnmin2, work( iwwork ),
1283 IF( iinfo.NE.0 )
THEN
1284 WRITE( nout, fmt = 9998 )
'DBDSVDX(vects,I)', iinfo,
1285 $ m, n, jtype, ioldsd
1287 IF( iinfo.LT.0 )
THEN
1290 result( 25 ) = ulpinv
1297 CALL dcopy( mnmin, work( j ), 1, u( 1,i ), 1 )
1299 CALL dcopy( mnmin, work( j ), 1, vt( i,1 ), ldpt )
1306 CALL dcopy( mnmin, bd, 1, work( iwbd ), 1 )
1308 $
CALL dcopy( mnmin-1, be, 1, work( iwbe ), 1 )
1310 CALL dbdsvdx( uplo,
'N',
'I', mnmin, work( iwbd ),
1311 $ work( iwbe ), zero, zero, il, iu, ns2, s2,
1312 $ work( iwbz ), mnmin2, work( iwwork ),
1317 IF( iinfo.NE.0 )
THEN
1318 WRITE( nout, fmt = 9998 )
'DBDSVDX(values,I)', iinfo,
1319 $ m, n, jtype, ioldsd
1321 IF( iinfo.LT.0 )
THEN
1324 result( 29 ) = ulpinv
1336 CALL dbdt04( uplo, mnmin, bd, be, s1, ns1, u,
1337 $ ldpt, vt, ldpt, work( iwbs+mnmin ),
1339 CALL dort01(
'Columns', mnmin, ns1, u, ldpt,
1340 $ work( iwbs+mnmin ), lwork-mnmin,
1342 CALL dort01(
'Rows', ns1, mnmin, vt, ldpt,
1343 $ work( iwbs+mnmin ), lwork-mnmin,
1347 DO 220 i = 1, ns1 - 1
1348 IF( s1( i ).LT.s1( i+1 ) )
1349 $ result( 28 ) = ulpinv
1350 IF( s1( i ).LT.zero )
1351 $ result( 28 ) = ulpinv
1354 IF( s1( ns1 ).LT.zero )
1355 $ result( 28 ) = ulpinv
1360 temp1 = abs( s1( j )-s2( j ) ) /
1361 $ max( sqrt( unfl )*max( s1( 1 ), one ),
1362 $ ulp*max( abs( s1( 1 ) ), abs( s2( 1 ) ) ) )
1363 temp2 = max( temp1, temp2 )
1365 result( 29 ) = temp2
1371 CALL dcopy( mnmin, work( iwbs ), 1, s1, 1 )
1373 IF( mnmin.GT.0 )
THEN
1375 vu = s1( il ) + max( half*abs( s1( il )-s1( il-1 ) ),
1376 $ ulp*anorm, two*rtunfl )
1378 vu = s1( 1 ) + max( half*abs( s1( mnmin )-s1( 1 ) ),
1379 $ ulp*anorm, two*rtunfl )
1381 IF( iu.NE.ns1 )
THEN
1382 vl = s1( iu ) - max( ulp*anorm, two*rtunfl,
1383 $ half*abs( s1( iu+1 )-s1( iu ) ) )
1385 vl = s1( ns1 ) - max( ulp*anorm, two*rtunfl,
1386 $ half*abs( s1( mnmin )-s1( 1 ) ) )
1390 IF( vl.GE.vu ) vu = max( vu*2, vu+vl+half )
1396 CALL dcopy( mnmin, bd, 1, work( iwbd ), 1 )
1398 $
CALL dcopy( mnmin-1, be, 1, work( iwbe ), 1 )
1400 CALL dbdsvdx( uplo,
'V',
'V', mnmin, work( iwbd ),
1401 $ work( iwbe ), vl, vu, 0, 0, ns1, s1,
1402 $ work( iwbz ), mnmin2, work( iwwork ),
1407 IF( iinfo.NE.0 )
THEN
1408 WRITE( nout, fmt = 9998 )
'DBDSVDX(vects,V)', iinfo,
1409 $ m, n, jtype, ioldsd
1411 IF( iinfo.LT.0 )
THEN
1414 result( 30 ) = ulpinv
1421 CALL dcopy( mnmin, work( j ), 1, u( 1,i ), 1 )
1423 CALL dcopy( mnmin, work( j ), 1, vt( i,1 ), ldpt )
1430 CALL dcopy( mnmin, bd, 1, work( iwbd ), 1 )
1432 $
CALL dcopy( mnmin-1, be, 1, work( iwbe ), 1 )
1434 CALL dbdsvdx( uplo,
'N',
'V', mnmin, work( iwbd ),
1435 $ work( iwbe ), vl, vu, 0, 0, ns2, s2,
1436 $ work( iwbz ), mnmin2, work( iwwork ),
1441 IF( iinfo.NE.0 )
THEN
1442 WRITE( nout, fmt = 9998 )
'DBDSVDX(values,V)', iinfo,
1443 $ m, n, jtype, ioldsd
1445 IF( iinfo.LT.0 )
THEN
1448 result( 34 ) = ulpinv
1460 CALL dbdt04( uplo, mnmin, bd, be, s1, ns1, u,
1461 $ ldpt, vt, ldpt, work( iwbs+mnmin ),
1463 CALL dort01(
'Columns', mnmin, ns1, u, ldpt,
1464 $ work( iwbs+mnmin ), lwork-mnmin,
1466 CALL dort01(
'Rows', ns1, mnmin, vt, ldpt,
1467 $ work( iwbs+mnmin ), lwork-mnmin,
1471 DO 250 i = 1, ns1 - 1
1472 IF( s1( i ).LT.s1( i+1 ) )
1473 $ result( 28 ) = ulpinv
1474 IF( s1( i ).LT.zero )
1475 $ result( 28 ) = ulpinv
1478 IF( s1( ns1 ).LT.zero )
1479 $ result( 28 ) = ulpinv
1484 temp1 = abs( s1( j )-s2( j ) ) /
1485 $ max( sqrt( unfl )*max( s1( 1 ), one ),
1486 $ ulp*max( abs( s1( 1 ) ), abs( s2( 1 ) ) ) )
1487 temp2 = max( temp1, temp2 )
1489 result( 34 ) = temp2
1496 IF( result( j ).GE.thresh )
THEN
1498 $
CALL dlahd2( nout, path )
1499 WRITE( nout, fmt = 9999 )m, n, jtype, ioldsd, j,
1504 IF( .NOT.bidiag )
THEN
1515 CALL alasum( path, nout, nfail, ntest, 0 )
1521 9999
FORMAT(
' M=', i5,
', N=', i5,
', type ', i2,
', seed=',
1522 $ 4( i4,
',' ),
' test(', i2,
')=', g11.4 )
1523 9998
FORMAT(
' DCHKBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1524 $ i6,
', N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
subroutine alasum(type, nout, nfail, nrun, nerrs)
ALASUM
subroutine xerbla(srname, info)
subroutine dbdt01(m, n, kd, a, lda, q, ldq, d, e, pt, ldpt, work, resid)
DBDT01
subroutine dbdt02(m, n, b, ldb, c, ldc, u, ldu, work, resid)
DBDT02
subroutine dbdt03(uplo, n, kd, d, e, u, ldu, s, vt, ldvt, work, resid)
DBDT03
subroutine dbdt04(uplo, n, d, e, s, ns, u, ldu, vt, ldvt, work, resid)
DBDT04
subroutine dchkbd(nsizes, mval, nval, ntypes, dotype, nrhs, iseed, thresh, a, lda, bd, be, s1, s2, x, ldx, y, z, q, ldq, pt, ldpt, u, vt, work, lwork, iwork, nout, info)
DCHKBD
subroutine dlahd2(iounit, path)
DLAHD2
subroutine dlatmr(m, n, dist, iseed, sym, d, mode, cond, dmax, rsign, grade, dl, model, condl, dr, moder, condr, pivtng, ipivot, kl, ku, sparse, anorm, pack, a, lda, iwork, info)
DLATMR
subroutine dlatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
DLATMS
subroutine dort01(rowcol, m, n, u, ldu, work, lwork, resid)
DORT01
subroutine dbdsdc(uplo, compq, n, d, e, u, ldu, vt, ldvt, q, iq, work, iwork, info)
DBDSDC
subroutine dbdsqr(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, c, ldc, work, info)
DBDSQR
subroutine dbdsvdx(uplo, jobz, range, n, d, e, vl, vu, il, iu, ns, s, z, ldz, work, iwork, info)
DBDSVDX
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY
subroutine dgebrd(m, n, a, lda, d, e, tauq, taup, work, lwork, info)
DGEBRD
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine dorgbr(vect, m, n, k, a, lda, tau, work, lwork, info)
DORGBR