/* fortran/dlaed5.f -- translated by f2c (version 20200916). 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 */ #ifdef __cplusplus extern "C" { #endif #include "lmp_f2c.h" /* > \brief \b DLAED5 used by DSTEDC. Solves the 2-by-2 secular equation. */ /* =========== DOCUMENTATION =========== */ /* Online html documentation available at */ /* http://www.netlib.org/lapack/explore-html/ */ /* > \htmlonly */ /* > Download DLAED5 + dependencies */ /* > */ /* > [TGZ] */ /* > */ /* > [ZIP] */ /* > */ /* > [TXT] */ /* > \endhtmlonly */ /* Definition: */ /* =========== */ /* SUBROUTINE DLAED5( I, D, Z, DELTA, RHO, DLAM ) */ /* .. Scalar Arguments .. */ /* INTEGER I */ /* DOUBLE PRECISION DLAM, RHO */ /* .. */ /* .. Array Arguments .. */ /* DOUBLE PRECISION D( 2 ), DELTA( 2 ), Z( 2 ) */ /* .. */ /* > \par Purpose: */ /* ============= */ /* > */ /* > \verbatim */ /* > */ /* > This subroutine computes the I-th eigenvalue of a symmetric rank-one */ /* > modification of a 2-by-2 diagonal matrix */ /* > */ /* > diag( D ) + RHO * Z * transpose(Z) . */ /* > */ /* > The diagonal elements in the array D are assumed to satisfy */ /* > */ /* > D(i) < D(j) for i < j . */ /* > */ /* > We also assume RHO > 0 and that the Euclidean norm of the vector */ /* > Z is one. */ /* > \endverbatim */ /* Arguments: */ /* ========== */ /* > \param[in] I */ /* > \verbatim */ /* > I is INTEGER */ /* > The index of the eigenvalue to be computed. I = 1 or I = 2. */ /* > \endverbatim */ /* > */ /* > \param[in] D */ /* > \verbatim */ /* > D is DOUBLE PRECISION array, dimension (2) */ /* > The original eigenvalues. We assume D(1) < D(2). */ /* > \endverbatim */ /* > */ /* > \param[in] Z */ /* > \verbatim */ /* > Z is DOUBLE PRECISION array, dimension (2) */ /* > The components of the updating vector. */ /* > \endverbatim */ /* > */ /* > \param[out] DELTA */ /* > \verbatim */ /* > DELTA is DOUBLE PRECISION array, dimension (2) */ /* > The vector DELTA contains the information necessary */ /* > to construct the eigenvectors. */ /* > \endverbatim */ /* > */ /* > \param[in] RHO */ /* > \verbatim */ /* > RHO is DOUBLE PRECISION */ /* > The scalar in the symmetric updating formula. */ /* > \endverbatim */ /* > */ /* > \param[out] DLAM */ /* > \verbatim */ /* > DLAM is DOUBLE PRECISION */ /* > The computed lambda_I, the I-th updated eigenvalue. */ /* > \endverbatim */ /* Authors: */ /* ======== */ /* > \author Univ. of Tennessee */ /* > \author Univ. of California Berkeley */ /* > \author Univ. of Colorado Denver */ /* > \author NAG Ltd. */ /* > \ingroup auxOTHERcomputational */ /* > \par Contributors: */ /* ================== */ /* > */ /* > Ren-Cang Li, Computer Science Division, University of California */ /* > at Berkeley, USA */ /* > */ /* ===================================================================== */ /* Subroutine */ int dlaed5_(integer *i__, doublereal *d__, doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dlam) { /* System generated locals */ doublereal d__1; /* Builtin functions */ double sqrt(doublereal); /* Local variables */ doublereal b, c__, w, del, tau, temp; /* -- LAPACK computational routine -- */ /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */ /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Executable Statements .. */ /* Parameter adjustments */ --delta; --z__; --d__; /* Function Body */ del = d__[2] - d__[1]; if (*i__ == 1) { w = *rho * 2. * (z__[2] * z__[2] - z__[1] * z__[1]) / del + 1.; if (w > 0.) { b = del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[1] * z__[1] * del; /* B > ZERO, always */ tau = c__ * 2. / (b + sqrt((d__1 = b * b - c__ * 4., abs(d__1)))); *dlam = d__[1] + tau; delta[1] = -z__[1] / tau; delta[2] = z__[2] / (del - tau); } else { b = -del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[2] * z__[2] * del; if (b > 0.) { tau = c__ * -2. / (b + sqrt(b * b + c__ * 4.)); } else { tau = (b - sqrt(b * b + c__ * 4.)) / 2.; } *dlam = d__[2] + tau; delta[1] = -z__[1] / (del + tau); delta[2] = -z__[2] / tau; } temp = sqrt(delta[1] * delta[1] + delta[2] * delta[2]); delta[1] /= temp; delta[2] /= temp; } else { /* Now I=2 */ b = -del + *rho * (z__[1] * z__[1] + z__[2] * z__[2]); c__ = *rho * z__[2] * z__[2] * del; if (b > 0.) { tau = (b + sqrt(b * b + c__ * 4.)) / 2.; } else { tau = c__ * 2. / (-b + sqrt(b * b + c__ * 4.)); } *dlam = d__[2] + tau; delta[1] = -z__[1] / (del + tau); delta[2] = -z__[2] / tau; temp = sqrt(delta[1] * delta[1] + delta[2] * delta[2]); delta[1] /= temp; delta[2] /= temp; } return 0; /* End of DLAED5 */ } /* dlaed5_ */ #ifdef __cplusplus } #endif