LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ zlatm3()

complex*16 function zlatm3 ( integer m,
integer n,
integer i,
integer j,
integer isub,
integer jsub,
integer kl,
integer ku,
integer idist,
integer, dimension( 4 ) iseed,
complex*16, dimension( * ) d,
integer igrade,
complex*16, dimension( * ) dl,
complex*16, dimension( * ) dr,
integer ipvtng,
integer, dimension( * ) iwork,
double precision sparse )

ZLATM3

Purpose:
!>
!>    ZLATM3 returns the (ISUB,JSUB) entry of a random matrix of
!>    dimension (M, N) described by the other parameters. (ISUB,JSUB)
!>    is the final position of the (I,J) entry after pivoting
!>    according to IPVTNG and IWORK. ZLATM3 is called by the
!>    ZLATMR routine in order to build random test matrices. No error
!>    checking on parameters is done, because this routine is called in
!>    a tight loop by ZLATMR which has already checked the parameters.
!>
!>    Use of ZLATM3 differs from CLATM2 in the order in which the random
!>    number generator is called to fill in random matrix entries.
!>    With ZLATM2, the generator is called to fill in the pivoted matrix
!>    columnwise. With ZLATM3, the generator is called to fill in the
!>    matrix columnwise, after which it is pivoted. Thus, ZLATM3 can
!>    be used to construct random matrices which differ only in their
!>    order of rows and/or columns. ZLATM2 is used to construct band
!>    matrices while avoiding calling the random number generator for
!>    entries outside the band (and therefore generating random numbers
!>    in different orders for different pivot orders).
!>
!>    The matrix whose (ISUB,JSUB) entry is returned is constructed as
!>    follows (this routine only computes one entry):
!>
!>      If ISUB is outside (1..M) or JSUB is outside (1..N), return zero
!>         (this is convenient for generating matrices in band format).
!>
!>      Generate a matrix A with random entries of distribution IDIST.
!>
!>      Set the diagonal to D.
!>
!>      Grade the matrix, if desired, from the left (by DL) and/or
!>         from the right (by DR or DL) as specified by IGRADE.
!>
!>      Permute, if desired, the rows and/or columns as specified by
!>         IPVTNG and IWORK.
!>
!>      Band the matrix to have lower bandwidth KL and upper
!>         bandwidth KU.
!>
!>      Set random entries to zero as specified by SPARSE.
!> 
Parameters
[in]M
!>          M is INTEGER
!>           Number of rows of matrix. Not modified.
!> 
[in]N
!>          N is INTEGER
!>           Number of columns of matrix. Not modified.
!> 
[in]I
!>          I is INTEGER
!>           Row of unpivoted entry to be returned. Not modified.
!> 
[in]J
!>          J is INTEGER
!>           Column of unpivoted entry to be returned. Not modified.
!> 
[in,out]ISUB
!>          ISUB is INTEGER
!>           Row of pivoted entry to be returned. Changed on exit.
!> 
[in,out]JSUB
!>          JSUB is INTEGER
!>           Column of pivoted entry to be returned. Changed on exit.
!> 
[in]KL
!>          KL is INTEGER
!>           Lower bandwidth. Not modified.
!> 
[in]KU
!>          KU is INTEGER
!>           Upper bandwidth. Not modified.
!> 
[in]IDIST
!>          IDIST is INTEGER
!>           On entry, IDIST specifies the type of distribution to be
!>           used to generate a random matrix .
!>           1 => real and imaginary parts each UNIFORM( 0, 1 )
!>           2 => real and imaginary parts each UNIFORM( -1, 1 )
!>           3 => real and imaginary parts each NORMAL( 0, 1 )
!>           4 => complex number uniform in DISK( 0 , 1 )
!>           Not modified.
!> 
[in,out]ISEED
!>          ISEED is INTEGER array of dimension ( 4 )
!>           Seed for random number generator.
!>           Changed on exit.
!> 
[in]D
!>          D is COMPLEX*16 array of dimension ( MIN( I , J ) )
!>           Diagonal entries of matrix. Not modified.
!> 
[in]IGRADE
!>          IGRADE is INTEGER
!>           Specifies grading of matrix as follows:
!>           0  => no grading
!>           1  => matrix premultiplied by diag( DL )
!>           2  => matrix postmultiplied by diag( DR )
!>           3  => matrix premultiplied by diag( DL ) and
!>                         postmultiplied by diag( DR )
!>           4  => matrix premultiplied by diag( DL ) and
!>                         postmultiplied by inv( diag( DL ) )
!>           5  => matrix premultiplied by diag( DL ) and
!>                         postmultiplied by diag( CONJG(DL) )
!>           6  => matrix premultiplied by diag( DL ) and
!>                         postmultiplied by diag( DL )
!>           Not modified.
!> 
[in]DL
!>          DL is COMPLEX*16 array ( I or J, as appropriate )
!>           Left scale factors for grading matrix.  Not modified.
!> 
[in]DR
!>          DR is COMPLEX*16 array ( I or J, as appropriate )
!>           Right scale factors for grading matrix.  Not modified.
!> 
[in]IPVTNG
!>          IPVTNG is INTEGER
!>           On entry specifies pivoting permutations as follows:
!>           0 => none.
!>           1 => row pivoting.
!>           2 => column pivoting.
!>           3 => full pivoting, i.e., on both sides.
!>           Not modified.
!> 
[in]IWORK
!>          IWORK is INTEGER array ( I or J, as appropriate )
!>           This array specifies the permutation used. The
!>           row (or column) originally in position K is in
!>           position IWORK( K ) after pivoting.
!>           This differs from IWORK for ZLATM2. Not modified.
!> 
[in]SPARSE
!>          SPARSE is DOUBLE PRECISION between 0. and 1.
!>           On entry specifies the sparsity of the matrix
!>           if sparse matrix is to be generated.
!>           SPARSE should lie between 0 and 1.
!>           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.
!> 
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.

