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