**Purpose**

To apply the transformations created by the SLICOT Library routine MB02CU on other columns / rows of the generator, contained in the arrays F1, F2 and G.

SUBROUTINE MB02CV( TYPEG, STRUCT, K, N, P, Q, NB, RNK, A1, LDA1, $ A2, LDA2, B, LDB, F1, LDF1, F2, LDF2, G, LDG, $ CS, DWORK, LDWORK, INFO ) C .. Scalar Arguments .. CHARACTER STRUCT, TYPEG INTEGER INFO, K, LDA1, LDA2, LDB, LDF1, LDF2, LDG, $ LDWORK, N, NB, P, Q, RNK C .. Array Arguments .. DOUBLE PRECISION A1(LDA1,*), A2(LDA2,*), B(LDB,*), CS(*), $ DWORK(*), F1(LDF1,*), F2(LDF2,*), G(LDG,*)

**Mode Parameters**

TYPEG CHARACTER*1 Specifies the type of the generator, as follows: = 'D': generator is column oriented and rank deficient; = 'C': generator is column oriented and not rank deficient; = 'R': generator is row oriented and not rank deficient. Note that this parameter must be equivalent with the used TYPEG in the call of MB02CU. STRUCT CHARACTER*1 Information about the structure of the generators, as follows: = 'T': the trailing block of the positive generator is upper / lower triangular, and the trailing block of the negative generator is zero; = 'N': no special structure to mention.

