Developer Reference

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

p?unmbr

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

Syntax

void
pcunmbr
(
char
*vect
,
char
*side
,
char
*trans
,
MKL_INT
*m
,
MKL_INT
*n
,
MKL_INT
*k
,
MKL_Complex8
*a
,
MKL_INT
*ia
,
MKL_INT
*ja
,
MKL_INT
*desca
,
MKL_Complex8
*tau
,
MKL_Complex8
*c
,
MKL_INT
*ic
,
MKL_INT
*jc
,
MKL_INT
*descc
,
MKL_Complex8
*work
,
MKL_INT
*lwork
,
MKL_INT
*info
);
void
pzunmbr
(
char
*vect
,
char
*side
,
char
*trans
,
MKL_INT
*m
,
MKL_INT
*n
,
MKL_INT
*k
,
MKL_Complex16
*a
,
MKL_INT
*ia
,
MKL_INT
*ja
,
MKL_INT
*desca
,
MKL_Complex16
*tau
,
MKL_Complex16
*c
,
MKL_INT
*ic
,
MKL_INT
*jc
,
MKL_INT
*descc
,
MKL_Complex16
*work
,
MKL_INT
*lwork
,
MKL_INT
*info
);
Include Files
  • mkl_scalapack.h
Description
If
vect
= 'Q'
, the
p?unmbr
function
overwrites the general complex 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
=
'C'
:
Q
H
*sub(
C
)
sub(
C
)*
Q
H
If
vect
= 'P'
, the
function
overwrites sub(
C
) with
side
=
'L'
side
=
'R'
trans
=
'N'
:
P
*sub(
C
)
sub(
C
)*
P
trans
=
'C'
:
P
H
*sub(
C
)
sub(
C
)*
P
H
Here
Q
and
P
H
are the unitary distributed matrices determined by
p?gebrd
when reducing a complex distributed matrix
A
(
ia
:*,
ja
:*) to bidiagonal form:
A
(
ia
:*,
ja
:*) =
Q
*
B
*
P
H
.
Q
and
P
H
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 unitary matrix
Q
or
P
H
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
H
is applied.
If
vect
=
'P'
, then
P
or
P
H
is applied.
side
(global)
If
side
=
'L'
, then
Q
or
Q
H
,
P
or
P
H
is applied from the left.
If
side
=
'R'
, then
Q
or
Q
H
,
P
or
P
H
is applied from the right.
trans
(global)
If
trans
=
'N'
, no transpose,
Q
or
P
is applied.
If
trans
=
'C'
, conjugate transpose,
Q
H
or
P
H
is applied.
m
(global) The number of rows in the distributed matrix sub (
C
)
m
≥0
.
n
(global) The number of columns in the distributed matrix sub (
C
)
n
≥0
.
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
p?gebrd
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
=