## Developer Reference

• 0.9
• 09/09/2020
• Public Content
Contents

# p?ormbr

Multiplies a general matrix by one of the orthogonal matrices from a reduction to bidiagonal form determined by
p?gebrd
.

## Syntax

Include Files
• mkl_scalapack.h
Description
If
vect
= '
Q
', the
p?ormbr
function
overwrites the general real distributed
m
-by-
n
matrix sub(
C
) =
C
(
:
+
m
-1,
:
+
n
-1) with
 side ='L' side ='R' trans = 'N': Q sub(C) sub(C) Q trans = 'T': QT sub(C) sub(C) QT
If
vect
= 'P', the
function
overwrites sub(
C
) with
 side ='L' side ='R' trans = 'N': P sub(C) sub(C) P trans = 'T': PT sub(C) sub(C) PT
Here
Q
and
P
T
are the orthogonal distributed matrices determined by
p?gebrd
when reducing a real distributed matrix
A
(
ia
:*,
ja
:*) to bidiagonal form:
A
(
ia
:*,
ja
:*) =
Q
*
B
*
P
T
.
Q
and
P
T
are defined as products of elementary reflectors
H
(
i
) and
G
(
i
) respectively.
Let
nq
=
m
if
side
=
'L'
and
nq
=
n
if
side
=
'R'
. Therefore
nq
is the order of the orthogonal matrix
Q
or
P
T
that is applied.
If
vect
= '
Q'
,
A
(
ia
:*,
ja
:*)
is assumed to have been an
nq
-by-
k
matrix:
If
nq
k
,
Q
=
H
(1)
H
(2)...
H
(
k
);
If
nq
<
k
,
Q
=
H
(1)
H
(2)...
H
(
nq
-1).
If
vect
= '
P'
,
A
(
ia
:*,
ja
:*) is assumed to have been a
k
-by-
nq
matrix:
If
k
<
nq
,
P
=
G
(1)
G
(2)...
G
(
k
);
If
k
nq
,
P
=
G
(1)
G
(2)...
G
(
nq
-1).
Input Parameters
vect
(global)
If
vect
=
'Q'
, then
Q
or
Q
T
is applied.
If
vect
=
'P'
, then
P
or
P
T
is applied.
side
(global)
If
side
=
'L'
, then
Q
or
Q
T
,
P
or
P
T
is applied from the left.
If
side
=
'R'
, then
Q
or
Q
T
,
P
or
P
T
is applied from the right.
trans
(global)
If
trans
=
'N'
, no transpose,
Q
or
P
is applied.
If
trans
=
'T'
, then
Q
T
or
P
T
is applied.
m
(global) The number of rows in the distributed matrix sub (
C
).
n
(global) The number of columns in the distributed matrix sub (
C
).
k
(global)
If
vect
=
'Q'
, the number of columns in the original distributed matrix reduced by
p?gebrd
;
If
vect
=
'P'
, the number of rows in the original distributed matrix reduced by
p?gebrd
.
Constraints:
k
0.
a
(local)
Pointer into the local memory to an array of size
lld_a
*
LOCc
(
ja
+
min
(
nq
,
k
)-1)
if
vect
=
'Q'
, and
lld_a
*
LOCc
(
ja
+
nq
-1)
if
vect
=
'P'
.
nq
=
m
if
side
=
'L'
, and
nq
=
n
otherwise.
The vectors that define the elementary reflectors
H
(
i
) and
G
(
i
), whose products determine the matrices
Q
and
P
, as returned by
p?gebrd
.
If
vect
=
'Q'
,
lld_a
max
(1,
LOCr
(
ia
+
nq
-1))
;
If
vect
=
'P'
,
lld_a
max
(1,
LOCr
(
ia
+
min
(
nq
,
k
)-1))
.
ia
,
ja
(global) The row and column indices in the global matrix
A
indicating the first row and the first column of the submatrix
A
, respectively.
desca
(global and local) array of size
dlen_
. The array descriptor for the distributed matrix
A
.
tau
(local)
Array of size
LOCc
(
ja
+
min
(
nq
,
k
)-1)
, if
vect
=
'Q'
, and
LOCr
(
ia
+
min
(
nq
,
k
)-1)
, if
vect
=
'P'
.
tau
[
i
]
must contain the scalar factor of the elementary reflector
H
(
i
+1)
or
G
(
i
+1)
which determines
Q
or
P
, as returned by
pdgebrd
in its array argument
tauq
or
taup
.
tau
is tied to the distributed matrix
A
.
c
(local)
Pointer into the local memory to an array of size
lld_c
*
LOCc
(
jc
+
n
-1)
.
Contains the local pieces of the distributed matrix sub (
C
).
ic
,
jc
(global) The row and column indices in the global matrix
C
indicating the first row and the first column of the submatrix
C
, respectively.
descc
(global and local) array of size
dlen_
. The array descriptor for the distributed matrix
C
.
work
(local)
Workspace array of size
lwork
.
lwork
(local or global) size of
work
, must be at least:
If
side
=
'L'
nq
=
m
;
if
((
vect
=
'Q'
and
nq
k
)
or (
vect
is not equal to
'Q'
and
nq
>
k
))
,
iaa
=
ia
;
jaa
=
ja
;
mi
=
m
;
ni
=
n
;
icc
=
ic
;
jcc
=
jc
;
else
iaa
=
ia
+1
;
jaa
=
ja
;
mi
=
m
-1
;
ni
=
n
;
icc
=
ic
+1;
jcc
=
jc
;
end if
else
If
side
=
'R'
,
nq
=
n
;
if((
vect
=
'Q'
and
nq
k
) or (
vect
is not equal to
'Q'
and
nq
>
k
))
,
iaa
=
ia
;
jaa
=
ja
;
mi
=
m
;
ni
=
n
;
icc
=
ic
;
jcc
=
jc
;
else
iaa
=
ia
;
jaa
=
ja
+1
;
mi
=
m
;
ni
=
n
-1
;
icc
=
ic
;
jcc
=
jc
+1
;
end if
end if
If
vect
=
'Q'
,
If
side
=
'L'
,
lwork
max
((
nb_a
*(
nb_a
-1))/2, (
nqc
0 +
mpc
0)*
nb_a
) +
nb_a
*
nb_a
else if
side
=
'R'
,
lwork
max
((
nb_a
*(
nb_a
-1))/2, (
nqc
0 +
max
(
npa
0 +
numroc
(
numroc
(
ni
+
icoffc
,
nb_a
, 0, 0,
NPCOL
),
nb_a
, 0, 0,
lcmq
),
mpc
0))*
nb_a
) +
nb_a
*
nb_a
end if
else if
vect
is not equal to
'Q'
, if
side
=
'L'
,
lwork
max
((
mb_a
*(
mb_a
-1))/2, (
mpc
0 +
max
(
mqa
0 +
numroc
(
numroc
(
mi
+
iroffc
,
mb_a
, 0, 0,
NPROW
),
mb_a
, 0, 0,
lcmp
),
nqc
0))*
mb_a
) +
mb_a
*
mb_a
else if
side
=
'R'
,
lwork
max
((
mb_a
*(
mb_a
-1))/2, (
mpc
0 +
nqc
0)*
mb_a
) +
mb_a
*
mb_a
end if
end if
where
lcmp
=
lcm
/
NPROW
,
lcmq
=
lcm
/
NPCOL
, with
lcm
=
ilcm
(
NPROW
,
NPCOL
)
,
iroffa
=
mod
(
iaa
-1,
mb_a
)
,