2
3
4
5
6
7
8
9
10
11
12
13
14
15 INTEGER INFO, KL, , LDAB, , 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
106
107
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.GT. IF( I20 ) 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.GT. IF( I30 ) 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.GT. IF( J30 ) 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.GT. IF( I20 ) 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.GT. IF( I30 ) 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.GT. IF( NW0 )
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
integer function ilaenv(ispec, name, opts, n1, n2, n3, n4)
ILAENV
subroutine xerbla(srname, info)
XERBLA
integer function isamax(n, sx, incx)
ISAMAX
subroutine zswap(n, zx, incx, zy, incy)
ZSWAP
subroutine zcopy(n, zx, incx, zy, incy)
ZCOPY
subroutine zscal(n, za, zx, incx)
ZSCAL
subroutine zgeru(m, n, alpha, x, incx, y, incy, a, lda)
ZGERU
subroutine zgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
ZGEMM
subroutine ztrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
ZTRSM
subroutine zdbtf2(m, n, kl, ku, ab, ldab, info)