Integer type:  int32  int64  nag_int  show int32  show int32  show int64  show int64  show nag_int  show nag_int

Chapter Contents
Chapter Introduction
NAG Toolbox

# NAG Toolbox: nag_sparseig_real_monit (f12ae)

## Purpose

nag_sparseig_real_monit (f12ae) can be used to return additional monitoring information during computation. It is in a suite of functions consisting of nag_sparseig_real_init (f12aa), nag_sparseig_real_iter (f12ab), nag_sparseig_real_proc (f12ac), nag_sparseig_real_option (f12ad) and nag_sparseig_real_monit (f12ae).

## Syntax

[niter, nconv, ritzr, ritzi, rzest] = f12ae(icomm, comm)
[niter, nconv, ritzr, ritzi, rzest] = nag_sparseig_real_monit(icomm, comm)

## Description

The suite of functions is designed to calculate some of the eigenvalues, λ $\lambda$, (and optionally the corresponding eigenvectors, x $x$) of a standard eigenvalue problem Ax = λx $Ax=\lambda x$, or of a generalized eigenvalue problem Ax = λBx $Ax=\lambda Bx$ of order n $n$, where n $n$ is large and the coefficient matrices A $A$ and B $B$ are sparse, real and nonsymmetric. The suite can also be used to find selected eigenvalues/eigenvectors of smaller scale dense, real and nonsymmetric problems.
On an intermediate exit from nag_sparseig_real_iter (f12ab) with irevcm = 4 ${\mathbf{irevcm}}=4$, nag_sparseig_real_monit (f12ae) may be called to return monitoring information on the progress of the Arnoldi iterative process. The information returned by nag_sparseig_real_monit (f12ae) is:
 – the number of the current Arnoldi iteration; – the number of converged eigenvalues at this point; – the real and imaginary parts of the converged eigenvalues; – the error bounds on the converged eigenvalues.
nag_sparseig_real_monit (f12ae) does not have an equivalent function from the ARPACK package which prints various levels of detail of monitoring information through an output channel controlled via a parameter value (see Lehoucq et al. (1998) for details of ARPACK routines). nag_sparseig_real_monit (f12ae) should not be called at any time other than immediately following an irevcm = 4 ${\mathbf{irevcm}}=4$ return from nag_sparseig_real_iter (f12ab).

## References

Lehoucq R B (2001) Implicitly restarted Arnoldi methods and subspace iteration SIAM Journal on Matrix Analysis and Applications 23 551–562
Lehoucq R B and Scott J A (1996) An evaluation of software for computing eigenvalues of sparse nonsymmetric matrices Preprint MCS-P547-1195 Argonne National Laboratory
Lehoucq R B and Sorensen D C (1996) Deflation techniques for an implicitly restarted Arnoldi iteration SIAM Journal on Matrix Analysis and Applications 17 789–821
Lehoucq R B, Sorensen D C and Yang C (1998) ARPACK Users' Guide: Solution of Large-scale Eigenvalue Problems with Implicitly Restarted Arnoldi Methods SIAM, Philidelphia

## Parameters

### Compulsory Input Parameters

1:     icomm( : $:$) – int64int32nag_int array
Note: the dimension of the array icomm must be at least max (1,licomm)$\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,{\mathbf{licomm}}\right)$, where licomm is passed to the setup function  (see nag_sparseig_real_init (f12aa)).
The array icomm output by the preceding call to nag_sparseig_real_iter (f12ab).
2:     comm( : $:$) – double array
Note: the dimension of the array comm must be at least max (1, 3 × n + 3 × ncv × ncv + 6 × ncv + 60 )$\mathrm{max}\phantom{\rule{0.125em}{0ex}}\left(1,3×{\mathbf{n}}+3×{\mathbf{ncv}}×{\mathbf{ncv}}+6×{\mathbf{ncv}}+60\right)$ (see nag_sparseig_real_init (f12aa)).
The array comm output by the preceding call to nag_sparseig_real_iter (f12ab).

None.

None.

### Output Parameters

