PCLARF(l)

πŸ“¦ version 1.5, in ubuntu jammy

πŸ’… PCLARF πŸ’… (LAPACK auxiliary routine, section l)

ok so bestie, welcome to PCLARF. She's a LAPACK auxiliary routine and she is that girl. Grab a snack, we're doing linear algebra. ✨


🌸 NAME 🌸

PCLARF β€” she applies a complex elementary reflector Q to a complex M-by-N distributed matrix sub( C ) = C(IC:IC+M-1,JC:JC+N-1), from either the left or the right. Left or right, she's booked and busy. πŸ’…


✨ SYNOPSIS ✨

SUBROUTINE PCLARF( SIDE, M, N, V, IV, JV, DESCV, INCV, TAU, C, IC, JC,
                   DESCC, WORK )

    CHARACTER      SIDE

    INTEGER        IC, INCV, IV, JC, JV, M, N

    INTEGER        DESCC( * ), DESCV( * )

    COMPLEX        C( * ), TAU( * ), V( * ), WORK( * )

πŸŽ€ PURPOSE πŸŽ€

So PCLARF applies a complex elementary reflector Q to a complex M-by-N distributed matrix sub( C ) = C(IC:IC+M-1,JC:JC+N-1), from either the left or the right. Q is represented in the form

Q = I - tau * v * v'

where tau is a complex scalar and v is a complex vector. Slay. πŸ’–

