--- rpl/lapack/lapack/dlag2.f 2010/01/26 15:22:46 1.1.1.1 +++ rpl/lapack/lapack/dlag2.f 2023/08/07 08:38:54 1.19 @@ -1,10 +1,162 @@ +*> \brief \b DLAG2 computes the eigenvalues of a 2-by-2 generalized eigenvalue problem, with scaling as necessary to avoid over-/underflow. +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +*> \htmlonly +*> Download DLAG2 + dependencies +*> +*> [TGZ] +*> +*> [ZIP] +*> +*> [TXT] +*> \endhtmlonly +* +* Definition: +* =========== +* +* SUBROUTINE DLAG2( A, LDA, B, LDB, SAFMIN, SCALE1, SCALE2, WR1, +* WR2, WI ) +* +* .. Scalar Arguments .. +* INTEGER LDA, LDB +* DOUBLE PRECISION SAFMIN, SCALE1, SCALE2, WI, WR1, WR2 +* .. +* .. Array Arguments .. +* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) +* .. +* +* +*> \par Purpose: +* ============= +*> +*> \verbatim +*> +*> DLAG2 computes the eigenvalues of a 2 x 2 generalized eigenvalue +*> problem A - w B, with scaling as necessary to avoid over-/underflow. +*> +*> The scaling factor "s" results in a modified eigenvalue equation +*> +*> s A - w B +*> +*> where s is a non-negative scaling factor chosen so that w, w B, +*> and s A do not overflow and, if possible, do not underflow, either. +*> \endverbatim +* +* Arguments: +* ========== +* +*> \param[in] A +*> \verbatim +*> A is DOUBLE PRECISION array, dimension (LDA, 2) +*> On entry, the 2 x 2 matrix A. It is assumed that its 1-norm +*> is less than 1/SAFMIN. Entries less than +*> sqrt(SAFMIN)*norm(A) are subject to being treated as zero. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> The leading dimension of the array A. LDA >= 2. +*> \endverbatim +*> +*> \param[in] B +*> \verbatim +*> B is DOUBLE PRECISION array, dimension (LDB, 2) +*> On entry, the 2 x 2 upper triangular matrix B. It is +*> assumed that the one-norm of B is less than 1/SAFMIN. The +*> diagonals should be at least sqrt(SAFMIN) times the largest +*> element of B (in absolute value); if a diagonal is smaller +*> than that, then +/- sqrt(SAFMIN) will be used instead of +*> that diagonal. +*> \endverbatim +*> +*> \param[in] LDB +*> \verbatim +*> LDB is INTEGER +*> The leading dimension of the array B. LDB >= 2. +*> \endverbatim +*> +*> \param[in] SAFMIN +*> \verbatim +*> SAFMIN is DOUBLE PRECISION +*> The smallest positive number s.t. 1/SAFMIN does not +*> overflow. (This should always be DLAMCH('S') -- it is an +*> argument in order to avoid having to call DLAMCH frequently.) +*> \endverbatim +*> +*> \param[out] SCALE1 +*> \verbatim +*> SCALE1 is DOUBLE PRECISION +*> A scaling factor used to avoid over-/underflow in the +*> eigenvalue equation which defines the first eigenvalue. If +*> the eigenvalues are complex, then the eigenvalues are +*> ( WR1 +/- WI i ) / SCALE1 (which may lie outside the +*> exponent range of the machine), SCALE1=SCALE2, and SCALE1 +*> will always be positive. If the eigenvalues are real, then +*> the first (real) eigenvalue is WR1 / SCALE1 , but this may +*> overflow or underflow, and in fact, SCALE1 may be zero or +*> less than the underflow threshold if the exact eigenvalue +*> is sufficiently large. +*> \endverbatim +*> +*> \param[out] SCALE2 +*> \verbatim +*> SCALE2 is DOUBLE PRECISION +*> A scaling factor used to avoid over-/underflow in the +*> eigenvalue equation which defines the second eigenvalue. If +*> the eigenvalues are complex, then SCALE2=SCALE1. If the +*> eigenvalues are real, then the second (real) eigenvalue is +*> WR2 / SCALE2 , but this may overflow or underflow, and in +*> fact, SCALE2 may be zero or less than the underflow +*> threshold if the exact eigenvalue is sufficiently large. +*> \endverbatim +*> +*> \param[out] WR1 +*> \verbatim +*> WR1 is DOUBLE PRECISION +*> If the eigenvalue is real, then WR1 is SCALE1 times the +*> eigenvalue closest to the (2,2) element of A B**(-1). If the +*> eigenvalue is complex, then WR1=WR2 is SCALE1 times the real +*> part of the eigenvalues. +*> \endverbatim +*> +*> \param[out] WR2 +*> \verbatim +*> WR2 is DOUBLE PRECISION +*> If the eigenvalue is real, then WR2 is SCALE2 times the +*> other eigenvalue. If the eigenvalue is complex, then +*> WR1=WR2 is SCALE1 times the real part of the eigenvalues. +*> \endverbatim +*> +*> \param[out] WI +*> \verbatim +*> WI is DOUBLE PRECISION +*> If the eigenvalue is real, then WI is zero. If the +*> eigenvalue is complex, then WI is SCALE1 times the imaginary +*> part of the eigenvalues. WI will always be non-negative. +*> \endverbatim +* +* Authors: +* ======== +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \ingroup doubleOTHERauxiliary +* +* ===================================================================== SUBROUTINE DLAG2( A, LDA, B, LDB, SAFMIN, SCALE1, SCALE2, WR1, $ WR2, WI ) * -* -- LAPACK auxiliary routine (version 3.2) -- +* -- LAPACK auxiliary routine -- * -- LAPACK is a software package provided by Univ. of Tennessee, -- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- -* November 2006 * * .. Scalar Arguments .. INTEGER LDA, LDB @@ -14,83 +166,6 @@ DOUBLE PRECISION A( LDA, * ), B( LDB, * ) * .. * -* Purpose -* ======= -* -* DLAG2 computes the eigenvalues of a 2 x 2 generalized eigenvalue -* problem A - w B, with scaling as necessary to avoid over-/underflow. -* -* The scaling factor "s" results in a modified eigenvalue equation -* -* s A - w B -* -* where s is a non-negative scaling factor chosen so that w, w B, -* and s A do not overflow and, if possible, do not underflow, either. -* -* Arguments -* ========= -* -* A (input) DOUBLE PRECISION array, dimension (LDA, 2) -* On entry, the 2 x 2 matrix A. It is assumed that its 1-norm -* is less than 1/SAFMIN. Entries less than -* sqrt(SAFMIN)*norm(A) are subject to being treated as zero. -* -* LDA (input) INTEGER -* The leading dimension of the array A. LDA >= 2. -* -* B (input) DOUBLE PRECISION array, dimension (LDB, 2) -* On entry, the 2 x 2 upper triangular matrix B. It is -* assumed that the one-norm of B is less than 1/SAFMIN. The -* diagonals should be at least sqrt(SAFMIN) times the largest -* element of B (in absolute value); if a diagonal is smaller -* than that, then +/- sqrt(SAFMIN) will be used instead of -* that diagonal. -* -* LDB (input) INTEGER -* The leading dimension of the array B. LDB >= 2. -* -* SAFMIN (input) DOUBLE PRECISION -* The smallest positive number s.t. 1/SAFMIN does not -* overflow. (This should always be DLAMCH('S') -- it is an -* argument in order to avoid having to call DLAMCH frequently.) -* -* SCALE1 (output) DOUBLE PRECISION -* A scaling factor used to avoid over-/underflow in the -* eigenvalue equation which defines the first eigenvalue. If -* the eigenvalues are complex, then the eigenvalues are -* ( WR1 +/- WI i ) / SCALE1 (which may lie outside the -* exponent range of the machine), SCALE1=SCALE2, and SCALE1 -* will always be positive. If the eigenvalues are real, then -* the first (real) eigenvalue is WR1 / SCALE1 , but this may -* overflow or underflow, and in fact, SCALE1 may be zero or -* less than the underflow threshhold if the exact eigenvalue -* is sufficiently large. -* -* SCALE2 (output) DOUBLE PRECISION -* A scaling factor used to avoid over-/underflow in the -* eigenvalue equation which defines the second eigenvalue. If -* the eigenvalues are complex, then SCALE2=SCALE1. If the -* eigenvalues are real, then the second (real) eigenvalue is -* WR2 / SCALE2 , but this may overflow or underflow, and in -* fact, SCALE2 may be zero or less than the underflow -* threshhold if the exact eigenvalue is sufficiently large. -* -* WR1 (output) DOUBLE PRECISION -* If the eigenvalue is real, then WR1 is SCALE1 times the -* eigenvalue closest to the (2,2) element of A B**(-1). If the -* eigenvalue is complex, then WR1=WR2 is SCALE1 times the real -* part of the eigenvalues. -* -* WR2 (output) DOUBLE PRECISION -* If the eigenvalue is real, then WR2 is SCALE2 times the -* other eigenvalue. If the eigenvalue is complex, then -* WR1=WR2 is SCALE1 times the real part of the eigenvalues. -* -* WI (output) DOUBLE PRECISION -* If the eigenvalue is real, then WI is zero. If the -* eigenvalue is complex, then WI is SCALE1 times the imaginary -* part of the eigenvalues. WI will always be non-negative. -* * ===================================================================== * * .. Parameters .. @@ -188,8 +263,8 @@ * Note: the test of R in the following IF is to cover the case when * DISCR is small and negative and is flushed to zero during * the calculation of R. On machines which have a consistent -* flush-to-zero threshhold and handle numbers above that -* threshhold correctly, it would not be necessary. +* flush-to-zero threshold and handle numbers above that +* threshold correctly, it would not be necessary. * IF( DISCR.GE.ZERO .OR. R.EQ.ZERO ) THEN SUM = PP + SIGN( R, PP )