2
3
4
5
6
7
8
9
10
11
12
13
14
15 INTEGER INFO, KL, KU, LDAB, M, N
16
17
18 COMPLEX*16 AB( LDAB, * )
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
83
84
85
86 DOUBLE PRECISION ONE, ZERO
87 parameter( one = 1.0d+0 )
88 parameter( zero = 0.0d+0 )
89 COMPLEX*16 CONE, CZERO
90 parameter( cone = ( 1.0d+0, 0.0d+0 ) )
91 parameter( czero = ( 0.0d+0, 0.0d+0 ) )
92 INTEGER NBMAX, LDWORK
93 parameter( nbmax = 64, ldwork = nbmax+1 )
94
95
96 INTEGER I, I2, I3, II, J, J2, J3, JB, JJ, JM, JP,
97 $ JU, KM, KV, NB, NW
98
99
100 COMPLEX*16 WORK13( LDWORK, NBMAX ),
101 $ WORK31( LDWORK, NBMAX )
102
103
104 INTEGER ILAENV, ISAMAX
105 EXTERNAL ilaenv, isamax
106
107
108 EXTERNAL zcopy,
zdbtf2, zgemm, zgeru, zscal,
109 $ zswap, ztrsm, xerbla
110
111
113
114
115
116
117
118 kv = ku
119
120
121
122 info = 0
123 IF( m.LT.0 ) THEN
124 info = -1
125 ELSE IF( n.LT.0 ) THEN
126 info = -2
127 ELSE IF( kl.LT.0 ) THEN
128 info = -3
129 ELSE IF( ku.LT.0 ) THEN
130 info = -4
131 ELSE IF( ldab.LT.
min(
min( kl+kv+1,m ),n ) )
THEN
132 info = -6
133 END IF
134 IF( info.NE.0 ) THEN
135 CALL xerbla( 'ZDBTRF', -info )
136 RETURN
137 END IF
138
139
140
141 IF( m.EQ.0 .OR. n.EQ.0 )
142 $ RETURN
143
144
145
146 nb = ilaenv( 1, 'ZDBTRF', ' ', m, n, kl, ku )
147
148
149
150
151 nb =
min( nb, nbmax )
152
153 IF( nb.LE.1 .OR. nb.GT.kl ) THEN
154
155
156
157 CALL zdbtf2( m, n, kl, ku, ab, ldab, info )
158 ELSE
159
160
161
162
163
164 DO 20 j = 1, nb
165 DO 10 i = 1, j - 1
166 work13( i, j ) = zero
167 10 CONTINUE
168 20 CONTINUE
169
170
171
172 DO 40 j = 1, nb
173 DO 30 i = j + 1, nb
174 work31( i, j ) = zero
175 30 CONTINUE
176 40 CONTINUE
177
178
179
180
181 ju = 1
182
183 DO 180 j = 1,
min( m, n ), nb
184 jb =
min( nb,
min( m, n )-j+1 )
185
186
187
188
189
190
191
192
193
194
195
196
197
198 i2 =
min( kl-jb, m-j-jb+1 )
199 i3 =
min( jb, m-j-kl+1 )
200
201
202
203
204
205 DO 80 jj = j, j + jb - 1
206
207
208
209
211 jp = 1
212 IF( ab( kv+jp, jj ).NE.zero ) THEN
213 ju =
max( ju,
min( jj+ku+jp-1, n ) )
214
215
216
217 CALL zscal( km, one / ab( kv+1, jj ), ab( kv+2, jj ),
218 $ 1 )
219
220
221
222
223
224 jm =
min( ju, j+jb-1 )
225 IF( jm.GT.jj ) THEN
226 CALL zgeru( km, jm-jj, -cone, ab( kv+2, jj ), 1,
227 $ ab( kv, jj+1 ), ldab-1,
228 $ ab( kv+1, jj+1 ), ldab-1 )
229 END IF
230 END IF
231
232
233
234 nw =
min( jj-j+1, i3 )
235 IF( nw.GT.0 )
236 $ CALL zcopy( nw, ab( kv+kl+1-jj+j, jj ), 1,
237 $ work31( 1, jj-j+1 ), 1 )
238 80 CONTINUE
239 IF( j+jb.LE.n ) THEN
240
241
242
243 j2 =
min( ju-j+1, kv ) - jb
244 j3 =
max( 0, ju-j-kv+1 )
245
246
247
248 IF( j2.GT.0 ) THEN
249
250
251
252 CALL ztrsm( 'Left', 'Lower', 'No transpose', 'Unit',
253 $ jb, j2, cone, ab( kv+1, j ), ldab-1,
254 $ ab( kv+1-jb, j+jb ), ldab-1 )
255
256 IF( i2.GT.0 ) THEN
257
258
259
260 CALL zgemm( 'No transpose', 'No transpose', i2, j2,
261 $ jb, -cone, ab( kv+1+jb, j ), ldab-1,
262 $ ab( kv+1-jb, j+jb ), ldab-1, cone,
263 $ ab( kv+1, j+jb ), ldab-1 )
264 END IF
265
266 IF( i3.GT.0 ) THEN
267
268
269
270 CALL zgemm( 'No transpose', 'No transpose', i3, j2,
271 $ jb, -cone, work31, ldwork,
272 $ ab( kv+1-jb, j+jb ), ldab-1, cone,
273 $ ab( kv+kl+1-jb, j+jb ), ldab-1 )
274 END IF
275 END IF
276
277 IF( j3.GT.0 ) THEN
278
279
280
281
282 DO 130 jj = 1, j3
283 DO 120 ii = jj, jb
284 work13( ii, jj ) = ab( ii-jj+1, jj+j+kv-1 )
285 120 CONTINUE
286 130 CONTINUE
287
288
289
290 CALL ztrsm( 'Left', 'Lower', 'No transpose', 'Unit',
291 $ jb, j3, cone, ab( kv+1, j ), ldab-1,
292 $ work13, ldwork )
293
294 IF( i2.GT.0 ) THEN
295
296
297
298 CALL zgemm( 'No transpose', 'No transpose', i2, j3,
299 $ jb, -cone, ab( kv+1+jb, j ), ldab-1,
300 $ work13, ldwork, cone, ab( 1+jb, j+kv ),
301 $ ldab-1 )
302 END IF
303
304 IF( i3.GT.0 ) THEN
305
306
307
308 CALL zgemm( 'No transpose', 'No transpose', i3, j3,
309 $ jb, -cone, work31, ldwork, work13,
310 $ ldwork, cone, ab( 1+kl, j+kv ), ldab-1 )
311 END IF
312
313
314
315 DO 150 jj = 1, j3
316 DO 140 ii = jj, jb
317 ab( ii-jj+1, jj+j+kv-1 ) = work13( ii, jj )
318 140 CONTINUE
319 150 CONTINUE
320 END IF
321 ELSE
322 END IF
323
324
325
326 DO 170 jj = j + jb - 1, j, -1
327
328
329
330 nw =
min( i3, jj-j+1 )
331 IF( nw.GT.0 )
332 $ CALL zcopy( nw, work31( 1, jj-j+1 ), 1,
333 $ ab( kv+kl+1-jj+j, jj ), 1 )
334 170 CONTINUE
335 180 CONTINUE
336 END IF
337
338 RETURN
339
340
341
subroutine zdbtf2(m, n, kl, ku, ab, ldab, info)