diff options
Diffstat (limited to 'TESTING/MATGEN/clarot.f')
-rw-r--r-- | TESTING/MATGEN/clarot.f | 432 |
1 files changed, 242 insertions, 190 deletions
diff --git a/TESTING/MATGEN/clarot.f b/TESTING/MATGEN/clarot.f index f73d10b4..0060bf6c 100644 --- a/TESTING/MATGEN/clarot.f +++ b/TESTING/MATGEN/clarot.f @@ -1,9 +1,248 @@ +*> \brief \b CLAROT +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition +* ========== +* +* SUBROUTINE CLAROT( LROWS, LLEFT, LRIGHT, NL, C, S, A, LDA, XLEFT, +* XRIGHT ) +* +* .. Scalar Arguments .. +* LOGICAL LLEFT, LRIGHT, LROWS +* INTEGER LDA, NL +* COMPLEX C, S, XLEFT, XRIGHT +* .. +* .. Array Arguments .. +* COMPLEX A( * ) +* .. +* +* Purpose +* ======= +* +*>\details \b Purpose: +*>\verbatim +*> +*> CLAROT applies a (Givens) rotation to two adjacent rows or +*> columns, where one element of the first and/or last column/row +*> for use on matrices stored in some format other than GE, so +*> that elements of the matrix may be used or modified for which +*> no array element is provided. +*> +*> One example is a symmetric matrix in SB format (bandwidth=4), for +*> which UPLO='L': Two adjacent rows will have the format: +*> +*> row j: C> C> C> C> C> . . . . +*> row j+1: C> C> C> C> C> . . . . +*> +*> '*' indicates elements for which storage is provided, +*> '.' indicates elements for which no storage is provided, but +*> are not necessarily zero; their values are determined by +*> symmetry. ' ' indicates elements which are necessarily zero, +*> and have no storage provided. +*> +*> Those columns which have two '*'s can be handled by SROT. +*> Those columns which have no '*'s can be ignored, since as long +*> as the Givens rotations are carefully applied to preserve +*> symmetry, their values are determined. +*> Those columns which have one '*' have to be handled separately, +*> by using separate variables "p" and "q": +*> +*> row j: C> C> C> C> C> p . . . +*> row j+1: q C> C> C> C> C> . . . . +*> +*> The element p would have to be set correctly, then that column +*> is rotated, setting p to its new value. The next call to +*> CLAROT would rotate columns j and j+1, using p, and restore +*> symmetry. The element q would start out being zero, and be +*> made non-zero by the rotation. Later, rotations would presumably +*> be chosen to zero q out. +*> +*> Typical Calling Sequences: rotating the i-th and (i+1)-st rows. +*> ------- ------- --------- +*> +*> General dense matrix: +*> +*> CALL CLAROT(.TRUE.,.FALSE.,.FALSE., N, C,S, +*> A(i,1),LDA, DUMMY, DUMMY) +*> +*> General banded matrix in GB format: +*> +*> j = MAX(1, i-KL ) +*> NL = MIN( N, i+KU+1 ) + 1-j +*> CALL CLAROT( .TRUE., i-KL.GE.1, i+KU.LT.N, NL, C,S, +*> A(KU+i+1-j,j),LDA-1, XLEFT, XRIGHT ) +*> +*> [ note that i+1-j is just MIN(i,KL+1) ] +*> +*> Symmetric banded matrix in SY format, bandwidth K, +*> lower triangle only: +*> +*> j = MAX(1, i-K ) +*> NL = MIN( K+1, i ) + 1 +*> CALL CLAROT( .TRUE., i-K.GE.1, .TRUE., NL, C,S, +*> A(i,j), LDA, XLEFT, XRIGHT ) +*> +*> Same, but upper triangle only: +*> +*> NL = MIN( K+1, N-i ) + 1 +*> CALL CLAROT( .TRUE., .TRUE., i+K.LT.N, NL, C,S, +*> A(i,i), LDA, XLEFT, XRIGHT ) +*> +*> Symmetric banded matrix in SB format, bandwidth K, +*> lower triangle only: +*> +*> [ same as for SY, except:] +*> . . . . +*> A(i+1-j,j), LDA-1, XLEFT, XRIGHT ) +*> +*> [ note that i+1-j is just MIN(i,K+1) ] +*> +*> Same, but upper triangle only: +*> . . . +*> A(K+1,i), LDA-1, XLEFT, XRIGHT ) +*> +*> Rotating columns is just the transpose of rotating rows, except +*> for GB and SB: (rotating columns i and i+1) +*> +*> GB: +*> j = MAX(1, i-KU ) +*> NL = MIN( N, i+KL+1 ) + 1-j +*> CALL CLAROT( .TRUE., i-KU.GE.1, i+KL.LT.N, NL, C,S, +*> A(KU+j+1-i,i),LDA-1, XTOP, XBOTTM ) +*> +*> [note that KU+j+1-i is just MAX(1,KU+2-i)] +*> +*> SB: (upper triangle) +*> +*> . . . . . . +*> A(K+j+1-i,i),LDA-1, XTOP, XBOTTM ) +*> +*> SB: (lower triangle) +*> +*> . . . . . . +*> A(1,i),LDA-1, XTOP, XBOTTM ) +*> +*>\endverbatim +* +* Arguments +* ========= +* +*> \verbatim +*> LROWS - LOGICAL +*> If .TRUE., then CLAROT will rotate two rows. If .FALSE., +*> then it will rotate two columns. +*> Not modified. +*> \endverbatim +*> \verbatim +*> LLEFT - LOGICAL +*> If .TRUE., then XLEFT will be used instead of the +*> corresponding element of A for the first element in the +*> second row (if LROWS=.FALSE.) or column (if LROWS=.TRUE.) +*> If .FALSE., then the corresponding element of A will be +*> used. +*> Not modified. +*> \endverbatim +*> \verbatim +*> LRIGHT - LOGICAL +*> If .TRUE., then XRIGHT will be used instead of the +*> corresponding element of A for the last element in the +*> first row (if LROWS=.FALSE.) or column (if LROWS=.TRUE.) If +*> .FALSE., then the corresponding element of A will be used. +*> Not modified. +*> \endverbatim +*> \verbatim +*> NL - INTEGER +*> The length of the rows (if LROWS=.TRUE.) or columns (if +*> LROWS=.FALSE.) to be rotated. If XLEFT and/or XRIGHT are +*> used, the columns/rows they are in should be included in +*> NL, e.g., if LLEFT = LRIGHT = .TRUE., then NL must be at +*> least 2. The number of rows/columns to be rotated +*> exclusive of those involving XLEFT and/or XRIGHT may +*> not be negative, i.e., NL minus how many of LLEFT and +*> LRIGHT are .TRUE. must be at least zero; if not, XERBLA +*> will be called. +*> Not modified. +*> \endverbatim +*> \verbatim +*> C, S - COMPLEX +*> Specify the Givens rotation to be applied. If LROWS is +*> true, then the matrix ( c s ) +*> ( _ _ ) +*> (-s c ) is applied from the left; +*> if false, then the transpose (not conjugated) thereof is +*> applied from the right. Note that in contrast to the +*> output of CROTG or to most versions of CROT, both C and S +*> are complex. For a Givens rotation, |C|**2 + |S|**2 should +*> be 1, but this is not checked. +*> Not modified. +*> \endverbatim +*> \verbatim +*> A - COMPLEX array. +*> The array containing the rows/columns to be rotated. The +*> first element of A should be the upper left element to +*> be rotated. +*> Read and modified. +*> \endverbatim +*> \verbatim +*> LDA - INTEGER +*> The "effective" leading dimension of A. If A contains +*> a matrix stored in GE, HE, or SY format, then this is just +*> the leading dimension of A as dimensioned in the calling +*> routine. If A contains a matrix stored in band (GB, HB, or +*> SB) format, then this should be *one less* than the leading +*> dimension used in the calling routine. Thus, if A were +*> dimensioned A(LDA,*) in CLAROT, then A(1,j) would be the +*> j-th element in the first of the two rows to be rotated, +*> and A(2,j) would be the j-th in the second, regardless of +*> how the array may be stored in the calling routine. [A +*> cannot, however, actually be dimensioned thus, since for +*> band format, the row number may exceed LDA, which is not +*> legal FORTRAN.] +*> If LROWS=.TRUE., then LDA must be at least 1, otherwise +*> it must be at least NL minus the number of .TRUE. values +*> in XLEFT and XRIGHT. +*> Not modified. +*> \endverbatim +*> \verbatim +*> XLEFT - COMPLEX +*> If LLEFT is .TRUE., then XLEFT will be used and modified +*> instead of A(2,1) (if LROWS=.TRUE.) or A(1,2) +*> (if LROWS=.FALSE.). +*> Read and modified. +*> \endverbatim +*> \verbatim +*> XRIGHT - COMPLEX +*> If LRIGHT is .TRUE., then XRIGHT will be used and modified +*> instead of A(1,NL) (if LROWS=.TRUE.) or A(NL,1) +*> (if LROWS=.FALSE.). +*> Read and modified. +*> \endverbatim +*> +* +* Authors +* ======= +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup complex_matgen +* +* ===================================================================== SUBROUTINE CLAROT( LROWS, LLEFT, LRIGHT, NL, C, S, A, LDA, XLEFT, $ XRIGHT ) * -* -- LAPACK auxiliary test routine (version 3.1) -- -* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. -* November 2006 +* -- LAPACK auxiliary routine (version 3.1) -- +* -- LAPACK is a software package provided by Univ. of Tennessee, -- +* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- +* November 2011 * * .. Scalar Arguments .. LOGICAL LLEFT, LRIGHT, LROWS @@ -14,193 +253,6 @@ COMPLEX A( * ) * .. * -* Purpose -* ======= -* -* CLAROT applies a (Givens) rotation to two adjacent rows or -* columns, where one element of the first and/or last column/row -* for use on matrices stored in some format other than GE, so -* that elements of the matrix may be used or modified for which -* no array element is provided. -* -* One example is a symmetric matrix in SB format (bandwidth=4), for -* which UPLO='L': Two adjacent rows will have the format: -* -* row j: * * * * * . . . . -* row j+1: * * * * * . . . . -* -* '*' indicates elements for which storage is provided, -* '.' indicates elements for which no storage is provided, but -* are not necessarily zero; their values are determined by -* symmetry. ' ' indicates elements which are necessarily zero, -* and have no storage provided. -* -* Those columns which have two '*'s can be handled by SROT. -* Those columns which have no '*'s can be ignored, since as long -* as the Givens rotations are carefully applied to preserve -* symmetry, their values are determined. -* Those columns which have one '*' have to be handled separately, -* by using separate variables "p" and "q": -* -* row j: * * * * * p . . . -* row j+1: q * * * * * . . . . -* -* The element p would have to be set correctly, then that column -* is rotated, setting p to its new value. The next call to -* CLAROT would rotate columns j and j+1, using p, and restore -* symmetry. The element q would start out being zero, and be -* made non-zero by the rotation. Later, rotations would presumably -* be chosen to zero q out. -* -* Typical Calling Sequences: rotating the i-th and (i+1)-st rows. -* ------- ------- --------- -* -* General dense matrix: -* -* CALL CLAROT(.TRUE.,.FALSE.,.FALSE., N, C,S, -* A(i,1),LDA, DUMMY, DUMMY) -* -* General banded matrix in GB format: -* -* j = MAX(1, i-KL ) -* NL = MIN( N, i+KU+1 ) + 1-j -* CALL CLAROT( .TRUE., i-KL.GE.1, i+KU.LT.N, NL, C,S, -* A(KU+i+1-j,j),LDA-1, XLEFT, XRIGHT ) -* -* [ note that i+1-j is just MIN(i,KL+1) ] -* -* Symmetric banded matrix in SY format, bandwidth K, -* lower triangle only: -* -* j = MAX(1, i-K ) -* NL = MIN( K+1, i ) + 1 -* CALL CLAROT( .TRUE., i-K.GE.1, .TRUE., NL, C,S, -* A(i,j), LDA, XLEFT, XRIGHT ) -* -* Same, but upper triangle only: -* -* NL = MIN( K+1, N-i ) + 1 -* CALL CLAROT( .TRUE., .TRUE., i+K.LT.N, NL, C,S, -* A(i,i), LDA, XLEFT, XRIGHT ) -* -* Symmetric banded matrix in SB format, bandwidth K, -* lower triangle only: -* -* [ same as for SY, except:] -* . . . . -* A(i+1-j,j), LDA-1, XLEFT, XRIGHT ) -* -* [ note that i+1-j is just MIN(i,K+1) ] -* -* Same, but upper triangle only: -* . . . -* A(K+1,i), LDA-1, XLEFT, XRIGHT ) -* -* Rotating columns is just the transpose of rotating rows, except -* for GB and SB: (rotating columns i and i+1) -* -* GB: -* j = MAX(1, i-KU ) -* NL = MIN( N, i+KL+1 ) + 1-j -* CALL CLAROT( .TRUE., i-KU.GE.1, i+KL.LT.N, NL, C,S, -* A(KU+j+1-i,i),LDA-1, XTOP, XBOTTM ) -* -* [note that KU+j+1-i is just MAX(1,KU+2-i)] -* -* SB: (upper triangle) -* -* . . . . . . -* A(K+j+1-i,i),LDA-1, XTOP, XBOTTM ) -* -* SB: (lower triangle) -* -* . . . . . . -* A(1,i),LDA-1, XTOP, XBOTTM ) -* -* Arguments -* ========= -* -* LROWS - LOGICAL -* If .TRUE., then CLAROT will rotate two rows. If .FALSE., -* then it will rotate two columns. -* Not modified. -* -* LLEFT - LOGICAL -* If .TRUE., then XLEFT will be used instead of the -* corresponding element of A for the first element in the -* second row (if LROWS=.FALSE.) or column (if LROWS=.TRUE.) -* If .FALSE., then the corresponding element of A will be -* used. -* Not modified. -* -* LRIGHT - LOGICAL -* If .TRUE., then XRIGHT will be used instead of the -* corresponding element of A for the last element in the -* first row (if LROWS=.FALSE.) or column (if LROWS=.TRUE.) If -* .FALSE., then the corresponding element of A will be used. -* Not modified. -* -* NL - INTEGER -* The length of the rows (if LROWS=.TRUE.) or columns (if -* LROWS=.FALSE.) to be rotated. If XLEFT and/or XRIGHT are -* used, the columns/rows they are in should be included in -* NL, e.g., if LLEFT = LRIGHT = .TRUE., then NL must be at -* least 2. The number of rows/columns to be rotated -* exclusive of those involving XLEFT and/or XRIGHT may -* not be negative, i.e., NL minus how many of LLEFT and -* LRIGHT are .TRUE. must be at least zero; if not, XERBLA -* will be called. -* Not modified. -* -* C, S - COMPLEX -* Specify the Givens rotation to be applied. If LROWS is -* true, then the matrix ( c s ) -* ( _ _ ) -* (-s c ) is applied from the left; -* if false, then the transpose (not conjugated) thereof is -* applied from the right. Note that in contrast to the -* output of CROTG or to most versions of CROT, both C and S -* are complex. For a Givens rotation, |C|**2 + |S|**2 should -* be 1, but this is not checked. -* Not modified. -* -* A - COMPLEX array. -* The array containing the rows/columns to be rotated. The -* first element of A should be the upper left element to -* be rotated. -* Read and modified. -* -* LDA - INTEGER -* The "effective" leading dimension of A. If A contains -* a matrix stored in GE, HE, or SY format, then this is just -* the leading dimension of A as dimensioned in the calling -* routine. If A contains a matrix stored in band (GB, HB, or -* SB) format, then this should be *one less* than the leading -* dimension used in the calling routine. Thus, if A were -* dimensioned A(LDA,*) in CLAROT, then A(1,j) would be the -* j-th element in the first of the two rows to be rotated, -* and A(2,j) would be the j-th in the second, regardless of -* how the array may be stored in the calling routine. [A -* cannot, however, actually be dimensioned thus, since for -* band format, the row number may exceed LDA, which is not -* legal FORTRAN.] -* If LROWS=.TRUE., then LDA must be at least 1, otherwise -* it must be at least NL minus the number of .TRUE. values -* in XLEFT and XRIGHT. -* Not modified. -* -* XLEFT - COMPLEX -* If LLEFT is .TRUE., then XLEFT will be used and modified -* instead of A(2,1) (if LROWS=.TRUE.) or A(1,2) -* (if LROWS=.FALSE.). -* Read and modified. -* -* XRIGHT - COMPLEX -* If LRIGHT is .TRUE., then XRIGHT will be used and modified -* instead of A(1,NL) (if LROWS=.TRUE.) or A(NL,1) -* (if LROWS=.FALSE.). -* Read and modified. -* * ===================================================================== * * .. Local Scalars .. |