/* -- translated by f2c (version 20100827).
You must link the resulting object file with libf2c:
on Microsoft Windows system, link with libf2c.lib;
on Linux or Unix systems, link with .../path/to/libf2c.a -lm
or, if you install libf2c.a in a standard place, with -lf2c -lm
-- in that order, at the end of the command line, as in
cc *.o -lf2c -lm
Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
http://www.netlib.org/f2c/libf2c.zip
*/
#include "f2c.h"
/* Table of constant values */
static integer c__1 = 1;
/* -----------------------------------------------------------------------
\BeginDoc
\Name: dseigt
\Description:
Compute the eigenvalues of the current symmetric tridiagonal matrix
and the corresponding error bounds given the current residual norm.
\Usage:
call dseigt
( RNORM, N, H, LDH, EIG, BOUNDS, WORKL, IERR )
\Arguments
RNORM Double precision scalar. (INPUT)
RNORM contains the residual norm corresponding to the current
symmetric tridiagonal matrix H.
N Integer. (INPUT)
Size of the symmetric tridiagonal matrix H.
H Double precision N by 2 array. (INPUT)
H contains the symmetric tridiagonal matrix with the
subdiagonal in the first column starting at H(2,1) and the
main diagonal in second column.
LDH Integer. (INPUT)
Leading dimension of H exactly as declared in the calling
program.
EIG Double precision array of length N. (OUTPUT)
On output, EIG contains the N eigenvalues of H possibly
unsorted. The BOUNDS arrays are returned in the
same sorted order as EIG.
BOUNDS Double precision array of length N. (OUTPUT)
On output, BOUNDS contains the error estimates corresponding
to the eigenvalues EIG. This is equal to RNORM times the
last components of the eigenvectors corresponding to the
eigenvalues in EIG.
WORKL Double precision work array of length 3*N. (WORKSPACE)
Private (replicated) array on each PE or array allocated on
the front end.
IERR Integer. (OUTPUT)
Error exit flag from dstqrb.
\EndDoc
-----------------------------------------------------------------------
\BeginLib
\Local variables:
xxxxxx real
\Routines called:
dstqrb ARPACK routine that computes the eigenvalues and the
last components of the eigenvectors of a symmetric
and tridiagonal matrix.
second ARPACK utility routine for timing.
dvout ARPACK utility routine that prints vectors.
dcopy Level 1 BLAS that copies one vector to another.
\Author
Danny Sorensen Phuong Vu
Richard Lehoucq CRPC / Rice University
Dept. of Computational & Houston, Texas
Applied Mathematics
Rice University
Houston, Texas
\Revision history:
xx/xx/92: Version ' 2.4'
\SCCS Information: @(#)
FILE: seigt.F SID: 2.4 DATE OF SID: 8/27/96 RELEASE: 2
\Remarks
None
\EndLib
-----------------------------------------------------------------------
Subroutine */ int igraphdseigt_(doublereal *rnorm, integer *n, doublereal *h__,
integer *ldh, doublereal *eig, doublereal *bounds, doublereal *workl,
integer *ierr)
{
/* System generated locals */
integer h_dim1, h_offset, i__1;
doublereal d__1;
/* Local variables */
integer k;
real t0, t1;
extern /* Subroutine */ int igraphdcopy_(integer *, doublereal *, integer *,
doublereal *, integer *), igraphdvout_(integer *, integer *, doublereal
*, integer *, char *, ftnlen), igraphsecond_(real *);
integer logfil, ndigit, mseigt = 0;
extern /* Subroutine */ int igraphdstqrb_(integer *, doublereal *, doublereal *,
doublereal *, doublereal *, integer *);
real tseigt = 0.0;
integer msglvl;
/* %----------------------------------------------------%
| Include files for debugging and timing information |
%----------------------------------------------------%
%------------------%
| Scalar Arguments |
%------------------%
%-----------------%
| Array Arguments |
%-----------------%
%------------%
| Parameters |
%------------%
%---------------%
| Local Scalars |
%---------------%
%----------------------%
| External Subroutines |
%----------------------%
%-----------------------%
| Executable Statements |
%-----------------------%
%-------------------------------%
| Initialize timing statistics |
| & message level for debugging |
%-------------------------------%
Parameter adjustments */
--workl;
--bounds;
--eig;
h_dim1 = *ldh;
h_offset = 1 + h_dim1;
h__ -= h_offset;
/* Function Body */
igraphsecond_(&t0);
msglvl = mseigt;
if (msglvl > 0) {
igraphdvout_(&logfil, n, &h__[(h_dim1 << 1) + 1], &ndigit, "_seigt: main d"
"iagonal of matrix H", (ftnlen)33);
if (*n > 1) {
i__1 = *n - 1;
igraphdvout_(&logfil, &i__1, &h__[h_dim1 + 2], &ndigit, "_seigt: sub d"
"iagonal of matrix H", (ftnlen)32);
}
}
igraphdcopy_(n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
i__1 = *n - 1;
igraphdcopy_(&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
igraphdstqrb_(n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
if (*ierr != 0) {
goto L9000;
}
if (msglvl > 1) {
igraphdvout_(&logfil, n, &bounds[1], &ndigit, "_seigt: last row of the eig"
"envector matrix for H", (ftnlen)48);
}
/* %-----------------------------------------------%
| Finally determine the error bounds associated |
| with the n Ritz values of H. |
%-----------------------------------------------% */
i__1 = *n;
for (k = 1; k <= i__1; ++k) {
bounds[k] = *rnorm * (d__1 = bounds[k], abs(d__1));
/* L30: */
}
igraphsecond_(&t1);
tseigt += t1 - t0;
L9000:
return 0;
/* %---------------%
| End of dseigt |
%---------------% */
} /* igraphdseigt_ */