zgeev.c

来自「InsightToolkit-1.4.0(有大量的优化算法程序)」· C语言 代码 · 共 399 行 · 第 1/2 页

C
399
字号
#include "f2c.h"
#include "netlib.h"
extern double sqrt(double); /* #include <math.h> */

/* Modified by Peter Vanroose, June 2001: manual optimisation and clean-up */

/* Table of constant values */
static integer c__1 = 1;
static integer c__0 = 0;
static integer c__8 = 8;
static integer c_n1 = -1;
static integer c__4 = 4;

/* Subroutine */ void zgeev_(jobvl, jobvr, n, a, lda, w, vl, ldvl, vr, ldvr, work, lwork, rwork, info)
const char *jobvl, *jobvr;
const integer *n;
doublecomplex *a;
const integer *lda;
doublecomplex *w, *vl;
const integer *ldvl;
doublecomplex *vr;
const integer *ldvr;
doublecomplex *work;
integer *lwork;
doublereal *rwork;
integer *info;
{
    /* System generated locals */
    integer i__1, i__2;
    doublereal d__1;

    /* Local variables */
    static integer ibal;
    static char side[1];
    static integer maxb;
    static doublereal anrm;
    static integer ierr, itau, iwrk, nout, i, k;
    static logical scalea;
    static doublereal cscale;
    static logical select[1];
    static doublereal bignum;
    static integer minwrk, maxwrk;
    static logical wantvl;
    static doublereal smlnum;
    static integer hswork, irwork;
    static logical wantvr;
    static integer ihi;
    static doublereal scl;
    static integer ilo;
    static doublereal dum[1], eps;
    static doublecomplex tmp;


/*  -- LAPACK driver 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                                                               */
/*  =======                                                               */
/*                                                                        */
/*  ZGEEV computes for an N-by-N complex nonsymmetric matrix A, the       */
/*  eigenvalues and, optionally, the left and/or right eigenvectors.      */
/*                                                                        */
/*  The right eigenvector v(j) of A satisfies                             */
/*                   A * v(j) = lambda(j) * v(j)                          */
/*  where lambda(j) is its eigenvalue.                                    */
/*  The left eigenvector u(j) of A satisfies                              */
/*                u(j)**H * A = lambda(j) * u(j)**H                       */
/*  where u(j)**H denotes the conjugate transpose of u(j).                */
/*                                                                        */
/*  The computed eigenvectors are normalized to have Euclidean norm       */
/*  equal to 1 and largest component real.                                */
/*                                                                        */
/*  Arguments                                                             */
/*  =========                                                             */
/*                                                                        */
/*  JOBVL   (input) CHARACTER*1                                           */
/*          = 'N': left eigenvectors of A are not computed;               */
/*          = 'V': left eigenvectors of are computed.                     */
/*                                                                        */
/*  JOBVR   (input) CHARACTER*1                                           */
/*          = 'N': right eigenvectors of A are not computed;              */
/*          = 'V': right eigenvectors of A are computed.                  */
/*                                                                        */
/*  N       (input) INTEGER                                               */
/*          The order of the matrix A. N >= 0.                            */
/*                                                                        */
/*  A       (input/output) COMPLEX*16 array, dimension (LDA,N)            */
/*          On entry, the N-by-N matrix A.                                */
/*          On exit, A has been overwritten.                              */
/*                                                                        */
/*  LDA     (input) INTEGER                                               */
/*          The leading dimension of the array A.  LDA >= max(1,N).       */
/*                                                                        */
/*  W       (output) COMPLEX*16 array, dimension (N)                      */
/*          W contains the computed eigenvalues.                          */
/*                                                                        */
/*  VL      (output) COMPLEX*16 array, dimension (LDVL,N)                 */
/*          If JOBVL = 'V', the left eigenvectors u(j) are stored one     */
/*          after another in the columns of VL, in the same order         */
/*          as their eigenvalues.                                         */
/*          If JOBVL = 'N', VL is not referenced.                         */
/*          u(j) = VL(:,j), the j-th column of VL.                        */
/*                                                                        */
/*  LDVL    (input) INTEGER                                               */
/*          The leading dimension of the array VL.  LDVL >= 1; if         */
/*          JOBVL = 'V', LDVL >= N.                                       */
/*                                                                        */
/*  VR      (output) COMPLEX*16 array, dimension (LDVR,N)                 */
/*          If JOBVR = 'V', the right eigenvectors v(j) are stored one    */
/*          after another in the columns of VR, in the same order         */
/*          as their eigenvalues.                                         */
/*          If JOBVR = 'N', VR is not referenced.                         */
/*          v(j) = VR(:,j), the j-th column of VR.                        */
/*                                                                        */
/*  LDVR    (input) INTEGER                                               */
/*          The leading dimension of the array VR.  LDVR >= 1; if         */
/*          JOBVR = 'V', LDVR >= N.                                       */
/*                                                                        */
/*  WORK    (workspace/output) COMPLEX*16 array, dimension (LWORK)        */
/*          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.      */
/*                                                                        */
/*  LWORK   (input) INTEGER                                               */
/*          The dimension of the array WORK.  LWORK >= max(1,2*N).        */
/*          For good performance, LWORK must generally be larger.         */
/*                                                                        */
/*  RWORK   (workspace) DOUBLE PRECISION array, dimension (2*N)           */
/*                                                                        */
/*  INFO    (output) INTEGER                                              */
/*          = 0:  successful exit                                         */
/*          < 0:  if INFO = -i, the i-th argument had an illegal value.   */
/*          > 0:  if INFO = i, the QR algorithm failed to compute all the */
/*                eigenvalues, and no eigenvectors have been computed;    */
/*                elements and i+1:N of W contain eigenvalues which have  */
/*                converged.                                              */
/*                                                                        */
/*  ===================================================================== */

    *info = 0;
    wantvl = lsame_(jobvl, "V");
    wantvr = lsame_(jobvr, "V");
    if (! wantvl && ! lsame_(jobvl, "N")) {
        *info = -1;
    } else if (! wantvr && ! lsame_(jobvr, "N")) {
        *info = -2;
    } else if (*n < 0) {
        *info = -3;
    } else if (*lda < max(1,*n)) {
        *info = -5;
    } else if (*ldvl < 1 || (wantvl && *ldvl < *n)) {
        *info = -8;
    } else if (*ldvr < 1 || (wantvr && *ldvr < *n)) {
        *info = -10;
    }

/*     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. */
/*       CWorkspace refers to complex workspace, and RWorkspace to real */
/*       workspace. NB refers to the optimal block size for the */
/*       immediately following subroutine, as returned by ILAENV. */
/*       HSWORK refers to the workspace preferred by ZHSEQR, as */
/*       calculated below. HSWORK is computed assuming ILO=1 and IHI=N, */
/*       the worst case.) */

    minwrk = 1;
    if (*info == 0 && *lwork >= 1) {
        maxwrk = *n + *n * ilaenv_(&c__1, "ZGEHRD", " ", n, &c__1, n, &c__0);
        if (! wantvl && ! wantvr) {
            minwrk = max(1,(*n<<1));
            maxb = ilaenv_(&c__8, "ZHSEQR", "EN", n, &c__1, n, &c_n1);
            maxb = max(maxb,2);
            k = ilaenv_(&c__4, "ZHSEQR", "EN", n, &c__1, n, &c_n1);
            k = min(min(maxb,*n),max(2,k));
            hswork = max(k * (k + 2),(*n<<1));
            maxwrk = max(maxwrk,hswork);
        } else {
            minwrk = max(1,(*n<<1));
            i__1 = *n + (*n - 1) * ilaenv_(&c__1, "ZUNGHR", " ", n, &c__1, n, &c_n1);
            maxwrk = max(maxwrk,i__1);
            maxb = ilaenv_(&c__8, "ZHSEQR", "SV", n, &c__1, n, &c_n1);
            maxb = max(maxb,2);
            k = ilaenv_(&c__4, "ZHSEQR", "SV", n, &c__1, n, &c_n1);
            k = min(min(maxb,*n),max(2,k));
            hswork = max(k * (k + 2),(*n<<1));
            maxwrk = max(max(maxwrk,hswork),(*n<<1));
        }
        work[0].r = (doublereal) maxwrk, work[0].i = 0.;
    }
    if (*lwork < minwrk) {
        *info = -12;
    }
    if (*info != 0) {
        i__1 = -(*info);
        xerbla_("ZGEEV ", &i__1);
        return;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?