diff options
Diffstat (limited to 'TESTING/MATGEN/dlatmr.f')
-rw-r--r-- | TESTING/MATGEN/dlatmr.f | 822 |
1 files changed, 477 insertions, 345 deletions
diff --git a/TESTING/MATGEN/dlatmr.f b/TESTING/MATGEN/dlatmr.f index 38b38f58..c484e06e 100644 --- a/TESTING/MATGEN/dlatmr.f +++ b/TESTING/MATGEN/dlatmr.f @@ -1,11 +1,485 @@ +*> \brief \b DLATMR +* +* =========== DOCUMENTATION =========== +* +* Online html documentation available at +* http://www.netlib.org/lapack/explore-html/ +* +* Definition +* ========== +* +* SUBROUTINE DLATMR( M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, +* RSIGN, GRADE, DL, MODEL, CONDL, DR, MODER, +* CONDR, PIVTNG, IPIVOT, KL, KU, SPARSE, ANORM, +* PACK, A, LDA, IWORK, INFO ) +* +* .. Scalar Arguments .. +* CHARACTER DIST, GRADE, PACK, PIVTNG, RSIGN, SYM +* INTEGER INFO, KL, KU, LDA, M, MODE, MODEL, MODER, N +* DOUBLE PRECISION ANORM, COND, CONDL, CONDR, DMAX, SPARSE +* .. +* .. Array Arguments .. +* INTEGER IPIVOT( * ), ISEED( 4 ), IWORK( * ) +* DOUBLE PRECISION A( LDA, * ), D( * ), DL( * ), DR( * ) +* .. +* +* Purpose +* ======= +* +*>\details \b Purpose: +*>\verbatim +*> +*> DLATMR generates random matrices of various types for testing +*> LAPACK programs. +*> +*> DLATMR operates by applying the following sequence of +*> operations: +*> +*> Generate a matrix A with random entries of distribution DIST +*> which is symmetric if SYM='S', and nonsymmetric +*> if SYM='N'. +*> +*> Set the diagonal to D, where D may be input or +*> computed according to MODE, COND, DMAX and RSIGN +*> as described below. +*> +*> Grade the matrix, if desired, from the left and/or right +*> as specified by GRADE. The inputs DL, MODEL, CONDL, DR, +*> MODER and CONDR also determine the grading as described +*> below. +*> +*> Permute, if desired, the rows and/or columns as specified by +*> PIVTNG and IPIVOT. +*> +*> Set random entries to zero, if desired, to get a random sparse +*> matrix as specified by SPARSE. +*> +*> Make A a band matrix, if desired, by zeroing out the matrix +*> outside a band of lower bandwidth KL and upper bandwidth KU. +*> +*> Scale A, if desired, to have maximum entry ANORM. +*> +*> Pack the matrix if desired. Options specified by PACK are: +*> no packing +*> zero out upper half (if symmetric) +*> zero out lower half (if symmetric) +*> store the upper half columnwise (if symmetric or +*> square upper triangular) +*> store the lower half columnwise (if symmetric or +*> square lower triangular) +*> same as upper half rowwise if symmetric +*> store the lower triangle in banded format (if symmetric) +*> store the upper triangle in banded format (if symmetric) +*> store the entire matrix in banded format +*> +*> Note: If two calls to DLATMR differ only in the PACK parameter, +*> they will generate mathematically equivalent matrices. +*> +*> If two calls to DLATMR both have full bandwidth (KL = M-1 +*> and KU = N-1), and differ only in the PIVTNG and PACK +*> parameters, then the matrices generated will differ only +*> in the order of the rows and/or columns, and otherwise +*> contain the same data. This consistency cannot be and +*> is not maintained with less than full bandwidth. +*> +*>\endverbatim +* +* Arguments +* ========= +* +*> \param[in] M +*> \verbatim +*> M is INTEGER +*> Number of rows of A. Not modified. +*> \endverbatim +*> +*> \param[in] N +*> \verbatim +*> N is INTEGER +*> Number of columns of A. Not modified. +*> \endverbatim +*> +*> \param[in] DIST +*> \verbatim +*> DIST is CHARACTER*1 +*> On entry, DIST specifies the type of distribution to be used +*> to generate a random matrix . +*> 'U' => UNIFORM( 0, 1 ) ( 'U' for uniform ) +*> 'S' => UNIFORM( -1, 1 ) ( 'S' for symmetric ) +*> 'N' => NORMAL( 0, 1 ) ( 'N' for normal ) +*> Not modified. +*> \endverbatim +*> +*> \param[in,out] ISEED +*> \verbatim +*> ISEED is INTEGER array, dimension (4) +*> On entry ISEED specifies the seed of the random number +*> generator. They should lie between 0 and 4095 inclusive, +*> and ISEED(4) should be odd. The random number generator +*> uses a linear congruential sequence limited to small +*> integers, and so should produce machine independent +*> random numbers. The values of ISEED are changed on +*> exit, and can be used in the next call to DLATMR +*> to continue the same random number sequence. +*> Changed on exit. +*> \endverbatim +*> +*> \param[in] SYM +*> \verbatim +*> SYM is CHARACTER*1 +*> If SYM='S' or 'H', generated matrix is symmetric. +*> If SYM='N', generated matrix is nonsymmetric. +*> Not modified. +*> \endverbatim +*> +*> \param[in,out] D +*> \verbatim +*> D is DOUBLE PRECISION array, dimension (min(M,N)) +*> On entry this array specifies the diagonal entries +*> of the diagonal of A. D may either be specified +*> on entry, or set according to MODE and COND as described +*> below. May be changed on exit if MODE is nonzero. +*> \endverbatim +*> +*> \param[in] MODE +*> \verbatim +*> MODE is INTEGER +*> On entry describes how D is to be used: +*> MODE = 0 means use D as input +*> MODE = 1 sets D(1)=1 and D(2:N)=1.0/COND +*> MODE = 2 sets D(1:N-1)=1 and D(N)=1.0/COND +*> MODE = 3 sets D(I)=COND**(-(I-1)/(N-1)) +*> MODE = 4 sets D(i)=1 - (i-1)/(N-1)*(1 - 1/COND) +*> MODE = 5 sets D to random numbers in the range +*> ( 1/COND , 1 ) such that their logarithms +*> are uniformly distributed. +*> MODE = 6 set D to random numbers from same distribution +*> as the rest of the matrix. +*> MODE < 0 has the same meaning as ABS(MODE), except that +*> the order of the elements of D is reversed. +*> Thus if MODE is positive, D has entries ranging from +*> 1 to 1/COND, if negative, from 1/COND to 1, +*> Not modified. +*> \endverbatim +*> +*> \param[in] COND +*> \verbatim +*> COND is DOUBLE PRECISION +*> On entry, used as described under MODE above. +*> If used, it must be >= 1. Not modified. +*> \endverbatim +*> +*> \param[in] DMAX +*> \verbatim +*> DMAX is DOUBLE PRECISION +*> If MODE neither -6, 0 nor 6, the diagonal is scaled by +*> DMAX / max(abs(D(i))), so that maximum absolute entry +*> of diagonal is abs(DMAX). If DMAX is negative (or zero), +*> diagonal will be scaled by a negative number (or zero). +*> \endverbatim +*> +*> \param[in] RSIGN +*> \verbatim +*> RSIGN is CHARACTER*1 +*> If MODE neither -6, 0 nor 6, specifies sign of diagonal +*> as follows: +*> 'T' => diagonal entries are multiplied by 1 or -1 +*> with probability .5 +*> 'F' => diagonal unchanged +*> Not modified. +*> \endverbatim +*> +*> \param[in] GRADE +*> \verbatim +*> GRADE is CHARACTER*1 +*> Specifies grading of matrix as follows: +*> 'N' => no grading +*> 'L' => matrix premultiplied by diag( DL ) +*> (only if matrix nonsymmetric) +*> 'R' => matrix postmultiplied by diag( DR ) +*> (only if matrix nonsymmetric) +*> 'B' => matrix premultiplied by diag( DL ) and +*> postmultiplied by diag( DR ) +*> (only if matrix nonsymmetric) +*> 'S' or 'H' => matrix premultiplied by diag( DL ) and +*> postmultiplied by diag( DL ) +*> ('S' for symmetric, or 'H' for Hermitian) +*> 'E' => matrix premultiplied by diag( DL ) and +*> postmultiplied by inv( diag( DL ) ) +*> ( 'E' for eigenvalue invariance) +*> (only if matrix nonsymmetric) +*> Note: if GRADE='E', then M must equal N. +*> Not modified. +*> \endverbatim +*> +*> \param[in,out] DL +*> \verbatim +*> DL is DOUBLE PRECISION array, dimension (M) +*> If MODEL=0, then on entry this array specifies the diagonal +*> entries of a diagonal matrix used as described under GRADE +*> above. If MODEL is not zero, then DL will be set according +*> to MODEL and CONDL, analogous to the way D is set according +*> to MODE and COND (except there is no DMAX parameter for DL). +*> If GRADE='E', then DL cannot have zero entries. +*> Not referenced if GRADE = 'N' or 'R'. Changed on exit. +*> \endverbatim +*> +*> \param[in] MODEL +*> \verbatim +*> MODEL is INTEGER +*> This specifies how the diagonal array DL is to be computed, +*> just as MODE specifies how D is to be computed. +*> Not modified. +*> \endverbatim +*> +*> \param[in] CONDL +*> \verbatim +*> CONDL is DOUBLE PRECISION +*> When MODEL is not zero, this specifies the condition number +*> of the computed DL. Not modified. +*> \endverbatim +*> +*> \param[in,out] DR +*> \verbatim +*> DR is DOUBLE PRECISION array, dimension (N) +*> If MODER=0, then on entry this array specifies the diagonal +*> entries of a diagonal matrix used as described under GRADE +*> above. If MODER is not zero, then DR will be set according +*> to MODER and CONDR, analogous to the way D is set according +*> to MODE and COND (except there is no DMAX parameter for DR). +*> Not referenced if GRADE = 'N', 'L', 'H', 'S' or 'E'. +*> Changed on exit. +*> \endverbatim +*> +*> \param[in] MODER +*> \verbatim +*> MODER is INTEGER +*> This specifies how the diagonal array DR is to be computed, +*> just as MODE specifies how D is to be computed. +*> Not modified. +*> \endverbatim +*> +*> \param[in] CONDR +*> \verbatim +*> CONDR is DOUBLE PRECISION +*> When MODER is not zero, this specifies the condition number +*> of the computed DR. Not modified. +*> \endverbatim +*> +*> \param[in] PIVTNG +*> \verbatim +*> PIVTNG is CHARACTER*1 +*> On entry specifies pivoting permutations as follows: +*> 'N' or ' ' => none. +*> 'L' => left or row pivoting (matrix must be nonsymmetric). +*> 'R' => right or column pivoting (matrix must be +*> nonsymmetric). +*> 'B' or 'F' => both or full pivoting, i.e., on both sides. +*> In this case, M must equal N +*> \endverbatim +*> \verbatim +*> If two calls to DLATMR both have full bandwidth (KL = M-1 +*> and KU = N-1), and differ only in the PIVTNG and PACK +*> parameters, then the matrices generated will differ only +*> in the order of the rows and/or columns, and otherwise +*> contain the same data. This consistency cannot be +*> maintained with less than full bandwidth. +*> \endverbatim +*> +*> \param[in] IPIVOT +*> \verbatim +*> IPIVOT is INTEGER array, dimension (N or M) +*> This array specifies the permutation used. After the +*> basic matrix is generated, the rows, columns, or both +*> are permuted. If, say, row pivoting is selected, DLATMR +*> starts with the *last* row and interchanges the M-th and +*> IPIVOT(M)-th rows, then moves to the next-to-last row, +*> interchanging the (M-1)-th and the IPIVOT(M-1)-th rows, +*> and so on. In terms of "2-cycles", the permutation is +*> (1 IPIVOT(1)) (2 IPIVOT(2)) ... (M IPIVOT(M)) +*> where the rightmost cycle is applied first. This is the +*> *inverse* of the effect of pivoting in LINPACK. The idea +*> is that factoring (with pivoting) an identity matrix +*> which has been inverse-pivoted in this way should +*> result in a pivot vector identical to IPIVOT. +*> Not referenced if PIVTNG = 'N'. Not modified. +*> \endverbatim +*> +*> \param[in] SPARSE +*> \verbatim +*> SPARSE is DOUBLE PRECISION +*> On entry specifies the sparsity of the matrix if a sparse +*> matrix is to be generated. SPARSE should lie between +*> 0 and 1. To generate a sparse matrix, for each matrix entry +*> a uniform ( 0, 1 ) random number x is generated and +*> compared to SPARSE; if x is larger the matrix entry +*> is unchanged and if x is smaller the entry is set +*> to zero. Thus on the average a fraction SPARSE of the +*> entries will be set to zero. +*> Not modified. +*> \endverbatim +*> +*> \param[in] KL +*> \verbatim +*> KL is INTEGER +*> On entry specifies the lower bandwidth of the matrix. For +*> example, KL=0 implies upper triangular, KL=1 implies upper +*> Hessenberg, and KL at least M-1 implies the matrix is not +*> banded. Must equal KU if matrix is symmetric. +*> Not modified. +*> \endverbatim +*> +*> \param[in] KU +*> \verbatim +*> KU is INTEGER +*> On entry specifies the upper bandwidth of the matrix. For +*> example, KU=0 implies lower triangular, KU=1 implies lower +*> Hessenberg, and KU at least N-1 implies the matrix is not +*> banded. Must equal KL if matrix is symmetric. +*> Not modified. +*> \endverbatim +*> +*> \param[in] ANORM +*> \verbatim +*> ANORM is DOUBLE PRECISION +*> On entry specifies maximum entry of output matrix +*> (output matrix will by multiplied by a constant so that +*> its largest absolute entry equal ANORM) +*> if ANORM is nonnegative. If ANORM is negative no scaling +*> is done. Not modified. +*> \endverbatim +*> +*> \param[in] PACK +*> \verbatim +*> PACK is CHARACTER*1 +*> On entry specifies packing of matrix as follows: +*> 'N' => no packing +*> 'U' => zero out all subdiagonal entries (if symmetric) +*> 'L' => zero out all superdiagonal entries (if symmetric) +*> 'C' => store the upper triangle columnwise +*> (only if matrix symmetric or square upper triangular) +*> 'R' => store the lower triangle columnwise +*> (only if matrix symmetric or square lower triangular) +*> (same as upper half rowwise if symmetric) +*> 'B' => store the lower triangle in band storage scheme +*> (only if matrix symmetric) +*> 'Q' => store the upper triangle in band storage scheme +*> (only if matrix symmetric) +*> 'Z' => store the entire matrix in band storage scheme +*> (pivoting can be provided for by using this +*> option to store A in the trailing rows of +*> the allocated storage) +*> \endverbatim +*> \verbatim +*> Using these options, the various LAPACK packed and banded +*> storage schemes can be obtained: +*> GB - use 'Z' +*> PB, SB or TB - use 'B' or 'Q' +*> PP, SP or TP - use 'C' or 'R' +*> \endverbatim +*> \verbatim +*> If two calls to DLATMR differ only in the PACK parameter, +*> they will generate mathematically equivalent matrices. +*> Not modified. +*> \endverbatim +*> +*> \param[out] A +*> \verbatim +*> A is DOUBLE PRECISION array, dimension (LDA,N) +*> On exit A is the desired test matrix. Only those +*> entries of A which are significant on output +*> will be referenced (even if A is in packed or band +*> storage format). The 'unoccupied corners' of A in +*> band format will be zeroed out. +*> \endverbatim +*> +*> \param[in] LDA +*> \verbatim +*> LDA is INTEGER +*> on entry LDA specifies the first dimension of A as +*> declared in the calling program. +*> If PACK='N', 'U' or 'L', LDA must be at least max ( 1, M ). +*> If PACK='C' or 'R', LDA must be at least 1. +*> If PACK='B', or 'Q', LDA must be MIN ( KU+1, N ) +*> If PACK='Z', LDA must be at least KUU+KLL+1, where +*> KUU = MIN ( KU, N-1 ) and KLL = MIN ( KL, N-1 ) +*> Not modified. +*> \endverbatim +*> +*> \param[out] IWORK +*> \verbatim +*> IWORK is INTEGER array, dimension ( N or M) +*> Workspace. Not referenced if PIVTNG = 'N'. Changed on exit. +*> \endverbatim +*> +*> \param[out] INFO +*> \verbatim +*> INFO is INTEGER +*> Error parameter on exit: +*> 0 => normal return +*> -1 => M negative or unequal to N and SYM='S' or 'H' +*> -2 => N negative +*> -3 => DIST illegal string +*> -5 => SYM illegal string +*> -7 => MODE not in range -6 to 6 +*> -8 => COND less than 1.0, and MODE neither -6, 0 nor 6 +*> -10 => MODE neither -6, 0 nor 6 and RSIGN illegal string +*> -11 => GRADE illegal string, or GRADE='E' and +*> M not equal to N, or GRADE='L', 'R', 'B' or 'E' and +*> SYM = 'S' or 'H' +*> -12 => GRADE = 'E' and DL contains zero +*> -13 => MODEL not in range -6 to 6 and GRADE= 'L', 'B', 'H', +*> 'S' or 'E' +*> -14 => CONDL less than 1.0, GRADE='L', 'B', 'H', 'S' or 'E', +*> and MODEL neither -6, 0 nor 6 +*> -16 => MODER not in range -6 to 6 and GRADE= 'R' or 'B' +*> -17 => CONDR less than 1.0, GRADE='R' or 'B', and +*> MODER neither -6, 0 nor 6 +*> -18 => PIVTNG illegal string, or PIVTNG='B' or 'F' and +*> M not equal to N, or PIVTNG='L' or 'R' and SYM='S' +*> or 'H' +*> -19 => IPIVOT contains out of range number and +*> PIVTNG not equal to 'N' +*> -20 => KL negative +*> -21 => KU negative, or SYM='S' or 'H' and KU not equal to KL +*> -22 => SPARSE not in range 0. to 1. +*> -24 => PACK illegal string, or PACK='U', 'L', 'B' or 'Q' +*> and SYM='N', or PACK='C' and SYM='N' and either KL +*> not equal to 0 or N not equal to M, or PACK='R' and +*> SYM='N', and either KU not equal to 0 or N not equal +*> to M +*> -26 => LDA too small +*> 1 => Error return from DLATM1 (computing D) +*> 2 => Cannot scale diagonal to DMAX (max. entry is 0) +*> 3 => Error return from DLATM1 (computing DL) +*> 4 => Error return from DLATM1 (computing DR) +*> 5 => ANORM is positive, but matrix constructed prior to +*> attempting to scale it to have norm ANORM, is zero +*> \endverbatim +*> +* +* Authors +* ======= +* +*> \author Univ. of Tennessee +*> \author Univ. of California Berkeley +*> \author Univ. of Colorado Denver +*> \author NAG Ltd. +* +*> \date November 2011 +* +*> \ingroup double_matgen +* +* ===================================================================== SUBROUTINE DLATMR( M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, $ RSIGN, GRADE, DL, MODEL, CONDL, DR, MODER, $ CONDR, PIVTNG, IPIVOT, KL, KU, SPARSE, ANORM, $ PACK, A, LDA, IWORK, INFO ) * -* -- LAPACK test routine (version 3.1) -- -* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. -* June 2010 +* -- LAPACK computational 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 .. CHARACTER DIST, GRADE, PACK, PIVTNG, RSIGN, SYM @@ -17,348 +491,6 @@ DOUBLE PRECISION A( LDA, * ), D( * ), DL( * ), DR( * ) * .. * -* Purpose -* ======= -* -* DLATMR generates random matrices of various types for testing -* LAPACK programs. -* -* DLATMR operates by applying the following sequence of -* operations: -* -* Generate a matrix A with random entries of distribution DIST -* which is symmetric if SYM='S', and nonsymmetric -* if SYM='N'. -* -* Set the diagonal to D, where D may be input or -* computed according to MODE, COND, DMAX and RSIGN -* as described below. -* -* Grade the matrix, if desired, from the left and/or right -* as specified by GRADE. The inputs DL, MODEL, CONDL, DR, -* MODER and CONDR also determine the grading as described -* below. -* -* Permute, if desired, the rows and/or columns as specified by -* PIVTNG and IPIVOT. -* -* Set random entries to zero, if desired, to get a random sparse -* matrix as specified by SPARSE. -* -* Make A a band matrix, if desired, by zeroing out the matrix -* outside a band of lower bandwidth KL and upper bandwidth KU. -* -* Scale A, if desired, to have maximum entry ANORM. -* -* Pack the matrix if desired. Options specified by PACK are: -* no packing -* zero out upper half (if symmetric) -* zero out lower half (if symmetric) -* store the upper half columnwise (if symmetric or -* square upper triangular) -* store the lower half columnwise (if symmetric or -* square lower triangular) -* same as upper half rowwise if symmetric -* store the lower triangle in banded format (if symmetric) -* store the upper triangle in banded format (if symmetric) -* store the entire matrix in banded format -* -* Note: If two calls to DLATMR differ only in the PACK parameter, -* they will generate mathematically equivalent matrices. -* -* If two calls to DLATMR both have full bandwidth (KL = M-1 -* and KU = N-1), and differ only in the PIVTNG and PACK -* parameters, then the matrices generated will differ only -* in the order of the rows and/or columns, and otherwise -* contain the same data. This consistency cannot be and -* is not maintained with less than full bandwidth. -* -* Arguments -* ========= -* -* M (input) INTEGER -* Number of rows of A. Not modified. -* -* N (input) INTEGER -* Number of columns of A. Not modified. -* -* DIST (input) CHARACTER*1 -* On entry, DIST specifies the type of distribution to be used -* to generate a random matrix . -* 'U' => UNIFORM( 0, 1 ) ( 'U' for uniform ) -* 'S' => UNIFORM( -1, 1 ) ( 'S' for symmetric ) -* 'N' => NORMAL( 0, 1 ) ( 'N' for normal ) -* Not modified. -* -* ISEED (input/output) INTEGER array, dimension (4) -* On entry ISEED specifies the seed of the random number -* generator. They should lie between 0 and 4095 inclusive, -* and ISEED(4) should be odd. The random number generator -* uses a linear congruential sequence limited to small -* integers, and so should produce machine independent -* random numbers. The values of ISEED are changed on -* exit, and can be used in the next call to DLATMR -* to continue the same random number sequence. -* Changed on exit. -* -* SYM (input) CHARACTER*1 -* If SYM='S' or 'H', generated matrix is symmetric. -* If SYM='N', generated matrix is nonsymmetric. -* Not modified. -* -* D (input/output) DOUBLE PRECISION array, dimension (min(M,N)) -* On entry this array specifies the diagonal entries -* of the diagonal of A. D may either be specified -* on entry, or set according to MODE and COND as described -* below. May be changed on exit if MODE is nonzero. -* -* MODE (input) INTEGER -* On entry describes how D is to be used: -* MODE = 0 means use D as input -* MODE = 1 sets D(1)=1 and D(2:N)=1.0/COND -* MODE = 2 sets D(1:N-1)=1 and D(N)=1.0/COND -* MODE = 3 sets D(I)=COND**(-(I-1)/(N-1)) -* MODE = 4 sets D(i)=1 - (i-1)/(N-1)*(1 - 1/COND) -* MODE = 5 sets D to random numbers in the range -* ( 1/COND , 1 ) such that their logarithms -* are uniformly distributed. -* MODE = 6 set D to random numbers from same distribution -* as the rest of the matrix. -* MODE < 0 has the same meaning as ABS(MODE), except that -* the order of the elements of D is reversed. -* Thus if MODE is positive, D has entries ranging from -* 1 to 1/COND, if negative, from 1/COND to 1, -* Not modified. -* -* COND (input) DOUBLE PRECISION -* On entry, used as described under MODE above. -* If used, it must be >= 1. Not modified. -* -* DMAX (input) DOUBLE PRECISION -* If MODE neither -6, 0 nor 6, the diagonal is scaled by -* DMAX / max(abs(D(i))), so that maximum absolute entry -* of diagonal is abs(DMAX). If DMAX is negative (or zero), -* diagonal will be scaled by a negative number (or zero). -* -* RSIGN (input) CHARACTER*1 -* If MODE neither -6, 0 nor 6, specifies sign of diagonal -* as follows: -* 'T' => diagonal entries are multiplied by 1 or -1 -* with probability .5 -* 'F' => diagonal unchanged -* Not modified. -* -* GRADE (input) CHARACTER*1 -* Specifies grading of matrix as follows: -* 'N' => no grading -* 'L' => matrix premultiplied by diag( DL ) -* (only if matrix nonsymmetric) -* 'R' => matrix postmultiplied by diag( DR ) -* (only if matrix nonsymmetric) -* 'B' => matrix premultiplied by diag( DL ) and -* postmultiplied by diag( DR ) -* (only if matrix nonsymmetric) -* 'S' or 'H' => matrix premultiplied by diag( DL ) and -* postmultiplied by diag( DL ) -* ('S' for symmetric, or 'H' for Hermitian) -* 'E' => matrix premultiplied by diag( DL ) and -* postmultiplied by inv( diag( DL ) ) -* ( 'E' for eigenvalue invariance) -* (only if matrix nonsymmetric) -* Note: if GRADE='E', then M must equal N. -* Not modified. -* -* DL (input/output) DOUBLE PRECISION array, dimension (M) -* If MODEL=0, then on entry this array specifies the diagonal -* entries of a diagonal matrix used as described under GRADE -* above. If MODEL is not zero, then DL will be set according -* to MODEL and CONDL, analogous to the way D is set according -* to MODE and COND (except there is no DMAX parameter for DL). -* If GRADE='E', then DL cannot have zero entries. -* Not referenced if GRADE = 'N' or 'R'. Changed on exit. -* -* MODEL (input) INTEGER -* This specifies how the diagonal array DL is to be computed, -* just as MODE specifies how D is to be computed. -* Not modified. -* -* CONDL (input) DOUBLE PRECISION -* When MODEL is not zero, this specifies the condition number -* of the computed DL. Not modified. -* -* DR (input/output) DOUBLE PRECISION array, dimension (N) -* If MODER=0, then on entry this array specifies the diagonal -* entries of a diagonal matrix used as described under GRADE -* above. If MODER is not zero, then DR will be set according -* to MODER and CONDR, analogous to the way D is set according -* to MODE and COND (except there is no DMAX parameter for DR). -* Not referenced if GRADE = 'N', 'L', 'H', 'S' or 'E'. -* Changed on exit. -* -* MODER (input) INTEGER -* This specifies how the diagonal array DR is to be computed, -* just as MODE specifies how D is to be computed. -* Not modified. -* -* CONDR (input) DOUBLE PRECISION -* When MODER is not zero, this specifies the condition number -* of the computed DR. Not modified. -* -* PIVTNG (input) CHARACTER*1 -* On entry specifies pivoting permutations as follows: -* 'N' or ' ' => none. -* 'L' => left or row pivoting (matrix must be nonsymmetric). -* 'R' => right or column pivoting (matrix must be -* nonsymmetric). -* 'B' or 'F' => both or full pivoting, i.e., on both sides. -* In this case, M must equal N -* -* If two calls to DLATMR both have full bandwidth (KL = M-1 -* and KU = N-1), and differ only in the PIVTNG and PACK -* parameters, then the matrices generated will differ only -* in the order of the rows and/or columns, and otherwise -* contain the same data. This consistency cannot be -* maintained with less than full bandwidth. -* -* IPIVOT (input) INTEGER array, dimension (N or M) -* This array specifies the permutation used. After the -* basic matrix is generated, the rows, columns, or both -* are permuted. If, say, row pivoting is selected, DLATMR -* starts with the *last* row and interchanges the M-th and -* IPIVOT(M)-th rows, then moves to the next-to-last row, -* interchanging the (M-1)-th and the IPIVOT(M-1)-th rows, -* and so on. In terms of "2-cycles", the permutation is -* (1 IPIVOT(1)) (2 IPIVOT(2)) ... (M IPIVOT(M)) -* where the rightmost cycle is applied first. This is the -* *inverse* of the effect of pivoting in LINPACK. The idea -* is that factoring (with pivoting) an identity matrix -* which has been inverse-pivoted in this way should -* result in a pivot vector identical to IPIVOT. -* Not referenced if PIVTNG = 'N'. Not modified. -* -* SPARSE (input) DOUBLE PRECISION -* On entry specifies the sparsity of the matrix if a sparse -* matrix is to be generated. SPARSE should lie between -* 0 and 1. To generate a sparse matrix, for each matrix entry -* a uniform ( 0, 1 ) random number x is generated and -* compared to SPARSE; if x is larger the matrix entry -* is unchanged and if x is smaller the entry is set -* to zero. Thus on the average a fraction SPARSE of the -* entries will be set to zero. -* Not modified. -* -* KL (input) INTEGER -* On entry specifies the lower bandwidth of the matrix. For -* example, KL=0 implies upper triangular, KL=1 implies upper -* Hessenberg, and KL at least M-1 implies the matrix is not -* banded. Must equal KU if matrix is symmetric. -* Not modified. -* -* KU (input) INTEGER -* On entry specifies the upper bandwidth of the matrix. For -* example, KU=0 implies lower triangular, KU=1 implies lower -* Hessenberg, and KU at least N-1 implies the matrix is not -* banded. Must equal KL if matrix is symmetric. -* Not modified. -* -* ANORM (input) DOUBLE PRECISION -* On entry specifies maximum entry of output matrix -* (output matrix will by multiplied by a constant so that -* its largest absolute entry equal ANORM) -* if ANORM is nonnegative. If ANORM is negative no scaling -* is done. Not modified. -* -* PACK (input) CHARACTER*1 -* On entry specifies packing of matrix as follows: -* 'N' => no packing -* 'U' => zero out all subdiagonal entries (if symmetric) -* 'L' => zero out all superdiagonal entries (if symmetric) -* 'C' => store the upper triangle columnwise -* (only if matrix symmetric or square upper triangular) -* 'R' => store the lower triangle columnwise -* (only if matrix symmetric or square lower triangular) -* (same as upper half rowwise if symmetric) -* 'B' => store the lower triangle in band storage scheme -* (only if matrix symmetric) -* 'Q' => store the upper triangle in band storage scheme -* (only if matrix symmetric) -* 'Z' => store the entire matrix in band storage scheme -* (pivoting can be provided for by using this -* option to store A in the trailing rows of -* the allocated storage) -* -* Using these options, the various LAPACK packed and banded -* storage schemes can be obtained: -* GB - use 'Z' -* PB, SB or TB - use 'B' or 'Q' -* PP, SP or TP - use 'C' or 'R' -* -* If two calls to DLATMR differ only in the PACK parameter, -* they will generate mathematically equivalent matrices. -* Not modified. -* -* A (output) DOUBLE PRECISION array, dimension (LDA,N) -* On exit A is the desired test matrix. Only those -* entries of A which are significant on output -* will be referenced (even if A is in packed or band -* storage format). The 'unoccupied corners' of A in -* band format will be zeroed out. -* -* LDA (input) INTEGER -* on entry LDA specifies the first dimension of A as -* declared in the calling program. -* If PACK='N', 'U' or 'L', LDA must be at least max ( 1, M ). -* If PACK='C' or 'R', LDA must be at least 1. -* If PACK='B', or 'Q', LDA must be MIN ( KU+1, N ) -* If PACK='Z', LDA must be at least KUU+KLL+1, where -* KUU = MIN ( KU, N-1 ) and KLL = MIN ( KL, N-1 ) -* Not modified. -* -* IWORK (workspace) INTEGER array, dimension ( N or M) -* Workspace. Not referenced if PIVTNG = 'N'. Changed on exit. -* -* INFO (output) INTEGER -* Error parameter on exit: -* 0 => normal return -* -1 => M negative or unequal to N and SYM='S' or 'H' -* -2 => N negative -* -3 => DIST illegal string -* -5 => SYM illegal string -* -7 => MODE not in range -6 to 6 -* -8 => COND less than 1.0, and MODE neither -6, 0 nor 6 -* -10 => MODE neither -6, 0 nor 6 and RSIGN illegal string -* -11 => GRADE illegal string, or GRADE='E' and -* M not equal to N, or GRADE='L', 'R', 'B' or 'E' and -* SYM = 'S' or 'H' -* -12 => GRADE = 'E' and DL contains zero -* -13 => MODEL not in range -6 to 6 and GRADE= 'L', 'B', 'H', -* 'S' or 'E' -* -14 => CONDL less than 1.0, GRADE='L', 'B', 'H', 'S' or 'E', -* and MODEL neither -6, 0 nor 6 -* -16 => MODER not in range -6 to 6 and GRADE= 'R' or 'B' -* -17 => CONDR less than 1.0, GRADE='R' or 'B', and -* MODER neither -6, 0 nor 6 -* -18 => PIVTNG illegal string, or PIVTNG='B' or 'F' and -* M not equal to N, or PIVTNG='L' or 'R' and SYM='S' -* or 'H' -* -19 => IPIVOT contains out of range number and -* PIVTNG not equal to 'N' -* -20 => KL negative -* -21 => KU negative, or SYM='S' or 'H' and KU not equal to KL -* -22 => SPARSE not in range 0. to 1. -* -24 => PACK illegal string, or PACK='U', 'L', 'B' or 'Q' -* and SYM='N', or PACK='C' and SYM='N' and either KL -* not equal to 0 or N not equal to M, or PACK='R' and -* SYM='N', and either KU not equal to 0 or N not equal -* to M -* -26 => LDA too small -* 1 => Error return from DLATM1 (computing D) -* 2 => Cannot scale diagonal to DMAX (max. entry is 0) -* 3 => Error return from DLATM1 (computing DL) -* 4 => Error return from DLATM1 (computing DR) -* 5 => ANORM is positive, but matrix constructed prior to -* attempting to scale it to have norm ANORM, is zero -* * ===================================================================== * * .. Parameters .. |