354 SUBROUTINE ddrvbd( NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH,
355 $ A, LDA, U, LDU, VT, LDVT, ASAV, USAV, VTSAV, S,
356 $ SSAV, E, WORK, LWORK, IWORK, NOUT, INFO )
364 INTEGER INFO, LDA, LDU, LDVT, LWORK, NOUT, NSIZES,
366 DOUBLE PRECISION THRESH
370 INTEGER ISEED( 4 ), IWORK( * ), MM( * ), NN( * )
371 DOUBLE PRECISION A( lda, * ), ASAV( lda, * ), E( * ), S( * ),
372 $ ssav( * ), u( ldu, * ), usav( ldu, * ),
373 $ vt( ldvt, * ), vtsav( ldvt, * ), work( * )
379 DOUBLE PRECISION ZERO, ONE, TWO, HALF
380 parameter( zero = 0.0d0, one = 1.0d0, two = 2.0d0,
383 parameter( maxtyp = 5 )
387 CHARACTER JOBQ, JOBU, JOBVT, RANGE
389 INTEGER I, IINFO, IJQ, IJU, IJVT, IL,IU, IWS, IWTMP,
390 $ itemp, j, jsize, jtype, lswork, m, minwrk,
391 $ mmax, mnmax, mnmin, mtypes, n, nfail,
392 $ nmax, ns, nsi, nsv, ntest
393 DOUBLE PRECISION ANORM, DIF, DIV, OVFL, RTUNFL, ULP,
394 $ ulpinv, unfl, vl, vu
397 CHARACTER CJOB( 4 ), CJOBR( 3 ), CJOBV( 2 )
398 INTEGER IOLDSD( 4 ), ISEED2( 4 )
399 DOUBLE PRECISION RESULT( 40 )
402 DOUBLE PRECISION DLAMCH, DLARND
403 EXTERNAL dlamch, dlarnd
411 INTRINSIC abs, dble, int, max, min
419 COMMON / infoc / infot, nunit, ok, lerr
420 COMMON / srnamc / srnamt
423 DATA cjob /
'N',
'O',
'S',
'A' /
424 DATA cjobr /
'A',
'V',
'I' /
425 DATA cjobv /
'N',
'V' /
439 mmax = max( mmax, mm( j ) )
442 nmax = max( nmax, nn( j ) )
445 mnmax = max( mnmax, min( mm( j ), nn( j ) ) )
446 minwrk = max( minwrk, max( 3*min( mm( j ),
447 $ nn( j ) )+max( mm( j ), nn( j ) ), 5*min( mm( j ),
448 $ nn( j )-4 ) )+2*min( mm( j ), nn( j ) )**2 )
453 IF( nsizes.LT.0 )
THEN 455 ELSE IF( badmm )
THEN 457 ELSE IF( badnn )
THEN 459 ELSE IF( ntypes.LT.0 )
THEN 461 ELSE IF( lda.LT.max( 1, mmax ) )
THEN 463 ELSE IF( ldu.LT.max( 1, mmax ) )
THEN 465 ELSE IF( ldvt.LT.max( 1, nmax ) )
THEN 467 ELSE IF( minwrk.GT.lwork )
THEN 472 CALL xerbla(
'DDRVBD', -info )
478 path( 1: 1 ) =
'Double precision' 482 unfl = dlamch(
'Safe minimum' )
485 ulp = dlamch(
'Precision' )
486 rtunfl = sqrt( unfl )
492 DO 240 jsize = 1, nsizes
497 IF( nsizes.NE.1 )
THEN 498 mtypes = min( maxtyp, ntypes )
500 mtypes = min( maxtyp+1, ntypes )
503 DO 230 jtype = 1, mtypes
504 IF( .NOT.dotype( jtype ) )
508 ioldsd( j ) = iseed( j )
513 IF( mtypes.GT.maxtyp )
516 IF( jtype.EQ.1 )
THEN 520 CALL dlaset(
'Full', m, n, zero, zero, a, lda )
522 ELSE IF( jtype.EQ.2 )
THEN 526 CALL dlaset(
'Full', m, n, zero, one, a, lda )
538 CALL dlatms( m, n,
'U', iseed,
'N', s, 4, dble( mnmin ),
539 $ anorm, m-1, n-1,
'N', a, lda, work, iinfo )
540 IF( iinfo.NE.0 )
THEN 541 WRITE( nout, fmt = 9996 )
'Generator', iinfo, m, n,
549 CALL dlacpy(
'F', m, n, a, lda, asav, lda )
561 iwtmp = max( 3*min( m, n )+max( m, n ), 5*min( m, n ) )
562 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
563 lswork = min( lswork, lwork )
564 lswork = max( lswork, 1 )
569 $
CALL dlacpy(
'F', m, n, asav, lda, a, lda )
571 CALL dgesvd(
'A',
'A', m, n, a, lda, ssav, usav, ldu,
572 $ vtsav, ldvt, work, lswork, iinfo )
573 IF( iinfo.NE.0 )
THEN 574 WRITE( nout, fmt = 9995 )
'GESVD', iinfo, m, n, jtype,
582 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
583 $ vtsav, ldvt, work, result( 1 ) )
584 IF( m.NE.0 .AND. n.NE.0 )
THEN 585 CALL dort01(
'Columns', m, m, usav, ldu, work, lwork,
587 CALL dort01(
'Rows', n, n, vtsav, ldvt, work, lwork,
591 DO 50 i = 1, mnmin - 1
592 IF( ssav( i ).LT.ssav( i+1 ) )
593 $ result( 4 ) = ulpinv
594 IF( ssav( i ).LT.zero )
595 $ result( 4 ) = ulpinv
597 IF( mnmin.GE.1 )
THEN 598 IF( ssav( mnmin ).LT.zero )
599 $ result( 4 ) = ulpinv
609 IF( ( iju.EQ.3 .AND. ijvt.EQ.3 ) .OR.
610 $ ( iju.EQ.1 .AND. ijvt.EQ.1 ) )
GO TO 70
612 jobvt = cjob( ijvt+1 )
613 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
615 CALL dgesvd( jobu, jobvt, m, n, a, lda, s, u, ldu,
616 $ vt, ldvt, work, lswork, iinfo )
621 IF( m.GT.0 .AND. n.GT.0 )
THEN 623 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
624 $ ldu, a, lda, work, lwork, dif,
626 ELSE IF( iju.EQ.2 )
THEN 627 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
628 $ ldu, u, ldu, work, lwork, dif,
630 ELSE IF( iju.EQ.3 )
THEN 631 CALL dort03(
'C', m, m, m, mnmin, usav, ldu,
632 $ u, ldu, work, lwork, dif,
636 result( 5 ) = max( result( 5 ), dif )
641 IF( m.GT.0 .AND. n.GT.0 )
THEN 643 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
644 $ ldvt, a, lda, work, lwork, dif,
646 ELSE IF( ijvt.EQ.2 )
THEN 647 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
648 $ ldvt, vt, ldvt, work, lwork,
650 ELSE IF( ijvt.EQ.3 )
THEN 651 CALL dort03(
'R', n, n, n, mnmin, vtsav,
652 $ ldvt, vt, ldvt, work, lwork,
656 result( 6 ) = max( result( 6 ), dif )
661 div = max( mnmin*ulp*s( 1 ), unfl )
662 DO 60 i = 1, mnmin - 1
663 IF( ssav( i ).LT.ssav( i+1 ) )
665 IF( ssav( i ).LT.zero )
667 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
669 result( 7 ) = max( result( 7 ), dif )
675 iwtmp = 5*mnmin*mnmin + 9*mnmin + max( m, n )
676 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
677 lswork = min( lswork, lwork )
678 lswork = max( lswork, 1 )
682 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
684 CALL dgesdd(
'A', m, n, a, lda, ssav, usav, ldu, vtsav,
685 $ ldvt, work, lswork, iwork, iinfo )
686 IF( iinfo.NE.0 )
THEN 687 WRITE( nout, fmt = 9995 )
'GESDD', iinfo, m, n, jtype,
695 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
696 $ vtsav, ldvt, work, result( 8 ) )
697 IF( m.NE.0 .AND. n.NE.0 )
THEN 698 CALL dort01(
'Columns', m, m, usav, ldu, work, lwork,
700 CALL dort01(
'Rows', n, n, vtsav, ldvt, work, lwork,
704 DO 90 i = 1, mnmin - 1
705 IF( ssav( i ).LT.ssav( i+1 ) )
706 $ result( 11 ) = ulpinv
707 IF( ssav( i ).LT.zero )
708 $ result( 11 ) = ulpinv
710 IF( mnmin.GE.1 )
THEN 711 IF( ssav( mnmin ).LT.zero )
712 $ result( 11 ) = ulpinv
722 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
724 CALL dgesdd( jobq, m, n, a, lda, s, u, ldu, vt, ldvt,
725 $ work, lswork, iwork, iinfo )
730 IF( m.GT.0 .AND. n.GT.0 )
THEN 733 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
734 $ ldu, a, lda, work, lwork, dif,
737 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
738 $ ldu, u, ldu, work, lwork, dif,
741 ELSE IF( ijq.EQ.2 )
THEN 742 CALL dort03(
'C', m, mnmin, m, mnmin, usav, ldu,
743 $ u, ldu, work, lwork, dif, info )
746 result( 12 ) = max( result( 12 ), dif )
751 IF( m.GT.0 .AND. n.GT.0 )
THEN 754 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
755 $ ldvt, vt, ldvt, work, lwork,
758 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
759 $ ldvt, a, lda, work, lwork, dif,
762 ELSE IF( ijq.EQ.2 )
THEN 763 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
764 $ ldvt, vt, ldvt, work, lwork, dif,
768 result( 13 ) = max( result( 13 ), dif )
773 div = max( mnmin*ulp*s( 1 ), unfl )
774 DO 100 i = 1, mnmin - 1
775 IF( ssav( i ).LT.ssav( i+1 ) )
777 IF( ssav( i ).LT.zero )
779 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
781 result( 14 ) = max( result( 14 ), dif )
793 iwtmp = 5*mnmin*mnmin + 9*mnmin + max( m, n )
794 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
795 lswork = min( lswork, lwork )
796 lswork = max( lswork, 1 )
800 CALL dlacpy(
'F', m, n, asav, lda, usav, lda )
802 CALL dgesvj(
'G',
'U',
'V', m, n, usav, lda, ssav,
803 & 0, a, ldvt, work, lwork, info )
814 IF( iinfo.NE.0 )
THEN 815 WRITE( nout, fmt = 9995 )
'GESVJ', iinfo, m, n,
816 $ jtype, lswork, ioldsd
823 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
824 $ vtsav, ldvt, work, result( 15 ) )
825 IF( m.NE.0 .AND. n.NE.0 )
THEN 826 CALL dort01(
'Columns', m, m, usav, ldu, work,
827 $ lwork, result( 16 ) )
828 CALL dort01(
'Rows', n, n, vtsav, ldvt, work,
829 $ lwork, result( 17 ) )
832 DO 120 i = 1, mnmin - 1
833 IF( ssav( i ).LT.ssav( i+1 ) )
834 $ result( 18 ) = ulpinv
835 IF( ssav( i ).LT.zero )
836 $ result( 18 ) = ulpinv
838 IF( mnmin.GE.1 )
THEN 839 IF( ssav( mnmin ).LT.zero )
840 $ result( 18 ) = ulpinv
852 iwtmp = 5*mnmin*mnmin + 9*mnmin + max( m, n )
853 lswork = iwtmp + ( iws-1 )*( lwork-iwtmp ) / 3
854 lswork = min( lswork, lwork )
855 lswork = max( lswork, 1 )
859 CALL dlacpy(
'F', m, n, asav, lda, vtsav, lda )
861 CALL dgejsv(
'G',
'U',
'V',
'R',
'N',
'N',
862 & m, n, vtsav, lda, ssav, usav, ldu, a, ldvt,
863 & work, lwork, iwork, info )
874 IF( iinfo.NE.0 )
THEN 875 WRITE( nout, fmt = 9995 )
'GESVJ', iinfo, m, n,
876 $ jtype, lswork, ioldsd
883 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
884 $ vtsav, ldvt, work, result( 19 ) )
885 IF( m.NE.0 .AND. n.NE.0 )
THEN 886 CALL dort01(
'Columns', m, m, usav, ldu, work,
887 $ lwork, result( 20 ) )
888 CALL dort01(
'Rows', n, n, vtsav, ldvt, work,
889 $ lwork, result( 21 ) )
892 DO 150 i = 1, mnmin - 1
893 IF( ssav( i ).LT.ssav( i+1 ) )
894 $ result( 22 ) = ulpinv
895 IF( ssav( i ).LT.zero )
896 $ result( 22 ) = ulpinv
898 IF( mnmin.GE.1 )
THEN 899 IF( ssav( mnmin ).LT.zero )
900 $ result( 22 ) = ulpinv
906 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
907 CALL dgesvdx(
'V',
'V',
'A', m, n, a, lda,
908 $ vl, vu, il, iu, ns, ssav, usav, ldu,
909 $ vtsav, ldvt, work, lwork, iwork,
911 IF( iinfo.NE.0 )
THEN 912 WRITE( nout, fmt = 9995 )
'GESVDX', iinfo, m, n,
913 $ jtype, lswork, ioldsd
923 CALL dbdt01( m, n, 0, asav, lda, usav, ldu, ssav, e,
924 $ vtsav, ldvt, work, result( 23 ) )
925 IF( m.NE.0 .AND. n.NE.0 )
THEN 926 CALL dort01(
'Columns', m, m, usav, ldu, work, lwork,
928 CALL dort01(
'Rows', n, n, vtsav, ldvt, work, lwork,
932 DO 160 i = 1, mnmin - 1
933 IF( ssav( i ).LT.ssav( i+1 ) )
934 $ result( 26 ) = ulpinv
935 IF( ssav( i ).LT.zero )
936 $ result( 26 ) = ulpinv
938 IF( mnmin.GE.1 )
THEN 939 IF( ssav( mnmin ).LT.zero )
940 $ result( 26 ) = ulpinv
950 IF( ( iju.EQ.0 .AND. ijvt.EQ.0 ) .OR.
951 $ ( iju.EQ.1 .AND. ijvt.EQ.1 ) )
GO TO 170
952 jobu = cjobv( iju+1 )
953 jobvt = cjobv( ijvt+1 )
955 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
956 CALL dgesvdx( jobu, jobvt, range, m, n, a, lda,
957 $ vl, vu, il, iu, ns, s, u, ldu,
958 $ vt, ldvt, work, lwork, iwork,
964 IF( m.GT.0 .AND. n.GT.0 )
THEN 966 CALL dort03(
'C', m, mnmin, m, mnmin, usav,
967 $ ldu, u, ldu, work, lwork, dif,
971 result( 27 ) = max( result( 27 ), dif )
976 IF( m.GT.0 .AND. n.GT.0 )
THEN 978 CALL dort03(
'R', n, mnmin, n, mnmin, vtsav,
979 $ ldvt, vt, ldvt, work, lwork,
983 result( 28 ) = max( result( 28 ), dif )
988 div = max( mnmin*ulp*s( 1 ), unfl )
989 DO 190 i = 1, mnmin - 1
990 IF( ssav( i ).LT.ssav( i+1 ) )
992 IF( ssav( i ).LT.zero )
994 dif = max( dif, abs( ssav( i )-s( i ) ) / div )
996 result( 29 ) = max( result( 29 ), dif )
1003 iseed2( i ) = iseed( i )
1005 IF( mnmin.LE.1 )
THEN 1007 iu = max( 1, mnmin )
1009 il = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1010 iu = 1 + int( ( mnmin-1 )*dlarnd( 1, iseed2 ) )
1017 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
1018 CALL dgesvdx(
'V',
'V',
'I', m, n, a, lda,
1019 $ vl, vu, il, iu, nsi, s, u, ldu,
1020 $ vt, ldvt, work, lwork, iwork,
1022 IF( iinfo.NE.0 )
THEN 1023 WRITE( nout, fmt = 9995 )
'GESVDX', iinfo, m, n,
1024 $ jtype, lswork, ioldsd
1032 CALL dbdt05( m, n, asav, lda, s, nsi, u, ldu,
1033 $ vt, ldvt, work, result( 30 ) )
1034 CALL dort01(
'Columns', m, nsi, u, ldu, work, lwork,
1036 CALL dort01(
'Rows', nsi, n, vt, ldvt, work, lwork,
1041 IF( mnmin.GT.0 .AND. nsi.GT.1 )
THEN 1044 $ max( half*abs( ssav( il )-ssav( il-1 ) ),
1045 $ ulp*anorm, two*rtunfl )
1048 $ max( half*abs( ssav( ns )-ssav( 1 ) ),
1049 $ ulp*anorm, two*rtunfl )
1052 vl = ssav( iu ) - max( ulp*anorm, two*rtunfl,
1053 $ half*abs( ssav( iu+1 )-ssav( iu ) ) )
1055 vl = ssav( ns ) - max( ulp*anorm, two*rtunfl,
1056 $ half*abs( ssav( ns )-ssav( 1 ) ) )
1060 IF( vl.GE.vu ) vu = max( vu*2, vu+vl+half )
1065 CALL dlacpy(
'F', m, n, asav, lda, a, lda )
1066 CALL dgesvdx(
'V',
'V',
'V', m, n, a, lda,
1067 $ vl, vu, il, iu, nsv, s, u, ldu,
1068 $ vt, ldvt, work, lwork, iwork,
1070 IF( iinfo.NE.0 )
THEN 1071 WRITE( nout, fmt = 9995 )
'GESVDX', iinfo, m, n,
1072 $ jtype, lswork, ioldsd
1080 CALL dbdt05( m, n, asav, lda, s, nsv, u, ldu,
1081 $ vt, ldvt, work, result( 33 ) )
1082 CALL dort01(
'Columns', m, nsv, u, ldu, work, lwork,
1084 CALL dort01(
'Rows', nsv, n, vt, ldvt, work, lwork,
1090 IF( result( j ).GE.thresh )
THEN 1091 IF( nfail.EQ.0 )
THEN 1092 WRITE( nout, fmt = 9999 )
1093 WRITE( nout, fmt = 9998 )
1095 WRITE( nout, fmt = 9997 )m, n, jtype, iws, ioldsd,
1107 CALL alasvm( path, nout, nfail, ntest, 0 )
1109 9999
FORMAT(
' SVD -- Real Singular Value Decomposition Driver ',
1110 $ /
' Matrix types (see DDRVBD for details):',
1111 $ / /
' 1 = Zero matrix', /
' 2 = Identity matrix',
1112 $ /
' 3 = Evenly spaced singular values near 1',
1113 $ /
' 4 = Evenly spaced singular values near underflow',
1114 $ /
' 5 = Evenly spaced singular values near overflow', / /
1115 $
' Tests performed: ( A is dense, U and V are orthogonal,',
1116 $ / 19x,
' S is an array, and Upartial, VTpartial, and',
1117 $ / 19x,
' Spartial are partially computed U, VT and S),', / )
1118 9998
FORMAT(
' 1 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1119 $ /
' 2 = | I - U**T U | / ( M ulp ) ',
1120 $ /
' 3 = | I - VT VT**T | / ( N ulp ) ',
1121 $ /
' 4 = 0 if S contains min(M,N) nonnegative values in',
1122 $
' decreasing order, else 1/ulp',
1123 $ /
' 5 = | U - Upartial | / ( M ulp )',
1124 $ /
' 6 = | VT - VTpartial | / ( N ulp )',
1125 $ /
' 7 = | S - Spartial | / ( min(M,N) ulp |S| )',
1126 $ /
' 8 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1127 $ /
' 9 = | I - U**T U | / ( M ulp ) ',
1128 $ /
'10 = | I - VT VT**T | / ( N ulp ) ',
1129 $ /
'11 = 0 if S contains min(M,N) nonnegative values in',
1130 $
' decreasing order, else 1/ulp',
1131 $ /
'12 = | U - Upartial | / ( M ulp )',
1132 $ /
'13 = | VT - VTpartial | / ( N ulp )',
1133 $ /
'14 = | S - Spartial | / ( min(M,N) ulp |S| )',
1134 $ /
'15 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ) ',
1135 $ /
'16 = | I - U**T U | / ( M ulp ) ',
1136 $ /
'17 = | I - VT VT**T | / ( N ulp ) ',
1137 $ /
'18 = 0 if S contains min(M,N) nonnegative values in',
1138 $
' decreasing order, else 1/ulp',
1139 $ /
'19 = | U - Upartial | / ( M ulp )',
1140 $ /
'20 = | VT - VTpartial | / ( N ulp )',
1141 $ /
'21 = | S - Spartial | / ( min(M,N) ulp |S| )',
1142 $ /
'22 = 0 if S contains min(M,N) nonnegative values in',
1143 $
' decreasing order, else 1/ulp',
1144 $ /
'23 = | A - U diag(S) VT | / ( |A| max(M,N) ulp ),',
1145 $
' DGESVDX(V,V,A) ',
1146 $ /
'24 = | I - U**T U | / ( M ulp ) ',
1147 $ /
'25 = | I - VT VT**T | / ( N ulp ) ',
1148 $ /
'26 = 0 if S contains min(M,N) nonnegative values in',
1149 $
' decreasing order, else 1/ulp',
1150 $ /
'27 = | U - Upartial | / ( M ulp )',
1151 $ /
'28 = | VT - VTpartial | / ( N ulp )',
1152 $ /
'29 = | S - Spartial | / ( min(M,N) ulp |S| )',
1153 $ /
'30 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp ),',
1154 $
' DGESVDX(V,V,I) ',
1155 $ /
'31 = | I - U**T U | / ( M ulp ) ',
1156 $ /
'32 = | I - VT VT**T | / ( N ulp ) ',
1157 $ /
'33 = | U**T A VT**T - diag(S) | / ( |A| max(M,N) ulp ),',
1158 $
' DGESVDX(V,V,V) ',
1159 $ /
'34 = | I - U**T U | / ( M ulp ) ',
1160 $ /
'35 = | I - VT VT**T | / ( N ulp ) ',
1162 9997
FORMAT(
' M=', i5,
', N=', i5,
', type ', i1,
', IWS=', i1,
1163 $
', seed=', 4( i4,
',' ),
' test(', i2,
')=', g11.4 )
1164 9996
FORMAT(
' DDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1165 $ i6,
', N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
1167 9995
FORMAT(
' DDRVBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
1168 $ i6,
', N=', i6,
', JTYPE=', i6,
', LSWORK=', i6, / 9x,
1169 $
'ISEED=(', 3( i5,
',' ), i5,
')' )
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine dgesvd(JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, INFO)
DGESVD computes the singular value decomposition (SVD) for GE matrices
subroutine ddrvbd(NSIZES, MM, NN, NTYPES, DOTYPE, ISEED, THRESH, A, LDA, U, LDU, VT, LDVT, ASAV, USAV, VTSAV, S, SSAV, E, WORK, LWORK, IWORK, NOUT, INFO)
DDRVBD
subroutine dbdt01(M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK, RESID)
DBDT01
subroutine dbdt05(M, N, A, LDA, S, NS, U, LDU, VT, LDVT, WORK, RESID)
subroutine dgejsv(JOBA, JOBU, JOBV, JOBR, JOBT, JOBP, M, N, A, LDA, SVA, U, LDU, V, LDV, WORK, LWORK, IWORK, INFO)
DGEJSV
subroutine dlatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
DLATMS
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 dort03(RC, MU, MV, N, K, U, LDU, V, LDV, WORK, LWORK, RESULT, INFO)
DORT03
subroutine dgesvj(JOBA, JOBU, JOBV, M, N, A, LDA, SVA, MV, V, LDV, WORK, LWORK, INFO)
DGESVJ
subroutine dgesvdx(JOBU, JOBVT, RANGE, M, N, A, LDA, VL, VU, IL, IU, NS, S, U, LDU, VT, LDVT, WORK, LWORK, IWORK, INFO)
DGESVDX computes the singular value decomposition (SVD) for GE matrices
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dort01(ROWCOL, M, N, U, LDU, WORK, LWORK, RESID)
DORT01
subroutine dgesdd(JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, IWORK, INFO)
DGESDD