p?larzb

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

Syntax

Fortran:

call pslarzb(side, trans, direct, storev, m, n, k, l, v, iv, jv, descv, t, c, ic, jc, descc, work)

call pdlarzb(side, trans, direct, storev, m, n, k, l, v, iv, jv, descv, t, c, ic, jc, descc, work)

call pclarzb(side, trans, direct, storev, m, n, k, l, v, iv, jv, descv, t, c, ic, jc, descc, work)

call pzlarzb(side, trans, direct, storev, m, n, k, l, v, iv, jv, descv, t, c, ic, jc, descc, work)

C:

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

  • C: mkl_scalapack.h

Description

The p?larzb routine 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) CHARACTER.

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) CHARACTER.

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) CHARACTER.

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) CHARACTER.

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

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

if storev = 'R': rowwise.

m

(global) INTEGER.

The number of rows to be operated on, that is, the number of rows of the distributed submatrix sub(C). (m 0).

n

(global) INTEGER.

The number of columns to be operated on, that is, the number of columns of the distributed submatrix sub(C). (n 0).

k

(global) INTEGER.

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

l

(global) INTEGER.

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', n l 0.

v

(local).

REAL for pslarzb

DOUBLE PRECISION for pdlarzb

COMPLEX for pclarzb

COMPLEX*16 for pzlarzb.

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) INTEGER.

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

descv

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

t

(local)

REAL for pslarzb

DOUBLE PRECISION for pdlarzb

COMPLEX for pclarzb

COMPLEX*16 for pzlarzb.

Array, DIMENSION mb_v by mb_v.

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

c

(local).

REAL for pslarfb

DOUBLE PRECISION for pdlarfb

COMPLEX for pclarfb

COMPLEX*16 for pzlarfb.

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) INTEGER.

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

descc

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

work

(local).

REAL for pslarzb

DOUBLE PRECISION for pdlarzb

COMPLEX for pclarzb

COMPLEX*16 for pzlarzb.

Array, 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 subroutine 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.

Nähere Informationen zur Compiler-Optimierung finden Sie in unserem Optimierungshinweis.