📄 ilaenv.c
字号:
/* lapack/util/ilaenv.f -- translated by f2c (version 20050501).
You must link the resulting object file with libf2c:
on Microsoft Windows system, link with libf2c.lib;
on Linux or Unix systems, link with .../path/to/libf2c.a -lm
or, if you install libf2c.a in a standard place, with -lf2c -lm
-- in that order, at the end of the command line, as in
cc *.o -lf2c -lm
Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
http://www.netlib.org/f2c/libf2c.zip
*/
#ifdef __cplusplus
extern "C" {
#endif
#include "v3p_netlib.h"
/* Table of constant values */
static integer c__0 = 0;
static real c_b162 = (float)0.;
static real c_b163 = (float)1.;
static integer c__1 = 1;
/*< >*/
integer ilaenv_(integer *ispec, char *name__, char *opts, integer *n1,
integer *n2, integer *n3, integer *n4, ftnlen name_len, ftnlen
opts_len)
{
/* System generated locals */
integer ret_val;
/* Builtin functions */
/* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen);
integer s_cmp(char *, char *, ftnlen, ftnlen);
/* Local variables */
integer i__;
char c1[1], c2[2], c3[3], c4[2];
integer ic, nb, iz, nx;
logical cname, sname;
integer nbmin;
extern integer ieeeck_(integer *, real *, real *);
char subnam[6];
(void)opts;
(void)n3;
(void)opts_len;
/* -- LAPACK auxiliary routine (version 3.0) -- */
/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */
/* Courant Institute, Argonne National Lab, and Rice University */
/* June 30, 1999 */
/* .. Scalar Arguments .. */
/*< CHARACTER*( * ) NAME, OPTS >*/
/*< INTEGER ISPEC, N1, N2, N3, N4 >*/
/* .. */
/* Purpose */
/* ======= */
/* ILAENV is called from the LAPACK routines to choose problem-dependent */
/* parameters for the local environment. See ISPEC for a description of */
/* the parameters. */
/* This version provides a set of parameters which should give good, */
/* but not optimal, performance on many of the currently available */
/* computers. Users are encouraged to modify this subroutine to set */
/* the tuning parameters for their particular machine using the option */
/* and problem size information in the arguments. */
/* This routine will not function correctly if it is converted to all */
/* lower case. Converting it to all upper case is allowed. */
/* Arguments */
/* ========= */
/* ISPEC (input) INTEGER */
/* Specifies the parameter to be returned as the value of */
/* ILAENV. */
/* = 1: the optimal blocksize; if this value is 1, an unblocked */
/* algorithm will give the best performance. */
/* = 2: the minimum block size for which the block routine */
/* should be used; if the usable block size is less than */
/* this value, an unblocked routine should be used. */
/* = 3: the crossover point (in a block routine, for N less */
/* than this value, an unblocked routine should be used) */
/* = 4: the number of shifts, used in the nonsymmetric */
/* eigenvalue routines */
/* = 5: the minimum column dimension for blocking to be used; */
/* rectangular blocks must have dimension at least k by m, */
/* where k is given by ILAENV(2,...) and m by ILAENV(5,...) */
/* = 6: the crossover point for the SVD (when reducing an m by n */
/* matrix to bidiagonal form, if max(m,n)/min(m,n) exceeds */
/* this value, a QR factorization is used first to reduce */
/* the matrix to a triangular form.) */
/* = 7: the number of processors */
/* = 8: the crossover point for the multishift QR and QZ methods */
/* for nonsymmetric eigenvalue problems. */
/* = 9: maximum size of the subproblems at the bottom of the */
/* computation tree in the divide-and-conquer algorithm */
/* (used by xGELSD and xGESDD) */
/* =10: ieee NaN arithmetic can be trusted not to trap */
/* =11: infinity arithmetic can be trusted not to trap */
/* NAME (input) CHARACTER*(*) */
/* The name of the calling subroutine, in either upper case or */
/* lower case. */
/* OPTS (input) CHARACTER*(*) */
/* The character options to the subroutine NAME, concatenated */
/* into a single character string. For example, UPLO = 'U', */
/* TRANS = 'T', and DIAG = 'N' for a triangular routine would */
/* be specified as OPTS = 'UTN'. */
/* N1 (input) INTEGER */
/* N2 (input) INTEGER */
/* N3 (input) INTEGER */
/* N4 (input) INTEGER */
/* Problem dimensions for the subroutine NAME; these may not all */
/* be required. */
/* (ILAENV) (output) INTEGER */
/* >= 0: the value of the parameter specified by ISPEC */
/* < 0: if ILAENV = -k, the k-th argument had an illegal value. */
/* Further Details */
/* =============== */
/* The following conventions have been used when calling ILAENV from the */
/* LAPACK routines: */
/* 1) OPTS is a concatenation of all of the character options to */
/* subroutine NAME, in the same order that they appear in the */
/* argument list for NAME, even if they are not used in determining */
/* the value of the parameter specified by ISPEC. */
/* 2) The problem dimensions N1, N2, N3, N4 are specified in the order */
/* that they appear in the argument list for NAME. N1 is used */
/* first, N2 second, and so on, and unused problem dimensions are */
/* passed a value of -1. */
/* 3) The parameter value returned by ILAENV is checked for validity in */
/* the calling subroutine. For example, ILAENV is used to retrieve */
/* the optimal blocksize for STRTRI as follows: */
/* NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 ) */
/* IF( NB.LE.1 ) NB = MAX( 1, N ) */
/* ===================================================================== */
/* .. Local Scalars .. */
/*< LOGICAL CNAME, SNAME >*/
/*< CHARACTER*1 C1 >*/
/*< CHARACTER*2 C2, C4 >*/
/*< CHARACTER*3 C3 >*/
/*< CHARACTER*6 SUBNAM >*/
/*< INTEGER I, IC, IZ, NB, NBMIN, NX >*/
/* .. */
/* .. Intrinsic Functions .. */
/*< INTRINSIC CHAR, ICHAR, INT, MIN, REAL >*/
/* .. */
/* .. External Functions .. */
/*< INTEGER IEEECK >*/
/*< EXTERNAL IEEECK >*/
/* .. */
/* .. Executable Statements .. */
/*< >*/
switch (*ispec) {
case 1: goto L100;
case 2: goto L100;
case 3: goto L100;
case 4: goto L400;
case 5: goto L500;
case 6: goto L600;
case 7: goto L700;
case 8: goto L800;
case 9: goto L900;
case 10: goto L1000;
case 11: goto L1100;
}
/* Invalid value for ISPEC */
/*< ILAENV = -1 >*/
ret_val = -1;
/*< RETURN >*/
return ret_val;
/*< 100 CONTINUE >*/
L100:
/* Convert NAME to upper case if the first character is lower case. */
/*< ILAENV = 1 >*/
ret_val = 1;
/*< SUBNAM = NAME >*/
s_copy(subnam, name__, (ftnlen)6, name_len);
/*< IC = ICHAR( SUBNAM( 1:1 ) ) >*/
ic = *(unsigned char *)subnam;
/*< IZ = ICHAR( 'Z' ) >*/
iz = 'Z';
/*< IF( IZ.EQ.90 .OR. IZ.EQ.122 ) THEN >*/
if (iz == 90 || iz == 122) {
/* ASCII character set */
/*< IF( IC.GE.97 .AND. IC.LE.122 ) THEN >*/
if (ic >= 97 && ic <= 122) {
/*< SUBNAM( 1:1 ) = CHAR( IC-32 ) >*/
*(unsigned char *)subnam = (char) (ic - 32);
/*< DO 10 I = 2, 6 >*/
for (i__ = 2; i__ <= 6; ++i__) {
/*< IC = ICHAR( SUBNAM( I:I ) ) >*/
ic = *(unsigned char *)&subnam[i__ - 1];
/*< >*/
if (ic >= 97 && ic <= 122) {
*(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32);
}
/*< 10 CONTINUE >*/
/* L10: */
}
/*< END IF >*/
}
/*< ELSE IF( IZ.EQ.233 .OR. IZ.EQ.169 ) THEN >*/
} else if (iz == 233 || iz == 169) {
/* EBCDIC character set */
/*< >*/
if ((ic >= 129 && ic <= 137) || (ic >= 145 && ic <= 153) || (ic >= 162 &&
ic <= 169)) {
/*< SUBNAM( 1:1 ) = CHAR( IC+64 ) >*/
*(unsigned char *)subnam = (char) (ic + 64);
/*< DO 20 I = 2, 6 >*/
for (i__ = 2; i__ <= 6; ++i__) {
/*< IC = ICHAR( SUBNAM( I:I ) ) >*/
ic = *(unsigned char *)&subnam[i__ - 1];
/*< >*/
if ((ic >= 129 && ic <= 137) || (ic >= 145 && ic <= 153) || (ic >=
162 && ic <= 169)) {
*(unsigned char *)&subnam[i__ - 1] = (char) (ic + 64);
}
/*< 20 CONTINUE >*/
/* L20: */
}
/*< END IF >*/
}
/*< ELSE IF( IZ.EQ.218 .OR. IZ.EQ.250 ) THEN >*/
} else if (iz == 218 || iz == 250) {
/* Prime machines: ASCII+128 */
/*< IF( IC.GE.225 .AND. IC.LE.250 ) THEN >*/
if (ic >= 225 && ic <= 250) {
/*< SUBNAM( 1:1 ) = CHAR( IC-32 ) >*/
*(unsigned char *)subnam = (char) (ic - 32);
/*< DO 30 I = 2, 6 >*/
for (i__ = 2; i__ <= 6; ++i__) {
/*< IC = ICHAR( SUBNAM( I:I ) ) >*/
ic = *(unsigned char *)&subnam[i__ - 1];
/*< >*/
if (ic >= 225 && ic <= 250) {
*(unsigned char *)&subnam[i__ - 1] = (char) (ic - 32);
}
/*< 30 CONTINUE >*/
/* L30: */
}
/*< END IF >*/
}
/*< END IF >*/
}
/*< C1 = SUBNAM( 1:1 ) >*/
*(unsigned char *)c1 = *(unsigned char *)subnam;
/*< SNAME = C1.EQ.'S' .OR. C1.EQ.'D' >*/
sname = *(unsigned char *)c1 == 'S' || *(unsigned char *)c1 == 'D';
/*< CNAME = C1.EQ.'C' .OR. C1.EQ.'Z' >*/
cname = *(unsigned char *)c1 == 'C' || *(unsigned char *)c1 == 'Z';
/*< >*/
if (! (cname || sname)) {
return ret_val;
}
/*< C2 = SUBNAM( 2:3 ) >*/
s_copy(c2, subnam + 1, (ftnlen)2, (ftnlen)2);
/*< C3 = SUBNAM( 4:6 ) >*/
s_copy(c3, subnam + 3, (ftnlen)3, (ftnlen)3);
/*< C4 = C3( 2:3 ) >*/
s_copy(c4, c3 + 1, (ftnlen)2, (ftnlen)2);
/*< GO TO ( 110, 200, 300 ) ISPEC >*/
switch (*ispec) {
case 1: goto L110;
case 2: goto L200;
case 3: goto L300;
}
/*< 110 CONTINUE >*/
L110:
/* ISPEC = 1: block size */
/* In these examples, separate code is provided for setting NB for */
/* real and complex. We assume that NB will take the same value in */
/* single or double precision. */
/*< NB = 1 >*/
nb = 1;
/*< IF( C2.EQ.'GE' ) THEN >*/
if (s_cmp(c2, "GE", (ftnlen)2, (ftnlen)2) == 0) {
/*< IF( C3.EQ.'TRF' ) THEN >*/
if (s_cmp(c3, "TRF", (ftnlen)3, (ftnlen)3) == 0) {
/*< IF( SNAME ) THEN >*/
if (sname) {
/*< NB = 64 >*/
nb = 64;
/*< ELSE >*/
} else {
/*< NB = 64 >*/
nb = 64;
/*< END IF >*/
}
/*< >*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -