PDSTEDC - tridiagonal matrix in parallel, using the divide and conquer algorithm
- SUBROUTINE PDSTEDC(
- COMPZ, N, D, E, Q, IQ, JQ, DESCQ, WORK, LWORK, IWORK, LIWORK, INFO )
CHARACTER COMPZ INTEGER INFO, IQ, JQ, LIWORK, LWORK, N INTEGER DESCQ( * ),
IWORK( * ) DOUBLE PRECISION D( * ), E( * ), Q( * ), WORK( * )
symmetric tridiagonal matrix in parallel, using the divide and conquer
algorithm. This code makes very mild assumptions about floating point
arithmetic. It will work on machines with a guard digit in add/subtract, or on
those binary machines without guard digits which subtract like the Cray X-MP,
Cray Y-MP, Cray C-90, or Cray-2. It could conceivably fail on hexadecimal or
decimal machines without guard digits, but we know of none. See DLAED3 for
details.
- COMPZ (input) CHARACTER*1
- = 'N': Compute eigenvalues only. (NOT IMPLEMENTED YET)
= 'I': Compute eigenvectors of tridiagonal matrix also.
= 'V': Compute eigenvectors of original dense symmetric matrix also. On
entry, Z contains the orthogonal matrix used to reduce the original matrix
to tridiagonal form. (NOT IMPLEMENTED YET)
- N (global input) INTEGER
- The order of the tridiagonal matrix T. N >= 0.
- D (global input/output) DOUBLE PRECISION array, dimension (N)
- On entry, the diagonal elements of the tridiagonal matrix. On exit, if
INFO = 0, the eigenvalues in descending order.
- E (global input/output) DOUBLE PRECISION array, dimension (N-1)
- On entry, the subdiagonal elements of the tridiagonal matrix. On exit, E
has been destroyed.
- Q (local output) DOUBLE PRECISION array,
- local dimension ( LLD_Q, LOCc(JQ+N-1)) Q contains the orthonormal
eigenvectors of the symmetric tridiagonal matrix. On output, Q is
distributed across the P processes in block cyclic format.
- IQ (global input) INTEGER
- Q's global row index, which points to the beginning of the submatrix which
is to be operated on.
- JQ (global input) INTEGER
- Q's global column index, which points to the beginning of the submatrix
which is to be operated on.
- DESCQ (global and local input) INTEGER array of dimension DLEN_.
- The array descriptor for the distributed matrix Z.
- WORK (local workspace/output) DOUBLE PRECISION array,
- dimension (LWORK) On output, WORK(1) returns the workspace needed.
- LWORK (local input/output) INTEGER,
- the dimension of the array WORK. LWORK = 6*N + 2*NP*NQ NP = NUMROC( N, NB,
MYROW, DESCQ( RSRC_ ), NPROW ) NQ = NUMROC( N, NB, MYCOL, DESCQ( CSRC_ ),
NPCOL )
If LWORK = -1, the LWORK is global input and a workspace query is assumed;
the routine only calculates the minimum size for the WORK array. The
required workspace is returned as the first element of WORK and no error
message is issued by PXERBLA.
- IWORK (local workspace/output) INTEGER array, dimension (LIWORK)
- On exit, if LIWORK > 0, IWORK(1) returns the optimal LIWORK.
- LIWORK (input) INTEGER
- The dimension of the array IWORK. LIWORK = 2 + 7*N + 8*NPCOL
- INFO (global output) INTEGER
- = 0: successful exit
< 0: If the i-th argument is an array and the j-entry had an illegal
value, then INFO = -(i*100+j), if the i-th argument is a scalar and had an
illegal value, then INFO = -i. > 0: The algorithm failed to compute the
INFO/(N+1) th eigenvalue while working on the submatrix lying in global
rows and columns mod(INFO,N+1).
Contributed by Francoise Tisseur, University of Manchester.
Reference: F. Tisseur and J. Dongarra, "A Parallel Divide and
Conquer Algorithm for the Symmetric Eigenvalue Problem
on Distributed Memory Architectures",
SIAM J. Sci. Comput., 6:20 (1999), pp. 2223--2236.
(see also LAPACK Working Note 132)
http://www.netlib.org/lapack/lawns/lawn132.ps