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
103 EXTERNAL dlamov, dlanv2, dlarfg, dlarfx, dlartg, dlasy2,
104 $ drot
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