3 IMPLICIT NONE
4
5
6
7
8
9
10 INTEGER INFO, J1, LDT, N, N1, N2
11
12
13 INTEGER ITRAF( * )
14 DOUBLE PRECISION DTRAF( * ), T( LDT, * ), WORK( * )
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 DOUBLE PRECISION ZERO, ONE
83 parameter( zero = 0.0d+0, one = 1.0d+0 )
84 DOUBLE PRECISION TEN
85 parameter( ten = 1.0d+1 )
86 INTEGER LDD, LDX
87 parameter( ldd = 4, ldx = 2 )
88
89
90 INTEGER IERR, J2, J3, J4, K, LD, LI, ND
91 DOUBLE PRECISION CS, DNORM, EPS, SCALE, SMLNUM, SN, T11, T22,
92 $ T33, TAU, TAU1, TAU2, TEMP, THRESH, WI1, WI2,
93 $ WR1, WR2, XNORM
94
95
96 DOUBLE PRECISION D( LDD, 4 ), X( LDX, 2 )
97
98
99 DOUBLE PRECISION DLAMCH, DLANGE
101
102
105
106
108
109
110
111 info = 0
112
113
114
115 IF( n.EQ.0 .OR. n1.EQ.0 .OR. n2.EQ.0 )
116 $ RETURN
117 IF( j1+n1.GT.n )
118 $ RETURN
119
120 j2 = j1 + 1
121 j3 = j1 + 2
122 j4 = j1 + 3
123
124 IF( n1.EQ.1 .AND. n2.EQ.1 ) THEN
125
126
127
128 t11 = t( j1, j1 )
129 t22 = t( j2, j2 )
130
131
132
133 CALL dlartg( t( j1, j2 ), t22-t11, cs, sn, temp )
134
135
136
137 IF( j3.LE.n )
138 $
CALL drot( n-j1-1, t( j1, j3 ), ldt, t( j2, j3 ), ldt, cs,
139 $ sn )
140 CALL drot( j1-1, t( 1, j1 ), 1, t( 1, j2 ), 1, cs, sn )
141
142 t( j1, j1 ) = t22
143 t( j2, j2 ) = t11
144
145 itraf( 1 ) = j1
146 dtraf( 1 ) = cs
147 dtraf( 2 ) = sn
148
149 ELSE
150
151
152
153
154
155
156 nd = n1 + n2
157 CALL dlamov( 'Full', nd, nd, t( j1, j1 ), ldt, d, ldd )
158 dnorm =
dlange(
'Max', nd, nd, d, ldd, work )
159
160
161
162
164 smlnum =
dlamch(
'S' ) / eps
165 thresh =
max( ten*eps*dnorm, smlnum )
166
167
168
169 CALL dlasy2( .false., .false., -1, n1, n2, d, ldd,
170 $ d( n1+1, n1+1 ), ldd, d( 1, n1+1 ), ldd, scale, x,
171 $ ldx, xnorm, ierr )
172
173
174
175 k = n1 + n1 + n2 - 3
176 GO TO ( 10, 20, 30 )k
177
178 10 CONTINUE
179
180
181
182
183
184 dtraf( 1 ) = scale
185 dtraf( 2 ) = x( 1, 1 )
186 dtraf( 3 ) = x( 1, 2 )
187 CALL dlarfg( 3, dtraf( 3 ), dtraf, 1, tau )
188 dtraf( 3 ) = one
189 t11 = t( j1, j1 )
190
191
192
193 CALL dlarfx(
'Left', 3, 3, dtraf, tau, d, ldd, work )
194 CALL dlarfx(
'Right', 3, 3, dtraf, tau, d, ldd, work )
195
196
197
198 IF(
max( abs( d( 3, 1 ) ), abs( d( 3, 2 ) ), abs( d( 3,
199 $ 3 )-t11 ) ).GT.thresh )GO TO 50
200
201
202
203 CALL dlarfx(
'Left', 3, n-j1+1, dtraf, tau, t( j1, j1 ), ldt,
204 $ work )
205 CALL dlarfx(
'Right', j2, 3, dtraf, tau, t( 1, j1 ), ldt,
206 $ work )
207
208 t( j3, j1 ) = zero
209 t( j3, j2 ) = zero
210 t( j3, j3 ) = t11
211
212 itraf( 1 ) = 2*n + j1
213 li = 2
214 dtraf( 3 ) = tau
215 ld = 4
216 GO TO 40
217
218 20 CONTINUE
219
220
221
222
223
224
225
226 dtraf( 1 ) = -x( 1, 1 )
227 dtraf( 2 ) = -x( 2, 1 )
228 dtraf( 3 ) = scale
229 CALL dlarfg( 3, dtraf( 1 ), dtraf( 2 ), 1, tau )
230 dtraf( 1 ) = one
231 t33 = t( j3, j3 )
232
233
234
235 CALL dlarfx(
'Left', 3, 3, dtraf, tau, d, ldd, work )
236 CALL dlarfx(
'Right', 3, 3, dtraf, tau, d, ldd, work )
237
238
239
240 IF(
max( abs( d( 2, 1 ) ), abs( d( 3, 1 ) ), abs( d( 1,
241 $ 1 )-t33 ) ).GT.thresh )GO TO 50
242
243
244
245 CALL dlarfx(
'Right', j3, 3, dtraf, tau, t( 1, j1 ), ldt,
246 $ work )
247 CALL dlarfx(
'Left', 3, n-j1, dtraf, tau, t( j1, j2 ), ldt,
248 $ work )
249
250 t( j1, j1 ) = t33
251 t( j2, j1 ) = zero
252 t( j3, j1 ) = zero
253
254 itraf( 1 ) = n + j1
255 li = 2
256 dtraf( 1 ) = tau
257 ld = 4
258 GO TO 40
259
260 30 CONTINUE
261
262
263
264
265
266
267
268
269
270 dtraf( 1 ) = -x( 1, 1 )
271 dtraf( 2 ) = -x( 2, 1 )
272 dtraf( 3 ) = scale
273 CALL dlarfg( 3, dtraf( 1 ), dtraf( 2 ), 1, tau1 )
274 dtraf( 1 ) = one
275
276 temp = -tau1*( x( 1, 2 )+dtraf( 2 )*x( 2, 2 ) )
277 dtraf( 4 ) = -temp*dtraf( 2 ) - x( 2, 2 )
278 dtraf( 5 ) = -temp*dtraf( 3 )
279 dtraf( 6 ) = scale
280 CALL dlarfg( 3, dtraf( 4 ), dtraf( 5 ), 1, tau2 )
281 dtraf( 4 ) = one
282
283
284
285 CALL dlarfx(
'Left', 3, 4, dtraf, tau1, d, ldd, work )
286 CALL dlarfx(
'Right', 4, 3, dtraf, tau1, d, ldd, work )
287 CALL dlarfx(
'Left', 3, 4, dtraf( 4 ), tau2, d( 2, 1 ), ldd,
288 $ work )
289 CALL dlarfx(
'Right', 4, 3, dtraf( 4 ), tau2, d( 1, 2 ), ldd,
290 $ work )
291
292
293
294 IF(
max( abs( d( 3, 1 ) ), abs( d( 3, 2 ) ), abs( d( 4, 1 ) ),
295 $ abs( d( 4, 2 ) ) ).GT.thresh )GO TO 50
296
297
298
299 CALL dlarfx(
'Left', 3, n-j1+1, dtraf, tau1, t( j1, j1 ), ldt,
300 $ work )
301 CALL dlarfx(
'Right', j4, 3, dtraf, tau1, t( 1, j1 ), ldt,
302 $ work )
303 CALL dlarfx(
'Left', 3, n-j1+1, dtraf( 4 ), tau2, t( j2, j1 ),
304 $ ldt, work )
305 CALL dlarfx(
'Right', j4, 3, dtraf( 4 ), tau2, t( 1, j2 ), ldt,
306 $ work )
307
308 t( j3, j1 ) = zero
309 t( j3, j2 ) = zero
310 t( j4, j1 ) = zero
311 t( j4, j2 ) = zero
312
313 itraf( 1 ) = n + j1
314 itraf( 2 ) = n + j2
315 li = 3
316 dtraf( 1 ) = tau1
317 dtraf( 4 ) = tau2
318 ld = 7
319 GO TO 40
320
321 40 CONTINUE
322
323 IF( n2.EQ.2 ) THEN
324
325
326
327 CALL dlanv2( t( j1, j1 ), t( j1, j2 ), t( j2, j1 ),
328 $ t( j2, j2 ), wr1, wi1, wr2, wi2, cs, sn )
329 CALL drot( n-j1-1, t( j1, j1+2 ), ldt, t( j2, j1+2 ), ldt,
330 $ cs, sn )
331 CALL drot( j1-1, t( 1, j1 ), 1, t( 1, j2 ), 1, cs, sn )
332 itraf( li ) = j1
333 li = li + 1
334 dtraf( ld ) = cs
335 dtraf( ld+1 ) = sn
336 ld = ld + 2
337 END IF
338
339 IF( n1.EQ.2 ) THEN
340
341
342
343 j3 = j1 + n2
344 j4 = j3 + 1
345 CALL dlanv2( t( j3, j3 ), t( j3, j4 ), t( j4, j3 ),
346 $ t( j4, j4 ), wr1, wi1, wr2, wi2, cs, sn )
347 IF( j3+2.LE.n )
348 $
CALL drot( n-j3-1, t( j3, j3+2 ), ldt, t( j4, j3+2 ),
349 $ ldt, cs, sn )
350 CALL drot( j3-1, t( 1, j3 ), 1, t( 1, j4 ), 1, cs, sn )
351 itraf( li ) = j3
352 dtraf( ld ) = cs
353 dtraf( ld+1 ) = sn
354 END IF
355
356 END IF
357 RETURN
358
359
360
361 50 CONTINUE
362 info = 1
363 RETURN
364
365
366
subroutine dlartg(f, g, c, s, r)
DLARTG generates a plane rotation with real cosine and real sine.
double precision function dlange(norm, m, n, a, lda, work)
DLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine dlarfx(side, m, n, v, tau, c, ldc, work)
DLARFX applies an elementary reflector to a general rectangular matrix, with loop unrolling when the ...
subroutine dlanv2(a, b, c, d, rt1r, rt1i, rt2r, rt2i, cs, sn)
DLANV2 computes the Schur factorization of a real 2-by-2 nonsymmetric matrix in standard form.
subroutine dlarfg(n, alpha, x, incx, tau)
DLARFG generates an elementary reflector (Householder matrix).
subroutine dlasy2(ltranl, ltranr, isgn, n1, n2, tl, ldtl, tr, ldtr, b, ldb, scale, x, ldx, xnorm, info)
DLASY2 solves the Sylvester matrix equation where the matrices are of order 1 or 2.
subroutine drot(n, dx, incx, dy, incy, c, s)
DROT
double precision function dlamch(cmach)
DLAMCH