COMPLEX*16 or DOUBLE COMPLEX routines for upper Hessenberg matrix
zhsein
USAGE:
m, ifaill, ifailr, info, w, vl, vr = NumRu::Lapack.zhsein( side, eigsrc, initv, select, h, w, vl, vr, [:usage => usage, :help => help])
FORTRAN MANUAL
SUBROUTINE ZHSEIN( SIDE, EIGSRC, INITV, SELECT, N, H, LDH, W, VL, LDVL, VR, LDVR, MM, M, WORK, RWORK, IFAILL, IFAILR, INFO )
* Purpose
* =======
*
* ZHSEIN uses inverse iteration to find specified right and/or left
* eigenvectors of a complex upper Hessenberg matrix H.
*
* The right eigenvector x and the left eigenvector y of the matrix H
* corresponding to an eigenvalue w are defined by:
*
* H * x = w * x, y**h * H = w * y**h
*
* where y**h denotes the conjugate transpose of the vector y.
*
* Arguments
* =========
*
* SIDE (input) CHARACTER*1
* = 'R': compute right eigenvectors only;
* = 'L': compute left eigenvectors only;
* = 'B': compute both right and left eigenvectors.
*
* EIGSRC (input) CHARACTER*1
* Specifies the source of eigenvalues supplied in W:
* = 'Q': the eigenvalues were found using ZHSEQR; thus, if
* H has zero subdiagonal elements, and so is
* block-triangular, then the j-th eigenvalue can be
* assumed to be an eigenvalue of the block containing
* the j-th row/column. This property allows ZHSEIN to
* perform inverse iteration on just one diagonal block.
* = 'N': no assumptions are made on the correspondence
* between eigenvalues and diagonal blocks. In this
* case, ZHSEIN must always perform inverse iteration
* using the whole matrix H.
*
* INITV (input) CHARACTER*1
* = 'N': no initial vectors are supplied;
* = 'U': user-supplied initial vectors are stored in the arrays
* VL and/or VR.
*
* SELECT (input) LOGICAL array, dimension (N)
* Specifies the eigenvectors to be computed. To select the
* eigenvector corresponding to the eigenvalue W(j),
* SELECT(j) must be set to .TRUE..
*
* N (input) INTEGER
* The order of the matrix H. N >= 0.
*
* H (input) COMPLEX*16 array, dimension (LDH,N)
* The upper Hessenberg matrix H.
*
* LDH (input) INTEGER
* The leading dimension of the array H. LDH >= max(1,N).
*
* W (input/output) COMPLEX*16 array, dimension (N)
* On entry, the eigenvalues of H.
* On exit, the real parts of W may have been altered since
* close eigenvalues are perturbed slightly in searching for
* independent eigenvectors.
*
* VL (input/output) COMPLEX*16 array, dimension (LDVL,MM)
* On entry, if INITV = 'U' and SIDE = 'L' or 'B', VL must
* contain starting vectors for the inverse iteration for the
* left eigenvectors; the starting vector for each eigenvector
* must be in the same column in which the eigenvector will be
* stored.
* On exit, if SIDE = 'L' or 'B', the left eigenvectors
* specified by SELECT will be stored consecutively in the
* columns of VL, in the same order as their eigenvalues.
* If SIDE = 'R', VL is not referenced.
*
* LDVL (input) INTEGER
* The leading dimension of the array VL.
* LDVL >= max(1,N) if SIDE = 'L' or 'B'; LDVL >= 1 otherwise.
*
* VR (input/output) COMPLEX*16 array, dimension (LDVR,MM)
* On entry, if INITV = 'U' and SIDE = 'R' or 'B', VR must
* contain starting vectors for the inverse iteration for the
* right eigenvectors; the starting vector for each eigenvector
* must be in the same column in which the eigenvector will be
* stored.
* On exit, if SIDE = 'R' or 'B', the right eigenvectors
* specified by SELECT will be stored consecutively in the
* columns of VR, in the same order as their eigenvalues.
* If SIDE = 'L', VR is not referenced.
*
* LDVR (input) INTEGER
* The leading dimension of the array VR.
* LDVR >= max(1,N) if SIDE = 'R' or 'B'; LDVR >= 1 otherwise.
*
* MM (input) INTEGER
* The number of columns in the arrays VL and/or VR. MM >= M.
*
* M (output) INTEGER
* The number of columns in the arrays VL and/or VR required to
* store the eigenvectors (= the number of .TRUE. elements in
* SELECT).
*
* WORK (workspace) COMPLEX*16 array, dimension (N*N)
*
* RWORK (workspace) DOUBLE PRECISION array, dimension (N)
*
* IFAILL (output) INTEGER array, dimension (MM)
* If SIDE = 'L' or 'B', IFAILL(i) = j > 0 if the left
* eigenvector in the i-th column of VL (corresponding to the
* eigenvalue w(j)) failed to converge; IFAILL(i) = 0 if the
* eigenvector converged satisfactorily.
* If SIDE = 'R', IFAILL is not referenced.
*
* IFAILR (output) INTEGER array, dimension (MM)
* If SIDE = 'R' or 'B', IFAILR(i) = j > 0 if the right
* eigenvector in the i-th column of VR (corresponding to the
* eigenvalue w(j)) failed to converge; IFAILR(i) = 0 if the
* eigenvector converged satisfactorily.
* If SIDE = 'L', IFAILR is not referenced.
*
* INFO (output) INTEGER
* = 0: successful exit
* < 0: if INFO = -i, the i-th argument had an illegal value
* > 0: if INFO = i, i is the number of eigenvectors which
* failed to converge; see IFAILL and IFAILR for further
* details.
*
* Further Details
* ===============
*
* Each eigenvector is normalized so that the element of largest
* magnitude has magnitude 1; here the magnitude of a complex number
* (x,y) is taken to be |x|+|y|.
*
* =====================================================================
*
go to the page top
zhseqr
USAGE:
w, work, info, h, z = NumRu::Lapack.zhseqr( job, compz, ilo, ihi, h, z, ldz, [:lwork => lwork, :usage => usage, :help => help])
FORTRAN MANUAL
SUBROUTINE ZHSEQR( JOB, COMPZ, N, ILO, IHI, H, LDH, W, Z, LDZ, WORK, LWORK, INFO )
* Purpose
* =======
*
* ZHSEQR computes the eigenvalues of a Hessenberg matrix H
* and, optionally, the matrices T and Z from the Schur decomposition
* H = Z T Z**H, where T is an upper triangular matrix (the
* Schur form), and Z is the unitary matrix of Schur vectors.
*
* Optionally Z may be postmultiplied into an input unitary
* matrix Q so that this routine can give the Schur factorization
* of a matrix A which has been reduced to the Hessenberg form H
* by the unitary matrix Q: A = Q*H*Q**H = (QZ)*H*(QZ)**H.
*
* Arguments
* =========
*
* JOB (input) CHARACTER*1
* = 'E': compute eigenvalues only;
* = 'S': compute eigenvalues and the Schur form T.
*
* COMPZ (input) CHARACTER*1
* = 'N': no Schur vectors are computed;
* = 'I': Z is initialized to the unit matrix and the matrix Z
* of Schur vectors of H is returned;
* = 'V': Z must contain an unitary matrix Q on entry, and
* the product Q*Z is returned.
*
* N (input) INTEGER
* The order of the matrix H. N .GE. 0.
*
* ILO (input) INTEGER
* IHI (input) INTEGER
* It is assumed that H is already upper triangular in rows
* and columns 1:ILO-1 and IHI+1:N. ILO and IHI are normally
* set by a previous call to ZGEBAL, and then passed to ZGEHRD
* when the matrix output by ZGEBAL is reduced to Hessenberg
* form. Otherwise ILO and IHI should be set to 1 and N
* respectively. If N.GT.0, then 1.LE.ILO.LE.IHI.LE.N.
* If N = 0, then ILO = 1 and IHI = 0.
*
* H (input/output) COMPLEX*16 array, dimension (LDH,N)
* On entry, the upper Hessenberg matrix H.
* On exit, if INFO = 0 and JOB = 'S', H contains the upper
* triangular matrix T from the Schur decomposition (the
* Schur form). If INFO = 0 and JOB = 'E', the contents of
* H are unspecified on exit. (The output value of H when
* INFO.GT.0 is given under the description of INFO below.)
*
* Unlike earlier versions of ZHSEQR, this subroutine may
* explicitly H(i,j) = 0 for i.GT.j and j = 1, 2, ... ILO-1
* or j = IHI+1, IHI+2, ... N.
*
* LDH (input) INTEGER
* The leading dimension of the array H. LDH .GE. max(1,N).
*
* W (output) COMPLEX*16 array, dimension (N)
* The computed eigenvalues. If JOB = 'S', the eigenvalues are
* stored in the same order as on the diagonal of the Schur
* form returned in H, with W(i) = H(i,i).
*
* Z (input/output) COMPLEX*16 array, dimension (LDZ,N)
* If COMPZ = 'N', Z is not referenced.
* If COMPZ = 'I', on entry Z need not be set and on exit,
* if INFO = 0, Z contains the unitary matrix Z of the Schur
* vectors of H. If COMPZ = 'V', on entry Z must contain an
* N-by-N matrix Q, which is assumed to be equal to the unit
* matrix except for the submatrix Z(ILO:IHI,ILO:IHI). On exit,
* if INFO = 0, Z contains Q*Z.
* Normally Q is the unitary matrix generated by ZUNGHR
* after the call to ZGEHRD which formed the Hessenberg matrix
* H. (The output value of Z when INFO.GT.0 is given under
* the description of INFO below.)
*
* LDZ (input) INTEGER
* The leading dimension of the array Z. if COMPZ = 'I' or
* COMPZ = 'V', then LDZ.GE.MAX(1,N). Otherwize, LDZ.GE.1.
*
* WORK (workspace/output) COMPLEX*16 array, dimension (LWORK)
* On exit, if INFO = 0, WORK(1) returns an estimate of
* the optimal value for LWORK.
*
* LWORK (input) INTEGER
* The dimension of the array WORK. LWORK .GE. max(1,N)
* is sufficient and delivers very good and sometimes
* optimal performance. However, LWORK as large as 11*N
* may be required for optimal performance. A workspace
* query is recommended to determine the optimal workspace
* size.
*
* If LWORK = -1, then ZHSEQR does a workspace query.
* In this case, ZHSEQR checks the input parameters and
* estimates the optimal workspace size for the given
* values of N, ILO and IHI. The estimate is returned
* in WORK(1). No error message related to LWORK is
* issued by XERBLA. Neither H nor Z are accessed.
*
*
* INFO (output) INTEGER
* = 0: successful exit
* .LT. 0: if INFO = -i, the i-th argument had an illegal
* value
* .GT. 0: if INFO = i, ZHSEQR failed to compute all of
* the eigenvalues. Elements 1:ilo-1 and i+1:n of WR
* and WI contain those eigenvalues which have been
* successfully computed. (Failures are rare.)
*
* If INFO .GT. 0 and JOB = 'E', then on exit, the
* remaining unconverged eigenvalues are the eigen-
* values of the upper Hessenberg matrix rows and
* columns ILO through INFO of the final, output
* value of H.
*
* If INFO .GT. 0 and JOB = 'S', then on exit
*
* (*) (initial value of H)*U = U*(final value of H)
*
* where U is a unitary matrix. The final
* value of H is upper Hessenberg and triangular in
* rows and columns INFO+1 through IHI.
*
* If INFO .GT. 0 and COMPZ = 'V', then on exit
*
* (final value of Z) = (initial value of Z)*U
*
* where U is the unitary matrix in (*) (regard-
* less of the value of JOB.)
*
* If INFO .GT. 0 and COMPZ = 'I', then on exit
* (final value of Z) = U
* where U is the unitary matrix in (*) (regard-
* less of the value of JOB.)
*
* If INFO .GT. 0 and COMPZ = 'N', then Z is not
* accessed.
*
* ================================================================
* Default values supplied by
* ILAENV(ISPEC,'ZHSEQR',JOB(:1)//COMPZ(:1),N,ILO,IHI,LWORK).
* It is suggested that these defaults be adjusted in order
* to attain best performance in each particular
* computational environment.
*
* ISPEC=12: The ZLAHQR vs ZLAQR0 crossover point.
* Default: 75. (Must be at least 11.)
*
* ISPEC=13: Recommended deflation window size.
* This depends on ILO, IHI and NS. NS is the
* number of simultaneous shifts returned
* by ILAENV(ISPEC=15). (See ISPEC=15 below.)
* The default for (IHI-ILO+1).LE.500 is NS.
* The default for (IHI-ILO+1).GT.500 is 3*NS/2.
*
* ISPEC=14: Nibble crossover point. (See IPARMQ for
* details.) Default: 14% of deflation window
* size.
*
* ISPEC=15: Number of simultaneous shifts in a multishift
* QR iteration.
*
* If IHI-ILO+1 is ...
*
* greater than ...but less ... the
* or equal to ... than default is
*
* 1 30 NS = 2(+)
* 30 60 NS = 4(+)
* 60 150 NS = 10(+)
* 150 590 NS = **
* 590 3000 NS = 64
* 3000 6000 NS = 128
* 6000 infinity NS = 256
*
* (+) By default some or all matrices of this order
* are passed to the implicit double shift routine
* ZLAHQR and this parameter is ignored. See
* ISPEC=12 above and comments in IPARMQ for
* details.
*
* (**) The asterisks (**) indicate an ad-hoc
* function of N increasing from 10 to 64.
*
* ISPEC=16: Select structured matrix multiply.
* If the number of simultaneous shifts (specified
* by ISPEC=15) is less than 14, then the default
* for ISPEC=16 is 0. Otherwise the default for
* ISPEC=16 is 2.
*
* ================================================================
* Based on contributions by
* Karen Braman and Ralph Byers, Department of Mathematics,
* University of Kansas, USA
*
* ================================================================
* References:
* K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
* Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
* Performance, SIAM Journal of Matrix Analysis, volume 23, pages
* 929--947, 2002.
*
* K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
* Algorithm Part II: Aggressive Early Deflation, SIAM Journal
* of Matrix Analysis, volume 23, pages 948--973, 2002.
*
* ================================================================
go to the page top
back to matrix types
back to data types