The easiest way to describe the reverse communication interface is through the example code segment shown in Figure 2.2. Once storage has been declared and the input parameters initialized, the reverse communication loop (Fig. 2.2) is entered and repeated calls to dsaupd are made. On return the parameter ido will indicate the action to be taken. In this simple example, the only action taken is a matrix-vector product (see call av in the code segment of Figure 2.2). The more sophisticated shift-invert computational modes require more complicated actions but the basic idea remains the same.
1|cPARAMETER
1c|DESCRIPTION
1|c
1c|
ido
Reverse communication flag.
nev
The number of requested eigenvalues to compute.
ncv
The number of Lanczos basis vectors to use through
the course of the computation.
bmat
Indicates whether the problem is standard bmat = `I'
or generalized (bmat = `G').
which
Specifies which eigenvalues of are to be computed.
tol
Specifies the relative accuracy to which eigenvalues are
to be computed.
iparam
Specifies the computational mode, number of IRAM
iterations, the implicit shift strategy, and outputs
various informational parameters upon completion
of IRAM.
c
c %------------------------------------------------%
c | M A I N L O O P (Reverse communication loop) |
c %------------------------------------------------%
c
10 continue
c
c %---------------------------------------------%
c | Repeatedly call the routine DSAUPD and take |
c | actions indicated by parameter IDO until |
c | either convergence is indicated or maxitr |
c | has been exceeded. |
c %---------------------------------------------%
c
call dsaupd ( ido, bmat, n, which, nev, tol, resid,
& ncv, v, ldv, iparam, ipntr, workd,
& workl, lworkl, info )
c
if (ido .eq. -1 .or. ido .eq. 1) then
c
c %--------------------------------------%
c | Perform matrix-vector multiplication |
c | y <--- OP*x |
c | The user should supply his/her own |
c | matrix-vector multiplication routine |
c | here that takes workd(ipntr(1)) as |
c | the input, and return the result to |
c | workd(ipntr(2)). |
c %--------------------------------------%
c
call av (nx, workd(ipntr(1)), workd(ipntr(2)))
c
c %-----------------------------------------%
c | L O O P B A C K to call DSAUPD again. |
c %-----------------------------------------%
c
go to 10
c
end if