⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ilaenv.c

📁 DTMK软件开发包,此为开源软件,是一款很好的医学图像开发资源.
💻 C
📖 第 1 页 / 共 3 页
字号:
/* 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 + -