1CLAQR3(1) LAPACK auxiliary routine (version 3.2) CLAQR3(1)
2
3
4
7 SUBROUTINE CLAQR3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ, IHIZ,
8 Z, LDZ, NS, ND, SH, V, LDV, NH, T, LDT, NV, WV,
9 LDWV, WORK, LWORK )
10
11 INTEGER IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV, LDZ,
12 LWORK, N, ND, NH, NS, NV, NW
13
14 LOGICAL WANTT, WANTZ
15
16 COMPLEX H( LDH, * ), SH( * ), T( LDT, * ), V( LDV, * ),
17 WORK( * ), WV( LDWV, * ), Z( LDZ, * )
18
19 COMPLEX ZERO, ONE
20
21 PARAMETER ( ZERO = ( 0.0e0, 0.0e0 ), ONE = ( 1.0e0, 0.0e0 ) )
22
23 REAL RZERO, RONE
24
25 PARAMETER ( RZERO = 0.0e0, RONE = 1.0e0 )
26
27 COMPLEX BETA, CDUM, S, TAU
28
29 REAL FOO, SAFMAX, SAFMIN, SMLNUM, ULP
30
31 INTEGER I, IFST, ILST, INFO, INFQR, J, JW, KCOL, KLN, KNT,
32 KROW, KWTOP, LTOP, LWK1, LWK2, LWK3, LWKOPT, NMIN
33
34 REAL SLAMCH
35
36 INTEGER ILAENV
37
38 EXTERNAL SLAMCH, ILAENV
39
40 EXTERNAL CCOPY, CGEHRD, CGEMM, CLACPY, CLAHQR, CLAQR4, CLARF,
41 CLARFG, CLASET, CTREXC, CUNMHR, SLABAD
42
43 INTRINSIC ABS, AIMAG, CMPLX, CONJG, INT, MAX, MIN, REAL
44
45 REAL CABS1
46
47 CABS1( CDUM ) = ABS( REAL( CDUM ) ) + ABS( AIMAG( CDUM ) )
48
49 JW = MIN( NW, KBOT-KTOP+1 )
50
51 IF( JW.LE.2 ) THEN
52
53 LWKOPT = 1
54
55 ELSE
56
57 CALL CGEHRD( JW, 1, JW-1, T, LDT, WORK, WORK, -1, INFO )
58
59 LWK1 = INT( WORK( 1 ) )
60
61 CALL CUNMHR( 'R', 'N', JW, JW, 1, JW-1, T, LDT, WORK, V,
62 LDV, WORK, -1, INFO )
63
64 LWK2 = INT( WORK( 1 ) )
65
66 CALL CLAQR4( .true., .true., JW, 1, JW, T, LDT, SH, 1,
67 JW, V, LDV, WORK, -1, INFQR )
68
69 LWK3 = INT( WORK( 1 ) )
70
71 LWKOPT = MAX( JW+MAX( LWK1, LWK2 ), LWK3 )
72
73 END IF
74
75 IF( LWORK.EQ.-1 ) THEN
76
77 WORK( 1 ) = CMPLX( LWKOPT, 0 )
78
79 RETURN
80
81 END IF
82
83 NS = 0
84
85 ND = 0
86
87 WORK( 1 ) = ONE
88
89 IF( KTOP.GT.KBOT ) RETURN
90
91 IF( NW.LT.1 ) RETURN
92
93 SAFMIN = SLAMCH( 'SAFE MINIMUM' )
94
95 SAFMAX = RONE / SAFMIN
96
97 CALL SLABAD( SAFMIN, SAFMAX )
98
99 ULP = SLAMCH( 'PRECISION' )
100
101 SMLNUM = SAFMIN*( REAL( N ) / ULP )
102
103 JW = MIN( NW, KBOT-KTOP+1 )
104
105 KWTOP = KBOT - JW + 1
106
107 IF( KWTOP.EQ.KTOP ) THEN
108
109 S = ZERO
110
111 ELSE
112
113 S = H( KWTOP, KWTOP-1 )
114
115 END IF
116
117 IF( KBOT.EQ.KWTOP ) THEN
118
119 SH( KWTOP ) = H( KWTOP, KWTOP )
120
121 NS = 1
122
123 ND = 0
124
125 IF( CABS1( S ).LE.MAX( SMLNUM, ULP*CABS1( H( KWTOP,
126 KWTOP ) ) ) ) THEN
127
128 NS = 0
129
130 ND = 1
131
132 IF( KWTOP.GT.KTOP ) H( KWTOP, KWTOP-1 ) = ZERO
133
134 END IF
135
136 WORK( 1 ) = ONE
137
138 RETURN
139
140 END IF
141
142 CALL CLACPY( 'U', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT
143 )
144
145 CALL CCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ),
146 LDT+1 )
147
148 CALL CLASET( 'A', JW, JW, ZERO, ONE, V, LDV )
149
150 NMIN = ILAENV( 12, 'CLAQR3', 'SV', JW, 1, JW, LWORK )
151
152 IF( JW.GT.NMIN ) THEN
153
154 CALL CLAQR4( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP
155 ), 1, JW, V, LDV, WORK, LWORK, INFQR )
156
157 ELSE
158
159 CALL CLAHQR( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP
160 ), 1, JW, V, LDV, INFQR )
161
162 END IF
163
164 NS = JW
165
166 ILST = INFQR + 1
167
168 DO 10 KNT = INFQR + 1, JW
169
170 FOO = CABS1( T( NS, NS ) )
171
172 IF( FOO.EQ.RZERO ) FOO = CABS1( S )
173
174 IF( CABS1( S )*CABS1( V( 1, NS ) ).LE.MAX( SMLNUM,
175 ULP*FOO ) ) THEN
176
177 NS = NS - 1
178
179 ELSE
180
181 IFST = NS
182
183 CALL CTREXC( 'V', JW, T, LDT, V, LDV, IFST, ILST, INFO )
184
185 ILST = ILST + 1
186
187 END IF
188
189 10 CONTINUE
190
191 IF( NS.EQ.0 ) S = ZERO
192
193 IF( NS.LT.JW ) THEN
194
195 DO 30 I = INFQR + 1, NS
196
197 IFST = I
198
199 DO 20 J = I + 1, NS
200
201 IF( CABS1( T( J, J ) ).GT.CABS1( T( IFST, IFST ) ) )
202 IFST = J
203
204 20 CONTINUE
205
206 ILST = I
207
208 IF( IFST.NE.ILST ) CALL CTREXC( 'V', JW, T, LDT, V, LDV,
209 IFST, ILST, INFO )
210
211 30 CONTINUE
212
213 END IF
214
215 DO 40 I = INFQR + 1, JW
216
217 SH( KWTOP+I-1 ) = T( I, I )
218
219 40 CONTINUE
220
221 IF( NS.LT.JW .OR. S.EQ.ZERO ) THEN
222
223 IF( NS.GT.1 .AND. S.NE.ZERO ) THEN
224
225 CALL CCOPY( NS, V, LDV, WORK, 1 )
226
227 DO 50 I = 1, NS
228
229 WORK( I ) = CONJG( WORK( I ) )
230
231 50 CONTINUE
232
233 BETA = WORK( 1 )
234
235 CALL CLARFG( NS, BETA, WORK( 2 ), 1, TAU )
236
237 WORK( 1 ) = ONE
238
239 CALL CLASET( 'L', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ), LDT
240 )
241
242 CALL CLARF( 'L', NS, JW, WORK, 1, CONJG( TAU ), T, LDT,
243 WORK( JW+1 ) )
244
245 CALL CLARF( 'R', NS, NS, WORK, 1, TAU, T, LDT, WORK( JW+1
246 ) )
247
248 CALL CLARF( 'R', JW, NS, WORK, 1, TAU, V, LDV, WORK( JW+1
249 ) )
250
251 CALL CGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
252 LWORK-JW, INFO )
253
254 END IF
255
256 IF( KWTOP.GT.1 ) H( KWTOP, KWTOP-1 ) = S*CONJG( V( 1, 1
257 ) )
258
259 CALL CLACPY( 'U', JW, JW, T, LDT, H( KWTOP, KWTOP ), LDH
260 )
261
262 CALL CCOPY( JW-1, T( 2, 1 ), LDT+1, H( KWTOP+1, KWTOP ),
263 LDH+1 )
264
265 IF( NS.GT.1 .AND. S.NE.ZERO ) CALL CUNMHR( 'R', 'N', JW,
266 NS, 1, NS, T, LDT, WORK, V, LDV, WORK( JW+1 ),
267 LWORK-JW, INFO )
268
269 IF( WANTT ) THEN
270
271 LTOP = 1
272
273 ELSE
274
275 LTOP = KTOP
276
277 END IF
278
279 DO 60 KROW = LTOP, KWTOP - 1, NV
280
281 KLN = MIN( NV, KWTOP-KROW )
282
283 CALL CGEMM( 'N', 'N', KLN, JW, JW, ONE, H( KROW, KWTOP ),
284 LDH, V, LDV, ZERO, WV, LDWV )
285
286 CALL CLACPY( 'A', KLN, JW, WV, LDWV, H( KROW, KWTOP ),
287 LDH )
288
289 60 CONTINUE
290
291 IF( WANTT ) THEN
292
293 DO 70 KCOL = KBOT + 1, N, NH
294
295 KLN = MIN( NH, N-KCOL+1 )
296
297 CALL CGEMM( 'C', 'N', JW, KLN, JW, ONE, V, LDV, H( KWTOP,
298 KCOL ), LDH, ZERO, T, LDT )
299
300 CALL CLACPY( 'A', JW, KLN, T, LDT, H( KWTOP, KCOL ), LDH
301 )
302
303 70 CONTINUE
304
305 END IF
306
307 IF( WANTZ ) THEN
308
309 DO 80 KROW = ILOZ, IHIZ, NV
310
311 KLN = MIN( NV, IHIZ-KROW+1 )
312
313 CALL CGEMM( 'N', 'N', KLN, JW, JW, ONE, Z( KROW, KWTOP ),
314 LDZ, V, LDV, ZERO, WV, LDWV )
315
316 CALL CLACPY( 'A', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
317 LDZ )
318
319 80 CONTINUE
320
321 END IF
322
323 END IF
324
325 ND = JW - NS
326
327 NS = NS - INFQR
328
329 WORK( 1 ) = CMPLX( LWKOPT, 0 )
330
331 END
332
334 LAPACK auxiliary routine (versionNo3v.e2m)ber 2008 CLAQR3(1)