The problem set up is similar for all of the available computational
modes. In the previous section, a detailed description of the
reverse communication loop for a specific
mode (Shift-Invert for a Real Non-symmetric Generalized Problem) was given.
To use this
or any of the other modes listed below, the user is strongly urged to modify
one of the driver routine *templates* as described in Appendix A.

The first thing to decide is whether the problem will
require a spectral transformation. If the problem is
generalized () then a spectral transformation
will be required (see § 3.2).
Such a transformation will most likely be needed for a standard problem
if the desired eigenvalues are in the interior of the spectrum or if
they are clustered at the desired part of the spectrum.
Once this decision has been made and `OP` has been specified, an
efficient means to implement the action of the operator `OP` on
a vector must be devised. The expense of applying `OP` to a vector
will of course have direct impact on performance.

Shift-Invert spectral transformations may be implemented with or without
the use of a weighted -inner product.
The relation between the eigenvalues of `OP` and the
eigenvalues of the original problem must also be understood in order
to make the appropriate specification of `which` in order
to recover eigenvalues of interest for the original problem.
The user must specify the number of eigenvalues
to compute, which eigenvalues are of interest, the number of basis vectors
to use, and whether or not the problem is standard or generalized.
These items are controlled with the parameters listed in Table 2.2
of Chapter 2.

Setting `nev` and `ncv`
for optimal performance is very much problem dependent.
If possible, it is best to avoid setting
`nev` in a
way that will split clusters of eigenvalues.
As a rule of thumb, is reasonable. There
are tradeoffs due to the cost of the user supplied matrix-vector products
and the cost of the implicit restart mechanism. If the user supplied
matrix-vector product is relatively cheap, then a smaller value of
`ncv` may lead to more user matrix-vector products and IRA iterations
but an overall decrease in computation time. Convergence behavior
can be quite different for various settings of the `which` parameter.
The Arnoldi process tends to converge most rapidly to extreme points of
the convex hull of the spectrum. Implicit restarting can be effective
in focusing on and isolating a selected set of eigenvalues near these
extremes. In principle, implicit restarting could isolate eigenvalues
in the interior, but in practice this is difficult and usually
unsuccessful. If one is interested in eigenvalues near a point that is in the interior of the convex hull of the spectrum, a
shift-invert strategy is usually required for reasonable convergence.

call dnaupd (ido, bmat, n, which, nev, tol, resid, ncv, v, & ldv, iparam, ipntr, workd, workl, lworkl, info) |

The call to `dnaupd` is listed in Figure 3.3.
The integer `ido` is the reverse communication flag
that will specify a requested action on return from `dnaupd`.
The `character*1` parameter `bmat` specifies if this is
a standard `bmat = `I'` or a generalized `bmat = `G'`
problem. The integer `n` specifies the dimension of the problem.
The `character*2` parameter `which` specifies the `nev`
eigenvalues to be computed. The options for `which` differ depending on
whether a
Hermitian or non-Hermitian eigenvalue problem is to be solved.
Tables 3.3-3.4 list the different selections
possible.
The specification of problem type
will be described separately but the reverse communication interface
and loop structure is the same for each type of the three basic
modes `regular`, `regular-inverse`, `shift-invert` (standard
or generalized).
There are some additional specialized modes for
symmetric problems (`Buckling`
and `Cayley` ) and for
real non-symmetric problems with complex shifts applied in
real arithmetic. The user is encouraged to examine the sample
driver routines for these modes.

The integer `nev` indicates the number of eigenvalues to compute
and `tol` specifies the accuracy requested.
The integer array `iparam` has eleven entries. On input,
`iparam(1)`
should be set to `0` if the user wishes to supply shifts for
implicit restarting or to `1` if the default exact-shift strategy
is requested. The entry `iparam(1)`
should be set to `1` unless the user has a great deal of knowledge
about the spectrum and about the IRAM and underlying theory.
The entry `iparam(3)` should be set to
the maximum number of implicit restarts allowed. The cost of
an implicit restart step (major iteration) is on the order
of Flops for the dense matrix operations
and `ncv - nev` matrix-vector products with the
matrix
On output, `iparam(3)` will
contain the number of implicit restarts taken during the computation.

With respect to shift-invert modes, entry `iparam(7)` is very important.
The remaining entries of `iparam` are either no longer referenced
or are output parameters. The legitimate values for `iparam(7)`
differ with each problem type and will be listed below for
each of them.