PCLASE2(l)
β¨ NAME β¨
pclase2 β it sets up your distributed matrix sub( A ) (that's A(IA:IA+M-1,JA:JA+N-1)) so the diagonal is all BETA and the offdiagonals are all ALPHA. That's the whole job bestie, and it eats. π
π SYNOPSIS π
SUBROUTINE PCLASE2( UPLO, M, N, ALPHA, BETA, A, IA, JA, DESCA )
CHARACTER UPLO
INTEGER IA, JA, M, N
COMPLEX ALPHA, BETA
INTEGER DESCA( * )
COMPLEX A( * )
π¦ PURPOSE π¦
ok so here's the vibe: PCLASE2 initializes an M-by-N distributed matrix sub( A ) β aka A(IA:IA+M-1,JA:JA+N-1) β setting it to BETA on the diagonal and ALPHA on the offdiagonals. πΈ
And PCLASE2 requires that only one dimension of the matrix operand is distributed. no cap. π
π Notes π
Every global data object out here has a description vector riding with it, and that vector is holding all the info you need to map an element of the object to its 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. And in the comments below, read the character _ as "of the global array". iykyk. π§
Here's the whole notation-to-descriptor situation:
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 gridAis 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 arrayA.N_A(global) β stored inDESCA( N_ )β the number of columns in the global arrayA.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 arrayAis distributed.CSRC_A(global) β stored inDESCA( CSRC_ )β the process column over which the first column of the arrayAis distributed.LLD_A(local) β stored inDESCA( LLD_ )β the leading dimension of the local array.LLD_A >= MAX(1,LOCr(M_A)). β
Now let K be the number of rows or columns of a distributed matrix, and assume its process grid has dimension p x q.
LOCr( K ) = 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 ) = the number of elements of K that a process would receive if K were distributed over the q processes of its process row.
You can get the values of LOCr() and LOCc() by calling the ScaLAPACK tool function NUMROC, like so:
LOCr( M ) = NUMROC( M, MB_A, MYROW, RSRC_A, NPROW ),
LOCc( N ) = NUMROC( N, NB_A, MYCOL, CSRC_A, NPCOL ).
And 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β specifies which part of the distributed matrixsub( A )gets set:= 'U': the upper triangular part is set; the strictly lower triangular part ofsub( A )is not changed. π«Ά= 'L': the lower triangular part is set; the strictly upper triangular part ofsub( A )is not changed.- Otherwise: all of the matrix
sub( A )is set. π₯
M(global input)INTEGERβ the number of rows to be operated on, i.e. the number of rows of the distributed submatrixsub( A ).M >= 0.N(global input)INTEGERβ the number of columns to be operated on, i.e. the number of columns of the distributed submatrixsub( A ).N >= 0.ALPHA(global input)COMPLEXβ the constant the offdiagonal elements get set to.BETA(global input)COMPLEXβ the constant the diagonal elements get set to.A(local output)COMPLEXpointer into the local memory to an array of dimension(LLD_A,LOCc(JA+N-1)). This array contains the local pieces of the distributed matrixsub( A )to be set. On exit, the leading M-by-N submatrixsub( A )is set like this:
if UPLO = 'U', A(IA+i-1,JA+j-1) = ALPHA, 1<=i<=j-1, 1<=j<=N, if
UPLO = 'L', A(IA+i-1,JA+j-1) = ALPHA, j+1<=i<=M, 1<=j<=N,
otherwise, A(IA+i-1,JA+j-1) = ALPHA, 1<=i<=M, 1<=j<=N,
IA+i.NE.JA+j, and, for all UPLO, A(IA+i-1,JA+i-1) = BETA,
1<=i<=min(M,N).
IA(global input)INTEGERβ the row index in the global arrayAindicating the first row ofsub( A ).JA(global input)INTEGERβ the column index in the global arrayAindicating the first column ofsub( A ).DESCA(global and local input)INTEGERarray of dimensionDLEN_. The array descriptor for the distributed matrixA. π
π«Ά that's the whole page bestie, every flag, every default, nothing skipped, periodt.
π this was LAPACK auxiliary routine, version 1.5, dated 12 May 1997 π β shoutout to the LAPACK girlies who wrote it, mwah, iconic behavior, no notes. πβ¨
π¦ 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