1:     niter – int64int32nag_int scalar
The number of the current Arnoldi iteration.
2:     nconv – int64int32nag_int scalar
The number of converged eigenvalues so far.
3:     ritzr( : $:$) – double array
Note: the dimension of the array ritzr must be at least ncv${\mathbf{ncv}}$ (see nag_sparseig_real_init (f12aa)).
The first nconv locations of the array ritzr contain the real parts of the converged approximate eigenvalues.
4:     ritzi( : $:$) – double array
Note: the dimension of the array ritzi must be at least ncv${\mathbf{ncv}}$ (see nag_sparseig_real_init (f12aa)).
The first nconv locations of the array ritzi contain the imaginary parts of the converged approximate eigenvalues.
5:     rzest( : $:$) – double array
Note: the dimension of the array rzest must be at least ncv${\mathbf{ncv}}$ (see nag_sparseig_real_init (f12aa)).
The first nconv locations of the array rzest contain the Ritz estimates (error bounds) on the converged approximate eigenvalues.

None.

## Accuracy

A Ritz value, λ $\lambda$, is deemed to have converged if its Ritz estimate Tolerance × |λ| $\le {\mathbf{Tolerance}}×|\lambda |$. The default Tolerance used is the machine precision given by nag_machine_precision (x02aj).

None.

## Example

