PZLAUUM(l)

πŸ“¦ version 1.5, in ubuntu jammy

✨ NAME ✨

PZLAUUM β€” okay so bestie, this one πŸ’… computes the product U * U' or L' * L, where the triangular factor U or L is stored in the upper or lower triangular part of the distributed matrix sub( A ) = A(IA:IA+N-1,JA:JA+N-1).

Also it's a LAPACK auxiliary routine, that's the (l) up in PZLAUUM(l) β€” we are so in our LAPACK era rn 🫢


🌸 SYNOPSIS 🌸

SUBROUTINE PZLAUUM( UPLO, N, A, IA, JA, DESCA )

    CHARACTER       UPLO

    INTEGER         IA, JA, N

    INTEGER         DESCA( * )

    COMPLEX*16      A( * )

πŸ¦‹ PURPOSE πŸ¦‹

PZLAUUM computes the product U * U' or L' * L, where the triangular factor U or L is stored in the upper or lower triangular part of the distributed matrix sub( A ) = A(IA:IA+N-1,JA:JA+N-1).

Not me explaining the two moods of this function 😭 here's the vibe check:

  • If UPLO = 'U' or 'u' then the upper triangle of the result is stored, overwriting the factor U in sub( A ).
  • If UPLO = 'L' or 'l' then the lower triangle of the result is stored, overwriting the factor L in sub( A ).

This is the blocked form of the algorithm, calling Level 3 PBLAS. Ate. πŸ”₯

πŸ“ Notes πŸ“

Every global data object has a lil bestie called a description vector πŸŽ€ This vector stores all the info you need to figure out the mapping between an object element and its corresponding process and memory location. It's giving ✨logistics✨.

Let A be a generic term for any 2D block cyclicly distributed array. Such a global array has an associated description vector DESCA. In the following comments, the character _ should be read as "of the global array". iykyk πŸ’…

  • DTYPE_A (global) β€” stored in DESCA( DTYPE_ ): the descriptor type. In this case, DTYPE_A = 1.
  • CTXT_A (global) β€” stored in DESCA( CTXT_ ): the BLACS context handle, indicating the BLACS process grid A is distributed over. The context itself is global, but the handle (the integer value) may vary.
  • M_A (global) β€” stored in DESCA( M_ ): the number of rows in the global array A.
  • N_A (global) β€” stored in DESCA( N_ ): the number of columns in the global array A.
  • MB_A (global) β€” stored in DESCA( MB_ ): the blocking factor used to distribute the rows of the array.
  • NB_A (global) β€” stored in DESCA( NB_ ): the blocking factor used to distribute the columns of the array.
  • RSRC_A (global) β€” stored in DESCA( RSRC_ ): the process row over which the first row of the array A is distributed.
  • CSRC_A (global) β€” stored in DESCA( CSRC_ ): the process column over which the first column of the array A is distributed.
  • LLD_A (local) β€” stored in DESCA( LLD_ ): the leading dimension of the local array. LLD_A >= MAX(1,LOCr(M_A)).

Let K be the number of rows or columns of a distributed matrix, and assume that its process grid has dimension p x q.

  • LOCr( K ) denotes the number of elements of K that a process would receive if K were distributed over the p processes of its process column.
  • Similarly, LOCc( K ) denotes the number of elements of K that a process would receive if K were distributed over the q processes of its process row.

The values of LOCr() and LOCc() may be determined via a call to the ScaLAPACK tool function, NUMROC:

LOCr( M ) = NUMROC( M, MB_A, MYROW, RSRC_A, NPROW ),
LOCc( N ) = NUMROC( N, NB_A, MYCOL, CSRC_A, NPCOL ).

An upper bound for these quantities may be computed by:

LOCr( M ) <= ceil( ceil(M/MB_A)/NPROW )*MB_A
LOCc( N ) <= ceil( ceil(N/NB_A)/NPCOL )*NB_A

πŸŽ€ ARGUMENTS πŸŽ€

  • UPLO β€” (global input) CHARACTER*1 β€” Specifies whether the triangular factor stored in the distributed matrix sub( A ) is upper or lower triangular:
    • = 'U': Upper triangular
    • = 'L': Lower triangular
  • N β€” (global input) INTEGER β€” The number of rows and columns to be operated on, i.e. the order of the triangular factor U or L. N >= 0. (Zero is allowed bestie, don't come for me.)
  • A β€” (local input/local output) COMPLEX*16 β€” pointer into the local memory to an array of dimension (LLD_A, LOCc(JA+N-1)). On entry, the local pieces of the triangular factor L or U. On exit, if UPLO = 'U', the upper triangle of the distributed matrix sub( A ) is overwritten with the upper triangle of the product U * U'; if UPLO = 'L', the lower triangle of sub( A ) is overwritten with the lower triangle of the product L' * L. She's a main character who rewrites herself, periodt πŸ’…
  • IA β€” (global input) INTEGER β€” The row index in the global array A indicating the first row of sub( A ).
  • JA β€” (global input) INTEGER β€” The column index in the global array A indicating the first column of sub( A ).
  • DESCA β€” (global and local input) INTEGER array of dimension DLEN_ β€” The array descriptor for the distributed matrix A.

🫢 no cap, this is the whole page β€” nothing skipped, nothing extra, every flag accounted for. πŸ’–

LAPACK version 1.5 🌈 dated 12 May 1997 β€” yeah she's vintage, she's iconic, she's still slaying πŸ’€βœ¨ mwah, bye bestie πŸŽ€πŸ¦‹

πŸ“¦ where this page comes from