143 SUBROUTINE sgbtrf( M, N, KL, KU, AB, LDAB, IPIV, INFO )
150 INTEGER INFO, KL, KU, LDAB, M, N
161 parameter( one = 1.0e+0, zero = 0.0e+0 )
162 INTEGER NBMAX, LDWORK
163 parameter( nbmax = 64, ldwork = nbmax+1 )
166 INTEGER I, I2, I3, II, IP, J, J2, J3, JB, JJ, JM, JP,
171 REAL WORK13( LDWORK, NBMAX ),
172 $ WORK31( LDWORK, NBMAX )
175 INTEGER ILAENV, ISAMAX
176 EXTERNAL ilaenv, isamax
197 ELSE IF( n.LT.0 )
THEN
199 ELSE IF( kl.LT.0 )
THEN
201 ELSE IF( ku.LT.0 )
THEN
203 ELSE IF( ldab.LT.kl+kv+1 )
THEN
207 CALL xerbla(
'SGBTRF', -info )
213 IF( m.EQ.0 .OR. n.EQ.0 )
218 nb = ilaenv( 1,
'SGBTRF',
' ', m, n, kl, ku )
223 nb =
min( nb, nbmax )
225 IF( nb.LE.1 .OR. nb.GT.kl )
THEN
229 CALL sgbtf2( m, n, kl, ku, ab, ldab, ipiv, info )
238 work13( i, j ) = zero
246 work31( i, j ) = zero
254 DO 60 j = ku + 2,
min( kv, n )
255 DO 50 i = kv - j + 2, kl
265 DO 180 j = 1,
min( m, n ), nb
266 jb =
min( nb,
min( m, n )-j+1 )
280 i2 =
min( kl-jb, m-j-jb+1 )
281 i3 =
min( jb, m-j-kl+1 )
287 DO 80 jj = j, j + jb - 1
291 IF( jj+kv.LE.n )
THEN
293 ab( i, jj+kv ) = zero
301 jp = isamax( km+1, ab( kv+1, jj ), 1 )
302 ipiv( jj ) = jp + jj - j
303 IF( ab( kv+jp, jj ).NE.zero )
THEN
304 ju =
max( ju,
min( jj+ku+jp-1, n ) )
309 IF( jp+jj-1.LT.j+kl )
THEN
311 CALL sswap( jb, ab( kv+1+jj-j, j ), ldab-1,
312 $ ab( kv+jp+jj-j, j ), ldab-1 )
318 CALL sswap( jj-j, ab( kv+1+jj-j, j ), ldab-1,
319 $ work31( jp+jj-j-kl, 1 ), ldwork )
320 CALL sswap( j+jb-jj, ab( kv+1, jj ), ldab-1,
321 $ ab( kv+jp, jj ), ldab-1 )
327 CALL sscal( km, one / ab( kv+1, jj ), ab( kv+2, jj ),
334 jm =
min( ju, j+jb-1 )
336 $
CALL sger( km, jm-jj, -one, ab( kv+2, jj ), 1,
337 $ ab( kv, jj+1 ), ldab-1,
338 $ ab( kv+1, jj+1 ), ldab-1 )
350 nw =
min( jj-j+1, i3 )
352 $
CALL scopy( nw, ab( kv+kl+1-jj+j, jj ), 1,
353 $ work31( 1, jj-j+1 ), 1 )
359 j2 =
min( ju-j+1, kv ) - jb
360 j3 =
max( 0, ju-j-kv+1 )
365 CALL slaswp( j2, ab( kv+1-jb, j+jb ), ldab-1, 1, jb,
370 DO 90 i = j, j + jb - 1
371 ipiv( i ) = ipiv( i ) + j - 1
380 DO 100 ii = j + i - 1, j + jb - 1
383 temp = ab( kv+1+ii-jj, jj )
385 ab( kv+1+ip-jj, jj ) = temp
396 CALL strsm(
'Left',
'Lower',
'No transpose',
'Unit',
397 $ jb, j2, one, ab( kv+1, j ), ldab-1,
398 $ ab( kv+1-jb, j+jb ), ldab-1 )
404 CALL sgemm( 'no transpose
', 'no transpose
', I2, J2,
405 $ JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
406 $ AB( KV+1-JB, J+JB ), LDAB-1, ONE,
407 $ AB( KV+1, J+JB ), LDAB-1 )
414 CALL SGEMM( 'no transpose
', 'no transpose
', I3, J2,
415 $ JB, -ONE, WORK31, LDWORK,
416 $ AB( KV+1-JB, J+JB ), LDAB-1, ONE,
417 $ AB( KV+KL+1-JB, J+JB ), LDAB-1 )
428 WORK13( II, JJ ) = AB( II-JJ+1, JJ+J+KV-1 )
434 CALL STRSM( 'left
', 'lower
', 'no transpose
', 'unit
',
435 $ JB, J3, ONE, AB( KV+1, J ), LDAB-1,
442 CALL SGEMM( 'no transpose
', 'no transpose
', I2, J3,
443 $ JB, -ONE, AB( KV+1+JB, J ), LDAB-1,
444 $ WORK13, LDWORK, ONE, AB( 1+JB, J+KV ),
452 CALL SGEMM( 'no transpose
', 'no transpose
', I3, J3,
453 $ JB, -ONE, WORK31, LDWORK, WORK13,
454 $ LDWORK, ONE, AB( 1+KL, J+KV ), LDAB-1 )
461 AB( II-JJ+1, JJ+J+KV-1 ) = WORK13( II, JJ )
469 DO 160 I = J, J + JB - 1
470 IPIV( I ) = IPIV( I ) + J - 1
478 DO 170 JJ = J + JB - 1, J, -1
479 JP = IPIV( JJ ) - JJ + 1
484.LT.
IF( JP+JJ-1J+KL ) THEN
488 CALL SSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
489 $ AB( KV+JP+JJ-J, J ), LDAB-1 )
494 CALL SSWAP( JJ-J, AB( KV+1+JJ-J, J ), LDAB-1,
495 $ WORK31( JP+JJ-J-KL, 1 ), LDWORK )
501 NW = MIN( I3, JJ-J+1 )
503 $ CALL SCOPY( NW, WORK31( 1, JJ-J+1 ), 1,
504 $ AB( KV+KL+1-JJ+J, JJ ), 1 )
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM