On the final return from dsaupd (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 dseupd 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 near infinite eigenvalues (See Chapter 4). These operations are completely transparent to the user. The general calling sequence for dseupd is shown in Figure 3.5.
c c %-------------------------------------------% c | No fatal errors occurred. | c | Postprocess using DSEUPD. | 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 dseupd ( rvec, 'All', select, d, v, ldv, sigma, & bmat, n, which, nev, tol, resid, ncv, v, ldv, & iparam, ipntr, workd, workl, lworkl, ierr ) c |
There is negligible additional cost to obtain eigenvectors. An orthonormal (Lanczos) basis 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).
The approximate eigenvalues of the original problem are returned in ascending algebraic order in the array d. If it is desirable to retain the Lanczos 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