Developer Reference for Intel® oneAPI Math Kernel Library for Fortran

ID 766686
Date 10/31/2024
Public
Document Table of Contents

p?larf

Applies an elementary reflector to a general rectangular matrix.

Syntax

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

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

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

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

Description

The p?larfroutine 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.

Input Parameters

side

(global). CHARACTER.

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

= 'R': form sub(C)*Q, Q=QT.

m

(global) INTEGER.

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

n

(global) INTEGER.

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

v

(local).

REAL for pslarf

DOUBLE PRECISION for pdlarf

COMPLEX for pclarf

COMPLEX*16 for pzlarf.

Pointer into the local memory to an array of size (lld_v,*), containing the local pieces of the global distributed matrix V representing the Householder transformation Q,

V(iv:iv+m-1, jv) if side = 'L' and incv = 1,

V(iv, jv:jv+m-1) if side = 'L' and incv = m_v,

V(iv:iv+n-1, jv) if side = 'R' and incv = 1,

V(iv, jv:jv+n-1) if side = 'R' and incv = m_v.

The array v is the representation of Q. v is not used if tau = 0.

iv, jv

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

descv

(global and local) INTEGER array of size 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 pslarf

DOUBLE PRECISION for pdlarf

COMPLEX for pclarf

COMPLEX*16 for pzlarf.

Array of size 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 pslarf

DOUBLE PRECISION for pdlarf

COMPLEX for pclarf

COMPLEX*16 for pzlarf.

Pointer into the local memory to an array of size (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 matrix C indicating the first row and the first column of the matrix sub(C), respectively.

descc

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

work

(local).

REAL for pslarf

DOUBLE PRECISION for pdlarf

COMPLEX for pclarf

COMPLEX*16 for pzlarf.

Array of size lwork.

If incv = 1,

   if side = 'L',

    if ivcol = iccol,

      lworknqc0

    else

      lworkmpc0 + max( 1, nqc0 )

    end if

  else if side = 'R' ,

    lworknqc0 + 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',

    lworkmpc0 + 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,

      lworkmpc0

    else

      lworknqc0 + max( 1, mpc0 )

    end if

  end if

end if,

where 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'.

See Also