First see Using ARPACK for Ordinary and Generalized Eigenvalue Problems in the Usage Notes section of this chapter. We describe here the Fortran 2003 usage of four basic problem types. There must be compiler support for the object-oriented features of Fortran 2003 to use these routines.
The generalized eigenvalue problemrequires that some eigenvalues and eigenvectors be
computed. The organization of the user-written function for matrix-vector
products depends on the part of the eigenvalue spectrum that is desired.
For an ordinary problem with symmetric and
, the eigenvalues of largest
or smallest magnitude can be computed by providing the operator products
. Here
is an input vector and
is the result of
applying the linear operator
to
. This process is repeated several times within the
Arnoldi algorithm, and the net result is a few eigenvalues of
and the corresponding eigenvectors.
For a generalized problem, it is useful and efficient to
consider a shift value and the ordinary eigenvalue
problem
. The matrix pencil
is non-singular. The
purpose of the user-written function is to provide results for the individual
operator products
,
, and
. Usually the inverse
matrix product will be computed by solving linear systems, where the matrix
pencil is the coefficient matrix. The desired eigenvalues of this ordinary
problem satisfy
.
In the special case thatis positive definite, well-conditioned, and symmetric, one may
compute the Cholesky decomposition
and then solve the ordinary eigenvalue problem
. The product operation required by the Arnoldi
algorithm,
, is performed in
steps: Solve
for
, compute
, and solve
for
. The eigenvectors,
, of
are transformed to those of the generalized problem,
, by solving
for
.
The operations required by ARPACK codes are returned as
array functions. An array of input values, x, will yield an output
array, y.
These functions are written by the user. They must be written according to
an abstract
interface, given below. There are two user functions, double
precision real and complex, that we support for the eigenvalue problem, and a
third for the singular value decomposition, using double precision real
data only. This interface, the named or enumerated constants that describe
what is needed, and the eigenvalue codes are in the module ARPACK_INT.
We use the notation: DKIND=kind(1.D0)
to specify two double precision data types: REAL(DKIND)
and COMPLEX(DKIND).
The interface SVDMV(...)
is for the singular value decomposition products only. For that problem
the components EXTYPE%MROWS
and EXTYPE%NCOLS
are switched between the operator sizes and
to account for computing
or
.
Abstract Interface
FUNCTION DMV(X, TASK, EXTYPE)RESULT(Y)
IMPORT DKIND, ARPACKBASE
REAL(DKIND), INTENT(INOUT) :: X(:)
INTEGER, INTENT(IN) :: TASK
CLASS (ARPACKBASE), INTENT(INOUT) :: EXTYPE
REAL(DKIND) Y(SIZE(X))
END FUNCTION
FUNCTION ZMV (X, TASK, EXTYPE) RESULT(Y)
IMPORT DKIND, ARPACKBASE
CLASS (ARPACKBASE), INTENT(INOUT) :: EXTYPE
COMPLEX (DKIND), INTENT(INOUT) :: X(:)
INTEGER, INTENT(IN) :: TASK
COMPLEX (DKIND) Y(SIZE(X))
END FUNCTION
FUNCTION SVDMV (X, TASK, EXTYPE) RESULT(Y)
IMPORT DKIND, ARPACKBASE
CLASS (ARPACKBASE), INTENT(INOUT) :: EXTYPE
REAL (DKIND), INTENT(INOUT) :: X(EXTYPE%NCOLS)
INTEGER, INTENT(IN) :: TASK
REAL (DKIND) Y(EXTYPE%MROWS)
END FUNCTION
End Interface
Figure 1 Abstract Interface for User-Written Array Functions
PHONE: 713.784.3131 FAX:713.781.9260 |