File:
[local] /
rpl /
lapack /
lapack /
dlaev2.f
Revision
1.13:
download - view:
text,
annotated -
select for diffs -
revision graph
Mon Jan 27 09:28:19 2014 UTC (10 years, 7 months ago) by
bertrand
Branches:
MAIN
CVS tags:
rpl-4_1_24,
rpl-4_1_23,
rpl-4_1_22,
rpl-4_1_21,
rpl-4_1_20,
rpl-4_1_19,
rpl-4_1_18,
rpl-4_1_17,
HEAD
Cohérence.
1: *> \brief \b DLAEV2 computes the eigenvalues and eigenvectors of a 2-by-2 symmetric/Hermitian matrix.
2: *
3: * =========== DOCUMENTATION ===========
4: *
5: * Online html documentation available at
6: * http://www.netlib.org/lapack/explore-html/
7: *
8: *> \htmlonly
9: *> Download DLAEV2 + dependencies
10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlaev2.f">
11: *> [TGZ]</a>
12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlaev2.f">
13: *> [ZIP]</a>
14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlaev2.f">
15: *> [TXT]</a>
16: *> \endhtmlonly
17: *
18: * Definition:
19: * ===========
20: *
21: * SUBROUTINE DLAEV2( A, B, C, RT1, RT2, CS1, SN1 )
22: *
23: * .. Scalar Arguments ..
24: * DOUBLE PRECISION A, B, C, CS1, RT1, RT2, SN1
25: * ..
26: *
27: *
28: *> \par Purpose:
29: * =============
30: *>
31: *> \verbatim
32: *>
33: *> DLAEV2 computes the eigendecomposition of a 2-by-2 symmetric matrix
34: *> [ A B ]
35: *> [ B C ].
36: *> On return, RT1 is the eigenvalue of larger absolute value, RT2 is the
37: *> eigenvalue of smaller absolute value, and (CS1,SN1) is the unit right
38: *> eigenvector for RT1, giving the decomposition
39: *>
40: *> [ CS1 SN1 ] [ A B ] [ CS1 -SN1 ] = [ RT1 0 ]
41: *> [-SN1 CS1 ] [ B C ] [ SN1 CS1 ] [ 0 RT2 ].
42: *> \endverbatim
43: *
44: * Arguments:
45: * ==========
46: *
47: *> \param[in] A
48: *> \verbatim
49: *> A is DOUBLE PRECISION
50: *> The (1,1) element of the 2-by-2 matrix.
51: *> \endverbatim
52: *>
53: *> \param[in] B
54: *> \verbatim
55: *> B is DOUBLE PRECISION
56: *> The (1,2) element and the conjugate of the (2,1) element of
57: *> the 2-by-2 matrix.
58: *> \endverbatim
59: *>
60: *> \param[in] C
61: *> \verbatim
62: *> C is DOUBLE PRECISION
63: *> The (2,2) element of the 2-by-2 matrix.
64: *> \endverbatim
65: *>
66: *> \param[out] RT1
67: *> \verbatim
68: *> RT1 is DOUBLE PRECISION
69: *> The eigenvalue of larger absolute value.
70: *> \endverbatim
71: *>
72: *> \param[out] RT2
73: *> \verbatim
74: *> RT2 is DOUBLE PRECISION
75: *> The eigenvalue of smaller absolute value.
76: *> \endverbatim
77: *>
78: *> \param[out] CS1
79: *> \verbatim
80: *> CS1 is DOUBLE PRECISION
81: *> \endverbatim
82: *>
83: *> \param[out] SN1
84: *> \verbatim
85: *> SN1 is DOUBLE PRECISION
86: *> The vector (CS1, SN1) is a unit right eigenvector for RT1.
87: *> \endverbatim
88: *
89: * Authors:
90: * ========
91: *
92: *> \author Univ. of Tennessee
93: *> \author Univ. of California Berkeley
94: *> \author Univ. of Colorado Denver
95: *> \author NAG Ltd.
96: *
97: *> \date September 2012
98: *
99: *> \ingroup auxOTHERauxiliary
100: *
101: *> \par Further Details:
102: * =====================
103: *>
104: *> \verbatim
105: *>
106: *> RT1 is accurate to a few ulps barring over/underflow.
107: *>
108: *> RT2 may be inaccurate if there is massive cancellation in the
109: *> determinant A*C-B*B; higher precision or correctly rounded or
110: *> correctly truncated arithmetic would be needed to compute RT2
111: *> accurately in all cases.
112: *>
113: *> CS1 and SN1 are accurate to a few ulps barring over/underflow.
114: *>
115: *> Overflow is possible only if RT1 is within a factor of 5 of overflow.
116: *> Underflow is harmless if the input data is 0 or exceeds
117: *> underflow_threshold / macheps.
118: *> \endverbatim
119: *>
120: * =====================================================================
121: SUBROUTINE DLAEV2( A, B, C, RT1, RT2, CS1, SN1 )
122: *
123: * -- LAPACK auxiliary routine (version 3.4.2) --
124: * -- LAPACK is a software package provided by Univ. of Tennessee, --
125: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
126: * September 2012
127: *
128: * .. Scalar Arguments ..
129: DOUBLE PRECISION A, B, C, CS1, RT1, RT2, SN1
130: * ..
131: *
132: * =====================================================================
133: *
134: * .. Parameters ..
135: DOUBLE PRECISION ONE
136: PARAMETER ( ONE = 1.0D0 )
137: DOUBLE PRECISION TWO
138: PARAMETER ( TWO = 2.0D0 )
139: DOUBLE PRECISION ZERO
140: PARAMETER ( ZERO = 0.0D0 )
141: DOUBLE PRECISION HALF
142: PARAMETER ( HALF = 0.5D0 )
143: * ..
144: * .. Local Scalars ..
145: INTEGER SGN1, SGN2
146: DOUBLE PRECISION AB, ACMN, ACMX, ACS, ADF, CS, CT, DF, RT, SM,
147: $ TB, TN
148: * ..
149: * .. Intrinsic Functions ..
150: INTRINSIC ABS, SQRT
151: * ..
152: * .. Executable Statements ..
153: *
154: * Compute the eigenvalues
155: *
156: SM = A + C
157: DF = A - C
158: ADF = ABS( DF )
159: TB = B + B
160: AB = ABS( TB )
161: IF( ABS( A ).GT.ABS( C ) ) THEN
162: ACMX = A
163: ACMN = C
164: ELSE
165: ACMX = C
166: ACMN = A
167: END IF
168: IF( ADF.GT.AB ) THEN
169: RT = ADF*SQRT( ONE+( AB / ADF )**2 )
170: ELSE IF( ADF.LT.AB ) THEN
171: RT = AB*SQRT( ONE+( ADF / AB )**2 )
172: ELSE
173: *
174: * Includes case AB=ADF=0
175: *
176: RT = AB*SQRT( TWO )
177: END IF
178: IF( SM.LT.ZERO ) THEN
179: RT1 = HALF*( SM-RT )
180: SGN1 = -1
181: *
182: * Order of execution important.
183: * To get fully accurate smaller eigenvalue,
184: * next line needs to be executed in higher precision.
185: *
186: RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B
187: ELSE IF( SM.GT.ZERO ) THEN
188: RT1 = HALF*( SM+RT )
189: SGN1 = 1
190: *
191: * Order of execution important.
192: * To get fully accurate smaller eigenvalue,
193: * next line needs to be executed in higher precision.
194: *
195: RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B
196: ELSE
197: *
198: * Includes case RT1 = RT2 = 0
199: *
200: RT1 = HALF*RT
201: RT2 = -HALF*RT
202: SGN1 = 1
203: END IF
204: *
205: * Compute the eigenvector
206: *
207: IF( DF.GE.ZERO ) THEN
208: CS = DF + RT
209: SGN2 = 1
210: ELSE
211: CS = DF - RT
212: SGN2 = -1
213: END IF
214: ACS = ABS( CS )
215: IF( ACS.GT.AB ) THEN
216: CT = -TB / CS
217: SN1 = ONE / SQRT( ONE+CT*CT )
218: CS1 = CT*SN1
219: ELSE
220: IF( AB.EQ.ZERO ) THEN
221: CS1 = ONE
222: SN1 = ZERO
223: ELSE
224: TN = -CS / TB
225: CS1 = ONE / SQRT( ONE+TN*TN )
226: SN1 = TN*CS1
227: END IF
228: END IF
229: IF( SGN1.EQ.SGN2 ) THEN
230: TN = CS1
231: CS1 = -SN1
232: SN1 = TN
233: END IF
234: RETURN
235: *
236: * End of DLAEV2
237: *
238: END
CVSweb interface <joel.bertrand@systella.fr>