# p?labrd

Reduces the first nb rows and columns of a general rectangular matrix A to real bidiagonal form by an orthogonal/unitary transformation, and returns auxiliary matrices that are needed to apply the transformation to the unreduced part of A.

## Syntax

call pslabrd(m, n, nb, a, ia, ja, desca, d, e, tauq, taup, x, ix, jx, descx, y, iy, jy, descy, work)

call pdlabrd(m, n, nb, a, ia, ja, desca, d, e, tauq, taup, x, ix, jx, descx, y, iy, jy, descy, work)

call pclabrd(m, n, nb, a, ia, ja, desca, d, e, tauq, taup, x, ix, jx, descx, y, iy, jy, descy, work)

call pzlabrd(m, n, nb, a, ia, ja, desca, d, e, tauq, taup, x, ix, jx, descx, y, iy, jy, descy, work)

## Description

This routine reduces the first nb rows and columns of a real/complex general m-by-n distributed matrix sub(A) = `A(ia:ia+m-1`, `ja:ja+n-1)` to upper or lower bidiagonal form by an orthogonal/unitary transformation Q'* A * P, and returns the matrices X and Y necessary to apply the transformation to the unreduced part of `sub(A)`.

If `m ≥n`, `sub(A)` is reduced to upper bidiagonal form; if `m < n`, `sub(A)` is reduced to lower bidiagonal form.

This is an auxiliary routine called by p?gebrd.

## Input Parameters

m

  (global). INTEGER.

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

n

  (global).INTEGER. The number of columns to be operated on, that is, the number of columns of the distributed submatrix `sub(A)`. `(n ≥ 0)`.

nb

  (global) INTEGER.

  The number of leading rows and columns of sub(A) to be reduced.

a

  (local).

  REAL for pslabrd

  DOUBLE PRECISION for pdlabrd

  COMPLEX for pclabrd

  COMPLEX*16 for pzlabrd.

  Pointer into the local memory to an array of DIMENSION`(lld_a, LOCc(ja+n-1))`.

  On entry, this array contains the local pieces of the general distributed matrix sub(A).

ia, ja

  (global) INTEGER. The row and column indices in the global array a indicating the first row and the first column of the submatrix `sub(A)`, respectively.

desca

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

ix, jx

  (global) INTEGER. The row and column indices in the global array x indicating the first row and the first column of the submatrix `sub(X)`, respectively.

descx

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

iy, jy

  (global) INTEGER. The row and column indices in the global array y indicating the first row and the first column of the submatrix `sub(Y)`, respectively.

descy

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

work

  (local).

  REAL for pslabrd

  DOUBLE PRECISION for pdlabrd

  COMPLEX for pclabrd

  COMPLEX*16 for pzlabrd

  Workspace array, DIMENSION`(lwork)`

  `lwork ≥ nb_a + nq`,

  with `nq = numroc(n+mod(ia-1, nb_y), nb_y, mycol, iacol, npcol)`

  `iacol = indxg2p (ja, nb_a, mycol, csrc_a, npcol)`

  indxg2p and numroc are ScaLAPACK tool functions; myrow, mycol, nprow, and npcol can be determined by calling the subroutine blacs_gridinfo.

## Output Parameters

a

  (local)

  On exit, the first nb rows and columns of the matrix are overwritten; the rest of the distributed matrix `sub(A)` is unchanged.

  If `m ≥ n`, elements on and below the diagonal in the first nb columns, with the array tauq, represent the orthogonal/unitary matrix Q as a product of elementary reflectors;and elements above the diagonal in the first nb rows, with the array taup, represent the orthogonal/unitary matrix P as a product of elementary reflectors.

  If `m < n`, elements below the diagonal in the first nb columns, with the array tauq, represent the orthogonal/unitary matrix Q as a product of elementary reflectors, and elements on and above the diagonal in the first nb rows, with the array taup, represent the orthogonal/unitary matrix P as a product of elementary reflectors. See Application Notes below.

