140
141
142
143
144
145
146 CHARACTER UPLO
147 INTEGER INFO, KD, LDAB, N
148
149
150 REAL AB( LDAB, * )
151
152
153
154
155
156 REAL ONE, ZERO
157 parameter( one = 1.0e+0, zero = 0.0e+0 )
158 INTEGER NBMAX, LDWORK
159 parameter( nbmax = 32, ldwork = nbmax+1 )
160
161
162 INTEGER I, I2, I3, IB, II, J, JJ, NB
163
164
165 REAL WORK( LDWORK, NBMAX )
166
167
168 LOGICAL LSAME
169 INTEGER ILAENV
171
172
175
176
177 INTRINSIC min
178
179
180
181
182
183 info = 0
184 IF( ( .NOT.
lsame( uplo,
'U' ) ) .AND.
185 $ ( .NOT.
lsame( uplo,
'L' ) ) )
THEN
186 info = -1
187 ELSE IF( n.LT.0 ) THEN
188 info = -2
189 ELSE IF( kd.LT.0 ) THEN
190 info = -3
191 ELSE IF( ldab.LT.kd+1 ) THEN
192 info = -5
193 END IF
194 IF( info.NE.0 ) THEN
195 CALL xerbla(
'SPBTRF', -info )
196 RETURN
197 END IF
198
199
200
201 IF( n.EQ.0 )
202 $ RETURN
203
204
205
206 nb =
ilaenv( 1,
'SPBTRF', uplo, n, kd, -1, -1 )
207
208
209
210
211 nb = min( nb, nbmax )
212
213 IF( nb.LE.1 .OR. nb.GT.kd ) THEN
214
215
216
217 CALL spbtf2( uplo, n, kd, ab, ldab, info )
218 ELSE
219
220
221
222 IF(
lsame( uplo,
'U' ) )
THEN
223
224
225
226
227
228
229
230 DO 20 j = 1, nb
231 DO 10 i = 1, j - 1
232 work( i, j ) = zero
233 10 CONTINUE
234 20 CONTINUE
235
236
237
238 DO 70 i = 1, n, nb
239 ib = min( nb, n-i+1 )
240
241
242
243 CALL spotf2( uplo, ib, ab( kd+1, i ), ldab-1, ii )
244 IF( ii.NE.0 ) THEN
245 info = i + ii - 1
246 GO TO 150
247 END IF
248 IF( i+ib.LE.n ) THEN
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264 i2 = min( kd-ib, n-i-ib+1 )
265 i3 = min( ib, n-i-kd+1 )
266
267 IF( i2.GT.0 ) THEN
268
269
270
271 CALL strsm(
'Left',
'Upper',
'Transpose',
272 $ 'Non-unit', ib, i2, one, ab( kd+1, i ),
273 $ ldab-1, ab( kd+1-ib, i+ib ), ldab-1 )
274
275
276
277 CALL ssyrk(
'Upper',
'Transpose', i2, ib, -one,
278 $ ab( kd+1-ib, i+ib ), ldab-1, one,
279 $ ab( kd+1, i+ib ), ldab-1 )
280 END IF
281
282 IF( i3.GT.0 ) THEN
283
284
285
286 DO 40 jj = 1, i3
287 DO 30 ii = jj, ib
288 work( ii, jj ) = ab( ii-jj+1, jj+i+kd-1 )
289 30 CONTINUE
290 40 CONTINUE
291
292
293
294 CALL strsm(
'Left',
'Upper',
'Transpose',
295 $ 'Non-unit', ib, i3, one, ab( kd+1, i ),
296 $ ldab-1, work, ldwork )
297
298
299
300 IF( i2.GT.0 )
301 $
CALL sgemm(
'Transpose',
'No Transpose', i2,
302 $ i3,
303 $ ib, -one, ab( kd+1-ib, i+ib ),
304 $ ldab-1, work, ldwork, one,
305 $ ab( 1+ib, i+kd ), ldab-1 )
306
307
308
309 CALL ssyrk(
'Upper',
'Transpose', i3, ib, -one,
310 $ work, ldwork, one, ab( kd+1, i+kd ),
311 $ ldab-1 )
312
313
314
315 DO 60 jj = 1, i3
316 DO 50 ii = jj, ib
317 ab( ii-jj+1, jj+i+kd-1 ) = work( ii, jj )
318 50 CONTINUE
319 60 CONTINUE
320 END IF
321 END IF
322 70 CONTINUE
323 ELSE
324
325
326
327
328
329
330
331 DO 90 j = 1, nb
332 DO 80 i = j + 1, nb
333 work( i, j ) = zero
334 80 CONTINUE
335 90 CONTINUE
336
337
338
339 DO 140 i = 1, n, nb
340 ib = min( nb, n-i+1 )
341
342
343
344 CALL spotf2( uplo, ib, ab( 1, i ), ldab-1, ii )
345 IF( ii.NE.0 ) THEN
346 info = i + ii - 1
347 GO TO 150
348 END IF
349 IF( i+ib.LE.n ) THEN
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365 i2 = min( kd-ib, n-i-ib+1 )
366 i3 = min( ib, n-i-kd+1 )
367
368 IF( i2.GT.0 ) THEN
369
370
371
372 CALL strsm(
'Right',
'Lower',
'Transpose',
373 $ 'Non-unit', i2, ib, one, ab( 1, i ),
374 $ ldab-1, ab( 1+ib, i ), ldab-1 )
375
376
377
378 CALL ssyrk(
'Lower',
'No Transpose', i2, ib,
379 $ -one,
380 $ ab( 1+ib, i ), ldab-1, one,
381 $ ab( 1, i+ib ), ldab-1 )
382 END IF
383
384 IF( i3.GT.0 ) THEN
385
386
387
388 DO 110 jj = 1, ib
389 DO 100 ii = 1, min( jj, i3 )
390 work( ii, jj ) = ab( kd+1-jj+ii, jj+i-1 )
391 100 CONTINUE
392 110 CONTINUE
393
394
395
396 CALL strsm(
'Right',
'Lower',
'Transpose',
397 $ 'Non-unit', i3, ib, one, ab( 1, i ),
398 $ ldab-1, work, ldwork )
399
400
401
402 IF( i2.GT.0 )
403 $
CALL sgemm(
'No transpose',
'Transpose', i3,
404 $ i2,
405 $ ib, -one, work, ldwork,
406 $ ab( 1+ib, i ), ldab-1, one,
407 $ ab( 1+kd-ib, i+ib ), ldab-1 )
408
409
410
411 CALL ssyrk(
'Lower',
'No Transpose', i3, ib,
412 $ -one,
413 $ work, ldwork, one, ab( 1, i+kd ),
414 $ ldab-1 )
415
416
417
418 DO 130 jj = 1, ib
419 DO 120 ii = 1, min( jj, i3 )
420 ab( kd+1-jj+ii, jj+i-1 ) = work( ii, jj )
421 120 CONTINUE
422 130 CONTINUE
423 END IF
424 END IF
425 140 CONTINUE
426 END IF
427 END IF
428 RETURN
429
430 150 CONTINUE
431 RETURN
432
433
434
subroutine xerbla(srname, info)
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM
subroutine ssyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
SSYRK
integer function ilaenv(ispec, name, opts, n1, n2, n3, n4)
ILAENV
logical function lsame(ca, cb)
LSAME
subroutine spbtf2(uplo, n, kd, ab, ldab, info)
SPBTF2 computes the Cholesky factorization of a symmetric/Hermitian positive definite band matrix (un...
subroutine spotf2(uplo, n, a, lda, info)
SPOTF2 computes the Cholesky factorization of a symmetric/Hermitian positive definite matrix (unblock...
subroutine strsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
STRSM