version 1.1.1.1, 2010/01/26 15:22:46
|
version 1.12, 2012/08/22 09:48:17
|
Line 1
|
Line 1
|
|
*> \brief \b DLAEIN |
|
* |
|
* =========== DOCUMENTATION =========== |
|
* |
|
* Online html documentation available at |
|
* http://www.netlib.org/lapack/explore-html/ |
|
* |
|
*> \htmlonly |
|
*> Download DLAEIN + dependencies |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlaein.f"> |
|
*> [TGZ]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlaein.f"> |
|
*> [ZIP]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlaein.f"> |
|
*> [TXT]</a> |
|
*> \endhtmlonly |
|
* |
|
* Definition: |
|
* =========== |
|
* |
|
* SUBROUTINE DLAEIN( RIGHTV, NOINIT, N, H, LDH, WR, WI, VR, VI, B, |
|
* LDB, WORK, EPS3, SMLNUM, BIGNUM, INFO ) |
|
* |
|
* .. Scalar Arguments .. |
|
* LOGICAL NOINIT, RIGHTV |
|
* INTEGER INFO, LDB, LDH, N |
|
* DOUBLE PRECISION BIGNUM, EPS3, SMLNUM, WI, WR |
|
* .. |
|
* .. Array Arguments .. |
|
* DOUBLE PRECISION B( LDB, * ), H( LDH, * ), VI( * ), VR( * ), |
|
* $ WORK( * ) |
|
* .. |
|
* |
|
* |
|
*> \par Purpose: |
|
* ============= |
|
*> |
|
*> \verbatim |
|
*> |
|
*> DLAEIN uses inverse iteration to find a right or left eigenvector |
|
*> corresponding to the eigenvalue (WR,WI) of a real upper Hessenberg |
|
*> matrix H. |
|
*> \endverbatim |
|
* |
|
* Arguments: |
|
* ========== |
|
* |
|
*> \param[in] RIGHTV |
|
*> \verbatim |
|
*> RIGHTV is LOGICAL |
|
*> = .TRUE. : compute right eigenvector; |
|
*> = .FALSE.: compute left eigenvector. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] NOINIT |
|
*> \verbatim |
|
*> NOINIT is LOGICAL |
|
*> = .TRUE. : no initial vector supplied in (VR,VI). |
|
*> = .FALSE.: initial vector supplied in (VR,VI). |
|
*> \endverbatim |
|
*> |
|
*> \param[in] N |
|
*> \verbatim |
|
*> N is INTEGER |
|
*> The order of the matrix H. N >= 0. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] H |
|
*> \verbatim |
|
*> H is DOUBLE PRECISION array, dimension (LDH,N) |
|
*> The upper Hessenberg matrix H. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDH |
|
*> \verbatim |
|
*> LDH is INTEGER |
|
*> The leading dimension of the array H. LDH >= max(1,N). |
|
*> \endverbatim |
|
*> |
|
*> \param[in] WR |
|
*> \verbatim |
|
*> WR is DOUBLE PRECISION |
|
*> \endverbatim |
|
*> |
|
*> \param[in] WI |
|
*> \verbatim |
|
*> WI is DOUBLE PRECISION |
|
*> The real and imaginary parts of the eigenvalue of H whose |
|
*> corresponding right or left eigenvector is to be computed. |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] VR |
|
*> \verbatim |
|
*> VR is DOUBLE PRECISION array, dimension (N) |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] VI |
|
*> \verbatim |
|
*> VI is DOUBLE PRECISION array, dimension (N) |
|
*> On entry, if NOINIT = .FALSE. and WI = 0.0, VR must contain |
|
*> a real starting vector for inverse iteration using the real |
|
*> eigenvalue WR; if NOINIT = .FALSE. and WI.ne.0.0, VR and VI |
|
*> must contain the real and imaginary parts of a complex |
|
*> starting vector for inverse iteration using the complex |
|
*> eigenvalue (WR,WI); otherwise VR and VI need not be set. |
|
*> On exit, if WI = 0.0 (real eigenvalue), VR contains the |
|
*> computed real eigenvector; if WI.ne.0.0 (complex eigenvalue), |
|
*> VR and VI contain the real and imaginary parts of the |
|
*> computed complex eigenvector. The eigenvector is normalized |
|
*> so that the component of largest magnitude has magnitude 1; |
|
*> here the magnitude of a complex number (x,y) is taken to be |
|
*> |x| + |y|. |
|
*> VI is not referenced if WI = 0.0. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] B |
|
*> \verbatim |
|
*> B is DOUBLE PRECISION array, dimension (LDB,N) |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDB |
|
*> \verbatim |
|
*> LDB is INTEGER |
|
*> The leading dimension of the array B. LDB >= N+1. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] WORK |
|
*> \verbatim |
|
*> WORK is DOUBLE PRECISION array, dimension (N) |
|
*> \endverbatim |
|
*> |
|
*> \param[in] EPS3 |
|
*> \verbatim |
|
*> EPS3 is DOUBLE PRECISION |
|
*> A small machine-dependent value which is used to perturb |
|
*> close eigenvalues, and to replace zero pivots. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] SMLNUM |
|
*> \verbatim |
|
*> SMLNUM is DOUBLE PRECISION |
|
*> A machine-dependent value close to the underflow threshold. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] BIGNUM |
|
*> \verbatim |
|
*> BIGNUM is DOUBLE PRECISION |
|
*> A machine-dependent value close to the overflow threshold. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] INFO |
|
*> \verbatim |
|
*> INFO is INTEGER |
|
*> = 0: successful exit |
|
*> = 1: inverse iteration did not converge; VR is set to the |
|
*> last iterate, and so is VI if WI.ne.0.0. |
|
*> \endverbatim |
|
* |
|
* Authors: |
|
* ======== |
|
* |
|
*> \author Univ. of Tennessee |
|
*> \author Univ. of California Berkeley |
|
*> \author Univ. of Colorado Denver |
|
*> \author NAG Ltd. |
|
* |
|
*> \date November 2011 |
|
* |
|
*> \ingroup doubleOTHERauxiliary |
|
* |
|
* ===================================================================== |
SUBROUTINE DLAEIN( RIGHTV, NOINIT, N, H, LDH, WR, WI, VR, VI, B, |
SUBROUTINE DLAEIN( RIGHTV, NOINIT, N, H, LDH, WR, WI, VR, VI, B, |
$ LDB, WORK, EPS3, SMLNUM, BIGNUM, INFO ) |
$ LDB, WORK, EPS3, SMLNUM, BIGNUM, INFO ) |
* |
* |
* -- LAPACK auxiliary routine (version 3.2) -- |
* -- LAPACK auxiliary routine (version 3.4.0) -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* November 2006 |
* November 2011 |
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
LOGICAL NOINIT, RIGHTV |
LOGICAL NOINIT, RIGHTV |
Line 16
|
Line 187
|
$ WORK( * ) |
$ WORK( * ) |
* .. |
* .. |
* |
* |
* Purpose |
|
* ======= |
|
* |
|
* DLAEIN uses inverse iteration to find a right or left eigenvector |
|
* corresponding to the eigenvalue (WR,WI) of a real upper Hessenberg |
|
* matrix H. |
|
* |
|
* Arguments |
|
* ========= |
|
* |
|
* RIGHTV (input) LOGICAL |
|
* = .TRUE. : compute right eigenvector; |
|
* = .FALSE.: compute left eigenvector. |
|
* |
|
* NOINIT (input) LOGICAL |
|
* = .TRUE. : no initial vector supplied in (VR,VI). |
|
* = .FALSE.: initial vector supplied in (VR,VI). |
|
* |
|
* N (input) INTEGER |
|
* The order of the matrix H. N >= 0. |
|
* |
|
* H (input) DOUBLE PRECISION array, dimension (LDH,N) |
|
* The upper Hessenberg matrix H. |
|
* |
|
* LDH (input) INTEGER |
|
* The leading dimension of the array H. LDH >= max(1,N). |
|
* |
|
* WR (input) DOUBLE PRECISION |
|
* WI (input) DOUBLE PRECISION |
|
* The real and imaginary parts of the eigenvalue of H whose |
|
* corresponding right or left eigenvector is to be computed. |
|
* |
|
* VR (input/output) DOUBLE PRECISION array, dimension (N) |
|
* VI (input/output) DOUBLE PRECISION array, dimension (N) |
|
* On entry, if NOINIT = .FALSE. and WI = 0.0, VR must contain |
|
* a real starting vector for inverse iteration using the real |
|
* eigenvalue WR; if NOINIT = .FALSE. and WI.ne.0.0, VR and VI |
|
* must contain the real and imaginary parts of a complex |
|
* starting vector for inverse iteration using the complex |
|
* eigenvalue (WR,WI); otherwise VR and VI need not be set. |
|
* On exit, if WI = 0.0 (real eigenvalue), VR contains the |
|
* computed real eigenvector; if WI.ne.0.0 (complex eigenvalue), |
|
* VR and VI contain the real and imaginary parts of the |
|
* computed complex eigenvector. The eigenvector is normalized |
|
* so that the component of largest magnitude has magnitude 1; |
|
* here the magnitude of a complex number (x,y) is taken to be |
|
* |x| + |y|. |
|
* VI is not referenced if WI = 0.0. |
|
* |
|
* B (workspace) DOUBLE PRECISION array, dimension (LDB,N) |
|
* |
|
* LDB (input) INTEGER |
|
* The leading dimension of the array B. LDB >= N+1. |
|
* |
|
* WORK (workspace) DOUBLE PRECISION array, dimension (N) |
|
* |
|
* EPS3 (input) DOUBLE PRECISION |
|
* A small machine-dependent value which is used to perturb |
|
* close eigenvalues, and to replace zero pivots. |
|
* |
|
* SMLNUM (input) DOUBLE PRECISION |
|
* A machine-dependent value close to the underflow threshold. |
|
* |
|
* BIGNUM (input) DOUBLE PRECISION |
|
* A machine-dependent value close to the overflow threshold. |
|
* |
|
* INFO (output) INTEGER |
|
* = 0: successful exit |
|
* = 1: inverse iteration did not converge; VR is set to the |
|
* last iterate, and so is VI if WI.ne.0.0. |
|
* |
|
* ===================================================================== |
* ===================================================================== |
* |
* |
* .. Parameters .. |
* .. Parameters .. |
Line 232
|
Line 332
|
DO 110 ITS = 1, N |
DO 110 ITS = 1, N |
* |
* |
* Solve U*x = scale*v for a right eigenvector |
* Solve U*x = scale*v for a right eigenvector |
* or U'*x = scale*v for a left eigenvector, |
* or U**T*x = scale*v for a left eigenvector, |
* overwriting x on v. |
* overwriting x on v. |
* |
* |
CALL DLATRS( 'Upper', TRANS, 'Nonunit', NORMIN, N, B, LDB, |
CALL DLATRS( 'Upper', TRANS, 'Nonunit', NORMIN, N, B, LDB, |
Line 427
|
Line 527
|
VCRIT = BIGNUM |
VCRIT = BIGNUM |
* |
* |
* Solve U*(xr,xi) = scale*(vr,vi) for a right eigenvector, |
* Solve U*(xr,xi) = scale*(vr,vi) for a right eigenvector, |
* or U'*(xr,xi) = scale*(vr,vi) for a left eigenvector, |
* or U**T*(xr,xi) = scale*(vr,vi) for a left eigenvector, |
* overwriting (xr,xi) on (vr,vi). |
* overwriting (xr,xi) on (vr,vi). |
* |
* |
DO 250 I = I1, I2, I3 |
DO 250 I = I1, I2, I3 |