```function nag_sparseig_real_monit_example
n = 100;
nev = 4;
ncv = 20;

h = 1/(double(n)+1);
rho = 10;
md = repmat(4*h, double(n), 1);
me = repmat(h, double(n-1), 1);

irevcm = int64(0);
resid = zeros(n,1);
v = zeros(n, ncv);
x = zeros(n, 1);
mx = zeros(n);

dd = 2/h;
dl = -1/h - rho/2;
du = -1/h + rho/2;
y = zeros(n,1);

[icomm, comm, ifail] = nag_sparseig_real_init(int64(n), int64(nev), int64(ncv));
[icomm, comm, ifail] = nag_sparseig_real_option('REGULAR INVERSE', icomm, comm);
[icomm, comm, ifail] = nag_sparseig_real_option('GENERALIZED', icomm, comm);

% Construct m and factorise
[md, me, info] = nag_lapack_dpttrf(md, me);

while (irevcm ~= 5)
[irevcm, resid, v, x, mx, nshift, comm, icomm, ifail] = ...
nag_sparseig_real_iter(irevcm, resid, v, x, mx, comm, icomm);
if (irevcm == -1 || irevcm == 1)
y(1) = dd*x(1) + du*x(2);
for i = 2:n-1
y(i) = dl*x(i-1) + dd*x(i) + du*x(i+1);
end
y(n) = dl*x(n-1) + dd*x(n);
[x, info] = nag_lapack_dpttrs(md, me, y);
elseif (irevcm == 2)
y(1) = 4*x(1) + x(2);
for i=2:n-1
y(i) = x(i-1) + 4*x(i) + x(i+1);
end
y(n) = x(n-1) + 4*x(n);
x = h*y;
elseif (irevcm == 4)
[niter, nconv, ritzr, ritzi, rzest] = nag_sparseig_real_monit(icomm, comm);
if (niter == 1)
fprintf('\n');
end
fprintf('Iteration %2d No. converged = %d Norm of estimates = %16.8e\n', niter, nconv, norm(rzest));
converged(niter,1) = nconv;
rzestNorms(niter,1) = norm(rzest);
end
end
[nconv, dr, di, z, v, comm, icomm, ifail] = nag_sparseig_real_proc(0, 0, resid, v, comm, icomm);
nconv, dr, di, ifail
```
```

Iteration  1 No. converged = 0 Norm of estimates =   5.56325675e+03
Iteration  2 No. converged = 0 Norm of estimates =   5.44836588e+03
Iteration  3 No. converged = 0 Norm of estimates =   5.30320774e+03
Iteration  4 No. converged = 0 Norm of estimates =   6.24234186e+03
Iteration  5 No. converged = 0 Norm of estimates =   7.15674705e+03
Iteration  6 No. converged = 0 Norm of estimates =   5.45460864e+03
Iteration  7 No. converged = 0 Norm of estimates =   6.43147571e+03
Iteration  8 No. converged = 0 Norm of estimates =   5.11241161e+03
Iteration  9 No. converged = 0 Norm of estimates =   7.19327824e+03
Iteration 10 No. converged = 1 Norm of estimates =   5.77945489e+03
Iteration 11 No. converged = 2 Norm of estimates =   4.73125738e+03
Iteration 12 No. converged = 3 Norm of estimates =   5.00078500e+03

nconv =

4

dr =

1.0e+04 *

2.0383
2.0339
2.0265
2.0163

di =

0
0
0
0

ifail =

0

```
```function f12ae_example
n = 100;
nev = 4;
ncv = 20;

h = 1/(double(n)+1);
rho = 10;
md = repmat(4*h, double(n), 1);
me = repmat(h, double(n-1), 1);

irevcm = int64(0);
resid = zeros(n,1);
v = zeros(n, ncv);
x = zeros(n, 1);
mx = zeros(n);

dd = 2/h;
dl = -1/h - rho/2;
du = -1/h + rho/2;
y = zeros(n,1);

[icomm, comm, ifail] = f12aa(int64(n), int64(nev), int64(ncv));
[icomm, comm, ifail] = f12ad('REGULAR INVERSE', icomm, comm);
[icomm, comm, ifail] = f12ad('GENERALIZED', icomm, comm);

% Construct m and factorise
[md, me, info] = f07jd(md, me);

while (irevcm ~= 5)
[irevcm, resid, v, x, mx, nshift, comm, icomm, ifail] = ...
f12ab(irevcm, resid, v, x, mx, comm, icomm);
if (irevcm == -1 || irevcm == 1)
y(1) = dd*x(1) + du*x(2);
for i = 2:n-1
y(i) = dl*x(i-1) + dd*x(i) + du*x(i+1);
end
y(n) = dl*x(n-1) + dd*x(n);
[x, info] = f07je(md, me, y);
elseif (irevcm == 2)
y(1) = 4*x(1) + x(2);
for i=2:n-1
y(i) = x(i-1) + 4*x(i) + x(i+1);
end
y(n) = x(n-1) + 4*x(n);
x = h*y;
elseif (irevcm == 4)
[niter, nconv, ritzr, ritzi, rzest] = f12ae(icomm, comm);
if (niter == 1)
fprintf('\n');
end
fprintf('Iteration %2d No. converged = %d Norm of estimates = %16.8e\n', ...
niter, nconv, norm(rzest));
converged(niter,1) = nconv;
rzestNorms(niter,1) = norm(rzest);
end
end
[nconv, dr, di, z, v, comm, icomm, ifail] = f12ac(0, 0, resid, v, comm, icomm);
nconv, dr, di, ifail
```
```

Iteration  1 No. converged = 0 Norm of estimates =   5.56325675e+03
Iteration  2 No. converged = 0 Norm of estimates =   5.44836588e+03
Iteration  3 No. converged = 0 Norm of estimates =   5.30320774e+03
Iteration  4 No. converged = 0 Norm of estimates =   6.24234186e+03
Iteration  5 No. converged = 0 Norm of estimates =   7.15674705e+03
Iteration  6 No. converged = 0 Norm of estimates =   5.45460864e+03
Iteration  7 No. converged = 0 Norm of estimates =   6.43147571e+03
Iteration  8 No. converged = 0 Norm of estimates =   5.11241161e+03
Iteration  9 No. converged = 0 Norm of estimates =   7.19327824e+03
Iteration 10 No. converged = 1 Norm of estimates =   5.77945489e+03
Iteration 11 No. converged = 2 Norm of estimates =   4.73125738e+03
Iteration 12 No. converged = 3 Norm of estimates =   5.00078500e+03

nconv =

4

dr =

1.0e+04 *

2.0383
2.0339
2.0265
2.0163

di =

0
0
0
0

ifail =

0

```