public interface bbcsd
BBCSD computes the CS decomposition of a unitary matrix in
bidiagonal-block form,
[ B11 | B12 0 0 ]
[ 0 | 0 -I 0 ]
X = [----------------]
[ B21 | B22 0 0 ]
[ 0 | 0 0 I ]
[ C | -S 0 0 ]
[ U1 | ] [ 0 | 0 -I 0 ] [ V1 | ]**H
= [---------] [---------------] [---------] .
[ | U2 ] [ S | C 0 0 ] [ | V2 ]
[ 0 | 0 0 I ]
X is M-by-M, its top-left block is P-by-Q, and Q must be no larger
than P, M-P, or M-Q. (If Q is not the smallest index, then X must be
transposed and/or permuted. This can be done in constant time using
the TRANS and SIGNS options. See CUNCSD for details.)
The bidiagonal matrices B11, B12, B21, and B22 are represented
implicitly by angles THETA(1:Q) and PHI(1:Q-1).
The unitary matrices U1, U2, V1T, and V2T are input/output.
The input matrices are pre- or post-multiplied by the appropriate
singular vector matrices.
Subroutines
Arguments
| Type |
Intent | Optional | Attributes |
|
Name |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobu1 |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobu2 |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobv1t |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobv2t |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
trans |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
m |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
p |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
q |
|
|
real(kind=sp),
|
intent(inout) |
|
|
:: |
theta(*) |
|
|
real(kind=sp),
|
intent(inout) |
|
|
:: |
phi(*) |
|
|
complex(kind=sp),
|
intent(inout) |
|
|
:: |
u1(ldu1,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldu1 |
|
|
complex(kind=sp),
|
intent(inout) |
|
|
:: |
u2(ldu2,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldu2 |
|
|
complex(kind=sp),
|
intent(inout) |
|
|
:: |
v1t(ldv1t,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldv1t |
|
|
complex(kind=sp),
|
intent(inout) |
|
|
:: |
v2t(ldv2t,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldv2t |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b11d(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b11e(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b12d(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b12e(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b21d(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b21e(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b22d(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b22e(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
rwork(*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
lrwork |
|
|
integer(kind=ilp),
|
intent(out) |
|
|
:: |
info |
|
Arguments
| Type |
Intent | Optional | Attributes |
|
Name |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobu1 |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobu2 |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobv1t |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobv2t |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
trans |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
m |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
p |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
q |
|
|
real(kind=dp),
|
intent(inout) |
|
|
:: |
theta(*) |
|
|
real(kind=dp),
|
intent(inout) |
|
|
:: |
phi(*) |
|
|
real(kind=dp),
|
intent(inout) |
|
|
:: |
u1(ldu1,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldu1 |
|
|
real(kind=dp),
|
intent(inout) |
|
|
:: |
u2(ldu2,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldu2 |
|
|
real(kind=dp),
|
intent(inout) |
|
|
:: |
v1t(ldv1t,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldv1t |
|
|
real(kind=dp),
|
intent(inout) |
|
|
:: |
v2t(ldv2t,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldv2t |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b11d(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b11e(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b12d(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b12e(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b21d(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b21e(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b22d(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b22e(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
rwork(*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
lrwork |
|
|
integer(kind=ilp),
|
intent(out) |
|
|
:: |
info |
|
Arguments
| Type |
Intent | Optional | Attributes |
|
Name |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobu1 |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobu2 |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobv1t |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobv2t |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
trans |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
m |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
p |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
q |
|
|
real(kind=sp),
|
intent(inout) |
|
|
:: |
theta(*) |
|
|
real(kind=sp),
|
intent(inout) |
|
|
:: |
phi(*) |
|
|
real(kind=sp),
|
intent(inout) |
|
|
:: |
u1(ldu1,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldu1 |
|
|
real(kind=sp),
|
intent(inout) |
|
|
:: |
u2(ldu2,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldu2 |
|
|
real(kind=sp),
|
intent(inout) |
|
|
:: |
v1t(ldv1t,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldv1t |
|
|
real(kind=sp),
|
intent(inout) |
|
|
:: |
v2t(ldv2t,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldv2t |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b11d(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b11e(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b12d(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b12e(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b21d(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b21e(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b22d(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
b22e(*) |
|
|
real(kind=sp),
|
intent(out) |
|
|
:: |
rwork(*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
lrwork |
|
|
integer(kind=ilp),
|
intent(out) |
|
|
:: |
info |
|
Arguments
| Type |
Intent | Optional | Attributes |
|
Name |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobu1 |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobu2 |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobv1t |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
jobv2t |
|
|
character(len=1),
|
intent(in) |
|
|
:: |
trans |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
m |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
p |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
q |
|
|
real(kind=dp),
|
intent(inout) |
|
|
:: |
theta(*) |
|
|
real(kind=dp),
|
intent(inout) |
|
|
:: |
phi(*) |
|
|
complex(kind=dp),
|
intent(inout) |
|
|
:: |
u1(ldu1,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldu1 |
|
|
complex(kind=dp),
|
intent(inout) |
|
|
:: |
u2(ldu2,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldu2 |
|
|
complex(kind=dp),
|
intent(inout) |
|
|
:: |
v1t(ldv1t,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldv1t |
|
|
complex(kind=dp),
|
intent(inout) |
|
|
:: |
v2t(ldv2t,*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
ldv2t |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b11d(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b11e(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b12d(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b12e(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b21d(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b21e(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b22d(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
b22e(*) |
|
|
real(kind=dp),
|
intent(out) |
|
|
:: |
rwork(*) |
|
|
integer(kind=ilp),
|
intent(in) |
|
|
:: |
lrwork |
|
|
integer(kind=ilp),
|
intent(out) |
|
|
:: |
info |
|
Module Procedures