# p?larfb

Applies a block reflector or its transpose/conjugate-transpose to a general rectangular matrix.

## Syntax

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

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

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

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

## Description

This routine applies a real/complex block reflector Q or its transpose `QT`/conjugate transpose `QH` 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.

## Input Parameters

side

  (global).CHARACTER.

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

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

trans

  (global).CHARACTER.

  if `trans = 'N'`: no transpose, apply Q;

  for real flavors, if `trans='T'`: transpose, apply QT

  for complex flavors, if `trans = 'C'`: conjugate transpose, apply `QH`;

direct

  (global) CHARACTER. Indicates how Q is formed from a product of elementary reflectors.

  if `direct = 'F'`: `Q = H(1)*H(2)*...*H(k)` (Forward)

  if `direct = 'B'`: `Q = 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

  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.

v

  (local).

  REAL for pslarfb

  DOUBLE PRECISION for pdlarfb

  COMPLEX for pclarfb

  COMPLEX*16 for pzlarfb.

  Pointer into the local memory to an array of DIMENSION``

  `( lld_v, LOCc(jv+k-1))` if `storev = 'C',`

  `(lld_v, LOCc(jv+m-1))` if `storev = 'R'` and `side = 'L',`

  `(lld_v, LOCc(jv+n-1) )` if `storev = 'R'` and side = 'R'.

  It contains the local pieces of the distributed vectors V representing the Householder transformation.

  if `storev = 'C'` and `side = 'L', lld_v ≥ max(1,LOCr(iv+m-1))`;

  if `storev = 'C'` and `side = 'R', lld_v ≥ max(1,LOCr(iv+n-1))`;

  if `storev = 'R', lld_v ≥ LOCr(jv+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, DIMENSION (dlen_). The array descriptor for the distributed matrix V.

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 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 pslarfb

  DOUBLE PRECISION for pdlarfb

  COMPLEX for pclarfb

  COMPLEX*16 for pzlarfb.

  Workspace array, DIMENSION (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,

  where

  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

t

  (local).

  REAL for pslarfb

  DOUBLE PRECISION for pdlarfb

  COMPLEX for pclarfb

  COMPLEX*16 for pzlarfb.

  Array, DIMENSION`( mb_v, mb_v)` if `storev = 'R',` and `( nb_v, nb_v)` if `storev = 'C'`. The triangular matrix t is the representation of the block reflector.

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'`. Q' is transpose (conjugate transpose) of Q.

Parent topic: Auxiliary Routines