/* Subroutine */ int cdrgev_(integer *nsizes, integer *nn, integer *ntypes, logical *dotype, integer *iseed, real *thresh, integer *nounit, complex *a, integer *lda, complex *b, complex *s, complex *t, complex *q, integer *ldq, complex *z__, complex *qe, integer *ldqe, complex * alpha, complex *beta, complex *alpha1, complex *beta1, complex *work, integer *lwork, real *rwork, real *result, integer *info) { /* Initialized data */ static integer kclass[26] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2, 2,2,2,3 }; static integer kbmagn[26] = { 1,1,1,1,1,1,1,1,3,2,3,2,2,3,1,1,1,1,1,1,1,3, 2,3,2,1 }; static integer ktrian[26] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1 }; static logical lasign[26] = { FALSE_,FALSE_,FALSE_,FALSE_,FALSE_,FALSE_, TRUE_,FALSE_,TRUE_,TRUE_,FALSE_,FALSE_,TRUE_,TRUE_,TRUE_,FALSE_, TRUE_,FALSE_,FALSE_,FALSE_,TRUE_,TRUE_,TRUE_,TRUE_,TRUE_,FALSE_ }; static logical lbsign[26] = { FALSE_,FALSE_,FALSE_,FALSE_,FALSE_,FALSE_, FALSE_,TRUE_,FALSE_,FALSE_,TRUE_,TRUE_,FALSE_,FALSE_,TRUE_,FALSE_, TRUE_,FALSE_,FALSE_,FALSE_,FALSE_,FALSE_,FALSE_,FALSE_,FALSE_, FALSE_ }; static integer kz1[6] = { 0,1,2,1,3,3 }; static integer kz2[6] = { 0,0,1,2,1,1 }; static integer kadd[6] = { 0,0,0,0,3,2 }; static integer katype[26] = { 0,1,0,1,2,3,4,1,4,4,1,1,4,4,4,2,4,5,8,7,9,4, 4,4,4,0 }; static integer kbtype[26] = { 0,0,1,1,2,-3,1,4,1,1,4,4,1,1,-4,2,-4,8,8,8, 8,8,8,8,8,0 }; static integer kazero[26] = { 1,1,1,1,1,1,2,1,2,2,1,1,2,2,3,1,3,5,5,5,5,3, 3,3,3,1 }; static integer kbzero[26] = { 1,1,1,1,1,1,1,2,1,1,2,2,1,1,4,1,4,6,6,6,6,4, 4,4,4,1 }; static integer kamagn[26] = { 1,1,1,1,1,1,1,1,2,3,2,3,2,3,1,1,1,1,1,1,1,2, 3,3,2,1 }; /* Format strings */ static char fmt_9999[] = "(\002 CDRGEV: \002,a,\002 returned INFO=\002,i" "6,\002.\002,/3x,\002N=\002,i6,\002, JTYPE=\002,i6,\002, ISEED=" "(\002,3(i5,\002,\002),i5,\002)\002)"; static char fmt_9998[] = "(\002 CDRGEV: \002,a,\002 Eigenvectors from" " \002,a,\002 incorrectly \002,\002normalized.\002,/\002 Bits of " "error=\002,0p,g10.3,\002,\002,3x,\002N=\002,i4,\002, JTYPE=\002," "i3,\002, ISEED=(\002,3(i4,\002,\002),i5,\002)\002)"; static char fmt_9997[] = "(/1x,a3,\002 -- Complex Generalized eigenvalue" " problem \002,\002driver\002)"; static char fmt_9996[] = "(\002 Matrix types (see CDRGEV for details):" " \002)"; static char fmt_9995[] = "(\002 Special Matrices:\002,23x,\002(J'=transp" "osed Jordan block)\002,/\002 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I" ") 5=(J',J') \002,\0026=(diag(J',I), diag(I,J'))\002,/\002 Diag" "onal Matrices: ( \002,\002D=diag(0,1,2,...) )\002,/\002 7=(D," "I) 9=(large*D, small*I\002,\002) 11=(large*I, small*D) 13=(l" "arge*D, large*I)\002,/\002 8=(I,D) 10=(small*D, large*I) 12=" "(small*I, large*D) \002,\002 14=(small*D, small*I)\002,/\002 15" "=(D, reversed D)\002)"; static char fmt_9994[] = "(\002 Matrices Rotated by Random \002,a,\002 M" "atrices U, V:\002,/\002 16=Transposed Jordan Blocks " " 19=geometric \002,\002alpha, beta=0,1\002,/\002 17=arithm. alp" "ha&beta \002,\002 20=arithmetic alpha, beta=0," "1\002,/\002 18=clustered \002,\002alpha, beta=0,1 21" "=random alpha, beta=0,1\002,/\002 Large & Small Matrices:\002," "/\002 22=(large, small) \002,\00223=(small,large) 24=(smal" "l,small) 25=(large,large)\002,/\002 26=random O(1) matrices" ".\002)"; static char fmt_9993[] = "(/\002 Tests performed: \002,/\002 1 = max " "| ( b A - a B )'*l | / const.,\002,/\002 2 = | |VR(i)| - 1 | / u" "lp,\002,/\002 3 = max | ( b A - a B )*r | / const.\002,/\002 4 =" " | |VL(i)| - 1 | / ulp,\002,/\002 5 = 0 if W same no matter if r" " or l computed,\002,/\002 6 = 0 if l same no matter if l compute" "d,\002,/\002 7 = 0 if r same no matter if r computed,\002,/1x)"; static char fmt_9992[] = "(\002 Matrix order=\002,i5,\002, type=\002,i2" ",\002, seed=\002,4(i4,\002,\002),\002 result \002,i2,\002 is\002" ",0p,f8.2)"; static char fmt_9991[] = "(\002 Matrix order=\002,i5,\002, type=\002,i2" ",\002, seed=\002,4(i4,\002,\002),\002 result \002,i2,\002 is\002" ",1p,e10.3)"; /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, q_dim1, q_offset, qe_dim1, qe_offset, s_dim1, s_offset, t_dim1, t_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4, i__5, i__6, i__7; real r__1, r__2; complex q__1, q__2, q__3; /* Builtin functions */ double r_sign(real *, real *), c_abs(complex *); void r_cnjg(complex *, complex *); integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void); /* Local variables */ static integer iadd, ierr, nmax, i__, j, n; static logical badnn; extern /* Subroutine */ int cget52_(logical *, integer *, complex *, integer *, complex *, integer *, complex *, integer *, complex *, complex *, complex *, real *, real *), cggev_(char *, char *, integer *, complex *, integer *, complex *, integer *, complex *, complex *, complex *, integer *, complex *, integer *, complex *, integer *, real *, integer *); static real rmagn[4]; static complex ctemp; static integer nmats, jsize, nerrs, jtype, n1; extern /* Subroutine */ int clatm4_(integer *, integer *, integer *, integer *, logical *, real *, real *, real *, integer *, integer * , complex *, integer *), cunm2r_(char *, char *, integer *, integer *, integer *, complex *, integer *, complex *, complex *, integer *, complex *, integer *); static integer jc, nb, in; extern /* Subroutine */ int slabad_(real *, real *); static integer jr; extern /* Subroutine */ int clarfg_(integer *, complex *, complex *, integer *, complex *); extern /* Complex */ VOID clarnd_(complex *, integer *, integer *); extern doublereal slamch_(char *); extern /* Subroutine */ int clacpy_(char *, integer *, integer *, complex *, integer *, complex *, integer *), claset_(char *, integer *, integer *, complex *, complex *, complex *, integer *); static real safmin, safmax; static integer ioldsd[4]; extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ int alasvm_(char *, integer *, integer *, integer *, integer *), xerbla_(char *, integer *); static integer minwrk, maxwrk; static real ulpinv; static integer mtypes, ntestt; static real ulp; /* Fortran I/O blocks */ static cilist io___40 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___42 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___43 = { 0, 0, 0, fmt_9998, 0 }; static cilist io___44 = { 0, 0, 0, fmt_9998, 0 }; static cilist io___45 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___46 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___47 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___48 = { 0, 0, 0, fmt_9997, 0 }; static cilist io___49 = { 0, 0, 0, fmt_9996, 0 }; static cilist io___50 = { 0, 0, 0, fmt_9995, 0 }; static cilist io___51 = { 0, 0, 0, fmt_9994, 0 }; static cilist io___52 = { 0, 0, 0, fmt_9993, 0 }; static cilist io___53 = { 0, 0, 0, fmt_9992, 0 }; static cilist io___54 = { 0, 0, 0, fmt_9991, 0 }; #define a_subscr(a_1,a_2) (a_2)*a_dim1 + a_1 #define a_ref(a_1,a_2) a[a_subscr(a_1,a_2)] #define b_subscr(a_1,a_2) (a_2)*b_dim1 + a_1 #define b_ref(a_1,a_2) b[b_subscr(a_1,a_2)] #define q_subscr(a_1,a_2) (a_2)*q_dim1 + a_1 #define q_ref(a_1,a_2) q[q_subscr(a_1,a_2)] #define z___subscr(a_1,a_2) (a_2)*z_dim1 + a_1 #define z___ref(a_1,a_2) z__[z___subscr(a_1,a_2)] #define qe_subscr(a_1,a_2) (a_2)*qe_dim1 + a_1 #define qe_ref(a_1,a_2) qe[qe_subscr(a_1,a_2)] /* -- LAPACK test routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= CDRGEV checks the nonsymmetric generalized eigenvalue problem driver routine CGGEV. CGGEV computes for a pair of n-by-n nonsymmetric matrices (A,B) the generalized eigenvalues and, optionally, the left and right eigenvectors. A generalized eigenvalue for a pair of matrices (A,B) is a scalar w or a ratio alpha/beta = w, such that A - w*B is singular. It is usually represented as the pair (alpha,beta), as there is reasonalbe interpretation for beta=0, and even for both being zero. A right generalized eigenvector corresponding to a generalized eigenvalue w for a pair of matrices (A,B) is a vector r such that (A - wB) * r = 0. A left generalized eigenvector is a vector l such that l**H * (A - wB) = 0, where l**H is the conjugate-transpose of l. When CDRGEV is called, a number of matrix "sizes" ("n's") and a number of matrix "types" are specified. For each size ("n") and each type of matrix, a pair of matrices (A, B) will be generated and used for testing. For each matrix pair, the following tests will be performed and compared with the threshhold THRESH. Results from CGGEV: (1) max over all left eigenvalue/-vector pairs (alpha/beta,l) of | VL**H * (beta A - alpha B) |/( ulp max(|beta A|, |alpha B|) ) where VL**H is the conjugate-transpose of VL. (2) | |VL(i)| - 1 | / ulp and whether largest component real VL(i) denotes the i-th column of VL. (3) max over all left eigenvalue/-vector pairs (alpha/beta,r) of | (beta A - alpha B) * VR | / ( ulp max(|beta A|, |alpha B|) ) (4) | |VR(i)| - 1 | / ulp and whether largest component real VR(i) denotes the i-th column of VR. (5) W(full) = W(partial) W(full) denotes the eigenvalues computed when both l and r are also computed, and W(partial) denotes the eigenvalues computed when only W, only W and r, or only W and l are computed. (6) VL(full) = VL(partial) VL(full) denotes the left eigenvectors computed when both l and r are computed, and VL(partial) denotes the result when only l is computed. (7) VR(full) = VR(partial) VR(full) denotes the right eigenvectors computed when both l and r are also computed, and VR(partial) denotes the result when only l is computed. Test Matrices ---- -------- The sizes of the test matrices are specified by an array NN(1:NSIZES); the value of each element NN(j) specifies one size. The "types" are specified by a logical array DOTYPE( 1:NTYPES ); if DOTYPE(j) is .TRUE., then matrix type "j" will be generated. Currently, the list of possible types is: (1) ( 0, 0 ) (a pair of zero matrices) (2) ( I, 0 ) (an identity and a zero matrix) (3) ( 0, I ) (an identity and a zero matrix) (4) ( I, I ) (a pair of identity matrices) t t (5) ( J , J ) (a pair of transposed Jordan blocks) t ( I 0 ) (6) ( X, Y ) where X = ( J 0 ) and Y = ( t ) ( 0 I ) ( 0 J ) and I is a k x k identity and J a (k+1)x(k+1) Jordan block; k=(N-1)/2 (7) ( D, I ) where D is diag( 0, 1,..., N-1 ) (a diagonal matrix with those diagonal entries.) (8) ( I, D ) (9) ( big*D, small*I ) where "big" is near overflow and small=1/big (10) ( small*D, big*I ) (11) ( big*I, small*D ) (12) ( small*I, big*D ) (13) ( big*D, big*I ) (14) ( small*D, small*I ) (15) ( D1, D2 ) where D1 is diag( 0, 0, 1, ..., N-3, 0 ) and D2 is diag( 0, N-3, N-4,..., 1, 0, 0 ) t t (16) Q ( J , J ) Z where Q and Z are random orthogonal matrices. (17) Q ( T1, T2 ) Z where T1 and T2 are upper triangular matrices with random O(1) entries above the diagonal and diagonal entries diag(T1) = ( 0, 0, 1, ..., N-3, 0 ) and diag(T2) = ( 0, N-3, N-4,..., 1, 0, 0 ) (18) Q ( T1, T2 ) Z diag(T1) = ( 0, 0, 1, 1, s, ..., s, 0 ) diag(T2) = ( 0, 1, 0, 1,..., 1, 0 ) s = machine precision. (19) Q ( T1, T2 ) Z diag(T1)=( 0,0,1,1, 1-d, ..., 1-(N-5)*d=s, 0 ) diag(T2) = ( 0, 1, 0, 1, ..., 1, 0 ) N-5 (20) Q ( T1, T2 ) Z diag(T1)=( 0, 0, 1, 1, a, ..., a =s, 0 ) diag(T2) = ( 0, 1, 0, 1, ..., 1, 0, 0 ) (21) Q ( T1, T2 ) Z diag(T1)=( 0, 0, 1, r1, r2, ..., r(N-4), 0 ) diag(T2) = ( 0, 1, 0, 1, ..., 1, 0, 0 ) where r1,..., r(N-4) are random. (22) Q ( big*T1, small*T2 ) Z diag(T1) = ( 0, 0, 1, ..., N-3, 0 ) diag(T2) = ( 0, 1, ..., 1, 0, 0 ) (23) Q ( small*T1, big*T2 ) Z diag(T1) = ( 0, 0, 1, ..., N-3, 0 ) diag(T2) = ( 0, 1, ..., 1, 0, 0 ) (24) Q ( small*T1, small*T2 ) Z diag(T1) = ( 0, 0, 1, ..., N-3, 0 ) diag(T2) = ( 0, 1, ..., 1, 0, 0 ) (25) Q ( big*T1, big*T2 ) Z diag(T1) = ( 0, 0, 1, ..., N-3, 0 ) diag(T2) = ( 0, 1, ..., 1, 0, 0 ) (26) Q ( T1, T2 ) Z where T1 and T2 are random upper-triangular matrices. Arguments ========= NSIZES (input) INTEGER The number of sizes of matrices to use. If it is zero, CDRGES does nothing. NSIZES >= 0. NN (input) INTEGER array, dimension (NSIZES) An array containing the sizes to be used for the matrices. Zero values will be skipped. NN >= 0. NTYPES (input) INTEGER The number of elements in DOTYPE. If it is zero, CDRGEV 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 matrix is in A. This is only useful if DOTYPE(1:MAXTYP) is .FALSE. and DOTYPE(MAXTYP+1) is .TRUE. . DOTYPE (input) LOGICAL array, dimension (NTYPES) If DOTYPE(j) is .TRUE., then for each size in NN a matrix of that size and 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 (input/output) 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 CDRGES to continue the same random number sequence. THRESH (input) REAL A test will count as "failed" if the "error", 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. NOUNIT (input) INTEGER The FORTRAN unit number for printing out error messages (e.g., if a routine returns IERR not equal to 0.) A (input/workspace) COMPLEX array, dimension(LDA, max(NN)) Used to hold the original A matrix. Used as input only if NTYPES=MAXTYP+1, DOTYPE(1:MAXTYP)=.FALSE., and DOTYPE(MAXTYP+1)=.TRUE. LDA (input) INTEGER The leading dimension of A, B, S, and T. It must be at least 1 and at least max( NN ). B (input/workspace) COMPLEX array, dimension(LDA, max(NN)) Used to hold the original B matrix. Used as input only if NTYPES=MAXTYP+1, DOTYPE(1:MAXTYP)=.FALSE., and DOTYPE(MAXTYP+1)=.TRUE. S (workspace) COMPLEX array, dimension (LDA, max(NN)) The Schur form matrix computed from A by CGGEV. On exit, S contains the Schur form matrix corresponding to the matrix in A. T (workspace) COMPLEX array, dimension (LDA, max(NN)) The upper triangular matrix computed from B by CGGEV. Q (workspace) COMPLEX array, dimension (LDQ, max(NN)) The (left) eigenvectors matrix computed by CGGEV. LDQ (input) INTEGER The leading dimension of Q and Z. It must be at least 1 and at least max( NN ). Z (workspace) COMPLEX array, dimension( LDQ, max(NN) ) The (right) orthogonal matrix computed by CGGEV. QE (workspace) COMPLEX array, dimension( LDQ, max(NN) ) QE holds the computed right or left eigenvectors. LDQE (input) INTEGER The leading dimension of QE. LDQE >= max(1,max(NN)). ALPHA (workspace) COMPLEX array, dimension (max(NN)) BETA (workspace) COMPLEX array, dimension (max(NN)) The generalized eigenvalues of (A,B) computed by CGGEV. ( ALPHAR(k)+ALPHAI(k)*i ) / BETA(k) is the k-th generalized eigenvalue of A and B. ALPHA1 (workspace) COMPLEX array, dimension (max(NN)) BETA1 (workspace) COMPLEX array, dimension (max(NN)) Like ALPHAR, ALPHAI, BETA, these arrays contain the eigenvalues of A and B, but those computed when CGGEV only computes a partial eigendecomposition, i.e. not the eigenvalues and left and right eigenvectors. WORK (workspace) COMPLEX array, dimension (LWORK) LWORK (input) INTEGER The number of entries in WORK. LWORK >= N*(N+1) RWORK (workspace) REAL array, dimension (8*N) Real workspace. RESULT (output) REAL array, dimension (2) The values computed by the tests described above. The values are currently limited to 1/ulp, to avoid overflow. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value. > 0: A routine returned an error code. INFO is the absolute value of the INFO value returned. ===================================================================== Parameter adjustments */ --nn; --dotype; --iseed; t_dim1 = *lda; t_offset = 1 + t_dim1 * 1; t -= t_offset; s_dim1 = *lda; s_offset = 1 + s_dim1 * 1; s -= s_offset; b_dim1 = *lda; b_offset = 1 + b_dim1 * 1; b -= b_offset; a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; z_dim1 = *ldq; z_offset = 1 + z_dim1 * 1; z__ -= z_offset; q_dim1 = *ldq; q_offset = 1 + q_dim1 * 1; q -= q_offset; qe_dim1 = *ldqe; qe_offset = 1 + qe_dim1 * 1; qe -= qe_offset; --alpha; --beta; --alpha1; --beta1; --work; --rwork; --result; /* Function Body Check for errors */ *info = 0; badnn = FALSE_; nmax = 1; i__1 = *nsizes; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__2 = nmax, i__3 = nn[j]; nmax = max(i__2,i__3); if (nn[j] < 0) { badnn = TRUE_; } /* L10: */ } if (*nsizes < 0) { *info = -1; } else if (badnn) { *info = -2; } else if (*ntypes < 0) { *info = -3; } else if (*thresh < 0.f) { *info = -6; } else if (*lda <= 1 || *lda < nmax) { *info = -9; } else if (*ldq <= 1 || *ldq < nmax) { *info = -14; } else if (*ldqe <= 1 || *ldqe < nmax) { *info = -17; } /* Compute workspace (Note: Comments in the code beginning "Workspace:" describe the minimal amount of workspace needed at that point in the code, as well as the preferred amount for good performance. NB refers to the optimal block size for the immediately following subroutine, as returned by ILAENV. */ minwrk = 1; if (*info == 0 && *lwork >= 1) { minwrk = nmax * (nmax + 1); /* Computing MAX */ i__1 = 1, i__2 = ilaenv_(&c__1, "CGEQRF", " ", &nmax, &nmax, &c_n1, & c_n1, (ftnlen)6, (ftnlen)1), i__1 = max(i__1,i__2), i__2 = ilaenv_(&c__1, "CUNMQR", "LC", &nmax, &nmax, &nmax, &c_n1, ( ftnlen)6, (ftnlen)2), i__1 = max(i__1,i__2), i__2 = ilaenv_(& c__1, "CUNGQR", " ", &nmax, &nmax, &nmax, &c_n1, (ftnlen)6, ( ftnlen)1); nb = max(i__1,i__2); /* Computing MAX */ i__1 = nmax << 1, i__2 = nmax * (nb + 1), i__1 = max(i__1,i__2), i__2 = nmax * (nmax + 1); maxwrk = max(i__1,i__2); work[1].r = (real) maxwrk, work[1].i = 0.f; } if (*lwork < minwrk) { *info = -23; } if (*info != 0) { i__1 = -(*info); xerbla_("CDRGEV", &i__1); return 0; } /* Quick return if possible */ if (*nsizes == 0 || *ntypes == 0) { return 0; } ulp = slamch_("Precision"); safmin = slamch_("Safe minimum"); safmin /= ulp; safmax = 1.f / safmin; slabad_(&safmin, &safmax); ulpinv = 1.f / ulp; /* The values RMAGN(2:3) depend on N, see below. */ rmagn[0] = 0.f; rmagn[1] = 1.f; /* Loop over sizes, types */ ntestt = 0; nerrs = 0; nmats = 0; i__1 = *nsizes; for (jsize = 1; jsize <= i__1; ++jsize) { n = nn[jsize]; n1 = max(1,n); rmagn[2] = safmax * ulp / (real) n1; rmagn[3] = safmin * ulpinv * n1; if (*nsizes != 1) { mtypes = min(26,*ntypes); } else { mtypes = min(27,*ntypes); } i__2 = mtypes; for (jtype = 1; jtype <= i__2; ++jtype) { if (! dotype[jtype]) { goto L210; } ++nmats; /* Save ISEED in case of an error. */ for (j = 1; j <= 4; ++j) { ioldsd[j - 1] = iseed[j]; /* L20: */ } /* Generate test matrices A and B Description of control parameters: KCLASS: =1 means w/o rotation, =2 means w/ rotation, =3 means random. KATYPE: the "type" to be passed to CLATM4 for computing A. KAZERO: the pattern of zeros on the diagonal for A: =1: ( xxx ), =2: (0, xxx ) =3: ( 0, 0, xxx, 0 ), =4: ( 0, xxx, 0, 0 ), =5: ( 0, 0, 1, xxx, 0 ), =6: ( 0, 1, 0, xxx, 0 ). (xxx means a string of non-zero entries.) KAMAGN: the magnitude of the matrix: =0: zero, =1: O(1), =2: large, =3: small. LASIGN: .TRUE. if the diagonal elements of A are to be multiplied by a random magnitude 1 number. KBTYPE, KBZERO, KBMAGN, LBSIGN: the same, but for B. KTRIAN: =0: don't fill in the upper triangle, =1: do. KZ1, KZ2, KADD: used to implement KAZERO and KBZERO. RMAGN: used to implement KAMAGN and KBMAGN. */ if (mtypes > 26) { goto L100; } ierr = 0; if (kclass[jtype - 1] < 3) { /* Generate A (w/o rotation) */ if ((i__3 = katype[jtype - 1], abs(i__3)) == 3) { in = ((n - 1) / 2 << 1) + 1; if (in != n) { claset_("Full", &n, &n, &c_b1, &c_b1, &a[a_offset], lda); } } else { in = n; } clatm4_(&katype[jtype - 1], &in, &kz1[kazero[jtype - 1] - 1], &kz2[kazero[jtype - 1] - 1], &lasign[jtype - 1], & rmagn[kamagn[jtype - 1]], &ulp, &rmagn[ktrian[jtype - 1] * kamagn[jtype - 1]], &c__2, &iseed[1], &a[ a_offset], lda); iadd = kadd[kazero[jtype - 1] - 1]; if (iadd > 0 && iadd <= n) { i__3 = a_subscr(iadd, iadd); i__4 = kamagn[jtype - 1]; a[i__3].r = rmagn[i__4], a[i__3].i = 0.f; } /* Generate B (w/o rotation) */ if ((i__3 = kbtype[jtype - 1], abs(i__3)) == 3) { in = ((n - 1) / 2 << 1) + 1; if (in != n) { claset_("Full", &n, &n, &c_b1, &c_b1, &b[b_offset], lda); } } else { in = n; } clatm4_(&kbtype[jtype - 1], &in, &kz1[kbzero[jtype - 1] - 1], &kz2[kbzero[jtype - 1] - 1], &lbsign[jtype - 1], & rmagn[kbmagn[jtype - 1]], &c_b28, &rmagn[ktrian[jtype - 1] * kbmagn[jtype - 1]], &c__2, &iseed[1], &b[ b_offset], lda); iadd = kadd[kbzero[jtype - 1] - 1]; if (iadd != 0 && iadd <= n) { i__3 = b_subscr(iadd, iadd); i__4 = kbmagn[jtype - 1]; b[i__3].r = rmagn[i__4], b[i__3].i = 0.f; } if (kclass[jtype - 1] == 2 && n > 0) { /* Include rotations Generate Q, Z as Householder transformations times a diagonal matrix. */ i__3 = n - 1; for (jc = 1; jc <= i__3; ++jc) { i__4 = n; for (jr = jc; jr <= i__4; ++jr) { i__5 = q_subscr(jr, jc); clarnd_(&q__1, &c__3, &iseed[1]); q[i__5].r = q__1.r, q[i__5].i = q__1.i; i__5 = z___subscr(jr, jc); clarnd_(&q__1, &c__3, &iseed[1]); z__[i__5].r = q__1.r, z__[i__5].i = q__1.i; /* L30: */ } i__4 = n + 1 - jc; clarfg_(&i__4, &q_ref(jc, jc), &q_ref(jc + 1, jc), & c__1, &work[jc]); i__4 = (n << 1) + jc; i__5 = q_subscr(jc, jc); r__2 = q[i__5].r; r__1 = r_sign(&c_b28, &r__2); work[i__4].r = r__1, work[i__4].i = 0.f; i__4 = q_subscr(jc, jc); q[i__4].r = 1.f, q[i__4].i = 0.f; i__4 = n + 1 - jc; clarfg_(&i__4, &z___ref(jc, jc), &z___ref(jc + 1, jc), &c__1, &work[n + jc]); i__4 = n * 3 + jc; i__5 = z___subscr(jc, jc); r__2 = z__[i__5].r; r__1 = r_sign(&c_b28, &r__2); work[i__4].r = r__1, work[i__4].i = 0.f; i__4 = z___subscr(jc, jc); z__[i__4].r = 1.f, z__[i__4].i = 0.f; /* L40: */ } clarnd_(&q__1, &c__3, &iseed[1]); ctemp.r = q__1.r, ctemp.i = q__1.i; i__3 = q_subscr(n, n); q[i__3].r = 1.f, q[i__3].i = 0.f; i__3 = n; work[i__3].r = 0.f, work[i__3].i = 0.f; i__3 = n * 3; r__1 = c_abs(&ctemp); q__1.r = ctemp.r / r__1, q__1.i = ctemp.i / r__1; work[i__3].r = q__1.r, work[i__3].i = q__1.i; clarnd_(&q__1, &c__3, &iseed[1]); ctemp.r = q__1.r, ctemp.i = q__1.i; i__3 = z___subscr(n, n); z__[i__3].r = 1.f, z__[i__3].i = 0.f; i__3 = n << 1; work[i__3].r = 0.f, work[i__3].i = 0.f; i__3 = n << 2; r__1 = c_abs(&ctemp); q__1.r = ctemp.r / r__1, q__1.i = ctemp.i / r__1; work[i__3].r = q__1.r, work[i__3].i = q__1.i; /* Apply the diagonal matrices */ i__3 = n; for (jc = 1; jc <= i__3; ++jc) { i__4 = n; for (jr = 1; jr <= i__4; ++jr) { i__5 = a_subscr(jr, jc); i__6 = (n << 1) + jr; r_cnjg(&q__3, &work[n * 3 + jc]); q__2.r = work[i__6].r * q__3.r - work[i__6].i * q__3.i, q__2.i = work[i__6].r * q__3.i + work[i__6].i * q__3.r; i__7 = a_subscr(jr, jc); q__1.r = q__2.r * a[i__7].r - q__2.i * a[i__7].i, q__1.i = q__2.r * a[i__7].i + q__2.i * a[ i__7].r; a[i__5].r = q__1.r, a[i__5].i = q__1.i; i__5 = b_subscr(jr, jc); i__6 = (n << 1) + jr; r_cnjg(&q__3, &work[n * 3 + jc]); q__2.r = work[i__6].r * q__3.r - work[i__6].i * q__3.i, q__2.i = work[i__6].r * q__3.i + work[i__6].i * q__3.r; i__7 = b_subscr(jr, jc); q__1.r = q__2.r * b[i__7].r - q__2.i * b[i__7].i, q__1.i = q__2.r * b[i__7].i + q__2.i * b[ i__7].r; b[i__5].r = q__1.r, b[i__5].i = q__1.i; /* L50: */ } /* L60: */ } i__3 = n - 1; cunm2r_("L", "N", &n, &n, &i__3, &q[q_offset], ldq, &work[ 1], &a[a_offset], lda, &work[(n << 1) + 1], &ierr); if (ierr != 0) { goto L90; } i__3 = n - 1; cunm2r_("R", "C", &n, &n, &i__3, &z__[z_offset], ldq, & work[n + 1], &a[a_offset], lda, &work[(n << 1) + 1], &ierr); if (ierr != 0) { goto L90; } i__3 = n - 1; cunm2r_("L", "N", &n, &n, &i__3, &q[q_offset], ldq, &work[ 1], &b[b_offset], lda, &work[(n << 1) + 1], &ierr); if (ierr != 0) { goto L90; } i__3 = n - 1; cunm2r_("R", "C", &n, &n, &i__3, &z__[z_offset], ldq, & work[n + 1], &b[b_offset], lda, &work[(n << 1) + 1], &ierr); if (ierr != 0) { goto L90; } } } else { /* Random matrices */ i__3 = n; for (jc = 1; jc <= i__3; ++jc) { i__4 = n; for (jr = 1; jr <= i__4; ++jr) { i__5 = a_subscr(jr, jc); i__6 = kamagn[jtype - 1]; clarnd_(&q__2, &c__4, &iseed[1]); q__1.r = rmagn[i__6] * q__2.r, q__1.i = rmagn[i__6] * q__2.i; a[i__5].r = q__1.r, a[i__5].i = q__1.i; i__5 = b_subscr(jr, jc); i__6 = kbmagn[jtype - 1]; clarnd_(&q__2, &c__4, &iseed[1]); q__1.r = rmagn[i__6] * q__2.r, q__1.i = rmagn[i__6] * q__2.i; b[i__5].r = q__1.r, b[i__5].i = q__1.i; /* L70: */ } /* L80: */ } } L90: if (ierr != 0) { io___40.ciunit = *nounit; s_wsfe(&io___40); do_fio(&c__1, "Generator", (ftnlen)9); do_fio(&c__1, (char *)&ierr, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)); do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof(integer)); e_wsfe(); *info = abs(ierr); return 0; } L100: for (i__ = 1; i__ <= 7; ++i__) { result[i__] = -1.f; /* L110: */ } /* Call CGGEV to compute eigenvalues and eigenvectors. */ clacpy_(" ", &n, &n, &a[a_offset], lda, &s[s_offset], lda); clacpy_(" ", &n, &n, &b[b_offset], lda, &t[t_offset], lda); cggev_("V", "V", &n, &s[s_offset], lda, &t[t_offset], lda, &alpha[ 1], &beta[1], &q[q_offset], ldq, &z__[z_offset], ldq, & work[1], lwork, &rwork[1], &ierr); if (ierr != 0 && ierr != n + 1) { result[1] = ulpinv; io___42.ciunit = *nounit; s_wsfe(&io___42); do_fio(&c__1, "CGGEV1", (ftnlen)6); do_fio(&c__1, (char *)&ierr, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)); do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof(integer)); e_wsfe(); *info = abs(ierr); goto L190; } /* Do the tests (1) and (2) */ cget52_(&c_true, &n, &a[a_offset], lda, &b[b_offset], lda, &q[ q_offset], ldq, &alpha[1], &beta[1], &work[1], &rwork[1], &result[1]); if (result[2] > *thresh) { io___43.ciunit = *nounit; s_wsfe(&io___43); do_fio(&c__1, "Left", (ftnlen)4); do_fio(&c__1, "CGGEV1", (ftnlen)6); do_fio(&c__1, (char *)&result[2], (ftnlen)sizeof(real)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)); do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof(integer)); e_wsfe(); } /* Do the tests (3) and (4) */ cget52_(&c_false, &n, &a[a_offset], lda, &b[b_offset], lda, &z__[ z_offset], ldq, &alpha[1], &beta[1], &work[1], &rwork[1], &result[3]); if (result[4] > *thresh) { io___44.ciunit = *nounit; s_wsfe(&io___44); do_fio(&c__1, "Right", (ftnlen)5); do_fio(&c__1, "CGGEV1", (ftnlen)6); do_fio(&c__1, (char *)&result[4], (ftnlen)sizeof(real)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)); do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof(integer)); e_wsfe(); } /* Do test (5) */ clacpy_(" ", &n, &n, &a[a_offset], lda, &s[s_offset], lda); clacpy_(" ", &n, &n, &b[b_offset], lda, &t[t_offset], lda); cggev_("N", "N", &n, &s[s_offset], lda, &t[t_offset], lda, & alpha1[1], &beta1[1], &q[q_offset], ldq, &z__[z_offset], ldq, &work[1], lwork, &rwork[1], &ierr); if (ierr != 0 && ierr != n + 1) { result[1] = ulpinv; io___45.ciunit = *nounit; s_wsfe(&io___45); do_fio(&c__1, "CGGEV2", (ftnlen)6); do_fio(&c__1, (char *)&ierr, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)); do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof(integer)); e_wsfe(); *info = abs(ierr); goto L190; } i__3 = n; for (j = 1; j <= i__3; ++j) { i__4 = j; i__5 = j; i__6 = j; i__7 = j; if (alpha[i__4].r != alpha1[i__5].r || alpha[i__4].i != alpha1[i__5].i || (beta[i__6].r != beta1[i__7].r || beta[i__6].i != beta1[i__7].i)) { result[5] = ulpinv; } /* L120: */ } /* Do test (6): Compute eigenvalues and left eigenvectors, and test them */ clacpy_(" ", &n, &n, &a[a_offset], lda, &s[s_offset], lda); clacpy_(" ", &n, &n, &b[b_offset], lda, &t[t_offset], lda); cggev_("V", "N", &n, &s[s_offset], lda, &t[t_offset], lda, & alpha1[1], &beta1[1], &qe[qe_offset], ldqe, &z__[z_offset] , ldq, &work[1], lwork, &rwork[1], &ierr); if (ierr != 0 && ierr != n + 1) { result[1] = ulpinv; io___46.ciunit = *nounit; s_wsfe(&io___46); do_fio(&c__1, "CGGEV3", (ftnlen)6); do_fio(&c__1, (char *)&ierr, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)); do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof(integer)); e_wsfe(); *info = abs(ierr); goto L190; } i__3 = n; for (j = 1; j <= i__3; ++j) { i__4 = j; i__5 = j; i__6 = j; i__7 = j; if (alpha[i__4].r != alpha1[i__5].r || alpha[i__4].i != alpha1[i__5].i || (beta[i__6].r != beta1[i__7].r || beta[i__6].i != beta1[i__7].i)) { result[6] = ulpinv; } /* L130: */ } i__3 = n; for (j = 1; j <= i__3; ++j) { i__4 = n; for (jc = 1; jc <= i__4; ++jc) { i__5 = q_subscr(j, jc); i__6 = qe_subscr(j, jc); if (q[i__5].r != qe[i__6].r || q[i__5].i != qe[i__6].i) { result[6] = ulpinv; } /* L140: */ } /* L150: */ } /* Do test (7): Compute eigenvalues and right eigenvectors, and test them */ clacpy_(" ", &n, &n, &a[a_offset], lda, &s[s_offset], lda); clacpy_(" ", &n, &n, &b[b_offset], lda, &t[t_offset], lda); cggev_("N", "V", &n, &s[s_offset], lda, &t[t_offset], lda, & alpha1[1], &beta1[1], &q[q_offset], ldq, &qe[qe_offset], ldqe, &work[1], lwork, &rwork[1], &ierr); if (ierr != 0 && ierr != n + 1) { result[1] = ulpinv; io___47.ciunit = *nounit; s_wsfe(&io___47); do_fio(&c__1, "CGGEV4", (ftnlen)6); do_fio(&c__1, (char *)&ierr, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)); do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof(integer)); e_wsfe(); *info = abs(ierr); goto L190; } i__3 = n; for (j = 1; j <= i__3; ++j) { i__4 = j; i__5 = j; i__6 = j; i__7 = j; if (alpha[i__4].r != alpha1[i__5].r || alpha[i__4].i != alpha1[i__5].i || (beta[i__6].r != beta1[i__7].r || beta[i__6].i != beta1[i__7].i)) { result[7] = ulpinv; } /* L160: */ } i__3 = n; for (j = 1; j <= i__3; ++j) { i__4 = n; for (jc = 1; jc <= i__4; ++jc) { i__5 = z___subscr(j, jc); i__6 = qe_subscr(j, jc); if (z__[i__5].r != qe[i__6].r || z__[i__5].i != qe[i__6] .i) { result[7] = ulpinv; } /* L170: */ } /* L180: */ } /* End of Loop -- Check for RESULT(j) > THRESH */ L190: ntestt += 7; /* Print out tests which fail. */ for (jr = 1; jr <= 9; ++jr) { if (result[jr] >= *thresh) { /* If this is the first test to fail, print a header to the data file. */ if (nerrs == 0) { io___48.ciunit = *nounit; s_wsfe(&io___48); do_fio(&c__1, "CGV", (ftnlen)3); e_wsfe(); /* Matrix types */ io___49.ciunit = *nounit; s_wsfe(&io___49); e_wsfe(); io___50.ciunit = *nounit; s_wsfe(&io___50); e_wsfe(); io___51.ciunit = *nounit; s_wsfe(&io___51); do_fio(&c__1, "Orthogonal", (ftnlen)10); e_wsfe(); /* Tests performed */ io___52.ciunit = *nounit; s_wsfe(&io___52); e_wsfe(); } ++nerrs; if (result[jr] < 1e4f) { io___53.ciunit = *nounit; s_wsfe(&io___53); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)) ; do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&jr, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&result[jr], (ftnlen)sizeof( real)); e_wsfe(); } else { io___54.ciunit = *nounit; s_wsfe(&io___54); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)) ; do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&jr, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&result[jr], (ftnlen)sizeof( real)); e_wsfe(); } } /* L200: */ } L210: ; } /* L220: */ } /* Summary */ alasvm_("CGV", nounit, &nerrs, &ntestt, &c__0); work[1].r = (real) maxwrk, work[1].i = 0.f; return 0; /* End of CDRGEV */ } /* cdrgev_ */
/* Subroutine */ int cdrvrf1_(integer *nout, integer *nn, integer *nval, real *thresh, complex *a, integer *lda, complex *arf, real *work) { /* Initialized data */ static integer iseedy[4] = { 1988,1989,1990,1991 }; static char uplos[1*2] = "U" "L"; static char forms[1*2] = "N" "C"; static char norms[1*4] = "M" "1" "I" "F"; /* Format strings */ static char fmt_9999[] = "(1x,\002 *** Error(s) or Failure(s) while test" "ing CLANHF ***\002)"; static char fmt_9998[] = "(1x,\002 Error in \002,a6,\002 with UPLO=" "'\002,a1,\002', FORM='\002,a1,\002', N=\002,i5)"; static char fmt_9997[] = "(1x,\002 Failure in \002,a6,\002 N=\002," "i5,\002 TYPE=\002,i5,\002 UPLO='\002,a1,\002', FORM ='\002,a1" ",\002', NORM='\002,a1,\002', test=\002,g12.5)"; static char fmt_9996[] = "(1x,\002All tests for \002,a6,\002 auxiliary r" "outine passed the \002,\002threshold (\002,i5,\002 tests run)" "\002)"; static char fmt_9995[] = "(1x,a6,\002 auxiliary routine:\002,i5,\002 out" " of \002,i5,\002 tests failed to pass the threshold\002)"; static char fmt_9994[] = "(26x,i5,\002 error message recorded (\002,a6" ",\002)\002)"; /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5; complex q__1; /* Local variables */ integer i__, j, n, iin, iit; real eps; integer info; char norm[1], uplo[1]; integer nrun, nfail; real large; integer iseed[4]; char cform[1]; real small; integer iform; real norma; integer inorm, iuplo, nerrs; real result[1], normarf; /* Fortran I/O blocks */ static cilist io___22 = { 0, 0, 0, 0, 0 }; static cilist io___23 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___24 = { 0, 0, 0, fmt_9998, 0 }; static cilist io___30 = { 0, 0, 0, 0, 0 }; static cilist io___31 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___32 = { 0, 0, 0, fmt_9997, 0 }; static cilist io___33 = { 0, 0, 0, fmt_9996, 0 }; static cilist io___34 = { 0, 0, 0, fmt_9995, 0 }; static cilist io___35 = { 0, 0, 0, fmt_9994, 0 }; /* -- LAPACK test routine (version 3.2.0) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* CDRVRF1 tests the LAPACK RFP routines: */ /* CLANHF.F */ /* Arguments */ /* ========= */ /* NOUT (input) INTEGER */ /* The unit number for output. */ /* NN (input) INTEGER */ /* The number of values of N contained in the vector NVAL. */ /* NVAL (input) INTEGER array, dimension (NN) */ /* The values of the matrix dimension N. */ /* THRESH (input) REAL */ /* The threshold value for the test ratios. A result is */ /* included in the output file if RESULT >= THRESH. To have */ /* every test ratio printed, use THRESH = 0. */ /* A (workspace) COMPLEX array, dimension (LDA,NMAX) */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,NMAX). */ /* ARF (workspace) COMPLEX array, dimension ((NMAX*(NMAX+1))/2). */ /* WORK (workspace) COMPLEX array, dimension ( NMAX ) */ /* ===================================================================== */ /* .. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Scalars in Common .. */ /* .. */ /* .. Common blocks .. */ /* .. */ /* .. Data statements .. */ /* Parameter adjustments */ --nval; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --arf; --work; /* Function Body */ /* .. */ /* .. Executable Statements .. */ /* Initialize constants and the random number seed. */ nrun = 0; nfail = 0; nerrs = 0; info = 0; for (i__ = 1; i__ <= 4; ++i__) { iseed[i__ - 1] = iseedy[i__ - 1]; /* L10: */ } eps = slamch_("Precision"); small = slamch_("Safe minimum"); large = 1.f / small; small = small * *lda * *lda; large = large / *lda / *lda; i__1 = *nn; for (iin = 1; iin <= i__1; ++iin) { n = nval[iin]; for (iit = 1; iit <= 3; ++iit) { /* IIT = 1 : random matrix */ /* IIT = 2 : random matrix scaled near underflow */ /* IIT = 3 : random matrix scaled near overflow */ i__2 = n; for (j = 1; j <= i__2; ++j) { i__3 = n; for (i__ = 1; i__ <= i__3; ++i__) { i__4 = i__ + j * a_dim1; clarnd_(&q__1, &c__4, iseed); a[i__4].r = q__1.r, a[i__4].i = q__1.i; } } if (iit == 2) { i__2 = n; for (j = 1; j <= i__2; ++j) { i__3 = n; for (i__ = 1; i__ <= i__3; ++i__) { i__4 = i__ + j * a_dim1; i__5 = i__ + j * a_dim1; q__1.r = large * a[i__5].r, q__1.i = large * a[i__5] .i; a[i__4].r = q__1.r, a[i__4].i = q__1.i; } } } if (iit == 3) { i__2 = n; for (j = 1; j <= i__2; ++j) { i__3 = n; for (i__ = 1; i__ <= i__3; ++i__) { i__4 = i__ + j * a_dim1; i__5 = i__ + j * a_dim1; q__1.r = small * a[i__5].r, q__1.i = small * a[i__5] .i; a[i__4].r = q__1.r, a[i__4].i = q__1.i; } } } /* Do first for UPLO = 'U', then for UPLO = 'L' */ for (iuplo = 1; iuplo <= 2; ++iuplo) { *(unsigned char *)uplo = *(unsigned char *)&uplos[iuplo - 1]; /* Do first for CFORM = 'N', then for CFORM = 'C' */ for (iform = 1; iform <= 2; ++iform) { *(unsigned char *)cform = *(unsigned char *)&forms[iform - 1]; s_copy(srnamc_1.srnamt, "CTRTTF", (ftnlen)32, (ftnlen)6); ctrttf_(cform, uplo, &n, &a[a_offset], lda, &arf[1], & info); /* Check error code from CTRTTF */ if (info != 0) { if (nfail == 0 && nerrs == 0) { io___22.ciunit = *nout; s_wsle(&io___22); e_wsle(); io___23.ciunit = *nout; s_wsfe(&io___23); e_wsfe(); } io___24.ciunit = *nout; s_wsfe(&io___24); do_fio(&c__1, srnamc_1.srnamt, (ftnlen)32); do_fio(&c__1, uplo, (ftnlen)1); do_fio(&c__1, cform, (ftnlen)1); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); e_wsfe(); ++nerrs; goto L100; } for (inorm = 1; inorm <= 4; ++inorm) { /* Check all four norms: 'M', '1', 'I', 'F' */ *(unsigned char *)norm = *(unsigned char *)&norms[ inorm - 1]; normarf = clanhf_(norm, cform, uplo, &n, &arf[1], & work[1]); norma = clanhe_(norm, uplo, &n, &a[a_offset], lda, & work[1]); result[0] = (norma - normarf) / norma / eps; ++nrun; if (result[0] >= *thresh) { if (nfail == 0 && nerrs == 0) { io___30.ciunit = *nout; s_wsle(&io___30); e_wsle(); io___31.ciunit = *nout; s_wsfe(&io___31); e_wsfe(); } io___32.ciunit = *nout; s_wsfe(&io___32); do_fio(&c__1, "CLANHF", (ftnlen)6); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)) ; do_fio(&c__1, (char *)&iit, (ftnlen)sizeof( integer)); do_fio(&c__1, uplo, (ftnlen)1); do_fio(&c__1, cform, (ftnlen)1); do_fio(&c__1, norm, (ftnlen)1); do_fio(&c__1, (char *)&result[0], (ftnlen)sizeof( real)); e_wsfe(); ++nfail; } /* L90: */ } L100: ; } /* L110: */ } /* L120: */ } /* L130: */ } /* Print a summary of the results. */ if (nfail == 0) { io___33.ciunit = *nout; s_wsfe(&io___33); do_fio(&c__1, "CLANHF", (ftnlen)6); do_fio(&c__1, (char *)&nrun, (ftnlen)sizeof(integer)); e_wsfe(); } else { io___34.ciunit = *nout; s_wsfe(&io___34); do_fio(&c__1, "CLANHF", (ftnlen)6); do_fio(&c__1, (char *)&nfail, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&nrun, (ftnlen)sizeof(integer)); e_wsfe(); } if (nerrs != 0) { io___35.ciunit = *nout; s_wsfe(&io___35); do_fio(&c__1, (char *)&nerrs, (ftnlen)sizeof(integer)); do_fio(&c__1, "CLANHF", (ftnlen)6); e_wsfe(); } return 0; /* End of CDRVRF1 */ } /* cdrvrf1_ */
/* Subroutine */ int cckglm_(integer *nn, integer *nval, integer *mval, integer *pval, integer *nmats, integer *iseed, real *thresh, integer * nmax, complex *a, complex *af, complex *b, complex *bf, complex *x, complex *work, real *rwork, integer *nin, integer *nout, integer * info) { /* Format strings */ static char fmt_9997[] = "(\002 *** Invalid input for GLM: M = \002," "i6,\002, P = \002,i6,\002, N = \002,i6,\002;\002,/\002 must " "satisfy M <= N <= M+P \002,\002(this set of values will be skip" "ped)\002)"; static char fmt_9999[] = "(\002 CLATMS in CCKGLM INFO = \002,i5)"; static char fmt_9998[] = "(\002 N=\002,i4,\002 M=\002,i4,\002, P=\002," "i4,\002, type \002,i2,\002, test \002,i2,\002, ratio=\002,g13.6)"; /* System generated locals */ integer i__1, i__2, i__3; complex q__1; /* Builtin functions */ /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); integer s_wsle(cilist *), e_wsle(void), s_wsfe(cilist *), do_fio(integer * , char *, ftnlen), e_wsfe(void); /* Local variables */ integer i__, m, n, p, ik, lda, ldb, kla, klb, kua, kub, imat; char path[3], type__[1]; integer nrun, modea, modeb, nfail; char dista[1], distb[1]; integer iinfo; real resid, anorm, bnorm; integer lwork; extern /* Subroutine */ int slatb9_(char *, integer *, integer *, integer *, integer *, char *, integer *, integer *, integer *, integer *, real *, real *, integer *, integer *, real *, real *, char *, char *), alahdg_(integer *, char * ); real cndnma, cndnmb; extern /* Complex */ VOID clarnd_(complex *, integer *, integer *); extern /* Subroutine */ int alareq_(char *, integer *, logical *, integer *, integer *, integer *), alasum_(char *, integer *, integer *, integer *, integer *), clatms_(integer *, integer *, char *, integer *, char *, real *, integer *, real *, real *, integer *, integer *, char *, complex *, integer *, complex *, integer *), cglmts_(integer *, integer *, integer *, complex *, complex *, integer *, complex *, complex *, integer *, complex *, complex *, complex *, complex *, complex *, integer *, real *, real *); logical dotype[8], firstt; /* Fortran I/O blocks */ static cilist io___13 = { 0, 0, 0, 0, 0 }; static cilist io___14 = { 0, 0, 0, fmt_9997, 0 }; static cilist io___30 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___31 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___34 = { 0, 0, 0, fmt_9998, 0 }; /* -- LAPACK test routine (version 3.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* CCKGLM tests CGGGLM - subroutine for solving generalized linear */ /* model problem. */ /* Arguments */ /* ========= */ /* NN (input) INTEGER */ /* The number of values of N, M and P contained in the vectors */ /* NVAL, MVAL and PVAL. */ /* NVAL (input) INTEGER array, dimension (NN) */ /* The values of the matrix row dimension N. */ /* MVAL (input) INTEGER array, dimension (NN) */ /* The values of the matrix column dimension M. */ /* PVAL (input) INTEGER array, dimension (NN) */ /* The values of the matrix column dimension P. */ /* NMATS (input) INTEGER */ /* The number of matrix types to be tested for each combination */ /* of matrix dimensions. If NMATS >= NTYPES (the maximum */ /* number of matrix types), then all the different types are */ /* generated for testing. If NMATS < NTYPES, another input line */ /* is read to get the numbers of the matrix types to be used. */ /* ISEED (input/output) INTEGER array, dimension (4) */ /* On entry, the seed of the random number generator. The array */ /* elements should be between 0 and 4095, otherwise they will be */ /* reduced mod 4096, and ISEED(4) must be odd. */ /* On exit, the next seed in the random number sequence after */ /* all the test matrices have been generated. */ /* THRESH (input) REAL */ /* The threshold value for the test ratios. A result is */ /* included in the output file if RESID >= THRESH. To have */ /* every test ratio printed, use THRESH = 0. */ /* NMAX (input) INTEGER */ /* The maximum value permitted for M or N, used in dimensioning */ /* the work arrays. */ /* A (workspace) COMPLEX array, dimension (NMAX*NMAX) */ /* AF (workspace) COMPLEX array, dimension (NMAX*NMAX) */ /* B (workspace) COMPLEX array, dimension (NMAX*NMAX) */ /* BF (workspace) COMPLEX array, dimension (NMAX*NMAX) */ /* X (workspace) COMPLEX array, dimension (4*NMAX) */ /* RWORK (workspace) REAL array, dimension (NMAX) */ /* WORK (workspace) COMPLEX array, dimension (NMAX*NMAX) */ /* NIN (input) INTEGER */ /* The unit number for input. */ /* NOUT (input) INTEGER */ /* The unit number for output. */ /* INFO (output) INTEGER */ /* = 0 : successful exit */ /* > 0 : If CLATMS returns an error code, the absolute value */ /* of it is returned. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Initialize constants. */ /* Parameter adjustments */ --rwork; --work; --x; --bf; --b; --af; --a; --iseed; --pval; --mval; --nval; /* Function Body */ s_copy(path, "GLM", (ftnlen)3, (ftnlen)3); *info = 0; nrun = 0; nfail = 0; firstt = TRUE_; alareq_(path, nmats, dotype, &c__8, nin, nout); lda = *nmax; ldb = *nmax; lwork = *nmax * *nmax; /* Check for valid input values. */ i__1 = *nn; for (ik = 1; ik <= i__1; ++ik) { m = mval[ik]; p = pval[ik]; n = nval[ik]; if (m > n || n > m + p) { if (firstt) { io___13.ciunit = *nout; s_wsle(&io___13); e_wsle(); firstt = FALSE_; } io___14.ciunit = *nout; s_wsfe(&io___14); do_fio(&c__1, (char *)&m, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&p, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); e_wsfe(); } /* L10: */ } firstt = TRUE_; /* Do for each value of M in MVAL. */ i__1 = *nn; for (ik = 1; ik <= i__1; ++ik) { m = mval[ik]; p = pval[ik]; n = nval[ik]; if (m > n || n > m + p) { goto L40; } for (imat = 1; imat <= 8; ++imat) { /* Do the tests only if DOTYPE( IMAT ) is true. */ if (! dotype[imat - 1]) { goto L30; } /* Set up parameters with SLATB9 and generate test */ /* matrices A and B with CLATMS. */ slatb9_(path, &imat, &m, &p, &n, type__, &kla, &kua, &klb, &kub, & anorm, &bnorm, &modea, &modeb, &cndnma, &cndnmb, dista, distb); clatms_(&n, &m, dista, &iseed[1], type__, &rwork[1], &modea, & cndnma, &anorm, &kla, &kua, "No packing", &a[1], &lda, & work[1], &iinfo); if (iinfo != 0) { io___30.ciunit = *nout; s_wsfe(&io___30); do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer)); e_wsfe(); *info = abs(iinfo); goto L30; } clatms_(&n, &p, distb, &iseed[1], type__, &rwork[1], &modeb, & cndnmb, &bnorm, &klb, &kub, "No packing", &b[1], &ldb, & work[1], &iinfo); if (iinfo != 0) { io___31.ciunit = *nout; s_wsfe(&io___31); do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer)); e_wsfe(); *info = abs(iinfo); goto L30; } /* Generate random left hand side vector of GLM */ i__2 = n; for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__; clarnd_(&q__1, &c__2, &iseed[1]); x[i__3].r = q__1.r, x[i__3].i = q__1.i; /* L20: */ } cglmts_(&n, &m, &p, &a[1], &af[1], &lda, &b[1], &bf[1], &ldb, &x[ 1], &x[*nmax + 1], &x[(*nmax << 1) + 1], &x[*nmax * 3 + 1] , &work[1], &lwork, &rwork[1], &resid); /* Print information about the tests that did not */ /* pass the threshold. */ if (resid >= *thresh) { if (nfail == 0 && firstt) { firstt = FALSE_; alahdg_(nout, path); } io___34.ciunit = *nout; s_wsfe(&io___34); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&m, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&p, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&imat, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&c__1, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&resid, (ftnlen)sizeof(real)); e_wsfe(); ++nfail; } ++nrun; L30: ; } L40: ; } /* Print a summary of the results. */ alasum_(path, nout, &nfail, &nrun, &c__0); return 0; /* End of CCKGLM */ } /* cckglm_ */
/* Subroutine */ int clatsy_(char *uplo, integer *n, complex *x, integer *ldx, integer *iseed) { /* System generated locals */ integer x_dim1, x_offset, i__1, i__2, i__3; complex q__1, q__2, q__3; /* Local variables */ complex a, b, c__; integer i__, j; complex r__; integer n5; real beta, alpha, alpha3; /* -- LAPACK auxiliary test routine (version 3.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* CLATSY generates a special test matrix for the complex symmetric */ /* (indefinite) factorization. The pivot blocks of the generated matrix */ /* will be in the following order: */ /* 2x2 pivot block, non diagonalizable */ /* 1x1 pivot block */ /* 2x2 pivot block, diagonalizable */ /* (cycle repeats) */ /* A row interchange is required for each non-diagonalizable 2x2 block. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER */ /* Specifies whether the generated matrix is to be upper or */ /* lower triangular. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The dimension of the matrix to be generated. */ /* X (output) COMPLEX array, dimension (LDX,N) */ /* The generated matrix, consisting of 3x3 and 2x2 diagonal */ /* blocks which result in the pivot sequence given above. */ /* The matrix outside of these diagonal blocks is zero. */ /* LDX (input) INTEGER */ /* The leading dimension of the array X. */ /* ISEED (input/output) INTEGER array, dimension (4) */ /* On entry, the seed for the random number generator. The last */ /* of the four integers must be odd. (modified on exit) */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Initialize constants */ /* Parameter adjustments */ x_dim1 = *ldx; x_offset = 1 + x_dim1; x -= x_offset; --iseed; /* Function Body */ alpha = (sqrt(17.f) + 1.f) / 8.f; beta = alpha - .001f; alpha3 = alpha * alpha * alpha; /* UPLO = 'U': Upper triangular storage */ if (*(unsigned char *)uplo == 'U') { /* Fill the upper triangle of the matrix with zeros. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = j; for (i__ = 1; i__ <= i__2; ++i__) { i__3 = i__ + j * x_dim1; x[i__3].r = 0.f, x[i__3].i = 0.f; /* L10: */ } /* L20: */ } n5 = *n / 5; n5 = *n - n5 * 5 + 1; i__1 = n5; for (i__ = *n; i__ >= i__1; i__ += -5) { clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = alpha3 * q__2.r, q__1.i = alpha3 * q__2.i; a.r = q__1.r, a.i = q__1.i; clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = q__2.r / alpha, q__1.i = q__2.i / alpha; b.r = q__1.r, b.i = q__1.i; q__3.r = b.r * 2.f, q__3.i = b.i * 2.f; q__2.r = q__3.r * 0.f - q__3.i * 1.f, q__2.i = q__3.r * 1.f + q__3.i * 0.f; q__1.r = a.r - q__2.r, q__1.i = a.i - q__2.i; c__.r = q__1.r, c__.i = q__1.i; q__1.r = c__.r / beta, q__1.i = c__.i / beta; r__.r = q__1.r, r__.i = q__1.i; i__2 = i__ + i__ * x_dim1; x[i__2].r = a.r, x[i__2].i = a.i; i__2 = i__ - 2 + i__ * x_dim1; x[i__2].r = b.r, x[i__2].i = b.i; i__2 = i__ - 2 + (i__ - 1) * x_dim1; x[i__2].r = r__.r, x[i__2].i = r__.i; i__2 = i__ - 2 + (i__ - 2) * x_dim1; x[i__2].r = c__.r, x[i__2].i = c__.i; i__2 = i__ - 1 + (i__ - 1) * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__2].r = q__1.r, x[i__2].i = q__1.i; i__2 = i__ - 3 + (i__ - 3) * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__2].r = q__1.r, x[i__2].i = q__1.i; i__2 = i__ - 4 + (i__ - 4) * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__2].r = q__1.r, x[i__2].i = q__1.i; if (c_abs(&x[i__ - 3 + (i__ - 3) * x_dim1]) > c_abs(&x[i__ - 4 + ( i__ - 4) * x_dim1])) { i__2 = i__ - 4 + (i__ - 3) * x_dim1; i__3 = i__ - 3 + (i__ - 3) * x_dim1; q__1.r = x[i__3].r * 2.f, q__1.i = x[i__3].i * 2.f; x[i__2].r = q__1.r, x[i__2].i = q__1.i; } else { i__2 = i__ - 4 + (i__ - 3) * x_dim1; i__3 = i__ - 4 + (i__ - 4) * x_dim1; q__1.r = x[i__3].r * 2.f, q__1.i = x[i__3].i * 2.f; x[i__2].r = q__1.r, x[i__2].i = q__1.i; } /* L30: */ } /* Clean-up for N not a multiple of 5. */ i__ = n5 - 1; if (i__ > 2) { clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = alpha3 * q__2.r, q__1.i = alpha3 * q__2.i; a.r = q__1.r, a.i = q__1.i; clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = q__2.r / alpha, q__1.i = q__2.i / alpha; b.r = q__1.r, b.i = q__1.i; q__3.r = b.r * 2.f, q__3.i = b.i * 2.f; q__2.r = q__3.r * 0.f - q__3.i * 1.f, q__2.i = q__3.r * 1.f + q__3.i * 0.f; q__1.r = a.r - q__2.r, q__1.i = a.i - q__2.i; c__.r = q__1.r, c__.i = q__1.i; q__1.r = c__.r / beta, q__1.i = c__.i / beta; r__.r = q__1.r, r__.i = q__1.i; i__1 = i__ + i__ * x_dim1; x[i__1].r = a.r, x[i__1].i = a.i; i__1 = i__ - 2 + i__ * x_dim1; x[i__1].r = b.r, x[i__1].i = b.i; i__1 = i__ - 2 + (i__ - 1) * x_dim1; x[i__1].r = r__.r, x[i__1].i = r__.i; i__1 = i__ - 2 + (i__ - 2) * x_dim1; x[i__1].r = c__.r, x[i__1].i = c__.i; i__1 = i__ - 1 + (i__ - 1) * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; i__ += -3; } if (i__ > 1) { i__1 = i__ + i__ * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; i__1 = i__ - 1 + (i__ - 1) * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; if (c_abs(&x[i__ + i__ * x_dim1]) > c_abs(&x[i__ - 1 + (i__ - 1) * x_dim1])) { i__1 = i__ - 1 + i__ * x_dim1; i__2 = i__ + i__ * x_dim1; q__1.r = x[i__2].r * 2.f, q__1.i = x[i__2].i * 2.f; x[i__1].r = q__1.r, x[i__1].i = q__1.i; } else { i__1 = i__ - 1 + i__ * x_dim1; i__2 = i__ - 1 + (i__ - 1) * x_dim1; q__1.r = x[i__2].r * 2.f, q__1.i = x[i__2].i * 2.f; x[i__1].r = q__1.r, x[i__1].i = q__1.i; } i__ += -2; } else if (i__ == 1) { i__1 = i__ + i__ * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; --i__; } /* UPLO = 'L': Lower triangular storage */ } else { /* Fill the lower triangle of the matrix with zeros. */ i__1 = *n; for (j = 1; j <= i__1; ++j) { i__2 = *n; for (i__ = j; i__ <= i__2; ++i__) { i__3 = i__ + j * x_dim1; x[i__3].r = 0.f, x[i__3].i = 0.f; /* L40: */ } /* L50: */ } n5 = *n / 5; n5 *= 5; i__1 = n5; for (i__ = 1; i__ <= i__1; i__ += 5) { clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = alpha3 * q__2.r, q__1.i = alpha3 * q__2.i; a.r = q__1.r, a.i = q__1.i; clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = q__2.r / alpha, q__1.i = q__2.i / alpha; b.r = q__1.r, b.i = q__1.i; q__3.r = b.r * 2.f, q__3.i = b.i * 2.f; q__2.r = q__3.r * 0.f - q__3.i * 1.f, q__2.i = q__3.r * 1.f + q__3.i * 0.f; q__1.r = a.r - q__2.r, q__1.i = a.i - q__2.i; c__.r = q__1.r, c__.i = q__1.i; q__1.r = c__.r / beta, q__1.i = c__.i / beta; r__.r = q__1.r, r__.i = q__1.i; i__2 = i__ + i__ * x_dim1; x[i__2].r = a.r, x[i__2].i = a.i; i__2 = i__ + 2 + i__ * x_dim1; x[i__2].r = b.r, x[i__2].i = b.i; i__2 = i__ + 2 + (i__ + 1) * x_dim1; x[i__2].r = r__.r, x[i__2].i = r__.i; i__2 = i__ + 2 + (i__ + 2) * x_dim1; x[i__2].r = c__.r, x[i__2].i = c__.i; i__2 = i__ + 1 + (i__ + 1) * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__2].r = q__1.r, x[i__2].i = q__1.i; i__2 = i__ + 3 + (i__ + 3) * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__2].r = q__1.r, x[i__2].i = q__1.i; i__2 = i__ + 4 + (i__ + 4) * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__2].r = q__1.r, x[i__2].i = q__1.i; if (c_abs(&x[i__ + 3 + (i__ + 3) * x_dim1]) > c_abs(&x[i__ + 4 + ( i__ + 4) * x_dim1])) { i__2 = i__ + 4 + (i__ + 3) * x_dim1; i__3 = i__ + 3 + (i__ + 3) * x_dim1; q__1.r = x[i__3].r * 2.f, q__1.i = x[i__3].i * 2.f; x[i__2].r = q__1.r, x[i__2].i = q__1.i; } else { i__2 = i__ + 4 + (i__ + 3) * x_dim1; i__3 = i__ + 4 + (i__ + 4) * x_dim1; q__1.r = x[i__3].r * 2.f, q__1.i = x[i__3].i * 2.f; x[i__2].r = q__1.r, x[i__2].i = q__1.i; } /* L60: */ } /* Clean-up for N not a multiple of 5. */ i__ = n5 + 1; if (i__ < *n - 1) { clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = alpha3 * q__2.r, q__1.i = alpha3 * q__2.i; a.r = q__1.r, a.i = q__1.i; clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = q__2.r / alpha, q__1.i = q__2.i / alpha; b.r = q__1.r, b.i = q__1.i; q__3.r = b.r * 2.f, q__3.i = b.i * 2.f; q__2.r = q__3.r * 0.f - q__3.i * 1.f, q__2.i = q__3.r * 1.f + q__3.i * 0.f; q__1.r = a.r - q__2.r, q__1.i = a.i - q__2.i; c__.r = q__1.r, c__.i = q__1.i; q__1.r = c__.r / beta, q__1.i = c__.i / beta; r__.r = q__1.r, r__.i = q__1.i; i__1 = i__ + i__ * x_dim1; x[i__1].r = a.r, x[i__1].i = a.i; i__1 = i__ + 2 + i__ * x_dim1; x[i__1].r = b.r, x[i__1].i = b.i; i__1 = i__ + 2 + (i__ + 1) * x_dim1; x[i__1].r = r__.r, x[i__1].i = r__.i; i__1 = i__ + 2 + (i__ + 2) * x_dim1; x[i__1].r = c__.r, x[i__1].i = c__.i; i__1 = i__ + 1 + (i__ + 1) * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; i__ += 3; } if (i__ < *n) { i__1 = i__ + i__ * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; i__1 = i__ + 1 + (i__ + 1) * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; if (c_abs(&x[i__ + i__ * x_dim1]) > c_abs(&x[i__ + 1 + (i__ + 1) * x_dim1])) { i__1 = i__ + 1 + i__ * x_dim1; i__2 = i__ + i__ * x_dim1; q__1.r = x[i__2].r * 2.f, q__1.i = x[i__2].i * 2.f; x[i__1].r = q__1.r, x[i__1].i = q__1.i; } else { i__1 = i__ + 1 + i__ * x_dim1; i__2 = i__ + 1 + (i__ + 1) * x_dim1; q__1.r = x[i__2].r * 2.f, q__1.i = x[i__2].i * 2.f; x[i__1].r = q__1.r, x[i__1].i = q__1.i; } i__ += 2; } else if (i__ == *n) { i__1 = i__ + i__ * x_dim1; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; ++i__; } } return 0; /* End of CLATSY */ } /* clatsy_ */
/* Subroutine */ int clatsp_(char *uplo, integer *n, complex *x, integer * iseed) { /* System generated locals */ integer i__1, i__2, i__3; complex q__1, q__2, q__3; /* Local variables */ complex a, b, c__; integer j; complex r__; integer n5, jj; real beta, alpha, alpha3; /* -- LAPACK auxiliary test routine (version 3.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* CLATSP generates a special test matrix for the complex symmetric */ /* (indefinite) factorization for packed matrices. The pivot blocks of */ /* the generated matrix will be in the following order: */ /* 2x2 pivot block, non diagonalizable */ /* 1x1 pivot block */ /* 2x2 pivot block, diagonalizable */ /* (cycle repeats) */ /* A row interchange is required for each non-diagonalizable 2x2 block. */ /* Arguments */ /* ========= */ /* UPLO (input) CHARACTER */ /* Specifies whether the generated matrix is to be upper or */ /* lower triangular. */ /* = 'U': Upper triangular */ /* = 'L': Lower triangular */ /* N (input) INTEGER */ /* The dimension of the matrix to be generated. */ /* X (output) COMPLEX array, dimension (N*(N+1)/2) */ /* The generated matrix in packed storage format. The matrix */ /* consists of 3x3 and 2x2 diagonal blocks which result in the */ /* pivot sequence given above. The matrix outside these */ /* diagonal blocks is zero. */ /* ISEED (input/output) INTEGER array, dimension (4) */ /* On entry, the seed for the random number generator. The last */ /* of the four integers must be odd. (modified on exit) */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Initialize constants */ /* Parameter adjustments */ --iseed; --x; /* Function Body */ alpha = (sqrt(17.f) + 1.f) / 8.f; beta = alpha - .001f; alpha3 = alpha * alpha * alpha; /* Fill the matrix with zeros. */ i__1 = *n * (*n + 1) / 2; for (j = 1; j <= i__1; ++j) { i__2 = j; x[i__2].r = 0.f, x[i__2].i = 0.f; /* L10: */ } /* UPLO = 'U': Upper triangular storage */ if (*(unsigned char *)uplo == 'U') { n5 = *n / 5; n5 = *n - n5 * 5 + 1; jj = *n * (*n + 1) / 2; i__1 = n5; for (j = *n; j >= i__1; j += -5) { clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = alpha3 * q__2.r, q__1.i = alpha3 * q__2.i; a.r = q__1.r, a.i = q__1.i; clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = q__2.r / alpha, q__1.i = q__2.i / alpha; b.r = q__1.r, b.i = q__1.i; q__3.r = b.r * 2.f, q__3.i = b.i * 2.f; q__2.r = q__3.r * 0.f - q__3.i * 1.f, q__2.i = q__3.r * 1.f + q__3.i * 0.f; q__1.r = a.r - q__2.r, q__1.i = a.i - q__2.i; c__.r = q__1.r, c__.i = q__1.i; q__1.r = c__.r / beta, q__1.i = c__.i / beta; r__.r = q__1.r, r__.i = q__1.i; i__2 = jj; x[i__2].r = a.r, x[i__2].i = a.i; i__2 = jj - 2; x[i__2].r = b.r, x[i__2].i = b.i; jj -= j; i__2 = jj; clarnd_(&q__1, &c__2, &iseed[1]); x[i__2].r = q__1.r, x[i__2].i = q__1.i; i__2 = jj - 1; x[i__2].r = r__.r, x[i__2].i = r__.i; jj -= j - 1; i__2 = jj; x[i__2].r = c__.r, x[i__2].i = c__.i; jj -= j - 2; i__2 = jj; clarnd_(&q__1, &c__2, &iseed[1]); x[i__2].r = q__1.r, x[i__2].i = q__1.i; jj -= j - 3; i__2 = jj; clarnd_(&q__1, &c__2, &iseed[1]); x[i__2].r = q__1.r, x[i__2].i = q__1.i; if (c_abs(&x[jj + (j - 3)]) > c_abs(&x[jj])) { i__2 = jj + (j - 4); i__3 = jj + (j - 3); q__1.r = x[i__3].r * 2.f, q__1.i = x[i__3].i * 2.f; x[i__2].r = q__1.r, x[i__2].i = q__1.i; } else { i__2 = jj + (j - 4); i__3 = jj; q__1.r = x[i__3].r * 2.f, q__1.i = x[i__3].i * 2.f; x[i__2].r = q__1.r, x[i__2].i = q__1.i; } jj -= j - 4; /* L20: */ } /* Clean-up for N not a multiple of 5. */ j = n5 - 1; if (j > 2) { clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = alpha3 * q__2.r, q__1.i = alpha3 * q__2.i; a.r = q__1.r, a.i = q__1.i; clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = q__2.r / alpha, q__1.i = q__2.i / alpha; b.r = q__1.r, b.i = q__1.i; q__3.r = b.r * 2.f, q__3.i = b.i * 2.f; q__2.r = q__3.r * 0.f - q__3.i * 1.f, q__2.i = q__3.r * 1.f + q__3.i * 0.f; q__1.r = a.r - q__2.r, q__1.i = a.i - q__2.i; c__.r = q__1.r, c__.i = q__1.i; q__1.r = c__.r / beta, q__1.i = c__.i / beta; r__.r = q__1.r, r__.i = q__1.i; i__1 = jj; x[i__1].r = a.r, x[i__1].i = a.i; i__1 = jj - 2; x[i__1].r = b.r, x[i__1].i = b.i; jj -= j; i__1 = jj; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; i__1 = jj - 1; x[i__1].r = r__.r, x[i__1].i = r__.i; jj -= j - 1; i__1 = jj; x[i__1].r = c__.r, x[i__1].i = c__.i; jj -= j - 2; j += -3; } if (j > 1) { i__1 = jj; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; i__1 = jj - j; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; if (c_abs(&x[jj]) > c_abs(&x[jj - j])) { i__1 = jj - 1; i__2 = jj; q__1.r = x[i__2].r * 2.f, q__1.i = x[i__2].i * 2.f; x[i__1].r = q__1.r, x[i__1].i = q__1.i; } else { i__1 = jj - 1; i__2 = jj - j; q__1.r = x[i__2].r * 2.f, q__1.i = x[i__2].i * 2.f; x[i__1].r = q__1.r, x[i__1].i = q__1.i; } jj = jj - j - (j - 1); j += -2; } else if (j == 1) { i__1 = jj; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; --j; } /* UPLO = 'L': Lower triangular storage */ } else { n5 = *n / 5; n5 *= 5; jj = 1; i__1 = n5; for (j = 1; j <= i__1; j += 5) { clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = alpha3 * q__2.r, q__1.i = alpha3 * q__2.i; a.r = q__1.r, a.i = q__1.i; clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = q__2.r / alpha, q__1.i = q__2.i / alpha; b.r = q__1.r, b.i = q__1.i; q__3.r = b.r * 2.f, q__3.i = b.i * 2.f; q__2.r = q__3.r * 0.f - q__3.i * 1.f, q__2.i = q__3.r * 1.f + q__3.i * 0.f; q__1.r = a.r - q__2.r, q__1.i = a.i - q__2.i; c__.r = q__1.r, c__.i = q__1.i; q__1.r = c__.r / beta, q__1.i = c__.i / beta; r__.r = q__1.r, r__.i = q__1.i; i__2 = jj; x[i__2].r = a.r, x[i__2].i = a.i; i__2 = jj + 2; x[i__2].r = b.r, x[i__2].i = b.i; jj += *n - j + 1; i__2 = jj; clarnd_(&q__1, &c__2, &iseed[1]); x[i__2].r = q__1.r, x[i__2].i = q__1.i; i__2 = jj + 1; x[i__2].r = r__.r, x[i__2].i = r__.i; jj += *n - j; i__2 = jj; x[i__2].r = c__.r, x[i__2].i = c__.i; jj += *n - j - 1; i__2 = jj; clarnd_(&q__1, &c__2, &iseed[1]); x[i__2].r = q__1.r, x[i__2].i = q__1.i; jj += *n - j - 2; i__2 = jj; clarnd_(&q__1, &c__2, &iseed[1]); x[i__2].r = q__1.r, x[i__2].i = q__1.i; if (c_abs(&x[jj - (*n - j - 2)]) > c_abs(&x[jj])) { i__2 = jj - (*n - j - 2) + 1; i__3 = jj - (*n - j - 2); q__1.r = x[i__3].r * 2.f, q__1.i = x[i__3].i * 2.f; x[i__2].r = q__1.r, x[i__2].i = q__1.i; } else { i__2 = jj - (*n - j - 2) + 1; i__3 = jj; q__1.r = x[i__3].r * 2.f, q__1.i = x[i__3].i * 2.f; x[i__2].r = q__1.r, x[i__2].i = q__1.i; } jj += *n - j - 3; /* L30: */ } /* Clean-up for N not a multiple of 5. */ j = n5 + 1; if (j < *n - 1) { clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = alpha3 * q__2.r, q__1.i = alpha3 * q__2.i; a.r = q__1.r, a.i = q__1.i; clarnd_(&q__2, &c__5, &iseed[1]); q__1.r = q__2.r / alpha, q__1.i = q__2.i / alpha; b.r = q__1.r, b.i = q__1.i; q__3.r = b.r * 2.f, q__3.i = b.i * 2.f; q__2.r = q__3.r * 0.f - q__3.i * 1.f, q__2.i = q__3.r * 1.f + q__3.i * 0.f; q__1.r = a.r - q__2.r, q__1.i = a.i - q__2.i; c__.r = q__1.r, c__.i = q__1.i; q__1.r = c__.r / beta, q__1.i = c__.i / beta; r__.r = q__1.r, r__.i = q__1.i; i__1 = jj; x[i__1].r = a.r, x[i__1].i = a.i; i__1 = jj + 2; x[i__1].r = b.r, x[i__1].i = b.i; jj += *n - j + 1; i__1 = jj; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; i__1 = jj + 1; x[i__1].r = r__.r, x[i__1].i = r__.i; jj += *n - j; i__1 = jj; x[i__1].r = c__.r, x[i__1].i = c__.i; jj += *n - j - 1; j += 3; } if (j < *n) { i__1 = jj; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; i__1 = jj + (*n - j + 1); clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; if (c_abs(&x[jj]) > c_abs(&x[jj + (*n - j + 1)])) { i__1 = jj + 1; i__2 = jj; q__1.r = x[i__2].r * 2.f, q__1.i = x[i__2].i * 2.f; x[i__1].r = q__1.r, x[i__1].i = q__1.i; } else { i__1 = jj + 1; i__2 = jj + (*n - j + 1); q__1.r = x[i__2].r * 2.f, q__1.i = x[i__2].i * 2.f; x[i__1].r = q__1.r, x[i__1].i = q__1.i; } jj = jj + (*n - j + 1) + (*n - j); j += 2; } else if (j == *n) { i__1 = jj; clarnd_(&q__1, &c__2, &iseed[1]); x[i__1].r = q__1.r, x[i__1].i = q__1.i; jj += *n - j + 1; ++j; } } return 0; /* End of CLATSP */ } /* clatsp_ */
/* Subroutine */ int cdrvrf4_(integer *nout, integer *nn, integer *nval, real *thresh, complex *c1, complex *c2, integer *ldc, complex *crf, complex *a, integer *lda, real *s_work_clange__) { /* Initialized data */ static integer iseedy[4] = { 1988,1989,1990,1991 }; static char uplos[1*2] = "U" "L"; static char forms[1*2] = "N" "C"; static char transs[1*2] = "N" "C"; /* Format strings */ static char fmt_9999[] = "(1x,\002 *** Error(s) or Failure(s) while test" "ing CHFRK ***\002)"; static char fmt_9997[] = "(1x,\002 Failure in \002,a5,\002, CFORM=" "'\002,a1,\002',\002,\002 UPLO='\002,a1,\002',\002,\002 TRANS=" "'\002,a1,\002',\002,\002 N=\002,i3,\002, K =\002,i3,\002, test" "=\002,g12.5)"; static char fmt_9996[] = "(1x,\002All tests for \002,a5,\002 auxiliary r" "outine passed the \002,\002threshold (\002,i5,\002 tests run)" "\002)"; static char fmt_9995[] = "(1x,a6,\002 auxiliary routine:\002,i5,\002 out" " of \002,i5,\002 tests failed to pass the threshold\002)"; /* System generated locals */ integer a_dim1, a_offset, c1_dim1, c1_offset, c2_dim1, c2_offset, i__1, i__2, i__3, i__4, i__5, i__6, i__7; real r__1; complex q__1; /* Builtin functions */ /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); integer s_wsle(cilist *), e_wsle(void), s_wsfe(cilist *), e_wsfe(void), do_fio(integer *, char *, ftnlen); /* Local variables */ integer i__, j, k, n, iik, iin; real eps, beta; integer info; char uplo[1]; integer nrun; real alpha; integer nfail, iseed[4]; extern /* Subroutine */ int cherk_(char *, char *, integer *, integer *, real *, complex *, integer *, real *, complex *, integer *), chfrk_(char *, char *, char *, integer *, integer *, real *, complex *, integer *, real *, complex *); char cform[1]; integer iform; real norma, normc; char trans[1]; integer iuplo; extern doublereal clange_(char *, integer *, integer *, complex *, integer *, real *); integer ialpha; extern /* Complex */ VOID clarnd_(complex *, integer *, integer *); extern doublereal slamch_(char *), slarnd_(integer *, integer *); integer itrans; extern /* Subroutine */ int ctfttr_(char *, char *, integer *, complex *, complex *, integer *, integer *), ctrttf_(char *, char *, integer *, complex *, integer *, complex *, integer *); real result[1]; /* Fortran I/O blocks */ static cilist io___28 = { 0, 0, 0, 0, 0 }; static cilist io___29 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___30 = { 0, 0, 0, fmt_9997, 0 }; static cilist io___31 = { 0, 0, 0, fmt_9996, 0 }; static cilist io___32 = { 0, 0, 0, fmt_9995, 0 }; /* -- LAPACK test routine (version 3.2.0) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2008 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* CDRVRF4 tests the LAPACK RFP routines: */ /* CHFRK */ /* Arguments */ /* ========= */ /* NOUT (input) INTEGER */ /* The unit number for output. */ /* NN (input) INTEGER */ /* The number of values of N contained in the vector NVAL. */ /* NVAL (input) INTEGER array, dimension (NN) */ /* The values of the matrix dimension N. */ /* THRESH (input) REAL */ /* The threshold value for the test ratios. A result is */ /* included in the output file if RESULT >= THRESH. To have */ /* every test ratio printed, use THRESH = 0. */ /* C1 (workspace) COMPLEX array, dimension (LDC,NMAX) */ /* C2 (workspace) COMPLEX array, dimension (LDC,NMAX) */ /* LDC (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,NMAX). */ /* CRF (workspace) COMPLEX array, dimension ((NMAX*(NMAX+1))/2). */ /* A (workspace) COMPLEX array, dimension (LDA,NMAX) */ /* LDA (input) INTEGER */ /* The leading dimension of the array A. LDA >= max(1,NMAX). */ /* S_WORK_CLANGE (workspace) REAL array, dimension (NMAX) */ /* ===================================================================== */ /* .. */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Scalars in Common .. */ /* .. */ /* .. Common blocks .. */ /* .. */ /* .. Data statements .. */ /* Parameter adjustments */ --nval; c2_dim1 = *ldc; c2_offset = 1 + c2_dim1; c2 -= c2_offset; c1_dim1 = *ldc; c1_offset = 1 + c1_dim1; c1 -= c1_offset; --crf; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --s_work_clange__; /* Function Body */ /* .. */ /* .. Executable Statements .. */ /* Initialize constants and the random number seed. */ nrun = 0; nfail = 0; info = 0; for (i__ = 1; i__ <= 4; ++i__) { iseed[i__ - 1] = iseedy[i__ - 1]; /* L10: */ } eps = slamch_("Precision"); i__1 = *nn; for (iin = 1; iin <= i__1; ++iin) { n = nval[iin]; i__2 = *nn; for (iik = 1; iik <= i__2; ++iik) { k = nval[iin]; for (iform = 1; iform <= 2; ++iform) { *(unsigned char *)cform = *(unsigned char *)&forms[iform - 1]; for (iuplo = 1; iuplo <= 2; ++iuplo) { *(unsigned char *)uplo = *(unsigned char *)&uplos[iuplo - 1]; for (itrans = 1; itrans <= 2; ++itrans) { *(unsigned char *)trans = *(unsigned char *)&transs[ itrans - 1]; for (ialpha = 1; ialpha <= 4; ++ialpha) { if (ialpha == 1) { alpha = 0.f; beta = 0.f; } else if (ialpha == 1) { alpha = 1.f; beta = 0.f; } else if (ialpha == 1) { alpha = 0.f; beta = 1.f; } else { alpha = slarnd_(&c__2, iseed); beta = slarnd_(&c__2, iseed); } /* All the parameters are set: */ /* CFORM, UPLO, TRANS, M, N, */ /* ALPHA, and BETA */ /* READY TO TEST! */ ++nrun; if (itrans == 1) { /* In this case we are NOTRANS, so A is N-by-K */ i__3 = k; for (j = 1; j <= i__3; ++j) { i__4 = n; for (i__ = 1; i__ <= i__4; ++i__) { i__5 = i__ + j * a_dim1; clarnd_(&q__1, &c__4, iseed); a[i__5].r = q__1.r, a[i__5].i = q__1.i; } } norma = clange_("I", &n, &k, &a[a_offset], lda, &s_work_clange__[1]); } else { /* In this case we are TRANS, so A is K-by-N */ i__3 = n; for (j = 1; j <= i__3; ++j) { i__4 = k; for (i__ = 1; i__ <= i__4; ++i__) { i__5 = i__ + j * a_dim1; clarnd_(&q__1, &c__4, iseed); a[i__5].r = q__1.r, a[i__5].i = q__1.i; } } norma = clange_("I", &k, &n, &a[a_offset], lda, &s_work_clange__[1]); } /* Generate C1 our N--by--N Hermitian matrix. */ /* Make sure C2 has the same upper/lower part, */ /* (the one that we do not touch), so */ /* copy the initial C1 in C2 in it. */ i__3 = n; for (j = 1; j <= i__3; ++j) { i__4 = n; for (i__ = 1; i__ <= i__4; ++i__) { i__5 = i__ + j * c1_dim1; clarnd_(&q__1, &c__4, iseed); c1[i__5].r = q__1.r, c1[i__5].i = q__1.i; i__5 = i__ + j * c2_dim1; i__6 = i__ + j * c1_dim1; c2[i__5].r = c1[i__6].r, c2[i__5].i = c1[ i__6].i; } } /* (See comment later on for why we use CLANGE and */ /* not CLANHE for C1.) */ normc = clange_("I", &n, &n, &c1[c1_offset], ldc, &s_work_clange__[1]); s_copy(srnamc_1.srnamt, "CTRTTF", (ftnlen)32, ( ftnlen)6); ctrttf_(cform, uplo, &n, &c1[c1_offset], ldc, & crf[1], &info); /* call zherk the BLAS routine -> gives C1 */ s_copy(srnamc_1.srnamt, "CHERK ", (ftnlen)32, ( ftnlen)6); cherk_(uplo, trans, &n, &k, &alpha, &a[a_offset], lda, &beta, &c1[c1_offset], ldc); /* call zhfrk the RFP routine -> gives CRF */ s_copy(srnamc_1.srnamt, "CHFRK ", (ftnlen)32, ( ftnlen)6); chfrk_(cform, uplo, trans, &n, &k, &alpha, &a[ a_offset], lda, &beta, &crf[1]); /* convert CRF in full format -> gives C2 */ s_copy(srnamc_1.srnamt, "CTFTTR", (ftnlen)32, ( ftnlen)6); ctfttr_(cform, uplo, &n, &crf[1], &c2[c2_offset], ldc, &info); /* compare C1 and C2 */ i__3 = n; for (j = 1; j <= i__3; ++j) { i__4 = n; for (i__ = 1; i__ <= i__4; ++i__) { i__5 = i__ + j * c1_dim1; i__6 = i__ + j * c1_dim1; i__7 = i__ + j * c2_dim1; q__1.r = c1[i__6].r - c2[i__7].r, q__1.i = c1[i__6].i - c2[i__7].i; c1[i__5].r = q__1.r, c1[i__5].i = q__1.i; } } /* Yes, C1 is Hermitian so we could call CLANHE, */ /* but we want to check the upper part that is */ /* supposed to be unchanged and the diagonal that */ /* is supposed to be real -> CLANGE */ result[0] = clange_("I", &n, &n, &c1[c1_offset], ldc, &s_work_clange__[1]); /* Computing MAX */ r__1 = dabs(alpha) * norma * norma + dabs(beta) * normc; result[0] = result[0] / dmax(r__1,1.f) / max(n,1) / eps; if (result[0] >= *thresh) { if (nfail == 0) { io___28.ciunit = *nout; s_wsle(&io___28); e_wsle(); io___29.ciunit = *nout; s_wsfe(&io___29); e_wsfe(); } io___30.ciunit = *nout; s_wsfe(&io___30); do_fio(&c__1, "CHFRK", (ftnlen)5); do_fio(&c__1, cform, (ftnlen)1); do_fio(&c__1, uplo, (ftnlen)1); do_fio(&c__1, trans, (ftnlen)1); do_fio(&c__1, (char *)&n, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&k, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&result[0], (ftnlen) sizeof(real)); e_wsfe(); ++nfail; } /* L100: */ } /* L110: */ } /* L120: */ } /* L130: */ } /* L140: */ } /* L150: */ } /* Print a summary of the results. */ if (nfail == 0) { io___31.ciunit = *nout; s_wsfe(&io___31); do_fio(&c__1, "CHFRK", (ftnlen)5); do_fio(&c__1, (char *)&nrun, (ftnlen)sizeof(integer)); e_wsfe(); } else { io___32.ciunit = *nout; s_wsfe(&io___32); do_fio(&c__1, "CHFRK", (ftnlen)5); do_fio(&c__1, (char *)&nfail, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&nrun, (ftnlen)sizeof(integer)); e_wsfe(); } return 0; /* End of CDRVRF4 */ } /* cdrvrf4_ */
/* Subroutine */ int claror_(char *side, char *init, integer *m, integer *n, complex *a, integer *lda, integer *iseed, complex *x, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3; complex q__1, q__2; /* Builtin functions */ double c_abs(complex *); void r_cnjg(complex *, complex *); /* Local variables */ static integer kbeg, jcol; static real xabs; static integer irow, j; extern /* Subroutine */ int cgerc_(integer *, integer *, complex *, complex *, integer *, complex *, integer *, complex *, integer *), cscal_(integer *, complex *, complex *, integer *); extern logical lsame_(char *, char *); extern /* Subroutine */ int cgemv_(char *, integer *, integer *, complex * , complex *, integer *, complex *, integer *, complex *, complex * , integer *); static complex csign; static integer ixfrm, itype, nxfrm; static real xnorm; extern real scnrm2_(integer *, complex *, integer *); extern /* Subroutine */ int clacgv_(integer *, complex *, integer *); extern /* Complex */ VOID clarnd_(complex *, integer *, integer *); extern /* Subroutine */ int claset_(char *, integer *, integer *, complex *, complex *, complex *, integer *), xerbla_(char *, integer *); static real factor; static complex xnorms; /* -- LAPACK auxiliary test routine (version 2.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University September 30, 1994 Purpose ======= CLAROR pre- or post-multiplies an M by N matrix A by a random unitary matrix U, overwriting A. A may optionally be initialized to the identity matrix before multiplying by U. U is generated using the method of G.W. Stewart ( SIAM J. Numer. Anal. 17, 1980, pp. 403-409 ). (BLAS-2 version) Arguments ========= SIDE - CHARACTER*1 SIDE specifies whether A is multiplied on the left or right by U. SIDE = 'L' Multiply A on the left (premultiply) by U SIDE = 'R' Multiply A on the right (postmultiply) by U* SIDE = 'C' Multiply A on the left by U and the right by U* SIDE = 'T' Multiply A on the left by U and the right by U' Not modified. INIT - CHARACTER*1 INIT specifies whether or not A should be initialized to the identity matrix. INIT = 'I' Initialize A to (a section of) the identity matrix before applying U. INIT = 'N' No initialization. Apply U to the input matrix A. INIT = 'I' may be used to generate square (i.e., unitary) or rectangular orthogonal matrices (orthogonality being in the sense of CDOTC): For square matrices, M=N, and SIDE many be either 'L' or 'R'; the rows will be orthogonal to each other, as will the columns. For rectangular matrices where M < N, SIDE = 'R' will produce a dense matrix whose rows will be orthogonal and whose columns will not, while SIDE = 'L' will produce a matrix whose rows will be orthogonal, and whose first M columns will be orthogonal, the remaining columns being zero. For matrices where M > N, just use the previous explaination, interchanging 'L' and 'R' and "rows" and "columns". Not modified. M - INTEGER Number of rows of A. Not modified. N - INTEGER Number of columns of A. Not modified. A - COMPLEX array, dimension ( LDA, N ) Input and output array. Overwritten by U A ( if SIDE = 'L' ) or by A U ( if SIDE = 'R' ) or by U A U* ( if SIDE = 'C') or by U A U' ( if SIDE = 'T') on exit. LDA - INTEGER Leading dimension of A. Must be at least MAX ( 1, M ). Not modified. ISEED - 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 CLAROR to continue the same random number sequence. Modified. X - COMPLEX array, dimension ( 3*MAX( M, N ) ) Workspace. Of length: 2*M + N if SIDE = 'L', 2*N + M if SIDE = 'R', 3*N if SIDE = 'C' or 'T'. Modified. INFO - INTEGER An error flag. It is set to: 0 if no error. 1 if CLARND returned a bad random number (installation problem) -1 if SIDE is not L, R, C, or T. -3 if M is negative. -4 if N is negative or if SIDE is C or T and N is not equal to M. -6 if LDA is less than M. ===================================================================== Parameter adjustments */ a_dim1 = *lda; a_offset = a_dim1 + 1; a -= a_offset; --iseed; --x; /* Function Body */ if (*n == 0 || *m == 0) { return 0; } itype = 0; if (lsame_(side, "L")) { itype = 1; } else if (lsame_(side, "R")) { itype = 2; } else if (lsame_(side, "C")) { itype = 3; } else if (lsame_(side, "T")) { itype = 4; } /* Check for argument errors. */ *info = 0; if (itype == 0) { *info = -1; } else if (*m < 0) { *info = -3; } else if (*n < 0 || itype == 3 && *n != *m) { *info = -4; } else if (*lda < *m) { *info = -6; } if (*info != 0) { i__1 = -(*info); xerbla_("CLAROR", &i__1); return 0; } if (itype == 1) { nxfrm = *m; } else { nxfrm = *n; } /* Initialize A to the identity matrix if desired */ if (lsame_(init, "I")) { claset_("Full", m, n, &c_b1, &c_b2, &a[a_offset], lda); } /* If no rotation possible, still multiply by a random complex number from the circle |x| = 1 2) Compute Rotation by computing Householder Transformations H(2), H(3), ..., H(n). Note that the order in which they are computed is irrelevant. */ i__1 = nxfrm; for (j = 1; j <= i__1; ++j) { i__2 = j; x[i__2].r = 0.f, x[i__2].i = 0.f; /* L40: */ } i__1 = nxfrm; for (ixfrm = 2; ixfrm <= i__1; ++ixfrm) { kbeg = nxfrm - ixfrm + 1; /* Generate independent normal( 0, 1 ) random numbers */ i__2 = nxfrm; for (j = kbeg; j <= i__2; ++j) { i__3 = j; clarnd_(&q__1, &c__3, &iseed[1]); x[i__3].r = q__1.r, x[i__3].i = q__1.i; /* L50: */ } /* Generate a Householder transformation from the random vector X */ xnorm = scnrm2_(&ixfrm, &x[kbeg], &c__1); xabs = c_abs(&x[kbeg]); if (xabs != 0.f) { i__2 = kbeg; q__1.r = x[i__2].r / xabs, q__1.i = x[i__2].i / xabs; csign.r = q__1.r, csign.i = q__1.i; } else { csign.r = 1.f, csign.i = 0.f; } q__1.r = xnorm * csign.r, q__1.i = xnorm * csign.i; xnorms.r = q__1.r, xnorms.i = q__1.i; i__2 = nxfrm + kbeg; q__1.r = -(doublereal)csign.r, q__1.i = -(doublereal)csign.i; x[i__2].r = q__1.r, x[i__2].i = q__1.i; factor = xnorm * (xnorm + xabs); if (dabs(factor) < 1e-20f) { *info = 1; i__2 = -(*info); xerbla_("CLAROR", &i__2); return 0; } else { factor = 1.f / factor; } i__2 = kbeg; i__3 = kbeg; q__1.r = x[i__3].r + xnorms.r, q__1.i = x[i__3].i + xnorms.i; x[i__2].r = q__1.r, x[i__2].i = q__1.i; /* Apply Householder transformation to A */ if (itype == 1 || itype == 3 || itype == 4) { /* Apply H(k) on the left of A */ cgemv_("C", &ixfrm, n, &c_b2, &a[kbeg + a_dim1], lda, &x[kbeg], & c__1, &c_b1, &x[(nxfrm << 1) + 1], &c__1); q__2.r = factor, q__2.i = 0.f; q__1.r = -(doublereal)q__2.r, q__1.i = -(doublereal)q__2.i; cgerc_(&ixfrm, n, &q__1, &x[kbeg], &c__1, &x[(nxfrm << 1) + 1], & c__1, &a[kbeg + a_dim1], lda); } if (itype >= 2 && itype <= 4) { /* Apply H(k)* (or H(k)') on the right of A */ if (itype == 4) { clacgv_(&ixfrm, &x[kbeg], &c__1); } cgemv_("N", m, &ixfrm, &c_b2, &a[kbeg * a_dim1 + 1], lda, &x[kbeg] , &c__1, &c_b1, &x[(nxfrm << 1) + 1], &c__1); q__2.r = factor, q__2.i = 0.f; q__1.r = -(doublereal)q__2.r, q__1.i = -(doublereal)q__2.i; cgerc_(m, &ixfrm, &q__1, &x[(nxfrm << 1) + 1], &c__1, &x[kbeg], & c__1, &a[kbeg * a_dim1 + 1], lda); } /* L60: */ } clarnd_(&q__1, &c__3, &iseed[1]); x[1].r = q__1.r, x[1].i = q__1.i; xabs = c_abs(&x[1]); if (xabs != 0.f) { q__1.r = x[1].r / xabs, q__1.i = x[1].i / xabs; csign.r = q__1.r, csign.i = q__1.i; } else { csign.r = 1.f, csign.i = 0.f; } i__1 = nxfrm << 1; x[i__1].r = csign.r, x[i__1].i = csign.i; /* Scale the matrix A by D. */ if (itype == 1 || itype == 3 || itype == 4) { i__1 = *m; for (irow = 1; irow <= i__1; ++irow) { r_cnjg(&q__1, &x[nxfrm + irow]); cscal_(n, &q__1, &a[irow + a_dim1], lda); /* L70: */ } } if (itype == 2 || itype == 3) { i__1 = *n; for (jcol = 1; jcol <= i__1; ++jcol) { cscal_(m, &x[nxfrm + jcol], &a[jcol * a_dim1 + 1], &c__1); /* L80: */ } } if (itype == 4) { i__1 = *n; for (jcol = 1; jcol <= i__1; ++jcol) { r_cnjg(&q__1, &x[nxfrm + jcol]); cscal_(m, &q__1, &a[jcol * a_dim1 + 1], &c__1); /* L90: */ } } return 0; /* End of CLAROR */ } /* claror_ */
/* Subroutine */ int clatme_(integer *n, char *dist, integer *iseed, complex * d__, integer *mode, real *cond, complex *dmax__, char *ei, char * rsign, char *upper, char *sim, real *ds, integer *modes, real *conds, integer *kl, integer *ku, real *anorm, complex *a, integer *lda, complex *work, integer *info) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2; real r__1, r__2; complex q__1, q__2; /* Builtin functions */ double c_abs(complex *); void r_cnjg(complex *, complex *); /* Local variables */ integer i__, j, ic, jc, ir, jcr; complex tau; logical bads; integer isim; real temp; extern /* Subroutine */ int cgerc_(integer *, integer *, complex *, complex *, integer *, complex *, integer *, complex *, integer *); complex alpha; extern /* Subroutine */ int cscal_(integer *, complex *, complex *, integer *); extern logical lsame_(char *, char *); extern /* Subroutine */ int cgemv_(char *, integer *, integer *, complex * , complex *, integer *, complex *, integer *, complex *, complex * , integer *); integer iinfo; real tempa[1]; integer icols, idist; extern /* Subroutine */ int ccopy_(integer *, complex *, integer *, complex *, integer *); integer irows; extern /* Subroutine */ int clatm1_(integer *, real *, integer *, integer *, integer *, complex *, integer *, integer *), slatm1_(integer *, real *, integer *, integer *, integer *, real *, integer *, integer *); extern doublereal clange_(char *, integer *, integer *, complex *, integer *, real *); extern /* Subroutine */ int clarge_(integer *, complex *, integer *, integer *, complex *, integer *), clarfg_(integer *, complex *, complex *, integer *, complex *), clacgv_(integer *, complex *, integer *); extern /* Complex */ VOID clarnd_(complex *, integer *, integer *); real ralpha; extern /* Subroutine */ int csscal_(integer *, real *, complex *, integer *), claset_(char *, integer *, integer *, complex *, complex *, complex *, integer *), xerbla_(char *, integer *), clarnv_(integer *, integer *, integer *, complex *); integer irsign, iupper; complex xnorms; /* -- LAPACK test routine (version 3.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* CLATME generates random non-symmetric square matrices with */ /* specified eigenvalues for testing LAPACK programs. */ /* CLATME operates by applying the following sequence of */ /* operations: */ /* 1. Set the diagonal to D, where D may be input or */ /* computed according to MODE, COND, DMAX, and RSIGN */ /* as described below. */ /* 2. If UPPER='T', the upper triangle of A is set to random values */ /* out of distribution DIST. */ /* 3. If SIM='T', A is multiplied on the left by a random matrix */ /* X, whose singular values are specified by DS, MODES, and */ /* CONDS, and on the right by X inverse. */ /* 4. If KL < N-1, the lower bandwidth is reduced to KL using */ /* Householder transformations. If KU < N-1, the upper */ /* bandwidth is reduced to KU. */ /* 5. If ANORM is not negative, the matrix is scaled to have */ /* maximum-element-norm ANORM. */ /* (Note: since the matrix cannot be reduced beyond Hessenberg form, */ /* no packing options are available.) */ /* Arguments */ /* ========= */ /* N - INTEGER */ /* The number of columns (or rows) of A. Not modified. */ /* DIST - CHARACTER*1 */ /* On entry, DIST specifies the type of distribution to be used */ /* to generate the random eigen-/singular values, and on the */ /* upper triangle (see UPPER). */ /* 'U' => UNIFORM( 0, 1 ) ( 'U' for uniform ) */ /* 'S' => UNIFORM( -1, 1 ) ( 'S' for symmetric ) */ /* 'N' => NORMAL( 0, 1 ) ( 'N' for normal ) */ /* 'D' => uniform on the complex disc |z| < 1. */ /* Not modified. */ /* ISEED - INTEGER array, dimension ( 4 ) */ /* On entry ISEED specifies the seed of the random number */ /* generator. They should lie between 0 and 4095 inclusive, */ /* and ISEED(4) should 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 CLATME */ /* to continue the same random number sequence. */ /* Changed on exit. */ /* D - COMPLEX array, dimension ( N ) */ /* This array is used to specify the eigenvalues of A. If */ /* MODE=0, then D is assumed to contain the eigenvalues */ /* otherwise they will be computed according to MODE, COND, */ /* DMAX, and RSIGN and placed in D. */ /* Modified if MODE is nonzero. */ /* MODE - INTEGER */ /* On entry this describes how the eigenvalues are to */ /* be specified: */ /* MODE = 0 means use D as input */ /* MODE = 1 sets D(1)=1 and D(2:N)=1.0/COND */ /* MODE = 2 sets D(1:N-1)=1 and D(N)=1.0/COND */ /* MODE = 3 sets D(I)=COND**(-(I-1)/(N-1)) */ /* MODE = 4 sets D(i)=1 - (i-1)/(N-1)*(1 - 1/COND) */ /* MODE = 5 sets D to random numbers in the range */ /* ( 1/COND , 1 ) such that their logarithms */ /* are uniformly distributed. */ /* MODE = 6 set D to random numbers from same distribution */ /* as the rest of the matrix. */ /* MODE < 0 has the same meaning as ABS(MODE), except that */ /* the order of the elements of D is reversed. */ /* Thus if MODE is between 1 and 4, D has entries ranging */ /* from 1 to 1/COND, if between -1 and -4, D has entries */ /* ranging from 1/COND to 1, */ /* Not modified. */ /* COND - REAL */ /* On entry, this is used as described under MODE above. */ /* If used, it must be >= 1. Not modified. */ /* DMAX - COMPLEX */ /* If MODE is neither -6, 0 nor 6, the contents of D, as */ /* computed according to MODE and COND, will be scaled by */ /* DMAX / max(abs(D(i))). Note that DMAX need not be */ /* positive or real: if DMAX is negative or complex (or zero), */ /* D will be scaled by a negative or complex number (or zero). */ /* If RSIGN='F' then the largest (absolute) eigenvalue will be */ /* equal to DMAX. */ /* Not modified. */ /* EI - CHARACTER*1 (ignored) */ /* Not modified. */ /* RSIGN - CHARACTER*1 */ /* If MODE is not 0, 6, or -6, and RSIGN='T', then the */ /* elements of D, as computed according to MODE and COND, will */ /* be multiplied by a random complex number from the unit */ /* circle |z| = 1. If RSIGN='F', they will not be. RSIGN may */ /* only have the values 'T' or 'F'. */ /* Not modified. */ /* UPPER - CHARACTER*1 */ /* If UPPER='T', then the elements of A above the diagonal */ /* will be set to random numbers out of DIST. If UPPER='F', */ /* they will not. UPPER may only have the values 'T' or 'F'. */ /* Not modified. */ /* SIM - CHARACTER*1 */ /* If SIM='T', then A will be operated on by a "similarity */ /* transform", i.e., multiplied on the left by a matrix X and */ /* on the right by X inverse. X = U S V, where U and V are */ /* random unitary matrices and S is a (diagonal) matrix of */ /* singular values specified by DS, MODES, and CONDS. If */ /* SIM='F', then A will not be transformed. */ /* Not modified. */ /* DS - REAL array, dimension ( N ) */ /* This array is used to specify the singular values of X, */ /* in the same way that D specifies the eigenvalues of A. */ /* If MODE=0, the DS contains the singular values, which */ /* may not be zero. */ /* Modified if MODE is nonzero. */ /* MODES - INTEGER */ /* CONDS - REAL */ /* Similar to MODE and COND, but for specifying the diagonal */ /* of S. MODES=-6 and +6 are not allowed (since they would */ /* result in randomly ill-conditioned eigenvalues.) */ /* KL - INTEGER */ /* This specifies the lower bandwidth of the matrix. KL=1 */ /* specifies upper Hessenberg form. If KL is at least N-1, */ /* then A will have full lower bandwidth. */ /* Not modified. */ /* KU - INTEGER */ /* This specifies the upper bandwidth of the matrix. KU=1 */ /* specifies lower Hessenberg form. If KU is at least N-1, */ /* then A will have full upper bandwidth; if KU and KL */ /* are both at least N-1, then A will be dense. Only one of */ /* KU and KL may be less than N-1. */ /* Not modified. */ /* ANORM - REAL */ /* If ANORM is not negative, then A will be scaled by a non- */ /* negative real number to make the maximum-element-norm of A */ /* to be ANORM. */ /* Not modified. */ /* A - COMPLEX array, dimension ( LDA, N ) */ /* On exit A is the desired test matrix. */ /* Modified. */ /* LDA - INTEGER */ /* LDA specifies the first dimension of A as declared in the */ /* calling program. LDA must be at least M. */ /* Not modified. */ /* WORK - COMPLEX array, dimension ( 3*N ) */ /* Workspace. */ /* Modified. */ /* INFO - INTEGER */ /* Error code. On exit, INFO will be set to one of the */ /* following values: */ /* 0 => normal return */ /* -1 => N negative */ /* -2 => DIST illegal string */ /* -5 => MODE not in range -6 to 6 */ /* -6 => COND less than 1.0, and MODE neither -6, 0 nor 6 */ /* -9 => RSIGN is not 'T' or 'F' */ /* -10 => UPPER is not 'T' or 'F' */ /* -11 => SIM is not 'T' or 'F' */ /* -12 => MODES=0 and DS has a zero singular value. */ /* -13 => MODES is not in the range -5 to 5. */ /* -14 => MODES is nonzero and CONDS is less than 1. */ /* -15 => KL is less than 1. */ /* -16 => KU is less than 1, or KL and KU are both less than */ /* N-1. */ /* -19 => LDA is less than M. */ /* 1 => Error return from CLATM1 (computing D) */ /* 2 => Cannot scale to DMAX (max. eigenvalue is 0) */ /* 3 => Error return from SLATM1 (computing DS) */ /* 4 => Error return from CLARGE */ /* 5 => Zero singular value from SLATM1. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* 1) Decode and Test the input parameters. */ /* Initialize flags & seed. */ /* Parameter adjustments */ --iseed; --d__; --ds; a_dim1 = *lda; a_offset = 1 + a_dim1; a -= a_offset; --work; /* Function Body */ *info = 0; /* Quick return if possible */ if (*n == 0) { return 0; } /* Decode DIST */ if (lsame_(dist, "U")) { idist = 1; } else if (lsame_(dist, "S")) { idist = 2; } else if (lsame_(dist, "N")) { idist = 3; } else if (lsame_(dist, "D")) { idist = 4; } else { idist = -1; } /* Decode RSIGN */ if (lsame_(rsign, "T")) { irsign = 1; } else if (lsame_(rsign, "F")) { irsign = 0; } else { irsign = -1; } /* Decode UPPER */ if (lsame_(upper, "T")) { iupper = 1; } else if (lsame_(upper, "F")) { iupper = 0; } else { iupper = -1; } /* Decode SIM */ if (lsame_(sim, "T")) { isim = 1; } else if (lsame_(sim, "F")) { isim = 0; } else { isim = -1; } /* Check DS, if MODES=0 and ISIM=1 */ bads = FALSE_; if (*modes == 0 && isim == 1) { i__1 = *n; for (j = 1; j <= i__1; ++j) { if (ds[j] == 0.f) { bads = TRUE_; } /* L10: */ } } /* Set INFO if an error */ if (*n < 0) { *info = -1; } else if (idist == -1) { *info = -2; } else if (abs(*mode) > 6) { *info = -5; } else if (*mode != 0 && abs(*mode) != 6 && *cond < 1.f) { *info = -6; } else if (irsign == -1) { *info = -9; } else if (iupper == -1) { *info = -10; } else if (isim == -1) { *info = -11; } else if (bads) { *info = -12; } else if (isim == 1 && abs(*modes) > 5) { *info = -13; } else if (isim == 1 && *modes != 0 && *conds < 1.f) { *info = -14; } else if (*kl < 1) { *info = -15; } else if (*ku < 1 || *ku < *n - 1 && *kl < *n - 1) { *info = -16; } else if (*lda < max(1,*n)) { *info = -19; } if (*info != 0) { i__1 = -(*info); xerbla_("CLATME", &i__1); return 0; } /* Initialize random number generator */ for (i__ = 1; i__ <= 4; ++i__) { iseed[i__] = (i__1 = iseed[i__], abs(i__1)) % 4096; /* L20: */ } if (iseed[4] % 2 != 1) { ++iseed[4]; } /* 2) Set up diagonal of A */ /* Compute D according to COND and MODE */ clatm1_(mode, cond, &irsign, &idist, &iseed[1], &d__[1], n, &iinfo); if (iinfo != 0) { *info = 1; return 0; } if (*mode != 0 && abs(*mode) != 6) { /* Scale by DMAX */ temp = c_abs(&d__[1]); i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { /* Computing MAX */ r__1 = temp, r__2 = c_abs(&d__[i__]); temp = dmax(r__1,r__2); /* L30: */ } if (temp > 0.f) { q__1.r = dmax__->r / temp, q__1.i = dmax__->i / temp; alpha.r = q__1.r, alpha.i = q__1.i; } else { *info = 2; return 0; } cscal_(n, &alpha, &d__[1], &c__1); } claset_("Full", n, n, &c_b1, &c_b1, &a[a_offset], lda); i__1 = *lda + 1; ccopy_(n, &d__[1], &c__1, &a[a_offset], &i__1); /* 3) If UPPER='T', set upper triangle of A to random numbers. */ if (iupper != 0) { i__1 = *n; for (jc = 2; jc <= i__1; ++jc) { i__2 = jc - 1; clarnv_(&idist, &iseed[1], &i__2, &a[jc * a_dim1 + 1]); /* L40: */ } } /* 4) If SIM='T', apply similarity transformation. */ /* -1 */ /* Transform is X A X , where X = U S V, thus */ /* it is U S V A V' (1/S) U' */ if (isim != 0) { /* Compute S (singular values of the eigenvector matrix) */ /* according to CONDS and MODES */ slatm1_(modes, conds, &c__0, &c__0, &iseed[1], &ds[1], n, &iinfo); if (iinfo != 0) { *info = 3; return 0; } /* Multiply by V and V' */ clarge_(n, &a[a_offset], lda, &iseed[1], &work[1], &iinfo); if (iinfo != 0) { *info = 4; return 0; } /* Multiply by S and (1/S) */ i__1 = *n; for (j = 1; j <= i__1; ++j) { csscal_(n, &ds[j], &a[j + a_dim1], lda); if (ds[j] != 0.f) { r__1 = 1.f / ds[j]; csscal_(n, &r__1, &a[j * a_dim1 + 1], &c__1); } else { *info = 5; return 0; } /* L50: */ } /* Multiply by U and U' */ clarge_(n, &a[a_offset], lda, &iseed[1], &work[1], &iinfo); if (iinfo != 0) { *info = 4; return 0; } } /* 5) Reduce the bandwidth. */ if (*kl < *n - 1) { /* Reduce bandwidth -- kill column */ i__1 = *n - 1; for (jcr = *kl + 1; jcr <= i__1; ++jcr) { ic = jcr - *kl; irows = *n + 1 - jcr; icols = *n + *kl - jcr; ccopy_(&irows, &a[jcr + ic * a_dim1], &c__1, &work[1], &c__1); xnorms.r = work[1].r, xnorms.i = work[1].i; clarfg_(&irows, &xnorms, &work[2], &c__1, &tau); r_cnjg(&q__1, &tau); tau.r = q__1.r, tau.i = q__1.i; work[1].r = 1.f, work[1].i = 0.f; clarnd_(&q__1, &c__5, &iseed[1]); alpha.r = q__1.r, alpha.i = q__1.i; cgemv_("C", &irows, &icols, &c_b2, &a[jcr + (ic + 1) * a_dim1], lda, &work[1], &c__1, &c_b1, &work[irows + 1], &c__1); q__1.r = -tau.r, q__1.i = -tau.i; cgerc_(&irows, &icols, &q__1, &work[1], &c__1, &work[irows + 1], & c__1, &a[jcr + (ic + 1) * a_dim1], lda); cgemv_("N", n, &irows, &c_b2, &a[jcr * a_dim1 + 1], lda, &work[1], &c__1, &c_b1, &work[irows + 1], &c__1); r_cnjg(&q__2, &tau); q__1.r = -q__2.r, q__1.i = -q__2.i; cgerc_(n, &irows, &q__1, &work[irows + 1], &c__1, &work[1], &c__1, &a[jcr * a_dim1 + 1], lda); i__2 = jcr + ic * a_dim1; a[i__2].r = xnorms.r, a[i__2].i = xnorms.i; i__2 = irows - 1; claset_("Full", &i__2, &c__1, &c_b1, &c_b1, &a[jcr + 1 + ic * a_dim1], lda); i__2 = icols + 1; cscal_(&i__2, &alpha, &a[jcr + ic * a_dim1], lda); r_cnjg(&q__1, &alpha); cscal_(n, &q__1, &a[jcr * a_dim1 + 1], &c__1); /* L60: */ } } else if (*ku < *n - 1) { /* Reduce upper bandwidth -- kill a row at a time. */ i__1 = *n - 1; for (jcr = *ku + 1; jcr <= i__1; ++jcr) { ir = jcr - *ku; irows = *n + *ku - jcr; icols = *n + 1 - jcr; ccopy_(&icols, &a[ir + jcr * a_dim1], lda, &work[1], &c__1); xnorms.r = work[1].r, xnorms.i = work[1].i; clarfg_(&icols, &xnorms, &work[2], &c__1, &tau); r_cnjg(&q__1, &tau); tau.r = q__1.r, tau.i = q__1.i; work[1].r = 1.f, work[1].i = 0.f; i__2 = icols - 1; clacgv_(&i__2, &work[2], &c__1); clarnd_(&q__1, &c__5, &iseed[1]); alpha.r = q__1.r, alpha.i = q__1.i; cgemv_("N", &irows, &icols, &c_b2, &a[ir + 1 + jcr * a_dim1], lda, &work[1], &c__1, &c_b1, &work[icols + 1], &c__1); q__1.r = -tau.r, q__1.i = -tau.i; cgerc_(&irows, &icols, &q__1, &work[icols + 1], &c__1, &work[1], & c__1, &a[ir + 1 + jcr * a_dim1], lda); cgemv_("C", &icols, n, &c_b2, &a[jcr + a_dim1], lda, &work[1], & c__1, &c_b1, &work[icols + 1], &c__1); r_cnjg(&q__2, &tau); q__1.r = -q__2.r, q__1.i = -q__2.i; cgerc_(&icols, n, &q__1, &work[1], &c__1, &work[icols + 1], &c__1, &a[jcr + a_dim1], lda); i__2 = ir + jcr * a_dim1; a[i__2].r = xnorms.r, a[i__2].i = xnorms.i; i__2 = icols - 1; claset_("Full", &c__1, &i__2, &c_b1, &c_b1, &a[ir + (jcr + 1) * a_dim1], lda); i__2 = irows + 1; cscal_(&i__2, &alpha, &a[ir + jcr * a_dim1], &c__1); r_cnjg(&q__1, &alpha); cscal_(n, &q__1, &a[jcr + a_dim1], lda); /* L70: */ } } /* Scale the matrix to have norm ANORM */ if (*anorm >= 0.f) { temp = clange_("M", n, n, &a[a_offset], lda, tempa); if (temp > 0.f) { ralpha = *anorm / temp; i__1 = *n; for (j = 1; j <= i__1; ++j) { csscal_(n, &ralpha, &a[j * a_dim1 + 1], &c__1); /* L80: */ } } } return 0; /* End of CLATME */ } /* clatme_ */
/* Subroutine */ int clatm4_(integer *itype, integer *n, integer *nz1, integer *nz2, logical *rsign, real *amagn, real *rcond, real *triang, integer *idist, integer *iseed, complex *a, integer *lda) { /* System generated locals */ integer a_dim1, a_offset, i__1, i__2, i__3, i__4; real r__1; doublereal d__1, d__2; complex q__1, q__2; /* Builtin functions */ double pow_dd(doublereal *, doublereal *), pow_ri(real *, integer *), log( doublereal), exp(doublereal), c_abs(complex *); /* Local variables */ static integer kbeg, isdb, kend, isde, klen, i__, k; static real alpha; static complex ctemp; static integer jc, jd, jr; extern /* Complex */ VOID clarnd_(complex *, integer *, integer *); extern /* Subroutine */ int claset_(char *, integer *, integer *, complex *, complex *, complex *, integer *); extern doublereal slaran_(integer *); #define a_subscr(a_1,a_2) (a_2)*a_dim1 + a_1 #define a_ref(a_1,a_2) a[a_subscr(a_1,a_2)] /* -- LAPACK auxiliary test routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University September 30, 1994 Purpose ======= CLATM4 generates basic square matrices, which may later be multiplied by others in order to produce test matrices. It is intended mainly to be used to test the generalized eigenvalue routines. It first generates the diagonal and (possibly) subdiagonal, according to the value of ITYPE, NZ1, NZ2, RSIGN, AMAGN, and RCOND. It then fills in the upper triangle with random numbers, if TRIANG is non-zero. Arguments ========= ITYPE (input) INTEGER The "type" of matrix on the diagonal and sub-diagonal. If ITYPE < 0, then type abs(ITYPE) is generated and then swapped end for end (A(I,J) := A'(N-J,N-I).) See also the description of AMAGN and RSIGN. Special types: = 0: the zero matrix. = 1: the identity. = 2: a transposed Jordan block. = 3: If N is odd, then a k+1 x k+1 transposed Jordan block followed by a k x k identity block, where k=(N-1)/2. If N is even, then k=(N-2)/2, and a zero diagonal entry is tacked onto the end. Diagonal types. The diagonal consists of NZ1 zeros, then k=N-NZ1-NZ2 nonzeros. The subdiagonal is zero. ITYPE specifies the nonzero diagonal entries as follows: = 4: 1, ..., k = 5: 1, RCOND, ..., RCOND = 6: 1, ..., 1, RCOND = 7: 1, a, a^2, ..., a^(k-1)=RCOND = 8: 1, 1-d, 1-2*d, ..., 1-(k-1)*d=RCOND = 9: random numbers chosen from (RCOND,1) = 10: random numbers with distribution IDIST (see CLARND.) N (input) INTEGER The order of the matrix. NZ1 (input) INTEGER If abs(ITYPE) > 3, then the first NZ1 diagonal entries will be zero. NZ2 (input) INTEGER If abs(ITYPE) > 3, then the last NZ2 diagonal entries will be zero. RSIGN (input) LOGICAL = .TRUE.: The diagonal and subdiagonal entries will be multiplied by random numbers of magnitude 1. = .FALSE.: The diagonal and subdiagonal entries will be left as they are (usually non-negative real.) AMAGN (input) REAL The diagonal and subdiagonal entries will be multiplied by AMAGN. RCOND (input) REAL If abs(ITYPE) > 4, then the smallest diagonal entry will be RCOND. RCOND must be between 0 and 1. TRIANG (input) REAL The entries above the diagonal will be random numbers with magnitude bounded by TRIANG (i.e., random numbers multiplied by TRIANG.) IDIST (input) INTEGER On entry, DIST specifies the type of distribution to be used to generate a random matrix . = 1: real and imaginary parts each UNIFORM( 0, 1 ) = 2: real and imaginary parts each UNIFORM( -1, 1 ) = 3: real and imaginary parts each NORMAL( 0, 1 ) = 4: complex number uniform in DISK( 0, 1 ) ISEED (input/output) INTEGER array, dimension (4) On entry ISEED specifies the seed of the random number generator. The values of ISEED are changed on exit, and can be used in the next call to CLATM4 to continue the same random number sequence. Note: ISEED(4) should be odd, for the random number generator used at present. A (output) COMPLEX array, dimension (LDA, N) Array to be computed. LDA (input) INTEGER Leading dimension of A. Must be at least 1 and at least N. ===================================================================== Parameter adjustments */ --iseed; a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; /* Function Body */ if (*n <= 0) { return 0; } claset_("Full", n, n, &c_b1, &c_b1, &a[a_offset], lda); /* Insure a correct ISEED */ if (iseed[4] % 2 != 1) { ++iseed[4]; } /* Compute diagonal and subdiagonal according to ITYPE, NZ1, NZ2, and RCOND */ if (*itype != 0) { if (abs(*itype) >= 4) { /* Computing MAX Computing MIN */ i__3 = *n, i__4 = *nz1 + 1; i__1 = 1, i__2 = min(i__3,i__4); kbeg = max(i__1,i__2); /* Computing MAX Computing MIN */ i__3 = *n, i__4 = *n - *nz2; i__1 = kbeg, i__2 = min(i__3,i__4); kend = max(i__1,i__2); klen = kend + 1 - kbeg; } else { kbeg = 1; kend = *n; klen = *n; } isdb = 1; isde = 0; switch (abs(*itype)) { case 1: goto L10; case 2: goto L30; case 3: goto L50; case 4: goto L80; case 5: goto L100; case 6: goto L120; case 7: goto L140; case 8: goto L160; case 9: goto L180; case 10: goto L200; } /* |ITYPE| = 1: Identity */ L10: i__1 = *n; for (jd = 1; jd <= i__1; ++jd) { i__2 = a_subscr(jd, jd); a[i__2].r = 1.f, a[i__2].i = 0.f; /* L20: */ } goto L220; /* |ITYPE| = 2: Transposed Jordan block */ L30: i__1 = *n - 1; for (jd = 1; jd <= i__1; ++jd) { i__2 = a_subscr(jd + 1, jd); a[i__2].r = 1.f, a[i__2].i = 0.f; /* L40: */ } isdb = 1; isde = *n - 1; goto L220; /* |ITYPE| = 3: Transposed Jordan block, followed by the identity. */ L50: k = (*n - 1) / 2; i__1 = k; for (jd = 1; jd <= i__1; ++jd) { i__2 = a_subscr(jd + 1, jd); a[i__2].r = 1.f, a[i__2].i = 0.f; /* L60: */ } isdb = 1; isde = k; i__1 = (k << 1) + 1; for (jd = k + 2; jd <= i__1; ++jd) { i__2 = a_subscr(jd, jd); a[i__2].r = 1.f, a[i__2].i = 0.f; /* L70: */ } goto L220; /* |ITYPE| = 4: 1,...,k */ L80: i__1 = kend; for (jd = kbeg; jd <= i__1; ++jd) { i__2 = a_subscr(jd, jd); i__3 = jd - *nz1; q__1.r = (real) i__3, q__1.i = 0.f; a[i__2].r = q__1.r, a[i__2].i = q__1.i; /* L90: */ } goto L220; /* |ITYPE| = 5: One large D value: */ L100: i__1 = kend; for (jd = kbeg + 1; jd <= i__1; ++jd) { i__2 = a_subscr(jd, jd); q__1.r = *rcond, q__1.i = 0.f; a[i__2].r = q__1.r, a[i__2].i = q__1.i; /* L110: */ } i__1 = a_subscr(kbeg, kbeg); a[i__1].r = 1.f, a[i__1].i = 0.f; goto L220; /* |ITYPE| = 6: One small D value: */ L120: i__1 = kend - 1; for (jd = kbeg; jd <= i__1; ++jd) { i__2 = a_subscr(jd, jd); a[i__2].r = 1.f, a[i__2].i = 0.f; /* L130: */ } i__1 = a_subscr(kend, kend); q__1.r = *rcond, q__1.i = 0.f; a[i__1].r = q__1.r, a[i__1].i = q__1.i; goto L220; /* |ITYPE| = 7: Exponentially distributed D values: */ L140: i__1 = a_subscr(kbeg, kbeg); a[i__1].r = 1.f, a[i__1].i = 0.f; if (klen > 1) { d__1 = (doublereal) (*rcond); d__2 = (doublereal) (1.f / (real) (klen - 1)); alpha = pow_dd(&d__1, &d__2); i__1 = klen; for (i__ = 2; i__ <= i__1; ++i__) { i__2 = a_subscr(*nz1 + i__, *nz1 + i__); i__3 = i__ - 1; r__1 = pow_ri(&alpha, &i__3); q__1.r = r__1, q__1.i = 0.f; a[i__2].r = q__1.r, a[i__2].i = q__1.i; /* L150: */ } } goto L220; /* |ITYPE| = 8: Arithmetically distributed D values: */ L160: i__1 = a_subscr(kbeg, kbeg); a[i__1].r = 1.f, a[i__1].i = 0.f; if (klen > 1) { alpha = (1.f - *rcond) / (real) (klen - 1); i__1 = klen; for (i__ = 2; i__ <= i__1; ++i__) { i__2 = a_subscr(*nz1 + i__, *nz1 + i__); r__1 = (real) (klen - i__) * alpha + *rcond; q__1.r = r__1, q__1.i = 0.f; a[i__2].r = q__1.r, a[i__2].i = q__1.i; /* L170: */ } } goto L220; /* |ITYPE| = 9: Randomly distributed D values on ( RCOND, 1): */ L180: alpha = log(*rcond); i__1 = kend; for (jd = kbeg; jd <= i__1; ++jd) { i__2 = a_subscr(jd, jd); r__1 = exp(alpha * slaran_(&iseed[1])); a[i__2].r = r__1, a[i__2].i = 0.f; /* L190: */ } goto L220; /* |ITYPE| = 10: Randomly distributed D values from DIST */ L200: i__1 = kend; for (jd = kbeg; jd <= i__1; ++jd) { i__2 = a_subscr(jd, jd); clarnd_(&q__1, idist, &iseed[1]); a[i__2].r = q__1.r, a[i__2].i = q__1.i; /* L210: */ } L220: /* Scale by AMAGN */ i__1 = kend; for (jd = kbeg; jd <= i__1; ++jd) { i__2 = a_subscr(jd, jd); i__3 = a_subscr(jd, jd); r__1 = *amagn * a[i__3].r; a[i__2].r = r__1, a[i__2].i = 0.f; /* L230: */ } i__1 = isde; for (jd = isdb; jd <= i__1; ++jd) { i__2 = a_subscr(jd + 1, jd); i__3 = a_subscr(jd + 1, jd); r__1 = *amagn * a[i__3].r; a[i__2].r = r__1, a[i__2].i = 0.f; /* L240: */ } /* If RSIGN = .TRUE., assign random signs to diagonal and subdiagonal */ if (*rsign) { i__1 = kend; for (jd = kbeg; jd <= i__1; ++jd) { i__2 = a_subscr(jd, jd); if (a[i__2].r != 0.f) { clarnd_(&q__1, &c__3, &iseed[1]); ctemp.r = q__1.r, ctemp.i = q__1.i; r__1 = c_abs(&ctemp); q__1.r = ctemp.r / r__1, q__1.i = ctemp.i / r__1; ctemp.r = q__1.r, ctemp.i = q__1.i; i__2 = a_subscr(jd, jd); i__3 = a_subscr(jd, jd); r__1 = a[i__3].r; q__1.r = r__1 * ctemp.r, q__1.i = r__1 * ctemp.i; a[i__2].r = q__1.r, a[i__2].i = q__1.i; } /* L250: */ } i__1 = isde; for (jd = isdb; jd <= i__1; ++jd) { i__2 = a_subscr(jd + 1, jd); if (a[i__2].r != 0.f) { clarnd_(&q__1, &c__3, &iseed[1]); ctemp.r = q__1.r, ctemp.i = q__1.i; r__1 = c_abs(&ctemp); q__1.r = ctemp.r / r__1, q__1.i = ctemp.i / r__1; ctemp.r = q__1.r, ctemp.i = q__1.i; i__2 = a_subscr(jd + 1, jd); i__3 = a_subscr(jd + 1, jd); r__1 = a[i__3].r; q__1.r = r__1 * ctemp.r, q__1.i = r__1 * ctemp.i; a[i__2].r = q__1.r, a[i__2].i = q__1.i; } /* L260: */ } } /* Reverse if ITYPE < 0 */ if (*itype < 0) { i__1 = (kbeg + kend - 1) / 2; for (jd = kbeg; jd <= i__1; ++jd) { i__2 = a_subscr(jd, jd); ctemp.r = a[i__2].r, ctemp.i = a[i__2].i; i__2 = a_subscr(jd, jd); i__3 = a_subscr(kbeg + kend - jd, kbeg + kend - jd); a[i__2].r = a[i__3].r, a[i__2].i = a[i__3].i; i__2 = a_subscr(kbeg + kend - jd, kbeg + kend - jd); a[i__2].r = ctemp.r, a[i__2].i = ctemp.i; /* L270: */ } i__1 = (*n - 1) / 2; for (jd = 1; jd <= i__1; ++jd) { i__2 = a_subscr(jd + 1, jd); ctemp.r = a[i__2].r, ctemp.i = a[i__2].i; i__2 = a_subscr(jd + 1, jd); i__3 = a_subscr(*n + 1 - jd, *n - jd); a[i__2].r = a[i__3].r, a[i__2].i = a[i__3].i; i__2 = a_subscr(*n + 1 - jd, *n - jd); a[i__2].r = ctemp.r, a[i__2].i = ctemp.i; /* L280: */ } } } /* Fill in upper triangle */ if (*triang != 0.f) { i__1 = *n; for (jc = 2; jc <= i__1; ++jc) { i__2 = jc - 1; for (jr = 1; jr <= i__2; ++jr) { i__3 = a_subscr(jr, jc); clarnd_(&q__2, idist, &iseed[1]); q__1.r = *triang * q__2.r, q__1.i = *triang * q__2.i; a[i__3].r = q__1.r, a[i__3].i = q__1.i; /* L290: */ } /* L300: */ } } return 0; /* End of CLATM4 */ } /* clatm4_ */
/* Subroutine */ int cdrvgg_(integer *nsizes, integer *nn, integer *ntypes, logical *dotype, integer *iseed, real *thresh, real *thrshn, integer * nounit, complex *a, integer *lda, complex *b, complex *s, complex *t, complex *s2, complex *t2, complex *q, integer *ldq, complex *z__, complex *alpha1, complex *beta1, complex *alpha2, complex *beta2, complex *vl, complex *vr, complex *work, integer *lwork, real *rwork, real *result, integer *info) { /* Initialized data */ static integer kclass[26] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2, 2,2,2,3 }; static integer kbmagn[26] = { 1,1,1,1,1,1,1,1,3,2,3,2,2,3,1,1,1,1,1,1,1,3, 2,3,2,1 }; static integer ktrian[26] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1 }; static logical lasign[26] = { FALSE_,FALSE_,FALSE_,FALSE_,FALSE_,FALSE_, TRUE_,FALSE_,TRUE_,TRUE_,FALSE_,FALSE_,TRUE_,TRUE_,TRUE_,FALSE_, TRUE_,FALSE_,FALSE_,FALSE_,TRUE_,TRUE_,TRUE_,TRUE_,TRUE_,FALSE_ }; static logical lbsign[26] = { FALSE_,FALSE_,FALSE_,FALSE_,FALSE_,FALSE_, FALSE_,TRUE_,FALSE_,FALSE_,TRUE_,TRUE_,FALSE_,FALSE_,TRUE_,FALSE_, TRUE_,FALSE_,FALSE_,FALSE_,FALSE_,FALSE_,FALSE_,FALSE_,FALSE_, FALSE_ }; static integer kz1[6] = { 0,1,2,1,3,3 }; static integer kz2[6] = { 0,0,1,2,1,1 }; static integer kadd[6] = { 0,0,0,0,3,2 }; static integer katype[26] = { 0,1,0,1,2,3,4,1,4,4,1,1,4,4,4,2,4,5,8,7,9,4, 4,4,4,0 }; static integer kbtype[26] = { 0,0,1,1,2,-3,1,4,1,1,4,4,1,1,-4,2,-4,8,8,8, 8,8,8,8,8,0 }; static integer kazero[26] = { 1,1,1,1,1,1,2,1,2,2,1,1,2,2,3,1,3,5,5,5,5,3, 3,3,3,1 }; static integer kbzero[26] = { 1,1,1,1,1,1,1,2,1,1,2,2,1,1,4,1,4,6,6,6,6,4, 4,4,4,1 }; static integer kamagn[26] = { 1,1,1,1,1,1,1,1,2,3,2,3,2,3,1,1,1,1,1,1,1,2, 3,3,2,1 }; /* Format strings */ static char fmt_9999[] = "(\002 CDRVGG: \002,a,\002 returned INFO=\002,i" "6,\002.\002,/9x,\002N=\002,i6,\002, JTYPE=\002,i6,\002, ISEED=" "(\002,3(i5,\002,\002),i5,\002)\002)"; static char fmt_9998[] = "(\002 CDRVGG: \002,a,\002 Eigenvectors from" " \002,a,\002 incorrectly \002,\002normalized.\002,/\002 Bits of " "error=\002,0p,g10.3,\002,\002,9x,\002N=\002,i6,\002, JTYPE=\002," "i6,\002, ISEED=(\002,3(i5,\002,\002),i5,\002)\002)"; static char fmt_9997[] = "(/1x,a3,\002 -- Complex Generalized eigenvalue" " problem driver\002)"; static char fmt_9996[] = "(\002 Matrix types (see CDRVGG for details):" " \002)"; static char fmt_9995[] = "(\002 Special Matrices:\002,23x,\002(J'=transp" "osed Jordan block)\002,/\002 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I" ") 5=(J',J') \002,\0026=(diag(J',I), diag(I,J'))\002,/\002 Diag" "onal Matrices: ( \002,\002D=diag(0,1,2,...) )\002,/\002 7=(D," "I) 9=(large*D, small*I\002,\002) 11=(large*I, small*D) 13=(l" "arge*D, large*I)\002,/\002 8=(I,D) 10=(small*D, large*I) 12=" "(small*I, large*D) \002,\002 14=(small*D, small*I)\002,/\002 15" "=(D, reversed D)\002)"; static char fmt_9994[] = "(\002 Matrices Rotated by Random \002,a,\002 M" "atrices U, V:\002,/\002 16=Transposed Jordan Blocks " " 19=geometric \002,\002alpha, beta=0,1\002,/\002 17=arithm. alp" "ha&beta \002,\002 20=arithmetic alpha, beta=0," "1\002,/\002 18=clustered \002,\002alpha, beta=0,1 21" "=random alpha, beta=0,1\002,/\002 Large & Small Matrices:\002," "/\002 22=(large, small) \002,\00223=(small,large) 24=(smal" "l,small) 25=(large,large)\002,/\002 26=random O(1) matrices" ".\002)"; static char fmt_9993[] = "(/\002 Tests performed: (S is Schur, T is tri" "angular, \002,\002Q and Z are \002,a,\002,\002,/20x,\002l and r " "are the appropriate left and right\002,/19x,\002eigenvectors, re" "sp., a is alpha, b is beta, and\002,/19x,a,\002 means \002,a," "\002.)\002,/\002 1 = | A - Q S Z\002,a,\002 | / ( |A| n ulp ) " " 2 = | B - Q T Z\002,a,\002 | / ( |B| n ulp )\002,/\002 3 = | " "I - QQ\002,a,\002 | / ( n ulp ) 4 = | I - ZZ\002,a" ",\002 | / ( n ulp )\002,/\002 5 = difference between (alpha,beta" ") and diagonals of\002,\002 (S,T)\002,/\002 6 = max | ( b A - a " "B )\002,a,\002 l | / const. 7 = max | ( b A - a B ) r | / cons" "t.\002,/1x)"; static char fmt_9992[] = "(\002 Matrix order=\002,i5,\002, type=\002,i2" ",\002, seed=\002,4(i4,\002,\002),\002 result \002,i3,\002 is\002" ",0p,f8.2)"; static char fmt_9991[] = "(\002 Matrix order=\002,i5,\002, type=\002,i2" ",\002, seed=\002,4(i4,\002,\002),\002 result \002,i3,\002 is\002" ",1p,e10.3)"; /* System generated locals */ integer a_dim1, a_offset, b_dim1, b_offset, q_dim1, q_offset, s_dim1, s_offset, s2_dim1, s2_offset, t_dim1, t_offset, t2_dim1, t2_offset, vl_dim1, vl_offset, vr_dim1, vr_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4, i__5, i__6, i__7, i__8, i__9, i__10, i__11; real r__1, r__2, r__3, r__4, r__5, r__6, r__7, r__8, r__9, r__10, r__11, r__12, r__13, r__14, r__15, r__16; complex q__1, q__2, q__3, q__4; /* Builtin functions */ double r_sign(real *, real *), c_abs(complex *); void r_cnjg(complex *, complex *); integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void); double r_imag(complex *); /* Local variables */ static integer iadd, nmax; static real temp1, temp2; static integer j, n; static logical badnn; extern /* Subroutine */ int cgegs_(char *, char *, integer *, complex *, integer *, complex *, integer *, complex *, complex *, complex *, integer *, complex *, integer *, complex *, integer *, real *, integer *), cgegv_(char *, char *, integer *, complex *, integer *, complex *, integer *, complex *, complex *, complex *, integer *, complex *, integer *, complex *, integer *, real *, integer *), cget51_(integer *, integer *, complex *, integer *, complex *, integer *, complex *, integer *, complex *, integer *, complex *, real *, real *), cget52_(logical *, integer *, complex *, integer *, complex *, integer *, complex *, integer *, complex *, complex *, complex *, real *, real *); static real dumma[4]; static integer iinfo; static real rmagn[4]; static complex ctemp; static integer nmats, jsize, nerrs, i1, jtype, ntest, n1; extern /* Subroutine */ int clatm4_(integer *, integer *, integer *, integer *, logical *, real *, real *, real *, integer *, integer * , complex *, integer *), cunm2r_(char *, char *, integer *, integer *, integer *, complex *, integer *, complex *, complex *, integer *, complex *, integer *); static integer jc, nb; extern /* Subroutine */ int slabad_(real *, real *); static integer in, jr; extern /* Subroutine */ int clarfg_(integer *, complex *, complex *, integer *, complex *); static integer ns; extern /* Complex */ VOID clarnd_(complex *, integer *, integer *); extern doublereal slamch_(char *); extern /* Subroutine */ int clacpy_(char *, integer *, integer *, complex *, integer *, complex *, integer *); static real safmin, safmax; static integer ioldsd[4]; extern integer ilaenv_(integer *, char *, char *, integer *, integer *, integer *, integer *, ftnlen, ftnlen); extern /* Subroutine */ int alasvm_(char *, integer *, integer *, integer *, integer *), claset_(char *, integer *, integer *, complex *, complex *, complex *, integer *), xerbla_(char *, integer *); static real ulpinv; static integer lwkopt, mtypes, ntestt, nbz; static real ulp; /* Fortran I/O blocks */ static cilist io___43 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___44 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___47 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___49 = { 0, 0, 0, fmt_9998, 0 }; static cilist io___50 = { 0, 0, 0, fmt_9998, 0 }; static cilist io___51 = { 0, 0, 0, fmt_9997, 0 }; static cilist io___52 = { 0, 0, 0, fmt_9996, 0 }; static cilist io___53 = { 0, 0, 0, fmt_9995, 0 }; static cilist io___54 = { 0, 0, 0, fmt_9994, 0 }; static cilist io___55 = { 0, 0, 0, fmt_9993, 0 }; static cilist io___56 = { 0, 0, 0, fmt_9992, 0 }; static cilist io___57 = { 0, 0, 0, fmt_9991, 0 }; #define a_subscr(a_1,a_2) (a_2)*a_dim1 + a_1 #define a_ref(a_1,a_2) a[a_subscr(a_1,a_2)] #define b_subscr(a_1,a_2) (a_2)*b_dim1 + a_1 #define b_ref(a_1,a_2) b[b_subscr(a_1,a_2)] #define q_subscr(a_1,a_2) (a_2)*q_dim1 + a_1 #define q_ref(a_1,a_2) q[q_subscr(a_1,a_2)] #define s_subscr(a_1,a_2) (a_2)*s_dim1 + a_1 #define s_ref(a_1,a_2) s[s_subscr(a_1,a_2)] #define t_subscr(a_1,a_2) (a_2)*t_dim1 + a_1 #define t_ref(a_1,a_2) t[t_subscr(a_1,a_2)] #define z___subscr(a_1,a_2) (a_2)*z_dim1 + a_1 #define z___ref(a_1,a_2) z__[z___subscr(a_1,a_2)] /* -- LAPACK test routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University September 30, 1994 Purpose ======= CDRVGG checks the nonsymmetric generalized eigenvalue driver routines. T T T CGEGS factors A and B as Q S Z and Q T Z , where means transpose, T is upper triangular, S is in generalized Schur form (upper triangular), and Q and Z are unitary. It also computes the generalized eigenvalues (alpha(1),beta(1)), ..., (alpha(n),beta(n)), where alpha(j)=S(j,j) and beta(j)=T(j,j) -- thus, w(j) = alpha(j)/beta(j) is a root of the generalized eigenvalue problem det( A - w(j) B ) = 0 and m(j) = beta(j)/alpha(j) is a root of the essentially equivalent problem det( m(j) A - B ) = 0 CGEGV computes the generalized eigenvalues (alpha(1),beta(1)), ..., (alpha(n),beta(n)), the matrix L whose columns contain the generalized left eigenvectors l, and the matrix R whose columns contain the generalized right eigenvectors r for the pair (A,B). When CDRVGG is called, a number of matrix "sizes" ("n's") and a number of matrix "types" are specified. For each size ("n") and each type of matrix, one matrix will be generated and used to test the nonsymmetric eigenroutines. For each matrix, 7 tests will be performed and compared with the threshhold THRESH: Results from CGEGS: H (1) | A - Q S Z | / ( |A| n ulp ) H (2) | B - Q T Z | / ( |B| n ulp ) H (3) | I - QQ | / ( n ulp ) H (4) | I - ZZ | / ( n ulp ) (5) maximum over j of D(j) where: |alpha(j) - S(j,j)| |beta(j) - T(j,j)| D(j) = ------------------------ + ----------------------- max(|alpha(j)|,|S(j,j)|) max(|beta(j)|,|T(j,j)|) Results from CGEGV: (6) max over all left eigenvalue/-vector pairs (beta/alpha,l) of | l**H * (beta A - alpha B) | / ( ulp max( |beta A|, |alpha B| ) ) where l**H is the conjugate tranpose of l. (7) max over all right eigenvalue/-vector pairs (beta/alpha,r) of | (beta A - alpha B) r | / ( ulp max( |beta A|, |alpha B| ) ) Test Matrices ---- -------- The sizes of the test matrices are specified by an array NN(1:NSIZES); the value of each element NN(j) specifies one size. The "types" are specified by a logical array DOTYPE( 1:NTYPES ); if DOTYPE(j) is .TRUE., then matrix type "j" will be generated. Currently, the list of possible types is: (1) ( 0, 0 ) (a pair of zero matrices) (2) ( I, 0 ) (an identity and a zero matrix) (3) ( 0, I ) (an identity and a zero matrix) (4) ( I, I ) (a pair of identity matrices) t t (5) ( J , J ) (a pair of transposed Jordan blocks) t ( I 0 ) (6) ( X, Y ) where X = ( J 0 ) and Y = ( t ) ( 0 I ) ( 0 J ) and I is a k x k identity and J a (k+1)x(k+1) Jordan block; k=(N-1)/2 (7) ( D, I ) where D is diag( 0, 1,..., N-1 ) (a diagonal matrix with those diagonal entries.) (8) ( I, D ) (9) ( big*D, small*I ) where "big" is near overflow and small=1/big (10) ( small*D, big*I ) (11) ( big*I, small*D ) (12) ( small*I, big*D ) (13) ( big*D, big*I ) (14) ( small*D, small*I ) (15) ( D1, D2 ) where D1 is diag( 0, 0, 1, ..., N-3, 0 ) and D2 is diag( 0, N-3, N-4,..., 1, 0, 0 ) t t (16) Q ( J , J ) Z where Q and Z are random unitary matrices. (17) Q ( T1, T2 ) Z where T1 and T2 are upper triangular matrices with random O(1) entries above the diagonal and diagonal entries diag(T1) = ( 0, 0, 1, ..., N-3, 0 ) and diag(T2) = ( 0, N-3, N-4,..., 1, 0, 0 ) (18) Q ( T1, T2 ) Z diag(T1) = ( 0, 0, 1, 1, s, ..., s, 0 ) diag(T2) = ( 0, 1, 0, 1,..., 1, 0 ) s = machine precision. (19) Q ( T1, T2 ) Z diag(T1)=( 0,0,1,1, 1-d, ..., 1-(N-5)*d=s, 0 ) diag(T2) = ( 0, 1, 0, 1, ..., 1, 0 ) N-5 (20) Q ( T1, T2 ) Z diag(T1)=( 0, 0, 1, 1, a, ..., a =s, 0 ) diag(T2) = ( 0, 1, 0, 1, ..., 1, 0, 0 ) (21) Q ( T1, T2 ) Z diag(T1)=( 0, 0, 1, r1, r2, ..., r(N-4), 0 ) diag(T2) = ( 0, 1, 0, 1, ..., 1, 0, 0 ) where r1,..., r(N-4) are random. (22) Q ( big*T1, small*T2 ) Z diag(T1) = ( 0, 0, 1, ..., N-3, 0 ) diag(T2) = ( 0, 1, ..., 1, 0, 0 ) (23) Q ( small*T1, big*T2 ) Z diag(T1) = ( 0, 0, 1, ..., N-3, 0 ) diag(T2) = ( 0, 1, ..., 1, 0, 0 ) (24) Q ( small*T1, small*T2 ) Z diag(T1) = ( 0, 0, 1, ..., N-3, 0 ) diag(T2) = ( 0, 1, ..., 1, 0, 0 ) (25) Q ( big*T1, big*T2 ) Z diag(T1) = ( 0, 0, 1, ..., N-3, 0 ) diag(T2) = ( 0, 1, ..., 1, 0, 0 ) (26) Q ( T1, T2 ) Z where T1 and T2 are random upper-triangular matrices. Arguments ========= NSIZES (input) INTEGER The number of sizes of matrices to use. If it is zero, CDRVGG does nothing. It must be at least zero. NN (input) INTEGER array, dimension (NSIZES) An array containing the sizes to be used for the matrices. Zero values will be skipped. The values must be at least zero. NTYPES (input) INTEGER The number of elements in DOTYPE. If it is zero, CDRVGG 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 matrix is in A. This is only useful if DOTYPE(1:MAXTYP) is .FALSE. and DOTYPE(MAXTYP+1) is .TRUE. . DOTYPE (input) LOGICAL array, dimension (NTYPES) If DOTYPE(j) is .TRUE., then for each size in NN a matrix of that size and 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 (input/output) 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 CDRVGG to continue the same random number sequence. THRESH (input) REAL A test will count as "failed" if the "error", 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. THRSHN (input) REAL Threshhold for reporting eigenvector normalization error. If the normalization of any eigenvector differs from 1 by more than THRSHN*ulp, then a special error message will be printed. (This is handled separately from the other tests, since only a compiler or programming error should cause an error message, at least if THRSHN is at least 5--10.) NOUNIT (input) INTEGER The FORTRAN unit number for printing out error messages (e.g., if a routine returns IINFO not equal to 0.) A (input/workspace) COMPLEX array, dimension (LDA, max(NN)) Used to hold the original A matrix. Used as input only if NTYPES=MAXTYP+1, DOTYPE(1:MAXTYP)=.FALSE., and DOTYPE(MAXTYP+1)=.TRUE. LDA (input) INTEGER The leading dimension of A, B, S, T, S2, and T2. It must be at least 1 and at least max( NN ). B (input/workspace) COMPLEX array, dimension (LDA, max(NN)) Used to hold the original B matrix. Used as input only if NTYPES=MAXTYP+1, DOTYPE(1:MAXTYP)=.FALSE., and DOTYPE(MAXTYP+1)=.TRUE. S (workspace) COMPLEX array, dimension (LDA, max(NN)) The upper triangular matrix computed from A by CGEGS. T (workspace) COMPLEX array, dimension (LDA, max(NN)) The upper triangular matrix computed from B by CGEGS. S2 (workspace) COMPLEX array, dimension (LDA, max(NN)) The matrix computed from A by CGEGV. This will be the Schur (upper triangular) form of some matrix related to A, but will not, in general, be the same as S. T2 (workspace) COMPLEX array, dimension (LDA, max(NN)) The matrix computed from B by CGEGV. This will be the Schur form of some matrix related to B, but will not, in general, be the same as T. Q (workspace) COMPLEX array, dimension (LDQ, max(NN)) The (left) unitary matrix computed by CGEGS. LDQ (input) INTEGER The leading dimension of Q, Z, VL, and VR. It must be at least 1 and at least max( NN ). Z (workspace) COMPLEX array, dimension (LDQ, max(NN)) The (right) unitary matrix computed by CGEGS. ALPHA1 (workspace) COMPLEX array, dimension (max(NN)) BETA1 (workspace) COMPLEX array, dimension (max(NN)) The generalized eigenvalues of (A,B) computed by CGEGS. ALPHA1(k) / BETA1(k) is the k-th generalized eigenvalue of the matrices in A and B. ALPHA2 (workspace) COMPLEX array, dimension (max(NN)) BETA2 (workspace) COMPLEX array, dimension (max(NN)) The generalized eigenvalues of (A,B) computed by CGEGV. ALPHA2(k) / BETA2(k) is the k-th generalized eigenvalue of the matrices in A and B. VL (workspace) COMPLEX array, dimension (LDQ, max(NN)) The (lower triangular) left eigenvector matrix for the matrices in A and B. VR (workspace) COMPLEX array, dimension (LDQ, max(NN)) The (upper triangular) right eigenvector matrix for the matrices in A and B. WORK (workspace) COMPLEX array, dimension (LWORK) LWORK (input) INTEGER The number of entries in WORK. This must be at least MAX( 2*N, N*(NB+1), (k+1)*(2*k+N+1) ), where "k" is the sum of the blocksize and number-of-shifts for CHGEQZ, and NB is the greatest of the blocksizes for CGEQRF, CUNMQR, and CUNGQR. (The blocksizes and the number-of-shifts are retrieved through calls to ILAENV.) RWORK (workspace) REAL array, dimension (8*N) RESULT (output) REAL array, dimension (7) The values computed by the tests described above. The values are currently limited to 1/ulp, to avoid overflow. INFO (output) INTEGER = 0: successful exit < 0: if INFO = -i, the i-th argument had an illegal value. > 0: A routine returned an error code. INFO is the absolute value of the INFO value returned. ===================================================================== Parameter adjustments */ --nn; --dotype; --iseed; t2_dim1 = *lda; t2_offset = 1 + t2_dim1 * 1; t2 -= t2_offset; s2_dim1 = *lda; s2_offset = 1 + s2_dim1 * 1; s2 -= s2_offset; t_dim1 = *lda; t_offset = 1 + t_dim1 * 1; t -= t_offset; s_dim1 = *lda; s_offset = 1 + s_dim1 * 1; s -= s_offset; b_dim1 = *lda; b_offset = 1 + b_dim1 * 1; b -= b_offset; a_dim1 = *lda; a_offset = 1 + a_dim1 * 1; a -= a_offset; vr_dim1 = *ldq; vr_offset = 1 + vr_dim1 * 1; vr -= vr_offset; vl_dim1 = *ldq; vl_offset = 1 + vl_dim1 * 1; vl -= vl_offset; z_dim1 = *ldq; z_offset = 1 + z_dim1 * 1; z__ -= z_offset; q_dim1 = *ldq; q_offset = 1 + q_dim1 * 1; q -= q_offset; --alpha1; --beta1; --alpha2; --beta2; --work; --rwork; --result; /* Function Body Check for errors */ *info = 0; badnn = FALSE_; nmax = 1; i__1 = *nsizes; for (j = 1; j <= i__1; ++j) { /* Computing MAX */ i__2 = nmax, i__3 = nn[j]; nmax = max(i__2,i__3); if (nn[j] < 0) { badnn = TRUE_; } /* L10: */ } /* Maximum blocksize and shift -- we assume that blocksize and number of shifts are monotone increasing functions of N. Computing MAX */ i__1 = 1, i__2 = ilaenv_(&c__1, "CGEQRF", " ", &nmax, &nmax, &c_n1, &c_n1, (ftnlen)6, (ftnlen)1), i__1 = max(i__1,i__2), i__2 = ilaenv_(& c__1, "CUNMQR", "LC", &nmax, &nmax, &nmax, &c_n1, (ftnlen)6, ( ftnlen)2), i__1 = max(i__1,i__2), i__2 = ilaenv_(&c__1, "CUNGQR", " ", &nmax, &nmax, &nmax, &c_n1, (ftnlen)6, (ftnlen)1); nb = max(i__1,i__2); nbz = ilaenv_(&c__1, "CHGEQZ", "SII", &nmax, &c__1, &nmax, &c__0, (ftnlen) 6, (ftnlen)3); ns = ilaenv_(&c__4, "CHGEQZ", "SII", &nmax, &c__1, &nmax, &c__0, (ftnlen) 6, (ftnlen)3); i1 = nbz + ns; /* Computing MAX */ i__1 = nmax << 1, i__2 = nmax * (nb + 1), i__1 = max(i__1,i__2), i__2 = (( i1 << 1) + nmax + 1) * (i1 + 1); lwkopt = max(i__1,i__2); /* Check for errors */ if (*nsizes < 0) { *info = -1; } else if (badnn) { *info = -2; } else if (*ntypes < 0) { *info = -3; } else if (*thresh < 0.f) { *info = -6; } else if (*lda <= 1 || *lda < nmax) { *info = -10; } else if (*ldq <= 1 || *ldq < nmax) { *info = -19; } else if (lwkopt > *lwork) { *info = -30; } if (*info != 0) { i__1 = -(*info); xerbla_("CDRVGG", &i__1); return 0; } /* Quick return if possible */ if (*nsizes == 0 || *ntypes == 0) { return 0; } ulp = slamch_("Precision"); safmin = slamch_("Safe minimum"); safmin /= ulp; safmax = 1.f / safmin; slabad_(&safmin, &safmax); ulpinv = 1.f / ulp; /* The values RMAGN(2:3) depend on N, see below. */ rmagn[0] = 0.f; rmagn[1] = 1.f; /* Loop over sizes, types */ ntestt = 0; nerrs = 0; nmats = 0; i__1 = *nsizes; for (jsize = 1; jsize <= i__1; ++jsize) { n = nn[jsize]; n1 = max(1,n); rmagn[2] = safmax * ulp / (real) n1; rmagn[3] = safmin * ulpinv * n1; if (*nsizes != 1) { mtypes = min(26,*ntypes); } else { mtypes = min(27,*ntypes); } i__2 = mtypes; for (jtype = 1; jtype <= i__2; ++jtype) { if (! dotype[jtype]) { goto L150; } ++nmats; ntest = 0; /* Save ISEED in case of an error. */ for (j = 1; j <= 4; ++j) { ioldsd[j - 1] = iseed[j]; /* L20: */ } /* Initialize RESULT */ for (j = 1; j <= 7; ++j) { result[j] = 0.f; /* L30: */ } /* Compute A and B Description of control parameters: KCLASS: =1 means w/o rotation, =2 means w/ rotation, =3 means random. KATYPE: the "type" to be passed to CLATM4 for computing A. KAZERO: the pattern of zeros on the diagonal for A: =1: ( xxx ), =2: (0, xxx ) =3: ( 0, 0, xxx, 0 ), =4: ( 0, xxx, 0, 0 ), =5: ( 0, 0, 1, xxx, 0 ), =6: ( 0, 1, 0, xxx, 0 ). (xxx means a string of non-zero entries.) KAMAGN: the magnitude of the matrix: =0: zero, =1: O(1), =2: large, =3: small. LASIGN: .TRUE. if the diagonal elements of A are to be multiplied by a random magnitude 1 number. KBTYPE, KBZERO, KBMAGN, IBSIGN: the same, but for B. KTRIAN: =0: don't fill in the upper triangle, =1: do. KZ1, KZ2, KADD: used to implement KAZERO and KBZERO. RMAGN: used to implement KAMAGN and KBMAGN. */ if (mtypes > 26) { goto L110; } iinfo = 0; if (kclass[jtype - 1] < 3) { /* Generate A (w/o rotation) */ if ((i__3 = katype[jtype - 1], abs(i__3)) == 3) { in = ((n - 1) / 2 << 1) + 1; if (in != n) { claset_("Full", &n, &n, &c_b1, &c_b1, &a[a_offset], lda); } } else { in = n; } clatm4_(&katype[jtype - 1], &in, &kz1[kazero[jtype - 1] - 1], &kz2[kazero[jtype - 1] - 1], &lasign[jtype - 1], & rmagn[kamagn[jtype - 1]], &ulp, &rmagn[ktrian[jtype - 1] * kamagn[jtype - 1]], &c__2, &iseed[1], &a[ a_offset], lda); iadd = kadd[kazero[jtype - 1] - 1]; if (iadd > 0 && iadd <= n) { i__3 = a_subscr(iadd, iadd); i__4 = kamagn[jtype - 1]; a[i__3].r = rmagn[i__4], a[i__3].i = 0.f; } /* Generate B (w/o rotation) */ if ((i__3 = kbtype[jtype - 1], abs(i__3)) == 3) { in = ((n - 1) / 2 << 1) + 1; if (in != n) { claset_("Full", &n, &n, &c_b1, &c_b1, &b[b_offset], lda); } } else { in = n; } clatm4_(&kbtype[jtype - 1], &in, &kz1[kbzero[jtype - 1] - 1], &kz2[kbzero[jtype - 1] - 1], &lbsign[jtype - 1], & rmagn[kbmagn[jtype - 1]], &c_b39, &rmagn[ktrian[jtype - 1] * kbmagn[jtype - 1]], &c__2, &iseed[1], &b[ b_offset], lda); iadd = kadd[kbzero[jtype - 1] - 1]; if (iadd != 0 && iadd <= n) { i__3 = b_subscr(iadd, iadd); i__4 = kbmagn[jtype - 1]; b[i__3].r = rmagn[i__4], b[i__3].i = 0.f; } if (kclass[jtype - 1] == 2 && n > 0) { /* Include rotations Generate Q, Z as Householder transformations times a diagonal matrix. */ i__3 = n - 1; for (jc = 1; jc <= i__3; ++jc) { i__4 = n; for (jr = jc; jr <= i__4; ++jr) { i__5 = q_subscr(jr, jc); clarnd_(&q__1, &c__3, &iseed[1]); q[i__5].r = q__1.r, q[i__5].i = q__1.i; i__5 = z___subscr(jr, jc); clarnd_(&q__1, &c__3, &iseed[1]); z__[i__5].r = q__1.r, z__[i__5].i = q__1.i; /* L40: */ } i__4 = n + 1 - jc; clarfg_(&i__4, &q_ref(jc, jc), &q_ref(jc + 1, jc), & c__1, &work[jc]); i__4 = (n << 1) + jc; i__5 = q_subscr(jc, jc); r__2 = q[i__5].r; r__1 = r_sign(&c_b39, &r__2); work[i__4].r = r__1, work[i__4].i = 0.f; i__4 = q_subscr(jc, jc); q[i__4].r = 1.f, q[i__4].i = 0.f; i__4 = n + 1 - jc; clarfg_(&i__4, &z___ref(jc, jc), &z___ref(jc + 1, jc), &c__1, &work[n + jc]); i__4 = n * 3 + jc; i__5 = z___subscr(jc, jc); r__2 = z__[i__5].r; r__1 = r_sign(&c_b39, &r__2); work[i__4].r = r__1, work[i__4].i = 0.f; i__4 = z___subscr(jc, jc); z__[i__4].r = 1.f, z__[i__4].i = 0.f; /* L50: */ } clarnd_(&q__1, &c__3, &iseed[1]); ctemp.r = q__1.r, ctemp.i = q__1.i; i__3 = q_subscr(n, n); q[i__3].r = 1.f, q[i__3].i = 0.f; i__3 = n; work[i__3].r = 0.f, work[i__3].i = 0.f; i__3 = n * 3; r__1 = c_abs(&ctemp); q__1.r = ctemp.r / r__1, q__1.i = ctemp.i / r__1; work[i__3].r = q__1.r, work[i__3].i = q__1.i; clarnd_(&q__1, &c__3, &iseed[1]); ctemp.r = q__1.r, ctemp.i = q__1.i; i__3 = z___subscr(n, n); z__[i__3].r = 1.f, z__[i__3].i = 0.f; i__3 = n << 1; work[i__3].r = 0.f, work[i__3].i = 0.f; i__3 = n << 2; r__1 = c_abs(&ctemp); q__1.r = ctemp.r / r__1, q__1.i = ctemp.i / r__1; work[i__3].r = q__1.r, work[i__3].i = q__1.i; /* Apply the diagonal matrices */ i__3 = n; for (jc = 1; jc <= i__3; ++jc) { i__4 = n; for (jr = 1; jr <= i__4; ++jr) { i__5 = a_subscr(jr, jc); i__6 = (n << 1) + jr; r_cnjg(&q__3, &work[n * 3 + jc]); q__2.r = work[i__6].r * q__3.r - work[i__6].i * q__3.i, q__2.i = work[i__6].r * q__3.i + work[i__6].i * q__3.r; i__7 = a_subscr(jr, jc); q__1.r = q__2.r * a[i__7].r - q__2.i * a[i__7].i, q__1.i = q__2.r * a[i__7].i + q__2.i * a[ i__7].r; a[i__5].r = q__1.r, a[i__5].i = q__1.i; i__5 = b_subscr(jr, jc); i__6 = (n << 1) + jr; r_cnjg(&q__3, &work[n * 3 + jc]); q__2.r = work[i__6].r * q__3.r - work[i__6].i * q__3.i, q__2.i = work[i__6].r * q__3.i + work[i__6].i * q__3.r; i__7 = b_subscr(jr, jc); q__1.r = q__2.r * b[i__7].r - q__2.i * b[i__7].i, q__1.i = q__2.r * b[i__7].i + q__2.i * b[ i__7].r; b[i__5].r = q__1.r, b[i__5].i = q__1.i; /* L60: */ } /* L70: */ } i__3 = n - 1; cunm2r_("L", "N", &n, &n, &i__3, &q[q_offset], ldq, &work[ 1], &a[a_offset], lda, &work[(n << 1) + 1], & iinfo); if (iinfo != 0) { goto L100; } i__3 = n - 1; cunm2r_("R", "C", &n, &n, &i__3, &z__[z_offset], ldq, & work[n + 1], &a[a_offset], lda, &work[(n << 1) + 1], &iinfo); if (iinfo != 0) { goto L100; } i__3 = n - 1; cunm2r_("L", "N", &n, &n, &i__3, &q[q_offset], ldq, &work[ 1], &b[b_offset], lda, &work[(n << 1) + 1], & iinfo); if (iinfo != 0) { goto L100; } i__3 = n - 1; cunm2r_("R", "C", &n, &n, &i__3, &z__[z_offset], ldq, & work[n + 1], &b[b_offset], lda, &work[(n << 1) + 1], &iinfo); if (iinfo != 0) { goto L100; } } } else { /* Random matrices */ i__3 = n; for (jc = 1; jc <= i__3; ++jc) { i__4 = n; for (jr = 1; jr <= i__4; ++jr) { i__5 = a_subscr(jr, jc); i__6 = kamagn[jtype - 1]; clarnd_(&q__2, &c__4, &iseed[1]); q__1.r = rmagn[i__6] * q__2.r, q__1.i = rmagn[i__6] * q__2.i; a[i__5].r = q__1.r, a[i__5].i = q__1.i; i__5 = b_subscr(jr, jc); i__6 = kbmagn[jtype - 1]; clarnd_(&q__2, &c__4, &iseed[1]); q__1.r = rmagn[i__6] * q__2.r, q__1.i = rmagn[i__6] * q__2.i; b[i__5].r = q__1.r, b[i__5].i = q__1.i; /* L80: */ } /* L90: */ } } L100: if (iinfo != 0) { io___43.ciunit = *nounit; s_wsfe(&io___43); do_fio(&c__1, "Generator", (ftnlen)9); do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)); do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof(integer)); e_wsfe(); *info = abs(iinfo); return 0; } L110: /* Call CGEGS to compute H, T, Q, Z, alpha, and beta. */ clacpy_(" ", &n, &n, &a[a_offset], lda, &s[s_offset], lda); clacpy_(" ", &n, &n, &b[b_offset], lda, &t[t_offset], lda); ntest = 1; result[1] = ulpinv; cgegs_("V", "V", &n, &s[s_offset], lda, &t[t_offset], lda, & alpha1[1], &beta1[1], &q[q_offset], ldq, &z__[z_offset], ldq, &work[1], lwork, &rwork[1], &iinfo); if (iinfo != 0) { io___44.ciunit = *nounit; s_wsfe(&io___44); do_fio(&c__1, "CGEGS", (ftnlen)5); do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)); do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof(integer)); e_wsfe(); *info = abs(iinfo); goto L130; } ntest = 4; /* Do tests 1--4 */ cget51_(&c__1, &n, &a[a_offset], lda, &s[s_offset], lda, &q[ q_offset], ldq, &z__[z_offset], ldq, &work[1], &rwork[1], &result[1]); cget51_(&c__1, &n, &b[b_offset], lda, &t[t_offset], lda, &q[ q_offset], ldq, &z__[z_offset], ldq, &work[1], &rwork[1], &result[2]); cget51_(&c__3, &n, &b[b_offset], lda, &t[t_offset], lda, &q[ q_offset], ldq, &q[q_offset], ldq, &work[1], &rwork[1], & result[3]); cget51_(&c__3, &n, &b[b_offset], lda, &t[t_offset], lda, &z__[ z_offset], ldq, &z__[z_offset], ldq, &work[1], &rwork[1], &result[4]); /* Do test 5: compare eigenvalues with diagonals. */ temp1 = 0.f; i__3 = n; for (j = 1; j <= i__3; ++j) { i__4 = j; i__5 = s_subscr(j, j); q__2.r = alpha1[i__4].r - s[i__5].r, q__2.i = alpha1[i__4].i - s[i__5].i; q__1.r = q__2.r, q__1.i = q__2.i; i__6 = j; i__7 = t_subscr(j, j); q__4.r = beta1[i__6].r - t[i__7].r, q__4.i = beta1[i__6].i - t[i__7].i; q__3.r = q__4.r, q__3.i = q__4.i; /* Computing MAX */ i__8 = j; i__9 = s_subscr(j, j); r__13 = safmin, r__14 = (r__1 = alpha1[i__8].r, dabs(r__1)) + (r__2 = r_imag(&alpha1[j]), dabs(r__2)), r__13 = max( r__13,r__14), r__14 = (r__3 = s[i__9].r, dabs(r__3)) + (r__4 = r_imag(&s_ref(j, j)), dabs(r__4)); /* Computing MAX */ i__10 = j; i__11 = t_subscr(j, j); r__15 = safmin, r__16 = (r__5 = beta1[i__10].r, dabs(r__5)) + (r__6 = r_imag(&beta1[j]), dabs(r__6)), r__15 = max( r__15,r__16), r__16 = (r__7 = t[i__11].r, dabs(r__7)) + (r__8 = r_imag(&t_ref(j, j)), dabs(r__8)); temp2 = (((r__9 = q__1.r, dabs(r__9)) + (r__10 = r_imag(&q__1) , dabs(r__10))) / dmax(r__13,r__14) + ((r__11 = q__3.r, dabs(r__11)) + (r__12 = r_imag(&q__3), dabs( r__12))) / dmax(r__15,r__16)) / ulp; temp1 = dmax(temp1,temp2); /* L120: */ } result[5] = temp1; /* Call CGEGV to compute S2, T2, VL, and VR, do tests. Eigenvalues and Eigenvectors */ clacpy_(" ", &n, &n, &a[a_offset], lda, &s2[s2_offset], lda); clacpy_(" ", &n, &n, &b[b_offset], lda, &t2[t2_offset], lda); ntest = 6; result[6] = ulpinv; cgegv_("V", "V", &n, &s2[s2_offset], lda, &t2[t2_offset], lda, & alpha2[1], &beta2[1], &vl[vl_offset], ldq, &vr[vr_offset], ldq, &work[1], lwork, &rwork[1], &iinfo); if (iinfo != 0) { io___47.ciunit = *nounit; s_wsfe(&io___47); do_fio(&c__1, "CGEGV", (ftnlen)5); do_fio(&c__1, (char *)&iinfo, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)); do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof(integer)); e_wsfe(); *info = abs(iinfo); goto L130; } ntest = 7; /* Do Tests 6 and 7 */ cget52_(&c_true, &n, &a[a_offset], lda, &b[b_offset], lda, &vl[ vl_offset], ldq, &alpha2[1], &beta2[1], &work[1], &rwork[ 1], dumma); result[6] = dumma[0]; if (dumma[1] > *thrshn) { io___49.ciunit = *nounit; s_wsfe(&io___49); do_fio(&c__1, "Left", (ftnlen)4); do_fio(&c__1, "CGEGV", (ftnlen)5); do_fio(&c__1, (char *)&dumma[1], (ftnlen)sizeof(real)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)); do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof(integer)); e_wsfe(); } cget52_(&c_false, &n, &a[a_offset], lda, &b[b_offset], lda, &vr[ vr_offset], ldq, &alpha2[1], &beta2[1], &work[1], &rwork[ 1], dumma); result[7] = dumma[0]; if (dumma[1] > *thresh) { io___50.ciunit = *nounit; s_wsfe(&io___50); do_fio(&c__1, "Right", (ftnlen)5); do_fio(&c__1, "CGEGV", (ftnlen)5); do_fio(&c__1, (char *)&dumma[1], (ftnlen)sizeof(real)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)); do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof(integer)); e_wsfe(); } /* End of Loop -- Check for RESULT(j) > THRESH */ L130: ntestt += ntest; /* Print out tests which fail. */ i__3 = ntest; for (jr = 1; jr <= i__3; ++jr) { if (result[jr] >= *thresh) { /* If this is the first test to fail, print a header to the data file. */ if (nerrs == 0) { io___51.ciunit = *nounit; s_wsfe(&io___51); do_fio(&c__1, "CGG", (ftnlen)3); e_wsfe(); /* Matrix types */ io___52.ciunit = *nounit; s_wsfe(&io___52); e_wsfe(); io___53.ciunit = *nounit; s_wsfe(&io___53); e_wsfe(); io___54.ciunit = *nounit; s_wsfe(&io___54); do_fio(&c__1, "Unitary", (ftnlen)7); e_wsfe(); /* Tests performed */ io___55.ciunit = *nounit; s_wsfe(&io___55); do_fio(&c__1, "unitary", (ftnlen)7); do_fio(&c__1, "*", (ftnlen)1); do_fio(&c__1, "conjugate transpose", (ftnlen)19); for (j = 1; j <= 5; ++j) { do_fio(&c__1, "*", (ftnlen)1); } e_wsfe(); } ++nerrs; if (result[jr] < 1e4f) { io___56.ciunit = *nounit; s_wsfe(&io___56); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)) ; do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&jr, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&result[jr], (ftnlen)sizeof( real)); e_wsfe(); } else { io___57.ciunit = *nounit; s_wsfe(&io___57); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&jtype, (ftnlen)sizeof(integer)) ; do_fio(&c__4, (char *)&ioldsd[0], (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&jr, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&result[jr], (ftnlen)sizeof( real)); e_wsfe(); } } /* L140: */ } L150: ; } /* L160: */ } /* Summary */ alasvm_("CGG", nounit, &nerrs, &ntestt, &c__0); return 0; /* End of CDRVGG */ } /* cdrvgg_ */
/* Complex */ void clatm3_(complex * ret_val, integer *m, integer *n, integer *i__, integer *j, integer *isub, integer *jsub, integer *kl, integer * ku, integer *idist, integer *iseed, complex *d__, integer *igrade, complex *dl, complex *dr, integer *ipvtng, integer *iwork, real * sparse) { /* System generated locals */ integer i__1, i__2; complex q__1, q__2, q__3; /* Local variables */ complex ctemp; extern /* Complex */ void clarnd_(complex *, integer *, integer *); extern doublereal slaran_(integer *); /* -- LAPACK auxiliary test routine (version 3.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* November 2006 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* CLATM3 returns the (ISUB,JSUB) entry of a random matrix of */ /* dimension (M, N) described by the other paramters. (ISUB,JSUB) */ /* is the final position of the (I,J) entry after pivoting */ /* according to IPVTNG and IWORK. CLATM3 is called by the */ /* CLATMR routine in order to build random test matrices. No error */ /* checking on parameters is done, because this routine is called in */ /* a tight loop by CLATMR which has already checked the parameters. */ /* Use of CLATM3 differs from CLATM2 in the order in which the random */ /* number generator is called to fill in random matrix entries. */ /* With CLATM2, the generator is called to fill in the pivoted matrix */ /* columnwise. With CLATM3, the generator is called to fill in the */ /* matrix columnwise, after which it is pivoted. Thus, CLATM3 can */ /* be used to construct random matrices which differ only in their */ /* order of rows and/or columns. CLATM2 is used to construct band */ /* matrices while avoiding calling the random number generator for */ /* entries outside the band (and therefore generating random numbers */ /* in different orders for different pivot orders). */ /* The matrix whose (ISUB,JSUB) entry is returned is constructed as */ /* follows (this routine only computes one entry): */ /* If ISUB is outside (1..M) or JSUB is outside (1..N), return zero */ /* (this is convenient for generating matrices in band format). */ /* Generate a matrix A with random entries of distribution IDIST. */ /* Set the diagonal to D. */ /* Grade the matrix, if desired, from the left (by DL) and/or */ /* from the right (by DR or DL) as specified by IGRADE. */ /* Permute, if desired, the rows and/or columns as specified by */ /* IPVTNG and IWORK. */ /* Band the matrix to have lower bandwidth KL and upper */ /* bandwidth KU. */ /* Set random entries to zero as specified by SPARSE. */ /* Arguments */ /* ========= */ /* M - INTEGER */ /* Number of rows of matrix. Not modified. */ /* N - INTEGER */ /* Number of columns of matrix. Not modified. */ /* I - INTEGER */ /* Row of unpivoted entry to be returned. Not modified. */ /* J - INTEGER */ /* Column of unpivoted entry to be returned. Not modified. */ /* ISUB - INTEGER */ /* Row of pivoted entry to be returned. Changed on exit. */ /* JSUB - INTEGER */ /* Column of pivoted entry to be returned. Changed on exit. */ /* KL - INTEGER */ /* Lower bandwidth. Not modified. */ /* KU - INTEGER */ /* Upper bandwidth. Not modified. */ /* IDIST - INTEGER */ /* On entry, IDIST specifies the type of distribution to be */ /* used to generate a random matrix . */ /* 1 => real and imaginary parts each UNIFORM( 0, 1 ) */ /* 2 => real and imaginary parts each UNIFORM( -1, 1 ) */ /* 3 => real and imaginary parts each NORMAL( 0, 1 ) */ /* 4 => complex number uniform in DISK( 0 , 1 ) */ /* Not modified. */ /* ISEED - INTEGER array of dimension ( 4 ) */ /* Seed for random number generator. */ /* Changed on exit. */ /* D - COMPLEX array of dimension ( MIN( I , J ) ) */ /* Diagonal entries of matrix. Not modified. */ /* IGRADE - INTEGER */ /* Specifies grading of matrix as follows: */ /* 0 => no grading */ /* 1 => matrix premultiplied by diag( DL ) */ /* 2 => matrix postmultiplied by diag( DR ) */ /* 3 => matrix premultiplied by diag( DL ) and */ /* postmultiplied by diag( DR ) */ /* 4 => matrix premultiplied by diag( DL ) and */ /* postmultiplied by inv( diag( DL ) ) */ /* 5 => matrix premultiplied by diag( DL ) and */ /* postmultiplied by diag( CONJG(DL) ) */ /* 6 => matrix premultiplied by diag( DL ) and */ /* postmultiplied by diag( DL ) */ /* Not modified. */ /* DL - COMPLEX array ( I or J, as appropriate ) */ /* Left scale factors for grading matrix. Not modified. */ /* DR - COMPLEX array ( I or J, as appropriate ) */ /* Right scale factors for grading matrix. Not modified. */ /* IPVTNG - INTEGER */ /* On entry specifies pivoting permutations as follows: */ /* 0 => none. */ /* 1 => row pivoting. */ /* 2 => column pivoting. */ /* 3 => full pivoting, i.e., on both sides. */ /* Not modified. */ /* IWORK - INTEGER array ( I or J, as appropriate ) */ /* This array specifies the permutation used. The */ /* row (or column) originally in position K is in */ /* position IWORK( K ) after pivoting. */ /* This differs from IWORK for CLATM2. Not modified. */ /* SPARSE - REAL between 0. and 1. */ /* On entry specifies the sparsity of the matrix */ /* if sparse matix is to be generated. */ /* SPARSE should lie between 0 and 1. */ /* A uniform ( 0, 1 ) random number x is generated and */ /* compared to SPARSE; if x is larger the matrix entry */ /* is unchanged and if x is smaller the entry is set */ /* to zero. Thus on the average a fraction SPARSE of the */ /* entries will be set to zero. */ /* Not modified. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* ----------------------------------------------------------------------- */ /* .. Executable Statements .. */ /* Check for I and J in range */ /* Parameter adjustments */ --iwork; --dr; --dl; --d__; --iseed; /* Function Body */ if (*i__ < 1 || *i__ > *m || *j < 1 || *j > *n) { *isub = *i__; *jsub = *j; ret_val->r = 0.f, ret_val->i = 0.f; return ; } /* Compute subscripts depending on IPVTNG */ if (*ipvtng == 0) { *isub = *i__; *jsub = *j; } else if (*ipvtng == 1) { *isub = iwork[*i__]; *jsub = *j; } else if (*ipvtng == 2) { *isub = *i__; *jsub = iwork[*j]; } else if (*ipvtng == 3) { *isub = iwork[*i__]; *jsub = iwork[*j]; } /* Check for banding */ if (*jsub > *isub + *ku || *jsub < *isub - *kl) { ret_val->r = 0.f, ret_val->i = 0.f; return ; } /* Check for sparsity */ if (*sparse > 0.f) { if (slaran_(&iseed[1]) < *sparse) { ret_val->r = 0.f, ret_val->i = 0.f; return ; } } /* Compute entry and grade it according to IGRADE */ if (*i__ == *j) { i__1 = *i__; ctemp.r = d__[i__1].r, ctemp.i = d__[i__1].i; } else { clarnd_(&q__1, idist, &iseed[1]); ctemp.r = q__1.r, ctemp.i = q__1.i; } if (*igrade == 1) { i__1 = *i__; q__1.r = ctemp.r * dl[i__1].r - ctemp.i * dl[i__1].i, q__1.i = ctemp.r * dl[i__1].i + ctemp.i * dl[i__1].r; ctemp.r = q__1.r, ctemp.i = q__1.i; } else if (*igrade == 2) { i__1 = *j; q__1.r = ctemp.r * dr[i__1].r - ctemp.i * dr[i__1].i, q__1.i = ctemp.r * dr[i__1].i + ctemp.i * dr[i__1].r; ctemp.r = q__1.r, ctemp.i = q__1.i; } else if (*igrade == 3) { i__1 = *i__; q__2.r = ctemp.r * dl[i__1].r - ctemp.i * dl[i__1].i, q__2.i = ctemp.r * dl[i__1].i + ctemp.i * dl[i__1].r; i__2 = *j; q__1.r = q__2.r * dr[i__2].r - q__2.i * dr[i__2].i, q__1.i = q__2.r * dr[i__2].i + q__2.i * dr[i__2].r; ctemp.r = q__1.r, ctemp.i = q__1.i; } else if (*igrade == 4 && *i__ != *j) { i__1 = *i__; q__2.r = ctemp.r * dl[i__1].r - ctemp.i * dl[i__1].i, q__2.i = ctemp.r * dl[i__1].i + ctemp.i * dl[i__1].r; c_div(&q__1, &q__2, &dl[*j]); ctemp.r = q__1.r, ctemp.i = q__1.i; } else if (*igrade == 5) { i__1 = *i__; q__2.r = ctemp.r * dl[i__1].r - ctemp.i * dl[i__1].i, q__2.i = ctemp.r * dl[i__1].i + ctemp.i * dl[i__1].r; r_cnjg(&q__3, &dl[*j]); q__1.r = q__2.r * q__3.r - q__2.i * q__3.i, q__1.i = q__2.r * q__3.i + q__2.i * q__3.r; ctemp.r = q__1.r, ctemp.i = q__1.i; } else if (*igrade == 6) { i__1 = *i__; q__2.r = ctemp.r * dl[i__1].r - ctemp.i * dl[i__1].i, q__2.i = ctemp.r * dl[i__1].i + ctemp.i * dl[i__1].r; i__2 = *j; q__1.r = q__2.r * dl[i__2].r - q__2.i * dl[i__2].i, q__1.i = q__2.r * dl[i__2].i + q__2.i * dl[i__2].r; ctemp.r = q__1.r, ctemp.i = q__1.i; } ret_val->r = ctemp.r, ret_val->i = ctemp.i; return ; /* End of CLATM3 */ } /* clatm3_ */
/* Complex */ VOID clatm3_(complex * ret_val, integer *m, integer *n, integer *i, integer *j, integer *isub, integer *jsub, integer *kl, integer * ku, integer *idist, integer *iseed, complex *d, integer *igrade, complex *dl, complex *dr, integer *ipvtng, integer *iwork, real * sparse) { /* System generated locals */ integer i__1, i__2; complex q__1, q__2, q__3; /* Builtin functions */ void c_div(complex *, complex *, complex *), r_cnjg(complex *, complex *); /* Local variables */ static complex ctemp; extern /* Complex */ VOID clarnd_(complex *, integer *, integer *); extern doublereal slaran_(integer *); /* -- LAPACK auxiliary test routine (version 2.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University February 29, 1992 Purpose ======= CLATM3 returns the (ISUB,JSUB) entry of a random matrix of dimension (M, N) described by the other paramters. (ISUB,JSUB) is the final position of the (I,J) entry after pivoting according to IPVTNG and IWORK. CLATM3 is called by the CLATMR routine in order to build random test matrices. No error checking on parameters is done, because this routine is called in a tight loop by CLATMR which has already checked the parameters. Use of CLATM3 differs from CLATM2 in the order in which the random number generator is called to fill in random matrix entries. With CLATM2, the generator is called to fill in the pivoted matrix columnwise. With CLATM3, the generator is called to fill in the matrix columnwise, after which it is pivoted. Thus, CLATM3 can be used to construct random matrices which differ only in their order of rows and/or columns. CLATM2 is used to construct band matrices while avoiding calling the random number generator for entries outside the band (and therefore generating random numbers in different orders for different pivot orders). The matrix whose (ISUB,JSUB) entry is returned is constructed as follows (this routine only computes one entry): If ISUB is outside (1..M) or JSUB is outside (1..N), return zero (this is convenient for generating matrices in band format). Generate a matrix A with random entries of distribution IDIST. Set the diagonal to D. Grade the matrix, if desired, from the left (by DL) and/or from the right (by DR or DL) as specified by IGRADE. Permute, if desired, the rows and/or columns as specified by IPVTNG and IWORK. Band the matrix to have lower bandwidth KL and upper bandwidth KU. Set random entries to zero as specified by SPARSE. Arguments ========= M - INTEGER Number of rows of matrix. Not modified. N - INTEGER Number of columns of matrix. Not modified. I - INTEGER Row of unpivoted entry to be returned. Not modified. J - INTEGER Column of unpivoted entry to be returned. Not modified. ISUB - INTEGER Row of pivoted entry to be returned. Changed on exit. JSUB - INTEGER Column of pivoted entry to be returned. Changed on exit. KL - INTEGER Lower bandwidth. Not modified. KU - INTEGER Upper bandwidth. Not modified. IDIST - INTEGER On entry, IDIST specifies the type of distribution to be used to generate a random matrix . 1 => real and imaginary parts each UNIFORM( 0, 1 ) 2 => real and imaginary parts each UNIFORM( -1, 1 ) 3 => real and imaginary parts each NORMAL( 0, 1 ) 4 => complex number uniform in DISK( 0 , 1 ) Not modified. ISEED - INTEGER array of dimension ( 4 ) Seed for random number generator. Changed on exit. D - COMPLEX array of dimension ( MIN( I , J ) ) Diagonal entries of matrix. Not modified. IGRADE - INTEGER Specifies grading of matrix as follows: 0 => no grading 1 => matrix premultiplied by diag( DL ) 2 => matrix postmultiplied by diag( DR ) 3 => matrix premultiplied by diag( DL ) and postmultiplied by diag( DR ) 4 => matrix premultiplied by diag( DL ) and postmultiplied by inv( diag( DL ) ) 5 => matrix premultiplied by diag( DL ) and postmultiplied by diag( CONJG(DL) ) 6 => matrix premultiplied by diag( DL ) and postmultiplied by diag( DL ) Not modified. DL - COMPLEX array ( I or J, as appropriate ) Left scale factors for grading matrix. Not modified. DR - COMPLEX array ( I or J, as appropriate ) Right scale factors for grading matrix. Not modified. IPVTNG - INTEGER On entry specifies pivoting permutations as follows: 0 => none. 1 => row pivoting. 2 => column pivoting. 3 => full pivoting, i.e., on both sides. Not modified. IWORK - INTEGER array ( I or J, as appropriate ) This array specifies the permutation used. The row (or column) originally in position K is in position IWORK( K ) after pivoting. This differs from IWORK for CLATM2. Not modified. SPARSE - REAL between 0. and 1. On entry specifies the sparsity of the matrix if sparse matix is to be generated. SPARSE should lie between 0 and 1. A uniform ( 0, 1 ) random number x is generated and compared to SPARSE; if x is larger the matrix entry is unchanged and if x is smaller the entry is set to zero. Thus on the average a fraction SPARSE of the entries will be set to zero. Not modified. ===================================================================== ----------------------------------------------------------------------- Check for I and J in range Parameter adjustments */ --iwork; --dr; --dl; --d; --iseed; /* Function Body */ if (*i < 1 || *i > *m || *j < 1 || *j > *n) { *isub = *i; *jsub = *j; ret_val->r = 0.f, ret_val->i = 0.f; return ; } /* Compute subscripts depending on IPVTNG */ if (*ipvtng == 0) { *isub = *i; *jsub = *j; } else if (*ipvtng == 1) { *isub = iwork[*i]; *jsub = *j; } else if (*ipvtng == 2) { *isub = *i; *jsub = iwork[*j]; } else if (*ipvtng == 3) { *isub = iwork[*i]; *jsub = iwork[*j]; } /* Check for banding */ if (*jsub > *isub + *ku || *jsub < *isub - *kl) { ret_val->r = 0.f, ret_val->i = 0.f; return ; } /* Check for sparsity */ if (*sparse > 0.f) { if (slaran_(&iseed[1]) < *sparse) { ret_val->r = 0.f, ret_val->i = 0.f; return ; } } /* Compute entry and grade it according to IGRADE */ if (*i == *j) { i__1 = *i; ctemp.r = d[i__1].r, ctemp.i = d[i__1].i; } else { clarnd_(&q__1, idist, &iseed[1]); ctemp.r = q__1.r, ctemp.i = q__1.i; } if (*igrade == 1) { i__1 = *i; q__1.r = ctemp.r * dl[i__1].r - ctemp.i * dl[i__1].i, q__1.i = ctemp.r * dl[i__1].i + ctemp.i * dl[i__1].r; ctemp.r = q__1.r, ctemp.i = q__1.i; } else if (*igrade == 2) { i__1 = *j; q__1.r = ctemp.r * dr[i__1].r - ctemp.i * dr[i__1].i, q__1.i = ctemp.r * dr[i__1].i + ctemp.i * dr[i__1].r; ctemp.r = q__1.r, ctemp.i = q__1.i; } else if (*igrade == 3) { i__1 = *i; q__2.r = ctemp.r * dl[i__1].r - ctemp.i * dl[i__1].i, q__2.i = ctemp.r * dl[i__1].i + ctemp.i * dl[i__1].r; i__2 = *j; q__1.r = q__2.r * dr[i__2].r - q__2.i * dr[i__2].i, q__1.i = q__2.r * dr[i__2].i + q__2.i * dr[i__2].r; ctemp.r = q__1.r, ctemp.i = q__1.i; } else if (*igrade == 4 && *i != *j) { i__1 = *i; q__2.r = ctemp.r * dl[i__1].r - ctemp.i * dl[i__1].i, q__2.i = ctemp.r * dl[i__1].i + ctemp.i * dl[i__1].r; c_div(&q__1, &q__2, &dl[*j]); ctemp.r = q__1.r, ctemp.i = q__1.i; } else if (*igrade == 5) { i__1 = *i; q__2.r = ctemp.r * dl[i__1].r - ctemp.i * dl[i__1].i, q__2.i = ctemp.r * dl[i__1].i + ctemp.i * dl[i__1].r; r_cnjg(&q__3, &dl[*j]); q__1.r = q__2.r * q__3.r - q__2.i * q__3.i, q__1.i = q__2.r * q__3.i + q__2.i * q__3.r; ctemp.r = q__1.r, ctemp.i = q__1.i; } else if (*igrade == 6) { i__1 = *i; q__2.r = ctemp.r * dl[i__1].r - ctemp.i * dl[i__1].i, q__2.i = ctemp.r * dl[i__1].i + ctemp.i * dl[i__1].r; i__2 = *j; q__1.r = q__2.r * dl[i__2].r - q__2.i * dl[i__2].i, q__1.i = q__2.r * dl[i__2].i + q__2.i * dl[i__2].r; ctemp.r = q__1.r, ctemp.i = q__1.i; } ret_val->r = ctemp.r, ret_val->i = ctemp.i; return ; /* End of CLATM3 */ } /* clatm3_ */