Annotation of rpl/lapack/lapack/dlasv2.f, revision 1.8
1.8 ! bertrand 1: *> \brief \b DLASV2
! 2: *
! 3: * =========== DOCUMENTATION ===========
! 4: *
! 5: * Online html documentation available at
! 6: * http://www.netlib.org/lapack/explore-html/
! 7: *
! 8: *> \htmlonly
! 9: *> Download DLASV2 + dependencies
! 10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlasv2.f">
! 11: *> [TGZ]</a>
! 12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlasv2.f">
! 13: *> [ZIP]</a>
! 14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlasv2.f">
! 15: *> [TXT]</a>
! 16: *> \endhtmlonly
! 17: *
! 18: * Definition:
! 19: * ===========
! 20: *
! 21: * SUBROUTINE DLASV2( F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL )
! 22: *
! 23: * .. Scalar Arguments ..
! 24: * DOUBLE PRECISION CSL, CSR, F, G, H, SNL, SNR, SSMAX, SSMIN
! 25: * ..
! 26: *
! 27: *
! 28: *> \par Purpose:
! 29: * =============
! 30: *>
! 31: *> \verbatim
! 32: *>
! 33: *> DLASV2 computes the singular value decomposition of a 2-by-2
! 34: *> triangular matrix
! 35: *> [ F G ]
! 36: *> [ 0 H ].
! 37: *> On return, abs(SSMAX) is the larger singular value, abs(SSMIN) is the
! 38: *> smaller singular value, and (CSL,SNL) and (CSR,SNR) are the left and
! 39: *> right singular vectors for abs(SSMAX), giving the decomposition
! 40: *>
! 41: *> [ CSL SNL ] [ F G ] [ CSR -SNR ] = [ SSMAX 0 ]
! 42: *> [-SNL CSL ] [ 0 H ] [ SNR CSR ] [ 0 SSMIN ].
! 43: *> \endverbatim
! 44: *
! 45: * Arguments:
! 46: * ==========
! 47: *
! 48: *> \param[in] F
! 49: *> \verbatim
! 50: *> F is DOUBLE PRECISION
! 51: *> The (1,1) element of the 2-by-2 matrix.
! 52: *> \endverbatim
! 53: *>
! 54: *> \param[in] G
! 55: *> \verbatim
! 56: *> G is DOUBLE PRECISION
! 57: *> The (1,2) element of the 2-by-2 matrix.
! 58: *> \endverbatim
! 59: *>
! 60: *> \param[in] H
! 61: *> \verbatim
! 62: *> H is DOUBLE PRECISION
! 63: *> The (2,2) element of the 2-by-2 matrix.
! 64: *> \endverbatim
! 65: *>
! 66: *> \param[out] SSMIN
! 67: *> \verbatim
! 68: *> SSMIN is DOUBLE PRECISION
! 69: *> abs(SSMIN) is the smaller singular value.
! 70: *> \endverbatim
! 71: *>
! 72: *> \param[out] SSMAX
! 73: *> \verbatim
! 74: *> SSMAX is DOUBLE PRECISION
! 75: *> abs(SSMAX) is the larger singular value.
! 76: *> \endverbatim
! 77: *>
! 78: *> \param[out] SNL
! 79: *> \verbatim
! 80: *> SNL is DOUBLE PRECISION
! 81: *> \endverbatim
! 82: *>
! 83: *> \param[out] CSL
! 84: *> \verbatim
! 85: *> CSL is DOUBLE PRECISION
! 86: *> The vector (CSL, SNL) is a unit left singular vector for the
! 87: *> singular value abs(SSMAX).
! 88: *> \endverbatim
! 89: *>
! 90: *> \param[out] SNR
! 91: *> \verbatim
! 92: *> SNR is DOUBLE PRECISION
! 93: *> \endverbatim
! 94: *>
! 95: *> \param[out] CSR
! 96: *> \verbatim
! 97: *> CSR is DOUBLE PRECISION
! 98: *> The vector (CSR, SNR) is a unit right singular vector for the
! 99: *> singular value abs(SSMAX).
! 100: *> \endverbatim
! 101: *
! 102: * Authors:
! 103: * ========
! 104: *
! 105: *> \author Univ. of Tennessee
! 106: *> \author Univ. of California Berkeley
! 107: *> \author Univ. of Colorado Denver
! 108: *> \author NAG Ltd.
! 109: *
! 110: *> \date November 2011
! 111: *
! 112: *> \ingroup auxOTHERauxiliary
! 113: *
! 114: *> \par Further Details:
! 115: * =====================
! 116: *>
! 117: *> \verbatim
! 118: *>
! 119: *> Any input parameter may be aliased with any output parameter.
! 120: *>
! 121: *> Barring over/underflow and assuming a guard digit in subtraction, all
! 122: *> output quantities are correct to within a few units in the last
! 123: *> place (ulps).
! 124: *>
! 125: *> In IEEE arithmetic, the code works correctly if one matrix element is
! 126: *> infinite.
! 127: *>
! 128: *> Overflow will not occur unless the largest singular value itself
! 129: *> overflows or is within a few ulps of overflow. (On machines with
! 130: *> partial overflow, like the Cray, overflow may occur if the largest
! 131: *> singular value is within a factor of 2 of overflow.)
! 132: *>
! 133: *> Underflow is harmless if underflow is gradual. Otherwise, results
! 134: *> may correspond to a matrix modified by perturbations of size near
! 135: *> the underflow threshold.
! 136: *> \endverbatim
! 137: *>
! 138: * =====================================================================
1.1 bertrand 139: SUBROUTINE DLASV2( F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL )
140: *
1.8 ! bertrand 141: * -- LAPACK auxiliary routine (version 3.4.0) --
1.1 bertrand 142: * -- LAPACK is a software package provided by Univ. of Tennessee, --
143: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
1.8 ! bertrand 144: * November 2011
1.1 bertrand 145: *
146: * .. Scalar Arguments ..
147: DOUBLE PRECISION CSL, CSR, F, G, H, SNL, SNR, SSMAX, SSMIN
148: * ..
149: *
150: * =====================================================================
151: *
152: * .. Parameters ..
153: DOUBLE PRECISION ZERO
154: PARAMETER ( ZERO = 0.0D0 )
155: DOUBLE PRECISION HALF
156: PARAMETER ( HALF = 0.5D0 )
157: DOUBLE PRECISION ONE
158: PARAMETER ( ONE = 1.0D0 )
159: DOUBLE PRECISION TWO
160: PARAMETER ( TWO = 2.0D0 )
161: DOUBLE PRECISION FOUR
162: PARAMETER ( FOUR = 4.0D0 )
163: * ..
164: * .. Local Scalars ..
165: LOGICAL GASMAL, SWAP
166: INTEGER PMAX
167: DOUBLE PRECISION A, CLT, CRT, D, FA, FT, GA, GT, HA, HT, L, M,
168: $ MM, R, S, SLT, SRT, T, TEMP, TSIGN, TT
169: * ..
170: * .. Intrinsic Functions ..
171: INTRINSIC ABS, SIGN, SQRT
172: * ..
173: * .. External Functions ..
174: DOUBLE PRECISION DLAMCH
175: EXTERNAL DLAMCH
176: * ..
177: * .. Executable Statements ..
178: *
179: FT = F
180: FA = ABS( FT )
181: HT = H
182: HA = ABS( H )
183: *
184: * PMAX points to the maximum absolute element of matrix
185: * PMAX = 1 if F largest in absolute values
186: * PMAX = 2 if G largest in absolute values
187: * PMAX = 3 if H largest in absolute values
188: *
189: PMAX = 1
190: SWAP = ( HA.GT.FA )
191: IF( SWAP ) THEN
192: PMAX = 3
193: TEMP = FT
194: FT = HT
195: HT = TEMP
196: TEMP = FA
197: FA = HA
198: HA = TEMP
199: *
200: * Now FA .ge. HA
201: *
202: END IF
203: GT = G
204: GA = ABS( GT )
205: IF( GA.EQ.ZERO ) THEN
206: *
207: * Diagonal matrix
208: *
209: SSMIN = HA
210: SSMAX = FA
211: CLT = ONE
212: CRT = ONE
213: SLT = ZERO
214: SRT = ZERO
215: ELSE
216: GASMAL = .TRUE.
217: IF( GA.GT.FA ) THEN
218: PMAX = 2
219: IF( ( FA / GA ).LT.DLAMCH( 'EPS' ) ) THEN
220: *
221: * Case of very large GA
222: *
223: GASMAL = .FALSE.
224: SSMAX = GA
225: IF( HA.GT.ONE ) THEN
226: SSMIN = FA / ( GA / HA )
227: ELSE
228: SSMIN = ( FA / GA )*HA
229: END IF
230: CLT = ONE
231: SLT = HT / GT
232: SRT = ONE
233: CRT = FT / GT
234: END IF
235: END IF
236: IF( GASMAL ) THEN
237: *
238: * Normal case
239: *
240: D = FA - HA
241: IF( D.EQ.FA ) THEN
242: *
243: * Copes with infinite F or H
244: *
245: L = ONE
246: ELSE
247: L = D / FA
248: END IF
249: *
250: * Note that 0 .le. L .le. 1
251: *
252: M = GT / FT
253: *
254: * Note that abs(M) .le. 1/macheps
255: *
256: T = TWO - L
257: *
258: * Note that T .ge. 1
259: *
260: MM = M*M
261: TT = T*T
262: S = SQRT( TT+MM )
263: *
264: * Note that 1 .le. S .le. 1 + 1/macheps
265: *
266: IF( L.EQ.ZERO ) THEN
267: R = ABS( M )
268: ELSE
269: R = SQRT( L*L+MM )
270: END IF
271: *
272: * Note that 0 .le. R .le. 1 + 1/macheps
273: *
274: A = HALF*( S+R )
275: *
276: * Note that 1 .le. A .le. 1 + abs(M)
277: *
278: SSMIN = HA / A
279: SSMAX = FA*A
280: IF( MM.EQ.ZERO ) THEN
281: *
282: * Note that M is very tiny
283: *
284: IF( L.EQ.ZERO ) THEN
285: T = SIGN( TWO, FT )*SIGN( ONE, GT )
286: ELSE
287: T = GT / SIGN( D, FT ) + M / T
288: END IF
289: ELSE
290: T = ( M / ( S+T )+M / ( R+L ) )*( ONE+A )
291: END IF
292: L = SQRT( T*T+FOUR )
293: CRT = TWO / L
294: SRT = T / L
295: CLT = ( CRT+SRT*M ) / A
296: SLT = ( HT / FT )*SRT / A
297: END IF
298: END IF
299: IF( SWAP ) THEN
300: CSL = SRT
301: SNL = CRT
302: CSR = SLT
303: SNR = CLT
304: ELSE
305: CSL = CLT
306: SNL = SLT
307: CSR = CRT
308: SNR = SRT
309: END IF
310: *
311: * Correct signs of SSMAX and SSMIN
312: *
313: IF( PMAX.EQ.1 )
314: $ TSIGN = SIGN( ONE, CSR )*SIGN( ONE, CSL )*SIGN( ONE, F )
315: IF( PMAX.EQ.2 )
316: $ TSIGN = SIGN( ONE, SNR )*SIGN( ONE, CSL )*SIGN( ONE, G )
317: IF( PMAX.EQ.3 )
318: $ TSIGN = SIGN( ONE, SNR )*SIGN( ONE, SNL )*SIGN( ONE, H )
319: SSMAX = SIGN( SSMAX, TSIGN )
320: SSMIN = SIGN( SSMIN, TSIGN*SIGN( ONE, F )*SIGN( ONE, H ) )
321: RETURN
322: *
323: * End of DLASV2
324: *
325: END
CVSweb interface <joel.bertrand@systella.fr>