--- rpl/lapack/lapack/zlar1v.f 2011/07/22 07:38:17 1.8 +++ rpl/lapack/lapack/zlar1v.f 2011/11/21 20:43:16 1.9 @@ -1,11 +1,239 @@ +*> \brief \b ZLAR1V +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download ZLAR1V + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE ZLAR1V( N, B1, BN, LAMBDA, D, L, LD, LLD, +* PIVMIN, GAPTOL, Z, WANTNC, NEGCNT, ZTZ, MINGMA, +* R, ISUPPZ, NRMINV, RESID, RQCORR, WORK ) +* +* .. Scalar Arguments .. +* LOGICAL WANTNC +* INTEGER B1, BN, N, NEGCNT, R +* DOUBLE PRECISION GAPTOL, LAMBDA, MINGMA, NRMINV, PIVMIN, RESID, +* $ RQCORR, ZTZ +* .. +* .. Array Arguments .. +* INTEGER ISUPPZ( * ) +* DOUBLE PRECISION D( * ), L( * ), LD( * ), LLD( * ), +* $ WORK( * ) +* COMPLEX*16 Z( * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> ZLAR1V computes the (scaled) r-th column of the inverse of +*> the sumbmatrix in rows B1 through BN of the tridiagonal matrix +*> L D L**T - sigma I. When sigma is close to an eigenvalue, the +*> computed vector is an accurate eigenvector. Usually, r corresponds +*> to the index where the eigenvector is largest in magnitude. +*> The following steps accomplish this computation : +*> (a) Stationary qd transform, L D L**T - sigma I = L(+) D(+) L(+)**T, +*> (b) Progressive qd transform, L D L**T - sigma I = U(-) D(-) U(-)**T, +*> (c) Computation of the diagonal elements of the inverse of +*> L D L**T - sigma I by combining the above transforms, and choosing +*> r as the index where the diagonal of the inverse is (one of the) +*> largest in magnitude. +*> (d) Computation of the (scaled) r-th column of the inverse using the +*> twisted factorization obtained by combining the top part of the +*> the stationary and the bottom part of the progressive transform. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> The order of the matrix L D L**T. +*> \endverbatim +*> +*> \param[in] B1 +*> \verbatim +*> B1 is INTEGER +*> First index of the submatrix of L D L**T. +*> \endverbatim +*> +*> \param[in] BN +*> \verbatim +*> BN is INTEGER +*> Last index of the submatrix of L D L**T. +*> \endverbatim +*> +*> \param[in] LAMBDA +*> \verbatim +*> LAMBDA is DOUBLE PRECISION +*> The shift. In order to compute an accurate eigenvector, +*> LAMBDA should be a good approximation to an eigenvalue +*> of L D L**T. +*> \endverbatim +*> +*> \param[in] L +*> \verbatim +*> L is DOUBLE PRECISION array, dimension (N-1) +*> The (n-1) subdiagonal elements of the unit bidiagonal matrix +*> L, in elements 1 to N-1. +*> \endverbatim +*> +*> \param[in] D +*> \verbatim +*> D is DOUBLE PRECISION array, dimension (N) +*> The n diagonal elements of the diagonal matrix D. +*> \endverbatim +*> +*> \param[in] LD +*> \verbatim +*> LD is DOUBLE PRECISION array, dimension (N-1) +*> The n-1 elements L(i)*D(i). +*> \endverbatim +*> +*> \param[in] LLD +*> \verbatim +*> LLD is DOUBLE PRECISION array, dimension (N-1) +*> The n-1 elements L(i)*L(i)*D(i). +*> \endverbatim +*> +*> \param[in] PIVMIN +*> \verbatim +*> PIVMIN is DOUBLE PRECISION +*> The minimum pivot in the Sturm sequence. +*> \endverbatim +*> +*> \param[in] GAPTOL +*> \verbatim +*> GAPTOL is DOUBLE PRECISION +*> Tolerance that indicates when eigenvector entries are negligible +*> w.r.t. their contribution to the residual. +*> \endverbatim +*> +*> \param[in,out] Z +*> \verbatim +*> Z is COMPLEX*16 array, dimension (N) +*> On input, all entries of Z must be set to 0. +*> On output, Z contains the (scaled) r-th column of the +*> inverse. The scaling is such that Z(R) equals 1. +*> \endverbatim +*> +*> \param[in] WANTNC +*> \verbatim +*> WANTNC is LOGICAL +*> Specifies whether NEGCNT has to be computed. +*> \endverbatim +*> +*> \param[out] NEGCNT +*> \verbatim +*> NEGCNT is INTEGER +*> If WANTNC is .TRUE. then NEGCNT = the number of pivots < pivmin +*> in the matrix factorization L D L**T, and NEGCNT = -1 otherwise. +*> \endverbatim +*> +*> \param[out] ZTZ +*> \verbatim +*> ZTZ is DOUBLE PRECISION +*> The square of the 2-norm of Z. +*> \endverbatim +*> +*> \param[out] MINGMA +*> \verbatim +*> MINGMA is DOUBLE PRECISION +*> The reciprocal of the largest (in magnitude) diagonal +*> element of the inverse of L D L**T - sigma I. +*> \endverbatim +*> +*> \param[in,out] R +*> \verbatim +*> R is INTEGER +*> The twist index for the twisted factorization used to +*> compute Z. +*> On input, 0 <= R <= N. If R is input as 0, R is set to +*> the index where (L D L**T - sigma I)^{-1} is largest +*> in magnitude. If 1 <= R <= N, R is unchanged. +*> On output, R contains the twist index used to compute Z. +*> Ideally, R designates the position of the maximum entry in the +*> eigenvector. +*> \endverbatim +*> +*> \param[out] ISUPPZ +*> \verbatim +*> ISUPPZ is INTEGER array, dimension (2) +*> The support of the vector in Z, i.e., the vector Z is +*> nonzero only in elements ISUPPZ(1) through ISUPPZ( 2 ). +*> \endverbatim +*> +*> \param[out] NRMINV +*> \verbatim +*> NRMINV is DOUBLE PRECISION +*> NRMINV = 1/SQRT( ZTZ ) +*> \endverbatim +*> +*> \param[out] RESID +*> \verbatim +*> RESID is DOUBLE PRECISION +*> The residual of the FP vector. +*> RESID = ABS( MINGMA )/SQRT( ZTZ ) +*> \endverbatim +*> +*> \param[out] RQCORR +*> \verbatim +*> RQCORR is DOUBLE PRECISION +*> The Rayleigh Quotient correction to LAMBDA. +*> RQCORR = MINGMA*TMP +*> \endverbatim +*> +*> \param[out] WORK +*> \verbatim +*> WORK is DOUBLE PRECISION array, dimension (4*N) +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex16OTHERauxiliary +* +*> \par Contributors: +* ================== +*> +*> Beresford Parlett, University of California, Berkeley, USA \n +*> Jim Demmel, University of California, Berkeley, USA \n +*> Inderjit Dhillon, University of Texas, Austin, USA \n +*> Osni Marques, LBNL/NERSC, USA \n +*> Christof Voemel, University of California, Berkeley, USA +* +* ===================================================================== SUBROUTINE ZLAR1V( N, B1, BN, LAMBDA, D, L, LD, LLD, $ PIVMIN, GAPTOL, Z, WANTNC, NEGCNT, ZTZ, MINGMA, $ R, ISUPPZ, NRMINV, RESID, RQCORR, WORK ) * -* -- LAPACK auxiliary routine (version 3.3.1) -- +* -- LAPACK auxiliary routine (version 3.4.0) -- * -- LAPACK is a software package provided by Univ. of Tennessee, -- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* -- April 2011 -- +* November 2011 * * .. Scalar Arguments .. LOGICAL WANTNC @@ -20,118 +248,6 @@ COMPLEX*16 Z( * ) * .. * -* Purpose -* ======= -* -* ZLAR1V computes the (scaled) r-th column of the inverse of -* the sumbmatrix in rows B1 through BN of the tridiagonal matrix -* L D L**T - sigma I. When sigma is close to an eigenvalue, the -* computed vector is an accurate eigenvector. Usually, r corresponds -* to the index where the eigenvector is largest in magnitude. -* The following steps accomplish this computation : -* (a) Stationary qd transform, L D L**T - sigma I = L(+) D(+) L(+)**T, -* (b) Progressive qd transform, L D L**T - sigma I = U(-) D(-) U(-)**T, -* (c) Computation of the diagonal elements of the inverse of -* L D L**T - sigma I by combining the above transforms, and choosing -* r as the index where the diagonal of the inverse is (one of the) -* largest in magnitude. -* (d) Computation of the (scaled) r-th column of the inverse using the -* twisted factorization obtained by combining the top part of the -* the stationary and the bottom part of the progressive transform. -* -* Arguments -* ========= -* -* N (input) INTEGER -* The order of the matrix L D L**T. -* -* B1 (input) INTEGER -* First index of the submatrix of L D L**T. -* -* BN (input) INTEGER -* Last index of the submatrix of L D L**T. -* -* LAMBDA (input) DOUBLE PRECISION -* The shift. In order to compute an accurate eigenvector, -* LAMBDA should be a good approximation to an eigenvalue -* of L D L**T. -* -* L (input) DOUBLE PRECISION array, dimension (N-1) -* The (n-1) subdiagonal elements of the unit bidiagonal matrix -* L, in elements 1 to N-1. -* -* D (input) DOUBLE PRECISION array, dimension (N) -* The n diagonal elements of the diagonal matrix D. -* -* LD (input) DOUBLE PRECISION array, dimension (N-1) -* The n-1 elements L(i)*D(i). -* -* LLD (input) DOUBLE PRECISION array, dimension (N-1) -* The n-1 elements L(i)*L(i)*D(i). -* -* PIVMIN (input) DOUBLE PRECISION -* The minimum pivot in the Sturm sequence. -* -* GAPTOL (input) DOUBLE PRECISION -* Tolerance that indicates when eigenvector entries are negligible -* w.r.t. their contribution to the residual. -* -* Z (input/output) COMPLEX*16 array, dimension (N) -* On input, all entries of Z must be set to 0. -* On output, Z contains the (scaled) r-th column of the -* inverse. The scaling is such that Z(R) equals 1. -* -* WANTNC (input) LOGICAL -* Specifies whether NEGCNT has to be computed. -* -* NEGCNT (output) INTEGER -* If WANTNC is .TRUE. then NEGCNT = the number of pivots < pivmin -* in the matrix factorization L D L**T, and NEGCNT = -1 otherwise. -* -* ZTZ (output) DOUBLE PRECISION -* The square of the 2-norm of Z. -* -* MINGMA (output) DOUBLE PRECISION -* The reciprocal of the largest (in magnitude) diagonal -* element of the inverse of L D L**T - sigma I. -* -* R (input/output) INTEGER -* The twist index for the twisted factorization used to -* compute Z. -* On input, 0 <= R <= N. If R is input as 0, R is set to -* the index where (L D L**T - sigma I)^{-1} is largest -* in magnitude. If 1 <= R <= N, R is unchanged. -* On output, R contains the twist index used to compute Z. -* Ideally, R designates the position of the maximum entry in the -* eigenvector. -* -* ISUPPZ (output) INTEGER array, dimension (2) -* The support of the vector in Z, i.e., the vector Z is -* nonzero only in elements ISUPPZ(1) through ISUPPZ( 2 ). -* -* NRMINV (output) DOUBLE PRECISION -* NRMINV = 1/SQRT( ZTZ ) -* -* RESID (output) DOUBLE PRECISION -* The residual of the FP vector. -* RESID = ABS( MINGMA )/SQRT( ZTZ ) -* -* RQCORR (output) DOUBLE PRECISION -* The Rayleigh Quotient correction to LAMBDA. -* RQCORR = MINGMA*TMP -* -* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) -* -* Further Details -* =============== -* -* Based on contributions by -* Beresford Parlett, University of California, Berkeley, USA -* Jim Demmel, University of California, Berkeley, USA -* Inderjit Dhillon, University of Texas, Austin, USA -* Osni Marques, LBNL/NERSC, USA -* Christof Voemel, University of California, Berkeley, USA -* * ===================================================================== * * .. Parameters ..