On the final return from znaupd (indicated by ido = 99), the error flag info must be checked. If info = 0, then no fatal errors have occurred and it is time to post-process using zneupd to get eigenvalues of the original problem and the corresponding eigenvectors if desired. In the case shown here (shift-invert and generalized), there are some subtleties to recovering eigenvectors when is ill-conditioned. This process is called eigenvector purification. It prevents eigenvectors from being corrupted with noise due to the presence of eigenvectors corresponding to nearly infinite eigenvalues. Details are given in Chapter 4. These operations are completely transparent to the user. The general calling sequence for dseupd is shown in Figure 3.9.
c
c %-------------------------------------------%
c | No fatal errors occurred. |
c | Postprocess using CNEUPD. |
c | |
c | Computed eigenvalues may be extracted. |
c | |
c | Eigenvectors may also be computed now if |
c | desired. (indicated by rvec = .true.) |
c %-------------------------------------------%
c
rvec = .true.
c
call cneupd (rvec, 'A', select, d, v, ldv, sigma,
& workev, bmat, n, which, nev, tol, resid, ncv, v,
& ldv, iparam, ipntr, workd, workl, lworkl, rwork,
& ierr)
c
The input parameters bmat, n, info are precisely the same parameters that appear in the calling sequence of znaupd. It is extremely IMPORTANT that none of these parameters are altered between the final return from znaupd and the subsequent call to zneupd.
There is negligible additional cost to obtain eigenvectors. An orthonormal (Schur) basis for the invariant subspace corresponding to the converged approximate eigenvalues is always computed. In the above example, this basis is overwritten with the eigenvectors in the array v. Both basis sets may be obtained if desired but there is an additional storage cost of if both are requested (in this case a separate n by nev array z must be supplied). In some cases it may be desirable to have both basis sets.
In the non-Hermitian case, the eigenvector basis is potentially ill-conditioned and may not even exist. While, eigenvectors may have physical meaning, they are generally not the best basis to use. If a basis for a selected invariant subspace is required, then it is generally better to compute a Schur basis. This will provide an orthogonal, hence well conditioned, basis for the subspace. The sensitivity of a given subspace to perturbations (such as roundoff error) is another question. See § 4.6 for a brief discussion.
If it is desirable to retain the Schur basis in v and storage is an issue, the user may elect to call this routine once for each desired eigenvector and store it peripherally. There is also the option of computing a selected set of these vectors with a single call.
The input parameters that must be specified are
When requested, the eigenvectors returned by zneupd are normalized to have unit length with respect to the semi-inner product that was used. Thus, if they will have unit length in the standard 2-norm. In general, a computed eigenvector will satisfy .