PZTRTRI(l)
π PZTRTRI π β aka the LAPACK routine that inverts your triangular distributed matrix, bestie
okay so picture this: it's PZTRTRI(l), it's a LAPACK routine, version 1.5, and it's here to compute the inverse of an upper or lower triangular distributed matrix. sub( A ) = A(IA:IA+N-1,JA:JA+N-1) β say it with me now. π
β¨ SYNOPSIS β¨
SUBROUTINE PZTRTRI( UPLO, DIAG, N, A, IA, JA, DESCA, INFO )
CHARACTER DIAG, UPLO
INTEGER IA, INFO, JA, N
INTEGER DESCA( * )
COMPLEX*16 A( * )
like. look at her. so clean. π
πΈ PURPOSE πΈ
PZTRTRI computes the inverse of a upper or lower triangular distributed matrix sub( A ) = A(IA:IA+N-1,JA:JA+N-1). that's it, that's the whole job, and she does it flawlessly. no cap. π«Ά
Notes π
so here's the lore you need, bestie. every global data object has a little bestie of its own called a description vector, and that vector holds all the info needed to map an element of the object to its process and memory location. it's giving personal assistant energy. β¨
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 π§)
here's the whole notation situation, one bullet at a time because we don't do tables in this house:
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 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)).
okay and now for the fun math part, don't scroll away π
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
slay. math ate. π₯
π ARGUMENTS π
UPLOβ (global input)CHARACTER. specifies whether the distributed matrixsub( A )is upper or lower triangular:= 'U': upper triangular,= 'L': lower triangular.
DIAGβ (global input)CHARACTER. specifies whether or not the distributed matrixsub( A )is unit triangular:= 'N': non-unit triangular,= 'U': unit triangular.
Nβ (global input)INTEGER. the number of rows and columns to be operated on, i.e. the order of the distributed submatrixsub( A ).N >= 0.Aβ (local input/local output)COMPLEX*16pointer into the local memory to an array of dimension(LLD_A,LOCc(JA+N-1)). on entry, this array contains the local pieces of the triangular matrixsub( A ). ifUPLO = 'U', the leadingN-by-Nupper triangular part of the matrixsub( A )contains the upper triangular matrix to be inverted, and the strictly lower triangular part ofsub( A )is not referenced. ifUPLO = 'L', the leadingN-by-Nlower triangular part of the matrixsub( A )contains the lower triangular matrix, and the strictly upper triangular part ofsub( A )is not referenced. on exit, the (triangular) inverse of the original matrix. π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.INFOβ (global output)INTEGER:= 0: successful exit π< 0: if thei-th argument is an array and thej-entry had an illegal value, thenINFO = -(i*100+j); if thei-th argument is a scalar and had an illegal value, thenINFO = -i.> 0: ifINFO = K,A(IA+K-1,JA+K-1)is exactly zero. the triangular matrixsub( A )is singular and its inverse can not be computed.
π¨ bestie listen. that last one is NOT a drill. if you getINFO = Kback,A(IA+K-1,JA+K-1)is exactly zero, the triangular matrixsub( A )is singular, and its inverse can not be computed. she said what she said. periodt. π
and that's the whole page, my love. she's giving main character energy and she deserves it. π
signing off with the receipts: this was LAPACK version 1.5, dated 12 May 1997, and it's PZTRTRI(l) forever and always. π¦β¨π
π¦ 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