#include "ESMF_LapackBlas.inc" !> \brief \b DLAS2 ! ! =========== DOCUMENTATION =========== ! ! Online html documentation available at ! http://www.netlib.org/lapack/explore-html/ ! !> \htmlonly !> Download DLAS2 + dependencies !> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlas2.f"> !> [TGZ]</a> !> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlas2.f"> !> [ZIP]</a> !> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlas2.f"> !> [TXT]</a> !> \endhtmlonly ! ! Definition: ! =========== ! ! SUBROUTINE DLAS2( F, G, H, SSMIN, SSMAX ) ! ! .. Scalar Arguments .. ! DOUBLE PRECISION F, G, H, SSMAX, SSMIN ! .. ! ! !> \par Purpose: ! ============= !> !> \verbatim !> !> DLAS2 computes the singular values of the 2-by-2 matrix !> [ F G ] !> [ 0 H ]. !> On return, SSMIN is the smaller singular value and SSMAX is the !> larger singular value. !> \endverbatim ! ! Arguments: ! ========== ! !> \param[in] F !> \verbatim !> F is DOUBLE PRECISION !> The (1,1) element of the 2-by-2 matrix. !> \endverbatim !> !> \param[in] G !> \verbatim !> G is DOUBLE PRECISION !> The (1,2) element of the 2-by-2 matrix. !> \endverbatim !> !> \param[in] H !> \verbatim !> H is DOUBLE PRECISION !> The (2,2) element of the 2-by-2 matrix. !> \endverbatim !> !> \param[out] SSMIN !> \verbatim !> SSMIN is DOUBLE PRECISION !> The smaller singular value. !> \endverbatim !> !> \param[out] SSMAX !> \verbatim !> SSMAX is DOUBLE PRECISION !> The larger singular value. !> \endverbatim ! ! Authors: ! ======== ! !> \author Univ. of Tennessee !> \author Univ. of California Berkeley !> \author Univ. of Colorado Denver !> \author NAG Ltd. ! !> \date November 2011 ! !> \ingroup auxOTHERauxiliary ! !> \par Further Details: ! ===================== !> !> \verbatim !> !> Barring over/underflow, all output quantities are correct to within !> a few units in the last place (ulps), even in the absence of a guard !> digit in addition/subtraction. !> !> In IEEE arithmetic, the code works correctly if one matrix element is !> infinite. !> !> Overflow will not occur unless the largest singular value itself !> overflows, or is within a few ulps of overflow. (On machines with !> partial overflow, like the Cray, overflow may occur if the largest !> singular value is within a factor of 2 of overflow.) !> !> Underflow is harmless if underflow is gradual. Otherwise, results !> may correspond to a matrix modified by perturbations of size near !> the underflow threshold. !> \endverbatim !> ! ===================================================================== SUBROUTINE DLAS2( F, G, H, SSMIN, SSMAX ) ! ! -- 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..-- ! November 2011 ! ! .. Scalar Arguments .. DOUBLE PRECISION F, G, H, SSMAX, SSMIN ! .. ! ! ==================================================================== ! ! .. Parameters .. DOUBLE PRECISION ZERO PARAMETER ( ZERO = 0.0D0 ) DOUBLE PRECISION ONE PARAMETER ( ONE = 1.0D0 ) DOUBLE PRECISION TWO PARAMETER ( TWO = 2.0D0 ) ! .. ! .. Local Scalars .. DOUBLE PRECISION AS, AT, AU, C, FA, FHMN, FHMX, GA, HA ! .. ! .. Intrinsic Functions .. INTRINSIC ABS, MAX, MIN, SQRT ! .. ! .. Executable Statements .. ! FA = ABS( F ) GA = ABS( G ) HA = ABS( H ) FHMN = MIN( FA, HA ) FHMX = MAX( FA, HA ) IF( FHMN.EQ.ZERO ) THEN SSMIN = ZERO IF( FHMX.EQ.ZERO ) THEN SSMAX = GA ELSE SSMAX = MAX( FHMX, GA )*SQRT( ONE+ & & ( MIN( FHMX, GA ) / MAX( FHMX, GA ) )**2 ) END IF ELSE IF( GA.LT.FHMX ) THEN AS = ONE + FHMN / FHMX AT = ( FHMX-FHMN ) / FHMX AU = ( GA / FHMX )**2 C = TWO / ( SQRT( AS*AS+AU )+SQRT( AT*AT+AU ) ) SSMIN = FHMN*C SSMAX = FHMX / C ELSE AU = FHMX / GA IF( AU.EQ.ZERO ) THEN ! ! Avoid possible harmful underflow if exponent range ! asymmetric (true SSMIN may not underflow even if ! AU underflows) ! SSMIN = ( FHMN*FHMX ) / GA SSMAX = GA ELSE AS = ONE + FHMN / FHMX AT = ( FHMX-FHMN ) / FHMX C = ONE / ( SQRT( ONE+( AS*AU )**2 )+ & & SQRT( ONE+( AT*AU )**2 ) ) SSMIN = ( FHMN*C )*AU SSMIN = SSMIN + SSMIN SSMAX = GA / ( C+C ) END IF END IF END IF RETURN ! ! End of DLAS2 ! END