d

  (local).

  REAL for pslabrd

  DOUBLE PRECISION for pdlabrd

  COMPLEX for pclabrd

  COMPLEX*16 for pzlabrd

  Array, DIMENSION `LOCr(ia+min(m,n)-1)` if `m ≥ n`; `LOCc(ja+min(m,n)-1)` otherwise. The distributed diagonal elements of the bidiagonal distributed matrix B:

  `d(i) = A(ia+i-1, ja+i-1)`.

  d is tied to the distributed matrix A.

e

  (local).

  REAL for pslabrd

  DOUBLE PRECISION for pdlabrd

  COMPLEX for pclabrd

  COMPLEX*16 for pzlabrd

  Array, DIMENSION `LOCr(ia+min(m,n)-1)` if `m ≥ n`; `LOCc(ja+min(m,n)-2)` otherwise. The distributed off-diagonal elements of the bidiagonal distributed matrix B:

  if `m ≥ n`, `E(i) = A(ia+i-1, ja+i)` for `i = 1, 2, ..., n-1`;

  if `m<n`, `E(i) = A(ia+i, ja+i-1)` for `i = 1, 2, ..., m-1`.

  e is tied to the distributed matrix A.

tauq, taup

  (local).

  REAL for pslabrd

  DOUBLE PRECISION for pdlabrd

  COMPLEX for pclabrd

  COMPLEX*16 for pzlabrd

  Array DIMENSION LOCc(ja+min(m, n)-1) for tauq, DIMENSION LOCr(ia+min(m, n)-1) for taup. The scalar factors of the elementary reflectors which represent the orthogonal/unitary matrix Q for tauq, P for taup. tauq and taup are tied to the distributed matrix A. See Application Notes below.

x

  (local)

  REAL for pslabrd

  DOUBLE PRECISION for pdlabrd

  COMPLEX for pclabrd

  COMPLEX*16 for pzlabrd

  Pointer into the local memory to an array of DIMENSION (lld_x, nb). On exit, the local pieces of the distributed m-by-nb matrix `X(ix:ix+m-1`, `jx:jx+nb-1)` required to update the unreduced part of sub(A).

y

  (local).

  REAL for pslabrd

  DOUBLE PRECISION for pdlabrd

  COMPLEX for pclabrd

  COMPLEX*16 for pzlabrd

  Pointer into the local memory to an array of DIMENSION (lld_y, nb). On exit, the local pieces of the distributed n-by-nb matrix `Y(iy:iy+n-1`, `jy:jy+nb-1)` required to update the unreduced part of sub(A).

## Application Notes

The matrices Q and P are represented as products of elementary reflectors:

`Q = H(1)*H(2)*...*H(nb)`, and `P = G(1)*G(2)*...*G(nb)`

Each `H(i)` and `G(i)` has the form:

`H(i) = I - tauq*v*v'` , and `G(i) = I - taup*u*u'`,

where tauq and taup are real/complex scalars, and v and u are real/complex vectors.

If `m ≥ n`, `v(1: i-1 ) = 0, v(i) = 1`, and `v(i:m)` is stored on exit in

`A(ia+i-1:ia+m-1, ja+i-1)`; `u(1:i) = 0, u(i+1 ) = 1`, and `u(i+1:n)` is stored on exit in `A(ia+i-1, ja+i:ja+n-1)`; tauq is stored in `TAUQ(ja+i-1)` and taup in `TAUP(ia+i-1)`.

If `m < n`, `v(1: i) = 0`, `v(i+1 ) = 1`, and `v(i+1:m)` is stored on exit in

`A(ia+i+1:ia+m-1, ja+i-1)`; `u(1:i-1 ) = 0`, `u(i) = 1`, and `u(i:n)` is stored on exit in `A(ia+i-1`, `ja+i:ja+n-1)`; tauq is stored in `TAUQ(ja+i-1)` and taup in `TAUP(ia+i-1)`. The elements of the vectors v and u together form the m-by-nb matrix V and the nb-by-n matrix U' which are necessary, with X and Y, to apply the transformation to the unreduced part of the matrix, using a block update of the form: `sub(A):= sub(A) - V*Y' - X*U'`. The contents of `sub(A)` on exit are illustrated by the following examples with `nb = 2`:

where a denotes an element of the original matrix which is unchanged, vi denotes an element of the vector defining `H(i)`, and ui an element of the vector defining `G(i)`.

Parent topic: Auxiliary Routines