138
139
140
141
142
143
144 CHARACTER DIAG, TRANS, UPLO
145 INTEGER IMAT, INFO, LDA, N
146
147
148 INTEGER ISEED( 4 )
149 DOUBLE PRECISION RWORK( * )
150 COMPLEX*16 A( LDA, * ), B( * ), WORK( * )
151
152
153
154
155
156 DOUBLE PRECISION ONE, TWO, ZERO
157 parameter( one = 1.0d+0, two = 2.0d+0, zero = 0.0d+0 )
158
159
160 LOGICAL UPPER
161 CHARACTER DIST, TYPE
162 CHARACTER*3 PATH
163 INTEGER I, IY, J, JCOUNT, KL, KU, MODE
164 DOUBLE PRECISION ANORM, BIGNUM, BNORM, BSCAL, C, CNDNUM, REXP,
165 $ SFAC, SMLNUM, TEXP, TLEFT, TSCAL, ULP, UNFL, X,
166 $ Y, Z
167 COMPLEX*16 PLUS1, PLUS2, RA, RB, S, STAR1
168
169
170 LOGICAL LSAME
171 INTEGER IZAMAX
172 DOUBLE PRECISION DLAMCH, DLARND
173 COMPLEX*16 ZLARND
175
176
179
180
181 INTRINSIC abs, dble, dcmplx, dconjg, max, sqrt
182
183
184
185 path( 1: 1 ) = 'Zomplex precision'
186 path( 2: 3 ) = 'TR'
187 unfl =
dlamch(
'Safe minimum' )
189 smlnum = unfl
190 bignum = ( one-ulp ) / smlnum
191 CALL dlabad( smlnum, bignum )
192 IF( ( imat.GE.7 .AND. imat.LE.10 ) .OR. imat.EQ.18 ) THEN
193 diag = 'U'
194 ELSE
195 diag = 'N'
196 END IF
197 info = 0
198
199
200
201 IF( n.LE.0 )
202 $ RETURN
203
204
205
206 upper =
lsame( uplo,
'U' )
207 IF( upper ) THEN
208 CALL zlatb4( path, imat, n, n,
TYPE, KL, KU, ANORM, MODE,
209 $ CNDNUM, DIST )
210 ELSE
211 CALL zlatb4( path, -imat, n, n,
TYPE, KL, KU, ANORM, MODE,
212 $ CNDNUM, DIST )
213 END IF
214
215
216
217 IF( imat.LE.6 ) THEN
218 CALL zlatms( n, n, dist, iseed,
TYPE, RWORK, MODE, CNDNUM,
219 $ ANORM, KL, KU, 'No packing', A, LDA, WORK, INFO )
220
221
222
223
224
225
226 ELSE IF( imat.EQ.7 ) THEN
227 IF( upper ) THEN
228 DO 20 j = 1, n
229 DO 10 i = 1, j - 1
230 a( i, j ) = zero
231 10 CONTINUE
232 a( j, j ) = j
233 20 CONTINUE
234 ELSE
235 DO 40 j = 1, n
236 a( j, j ) = j
237 DO 30 i = j + 1, n
238 a( i, j ) = zero
239 30 CONTINUE
240 40 CONTINUE
241 END IF
242
243
244
245
246
247
248
249 ELSE IF( imat.LE.10 ) THEN
250 IF( upper ) THEN
251 DO 60 j = 1, n
252 DO 50 i = 1, j - 1
253 a( i, j ) = zero
254 50 CONTINUE
255 a( j, j ) = j
256 60 CONTINUE
257 ELSE
258 DO 80 j = 1, n
259 a( j, j ) = j
260 DO 70 i = j + 1, n
261 a( i, j ) = zero
262 70 CONTINUE
263 80 CONTINUE
264 END IF
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324 star1 = 0.25d0*
zlarnd( 5, iseed )
325 sfac = 0.5d0
326 plus1 = sfac*
zlarnd( 5, iseed )
327 DO 90 j = 1, n, 2
328 plus2 = star1 / plus1
329 work( j ) = plus1
330 work( n+j ) = star1
331 IF( j+1.LE.n ) THEN
332 work( j+1 ) = plus2
333 work( n+j+1 ) = zero
334 plus1 = star1 / plus2
336 IF( rexp.LT.zero ) THEN
337 star1 = -sfac**( one-rexp )*
zlarnd( 5, iseed )
338 ELSE
339 star1 = sfac**( one+rexp )*
zlarnd( 5, iseed )
340 END IF
341 END IF
342 90 CONTINUE
343
344 x = sqrt( cndnum ) - 1 / sqrt( cndnum )
345 IF( n.GT.2 ) THEN
346 y = sqrt( 2.d0 / ( n-2 ) )*x
347 ELSE
348 y = zero
349 END IF
350 z = x*x
351
352 IF( upper ) THEN
353 IF( n.GT.3 ) THEN
354 CALL zcopy( n-3, work, 1, a( 2, 3 ), lda+1 )
355 IF( n.GT.4 )
356 $
CALL zcopy( n-4, work( n+1 ), 1, a( 2, 4 ), lda+1 )
357 END IF
358 DO 100 j = 2, n - 1
359 a( 1, j ) = y
360 a( j, n ) = y
361 100 CONTINUE
362 a( 1, n ) = z
363 ELSE
364 IF( n.GT.3 ) THEN
365 CALL zcopy( n-3, work, 1, a( 3, 2 ), lda+1 )
366 IF( n.GT.4 )
367 $
CALL zcopy( n-4, work( n+1 ), 1, a( 4, 2 ), lda+1 )
368 END IF
369 DO 110 j = 2, n - 1
370 a( j, 1 ) = y
371 a( n, j ) = y
372 110 CONTINUE
373 a( n, 1 ) = z
374 END IF
375
376
377
378 IF( upper ) THEN
379 DO 120 j = 1, n - 1
380 ra = a( j, j+1 )
381 rb = 2.0d0
382 CALL zrotg( ra, rb, c, s )
383
384
385
386 IF( n.GT.j+1 )
387 $
CALL zrot( n-j-1, a( j, j+2 ), lda, a( j+1, j+2 ),
388 $ lda, c, s )
389
390
391
392 IF( j.GT.1 )
393 $
CALL zrot( j-1, a( 1, j+1 ), 1, a( 1, j ), 1, -c, -s )
394
395
396
397 a( j, j+1 ) = -a( j, j+1 )
398 120 CONTINUE
399 ELSE
400 DO 130 j = 1, n - 1
401 ra = a( j+1, j )
402 rb = 2.0d0
403 CALL zrotg( ra, rb, c, s )
404 s = dconjg( s )
405
406
407
408 IF( n.GT.j+1 )
409 $
CALL zrot( n-j-1, a( j+2, j+1 ), 1, a( j+2, j ), 1, c,
410 $ -s )
411
412
413
414 IF( j.GT.1 )
415 $
CALL zrot( j-1, a( j, 1 ), lda, a( j+1, 1 ), lda, -c,
416 $ s )
417
418
419
420 a( j+1, j ) = -a( j+1, j )
421 130 CONTINUE
422 END IF
423
424
425
426
427
428 ELSE IF( imat.EQ.11 ) THEN
429
430
431
432
433
434 IF( upper ) THEN
435 DO 140 j = 1, n
436 CALL zlarnv( 4, iseed, j-1, a( 1, j ) )
437 a( j, j ) =
zlarnd( 5, iseed )*two
438 140 CONTINUE
439 ELSE
440 DO 150 j = 1, n
441 IF( j.LT.n )
442 $
CALL zlarnv( 4, iseed, n-j, a( j+1, j ) )
443 a( j, j ) =
zlarnd( 5, iseed )*two
444 150 CONTINUE
445 END IF
446
447
448
449 CALL zlarnv( 2, iseed, n, b )
451 bnorm = abs( b( iy ) )
452 bscal = bignum / max( one, bnorm )
453 CALL zdscal( n, bscal, b, 1 )
454
455 ELSE IF( imat.EQ.12 ) THEN
456
457
458
459
460
461 CALL zlarnv( 2, iseed, n, b )
462 tscal = one / max( one, dble( n-1 ) )
463 IF( upper ) THEN
464 DO 160 j = 1, n
465 CALL zlarnv( 4, iseed, j-1, a( 1, j ) )
466 CALL zdscal( j-1, tscal, a( 1, j ), 1 )
467 a( j, j ) =
zlarnd( 5, iseed )
468 160 CONTINUE
469 a( n, n ) = smlnum*a( n, n )
470 ELSE
471 DO 170 j = 1, n
472 IF( j.LT.n ) THEN
473 CALL zlarnv( 4, iseed, n-j, a( j+1, j ) )
474 CALL zdscal( n-j, tscal, a( j+1, j ), 1 )
475 END IF
476 a( j, j ) =
zlarnd( 5, iseed )
477 170 CONTINUE
478 a( 1, 1 ) = smlnum*a( 1, 1 )
479 END IF
480
481 ELSE IF( imat.EQ.13 ) THEN
482
483
484
485
486
487 CALL zlarnv( 2, iseed, n, b )
488 IF( upper ) THEN
489 DO 180 j = 1, n
490 CALL zlarnv( 4, iseed, j-1, a( 1, j ) )
491 a( j, j ) =
zlarnd( 5, iseed )
492 180 CONTINUE
493 a( n, n ) = smlnum*a( n, n )
494 ELSE
495 DO 190 j = 1, n
496 IF( j.LT.n )
497 $
CALL zlarnv( 4, iseed, n-j, a( j+1, j ) )
498 a( j, j ) =
zlarnd( 5, iseed )
499 190 CONTINUE
500 a( 1, 1 ) = smlnum*a( 1, 1 )
501 END IF
502
503 ELSE IF( imat.EQ.14 ) THEN
504
505
506
507
508
509 IF( upper ) THEN
510 jcount = 1
511 DO 210 j = n, 1, -1
512 DO 200 i = 1, j - 1
513 a( i, j ) = zero
514 200 CONTINUE
515 IF( jcount.LE.2 ) THEN
516 a( j, j ) = smlnum*
zlarnd( 5, iseed )
517 ELSE
518 a( j, j ) =
zlarnd( 5, iseed )
519 END IF
520 jcount = jcount + 1
521 IF( jcount.GT.4 )
522 $ jcount = 1
523 210 CONTINUE
524 ELSE
525 jcount = 1
526 DO 230 j = 1, n
527 DO 220 i = j + 1, n
528 a( i, j ) = zero
529 220 CONTINUE
530 IF( jcount.LE.2 ) THEN
531 a( j, j ) = smlnum*
zlarnd( 5, iseed )
532 ELSE
533 a( j, j ) =
zlarnd( 5, iseed )
534 END IF
535 jcount = jcount + 1
536 IF( jcount.GT.4 )
537 $ jcount = 1
538 230 CONTINUE
539 END IF
540
541
542
543 IF( upper ) THEN
544 b( 1 ) = zero
545 DO 240 i = n, 2, -2
546 b( i ) = zero
547 b( i-1 ) = smlnum*
zlarnd( 5, iseed )
548 240 CONTINUE
549 ELSE
550 b( n ) = zero
551 DO 250 i = 1, n - 1, 2
552 b( i ) = zero
553 b( i+1 ) = smlnum*
zlarnd( 5, iseed )
554 250 CONTINUE
555 END IF
556
557 ELSE IF( imat.EQ.15 ) THEN
558
559
560
561
562
563 texp = one / max( one, dble( n-1 ) )
564 tscal = smlnum**texp
565 CALL zlarnv( 4, iseed, n, b )
566 IF( upper ) THEN
567 DO 270 j = 1, n
568 DO 260 i = 1, j - 2
569 a( i, j ) = 0.d0
570 260 CONTINUE
571 IF( j.GT.1 )
572 $ a( j-1, j ) = dcmplx( -one, -one )
573 a( j, j ) = tscal*
zlarnd( 5, iseed )
574 270 CONTINUE
575 b( n ) = dcmplx( one, one )
576 ELSE
577 DO 290 j = 1, n
578 DO 280 i = j + 2, n
579 a( i, j ) = 0.d0
580 280 CONTINUE
581 IF( j.LT.n )
582 $ a( j+1, j ) = dcmplx( -one, -one )
583 a( j, j ) = tscal*
zlarnd( 5, iseed )
584 290 CONTINUE
585 b( 1 ) = dcmplx( one, one )
586 END IF
587
588 ELSE IF( imat.EQ.16 ) THEN
589
590
591
592 iy = n / 2 + 1
593 IF( upper ) THEN
594 DO 300 j = 1, n
595 CALL zlarnv( 4, iseed, j-1, a( 1, j ) )
596 IF( j.NE.iy ) THEN
597 a( j, j ) =
zlarnd( 5, iseed )*two
598 ELSE
599 a( j, j ) = zero
600 END IF
601 300 CONTINUE
602 ELSE
603 DO 310 j = 1, n
604 IF( j.LT.n )
605 $
CALL zlarnv( 4, iseed, n-j, a( j+1, j ) )
606 IF( j.NE.iy ) THEN
607 a( j, j ) =
zlarnd( 5, iseed )*two
608 ELSE
609 a( j, j ) = zero
610 END IF
611 310 CONTINUE
612 END IF
613 CALL zlarnv( 2, iseed, n, b )
614 CALL zdscal( n, two, b, 1 )
615
616 ELSE IF( imat.EQ.17 ) THEN
617
618
619
620
621
622
623 tscal = unfl / ulp
624 tscal = ( one-ulp ) / tscal
625 DO 330 j = 1, n
626 DO 320 i = 1, n
627 a( i, j ) = 0.d0
628 320 CONTINUE
629 330 CONTINUE
630 texp = one
631 IF( upper ) THEN
632 DO 340 j = n, 2, -2
633 a( 1, j ) = -tscal / dble( n+1 )
634 a( j, j ) = one
635 b( j ) = texp*( one-ulp )
636 a( 1, j-1 ) = -( tscal / dble( n+1 ) ) / dble( n+2 )
637 a( j-1, j-1 ) = one
638 b( j-1 ) = texp*dble( n*n+n-1 )
639 texp = texp*2.d0
640 340 CONTINUE
641 b( 1 ) = ( dble( n+1 ) / dble( n+2 ) )*tscal
642 ELSE
643 DO 350 j = 1, n - 1, 2
644 a( n, j ) = -tscal / dble( n+1 )
645 a( j, j ) = one
646 b( j ) = texp*( one-ulp )
647 a( n, j+1 ) = -( tscal / dble( n+1 ) ) / dble( n+2 )
648 a( j+1, j+1 ) = one
649 b( j+1 ) = texp*dble( n*n+n-1 )
650 texp = texp*2.d0
651 350 CONTINUE
652 b( n ) = ( dble( n+1 ) / dble( n+2 ) )*tscal
653 END IF
654
655 ELSE IF( imat.EQ.18 ) THEN
656
657
658
659
660
661 IF( upper ) THEN
662 DO 360 j = 1, n
663 CALL zlarnv( 4, iseed, j-1, a( 1, j ) )
664 a( j, j ) = zero
665 360 CONTINUE
666 ELSE
667 DO 370 j = 1, n
668 IF( j.LT.n )
669 $
CALL zlarnv( 4, iseed, n-j, a( j+1, j ) )
670 a( j, j ) = zero
671 370 CONTINUE
672 END IF
673
674
675
676 CALL zlarnv( 2, iseed, n, b )
678 bnorm = abs( b( iy ) )
679 bscal = bignum / max( one, bnorm )
680 CALL zdscal( n, bscal, b, 1 )
681
682 ELSE IF( imat.EQ.19 ) THEN
683
684
685
686
687
688
689 tleft = bignum / max( one, dble( n-1 ) )
690 tscal = bignum*( dble( n-1 ) / max( one, dble( n ) ) )
691 IF( upper ) THEN
692 DO 390 j = 1, n
693 CALL zlarnv( 5, iseed, j, a( 1, j ) )
694 CALL dlarnv( 1, iseed, j, rwork )
695 DO 380 i = 1, j
696 a( i, j ) = a( i, j )*( tleft+rwork( i )*tscal )
697 380 CONTINUE
698 390 CONTINUE
699 ELSE
700 DO 410 j = 1, n
701 CALL zlarnv( 5, iseed, n-j+1, a( j, j ) )
702 CALL dlarnv( 1, iseed, n-j+1, rwork )
703 DO 400 i = j, n
704 a( i, j ) = a( i, j )*( tleft+rwork( i-j+1 )*tscal )
705 400 CONTINUE
706 410 CONTINUE
707 END IF
708 CALL zlarnv( 2, iseed, n, b )
709 CALL zdscal( n, two, b, 1 )
710 END IF
711
712
713
714 IF( .NOT.
lsame( trans,
'N' ) )
THEN
715 IF( upper ) THEN
716 DO 420 j = 1, n / 2
717 CALL zswap( n-2*j+1, a( j, j ), lda, a( j+1, n-j+1 ),
718 $ -1 )
719 420 CONTINUE
720 ELSE
721 DO 430 j = 1, n / 2
722 CALL zswap( n-2*j+1, a( j, j ), 1, a( n-j+1, j+1 ),
723 $ -lda )
724 430 CONTINUE
725 END IF
726 END IF
727
728 RETURN
729
730
731
double precision function dlamch(CMACH)
DLAMCH
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dlarnv(IDIST, ISEED, N, X)
DLARNV returns a vector of random numbers from a uniform or normal distribution.
integer function izamax(N, ZX, INCX)
IZAMAX
logical function lsame(CA, CB)
LSAME
subroutine zswap(N, ZX, INCX, ZY, INCY)
ZSWAP
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
subroutine zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
subroutine zlatb4(PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, CNDNUM, DIST)
ZLATB4
subroutine zlatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
ZLATMS
complex *16 function zlarnd(IDIST, ISEED)
ZLARND
subroutine zrot(N, CX, INCX, CY, INCY, C, S)
ZROT applies a plane rotation with real cosine and complex sine to a pair of complex vectors.
subroutine zlarnv(IDIST, ISEED, N, X)
ZLARNV returns a vector of random numbers from a uniform or normal distribution.
double precision function dlarnd(IDIST, ISEED)
DLARND
subroutine zrotg(a, b, c, s)
ZROTG generates a Givens rotation with real cosine and complex sine.