DORMQL(3)

πŸ“¦ version 3.12.0, in opensuse-leap 16.0

πŸ’– DORMQL β€” the LAPACK page, but make it make sense πŸ’–

Okay bestie, so this is a page from LAPACK (yes, that LAPACK, the linear-algebra royalty πŸ‘‘), and it lives at:

/home/abuild/rpmbuild/BUILD/lapack-static-3.12.0-build/lapack-3.12.0/SRC/dormql.f

And before you ask β€” yes, it's a .f file, it's Fortran, no we're not scared of it, we're built different. πŸ’…


✨ SYNOPSIS ✨

Functions/Subroutines

Here's the whole cast list, literally one subroutine and it's the main character:

subroutine DORMQL (side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
DORMQL

That's it. That's the synopsis. She's lowkey mysterious like that. πŸŽ€


πŸ¦‹ Function/Subroutine Documentation πŸ¦‹

Okay so here's the full signature, look at all these arguments, she's thriving:

subroutine DORMQL (character side, character trans, integer m, integer n,
    integer k, double precision, dimension( lda, * ) a, integer lda, double
    precision, dimension( * ) tau, double precision, dimension( ldc, * ) c,
    integer ldc, double precision, dimension( * ) work, integer lwork,
    integer info)
DORMQL

🌸 Purpose 🌸

Bestie, gather round. DORMQL overwrites the general real M-by-N matrix C with:

                SIDE = 'L'     SIDE = 'R'
TRANS = 'N':      Q * C          C * Q
TRANS = 'T':      Q**T * C       C * Q**T

...where Q is a real orthogonal matrix defined as the product of k elementary reflectors:

      Q = H(k) . . . H(2) H(1)

...as returned by DGEQLF. And Q is of order M if SIDE = 'L' and of order N if SIDE = 'R'. No cap, that's the whole vibe check. πŸ¦‹


πŸ’œ Parameters πŸ’œ

Okay this is the part where you take notes, bestie, because every single one of these matters and I'm not letting you skip any.

  • SIDE β€” SIDE is CHARACTER*1. It's giving direction.
    • = 'L': apply Q or Q**T from the Left;
    • = 'R': apply Q or Q**T from the Right.
  • TRANS β€” TRANS is CHARACTER*1. This one's about flipping, not direction.
    • = 'N': No transpose, apply Q;
    • = 'T': Transpose, apply Q**T.
  • M β€” M is INTEGER. The number of rows of the matrix C. Requirement: M >= 0. (Zero is allowed, she's inclusive. ✨)
  • N β€” N is INTEGER. The number of columns of the matrix C. Requirement: N >= 0. Same deal.
  • K β€” K is INTEGER. The number of elementary reflectors whose product defines the matrix Q. So:
    • If SIDE = 'L', then M >= K >= 0;
    • if SIDE = 'R', then N >= K >= 0.

Respect the bracket, it's non-negotiable. 🫢

  • A β€” A is DOUBLE PRECISION array, dimension (LDA,K). The i-th column must contain the vector which defines the elementary reflector H(i), for i = 1,2,...,k, as returned by DGEQLF in the last k columns of its array argument A. She comes pre-filled by her ex (DGEQLF), that's just how it is. 😭
  • LDA β€” LDA is INTEGER. The leading dimension of the array A.
    • If SIDE = 'L', LDA >= max(1,M);
    • if SIDE = 'R', LDA >= max(1,N).
  • TAU β€” TAU is DOUBLE PRECISION array, dimension (K). TAU(i) must contain the scalar factor of the elementary reflector H(i), as returned by DGEQLF. Scalar factor = the little ✨magic number✨ per reflector.
  • C β€” C is DOUBLE PRECISION array, dimension (LDC,N).
    • On entry: the M-by-N matrix C.
    • On exit: C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q.
Heads up: C does not survive this. She gets overwritten, that's the whole function of the function. Do not come crying to me about your original matrix later. πŸ’€
  • LDC β€” LDC is INTEGER. The leading dimension of the array C. Requirement: LDC >= max(1,M).
  • WORK β€” WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)).
    • On exit, if INFO = 0, WORK(1) returns the optimal LWORK. She's self-aware, she tells you what she wants. πŸŽ€
  • LWORK β€” LWORK is INTEGER. The dimension of the array WORK.
    • If SIDE = 'L', LWORK >= max(1,N);
    • if SIDE = 'R', LWORK >= max(1,M).
    • For good performance, LWORK should generally be larger. (Bigger workspace = bigger slay. πŸ”₯)
    • > Special mode: if LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. So you get the answer without getting yelled at. Iconic.
  • INFO β€” INFO is INTEGER. The receipts:
    • = 0: successful exit πŸŽ‰
    • < 0: if INFO = -i, the i-th argument had an illegal value πŸ™ˆ

πŸ‘‘ Author πŸ‘‘

Take a bow, academic institutions:

  • Univ. of Tennessee
  • Univ. of California Berkeley
  • Univ. of Colorado Denver
  • NAG Ltd.

Definition at line 165 of file dormql.f. (Yes, line 165, we counted, we're thorough like that. πŸ’…)


⭐ Author ⭐

This page was generated automatically by Doxygen for LAPACK from the source code. Not a human, just Doxygen doing her little autogenerated thing. πŸ€–βœ¨


And that's the whole page, bestie β€” a whole LAPACK function documented and understood. This one's from LAPACK, Version 3.12.0, and it lives at /home/abui...RC/dormql.f(3) if you ever need to find her again. Obsessed with us for getting through all thirteen parameters together. Periodt. πŸ’–πŸŽ€πŸ¦‹

πŸ“¦ where this page comes from