Our example diffusion code, based on Fourier's original paper and on the IBM example code, which we have discussed in P573, called two important subroutines from the PESSL library: the first one was the FFT subroutine, and we have dedicated the previous chapter, 2, to Fast Fourier Transform, the second one was the Eigenvalue problem routine.

At this stage you should review section ``The Eigenvalue Problem'' in P573 before proceeding.

The Eigenvalue problem, in short, is about finding a non-zero
solution to the following equation:

(3.1) |

As I have already mentioned before, if
**A** is a
*normal* matrix, i.e., if

(3.2) |

then there exists a rotation such that

(3.3) |

If
**A** is *defective*, i.e., if it is
*not* normal, then there is still a linear transformation
**X** such that

(3.4) |

but this transformation is no longer of .

But whichever is the case the columns of either
or
**X** are simply eigenvectors of
**A** that correspond
to appropriate s.

There are actually two types of eigenvectors, which are referred to as
left and right eigenvectors. If you took to heart what I have told
you about vectors and forms in the past, you will recognise now
that right eigenvectors are vectors, and left eigenvectors are
forms, and that an orthogonality relationship exists between
the two:

This is the case even for the

The way most eigenproblem routines work is that matrix
**A**is nudged, usually iteratively, towards a diagonal form
by a sequence of linear transformations:

Once the resulting matrix is diagonal, up to the required accuracy, eigenvectors are returned in

The solution of an eigenproblem may get quite complicated and costly. Public domain eigenproblem routines are available within LAPACK, e.g.,:

**CGEEV**- compute for an
complex nonsymmetric
matrix
**A**the eigenvalues and, optionally, the left and/or right eigenvectors **CHBEV**- compute all the eigenvalues and, optionally,
eigenvectors of a complex Hermitian band matrix
**A** **CPTEQR**- compute all eigenvalues and, optionally, eigenvectors of a symmetric positive definite tridiagonal matrix
**DGEEV**- compute for an
real nonsymmetric matrix
**A**, the eigenvalues, and, optionally, the lef and/or right eigenvectors **DSBEV**- compute all the eigenvalues and, optionally,
eigenvectors of a real symmetric band matrix
**A** **DSPEV**- compute all the eigenvalues and, optionally,
eigenvectors of a real symmetric matrix
**A**in packed storage **DSYEV**- compute all eigenvalues and, optionally,
eigenvectors of a real symmetric tridiagonal matrix
**A**

Normally you would want such specialised routines to cover at least the following:

- real, symmetric, tridiagonal
- real, symmetric, banded
- real, symmetric
- real, nonsymmetric
- complex, Hermitian
- complex, non-Hermitian