PCLARF(l)
π
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 inDESCA( DTYPE_ )β the descriptor type. In this case,DTYPE_A = 1.CTXT_A (global)β stored inDESCA( 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 inDESCA( M_ )β the number of rows in the global array A.N_A (global)β stored inDESCA( N_ )β the number of columns in the global array A.MB_A (global)β stored inDESCA( MB_ )β the blocking factor used to distribute the rows of the array.NB_A (global)β stored inDESCA( NB_ )β the blocking factor used to distribute the columns of the array.RSRC_A (global)β stored inDESCA( RSRC_ )β the process row over which the first row of the array A is distributed.CSRC_A (global)β stored inDESCA( CSRC_ )β the process column over which the first column of the array A is distributed.LLD_A (local)β stored inDESCA( 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': formQ * sub( C ),= 'R': formsub( C ) * Q.
Mβ (global input)INTEGERβ the number of rows to be operated on i.e the number of rows of the distributed submatrixsub( C ).M >= 0.Nβ (global input)INTEGERβ the number of columns to be operated on i.e the number of columns of the distributed submatrixsub( C ).N >= 0.Vβ (local input)COMPLEXpointer into the local memory to an array of dimension(LLD_V,*)containing the local pieces of the distributed vectorsVrepresenting the Householder transformationQ,V(IV:IV+M-1,JV)ifSIDE = 'L'andINCV = 1,V(IV,JV:JV+M-1)ifSIDE = 'L'andINCV = M_V,V(IV:IV+N-1,JV)ifSIDE = 'R'andINCV = 1,V(IV,JV:JV+N-1)ifSIDE = 'R'andINCV = 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 arrayVindicating the first row ofsub( V ).JVβ (global input)INTEGERβ the column index in the global arrayVindicating the first column ofsub( V ).DESCVβ (global and local input)INTEGERarray of dimensionDLEN_. The array descriptor for the distributed matrixV.INCVβ (global input)INTEGERβ the global increment for the elements ofV. Only two values ofINCVare supported in this version, namely1andM_V.INCVmust not be zero.TAUβ (local input)COMPLEX, array, dimensionLOCc(JV)ifINCV = 1, andLOCr(IV)otherwise. This array contains the Householder scalars related to the Householder vectors.TAUis tied to the distributed matrixV.Cβ (local input/local output)COMPLEXpointer into the local memory to an array of dimension(LLD_C, LOCc(JC+N-1) ), containing the local pieces ofsub( C ). On exit,sub( C )is overwritten by theQ * sub( C )ifSIDE = 'L', orsub( C ) * QifSIDE = 'R'.ICβ (global input)INTEGERβ the row index in the global arrayCindicating the first row ofsub( C ).JCβ (global input)INTEGERβ the column index in the global arrayCindicating the first column ofsub( C ).DESCCβ (global and local input)INTEGERarray of dimensionDLEN_. The array descriptor for the distributed matrixC.WORKβ (local workspace)COMPLEXarray, 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
- ubuntu jammy: scalapack-doc 1.5-11
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms