DDBTRF(3)

πŸ“¦ version 1.5, in ubuntu jammy

πŸ’– DDBTRF πŸ’–

okay so bestie, gather round, because this one is a linear algebra moment and it is lowkey iconic. This is the LAPACK routine DDBTRF β€” it computes an LU factorization of a real m-by-n band matrix A, and it does it without partial pivoting and without row interchanges. Yes, no pivoting. We're raw-dogging the elimination here. ✨


✨ SYNOPSIS ✨

SUBROUTINE DDBTRF( M, N, KL, KU, AB, LDAB, INFO )
    INTEGER INFO, KL, KU, LDAB, M, N
    DOUBLE PRECISION AB( LDAB, * )

πŸ¦‹ DESCRIPTION πŸ¦‹

Ddbtrf computes an LU factorization of a real m-by-n band matrix A, and it does not use partial pivoting or row interchanges. Not even a little. πŸ’…

This is the blocked version of the algorithm, and it calls Level 3 BLAS, which is the fast one, the main character one, the one you want doing your heavy lifting. πŸ‘‘


πŸŽ€ ARGUMENTS πŸŽ€

  • M (input) INTEGER β€” the number of rows of the matrix A. Gotta be M >= 0.
  • N (input) INTEGER β€” the number of columns of the matrix A. Gotta be N >= 0.
  • KL (input) INTEGER β€” the number of subdiagonals within the band of A. KL >= 0, no exceptions.
  • KU (input) INTEGER β€” the number of superdiagonals within the band of A. KU >= 0 too, periodt.
  • AB (input/output) REAL array, dimension (LDAB,N) β€” okay this is the whole vibe right here, so listen up.

On entry, it holds the matrix A in band storage, in rows KL+1 to 2*KL+KU+1. Rows 1 to KL of the array don't need to be set β€” they're just chilling, unbothered, empty. πŸ™ˆ The j-th column of A is stored in the j-th column of the array AB like this:

AB(kl+ku+1+i-j,j) = A(i,j) for max(1,j-ku)<=i<=min(m,j+kl)

On exit, it holds the details of the factorization:

  • U is stored as an upper triangular band matrix with KL+KU superdiagonals, in rows 1 to KL+KU+1.
  • the multipliers used during the factorization are stored in rows KL+KU+2 to 2*KL+KU+1.

See below for further details, bestie, I promise it's all there. 🫢

  • LDAB (input) INTEGER β€” the leading dimension of the array AB. It has to satisfy LDAB >= 2*KL+KU+1. Do not play with this one.
  • INFO (output) INTEGER β€” the receipts, and it can go three ways:
    • = 0: successful exit. slay. πŸŽ‰
    • < 0: if INFO = -i, the i-th argument had an illegal value. someone handed us garbage.
    • > 0: if INFO = +i, U(i,i) is exactly zero. The factorization has been completed, but the factor U is exactly singular, and division by zero will occur if it is used to solve a system of equations. 😭 Not a drill. Not a vibe. Straight up undefined nonsense incoming.

🌸 THE BAND STORAGE SCHEME, ILLUSTRATED 🌸

okay so here's the visual, when M = N = 6, KL = 2, KU = 1:

On entry:                       On exit:

    *   a12  a23  a34  a45  a56      *   u12  u23  u34  u45  u56
   a11  a22  a33  a44  a55  a66     u11  u22  u33  u44  u55  u66
   a21  a32  a43  a54  a65   *      m21  m32  m43  m54  m65   *
   a31  a42  a53  a64   *    *      m31  m42  m53  m64   *    *

Array elements marked * are not used by the routine. They're just there. Decorative. Background characters. πŸ’€

⚠️ real talk: because there's no pivoting, if that diagonal goes zero you get INFO > 0 and the whole thing is singular. read the INFO value. always read the INFO value.

and that's the whole page, bestie πŸ’– this one is a LAPACK original β€” the version and the date live down in the footer, so peek at yours if you need the receipts. now go forth and factor some bands. πŸŒˆπŸ¦‹βœ¨

πŸ“¦ where this page comes from