Annotation of rpl/lapack/lapack/dlasv2.f, revision 1.1
1.1 ! bertrand 1: SUBROUTINE DLASV2( F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL )
! 2: *
! 3: * -- LAPACK auxiliary routine (version 3.2) --
! 4: * -- LAPACK is a software package provided by Univ. of Tennessee, --
! 5: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
! 6: * November 2006
! 7: *
! 8: * .. Scalar Arguments ..
! 9: DOUBLE PRECISION CSL, CSR, F, G, H, SNL, SNR, SSMAX, SSMIN
! 10: * ..
! 11: *
! 12: * Purpose
! 13: * =======
! 14: *
! 15: * DLASV2 computes the singular value decomposition of a 2-by-2
! 16: * triangular matrix
! 17: * [ F G ]
! 18: * [ 0 H ].
! 19: * On return, abs(SSMAX) is the larger singular value, abs(SSMIN) is the
! 20: * smaller singular value, and (CSL,SNL) and (CSR,SNR) are the left and
! 21: * right singular vectors for abs(SSMAX), giving the decomposition
! 22: *
! 23: * [ CSL SNL ] [ F G ] [ CSR -SNR ] = [ SSMAX 0 ]
! 24: * [-SNL CSL ] [ 0 H ] [ SNR CSR ] [ 0 SSMIN ].
! 25: *
! 26: * Arguments
! 27: * =========
! 28: *
! 29: * F (input) DOUBLE PRECISION
! 30: * The (1,1) element of the 2-by-2 matrix.
! 31: *
! 32: * G (input) DOUBLE PRECISION
! 33: * The (1,2) element of the 2-by-2 matrix.
! 34: *
! 35: * H (input) DOUBLE PRECISION
! 36: * The (2,2) element of the 2-by-2 matrix.
! 37: *
! 38: * SSMIN (output) DOUBLE PRECISION
! 39: * abs(SSMIN) is the smaller singular value.
! 40: *
! 41: * SSMAX (output) DOUBLE PRECISION
! 42: * abs(SSMAX) is the larger singular value.
! 43: *
! 44: * SNL (output) DOUBLE PRECISION
! 45: * CSL (output) DOUBLE PRECISION
! 46: * The vector (CSL, SNL) is a unit left singular vector for the
! 47: * singular value abs(SSMAX).
! 48: *
! 49: * SNR (output) DOUBLE PRECISION
! 50: * CSR (output) DOUBLE PRECISION
! 51: * The vector (CSR, SNR) is a unit right singular vector for the
! 52: * singular value abs(SSMAX).
! 53: *
! 54: * Further Details
! 55: * ===============
! 56: *
! 57: * Any input parameter may be aliased with any output parameter.
! 58: *
! 59: * Barring over/underflow and assuming a guard digit in subtraction, all
! 60: * output quantities are correct to within a few units in the last
! 61: * place (ulps).
! 62: *
! 63: * In IEEE arithmetic, the code works correctly if one matrix element is
! 64: * infinite.
! 65: *
! 66: * Overflow will not occur unless the largest singular value itself
! 67: * overflows or is within a few ulps of overflow. (On machines with
! 68: * partial overflow, like the Cray, overflow may occur if the largest
! 69: * singular value is within a factor of 2 of overflow.)
! 70: *
! 71: * Underflow is harmless if underflow is gradual. Otherwise, results
! 72: * may correspond to a matrix modified by perturbations of size near
! 73: * the underflow threshold.
! 74: *
! 75: * =====================================================================
! 76: *
! 77: * .. Parameters ..
! 78: DOUBLE PRECISION ZERO
! 79: PARAMETER ( ZERO = 0.0D0 )
! 80: DOUBLE PRECISION HALF
! 81: PARAMETER ( HALF = 0.5D0 )
! 82: DOUBLE PRECISION ONE
! 83: PARAMETER ( ONE = 1.0D0 )
! 84: DOUBLE PRECISION TWO
! 85: PARAMETER ( TWO = 2.0D0 )
! 86: DOUBLE PRECISION FOUR
! 87: PARAMETER ( FOUR = 4.0D0 )
! 88: * ..
! 89: * .. Local Scalars ..
! 90: LOGICAL GASMAL, SWAP
! 91: INTEGER PMAX
! 92: DOUBLE PRECISION A, CLT, CRT, D, FA, FT, GA, GT, HA, HT, L, M,
! 93: $ MM, R, S, SLT, SRT, T, TEMP, TSIGN, TT
! 94: * ..
! 95: * .. Intrinsic Functions ..
! 96: INTRINSIC ABS, SIGN, SQRT
! 97: * ..
! 98: * .. External Functions ..
! 99: DOUBLE PRECISION DLAMCH
! 100: EXTERNAL DLAMCH
! 101: * ..
! 102: * .. Executable Statements ..
! 103: *
! 104: FT = F
! 105: FA = ABS( FT )
! 106: HT = H
! 107: HA = ABS( H )
! 108: *
! 109: * PMAX points to the maximum absolute element of matrix
! 110: * PMAX = 1 if F largest in absolute values
! 111: * PMAX = 2 if G largest in absolute values
! 112: * PMAX = 3 if H largest in absolute values
! 113: *
! 114: PMAX = 1
! 115: SWAP = ( HA.GT.FA )
! 116: IF( SWAP ) THEN
! 117: PMAX = 3
! 118: TEMP = FT
! 119: FT = HT
! 120: HT = TEMP
! 121: TEMP = FA
! 122: FA = HA
! 123: HA = TEMP
! 124: *
! 125: * Now FA .ge. HA
! 126: *
! 127: END IF
! 128: GT = G
! 129: GA = ABS( GT )
! 130: IF( GA.EQ.ZERO ) THEN
! 131: *
! 132: * Diagonal matrix
! 133: *
! 134: SSMIN = HA
! 135: SSMAX = FA
! 136: CLT = ONE
! 137: CRT = ONE
! 138: SLT = ZERO
! 139: SRT = ZERO
! 140: ELSE
! 141: GASMAL = .TRUE.
! 142: IF( GA.GT.FA ) THEN
! 143: PMAX = 2
! 144: IF( ( FA / GA ).LT.DLAMCH( 'EPS' ) ) THEN
! 145: *
! 146: * Case of very large GA
! 147: *
! 148: GASMAL = .FALSE.
! 149: SSMAX = GA
! 150: IF( HA.GT.ONE ) THEN
! 151: SSMIN = FA / ( GA / HA )
! 152: ELSE
! 153: SSMIN = ( FA / GA )*HA
! 154: END IF
! 155: CLT = ONE
! 156: SLT = HT / GT
! 157: SRT = ONE
! 158: CRT = FT / GT
! 159: END IF
! 160: END IF
! 161: IF( GASMAL ) THEN
! 162: *
! 163: * Normal case
! 164: *
! 165: D = FA - HA
! 166: IF( D.EQ.FA ) THEN
! 167: *
! 168: * Copes with infinite F or H
! 169: *
! 170: L = ONE
! 171: ELSE
! 172: L = D / FA
! 173: END IF
! 174: *
! 175: * Note that 0 .le. L .le. 1
! 176: *
! 177: M = GT / FT
! 178: *
! 179: * Note that abs(M) .le. 1/macheps
! 180: *
! 181: T = TWO - L
! 182: *
! 183: * Note that T .ge. 1
! 184: *
! 185: MM = M*M
! 186: TT = T*T
! 187: S = SQRT( TT+MM )
! 188: *
! 189: * Note that 1 .le. S .le. 1 + 1/macheps
! 190: *
! 191: IF( L.EQ.ZERO ) THEN
! 192: R = ABS( M )
! 193: ELSE
! 194: R = SQRT( L*L+MM )
! 195: END IF
! 196: *
! 197: * Note that 0 .le. R .le. 1 + 1/macheps
! 198: *
! 199: A = HALF*( S+R )
! 200: *
! 201: * Note that 1 .le. A .le. 1 + abs(M)
! 202: *
! 203: SSMIN = HA / A
! 204: SSMAX = FA*A
! 205: IF( MM.EQ.ZERO ) THEN
! 206: *
! 207: * Note that M is very tiny
! 208: *
! 209: IF( L.EQ.ZERO ) THEN
! 210: T = SIGN( TWO, FT )*SIGN( ONE, GT )
! 211: ELSE
! 212: T = GT / SIGN( D, FT ) + M / T
! 213: END IF
! 214: ELSE
! 215: T = ( M / ( S+T )+M / ( R+L ) )*( ONE+A )
! 216: END IF
! 217: L = SQRT( T*T+FOUR )
! 218: CRT = TWO / L
! 219: SRT = T / L
! 220: CLT = ( CRT+SRT*M ) / A
! 221: SLT = ( HT / FT )*SRT / A
! 222: END IF
! 223: END IF
! 224: IF( SWAP ) THEN
! 225: CSL = SRT
! 226: SNL = CRT
! 227: CSR = SLT
! 228: SNR = CLT
! 229: ELSE
! 230: CSL = CLT
! 231: SNL = SLT
! 232: CSR = CRT
! 233: SNR = SRT
! 234: END IF
! 235: *
! 236: * Correct signs of SSMAX and SSMIN
! 237: *
! 238: IF( PMAX.EQ.1 )
! 239: $ TSIGN = SIGN( ONE, CSR )*SIGN( ONE, CSL )*SIGN( ONE, F )
! 240: IF( PMAX.EQ.2 )
! 241: $ TSIGN = SIGN( ONE, SNR )*SIGN( ONE, CSL )*SIGN( ONE, G )
! 242: IF( PMAX.EQ.3 )
! 243: $ TSIGN = SIGN( ONE, SNR )*SIGN( ONE, SNL )*SIGN( ONE, H )
! 244: SSMAX = SIGN( SSMAX, TSIGN )
! 245: SSMIN = SIGN( SSMIN, TSIGN*SIGN( ONE, F )*SIGN( ONE, H ) )
! 246: RETURN
! 247: *
! 248: * End of DLASV2
! 249: *
! 250: END
CVSweb interface <joel.bertrand@systella.fr>