K (input) INTEGER The number of rows in A1 to be processed. K >= 0. N (input) INTEGER If TYPEG = 'D' or TYPEG = 'C', the number of rows in F1; if TYPEG = 'R', the number of columns in F1. N >= 0. P (input) INTEGER The number of columns of the positive generator. P >= K. Q (input) INTEGER The number of columns in B. If TYPEG = 'D', Q >= K; If TYPEG = 'C' or 'R', Q >= 0. NB (input) INTEGER On entry, if TYPEG = 'C' or TYPEG = 'R', NB specifies the block size to be used in the blocked parts of the algorithm. NB must be equivalent with the used block size in the routine MB02CU. RNK (input) INTEGER If TYPEG = 'D', the number of linearly independent columns in the generator as returned by MB02CU. 0 <= RNK <= K. If TYPEG = 'C' or 'R', the value of this parameter is irrelevant. A1 (input) DOUBLE PRECISION array, dimension (LDA1, K) On entry, if TYPEG = 'D', the leading K-by-K part of this array must contain the matrix A1 as returned by MB02CU. If TYPEG = 'C' or 'R', this array is not referenced. LDA1 INTEGER The leading dimension of the array A1. If TYPEG = 'D', LDA1 >= MAX(1,K); if TYPEG = 'C' or TYPEG = 'R', LDA1 >= 1. A2 (input) DOUBLE PRECISION array, if TYPEG = 'D' or TYPEG = 'C', dimension (LDA2, P-K); if TYPEG = 'R', dimension (LDA2, K). On entry, if TYPEG = 'D' or TYPEG = 'C', the leading K-by-(P-K) part of this array must contain the matrix A2 as returned by MB02CU. On entry, if TYPEG = 'R', the leading (P-K)-by-K part of this array must contain the matrix A2 as returned by MB02CU. LDA2 INTEGER The leading dimension of the array A2. If P = K, LDA2 >= 1; If P > K and (TYPEG = 'D' or TYPEG = 'C'), LDA2 >= MAX(1,K); if P > K and TYPEG = 'R', LDA2 >= P-K. B (input) DOUBLE PRECISION array, if TYPEG = 'D' or TYPEG = 'C', dimension (LDB, Q); if TYPEG = 'R', dimension (LDB, K). On entry, if TYPEG = 'D' or TYPEG = 'C', the leading K-by-Q part of this array must contain the matrix B as returned by MB02CU. On entry, if TYPEG = 'R', the leading Q-by-K part of this array must contain the matrix B as returned by MB02CU. LDB INTEGER The leading dimension of the array B. If Q = 0, LDB >= 1; If Q > 0 and (TYPEG = 'D' or TYPEG = 'C'), LDB >= MAX(1,K); if Q > 0 and TYPEG = 'R', LDB >= Q. F1 (input/output) DOUBLE PRECISION array, if TYPEG = 'D' or TYPEG = 'C', dimension (LDF1, K); if TYPEG = 'R', dimension (LDF1, N). On entry, if TYPEG = 'D' or TYPEG = 'C', the leading N-by-K part of this array must contain the first part of the positive generator to be processed. On entry, if TYPEG = 'R', the leading K-by-N part of this array must contain the first part of the positive generator to be processed. On exit, if TYPEG = 'D' or TYPEG = 'C', the leading N-by-K part of this array contains the first part of the transformed positive generator. On exit, if TYPEG = 'R', the leading K-by-N part of this array contains the first part of the transformed positive generator. LDF1 INTEGER The leading dimension of the array F1. If TYPEG = 'D' or TYPEG = 'C', LDF1 >= MAX(1,N); if TYPEG = 'R', LDF1 >= MAX(1,K). F2 (input/output) DOUBLE PRECISION array, if TYPEG = 'D' or TYPEG = 'C', dimension (LDF2, P-K); if TYPEG = 'R', dimension (LDF2, N). On entry, if TYPEG = 'D' or TYPEG = 'C', the leading N-by-(P-K) part of this array must contain the second part of the positive generator to be processed. On entry, if TYPEG = 'R', the leading (P-K)-by-N part of this array must contain the second part of the positive generator to be processed. On exit, if TYPEG = 'D' or TYPEG = 'C', the leading N-by-(P-K) part of this array contains the second part of the transformed positive generator. On exit, if TYPEG = 'R', the leading (P-K)-by-N part of this array contains the second part of the transformed positive generator. LDF2 INTEGER The leading dimension of the array F2. If P = K, LDF2 >= 1; If P > K and (TYPEG = 'D' or TYPEG = 'C'), LDF2 >= MAX(1,N); if P > K and TYPEG = 'R', LDF2 >= P-K. G (input/output) DOUBLE PRECISION array, if TYPEG = 'D' or TYPEG = 'C', dimension (LDG, Q); if TYPEG = 'R', dimension (LDG, N). On entry, if TYPEG = 'D' or TYPEG = 'C', the leading N-by-Q part of this array must contain the negative part of the generator to be processed. On entry, if TYPEG = 'R', the leading Q-by-N part of this array must contain the negative part of the generator to be processed. On exit, if TYPEG = 'D' or TYPEG = 'C', the leading N-by-Q part of this array contains the transformed negative generator. On exit, if TYPEG = 'R', the leading Q-by-N part of this array contains the transformed negative generator. LDG INTEGER The leading dimension of the array G. If Q = 0, LDG >= 1; If Q > 0 and (TYPEG = 'D' or TYPEG = 'C'), LDG >= MAX(1,N); if Q > 0 and TYPEG = 'R', LDG >= Q. CS (input) DOUBLE PRECISION array, dimension (x) If TYPEG = 'D' and P = K, x = 3*K; If TYPEG = 'D' and P > K, x = 5*K; If (TYPEG = 'C' or TYPEG = 'R') and P = K, x = 4*K; If (TYPEG = 'C' or TYPEG = 'R') and P > K, x = 6*K. On entry, the first x elements of this array must contain Givens and modified hyperbolic rotation parameters, and scalar factors of the Householder transformations as returned by MB02CU.

DWORK DOUBLE PRECISION array, dimension (LDWORK) On exit, if INFO = -23, DWORK(1) returns the minimum value of LDWORK. LDWORK INTEGER The length of the array DWORK. TYPEG = 'D': LDWORK >= MAX(1,N); (TYPEG = 'C' or TYPEG = 'R') and NB <= 0: LDWORK >= MAX(1,N); (TYPEG = 'C' or TYPEG = 'R') and NB >= 1: LDWORK >= MAX(1,( N + K )*NB).

INFO INTEGER = 0: successful exit; < 0: if INFO = -i, the i-th argument had an illegal value.

The algorithm requires 0(N*K*( P + Q )) floating point operations.

The Householder transformations and modified hyperbolic rotations computed by SLICOT Library routine MB02CU are applied to the corresponding parts of the matrices F1, F2 and G.

None

**Program Text**

None

None

None