Developer Reference for Intel® oneAPI Math Kernel Library for C

ID 766684
Date 12/16/2022
Public

A newer version of this document is available. Customers should click here to go to the newest version.

Document Table of Contents

p?larzb

Applies a block reflector or its transpose/conjugate-transpose as returned by p?tzrzf to a general matrix.

Syntax

void pslarzb (char *side , char *trans , char *direct , char *storev , MKL_INT *m , MKL_INT *n , MKL_INT *k , MKL_INT *l , float *v , MKL_INT *iv , MKL_INT *jv , MKL_INT *descv , float *t , float *c , MKL_INT *ic , MKL_INT *jc , MKL_INT *descc , float *work );

void pdlarzb (char *side , char *trans , char *direct , char *storev , MKL_INT *m , MKL_INT *n , MKL_INT *k , MKL_INT *l , double *v , MKL_INT *iv , MKL_INT *jv , MKL_INT *descv , double *t , double *c , MKL_INT *ic , MKL_INT *jc , MKL_INT *descc , double *work );

void pclarzb (char *side , char *trans , char *direct , char *storev , MKL_INT *m , MKL_INT *n , MKL_INT *k , MKL_INT *l , MKL_Complex8 *v , MKL_INT *iv , MKL_INT *jv , MKL_INT *descv , MKL_Complex8 *t , MKL_Complex8 *c , MKL_INT *ic , MKL_INT *jc , MKL_INT *descc , MKL_Complex8 *work );

void pzlarzb (char *side , char *trans , char *direct , char *storev , MKL_INT *m , MKL_INT *n , MKL_INT *k , MKL_INT *l , MKL_Complex16 *v , MKL_INT *iv , MKL_INT *jv , MKL_INT *descv , MKL_Complex16 *t , MKL_Complex16 *c , MKL_INT *ic , MKL_INT *jc , MKL_INT *descc , MKL_Complex16 *work );

Include Files
  • mkl_scalapack.h
Description

The p?larzbfunction applies a real/complex block reflector Q or its transpose QT (conjugate transpose QH for complex flavors) to a real/complex distributed m-by-n matrix sub(C) = C(ic:ic+m-1, jc:jc+n-1) from the left or the right.

Q is a product of k elementary reflectors as returned by p?tzrzf.

Currently, only storev = 'R' and direct = 'B' are supported.

Input Parameters
side

(global)

if side = 'L': apply Q or QT (QH for complex flavors) from the Left;

if side = 'R': apply Q or QT (QH for complex flavors) from the Right.

trans

(global)

if trans = 'N': No transpose, apply Q;

If trans='T': Transpose, apply QT (real flavors);

If trans='C': Conjugate transpose, apply QH (complex flavors).

direct

(global)

Indicates how H is formed from a product of elementary reflectors.

if direct = 'F': H = H(1)*H(2)*...*H(k) - forward (not supported) ;

if direct = 'B': H = H(k)*...*H(2)*H(1) - backward.

storev

(global)

Indicates how the vectors that define the elementary reflectors are stored:

if storev = 'C': columnwise (not supported ).

if storev = 'R': rowwise.

m

(global)

The number of rows in the distributed submatrix sub(C). (m 0).

n

(global)

The number of columns in the distributed submatrix sub(C). (n 0).

k

(global)

The order of the matrix T. (= the number of elementary reflectors whose product defines the block reflector).

l

(global)

The columns of the distributed submatrix sub(A) containing the meaningful part of the Householder reflectors.

If side = 'L', m l 0,

if side = 'R', nl 0.

v

(local).

Pointer into the local memory to an array of size lld_v * LOCc(jv+m-1) if side = 'L', lld_v * LOCc(jv+m-1) if side = 'R'.

It contains the local pieces of the distributed vectors V representing the Householder transformation as returned by p?tzrzf.

lld_v LOCr(iv+k-1).

iv, jv

(global)

The row and column indices in the global matrix V indicating the first row and the first column of the submatrix sub(V), respectively.

descv

(global and local) array of size dlen_. The array descriptor for the distributed matrix V.

t

(local)

Array of size mb_v* mb_v.

The lower triangular matrix T in the representation of the block reflector.

c

(local).

Pointer into the local memory to an array of size lld_c * LOCc(jc+n-1).

On entry, the m-by-n distributed matrix sub(C).

ic, jc

(global)

The row and column indices in the global matrix C indicating the first row and the first column of the submatrix sub(C), respectively.

descc

(global and local) array of size dlen_. The array descriptor for the distributed matrix C.

work

(local).

Array of size lwork.

If storev = 'C' ,
  if side = 'L' ,
    lwork(nqc0 + mpc0)* k
  else if side = 'R' ,
    lwork  (nqc0 + max(npv0 + numroc(numroc(n+icoffc, nb_v, 0, 0, npcol),
           nb_v, 0, 0, lcmq), mpc0))* k
  end if
else if storev = 'R' ,
  if side = 'L' ,
    lwork (mpc0 + max(mqv0 + numroc(numroc(m+iroffc, mb_v, 0, 0, nprow),
             mb_v, 0, 0, lcmp), nqc0))* k
  else if side = 'R' ,
    lwork (mpc0 + nqc0) * k
  end if
  end if.

Here lcmq = lcm/npcol with lcm = iclm(nprow, npcol),

iroffv = mod(iv-1, mb_v), icoffv = mod( jv-1, nb_v),

ivrow = indxg2p(iv, mb_v, myrow, rsrc_v, nprow),

ivcol = indxg2p(jv, nb_v, mycol, csrc_v, npcol),

mqv0 = numroc(m+icoffv, nb_v, mycol, ivcol, npcol),

npv0 = numroc(n+iroffv, mb_v, myrow, ivrow, nprow),

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),

npc0 = numroc(n+icoffc, 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 function blacs_gridinfo.

Output Parameters
c

(local).

On exit, sub(C) is overwritten by the Q*sub(C), or Q'*sub(C), or sub(C)*Q, or sub(C)*Q', where Q' is the transpose (conjugate transpose) of Q.

See Also