*DECK INVIT SUBROUTINE INVIT (NM, N, A, WR, WI, SELECT, MM, M, Z, IERR, RM1, + RV1, RV2) C***BEGIN PROLOGUE INVIT C***PURPOSE Compute the eigenvectors of a real upper Hessenberg C matrix associated with specified eigenvalues by inverse C iteration. C***LIBRARY SLATEC (EISPACK) C***CATEGORY D4C2B C***TYPE SINGLE PRECISION (INVIT-S, CINVIT-C) C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK C***AUTHOR Smith, B. T., et al. C***DESCRIPTION C C This subroutine is a translation of the ALGOL procedure INVIT C by Peters and Wilkinson. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971). C C This subroutine finds those eigenvectors of a REAL UPPER C Hessenberg matrix corresponding to specified eigenvalues, C using inverse iteration. C C On INPUT C C NM must be set to the row dimension of the two-dimensional C array parameters, A and Z, as declared in the calling C program dimension statement. NM is an INTEGER variable. C C N is the order of the matrix A. N is an INTEGER variable. C N must be less than or equal to NM. C C A contains the upper Hessenberg matrix. A is a two-dimensional C REAL array, dimensioned A(NM,N). C C WR and WI contain the real and imaginary parts, respectively, C of the eigenvalues of the Hessenberg matrix. The eigenvalues C must be stored in a manner identical to that output by C subroutine HQR, which recognizes possible splitting of the C matrix. WR and WI are one-dimensional REAL arrays, C dimensioned WR(N) and WI(N). C C SELECT specifies the eigenvectors to be found. The C eigenvector corresponding to the J-th eigenvalue is C specified by setting SELECT(J) to .TRUE. SELECT is a C one-dimensional LOGICAL array, dimensioned SELECT(N). C C MM should be set to an upper bound for the number of C columns required to store the eigenvectors to be found. C NOTE that two columns are required to store the C eigenvector corresponding to a complex eigenvalue. One C column is required to store the eigenvector corresponding C to a real eigenvalue. MM is an INTEGER variable. C C On OUTPUT C C A and WI are unaltered. C C WR may have been altered since close eigenvalues are perturbed C slightly in searching for independent eigenvectors. C C SELECT may have been altered. If the elements corresponding C to a pair of conjugate complex eigenvalues were each C initially set to .TRUE., the program resets the second of C the two elements to .FALSE. C C M is the number of columns actually used to store the C eigenvectors. M is an INTEGER variable. C C Z contains the real and imaginary parts of the eigenvectors. C The eigenvectors are packed into the columns of Z starting C at the first column. If the next selected eigenvalue is C real, the next column of Z contains its eigenvector. If the C eigenvalue is complex, the next two columns of Z contain the C real and imaginary parts of its eigenvector, with the real C part first. The eigenvectors are normalized so that the C component of largest magnitude is 1. Any vector which fails C the acceptance test is set to zero. Z is a two-dimensional C REAL array, dimensioned Z(NM,MM). C C IERR is an INTEGER flag set to C Zero for normal return, C -(2*N+1) if more than MM columns of Z are necessary C to store the eigenvectors corresponding to C the specified eigenvalues (in this case, M is C equal to the number of columns of Z containing C eigenvectors already computed), C -K if the iteration corresponding to the K-th C value fails (if this occurs more than once, K C is the index of the last occurrence); the C corresponding columns of Z are set to zero C vectors, C -(N+K) if both error situations occur. C C RM1 is a two-dimensional REAL array used for temporary storage. C This array holds the triangularized form of the upper C Hessenberg matrix used in the inverse iteration process. C RM1 is dimensioned RM1(N,N). C C RV1 and RV2 are one-dimensional REAL arrays used for temporary C storage. They hold the approximate eigenvectors during the C inverse iteration process. RV1 and RV2 are dimensioned C RV1(N) and RV2(N). C C The ALGOL procedure GUESSVEC appears in INVIT in-line. C C Calls PYTHAG(A,B) for sqrt(A**2 + B**2). C Calls CDIV for complex division. C C Questions and comments should be directed to B. S. Garbow, C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY C ------------------------------------------------------------------ C C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow, C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen- C system Routines - EISPACK Guide, Springer-Verlag, C 1976. C***ROUTINES CALLED CDIV, PYTHAG C***REVISION HISTORY (YYMMDD) C 760101 DATE WRITTEN C 890531 Changed all specific intrinsics to generic. (WRB) C 890831 Modified array declarations. (WRB) C 890831 REVISION DATE from Version 3.2 C 891214 Prologue converted to Version 4.0 format. (BAB) C 920501 Reformatted the REFERENCES section. (WRB) C***END PROLOGUE INVIT