|
kusano |
7d535a |
/* -- translated by f2c (version 19940927).
|
|
kusano |
7d535a |
You must link the resulting object file with the libraries:
|
|
kusano |
7d535a |
-lf2c -lm (in that order)
|
|
kusano |
7d535a |
*/
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
#include "f2c.h"
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Table of constant values */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
static integer c__0 = 0;
|
|
kusano |
7d535a |
static integer c__1 = 1;
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Subroutine */ int zlatmr_(integer *m, integer *n, char *dist, integer *
|
|
kusano |
7d535a |
iseed, char *sym, doublecomplex *d, integer *mode, doublereal *cond,
|
|
kusano |
7d535a |
doublecomplex *dmax__, char *rsign, char *grade, doublecomplex *dl,
|
|
kusano |
7d535a |
integer *model, doublereal *condl, doublecomplex *dr, integer *moder,
|
|
kusano |
7d535a |
doublereal *condr, char *pivtng, integer *ipivot, integer *kl,
|
|
kusano |
7d535a |
integer *ku, doublereal *sparse, doublereal *anorm, char *pack,
|
|
kusano |
7d535a |
doublecomplex *a, integer *lda, integer *iwork, integer *info)
|
|
kusano |
7d535a |
{
|
|
kusano |
7d535a |
/* System generated locals */
|
|
kusano |
7d535a |
integer a_dim1, a_offset, i__1, i__2, i__3, i__4;
|
|
kusano |
7d535a |
doublereal d__1, d__2;
|
|
kusano |
7d535a |
doublecomplex z__1, z__2;
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Builtin functions */
|
|
kusano |
7d535a |
double z_abs(doublecomplex *);
|
|
kusano |
7d535a |
void d_cnjg(doublecomplex *, doublecomplex *);
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Local variables */
|
|
kusano |
7d535a |
static integer isub, jsub;
|
|
kusano |
7d535a |
static doublereal temp;
|
|
kusano |
7d535a |
static integer isym, i, j, k, ipack;
|
|
kusano |
7d535a |
extern logical lsame_(char *, char *);
|
|
kusano |
7d535a |
static doublereal tempa[1];
|
|
kusano |
7d535a |
static doublecomplex ctemp;
|
|
kusano |
7d535a |
static integer iisub, idist, jjsub, mnmin;
|
|
kusano |
7d535a |
static logical dzero;
|
|
kusano |
7d535a |
static integer mnsub;
|
|
kusano |
7d535a |
static doublereal onorm;
|
|
kusano |
7d535a |
static integer mxsub, npvts;
|
|
kusano |
7d535a |
extern /* Subroutine */ int zlatm1_(integer *, doublereal *, integer *,
|
|
kusano |
7d535a |
integer *, integer *, doublecomplex *, integer *, integer *);
|
|
kusano |
7d535a |
extern /* Double Complex */ VOID zlatm2_(doublecomplex *, integer *,
|
|
kusano |
7d535a |
integer *, integer *, integer *, integer *, integer *, integer *,
|
|
kusano |
7d535a |
integer *, doublecomplex *, integer *, doublecomplex *,
|
|
kusano |
7d535a |
doublecomplex *, integer *, integer *, doublereal *), zlatm3_(
|
|
kusano |
7d535a |
doublecomplex *, integer *, integer *, integer *, integer *,
|
|
kusano |
7d535a |
integer *, integer *, integer *, integer *, integer *, integer *,
|
|
kusano |
7d535a |
doublecomplex *, integer *, doublecomplex *, doublecomplex *,
|
|
kusano |
7d535a |
integer *, integer *, doublereal *);
|
|
kusano |
7d535a |
static doublecomplex calpha;
|
|
kusano |
7d535a |
static integer igrade;
|
|
kusano |
7d535a |
static logical fulbnd;
|
|
kusano |
7d535a |
extern doublereal zlangb_(char *, integer *, integer *, integer *,
|
|
kusano |
7d535a |
doublecomplex *, integer *, doublereal *);
|
|
kusano |
7d535a |
extern /* Subroutine */ int xerbla_(char *, integer *);
|
|
kusano |
7d535a |
static logical badpvt;
|
|
kusano |
7d535a |
extern doublereal zlange_(char *, integer *, integer *, doublecomplex *,
|
|
kusano |
7d535a |
integer *, doublereal *);
|
|
kusano |
7d535a |
extern /* Subroutine */ int zdscal_(integer *, doublereal *,
|
|
kusano |
7d535a |
doublecomplex *, integer *);
|
|
kusano |
7d535a |
extern doublereal zlansb_(char *, char *, integer *, integer *,
|
|
kusano |
7d535a |
doublecomplex *, integer *, doublereal *);
|
|
kusano |
7d535a |
static integer irsign, ipvtng;
|
|
kusano |
7d535a |
extern doublereal zlansp_(char *, char *, integer *, doublecomplex *,
|
|
kusano |
7d535a |
doublereal *), zlansy_(char *, char *, integer *,
|
|
kusano |
7d535a |
doublecomplex *, integer *, doublereal *);
|
|
kusano |
7d535a |
static integer kll, kuu;
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* -- LAPACK test routine (version 2.0) --
|
|
kusano |
7d535a |
Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
|
|
kusano |
7d535a |
Courant Institute, Argonne National Lab, and Rice University
|
|
kusano |
7d535a |
February 29, 1992
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Purpose
|
|
kusano |
7d535a |
=======
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
ZLATMR generates random matrices of various types for testing
|
|
kusano |
7d535a |
LAPACK programs.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
ZLATMR operates by applying the following sequence of
|
|
kusano |
7d535a |
operations:
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Generate a matrix A with random entries of distribution DIST
|
|
kusano |
7d535a |
which is symmetric if SYM='S', Hermitian if SYM='H', and
|
|
kusano |
7d535a |
nonsymmetric if SYM='N'.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Set the diagonal to D, where D may be input or
|
|
kusano |
7d535a |
computed according to MODE, COND, DMAX and RSIGN
|
|
kusano |
7d535a |
as described below.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Grade the matrix, if desired, from the left and/or right
|
|
kusano |
7d535a |
as specified by GRADE. The inputs DL, MODEL, CONDL, DR,
|
|
kusano |
7d535a |
MODER and CONDR also determine the grading as described
|
|
kusano |
7d535a |
below.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Permute, if desired, the rows and/or columns as specified by
|
|
kusano |
7d535a |
PIVTNG and IPIVOT.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Set random entries to zero, if desired, to get a random sparse
|
|
kusano |
7d535a |
matrix as specified by SPARSE.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Make A a band matrix, if desired, by zeroing out the matrix
|
|
kusano |
7d535a |
outside a band of lower bandwidth KL and upper bandwidth KU.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Scale A, if desired, to have maximum entry ANORM.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Pack the matrix if desired. Options specified by PACK are:
|
|
kusano |
7d535a |
no packing
|
|
kusano |
7d535a |
zero out upper half (if symmetric or Hermitian)
|
|
kusano |
7d535a |
zero out lower half (if symmetric or Hermitian)
|
|
kusano |
7d535a |
store the upper half columnwise (if symmetric or Hermitian
|
|
kusano |
7d535a |
or square upper triangular)
|
|
kusano |
7d535a |
store the lower half columnwise (if symmetric or Hermitian
|
|
kusano |
7d535a |
or square lower triangular)
|
|
kusano |
7d535a |
same as upper half rowwise if symmetric
|
|
kusano |
7d535a |
same as conjugate upper half rowwise if Hermitian
|
|
kusano |
7d535a |
store the lower triangle in banded format
|
|
kusano |
7d535a |
(if symmetric or Hermitian)
|
|
kusano |
7d535a |
store the upper triangle in banded format
|
|
kusano |
7d535a |
(if symmetric or Hermitian)
|
|
kusano |
7d535a |
store the entire matrix in banded format
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Note: If two calls to ZLATMR differ only in the PACK parameter,
|
|
kusano |
7d535a |
they will generate mathematically equivalent matrices.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
If two calls to ZLATMR both have full bandwidth (KL = M-1
|
|
kusano |
7d535a |
and KU = N-1), and differ only in the PIVTNG and PACK
|
|
kusano |
7d535a |
parameters, then the matrices generated will differ only
|
|
kusano |
7d535a |
in the order of the rows and/or columns, and otherwise
|
|
kusano |
7d535a |
contain the same data. This consistency cannot be and
|
|
kusano |
7d535a |
is not maintained with less than full bandwidth.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Arguments
|
|
kusano |
7d535a |
=========
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
M - INTEGER
|
|
kusano |
7d535a |
Number of rows of A. Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
N - INTEGER
|
|
kusano |
7d535a |
Number of columns of A. Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
DIST - CHARACTER*1
|
|
kusano |
7d535a |
On entry, DIST specifies the type of distribution to be used
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
to generate a random matrix .
|
|
kusano |
7d535a |
'U' => real and imaginary parts are independent
|
|
kusano |
7d535a |
UNIFORM( 0, 1 ) ( 'U' for uniform )
|
|
kusano |
7d535a |
'S' => real and imaginary parts are independent
|
|
kusano |
7d535a |
UNIFORM( -1, 1 ) ( 'S' for symmetric )
|
|
kusano |
7d535a |
'N' => real and imaginary parts are independent
|
|
kusano |
7d535a |
NORMAL( 0, 1 ) ( 'N' for normal )
|
|
kusano |
7d535a |
'D' => uniform on interior of unit disk ( 'D' for disk )
|
|
kusano |
7d535a |
Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
ISEED - INTEGER array, dimension (4)
|
|
kusano |
7d535a |
On entry ISEED specifies the seed of the random number
|
|
kusano |
7d535a |
generator. They should lie between 0 and 4095 inclusive,
|
|
kusano |
7d535a |
and ISEED(4) should be odd. The random number generator
|
|
kusano |
7d535a |
uses a linear congruential sequence limited to small
|
|
kusano |
7d535a |
integers, and so should produce machine independent
|
|
kusano |
7d535a |
random numbers. The values of ISEED are changed on
|
|
kusano |
7d535a |
exit, and can be used in the next call to ZLATMR
|
|
kusano |
7d535a |
to continue the same random number sequence.
|
|
kusano |
7d535a |
Changed on exit.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
SYM - CHARACTER*1
|
|
kusano |
7d535a |
If SYM='S', generated matrix is symmetric.
|
|
kusano |
7d535a |
If SYM='H', generated matrix is Hermitian.
|
|
kusano |
7d535a |
If SYM='N', generated matrix is nonsymmetric.
|
|
kusano |
7d535a |
Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
D - COMPLEX*16 array, dimension (min(M,N))
|
|
kusano |
7d535a |
On entry this array specifies the diagonal entries
|
|
kusano |
7d535a |
of the diagonal of A. D may either be specified
|
|
kusano |
7d535a |
on entry, or set according to MODE and COND as described
|
|
kusano |
7d535a |
below. If the matrix is Hermitian, the real part of D
|
|
kusano |
7d535a |
will be taken. May be changed on exit if MODE is nonzero.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
MODE - INTEGER
|
|
kusano |
7d535a |
On entry describes how D is to be used:
|
|
kusano |
7d535a |
MODE = 0 means use D as input
|
|
kusano |
7d535a |
MODE = 1 sets D(1)=1 and D(2:N)=1.0/COND
|
|
kusano |
7d535a |
MODE = 2 sets D(1:N-1)=1 and D(N)=1.0/COND
|
|
kusano |
7d535a |
MODE = 3 sets D(I)=COND**(-(I-1)/(N-1))
|
|
kusano |
7d535a |
MODE = 4 sets D(i)=1 - (i-1)/(N-1)*(1 - 1/COND)
|
|
kusano |
7d535a |
MODE = 5 sets D to random numbers in the range
|
|
kusano |
7d535a |
( 1/COND , 1 ) such that their logarithms
|
|
kusano |
7d535a |
are uniformly distributed.
|
|
kusano |
7d535a |
MODE = 6 set D to random numbers from same distribution
|
|
kusano |
7d535a |
as the rest of the matrix.
|
|
kusano |
7d535a |
MODE < 0 has the same meaning as ABS(MODE), except that
|
|
kusano |
7d535a |
the order of the elements of D is reversed.
|
|
kusano |
7d535a |
Thus if MODE is positive, D has entries ranging from
|
|
kusano |
7d535a |
1 to 1/COND, if negative, from 1/COND to 1,
|
|
kusano |
7d535a |
Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
COND - DOUBLE PRECISION
|
|
kusano |
7d535a |
On entry, used as described under MODE above.
|
|
kusano |
7d535a |
If used, it must be >= 1. Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
DMAX - COMPLEX*16
|
|
kusano |
7d535a |
If MODE neither -6, 0 nor 6, the diagonal is scaled by
|
|
kusano |
7d535a |
DMAX / max(abs(D(i))), so that maximum absolute entry
|
|
kusano |
7d535a |
of diagonal is abs(DMAX). If DMAX is complex (or zero),
|
|
kusano |
7d535a |
diagonal will be scaled by a complex number (or zero).
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
RSIGN - CHARACTER*1
|
|
kusano |
7d535a |
If MODE neither -6, 0 nor 6, specifies sign of diagonal
|
|
kusano |
7d535a |
as follows:
|
|
kusano |
7d535a |
'T' => diagonal entries are multiplied by a random complex
|
|
kusano |
7d535a |
number uniformly distributed with absolute value 1
|
|
kusano |
7d535a |
'F' => diagonal unchanged
|
|
kusano |
7d535a |
Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
GRADE - CHARACTER*1
|
|
kusano |
7d535a |
Specifies grading of matrix as follows:
|
|
kusano |
7d535a |
'N' => no grading
|
|
kusano |
7d535a |
'L' => matrix premultiplied by diag( DL )
|
|
kusano |
7d535a |
(only if matrix nonsymmetric)
|
|
kusano |
7d535a |
'R' => matrix postmultiplied by diag( DR )
|
|
kusano |
7d535a |
(only if matrix nonsymmetric)
|
|
kusano |
7d535a |
'B' => matrix premultiplied by diag( DL ) and
|
|
kusano |
7d535a |
postmultiplied by diag( DR )
|
|
kusano |
7d535a |
(only if matrix nonsymmetric)
|
|
kusano |
7d535a |
'H' => matrix premultiplied by diag( DL ) and
|
|
kusano |
7d535a |
postmultiplied by diag( CONJG(DL) )
|
|
kusano |
7d535a |
(only if matrix Hermitian or nonsymmetric)
|
|
kusano |
7d535a |
'S' => matrix premultiplied by diag( DL ) and
|
|
kusano |
7d535a |
postmultiplied by diag( DL )
|
|
kusano |
7d535a |
(only if matrix symmetric or nonsymmetric)
|
|
kusano |
7d535a |
'E' => matrix premultiplied by diag( DL ) and
|
|
kusano |
7d535a |
postmultiplied by inv( diag( DL ) )
|
|
kusano |
7d535a |
( 'S' for similarity )
|
|
kusano |
7d535a |
(only if matrix nonsymmetric)
|
|
kusano |
7d535a |
Note: if GRADE='S', then M must equal N.
|
|
kusano |
7d535a |
Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
DL - COMPLEX*16 array, dimension (M)
|
|
kusano |
7d535a |
If MODEL=0, then on entry this array specifies the diagonal
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
entries of a diagonal matrix used as described under GRADE
|
|
kusano |
7d535a |
above. If MODEL is not zero, then DL will be set according
|
|
kusano |
7d535a |
to MODEL and CONDL, analogous to the way D is set according
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
to MODE and COND (except there is no DMAX parameter for DL).
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
If GRADE='E', then DL cannot have zero entries.
|
|
kusano |
7d535a |
Not referenced if GRADE = 'N' or 'R'. Changed on exit.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
MODEL - INTEGER
|
|
kusano |
7d535a |
This specifies how the diagonal array DL is to be computed,
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
just as MODE specifies how D is to be computed.
|
|
kusano |
7d535a |
Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
CONDL - DOUBLE PRECISION
|
|
kusano |
7d535a |
When MODEL is not zero, this specifies the condition number
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
of the computed DL. Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
DR - COMPLEX*16 array, dimension (N)
|
|
kusano |
7d535a |
If MODER=0, then on entry this array specifies the diagonal
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
entries of a diagonal matrix used as described under GRADE
|
|
kusano |
7d535a |
above. If MODER is not zero, then DR will be set according
|
|
kusano |
7d535a |
to MODER and CONDR, analogous to the way D is set according
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
to MODE and COND (except there is no DMAX parameter for DR).
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Not referenced if GRADE = 'N', 'L', 'H' or 'S'.
|
|
kusano |
7d535a |
Changed on exit.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
MODER - INTEGER
|
|
kusano |
7d535a |
This specifies how the diagonal array DR is to be computed,
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
just as MODE specifies how D is to be computed.
|
|
kusano |
7d535a |
Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
CONDR - DOUBLE PRECISION
|
|
kusano |
7d535a |
When MODER is not zero, this specifies the condition number
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
of the computed DR. Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
PIVTNG - CHARACTER*1
|
|
kusano |
7d535a |
On entry specifies pivoting permutations as follows:
|
|
kusano |
7d535a |
'N' or ' ' => none.
|
|
kusano |
7d535a |
'L' => left or row pivoting (matrix must be nonsymmetric).
|
|
kusano |
7d535a |
'R' => right or column pivoting (matrix must be
|
|
kusano |
7d535a |
nonsymmetric).
|
|
kusano |
7d535a |
'B' or 'F' => both or full pivoting, i.e., on both sides.
|
|
kusano |
7d535a |
In this case, M must equal N
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
If two calls to ZLATMR both have full bandwidth (KL = M-1
|
|
kusano |
7d535a |
and KU = N-1), and differ only in the PIVTNG and PACK
|
|
kusano |
7d535a |
parameters, then the matrices generated will differ only
|
|
kusano |
7d535a |
in the order of the rows and/or columns, and otherwise
|
|
kusano |
7d535a |
contain the same data. This consistency cannot be
|
|
kusano |
7d535a |
maintained with less than full bandwidth.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
IPIVOT - INTEGER array, dimension (N or M)
|
|
kusano |
7d535a |
This array specifies the permutation used. After the
|
|
kusano |
7d535a |
basic matrix is generated, the rows, columns, or both
|
|
kusano |
7d535a |
are permuted. If, say, row pivoting is selected, ZLATMR
|
|
kusano |
7d535a |
starts with the *last* row and interchanges the M-th and
|
|
kusano |
7d535a |
IPIVOT(M)-th rows, then moves to the next-to-last row,
|
|
kusano |
7d535a |
interchanging the (M-1)-th and the IPIVOT(M-1)-th rows,
|
|
kusano |
7d535a |
and so on. In terms of "2-cycles", the permutation is
|
|
kusano |
7d535a |
(1 IPIVOT(1)) (2 IPIVOT(2)) ... (M IPIVOT(M))
|
|
kusano |
7d535a |
where the rightmost cycle is applied first. This is the
|
|
kusano |
7d535a |
*inverse* of the effect of pivoting in LINPACK. The idea
|
|
kusano |
7d535a |
is that factoring (with pivoting) an identity matrix
|
|
kusano |
7d535a |
which has been inverse-pivoted in this way should
|
|
kusano |
7d535a |
result in a pivot vector identical to IPIVOT.
|
|
kusano |
7d535a |
Not referenced if PIVTNG = 'N'. Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
SPARSE - DOUBLE PRECISION
|
|
kusano |
7d535a |
On entry specifies the sparsity of the matrix if a sparse
|
|
kusano |
7d535a |
matrix is to be generated. SPARSE should lie between
|
|
kusano |
7d535a |
0 and 1. To generate a sparse matrix, for each matrix entry
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
a uniform ( 0, 1 ) random number x is generated and
|
|
kusano |
7d535a |
compared to SPARSE; if x is larger the matrix entry
|
|
kusano |
7d535a |
is unchanged and if x is smaller the entry is set
|
|
kusano |
7d535a |
to zero. Thus on the average a fraction SPARSE of the
|
|
kusano |
7d535a |
entries will be set to zero.
|
|
kusano |
7d535a |
Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
KL - INTEGER
|
|
kusano |
7d535a |
On entry specifies the lower bandwidth of the matrix. For
|
|
kusano |
7d535a |
example, KL=0 implies upper triangular, KL=1 implies upper
|
|
kusano |
7d535a |
Hessenberg, and KL at least M-1 implies the matrix is not
|
|
kusano |
7d535a |
banded. Must equal KU if matrix is symmetric or Hermitian.
|
|
kusano |
7d535a |
Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
KU - INTEGER
|
|
kusano |
7d535a |
On entry specifies the upper bandwidth of the matrix. For
|
|
kusano |
7d535a |
example, KU=0 implies lower triangular, KU=1 implies lower
|
|
kusano |
7d535a |
Hessenberg, and KU at least N-1 implies the matrix is not
|
|
kusano |
7d535a |
banded. Must equal KL if matrix is symmetric or Hermitian.
|
|
kusano |
7d535a |
Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
ANORM - DOUBLE PRECISION
|
|
kusano |
7d535a |
On entry specifies maximum entry of output matrix
|
|
kusano |
7d535a |
(output matrix will by multiplied by a constant so that
|
|
kusano |
7d535a |
its largest absolute entry equal ANORM)
|
|
kusano |
7d535a |
if ANORM is nonnegative. If ANORM is negative no scaling
|
|
kusano |
7d535a |
is done. Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
PACK - CHARACTER*1
|
|
kusano |
7d535a |
On entry specifies packing of matrix as follows:
|
|
kusano |
7d535a |
'N' => no packing
|
|
kusano |
7d535a |
'U' => zero out all subdiagonal entries
|
|
kusano |
7d535a |
(if symmetric or Hermitian)
|
|
kusano |
7d535a |
'L' => zero out all superdiagonal entries
|
|
kusano |
7d535a |
(if symmetric or Hermitian)
|
|
kusano |
7d535a |
'C' => store the upper triangle columnwise
|
|
kusano |
7d535a |
(only if matrix symmetric or Hermitian or
|
|
kusano |
7d535a |
square upper triangular)
|
|
kusano |
7d535a |
'R' => store the lower triangle columnwise
|
|
kusano |
7d535a |
(only if matrix symmetric or Hermitian or
|
|
kusano |
7d535a |
square lower triangular)
|
|
kusano |
7d535a |
(same as upper half rowwise if symmetric)
|
|
kusano |
7d535a |
(same as conjugate upper half rowwise if Hermitian)
|
|
kusano |
7d535a |
'B' => store the lower triangle in band storage scheme
|
|
kusano |
7d535a |
(only if matrix symmetric or Hermitian)
|
|
kusano |
7d535a |
'Q' => store the upper triangle in band storage scheme
|
|
kusano |
7d535a |
(only if matrix symmetric or Hermitian)
|
|
kusano |
7d535a |
'Z' => store the entire matrix in band storage scheme
|
|
kusano |
7d535a |
(pivoting can be provided for by using this
|
|
kusano |
7d535a |
option to store A in the trailing rows of
|
|
kusano |
7d535a |
the allocated storage)
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Using these options, the various LAPACK packed and banded
|
|
kusano |
7d535a |
storage schemes can be obtained:
|
|
kusano |
7d535a |
GB - use 'Z'
|
|
kusano |
7d535a |
PB, HB or TB - use 'B' or 'Q'
|
|
kusano |
7d535a |
PP, HP or TP - use 'C' or 'R'
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
If two calls to ZLATMR differ only in the PACK parameter,
|
|
kusano |
7d535a |
they will generate mathematically equivalent matrices.
|
|
kusano |
7d535a |
Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
A - COMPLEX*16 array, dimension (LDA,N)
|
|
kusano |
7d535a |
On exit A is the desired test matrix. Only those
|
|
kusano |
7d535a |
entries of A which are significant on output
|
|
kusano |
7d535a |
will be referenced (even if A is in packed or band
|
|
kusano |
7d535a |
storage format). The 'unoccupied corners' of A in
|
|
kusano |
7d535a |
band format will be zeroed out.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
LDA - INTEGER
|
|
kusano |
7d535a |
on entry LDA specifies the first dimension of A as
|
|
kusano |
7d535a |
declared in the calling program.
|
|
kusano |
7d535a |
If PACK='N', 'U' or 'L', LDA must be at least max ( 1, M ).
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
If PACK='C' or 'R', LDA must be at least 1.
|
|
kusano |
7d535a |
If PACK='B', or 'Q', LDA must be MIN ( KU+1, N )
|
|
kusano |
7d535a |
If PACK='Z', LDA must be at least KUU+KLL+1, where
|
|
kusano |
7d535a |
KUU = MIN ( KU, N-1 ) and KLL = MIN ( KL, N-1 )
|
|
kusano |
7d535a |
Not modified.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
IWORK - INTEGER array, dimension (N or M)
|
|
kusano |
7d535a |
Workspace. Not referenced if PIVTNG = 'N'. Changed on exit.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
INFO - INTEGER
|
|
kusano |
7d535a |
Error parameter on exit:
|
|
kusano |
7d535a |
0 => normal return
|
|
kusano |
7d535a |
-1 => M negative or unequal to N and SYM='S' or 'H'
|
|
kusano |
7d535a |
-2 => N negative
|
|
kusano |
7d535a |
-3 => DIST illegal string
|
|
kusano |
7d535a |
-5 => SYM illegal string
|
|
kusano |
7d535a |
-7 => MODE not in range -6 to 6
|
|
kusano |
7d535a |
-8 => COND less than 1.0, and MODE neither -6, 0 nor 6
|
|
kusano |
7d535a |
-10 => MODE neither -6, 0 nor 6 and RSIGN illegal string
|
|
kusano |
7d535a |
-11 => GRADE illegal string, or GRADE='E' and
|
|
kusano |
7d535a |
M not equal to N, or GRADE='L', 'R', 'B', 'S' or 'E'
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
and SYM = 'H', or GRADE='L', 'R', 'B', 'H' or 'E'
|
|
kusano |
7d535a |
and SYM = 'S'
|
|
kusano |
7d535a |
-12 => GRADE = 'E' and DL contains zero
|
|
kusano |
7d535a |
-13 => MODEL not in range -6 to 6 and GRADE= 'L', 'B', 'H',
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
'S' or 'E'
|
|
kusano |
7d535a |
-14 => CONDL less than 1.0, GRADE='L', 'B', 'H', 'S' or 'E',
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
and MODEL neither -6, 0 nor 6
|
|
kusano |
7d535a |
-16 => MODER not in range -6 to 6 and GRADE= 'R' or 'B'
|
|
kusano |
7d535a |
-17 => CONDR less than 1.0, GRADE='R' or 'B', and
|
|
kusano |
7d535a |
MODER neither -6, 0 nor 6
|
|
kusano |
7d535a |
-18 => PIVTNG illegal string, or PIVTNG='B' or 'F' and
|
|
kusano |
7d535a |
M not equal to N, or PIVTNG='L' or 'R' and SYM='S'
|
|
kusano |
7d535a |
or 'H'
|
|
kusano |
7d535a |
-19 => IPIVOT contains out of range number and
|
|
kusano |
7d535a |
PIVTNG not equal to 'N'
|
|
kusano |
7d535a |
-20 => KL negative
|
|
kusano |
7d535a |
-21 => KU negative, or SYM='S' or 'H' and KU not equal to KL
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
-22 => SPARSE not in range 0. to 1.
|
|
kusano |
7d535a |
-24 => PACK illegal string, or PACK='U', 'L', 'B' or 'Q'
|
|
kusano |
7d535a |
and SYM='N', or PACK='C' and SYM='N' and either KL
|
|
kusano |
7d535a |
not equal to 0 or N not equal to M, or PACK='R' and
|
|
kusano |
7d535a |
SYM='N', and either KU not equal to 0 or N not equal
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
to M
|
|
kusano |
7d535a |
-26 => LDA too small
|
|
kusano |
7d535a |
1 => Error return from ZLATM1 (computing D)
|
|
kusano |
7d535a |
2 => Cannot scale diagonal to DMAX (max. entry is 0)
|
|
kusano |
7d535a |
3 => Error return from ZLATM1 (computing DL)
|
|
kusano |
7d535a |
4 => Error return from ZLATM1 (computing DR)
|
|
kusano |
7d535a |
5 => ANORM is positive, but matrix constructed prior to
|
|
kusano |
7d535a |
attempting to scale it to have norm ANORM, is zero
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
=====================================================================
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
1) Decode and Test the input parameters.
|
|
kusano |
7d535a |
Initialize flags & seed.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Parameter adjustments */
|
|
kusano |
7d535a |
--iseed;
|
|
kusano |
7d535a |
--d;
|
|
kusano |
7d535a |
--dl;
|
|
kusano |
7d535a |
--dr;
|
|
kusano |
7d535a |
--ipivot;
|
|
kusano |
7d535a |
a_dim1 = *lda;
|
|
kusano |
7d535a |
a_offset = a_dim1 + 1;
|
|
kusano |
7d535a |
a -= a_offset;
|
|
kusano |
7d535a |
--iwork;
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Function Body */
|
|
kusano |
7d535a |
*info = 0;
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Quick return if possible */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (*m == 0 || *n == 0) {
|
|
kusano |
7d535a |
return 0;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Decode DIST */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (lsame_(dist, "U")) {
|
|
kusano |
7d535a |
idist = 1;
|
|
kusano |
7d535a |
} else if (lsame_(dist, "S")) {
|
|
kusano |
7d535a |
idist = 2;
|
|
kusano |
7d535a |
} else if (lsame_(dist, "N")) {
|
|
kusano |
7d535a |
idist = 3;
|
|
kusano |
7d535a |
} else if (lsame_(dist, "D")) {
|
|
kusano |
7d535a |
idist = 4;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
idist = -1;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Decode SYM */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (lsame_(sym, "H")) {
|
|
kusano |
7d535a |
isym = 0;
|
|
kusano |
7d535a |
} else if (lsame_(sym, "N")) {
|
|
kusano |
7d535a |
isym = 1;
|
|
kusano |
7d535a |
} else if (lsame_(sym, "S")) {
|
|
kusano |
7d535a |
isym = 2;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
isym = -1;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Decode RSIGN */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (lsame_(rsign, "F")) {
|
|
kusano |
7d535a |
irsign = 0;
|
|
kusano |
7d535a |
} else if (lsame_(rsign, "T")) {
|
|
kusano |
7d535a |
irsign = 1;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
irsign = -1;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Decode PIVTNG */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (lsame_(pivtng, "N")) {
|
|
kusano |
7d535a |
ipvtng = 0;
|
|
kusano |
7d535a |
} else if (lsame_(pivtng, " ")) {
|
|
kusano |
7d535a |
ipvtng = 0;
|
|
kusano |
7d535a |
} else if (lsame_(pivtng, "L")) {
|
|
kusano |
7d535a |
ipvtng = 1;
|
|
kusano |
7d535a |
npvts = *m;
|
|
kusano |
7d535a |
} else if (lsame_(pivtng, "R")) {
|
|
kusano |
7d535a |
ipvtng = 2;
|
|
kusano |
7d535a |
npvts = *n;
|
|
kusano |
7d535a |
} else if (lsame_(pivtng, "B")) {
|
|
kusano |
7d535a |
ipvtng = 3;
|
|
kusano |
7d535a |
npvts = min(*n,*m);
|
|
kusano |
7d535a |
} else if (lsame_(pivtng, "F")) {
|
|
kusano |
7d535a |
ipvtng = 3;
|
|
kusano |
7d535a |
npvts = min(*n,*m);
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
ipvtng = -1;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Decode GRADE */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (lsame_(grade, "N")) {
|
|
kusano |
7d535a |
igrade = 0;
|
|
kusano |
7d535a |
} else if (lsame_(grade, "L")) {
|
|
kusano |
7d535a |
igrade = 1;
|
|
kusano |
7d535a |
} else if (lsame_(grade, "R")) {
|
|
kusano |
7d535a |
igrade = 2;
|
|
kusano |
7d535a |
} else if (lsame_(grade, "B")) {
|
|
kusano |
7d535a |
igrade = 3;
|
|
kusano |
7d535a |
} else if (lsame_(grade, "E")) {
|
|
kusano |
7d535a |
igrade = 4;
|
|
kusano |
7d535a |
} else if (lsame_(grade, "H")) {
|
|
kusano |
7d535a |
igrade = 5;
|
|
kusano |
7d535a |
} else if (lsame_(grade, "S")) {
|
|
kusano |
7d535a |
igrade = 6;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
igrade = -1;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Decode PACK */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (lsame_(pack, "N")) {
|
|
kusano |
7d535a |
ipack = 0;
|
|
kusano |
7d535a |
} else if (lsame_(pack, "U")) {
|
|
kusano |
7d535a |
ipack = 1;
|
|
kusano |
7d535a |
} else if (lsame_(pack, "L")) {
|
|
kusano |
7d535a |
ipack = 2;
|
|
kusano |
7d535a |
} else if (lsame_(pack, "C")) {
|
|
kusano |
7d535a |
ipack = 3;
|
|
kusano |
7d535a |
} else if (lsame_(pack, "R")) {
|
|
kusano |
7d535a |
ipack = 4;
|
|
kusano |
7d535a |
} else if (lsame_(pack, "B")) {
|
|
kusano |
7d535a |
ipack = 5;
|
|
kusano |
7d535a |
} else if (lsame_(pack, "Q")) {
|
|
kusano |
7d535a |
ipack = 6;
|
|
kusano |
7d535a |
} else if (lsame_(pack, "Z")) {
|
|
kusano |
7d535a |
ipack = 7;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
ipack = -1;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Set certain internal parameters */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
mnmin = min(*m,*n);
|
|
kusano |
7d535a |
/* Computing MIN */
|
|
kusano |
7d535a |
i__1 = *kl, i__2 = *m - 1;
|
|
kusano |
7d535a |
kll = min(i__1,i__2);
|
|
kusano |
7d535a |
/* Computing MIN */
|
|
kusano |
7d535a |
i__1 = *ku, i__2 = *n - 1;
|
|
kusano |
7d535a |
kuu = min(i__1,i__2);
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* If inv(DL) is used, check to see if DL has a zero entry. */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
dzero = FALSE_;
|
|
kusano |
7d535a |
if (igrade == 4 && *model == 0) {
|
|
kusano |
7d535a |
i__1 = *m;
|
|
kusano |
7d535a |
for (i = 1; i <= i__1; ++i) {
|
|
kusano |
7d535a |
i__2 = i;
|
|
kusano |
7d535a |
if (dl[i__2].r == 0. && dl[i__2].i == 0.) {
|
|
kusano |
7d535a |
dzero = TRUE_;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L10: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Check values in IPIVOT */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
badpvt = FALSE_;
|
|
kusano |
7d535a |
if (ipvtng > 0) {
|
|
kusano |
7d535a |
i__1 = npvts;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
if (ipivot[j] <= 0 || ipivot[j] > npvts) {
|
|
kusano |
7d535a |
badpvt = TRUE_;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L20: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Set INFO if an error */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (*m < 0) {
|
|
kusano |
7d535a |
*info = -1;
|
|
kusano |
7d535a |
} else if (*m != *n && (isym == 0 || isym == 2)) {
|
|
kusano |
7d535a |
*info = -1;
|
|
kusano |
7d535a |
} else if (*n < 0) {
|
|
kusano |
7d535a |
*info = -2;
|
|
kusano |
7d535a |
} else if (idist == -1) {
|
|
kusano |
7d535a |
*info = -3;
|
|
kusano |
7d535a |
} else if (isym == -1) {
|
|
kusano |
7d535a |
*info = -5;
|
|
kusano |
7d535a |
} else if (*mode < -6 || *mode > 6) {
|
|
kusano |
7d535a |
*info = -7;
|
|
kusano |
7d535a |
} else if (*mode != -6 && *mode != 0 && *mode != 6 && *cond < 1.) {
|
|
kusano |
7d535a |
*info = -8;
|
|
kusano |
7d535a |
} else if (*mode != -6 && *mode != 0 && *mode != 6 && irsign == -1) {
|
|
kusano |
7d535a |
*info = -10;
|
|
kusano |
7d535a |
} else if (igrade == -1 || igrade == 4 && *m != *n || (igrade == 1 ||
|
|
kusano |
7d535a |
igrade == 2 || igrade == 3 || igrade == 4 || igrade == 6) && isym
|
|
kusano |
7d535a |
== 0 || (igrade == 1 || igrade == 2 || igrade == 3 || igrade == 4
|
|
kusano |
7d535a |
|| igrade == 5) && isym == 2) {
|
|
kusano |
7d535a |
*info = -11;
|
|
kusano |
7d535a |
} else if (igrade == 4 && dzero) {
|
|
kusano |
7d535a |
*info = -12;
|
|
kusano |
7d535a |
} else if ((igrade == 1 || igrade == 3 || igrade == 4 || igrade == 5 ||
|
|
kusano |
7d535a |
igrade == 6) && (*model < -6 || *model > 6)) {
|
|
kusano |
7d535a |
*info = -13;
|
|
kusano |
7d535a |
} else if ((igrade == 1 || igrade == 3 || igrade == 4 || igrade == 5 ||
|
|
kusano |
7d535a |
igrade == 6) && (*model != -6 && *model != 0 && *model != 6) && *
|
|
kusano |
7d535a |
condl < 1.) {
|
|
kusano |
7d535a |
*info = -14;
|
|
kusano |
7d535a |
} else if ((igrade == 2 || igrade == 3) && (*moder < -6 || *moder > 6)) {
|
|
kusano |
7d535a |
*info = -16;
|
|
kusano |
7d535a |
} else if ((igrade == 2 || igrade == 3) && (*moder != -6 && *moder != 0 &&
|
|
kusano |
7d535a |
*moder != 6) && *condr < 1.) {
|
|
kusano |
7d535a |
*info = -17;
|
|
kusano |
7d535a |
} else if (ipvtng == -1 || ipvtng == 3 && *m != *n || (ipvtng == 1 ||
|
|
kusano |
7d535a |
ipvtng == 2) && (isym == 0 || isym == 2)) {
|
|
kusano |
7d535a |
*info = -18;
|
|
kusano |
7d535a |
} else if (ipvtng != 0 && badpvt) {
|
|
kusano |
7d535a |
*info = -19;
|
|
kusano |
7d535a |
} else if (*kl < 0) {
|
|
kusano |
7d535a |
*info = -20;
|
|
kusano |
7d535a |
} else if (*ku < 0 || (isym == 0 || isym == 2) && *kl != *ku) {
|
|
kusano |
7d535a |
*info = -21;
|
|
kusano |
7d535a |
} else if (*sparse < 0. || *sparse > 1.) {
|
|
kusano |
7d535a |
*info = -22;
|
|
kusano |
7d535a |
} else if (ipack == -1 || (ipack == 1 || ipack == 2 || ipack == 5 ||
|
|
kusano |
7d535a |
ipack == 6) && isym == 1 || ipack == 3 && isym == 1 && (*kl != 0
|
|
kusano |
7d535a |
|| *m != *n) || ipack == 4 && isym == 1 && (*ku != 0 || *m != *n))
|
|
kusano |
7d535a |
{
|
|
kusano |
7d535a |
*info = -24;
|
|
kusano |
7d535a |
} else if ((ipack == 0 || ipack == 1 || ipack == 2) && *lda < max(1,*m) ||
|
|
kusano |
7d535a |
(ipack == 3 || ipack == 4) && *lda < 1 || (ipack == 5 || ipack ==
|
|
kusano |
7d535a |
6) && *lda < kuu + 1 || ipack == 7 && *lda < kll + kuu + 1) {
|
|
kusano |
7d535a |
*info = -26;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (*info != 0) {
|
|
kusano |
7d535a |
i__1 = -(*info);
|
|
kusano |
7d535a |
xerbla_("ZLATMR", &i__1);
|
|
kusano |
7d535a |
return 0;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Decide if we can pivot consistently */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
fulbnd = FALSE_;
|
|
kusano |
7d535a |
if (kuu == *n - 1 && kll == *m - 1) {
|
|
kusano |
7d535a |
fulbnd = TRUE_;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Initialize random number generator */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
for (i = 1; i <= 4; ++i) {
|
|
kusano |
7d535a |
iseed[i] = (i__1 = iseed[i], abs(i__1)) % 4096;
|
|
kusano |
7d535a |
/* L30: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
iseed[4] = (iseed[4] / 2 << 1) + 1;
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* 2) Set up D, DL, and DR, if indicated.
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
Compute D according to COND and MODE */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
zlatm1_(mode, cond, &irsign, &idist, &iseed[1], &d[1], &mnmin, info);
|
|
kusano |
7d535a |
if (*info != 0) {
|
|
kusano |
7d535a |
*info = 1;
|
|
kusano |
7d535a |
return 0;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
if (*mode != 0 && *mode != -6 && *mode != 6) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Scale by DMAX */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
temp = z_abs(&d[1]);
|
|
kusano |
7d535a |
i__1 = mnmin;
|
|
kusano |
7d535a |
for (i = 2; i <= i__1; ++i) {
|
|
kusano |
7d535a |
/* Computing MAX */
|
|
kusano |
7d535a |
d__1 = temp, d__2 = z_abs(&d[i]);
|
|
kusano |
7d535a |
temp = max(d__1,d__2);
|
|
kusano |
7d535a |
/* L40: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
if (temp == 0. && (dmax__->r != 0. || dmax__->i != 0.)) {
|
|
kusano |
7d535a |
*info = 2;
|
|
kusano |
7d535a |
return 0;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
if (temp != 0.) {
|
|
kusano |
7d535a |
z__1.r = dmax__->r / temp, z__1.i = dmax__->i / temp;
|
|
kusano |
7d535a |
calpha.r = z__1.r, calpha.i = z__1.i;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
calpha.r = 1., calpha.i = 0.;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
i__1 = mnmin;
|
|
kusano |
7d535a |
for (i = 1; i <= i__1; ++i) {
|
|
kusano |
7d535a |
i__2 = i;
|
|
kusano |
7d535a |
i__3 = i;
|
|
kusano |
7d535a |
z__1.r = calpha.r * d[i__3].r - calpha.i * d[i__3].i, z__1.i =
|
|
kusano |
7d535a |
calpha.r * d[i__3].i + calpha.i * d[i__3].r;
|
|
kusano |
7d535a |
d[i__2].r = z__1.r, d[i__2].i = z__1.i;
|
|
kusano |
7d535a |
/* L50: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* If matrix Hermitian, make D real */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (isym == 0) {
|
|
kusano |
7d535a |
i__1 = mnmin;
|
|
kusano |
7d535a |
for (i = 1; i <= i__1; ++i) {
|
|
kusano |
7d535a |
i__2 = i;
|
|
kusano |
7d535a |
i__3 = i;
|
|
kusano |
7d535a |
d__1 = d[i__3].r;
|
|
kusano |
7d535a |
d[i__2].r = d__1, d[i__2].i = 0.;
|
|
kusano |
7d535a |
/* L60: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Compute DL if grading set */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (igrade == 1 || igrade == 3 || igrade == 4 || igrade == 5 || igrade ==
|
|
kusano |
7d535a |
6) {
|
|
kusano |
7d535a |
zlatm1_(model, condl, &c__0, &idist, &iseed[1], &dl[1], m, info);
|
|
kusano |
7d535a |
if (*info != 0) {
|
|
kusano |
7d535a |
*info = 3;
|
|
kusano |
7d535a |
return 0;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Compute DR if grading set */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (igrade == 2 || igrade == 3) {
|
|
kusano |
7d535a |
zlatm1_(moder, condr, &c__0, &idist, &iseed[1], &dr[1], n, info);
|
|
kusano |
7d535a |
if (*info != 0) {
|
|
kusano |
7d535a |
*info = 4;
|
|
kusano |
7d535a |
return 0;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* 3) Generate IWORK if pivoting */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (ipvtng > 0) {
|
|
kusano |
7d535a |
i__1 = npvts;
|
|
kusano |
7d535a |
for (i = 1; i <= i__1; ++i) {
|
|
kusano |
7d535a |
iwork[i] = i;
|
|
kusano |
7d535a |
/* L70: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
if (fulbnd) {
|
|
kusano |
7d535a |
i__1 = npvts;
|
|
kusano |
7d535a |
for (i = 1; i <= i__1; ++i) {
|
|
kusano |
7d535a |
k = ipivot[i];
|
|
kusano |
7d535a |
j = iwork[i];
|
|
kusano |
7d535a |
iwork[i] = iwork[k];
|
|
kusano |
7d535a |
iwork[k] = j;
|
|
kusano |
7d535a |
/* L80: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
for (i = npvts; i >= 1; --i) {
|
|
kusano |
7d535a |
k = ipivot[i];
|
|
kusano |
7d535a |
j = iwork[i];
|
|
kusano |
7d535a |
iwork[i] = iwork[k];
|
|
kusano |
7d535a |
iwork[k] = j;
|
|
kusano |
7d535a |
/* L90: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* 4) Generate matrices for each kind of PACKing
|
|
kusano |
7d535a |
Always sweep matrix columnwise (if symmetric, upper
|
|
kusano |
7d535a |
half only) so that matrix generated does not depend
|
|
kusano |
7d535a |
on PACK */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (fulbnd) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Use ZLATM3 so matrices generated with differing PIVOTing onl
|
|
kusano |
7d535a |
y
|
|
kusano |
7d535a |
differ only in the order of their rows and/or columns. */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (ipack == 0) {
|
|
kusano |
7d535a |
if (isym == 0) {
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
zlatm3_(&z__1, m, n, &i, &j, &isub, &jsub, kl, ku, &
|
|
kusano |
7d535a |
idist, &iseed[1], &d[1], &igrade, &dl[1], &dr[
|
|
kusano |
7d535a |
1], &ipvtng, &iwork[1], sparse);
|
|
kusano |
7d535a |
ctemp.r = z__1.r, ctemp.i = z__1.i;
|
|
kusano |
7d535a |
i__3 = isub + jsub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = ctemp.r, a[i__3].i = ctemp.i;
|
|
kusano |
7d535a |
i__3 = jsub + isub * a_dim1;
|
|
kusano |
7d535a |
d_cnjg(&z__1, &ctemp);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
/* L100: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L110: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
} else if (isym == 1) {
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = *m;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
zlatm3_(&z__1, m, n, &i, &j, &isub, &jsub, kl, ku, &
|
|
kusano |
7d535a |
idist, &iseed[1], &d[1], &igrade, &dl[1], &dr[
|
|
kusano |
7d535a |
1], &ipvtng, &iwork[1], sparse);
|
|
kusano |
7d535a |
ctemp.r = z__1.r, ctemp.i = z__1.i;
|
|
kusano |
7d535a |
i__3 = isub + jsub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = ctemp.r, a[i__3].i = ctemp.i;
|
|
kusano |
7d535a |
/* L120: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L130: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
} else if (isym == 2) {
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
zlatm3_(&z__1, m, n, &i, &j, &isub, &jsub, kl, ku, &
|
|
kusano |
7d535a |
idist, &iseed[1], &d[1], &igrade, &dl[1], &dr[
|
|
kusano |
7d535a |
1], &ipvtng, &iwork[1], sparse);
|
|
kusano |
7d535a |
ctemp.r = z__1.r, ctemp.i = z__1.i;
|
|
kusano |
7d535a |
i__3 = isub + jsub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = ctemp.r, a[i__3].i = ctemp.i;
|
|
kusano |
7d535a |
i__3 = jsub + isub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = ctemp.r, a[i__3].i = ctemp.i;
|
|
kusano |
7d535a |
/* L140: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L150: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 1) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
zlatm3_(&z__1, m, n, &i, &j, &isub, &jsub, kl, ku, &idist,
|
|
kusano |
7d535a |
&iseed[1], &d[1], &igrade, &dl[1], &dr[1], &
|
|
kusano |
7d535a |
ipvtng, &iwork[1], sparse);
|
|
kusano |
7d535a |
ctemp.r = z__1.r, ctemp.i = z__1.i;
|
|
kusano |
7d535a |
mnsub = min(isub,jsub);
|
|
kusano |
7d535a |
mxsub = max(isub,jsub);
|
|
kusano |
7d535a |
if (mxsub == isub && isym == 0) {
|
|
kusano |
7d535a |
i__3 = mnsub + mxsub * a_dim1;
|
|
kusano |
7d535a |
d_cnjg(&z__1, &ctemp);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
i__3 = mnsub + mxsub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = ctemp.r, a[i__3].i = ctemp.i;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
if (mnsub != mxsub) {
|
|
kusano |
7d535a |
i__3 = mxsub + mnsub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = 0., a[i__3].i = 0.;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L160: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L170: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 2) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
zlatm3_(&z__1, m, n, &i, &j, &isub, &jsub, kl, ku, &idist,
|
|
kusano |
7d535a |
&iseed[1], &d[1], &igrade, &dl[1], &dr[1], &
|
|
kusano |
7d535a |
ipvtng, &iwork[1], sparse);
|
|
kusano |
7d535a |
ctemp.r = z__1.r, ctemp.i = z__1.i;
|
|
kusano |
7d535a |
mnsub = min(isub,jsub);
|
|
kusano |
7d535a |
mxsub = max(isub,jsub);
|
|
kusano |
7d535a |
if (mxsub == jsub && isym == 0) {
|
|
kusano |
7d535a |
i__3 = mxsub + mnsub * a_dim1;
|
|
kusano |
7d535a |
d_cnjg(&z__1, &ctemp);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
i__3 = mxsub + mnsub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = ctemp.r, a[i__3].i = ctemp.i;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
if (mnsub != mxsub) {
|
|
kusano |
7d535a |
i__3 = mnsub + mxsub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = 0., a[i__3].i = 0.;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L180: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L190: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 3) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
zlatm3_(&z__1, m, n, &i, &j, &isub, &jsub, kl, ku, &idist,
|
|
kusano |
7d535a |
&iseed[1], &d[1], &igrade, &dl[1], &dr[1], &
|
|
kusano |
7d535a |
ipvtng, &iwork[1], sparse);
|
|
kusano |
7d535a |
ctemp.r = z__1.r, ctemp.i = z__1.i;
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Compute K = location of (ISUB,JSUB) ent
|
|
kusano |
7d535a |
ry in packed
|
|
kusano |
7d535a |
array */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
mnsub = min(isub,jsub);
|
|
kusano |
7d535a |
mxsub = max(isub,jsub);
|
|
kusano |
7d535a |
k = mxsub * (mxsub - 1) / 2 + mnsub;
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Convert K to (IISUB,JJSUB) location */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
jjsub = (k - 1) / *lda + 1;
|
|
kusano |
7d535a |
iisub = k - *lda * (jjsub - 1);
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (mxsub == isub && isym == 0) {
|
|
kusano |
7d535a |
i__3 = iisub + jjsub * a_dim1;
|
|
kusano |
7d535a |
d_cnjg(&z__1, &ctemp);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
i__3 = iisub + jjsub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = ctemp.r, a[i__3].i = ctemp.i;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L200: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L210: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 4) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
zlatm3_(&z__1, m, n, &i, &j, &isub, &jsub, kl, ku, &idist,
|
|
kusano |
7d535a |
&iseed[1], &d[1], &igrade, &dl[1], &dr[1], &
|
|
kusano |
7d535a |
ipvtng, &iwork[1], sparse);
|
|
kusano |
7d535a |
ctemp.r = z__1.r, ctemp.i = z__1.i;
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Compute K = location of (I,J) entry in
|
|
kusano |
7d535a |
packed array */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
mnsub = min(isub,jsub);
|
|
kusano |
7d535a |
mxsub = max(isub,jsub);
|
|
kusano |
7d535a |
if (mnsub == 1) {
|
|
kusano |
7d535a |
k = mxsub;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
k = *n * (*n + 1) / 2 - (*n - mnsub + 1) * (*n -
|
|
kusano |
7d535a |
mnsub + 2) / 2 + mxsub - mnsub + 1;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Convert K to (IISUB,JJSUB) location */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
jjsub = (k - 1) / *lda + 1;
|
|
kusano |
7d535a |
iisub = k - *lda * (jjsub - 1);
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (mxsub == jsub && isym == 0) {
|
|
kusano |
7d535a |
i__3 = iisub + jjsub * a_dim1;
|
|
kusano |
7d535a |
d_cnjg(&z__1, &ctemp);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
i__3 = iisub + jjsub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = ctemp.r, a[i__3].i = ctemp.i;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L220: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L230: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 5) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = j - kuu; i <= i__2; ++i) {
|
|
kusano |
7d535a |
if (i < 1) {
|
|
kusano |
7d535a |
i__3 = j - i + 1 + (i + *n) * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = 0., a[i__3].i = 0.;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
zlatm3_(&z__1, m, n, &i, &j, &isub, &jsub, kl, ku, &
|
|
kusano |
7d535a |
idist, &iseed[1], &d[1], &igrade, &dl[1], &dr[
|
|
kusano |
7d535a |
1], &ipvtng, &iwork[1], sparse);
|
|
kusano |
7d535a |
ctemp.r = z__1.r, ctemp.i = z__1.i;
|
|
kusano |
7d535a |
mnsub = min(isub,jsub);
|
|
kusano |
7d535a |
mxsub = max(isub,jsub);
|
|
kusano |
7d535a |
if (mxsub == jsub && isym == 0) {
|
|
kusano |
7d535a |
i__3 = mxsub - mnsub + 1 + mnsub * a_dim1;
|
|
kusano |
7d535a |
d_cnjg(&z__1, &ctemp);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
i__3 = mxsub - mnsub + 1 + mnsub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = ctemp.r, a[i__3].i = ctemp.i;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L240: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L250: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 6) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = j - kuu; i <= i__2; ++i) {
|
|
kusano |
7d535a |
zlatm3_(&z__1, m, n, &i, &j, &isub, &jsub, kl, ku, &idist,
|
|
kusano |
7d535a |
&iseed[1], &d[1], &igrade, &dl[1], &dr[1], &
|
|
kusano |
7d535a |
ipvtng, &iwork[1], sparse);
|
|
kusano |
7d535a |
ctemp.r = z__1.r, ctemp.i = z__1.i;
|
|
kusano |
7d535a |
mnsub = min(isub,jsub);
|
|
kusano |
7d535a |
mxsub = max(isub,jsub);
|
|
kusano |
7d535a |
if (mxsub == isub && isym == 0) {
|
|
kusano |
7d535a |
i__3 = mnsub - mxsub + kuu + 1 + mxsub * a_dim1;
|
|
kusano |
7d535a |
d_cnjg(&z__1, &ctemp);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
i__3 = mnsub - mxsub + kuu + 1 + mxsub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = ctemp.r, a[i__3].i = ctemp.i;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L260: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L270: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 7) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (isym != 1) {
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = j - kuu; i <= i__2; ++i) {
|
|
kusano |
7d535a |
zlatm3_(&z__1, m, n, &i, &j, &isub, &jsub, kl, ku, &
|
|
kusano |
7d535a |
idist, &iseed[1], &d[1], &igrade, &dl[1], &dr[
|
|
kusano |
7d535a |
1], &ipvtng, &iwork[1], sparse);
|
|
kusano |
7d535a |
ctemp.r = z__1.r, ctemp.i = z__1.i;
|
|
kusano |
7d535a |
mnsub = min(isub,jsub);
|
|
kusano |
7d535a |
mxsub = max(isub,jsub);
|
|
kusano |
7d535a |
if (i < 1) {
|
|
kusano |
7d535a |
i__3 = j - i + 1 + kuu + (i + *n) * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = 0., a[i__3].i = 0.;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
if (mxsub == isub && isym == 0) {
|
|
kusano |
7d535a |
i__3 = mnsub - mxsub + kuu + 1 + mxsub * a_dim1;
|
|
kusano |
7d535a |
d_cnjg(&z__1, &ctemp);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
i__3 = mnsub - mxsub + kuu + 1 + mxsub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = ctemp.r, a[i__3].i = ctemp.i;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
if (i >= 1 && mnsub != mxsub) {
|
|
kusano |
7d535a |
if (mnsub == isub && isym == 0) {
|
|
kusano |
7d535a |
i__3 = mxsub - mnsub + 1 + kuu + mnsub *
|
|
kusano |
7d535a |
a_dim1;
|
|
kusano |
7d535a |
d_cnjg(&z__1, &ctemp);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
i__3 = mxsub - mnsub + 1 + kuu + mnsub *
|
|
kusano |
7d535a |
a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = ctemp.r, a[i__3].i = ctemp.i;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L280: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L290: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
} else if (isym == 1) {
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j + kll;
|
|
kusano |
7d535a |
for (i = j - kuu; i <= i__2; ++i) {
|
|
kusano |
7d535a |
zlatm3_(&z__1, m, n, &i, &j, &isub, &jsub, kl, ku, &
|
|
kusano |
7d535a |
idist, &iseed[1], &d[1], &igrade, &dl[1], &dr[
|
|
kusano |
7d535a |
1], &ipvtng, &iwork[1], sparse);
|
|
kusano |
7d535a |
ctemp.r = z__1.r, ctemp.i = z__1.i;
|
|
kusano |
7d535a |
i__3 = isub - jsub + kuu + 1 + jsub * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = ctemp.r, a[i__3].i = ctemp.i;
|
|
kusano |
7d535a |
/* L300: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L310: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Use ZLATM2 */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (ipack == 0) {
|
|
kusano |
7d535a |
if (isym == 0) {
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
i__3 = i + j * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__1, m, n, &i, &j, kl, ku, &idist, &iseed[1]
|
|
kusano |
7d535a |
, &d[1], &igrade, &dl[1], &dr[1], &ipvtng, &
|
|
kusano |
7d535a |
iwork[1], sparse);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
i__3 = j + i * a_dim1;
|
|
kusano |
7d535a |
d_cnjg(&z__1, &a[i + j * a_dim1]);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
/* L320: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L330: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
} else if (isym == 1) {
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = *m;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
i__3 = i + j * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__1, m, n, &i, &j, kl, ku, &idist, &iseed[1]
|
|
kusano |
7d535a |
, &d[1], &igrade, &dl[1], &dr[1], &ipvtng, &
|
|
kusano |
7d535a |
iwork[1], sparse);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
/* L340: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L350: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
} else if (isym == 2) {
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
i__3 = i + j * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__1, m, n, &i, &j, kl, ku, &idist, &iseed[1]
|
|
kusano |
7d535a |
, &d[1], &igrade, &dl[1], &dr[1], &ipvtng, &
|
|
kusano |
7d535a |
iwork[1], sparse);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
i__3 = j + i * a_dim1;
|
|
kusano |
7d535a |
i__4 = i + j * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = a[i__4].r, a[i__3].i = a[i__4].i;
|
|
kusano |
7d535a |
/* L360: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L370: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 1) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
i__3 = i + j * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__1, m, n, &i, &j, kl, ku, &idist, &iseed[1], &
|
|
kusano |
7d535a |
d[1], &igrade, &dl[1], &dr[1], &ipvtng, &iwork[1],
|
|
kusano |
7d535a |
sparse);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
if (i != j) {
|
|
kusano |
7d535a |
i__3 = j + i * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = 0., a[i__3].i = 0.;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L380: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L390: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 2) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
if (isym == 0) {
|
|
kusano |
7d535a |
i__3 = j + i * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__2, m, n, &i, &j, kl, ku, &idist, &iseed[1]
|
|
kusano |
7d535a |
, &d[1], &igrade, &dl[1], &dr[1], &ipvtng, &
|
|
kusano |
7d535a |
iwork[1], sparse);
|
|
kusano |
7d535a |
d_cnjg(&z__1, &z__2);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
i__3 = j + i * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__1, m, n, &i, &j, kl, ku, &idist, &iseed[1]
|
|
kusano |
7d535a |
, &d[1], &igrade, &dl[1], &dr[1], &ipvtng, &
|
|
kusano |
7d535a |
iwork[1], sparse);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
if (i != j) {
|
|
kusano |
7d535a |
i__3 = i + j * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = 0., a[i__3].i = 0.;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L400: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L410: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 3) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
isub = 0;
|
|
kusano |
7d535a |
jsub = 1;
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
++isub;
|
|
kusano |
7d535a |
if (isub > *lda) {
|
|
kusano |
7d535a |
isub = 1;
|
|
kusano |
7d535a |
++jsub;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
i__3 = isub + jsub * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__1, m, n, &i, &j, kl, ku, &idist, &iseed[1], &
|
|
kusano |
7d535a |
d[1], &igrade, &dl[1], &dr[1], &ipvtng, &iwork[1],
|
|
kusano |
7d535a |
sparse);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
/* L420: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L430: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 4) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (isym == 0 || isym == 2) {
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = 1; i <= i__2; ++i) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Compute K = location of (I,J) en
|
|
kusano |
7d535a |
try in packed array */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (i == 1) {
|
|
kusano |
7d535a |
k = j;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
k = *n * (*n + 1) / 2 - (*n - i + 1) * (*n - i +
|
|
kusano |
7d535a |
2) / 2 + j - i + 1;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Convert K to (ISUB,JSUB) locatio
|
|
kusano |
7d535a |
n */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
jsub = (k - 1) / *lda + 1;
|
|
kusano |
7d535a |
isub = k - *lda * (jsub - 1);
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__3 = isub + jsub * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__1, m, n, &i, &j, kl, ku, &idist, &iseed[1]
|
|
kusano |
7d535a |
, &d[1], &igrade, &dl[1], &dr[1], &ipvtng, &
|
|
kusano |
7d535a |
iwork[1], sparse);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
if (isym == 0) {
|
|
kusano |
7d535a |
i__3 = isub + jsub * a_dim1;
|
|
kusano |
7d535a |
d_cnjg(&z__1, &a[isub + jsub * a_dim1]);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L440: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L450: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
isub = 0;
|
|
kusano |
7d535a |
jsub = 1;
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = *m;
|
|
kusano |
7d535a |
for (i = j; i <= i__2; ++i) {
|
|
kusano |
7d535a |
++isub;
|
|
kusano |
7d535a |
if (isub > *lda) {
|
|
kusano |
7d535a |
isub = 1;
|
|
kusano |
7d535a |
++jsub;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
i__3 = isub + jsub * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__1, m, n, &i, &j, kl, ku, &idist, &iseed[1]
|
|
kusano |
7d535a |
, &d[1], &igrade, &dl[1], &dr[1], &ipvtng, &
|
|
kusano |
7d535a |
iwork[1], sparse);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
/* L460: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L470: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 5) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = j - kuu; i <= i__2; ++i) {
|
|
kusano |
7d535a |
if (i < 1) {
|
|
kusano |
7d535a |
i__3 = j - i + 1 + (i + *n) * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = 0., a[i__3].i = 0.;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
if (isym == 0) {
|
|
kusano |
7d535a |
i__3 = j - i + 1 + i * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__2, m, n, &i, &j, kl, ku, &idist, &
|
|
kusano |
7d535a |
iseed[1], &d[1], &igrade, &dl[1], &dr[1],
|
|
kusano |
7d535a |
&ipvtng, &iwork[1], sparse);
|
|
kusano |
7d535a |
d_cnjg(&z__1, &z__2);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
i__3 = j - i + 1 + i * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__1, m, n, &i, &j, kl, ku, &idist, &
|
|
kusano |
7d535a |
iseed[1], &d[1], &igrade, &dl[1], &dr[1],
|
|
kusano |
7d535a |
&ipvtng, &iwork[1], sparse);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L480: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L490: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 6) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = j - kuu; i <= i__2; ++i) {
|
|
kusano |
7d535a |
i__3 = i - j + kuu + 1 + j * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__1, m, n, &i, &j, kl, ku, &idist, &iseed[1], &
|
|
kusano |
7d535a |
d[1], &igrade, &dl[1], &dr[1], &ipvtng, &iwork[1],
|
|
kusano |
7d535a |
sparse);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
/* L500: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L510: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 7) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (isym != 1) {
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j;
|
|
kusano |
7d535a |
for (i = j - kuu; i <= i__2; ++i) {
|
|
kusano |
7d535a |
i__3 = i - j + kuu + 1 + j * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__1, m, n, &i, &j, kl, ku, &idist, &iseed[1]
|
|
kusano |
7d535a |
, &d[1], &igrade, &dl[1], &dr[1], &ipvtng, &
|
|
kusano |
7d535a |
iwork[1], sparse);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
if (i < 1) {
|
|
kusano |
7d535a |
i__3 = j - i + 1 + kuu + (i + *n) * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = 0., a[i__3].i = 0.;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
if (i >= 1 && i != j) {
|
|
kusano |
7d535a |
if (isym == 0) {
|
|
kusano |
7d535a |
i__3 = j - i + 1 + kuu + i * a_dim1;
|
|
kusano |
7d535a |
d_cnjg(&z__1, &a[i - j + kuu + 1 + j * a_dim1]
|
|
kusano |
7d535a |
);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
i__3 = j - i + 1 + kuu + i * a_dim1;
|
|
kusano |
7d535a |
i__4 = i - j + kuu + 1 + j * a_dim1;
|
|
kusano |
7d535a |
a[i__3].r = a[i__4].r, a[i__3].i = a[i__4].i;
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L520: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L530: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
} else if (isym == 1) {
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = j + kll;
|
|
kusano |
7d535a |
for (i = j - kuu; i <= i__2; ++i) {
|
|
kusano |
7d535a |
i__3 = i - j + kuu + 1 + j * a_dim1;
|
|
kusano |
7d535a |
zlatm2_(&z__1, m, n, &i, &j, kl, ku, &idist, &iseed[1]
|
|
kusano |
7d535a |
, &d[1], &igrade, &dl[1], &dr[1], &ipvtng, &
|
|
kusano |
7d535a |
iwork[1], sparse);
|
|
kusano |
7d535a |
a[i__3].r = z__1.r, a[i__3].i = z__1.i;
|
|
kusano |
7d535a |
/* L540: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
/* L550: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* 5) Scaling the norm */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (ipack == 0) {
|
|
kusano |
7d535a |
onorm = zlange_("M", m, n, &a[a_offset], lda, tempa);
|
|
kusano |
7d535a |
} else if (ipack == 1) {
|
|
kusano |
7d535a |
onorm = zlansy_("M", "U", n, &a[a_offset], lda, tempa);
|
|
kusano |
7d535a |
} else if (ipack == 2) {
|
|
kusano |
7d535a |
onorm = zlansy_("M", "L", n, &a[a_offset], lda, tempa);
|
|
kusano |
7d535a |
} else if (ipack == 3) {
|
|
kusano |
7d535a |
onorm = zlansp_("M", "U", n, &a[a_offset], tempa);
|
|
kusano |
7d535a |
} else if (ipack == 4) {
|
|
kusano |
7d535a |
onorm = zlansp_("M", "L", n, &a[a_offset], tempa);
|
|
kusano |
7d535a |
} else if (ipack == 5) {
|
|
kusano |
7d535a |
onorm = zlansb_("M", "L", n, &kll, &a[a_offset], lda, tempa);
|
|
kusano |
7d535a |
} else if (ipack == 6) {
|
|
kusano |
7d535a |
onorm = zlansb_("M", "U", n, &kuu, &a[a_offset], lda, tempa);
|
|
kusano |
7d535a |
} else if (ipack == 7) {
|
|
kusano |
7d535a |
onorm = zlangb_("M", n, &kll, &kuu, &a[a_offset], lda, tempa);
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (*anorm >= 0.) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (*anorm > 0. && onorm == 0.) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Desired scaling impossible */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
*info = 5;
|
|
kusano |
7d535a |
return 0;
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (*anorm > 1. && onorm < 1. || *anorm < 1. && onorm > 1.) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Scale carefully to avoid over / underflow */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (ipack <= 2) {
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
d__1 = 1. / onorm;
|
|
kusano |
7d535a |
zdscal_(m, &d__1, &a[j * a_dim1 + 1], &c__1);
|
|
kusano |
7d535a |
zdscal_(m, anorm, &a[j * a_dim1 + 1], &c__1);
|
|
kusano |
7d535a |
/* L560: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 3 || ipack == 4) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n * (*n + 1) / 2;
|
|
kusano |
7d535a |
d__1 = 1. / onorm;
|
|
kusano |
7d535a |
zdscal_(&i__1, &d__1, &a[a_offset], &c__1);
|
|
kusano |
7d535a |
i__1 = *n * (*n + 1) / 2;
|
|
kusano |
7d535a |
zdscal_(&i__1, anorm, &a[a_offset], &c__1);
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack >= 5) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = kll + kuu + 1;
|
|
kusano |
7d535a |
d__1 = 1. / onorm;
|
|
kusano |
7d535a |
zdscal_(&i__2, &d__1, &a[j * a_dim1 + 1], &c__1);
|
|
kusano |
7d535a |
i__2 = kll + kuu + 1;
|
|
kusano |
7d535a |
zdscal_(&i__2, anorm, &a[j * a_dim1 + 1], &c__1);
|
|
kusano |
7d535a |
/* L570: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* Scale straightforwardly */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
if (ipack <= 2) {
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
d__1 = *anorm / onorm;
|
|
kusano |
7d535a |
zdscal_(m, &d__1, &a[j * a_dim1 + 1], &c__1);
|
|
kusano |
7d535a |
/* L580: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack == 3 || ipack == 4) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n * (*n + 1) / 2;
|
|
kusano |
7d535a |
d__1 = *anorm / onorm;
|
|
kusano |
7d535a |
zdscal_(&i__1, &d__1, &a[a_offset], &c__1);
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
} else if (ipack >= 5) {
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
i__1 = *n;
|
|
kusano |
7d535a |
for (j = 1; j <= i__1; ++j) {
|
|
kusano |
7d535a |
i__2 = kll + kuu + 1;
|
|
kusano |
7d535a |
d__1 = *anorm / onorm;
|
|
kusano |
7d535a |
zdscal_(&i__2, &d__1, &a[j * a_dim1 + 1], &c__1);
|
|
kusano |
7d535a |
/* L590: */
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
}
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
/* End of ZLATMR */
|
|
kusano |
7d535a |
|
|
kusano |
7d535a |
return 0;
|
|
kusano |
7d535a |
} /* zlatmr_ */
|
|
kusano |
7d535a |
|