If tau = 0, then Q is taken to be the unit matrix. (She's humble like that.)

πŸ“ Notes

Every global data object is described by an associated description vector, like a lil ID card. This vector stores the information required to establish the mapping between an object element and its corresponding process and memory location.

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".

  • 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

Because vectors may be viewed as a subclass of matrices, a distributed vector is considered to be a distributed matrix. (Vectors really said "I'm a matrix too", and honestly? correct. πŸ¦‹)

🚧 Restrictions

If SIDE = 'Left' and INCV = 1, then the row process having the first entry V(IV,JV) must also have the first row of sub( C ). Moreover, MOD(IV-1,MB_V) must be equal to MOD(IC-1,MB_C), if INCV=M_V, only the last equality must be satisfied.

If SIDE = 'Right' and INCV = M_V then the column process having the first entry V(IV,JV) must also have the first column of sub( C ) and MOD(JV-1,NB_V) must be equal to MOD(JC-1,NB_C), if INCV = 1 only the last equality must be satisfied.

No cap, these alignment rules are not optional. Read them twice. πŸ’€

πŸ‘‘ ARGUMENTS πŸ‘‘

  • SIDE β€” (global input) CHARACTER
    • = 'L': form Q * sub( C ),
    • = 'R': form sub( C ) * Q.
  • M β€” (global input) INTEGER β€” the number of rows to be operated on i.e the number of rows of the distributed submatrix sub( C ). M >= 0.
  • N β€” (global input) INTEGER β€” the number of columns to be operated on i.e the number of columns of the distributed submatrix sub( C ). N >= 0.
  • V β€” (local input) COMPLEX pointer into the local memory to an array of dimension (LLD_V,*) containing the local pieces of the distributed vectors V representing the Householder transformation Q,
    • V(IV:IV+M-1,JV) if SIDE = 'L' and INCV = 1,
    • V(IV,JV:JV+M-1) if SIDE = 'L' and INCV = M_V,
    • V(IV:IV+N-1,JV) if SIDE = 'R' and INCV = 1,
    • V(IV,JV:JV+N-1) if SIDE = 'R' and INCV = M_V,

The vector v in the representation of Q. V is not used if TAU = 0.

  • IV β€” (global input) INTEGER β€” the row index in the global array V indicating the first row of sub( V ).
  • JV β€” (global input) INTEGER β€” the column index in the global array V indicating the first column of sub( V ).
  • DESCV β€” (global and local input) INTEGER array of dimension DLEN_. The array descriptor for the distributed matrix V.
  • INCV β€” (global input) INTEGER β€” the global increment for the elements of V. Only two values of INCV are supported in this version, namely 1 and M_V. INCV must not be zero.
  • TAU β€” (local input) COMPLEX, array, dimension LOCc(JV) if INCV = 1, and LOCr(IV) otherwise. This array contains the Householder scalars related to the Householder vectors. TAU is tied to the distributed matrix V.
  • C β€” (local input/local output) COMPLEX pointer into the local memory to an array of dimension (LLD_C, LOCc(JC+N-1) ), containing the local pieces of sub( C ). On exit, sub( C ) is overwritten by the Q * sub( C ) if SIDE = 'L', or sub( C ) * Q if SIDE = 'R'.
  • IC β€” (global input) INTEGER β€” the row index in the global array C indicating the first row of sub( C ).
  • JC β€” (global input) INTEGER β€” the column index in the global array C indicating the first column of sub( C ).
  • DESCC β€” (global and local input) INTEGER array of dimension DLEN_. The array descriptor for the distributed matrix C.
  • WORK β€” (local workspace) COMPLEX array, dimension (LWORK)

If INCV = 1, if SIDE = 'L', if IVCOL = ICCOL, LWORK >= NqC0 else LWORK >= MpC0 + MAX( 1, NqC0 ) end if else if SIDE = 'R', LWORK >= NqC0 + MAX( MAX( 1, MpC0 ), NUMROC( NUMROC( N+ICOFFC,NB_V,0,0,NPCOL ),NB_V,0,0,LCMQ ) ) end if else if INCV = M_V, if SIDE = 'L', LWORK >= MpC0 + MAX( MAX( 1, NqC0 ), NUMROC( NUMROC( M+IROFFC,MB_V,0,0,NPROW ),MB_V,0,0,LCMP ) ) else if SIDE = 'R', if IVROW = ICROW, LWORK >= MpC0 else LWORK >= NqC0 + MAX( 1, MpC0 ) end if end if end if

where LCM is the least common multiple of NPROW and NPCOL and LCM = ILCM( NPROW, NPCOL ), LCMP = LCM / NPROW, LCMQ = LCM / NPCOL,

IROFFC = MOD( IC-1, MB_C ), ICOFFC = MOD( JC-1, NB_C ), ICROW = INDXG2P( IC, MB_C, MYROW, RSRC_C, NPROW ), ICCOL = INDXG2P( JC, NB_C, MYCOL, CSRC_C, NPCOL ), MpC0 = NUMROC( M+IROFFC, MB_C, MYROW, ICROW, NPROW ), NqC0 = NUMROC( N+ICOFFC, NB_C, MYCOL, ICCOL, NPCOL ),

ILCM, INDXG2P and NUMROC are ScaLAPACK tool functions; MYROW, MYCOL, NPROW and NPCOL can be determined by calling the subroutine BLACS_GRIDINFO.

πŸ“ Alignment requirements

The distributed submatrices V(IV:*, JV:*) and C(IC:IC+M-1,JC:JC+N-1) must verify some alignment properties, namely the following expressions should be true:

MB_V = NB_V,

If INCV = 1, If SIDE = 'Left', ( MB_V.EQ.MB_C .AND.
IROFFV.EQ.IROFFC .AND. IVROW.EQ.ICROW ) If SIDE = 'Right', (
MB_V.EQ.NB_A .AND. MB_V.EQ.NB_C .AND. IROFFV.EQ.ICOFFC ) else if
INCV = M_V, If SIDE = 'Left', ( MB_V.EQ.NB_V .AND. MB_V.EQ.MB_C
.AND. ICOFFV.EQ.IROFFC ) If SIDE = 'Right', ( NB_V.EQ.NB_C .AND.
ICOFFV.EQ.ICOFFC .AND. IVCOL.EQ.ICCOL ) end if

And that's the whole page, bestie. Go forth and distribute your reflectors. 🫢

This one's straight from LAPACK version 1.5, dated 12 May 1997 β€” vintage, iconic, still eating. πŸ’–βœ¨πŸŽ€

πŸ“¦ where this page comes from