146 RECURSIVE SUBROUTINE cgbtrf( M, N, KL, KU, AB, LDAB, IPIV, INFO )
154 INTEGER info, kl, ku, ldab, m, n
158 COMPLEX ab( ldab, * )
165 parameter( one = ( 1.0e+0, 0.0e+0 ),
166 $ zero = ( 0.0e+0, 0.0e+0 ) )
167 INTEGER nbmax, ldwork
168 parameter( nbmax = 64, ldwork = nbmax+1 )
171 INTEGER i, i2, i3, ii, ip, j, j2, j3, jb, jj, jm, jp,
172 $ ju, k2, km, kv, nb, nw
176 COMPLEX work13( ldwork, nbmax ),
177 $ work31( ldwork, nbmax )
202 ELSE IF( n.LT.0 )
THEN
204 ELSE IF( kl.LT.0 )
THEN
206 ELSE IF( ku.LT.0 )
THEN
208 ELSE IF( ldab.LT.kl+kv+1 )
THEN
212 CALL
xerbla(
'CGBTRF', -info )
218 IF( m.EQ.0 .OR. n.EQ.0 )
223 nb =
ilaenv( 1,
'CGBTRF',
' ', m, n, kl, ku )
228 nb = min( nb, nbmax )
230 IF( nb.LE.1 .OR. nb.GT.kl )
THEN
234 CALL
cgbtf2( m, n, kl, ku, ab, ldab, ipiv, info )
243 work13( i, j ) = zero
251 work31( i, j ) = zero
259 DO 60 j = ku + 2, min( kv, n )
260 DO 50 i = kv - j + 2, kl
270 DO 180 j = 1, min( m, n ), nb
271 jb = min( nb, min( m, n )-j+1 )
285 i2 = min( kl-jb, m-j-jb+1 )
286 i3 = min( jb, m-j-kl+1 )
292 DO 80 jj = j, j + jb - 1
296 IF( jj+kv.LE.n )
THEN
298 ab( i, jj+kv ) = zero
306 jp =
icamax( km+1, ab( kv+1, jj ), 1 )
307 ipiv( jj ) = jp + jj - j
308 IF( ab( kv+jp, jj ).NE.zero )
THEN
309 ju = max( ju, min( jj+ku+jp-1, n ) )
314 IF( jp+jj-1.LT.j+kl )
THEN
316 CALL
cswap( jb, ab( kv+1+jj-j, j ), ldab-1,
317 $ ab( kv+jp+jj-j, j ), ldab-1 )
323 CALL
cswap( jj-j, ab( kv+1+jj-j, j ), ldab-1,
324 $ work31( jp+jj-j-kl, 1 ), ldwork )
325 CALL
cswap( j+jb-jj, ab( kv+1, jj ), ldab-1,
326 $ ab( kv+jp, jj ), ldab-1 )
332 CALL
cscal( km, one / ab( kv+1, jj ), ab( kv+2, jj ),
339 jm = min( ju, j+jb-1 )
341 $ CALL
cgeru( km, jm-jj, -one, ab( kv+2, jj ), 1,
342 $ ab( kv, jj+1 ), ldab-1,
343 $ ab( kv+1, jj+1 ), ldab-1 )
355 nw = min( jj-j+1, i3 )
357 $ CALL
ccopy( nw, ab( kv+kl+1-jj+j, jj ), 1,
358 $ work31( 1, jj-j+1 ), 1 )
364 j2 = min( ju-j+1, kv ) - jb
365 j3 = max( 0, ju-j-kv+1 )
370 CALL
claswp( j2, ab( kv+1-jb, j+jb ), ldab-1, 1, jb,
375 DO 90 i = j, j + jb - 1
376 ipiv( i ) = ipiv( i ) + j - 1
385 DO 100 ii = j + i - 1, j + jb - 1
388 temp = ab( kv+1+ii-jj, jj )
389 ab( kv+1+ii-jj, jj ) = ab( kv+1+ip-jj, jj )
390 ab( kv+1+ip-jj, jj ) = temp
401 CALL
ctrsm(
'Left',
'Lower',
'No transpose',
'Unit',
402 $ jb, j2, one, ab( kv+1, j ), ldab-1,
403 $ ab( kv+1-jb, j+jb ), ldab-1 )
409 CALL
cgemm(
'No transpose',
'No transpose', i2, j2,
410 $ jb, -one, ab( kv+1+jb, j ), ldab-1,
411 $ ab( kv+1-jb, j+jb ), ldab-1, one,
412 $ ab( kv+1, j+jb ), ldab-1 )
419 CALL
cgemm(
'No transpose',
'No transpose', i3, j2,
420 $ jb, -one, work31, ldwork,
421 $ ab( kv+1-jb, j+jb ), ldab-1, one,
422 $ ab( kv+kl+1-jb, j+jb ), ldab-1 )
433 work13( ii, jj ) = ab( ii-jj+1, jj+j+kv-1 )
439 CALL
ctrsm(
'Left',
'Lower',
'No transpose',
'Unit',
440 $ jb, j3, one, ab( kv+1, j ), ldab-1,
447 CALL
cgemm(
'No transpose',
'No transpose', i2, j3,
448 $ jb, -one, ab( kv+1+jb, j ), ldab-1,
449 $ work13, ldwork, one, ab( 1+jb, j+kv ),
457 CALL
cgemm(
'No transpose',
'No transpose', i3, j3,
458 $ jb, -one, work31, ldwork, work13,
459 $ ldwork, one, ab( 1+kl, j+kv ), ldab-1 )
466 ab( ii-jj+1, jj+j+kv-1 ) = work13( ii, jj )
474 DO 160 i = j, j + jb - 1
475 ipiv( i ) = ipiv( i ) + j - 1
483 DO 170 jj = j + jb - 1, j, -1
484 jp = ipiv( jj ) - jj + 1
489 IF( jp+jj-1.LT.j+kl )
THEN
493 CALL
cswap( jj-j, ab( kv+1+jj-j, j ), ldab-1,
494 $ ab( kv+jp+jj-j, j ), ldab-1 )
499 CALL
cswap( jj-j, ab( kv+1+jj-j, j ), ldab-1,
500 $ work31( jp+jj-j-kl, 1 ), ldwork )
506 nw = min( i3, jj-j+1 )
508 $ CALL
ccopy( nw, work31( 1, jj-j+1 ), 1,
509 $ ab( kv+kl+1-jj+j, jj ), 1 )