version 1.3, 2010/08/06 15:28:36
|
version 1.12, 2012/12/14 14:22:28
|
Line 1
|
Line 1
|
|
*> \brief <b> DGEES computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE matrices</b> |
|
* |
|
* =========== DOCUMENTATION =========== |
|
* |
|
* Online html documentation available at |
|
* http://www.netlib.org/lapack/explore-html/ |
|
* |
|
*> \htmlonly |
|
*> Download DGEES + dependencies |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dgees.f"> |
|
*> [TGZ]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dgees.f"> |
|
*> [ZIP]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dgees.f"> |
|
*> [TXT]</a> |
|
*> \endhtmlonly |
|
* |
|
* Definition: |
|
* =========== |
|
* |
|
* SUBROUTINE DGEES( JOBVS, SORT, SELECT, N, A, LDA, SDIM, WR, WI, |
|
* VS, LDVS, WORK, LWORK, BWORK, INFO ) |
|
* |
|
* .. Scalar Arguments .. |
|
* CHARACTER JOBVS, SORT |
|
* INTEGER INFO, LDA, LDVS, LWORK, N, SDIM |
|
* .. |
|
* .. Array Arguments .. |
|
* LOGICAL BWORK( * ) |
|
* DOUBLE PRECISION A( LDA, * ), VS( LDVS, * ), WI( * ), WORK( * ), |
|
* $ WR( * ) |
|
* .. |
|
* .. Function Arguments .. |
|
* LOGICAL SELECT |
|
* EXTERNAL SELECT |
|
* .. |
|
* |
|
* |
|
*> \par Purpose: |
|
* ============= |
|
*> |
|
*> \verbatim |
|
*> |
|
*> DGEES computes for an N-by-N real nonsymmetric matrix A, the |
|
*> eigenvalues, the real Schur form T, and, optionally, the matrix of |
|
*> Schur vectors Z. This gives the Schur factorization A = Z*T*(Z**T). |
|
*> |
|
*> Optionally, it also orders the eigenvalues on the diagonal of the |
|
*> real Schur form so that selected eigenvalues are at the top left. |
|
*> The leading columns of Z then form an orthonormal basis for the |
|
*> invariant subspace corresponding to the selected eigenvalues. |
|
*> |
|
*> A matrix is in real Schur form if it is upper quasi-triangular with |
|
*> 1-by-1 and 2-by-2 blocks. 2-by-2 blocks will be standardized in the |
|
*> form |
|
*> [ a b ] |
|
*> [ c a ] |
|
*> |
|
*> where b*c < 0. The eigenvalues of such a block are a +- sqrt(bc). |
|
*> \endverbatim |
|
* |
|
* Arguments: |
|
* ========== |
|
* |
|
*> \param[in] JOBVS |
|
*> \verbatim |
|
*> JOBVS is CHARACTER*1 |
|
*> = 'N': Schur vectors are not computed; |
|
*> = 'V': Schur vectors are computed. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] SORT |
|
*> \verbatim |
|
*> SORT is CHARACTER*1 |
|
*> Specifies whether or not to order the eigenvalues on the |
|
*> diagonal of the Schur form. |
|
*> = 'N': Eigenvalues are not ordered; |
|
*> = 'S': Eigenvalues are ordered (see SELECT). |
|
*> \endverbatim |
|
*> |
|
*> \param[in] SELECT |
|
*> \verbatim |
|
*> SELECT is a LOGICAL FUNCTION of two DOUBLE PRECISION arguments |
|
*> SELECT must be declared EXTERNAL in the calling subroutine. |
|
*> If SORT = 'S', SELECT is used to select eigenvalues to sort |
|
*> to the top left of the Schur form. |
|
*> If SORT = 'N', SELECT is not referenced. |
|
*> An eigenvalue WR(j)+sqrt(-1)*WI(j) is selected if |
|
*> SELECT(WR(j),WI(j)) is true; i.e., if either one of a complex |
|
*> conjugate pair of eigenvalues is selected, then both complex |
|
*> eigenvalues are selected. |
|
*> Note that a selected complex eigenvalue may no longer |
|
*> satisfy SELECT(WR(j),WI(j)) = .TRUE. after ordering, since |
|
*> ordering may change the value of complex eigenvalues |
|
*> (especially if the eigenvalue is ill-conditioned); in this |
|
*> case INFO is set to N+2 (see INFO below). |
|
*> \endverbatim |
|
*> |
|
*> \param[in] N |
|
*> \verbatim |
|
*> N is INTEGER |
|
*> The order of the matrix A. N >= 0. |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] A |
|
*> \verbatim |
|
*> A is DOUBLE PRECISION array, dimension (LDA,N) |
|
*> On entry, the N-by-N matrix A. |
|
*> On exit, A has been overwritten by its real Schur form T. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDA |
|
*> \verbatim |
|
*> LDA is INTEGER |
|
*> The leading dimension of the array A. LDA >= max(1,N). |
|
*> \endverbatim |
|
*> |
|
*> \param[out] SDIM |
|
*> \verbatim |
|
*> SDIM is INTEGER |
|
*> If SORT = 'N', SDIM = 0. |
|
*> If SORT = 'S', SDIM = number of eigenvalues (after sorting) |
|
*> for which SELECT is true. (Complex conjugate |
|
*> pairs for which SELECT is true for either |
|
*> eigenvalue count as 2.) |
|
*> \endverbatim |
|
*> |
|
*> \param[out] WR |
|
*> \verbatim |
|
*> WR is DOUBLE PRECISION array, dimension (N) |
|
*> \endverbatim |
|
*> |
|
*> \param[out] WI |
|
*> \verbatim |
|
*> WI is DOUBLE PRECISION array, dimension (N) |
|
*> WR and WI contain the real and imaginary parts, |
|
*> respectively, of the computed eigenvalues in the same order |
|
*> that they appear on the diagonal of the output Schur form T. |
|
*> Complex conjugate pairs of eigenvalues will appear |
|
*> consecutively with the eigenvalue having the positive |
|
*> imaginary part first. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] VS |
|
*> \verbatim |
|
*> VS is DOUBLE PRECISION array, dimension (LDVS,N) |
|
*> If JOBVS = 'V', VS contains the orthogonal matrix Z of Schur |
|
*> vectors. |
|
*> If JOBVS = 'N', VS is not referenced. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDVS |
|
*> \verbatim |
|
*> LDVS is INTEGER |
|
*> The leading dimension of the array VS. LDVS >= 1; if |
|
*> JOBVS = 'V', LDVS >= N. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] WORK |
|
*> \verbatim |
|
*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) |
|
*> On exit, if INFO = 0, WORK(1) contains the optimal LWORK. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LWORK |
|
*> \verbatim |
|
*> LWORK is INTEGER |
|
*> The dimension of the array WORK. LWORK >= max(1,3*N). |
|
*> For good performance, LWORK must generally be larger. |
|
*> |
|
*> If LWORK = -1, then a workspace query is assumed; the routine |
|
*> only calculates the optimal size of the WORK array, returns |
|
*> this value as the first entry of the WORK array, and no error |
|
*> message related to LWORK is issued by XERBLA. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] BWORK |
|
*> \verbatim |
|
*> BWORK is LOGICAL array, dimension (N) |
|
*> Not referenced if SORT = 'N'. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] INFO |
|
*> \verbatim |
|
*> INFO is INTEGER |
|
*> = 0: successful exit |
|
*> < 0: if INFO = -i, the i-th argument had an illegal value. |
|
*> > 0: if INFO = i, and i is |
|
*> <= N: the QR algorithm failed to compute all the |
|
*> eigenvalues; elements 1:ILO-1 and i+1:N of WR and WI |
|
*> contain those eigenvalues which have converged; if |
|
*> JOBVS = 'V', VS contains the matrix which reduces A |
|
*> to its partially converged Schur form. |
|
*> = N+1: the eigenvalues could not be reordered because some |
|
*> eigenvalues were too close to separate (the problem |
|
*> is very ill-conditioned); |
|
*> = N+2: after reordering, roundoff changed values of some |
|
*> complex eigenvalues so that leading eigenvalues in |
|
*> the Schur form no longer satisfy SELECT=.TRUE. This |
|
*> could also be caused by underflow due to scaling. |
|
*> \endverbatim |
|
* |
|
* Authors: |
|
* ======== |
|
* |
|
*> \author Univ. of Tennessee |
|
*> \author Univ. of California Berkeley |
|
*> \author Univ. of Colorado Denver |
|
*> \author NAG Ltd. |
|
* |
|
*> \date November 2011 |
|
* |
|
*> \ingroup doubleGEeigen |
|
* |
|
* ===================================================================== |
SUBROUTINE DGEES( JOBVS, SORT, SELECT, N, A, LDA, SDIM, WR, WI, |
SUBROUTINE DGEES( JOBVS, SORT, SELECT, N, A, LDA, SDIM, WR, WI, |
$ VS, LDVS, WORK, LWORK, BWORK, INFO ) |
$ VS, LDVS, WORK, LWORK, BWORK, INFO ) |
* |
* |
* -- LAPACK driver routine (version 3.2) -- |
* -- LAPACK driver 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 .. |
CHARACTER JOBVS, SORT |
CHARACTER JOBVS, SORT |
Line 20
|
Line 235
|
EXTERNAL SELECT |
EXTERNAL SELECT |
* .. |
* .. |
* |
* |
* Purpose |
|
* ======= |
|
* |
|
* DGEES computes for an N-by-N real nonsymmetric matrix A, the |
|
* eigenvalues, the real Schur form T, and, optionally, the matrix of |
|
* Schur vectors Z. This gives the Schur factorization A = Z*T*(Z**T). |
|
* |
|
* Optionally, it also orders the eigenvalues on the diagonal of the |
|
* real Schur form so that selected eigenvalues are at the top left. |
|
* The leading columns of Z then form an orthonormal basis for the |
|
* invariant subspace corresponding to the selected eigenvalues. |
|
* |
|
* A matrix is in real Schur form if it is upper quasi-triangular with |
|
* 1-by-1 and 2-by-2 blocks. 2-by-2 blocks will be standardized in the |
|
* form |
|
* [ a b ] |
|
* [ c a ] |
|
* |
|
* where b*c < 0. The eigenvalues of such a block are a +- sqrt(bc). |
|
* |
|
* Arguments |
|
* ========= |
|
* |
|
* JOBVS (input) CHARACTER*1 |
|
* = 'N': Schur vectors are not computed; |
|
* = 'V': Schur vectors are computed. |
|
* |
|
* SORT (input) CHARACTER*1 |
|
* Specifies whether or not to order the eigenvalues on the |
|
* diagonal of the Schur form. |
|
* = 'N': Eigenvalues are not ordered; |
|
* = 'S': Eigenvalues are ordered (see SELECT). |
|
* |
|
* SELECT (external procedure) LOGICAL FUNCTION of two DOUBLE PRECISION arguments |
|
* SELECT must be declared EXTERNAL in the calling subroutine. |
|
* If SORT = 'S', SELECT is used to select eigenvalues to sort |
|
* to the top left of the Schur form. |
|
* If SORT = 'N', SELECT is not referenced. |
|
* An eigenvalue WR(j)+sqrt(-1)*WI(j) is selected if |
|
* SELECT(WR(j),WI(j)) is true; i.e., if either one of a complex |
|
* conjugate pair of eigenvalues is selected, then both complex |
|
* eigenvalues are selected. |
|
* Note that a selected complex eigenvalue may no longer |
|
* satisfy SELECT(WR(j),WI(j)) = .TRUE. after ordering, since |
|
* ordering may change the value of complex eigenvalues |
|
* (especially if the eigenvalue is ill-conditioned); in this |
|
* case INFO is set to N+2 (see INFO below). |
|
* |
|
* N (input) INTEGER |
|
* The order of the matrix A. N >= 0. |
|
* |
|
* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) |
|
* On entry, the N-by-N matrix A. |
|
* On exit, A has been overwritten by its real Schur form T. |
|
* |
|
* LDA (input) INTEGER |
|
* The leading dimension of the array A. LDA >= max(1,N). |
|
* |
|
* SDIM (output) INTEGER |
|
* If SORT = 'N', SDIM = 0. |
|
* If SORT = 'S', SDIM = number of eigenvalues (after sorting) |
|
* for which SELECT is true. (Complex conjugate |
|
* pairs for which SELECT is true for either |
|
* eigenvalue count as 2.) |
|
* |
|
* WR (output) DOUBLE PRECISION array, dimension (N) |
|
* WI (output) DOUBLE PRECISION array, dimension (N) |
|
* WR and WI contain the real and imaginary parts, |
|
* respectively, of the computed eigenvalues in the same order |
|
* that they appear on the diagonal of the output Schur form T. |
|
* Complex conjugate pairs of eigenvalues will appear |
|
* consecutively with the eigenvalue having the positive |
|
* imaginary part first. |
|
* |
|
* VS (output) DOUBLE PRECISION array, dimension (LDVS,N) |
|
* If JOBVS = 'V', VS contains the orthogonal matrix Z of Schur |
|
* vectors. |
|
* If JOBVS = 'N', VS is not referenced. |
|
* |
|
* LDVS (input) INTEGER |
|
* The leading dimension of the array VS. LDVS >= 1; if |
|
* JOBVS = 'V', LDVS >= N. |
|
* |
|
* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) |
|
* On exit, if INFO = 0, WORK(1) contains the optimal LWORK. |
|
* |
|
* LWORK (input) INTEGER |
|
* The dimension of the array WORK. LWORK >= max(1,3*N). |
|
* For good performance, LWORK must generally be larger. |
|
* |
|
* If LWORK = -1, then a workspace query is assumed; the routine |
|
* only calculates the optimal size of the WORK array, returns |
|
* this value as the first entry of the WORK array, and no error |
|
* message related to LWORK is issued by XERBLA. |
|
* |
|
* BWORK (workspace) LOGICAL array, dimension (N) |
|
* Not referenced if SORT = 'N'. |
|
* |
|
* INFO (output) INTEGER |
|
* = 0: successful exit |
|
* < 0: if INFO = -i, the i-th argument had an illegal value. |
|
* > 0: if INFO = i, and i is |
|
* <= N: the QR algorithm failed to compute all the |
|
* eigenvalues; elements 1:ILO-1 and i+1:N of WR and WI |
|
* contain those eigenvalues which have converged; if |
|
* JOBVS = 'V', VS contains the matrix which reduces A |
|
* to its partially converged Schur form. |
|
* = N+1: the eigenvalues could not be reordered because some |
|
* eigenvalues were too close to separate (the problem |
|
* is very ill-conditioned); |
|
* = N+2: after reordering, roundoff changed values of some |
|
* complex eigenvalues so that leading eigenvalues in |
|
* the Schur form no longer satisfy SELECT=.TRUE. This |
|
* could also be caused by underflow due to scaling. |
|
* |
|
* ===================================================================== |
* ===================================================================== |
* |
* |
* .. Parameters .. |
* .. Parameters .. |