Annotation of rpl/lapack/lapack/dlartgs.f, revision 1.1
1.1 ! bertrand 1: SUBROUTINE DLARTGS( X, Y, SIGMA, CS, SN )
! 2: IMPLICIT NONE
! 3: *
! 4: * -- LAPACK routine (version 3.3.0) --
! 5: *
! 6: * -- Contributed by Brian Sutton of the Randolph-Macon College --
! 7: * -- November 2010
! 8: *
! 9: * -- LAPACK is a software package provided by Univ. of Tennessee, --
! 10: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
! 11: *
! 12: * .. Scalar Arguments ..
! 13: DOUBLE PRECISION CS, SIGMA, SN, X, Y
! 14: * ..
! 15: *
! 16: * Purpose
! 17: * =======
! 18: *
! 19: * DLARTGS generates a plane rotation designed to introduce a bulge in
! 20: * Golub-Reinsch-style implicit QR iteration for the bidiagonal SVD
! 21: * problem. X and Y are the top-row entries, and SIGMA is the shift.
! 22: * The computed CS and SN define a plane rotation satisfying
! 23: *
! 24: * [ CS SN ] . [ X^2 - SIGMA ] = [ R ],
! 25: * [ -SN CS ] [ X * Y ] [ 0 ]
! 26: *
! 27: * with R nonnegative. If X^2 - SIGMA and X * Y are 0, then the
! 28: * rotation is by PI/2.
! 29: *
! 30: * Arguments
! 31: * =========
! 32: *
! 33: * X (input) DOUBLE PRECISION
! 34: * The (1,1) entry of an upper bidiagonal matrix.
! 35: *
! 36: * Y (input) DOUBLE PRECISION
! 37: * The (1,2) entry of an upper bidiagonal matrix.
! 38: *
! 39: * SIGMA (input) DOUBLE PRECISION
! 40: * The shift.
! 41: *
! 42: * CS (output) DOUBLE PRECISION
! 43: * The cosine of the rotation.
! 44: *
! 45: * SN (output) DOUBLE PRECISION
! 46: * The sine of the rotation.
! 47: *
! 48: * ===================================================================
! 49: *
! 50: * .. Parameters ..
! 51: DOUBLE PRECISION NEGONE, ONE, ZERO
! 52: PARAMETER ( NEGONE = -1.0D0, ONE = 1.0D0, ZERO = 0.0D0 )
! 53: * ..
! 54: * .. Local Scalars ..
! 55: DOUBLE PRECISION R, S, THRESH, W, Z
! 56: * ..
! 57: * .. External Functions ..
! 58: DOUBLE PRECISION DLAMCH
! 59: EXTERNAL DLAMCH
! 60: * .. Executable Statements ..
! 61: *
! 62: THRESH = DLAMCH('E')
! 63: *
! 64: * Compute the first column of B'*B - SIGMA^2*I, up to a scale
! 65: * factor.
! 66: *
! 67: IF( (SIGMA .EQ. ZERO .AND. ABS(X) .LT. THRESH) .OR.
! 68: $ (ABS(X) .EQ. SIGMA .AND. Y .EQ. ZERO) ) THEN
! 69: Z = ZERO
! 70: W = ZERO
! 71: ELSE IF( SIGMA .EQ. ZERO ) THEN
! 72: IF( X .GE. ZERO ) THEN
! 73: Z = X
! 74: W = Y
! 75: ELSE
! 76: Z = -X
! 77: W = -Y
! 78: END IF
! 79: ELSE IF( ABS(X) .LT. THRESH ) THEN
! 80: Z = -SIGMA*SIGMA
! 81: W = ZERO
! 82: ELSE
! 83: IF( X .GE. ZERO ) THEN
! 84: S = ONE
! 85: ELSE
! 86: S = NEGONE
! 87: END IF
! 88: Z = S * (ABS(X)-SIGMA) * (S+SIGMA/X)
! 89: W = S * Y
! 90: END IF
! 91: *
! 92: * Generate the rotation.
! 93: * CALL DLARTGP( Z, W, CS, SN, R ) might seem more natural;
! 94: * reordering the arguments ensures that if Z = 0 then the rotation
! 95: * is by PI/2.
! 96: *
! 97: CALL DLARTGP( W, Z, SN, CS, R )
! 98: *
! 99: RETURN
! 100: *
! 101: * End DLARTGS
! 102: *
! 103: END
! 104:
CVSweb interface <joel.bertrand@systella.fr>