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
102 EXTERNAL ilaenv, isamax
103
104
105 EXTERNAL scopy,
sdbtf2, sgemm, sger, sscal,
106 $ sswap, strsm, xerbla
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
subroutine sdbtf2(m, n, kl, ku, ab, ldab, info)