cuncsd.f3
Usage
Functions/Subroutines
CUNCSD
Function/Subroutine Documentation
recursive subroutine cuncsd (character jobu1, character jobu2, character jobv1t, character jobv2t, character trans, character signs, integer m, integer p, integer q, complex, dimension( ldx11, * ) x11, integer ldx11, complex, dimension( ldx12, * ) x12, integer ldx12, complex, dimension( ldx21, * ) x21, integer ldx21, complex, dimension( ldx22, * ) x22, integer ldx22, real, dimension( * ) theta, complex, dimension( ldu1, * ) u1, integer ldu1, complex, dimension( ldu2, * ) u2, integer ldu2, complex, dimension( ldv1t, * ) v1t, integer ldv1t, complex, dimension( ldv2t, * ) v2t, integer ldv2t, complex, dimension( * ) work, integer lwork, real, dimension( * ) rwork, integer lrwork, integer, dimension( * ) iwork, integer info)
CUNCSD
Purpose:
!> !> CUNCSD computes the CS decomposition of an M-by-M partitioned !> unitary matrix X: !> !> [ I 0 0 | 0 0 0 ] !> [ 0 C 0 | 0 -S 0 ] !> [ X11 | X12 ] [ U1 | ] [ 0 0 0 | 0 0 -I ] [ V1 | ]**H !> X = [-----------] = [---------] [---------------------] [---------] . !> [ X21 | X22 ] [ | U2 ] [ 0 0 0 | I 0 0 ] [ | V2 ] !> [ 0 S 0 | 0 C 0 ] !> [ 0 0 I | 0 0 0 ] !> !> X11 is P-by-Q. The unitary matrices U1, U2, V1, and V2 are P-by-P, !> (M-P)-by-(M-P), Q-by-Q, and (M-Q)-by-(M-Q), respectively. C and S are !> R-by-R nonnegative diagonal matrices satisfying C^2 + S^2 = I, in !> which R = MIN(P,M-P,Q,M-Q). !>
Parameters
JOBU1
!> JOBU1 is CHARACTER !> = 'Y': U1 is computed; !> otherwise: U1 is not computed. !>
JOBU2
!> JOBU2 is CHARACTER !> = 'Y': U2 is computed; !> otherwise: U2 is not computed. !>
JOBV1T
!> JOBV1T is CHARACTER !> = 'Y': V1T is computed; !> otherwise: V1T is not computed. !>
JOBV2T
!> JOBV2T is CHARACTER !> = 'Y': V2T is computed; !> otherwise: V2T is not computed. !>
TRANS
!> TRANS is CHARACTER !> = 'T': X, U1, U2, V1T, and V2T are stored in row-major !> order; !> otherwise: X, U1, U2, V1T, and V2T are stored in column- !> major order. !>
SIGNS
!> SIGNS is CHARACTER !> = 'O': The lower-left block is made nonpositive (the !> convention); !> otherwise: The upper-right block is made nonpositive (the !> convention). !>
M
!> M is INTEGER !> The number of rows and columns in X. !>
P
!> P is INTEGER !> The number of rows in X11 and X12. 0 <= P <= M. !>
Q
!> Q is INTEGER !> The number of columns in X11 and X21. 0 <= Q <= M. !>
X11
!> X11 is COMPLEX array, dimension (LDX11,Q) !> On entry, part of the unitary matrix whose CSD is desired. !>
LDX11
!> LDX11 is INTEGER !> The leading dimension of X11. LDX11 >= MAX(1,P). !>
X12
!> X12 is COMPLEX array, dimension (LDX12,M-Q) !> On entry, part of the unitary matrix whose CSD is desired. !>
LDX12
!> LDX12 is INTEGER !> The leading dimension of X12. LDX12 >= MAX(1,P). !>
X21
!> X21 is COMPLEX array, dimension (LDX21,Q) !> On entry, part of the unitary matrix whose CSD is desired. !>
LDX21
!> LDX21 is INTEGER !> The leading dimension of X11. LDX21 >= MAX(1,M-P). !>
X22
!> X22 is COMPLEX array, dimension (LDX22,M-Q) !> On entry, part of the unitary matrix whose CSD is desired. !>
LDX22
!> LDX22 is INTEGER !> The leading dimension of X11. LDX22 >= MAX(1,M-P). !>
THETA
!> THETA is REAL array, dimension (R), in which R = !> MIN(P,M-P,Q,M-Q). !> C = DIAG( COS(THETA(1)), ... , COS(THETA(R)) ) and !> S = DIAG( SIN(THETA(1)), ... , SIN(THETA(R)) ). !>
U1
!> U1 is COMPLEX array, dimension (LDU1,P) !> If JOBU1 = 'Y', U1 contains the P-by-P unitary matrix U1. !>
LDU1
!> LDU1 is INTEGER !> The leading dimension of U1. If JOBU1 = 'Y', LDU1 >= !> MAX(1,P). !>
U2
!> U2 is COMPLEX array, dimension (LDU2,M-P) !> If JOBU2 = 'Y', U2 contains the (M-P)-by-(M-P) unitary !> matrix U2. !>
LDU2
!> LDU2 is INTEGER !> The leading dimension of U2. If JOBU2 = 'Y', LDU2 >= !> MAX(1,M-P). !>
V1T
!> V1T is COMPLEX array, dimension (LDV1T,Q) !> If JOBV1T = 'Y', V1T contains the Q-by-Q matrix unitary !> matrix V1**H. !>
LDV1T
!> LDV1T is INTEGER !> The leading dimension of V1T. If JOBV1T = 'Y', LDV1T >= !> MAX(1,Q). !>
V2T
!> V2T is COMPLEX array, dimension (LDV2T,M-Q) !> If JOBV2T = 'Y', V2T contains the (M-Q)-by-(M-Q) unitary !> matrix V2**H. !>
LDV2T
!> LDV2T is INTEGER !> The leading dimension of V2T. If JOBV2T = 'Y', LDV2T >= !> MAX(1,M-Q). !>
WORK
!> WORK is COMPLEX array, dimension (MAX(1,LWORK))
!> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
!>
LWORK
!> LWORK is INTEGER !> The dimension of the array WORK. !> !> If LWORK = -1, then a workspace query is assumed; the routine !> only calculates the optimal size of the WORK array, returns !> this value as the first entry of the work array, and no error !> message related to LWORK is issued by XERBLA. !>
RWORK
!> RWORK is REAL array, dimension MAX(1,LRWORK) !> On exit, if INFO = 0, RWORK(1) returns the optimal LRWORK. !> If INFO > 0 on exit, RWORK(2:R) contains the values PHI(1), !> ..., PHI(R-1) that, together with THETA(1), ..., THETA(R), !> define the matrix in intermediate bidiagonal-block form !> remaining after nonconvergence. INFO specifies the number !> of nonzero PHI's. !>
LRWORK
!> LRWORK is INTEGER !> The dimension of the array RWORK. !> !> If LRWORK = -1, then a workspace query is assumed; the routine !> only calculates the optimal size of the RWORK array, returns !> this value as the first entry of the work array, and no error !> message related to LRWORK is issued by XERBLA. !>
IWORK
!> IWORK is INTEGER array, dimension (M-MIN(P,M-P,Q,M-Q)) !>
INFO
!> INFO is INTEGER !> = 0: successful exit. !> < 0: if INFO = -i, the i-th argument had an illegal value. !> > 0: CBBCSD did not converge. See the description of RWORK !> above for details. !>
References:
[1] Brian D. Sutton. Computing the complete CS decomposition. Numer. Algorithms, 50(1):33-65, 2009.
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Definition at line 314 of file cuncsd.f.
History
- Arch Linux 2026-11-01: the text shown here
- Debian 9 (Stretch)
- Debian 8 (Jessie)
- Debian 7 (Wheezy)