cdrvbd3
Part of cdrvbd.f(3).
Usage
Functions/Subroutines
CDRVBD
Function/Subroutine Documentation
subroutine cdrvbd (integer nsizes, integer, dimension( * ) mm, integer, dimension( * ) nn, integer ntypes, logical, dimension( * ) dotype, integer, dimension( 4 ) iseed, real thresh, complex, dimension( lda, * ) a, integer lda, complex, dimension( ldu, * ) u, integer ldu, complex, dimension( ldvt, * ) vt, integer ldvt, complex, dimension( lda, * ) asav, complex, dimension( ldu, * ) usav, complex, dimension( ldvt, * ) vtsav, real, dimension( * ) s, real, dimension( * ) ssav, real, dimension( * ) e, complex, dimension( * ) work, integer lwork, real, dimension( * ) rwork, integer, dimension( * ) iwork, integer nounit, integer info)
CDRVBD
Purpose:
!> !> CDRVBD checks the singular value decomposition (SVD) driver CGESVD, !> CGESDD, CGESVJ, CGEJSV, CGESVDX, and CGESVDQ. !> !> CGESVD and CGESDD factors A = U diag(S) VT, where U and VT are !> unitary and diag(S) is diagonal with the entries of the array S on !> its diagonal. The entries of S are the singular values, nonnegative !> and stored in decreasing order. U and VT can be optionally not !> computed, overwritten on A, or computed partially. !> !> A is M by N. Let MNMIN = min( M, N ). S has dimension MNMIN. !> U can be M by M or M by MNMIN. VT can be N by N or MNMIN by N. !> !> When CDRVBD is called, a number of matrix (M's and N's) !> and a number of matrix are specified. For each size (M,N) !> and each type of matrix, and for the minimal workspace as well as !> workspace adequate to permit blocking, an M x N matrix will be !> generated and used to test the SVD routines. For each matrix, A will !> be factored as A = U diag(S) VT and the following 12 tests computed: !> !> Test for CGESVD: !> !> (1) | A - U diag(S) VT | / ( |A| max(M,N) ulp ) !> !> (2) | I - U'U | / ( M ulp ) !> !> (3) | I - VT VT' | / ( N ulp ) !> !> (4) S contains MNMIN nonnegative values in decreasing order. !> (Return 0 if true, 1/ULP if false.) !> !> (5) | U - Upartial | / ( M ulp ) where Upartial is a partially !> computed U. !> !> (6) | VT - VTpartial | / ( N ulp ) where VTpartial is a partially !> computed VT. !> !> (7) | S - Spartial | / ( MNMIN ulp |S| ) where Spartial is the !> vector of singular values from the partial SVD !> !> Test for CGESDD: !> !> (8) | A - U diag(S) VT | / ( |A| max(M,N) ulp ) !> !> (9) | I - U'U | / ( M ulp ) !> !> (10) | I - VT VT' | / ( N ulp ) !> !> (11) S contains MNMIN nonnegative values in decreasing order. !> (Return 0 if true, 1/ULP if false.) !> !> (12) | U - Upartial | / ( M ulp ) where Upartial is a partially !> computed U. !> !> (13) | VT - VTpartial | / ( N ulp ) where VTpartial is a partially !> computed VT. !> !> (14) | S - Spartial | / ( MNMIN ulp |S| ) where Spartial is the !> vector of singular values from the partial SVD !> !> Test for CGESVDQ: !> !> (36) | A - U diag(S) VT | / ( |A| max(M,N) ulp ) !> !> (37) | I - U'U | / ( M ulp ) !> !> (38) | I - VT VT' | / ( N ulp ) !> !> (39) S contains MNMIN nonnegative values in decreasing order. !> (Return 0 if true, 1/ULP if false.) !> !> Test for CGESVJ: !> !> (15) | A - U diag(S) VT | / ( |A| max(M,N) ulp ) !> !> (16) | I - U'U | / ( M ulp ) !> !> (17) | I - VT VT' | / ( N ulp ) !> !> (18) S contains MNMIN nonnegative values in decreasing order. !> (Return 0 if true, 1/ULP if false.) !> !> Test for CGEJSV: !> !> (19) | A - U diag(S) VT | / ( |A| max(M,N) ulp ) !> !> (20) | I - U'U | / ( M ulp ) !> !> (21) | I - VT VT' | / ( N ulp ) !> !> (22) S contains MNMIN nonnegative values in decreasing order. !> (Return 0 if true, 1/ULP if false.) !> !> Test for CGESVDX( 'V', 'V', 'A' )/CGESVDX( 'N', 'N', 'A' ) !> !> (23) | A - U diag(S) VT | / ( |A| max(M,N) ulp ) !> !> (24) | I - U'U | / ( M ulp ) !> !> (25) | I - VT VT' | / ( N ulp ) !> !> (26) S contains MNMIN nonnegative values in decreasing order. !> (Return 0 if true, 1/ULP if false.) !> !> (27) | U - Upartial | / ( M ulp ) where Upartial is a partially !> computed U. !> !> (28) | VT - VTpartial | / ( N ulp ) where VTpartial is a partially !> computed VT. !> !> (29) | S - Spartial | / ( MNMIN ulp |S| ) where Spartial is the !> vector of singular values from the partial SVD !> !> Test for CGESVDX( 'V', 'V', 'I' ) !> !> (30) | U' A VT''' - diag(S) | / ( |A| max(M,N) ulp ) !> !> (31) | I - U'U | / ( M ulp ) !> !> (32) | I - VT VT' | / ( N ulp ) !> !> Test for CGESVDX( 'V', 'V', 'V' ) !> !> (33) | U' A VT''' - diag(S) | / ( |A| max(M,N) ulp ) !> !> (34) | I - U'U | / ( M ulp ) !> !> (35) | I - VT VT' | / ( N ulp ) !> !> The are specified by the arrays MM(1:NSIZES) and !> NN(1:NSIZES); the value of each element pair (MM(j),NN(j)) !> specifies one size. The are specified by a logical array !> DOTYPE( 1:NTYPES ); if DOTYPE(j) is .TRUE., then matrix type !> will be generated. !> Currently, the list of possible types is: !> !> (1) The zero matrix. !> (2) The identity matrix. !> (3) A matrix of the form U D V, where U and V are unitary and !> D has evenly spaced entries 1, ..., ULP with random signs !> on the diagonal. !> (4) Same as (3), but multiplied by the underflow-threshold / ULP. !> (5) Same as (3), but multiplied by the overflow-threshold * ULP. !>
Parameters
NSIZES
!> NSIZES is INTEGER !> The number of sizes of matrices to use. If it is zero, !> CDRVBD does nothing. It must be at least zero. !>
MM
!> MM is INTEGER array, dimension (NSIZES) !> An array containing the matrix to be used. For !> each j=1,...,NSIZES, if MM(j) is zero, then MM(j) and NN(j) !> will be ignored. The MM(j) values must be at least zero. !>
NN
!> NN is INTEGER array, dimension (NSIZES) !> An array containing the matrix to be used. For !> each j=1,...,NSIZES, if NN(j) is zero, then MM(j) and NN(j) !> will be ignored. The NN(j) values must be at least zero. !>
NTYPES
!> NTYPES is INTEGER !> The number of elements in DOTYPE. If it is zero, CDRVBD !> does nothing. It must be at least zero. If it is MAXTYP+1 !> and NSIZES is 1, then an additional type, MAXTYP+1 is !> defined, which is to use whatever matrices are in A and B. !> This is only useful if DOTYPE(1:MAXTYP) is .FALSE. and !> DOTYPE(MAXTYP+1) is .TRUE. . !>
DOTYPE
!> DOTYPE is LOGICAL array, dimension (NTYPES) !> If DOTYPE(j) is .TRUE., then for each size (m,n), a matrix !> of type j will be generated. If NTYPES is smaller than the !> maximum number of types defined (PARAMETER MAXTYP), then !> types NTYPES+1 through MAXTYP will not be generated. If !> NTYPES is larger than MAXTYP, DOTYPE(MAXTYP+1) through !> DOTYPE(NTYPES) will be ignored. !>
ISEED
!> ISEED is INTEGER array, dimension (4)
!> On entry ISEED specifies the seed of the random number
!> generator. The array elements should be between 0 and 4095;
!> if not they will be reduced mod 4096. Also, ISEED(4) must
!> be odd. The random number generator uses a linear
!> congruential sequence limited to small integers, and so
!> should produce machine independent random numbers. The
!> values of ISEED are changed on exit, and can be used in the
!> next call to CDRVBD to continue the same random number
!> sequence.
!>
THRESH
!> THRESH is REAL
!> A test will count as if the , computed as
!> described above, exceeds THRESH. Note that the error
!> is scaled to be O(1), so THRESH should be a reasonably
!> small multiple of 1, e.g., 10 or 100. In particular,
!> it should not depend on the precision (single vs. double)
!> or the size of the matrix. It must be at least zero.
!>
A
!> A is COMPLEX array, dimension (LDA,max(NN)) !> Used to hold the matrix whose singular values are to be !> computed. On exit, A contains the last matrix actually !> used. !>
LDA
!> LDA is INTEGER !> The leading dimension of A. It must be at !> least 1 and at least max( MM ). !>
U
!> U is COMPLEX array, dimension (LDU,max(MM)) !> Used to hold the computed matrix of right singular vectors. !> On exit, U contains the last such vectors actually computed. !>
LDU
!> LDU is INTEGER !> The leading dimension of U. It must be at !> least 1 and at least max( MM ). !>
VT
!> VT is COMPLEX array, dimension (LDVT,max(NN)) !> Used to hold the computed matrix of left singular vectors. !> On exit, VT contains the last such vectors actually computed. !>
LDVT
!> LDVT is INTEGER !> The leading dimension of VT. It must be at !> least 1 and at least max( NN ). !>
ASAV
!> ASAV is COMPLEX array, dimension (LDA,max(NN)) !> Used to hold a different copy of the matrix whose singular !> values are to be computed. On exit, A contains the last !> matrix actually used. !>
USAV
!> USAV is COMPLEX array, dimension (LDU,max(MM)) !> Used to hold a different copy of the computed matrix of !> right singular vectors. On exit, USAV contains the last such !> vectors actually computed. !>
VTSAV
!> VTSAV is COMPLEX array, dimension (LDVT,max(NN)) !> Used to hold a different copy of the computed matrix of !> left singular vectors. On exit, VTSAV contains the last such !> vectors actually computed. !>
S
!> S is REAL array, dimension (max(min(MM,NN))) !> Contains the computed singular values. !>
SSAV
!> SSAV is REAL array, dimension (max(min(MM,NN))) !> Contains another copy of the computed singular values. !>
E
!> E is REAL array, dimension (max(min(MM,NN))) !> Workspace for CGESVD. !>
WORK
!> WORK is COMPLEX array, dimension (LWORK) !>
LWORK
!> LWORK is INTEGER !> The number of entries in WORK. This must be at least !> MAX(3*MIN(M,N)+MAX(M,N)**2,5*MIN(M,N),3*MAX(M,N)) for all !> pairs (M,N)=(MM(j),NN(j)) !>
RWORK
!> RWORK is REAL array, !> dimension ( 5*max(max(MM,NN)) ) !>
IWORK
!> IWORK is INTEGER array, dimension at least 8*min(M,N) !>
NOUNIT
!> NOUNIT is INTEGER !> The FORTRAN unit number for printing out error messages !> (e.g., if a routine returns IINFO not equal to 0.) !>
INFO
!> INFO is INTEGER !> If 0, then everything ran OK. !> -1: NSIZES < 0 !> -2: Some MM(j) < 0 !> -3: Some NN(j) < 0 !> -4: NTYPES < 0 !> -7: THRESH < 0 !> -10: LDA < 1 or LDA < MMAX, where MMAX is max( MM(j) ). !> -12: LDU < 1 or LDU < MMAX. !> -14: LDVT < 1 or LDVT < NMAX, where NMAX is max( NN(j) ). !> -29: LWORK too small. !> If CLATMS, or CGESVD returns an error code, the !> absolute value of it is returned. !>
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Definition at line 397 of file cdrvbd.f.