# p?larz

Applies an elementary reflector as returned by p?tzrzf to a general matrix.

## Syntax

call pslarz(side, m, n, l, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)

call pdlarz(side, m, n, l, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)

call pclarz(side, m, n, l, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)

call pzlarz(side, m, n, l, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)

## Description

This routine applies a real/complex elementary reflector Q (or QT) to a real/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 real/complex scalar and v is a real/complex vector.

If `tau = 0`, then Q is taken to be the unit matrix.

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

## Input Parameters

side

  (global) CHARACTER.

  if `side = 'L'`: form `Q*sub(C`),

  if `side = 'R'`: form sub`(C)*Q`, `Q = QT` (for real flavors).

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

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 pslarz

  DOUBLE PRECISION for pdlarz

  COMPLEX for pclarz

  COMPLEX*16 for pzlarz.

  Pointer into the local memory to an array of DIMENSION (lld_v,*) containing the local pieces of the distributed vectors v representing the Householder transformation Q,

  `v(iv:iv+l-1, jv)` if `side = 'L'` and `incv = 1`,

  `v(iv, jv:jv+l-1)` if `side = 'L'` and `incv = m_v`,

  `v(iv:iv+l-1, jv)` if `side = 'R'` and `incv = 1`,

  `v(iv, jv:jv+l-1)` if `side = 'R'` and `incv = m_v`.

  The vector v in the representation of Q. v is not used if `tau = 0`.

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, DIMENSION (dlen_). The array descriptor for the distributed matrix V.

incv

  (global) INTEGER.

  The global increment for the elements of v. Only two values of incv are supported in this version, namely 1 and m_v.

  incv must not be zero.

tau

  (local)

  REAL for pslarz

  DOUBLE PRECISION for pdlarz

  COMPLEX for pclarz

  COMPLEX*16 for pzlarz.

  Array, DIMENSION LOCc(jv) if `incv = 1`, and LOCr(iv) otherwise. This array contains the Householder scalars related to the Householder vectors.

  tau is tied to the distributed matrix V.

c

  (local).

  REAL for pslarz

  DOUBLE PRECISION for pdlarz

  COMPLEX for pclarz

  COMPLEX*16 for pzlarz.

  Pointer into the local memory to an array of DIMENSION (lld_c, LOCc(jc+n-1) ), containing the local pieces of 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, DIMENSION (dlen_). The array descriptor for the distributed matrix C.

work

  (local).

  REAL for pslarz

  DOUBLE PRECISION for pdlarz

  COMPLEX for pclarz

  COMPLEX*16 for pzlarz.

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

  Here 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.

## Output Parameters

c

  (local).

  On exit, sub(C) is overwritten by the `Q*sub(C)` if `side = 'L'`, or `sub(C)*Q` if `side = 'R'`.

Parent topic: Auxiliary Routines