Definition at line 226 of file zlatm3.f.

229*
230* -- LAPACK auxiliary routine --
231* -- LAPACK is a software package provided by Univ. of Tennessee, --
232* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
233*
234* .. Scalar Arguments ..
235*
236 INTEGER I, IDIST, IGRADE, IPVTNG, ISUB, J, JSUB, KL,
237 $ KU, M, N
238 DOUBLE PRECISION SPARSE
239* ..
240*
241* .. Array Arguments ..
242*
243 INTEGER ISEED( 4 ), IWORK( * )
244 COMPLEX*16 D( * ), DL( * ), DR( * )
245* ..
246*
247* =====================================================================
248*
249* .. Parameters ..
250*
251 DOUBLE PRECISION ZERO
252 parameter( zero = 0.0d0 )
253 COMPLEX*16 CZERO
254 parameter( czero = ( 0.0d0, 0.0d0 ) )
255* ..
256*
257* .. Local Scalars ..
258*
259 COMPLEX*16 CTEMP
260* ..
261*
262* .. External Functions ..
263*
264 DOUBLE PRECISION DLARAN
265 COMPLEX*16 ZLARND
266 EXTERNAL dlaran, zlarnd
267* ..
268*
269* .. Intrinsic Functions ..
270*
271 INTRINSIC dconjg
272* ..
273*
274*-----------------------------------------------------------------------
275*
276* .. Executable Statements ..
277*
278*
279* Check for I and J in range
280*
281 IF( i.LT.1 .OR. i.GT.m .OR. j.LT.1 .OR. j.GT.n ) THEN
282 isub = i
283 jsub = j
284 zlatm3 = czero
285 RETURN
286 END IF
287*
288* Compute subscripts depending on IPVTNG
289*
290 IF( ipvtng.EQ.0 ) THEN
291 isub = i
292 jsub = j
293 ELSE IF( ipvtng.EQ.1 ) THEN
294 isub = iwork( i )
295 jsub = j
296 ELSE IF( ipvtng.EQ.2 ) THEN
297 isub = i
298 jsub = iwork( j )
299 ELSE IF( ipvtng.EQ.3 ) THEN
300 isub = iwork( i )
301 jsub = iwork( j )
302 END IF
303*
304* Check for banding
305*
306 IF( jsub.GT.isub+ku .OR. jsub.LT.isub-kl ) THEN
307 zlatm3 = czero
308 RETURN
309 END IF
310*
311* Check for sparsity
312*
313 IF( sparse.GT.zero ) THEN
314 IF( dlaran( iseed ).LT.sparse ) THEN
315 zlatm3 = czero
316 RETURN
317 END IF
318 END IF
319*
320* Compute entry and grade it according to IGRADE
321*
322 IF( i.EQ.j ) THEN
323 ctemp = d( i )
324 ELSE
325 ctemp = zlarnd( idist, iseed )
326 END IF
327 IF( igrade.EQ.1 ) THEN
328 ctemp = ctemp*dl( i )
329 ELSE IF( igrade.EQ.2 ) THEN
330 ctemp = ctemp*dr( j )
331 ELSE IF( igrade.EQ.3 ) THEN
332 ctemp = ctemp*dl( i )*dr( j )
333 ELSE IF( igrade.EQ.4 .AND. i.NE.j ) THEN
334 ctemp = ctemp*dl( i ) / dl( j )
335 ELSE IF( igrade.EQ.5 ) THEN
336 ctemp = ctemp*dl( i )*dconjg( dl( j ) )
337 ELSE IF( igrade.EQ.6 ) THEN
338 ctemp = ctemp*dl( i )*dl( j )
339 END IF
340 zlatm3 = ctemp
341 RETURN
342*
343* End of ZLATM3
344*
double precision function dlaran(iseed)
DLARAN
Definition dlaran.f:67
complex *16 function zlarnd(idist, iseed)
ZLARND
Definition zlarnd.f:75
complex *16 function zlatm3(m, n, i, j, isub, jsub, kl, ku, idist, iseed, d, igrade, dl, dr, ipvtng, iwork, sparse)
ZLATM3
Definition zlatm3.f:229
Here is the call graph for this function:
Here is the caller graph for this function: