Statistiques
| Révision :

root / src / lapack / double / dlasv2.f @ 10

Historique | Voir | Annoter | Télécharger (6,6 ko)

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