6
7
8
9
10
11
12
13 CHARACTER HETERO, SUBTESTS, UPLO
14 INTEGER INFO, IPOSTPAD, IPREPAD, LDA, LIWORK, LWORK,
15 $ MATTYPE, N, NOUT, ORDER
16 REAL ABSTOL, THRESH
17
18
19 INTEGER DESCA( * ), ICLUSTR( * ), IFAIL( * ),
20 $ ISEED( 4 ), IWORK( * )
21 REAL A( LDA, * ), COPYA( LDA, * ), GAP( * ),
22 $ WIN( * ), WNEW( * ), WORK( * ), Z( LDA, * )
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196 INTEGER BLOCK_CYCLIC_2D, DLEN_, DT_, CTXT_, M_, N_,
197 $ MB_, NB_, RSRC_, CSRC_, LLD_
198 parameter( block_cyclic_2d = 1, dlen_ = 9, dt_ = 1,
199 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
200 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
201 REAL HALF, ONE, TEN, ZERO
202 parameter( zero = 0.0e+0, one = 1.0e+0,
203 $ ten = 10.0e+0, half = 0.5e+0 )
204 REAL PADVAL
205 parameter( padval = 19.25e+0 )
206 INTEGER MAXTYP
207 parameter( maxtyp = 22 )
208
209
210
211 LOGICAL WKNOWN
212 CHARACTER JOBZ, RANGE
213 CHARACTER*14 PASSED
214 INTEGER CONTEXT, I, IAM, IHETERO, IINFO, IL, IMODE, IN,
215 $ INDD, INDWORK, ISIZESUBTST, ISIZESYEVX,
216 $ ISIZETST, ITYPE, IU, J, LLWORK, LSYEVXSIZE,
217 $ MAXSIZE, MINSIZE, MYCOL, MYROW, NB, NGEN, NLOC,
218 $ NNODES, NP, NPCOL, NPROW, NQ, RES, SIZECHK,
219 $ SIZEMQRLEFT, SIZEMQRRIGHT, SIZEQRF, SIZEQTQ,
220 $ SIZESUBTST, SIZESYEV, SIZESYEVX, SIZETMS,
221 $ SIZETST, VALSIZE, VECSIZE,ISIZESYEVD, SIZESYEVD
222 REAL ANINV, ANORM, COND, MAXQTQNRM, MAXTSTNRM, OVFL,
223
224
225
226
227 INTEGER ISEEDIN( 4 ), KMAGN( MAXTYP ), KMODE( MAXTYP ),
228 $ KTYPE( MAXTYP )
229 DOUBLE PRECISION CTIME( 10 ), WTIME( 10 )
230
231
232 LOGICAL LSAME
233 INTEGER NUMROC
234 REAL PSLAMCH, SLARAN
236
237
238 EXTERNAL blacs_gridinfo, blacs_pinfo, igamx2d, igebr2d,
243
244
245 INTRINSIC abs, real, int,
max,
min, sqrt
246
247
248 DATA ktype / 1, 2, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 8,
249 $ 8, 8, 9, 9, 9, 9, 9, 10, 11 /
250 DATA kmagn / 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
251 $ 2, 3, 1, 1, 1, 2, 3, 1, 1 /
252 DATA kmode / 0, 0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
253 $ 0, 0, 4, 3, 1, 4, 4, 3, 0 /
254
255
256
257 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dt_*lld_*mb_*m_*nb_*n_*
258 $ rsrc_.LT.0 )RETURN
259
260 info = 0
261 passed = 'PASSED EVX'
262 context = desca( ctxt_ )
263 nb = desca( nb_ )
264
265 CALL blacs_pinfo( iam, nnodes )
266 CALL blacs_gridinfo( context, nprow, npcol, myrow, mycol )
267
268
269
270 IF( iam.EQ.0 ) THEN
271 IF(
lsame( hetero,
'Y' ) )
THEN
272 ihetero = 2
273 ELSE
274 ihetero = 1
275 END IF
276 CALL igebs2d( context, 'All', ' ', 1, 1, ihetero, 1 )
277 ELSE
278 CALL igebr2d( context, 'All', ' ', 1, 1, ihetero, 1, 0, 0 )
279 END IF
280 IF( ihetero.EQ.2 ) THEN
281 hetero = 'Y'
282 ELSE
283 hetero = 'N'
284 END IF
285
286
287
288 CALL pslasizesqp( desca, iprepad, ipostpad, sizemqrleft,
289 $ sizemqrright, sizeqrf, sizetms, sizeqtq,
290 $ sizechk, sizesyevx, isizesyevx, sizesyev,
291 $ sizesyevd, isizesyevd,
292 $ sizesubtst, isizesubtst, sizetst, isizetst )
293
294 IF( lwork.LT.sizetst ) THEN
295 info = 3
296 END IF
297
298 CALL igamx2d( context, 'a', ' ', 1, 1, info, 1, 1, 1, -1, -1, 0 )
299
300 IF( info.EQ.0 ) THEN
301
302 indd = 1
303 indwork = indd + n
304 llwork = lwork - indwork + 1
305
307 ulpinv = one / ulp
308 unfl =
pslamch( context,
'Safe min' )
309 ovfl = one / unfl
310 CALL slabad( unfl, ovfl )
311 rtunfl = sqrt( unfl )
312 rtovfl = sqrt( ovfl )
313 aninv = one / real(
max( 1, n ) )
314
315
316
317 IF( myrow.EQ.0 .AND. mycol.EQ.0 ) THEN
318 CALL igebs2d( context, 'a', ' ', 4, 1, iseed, 4 )
319 ELSE
320 CALL igebr2d( context, 'a', ' ', 4, 1, iseed, 4, 0, 0 )
321 END IF
322 iseedin( 1 ) = iseed( 1 )
323 iseedin( 2 ) = iseed( 2 )
324 iseedin( 3 ) = iseed( 3 )
325 iseedin( 4 ) = iseed( 4 )
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344 itype = ktype( mattype )
345 imode = kmode( mattype )
346
347
348
349 GO TO ( 10, 20, 30 )kmagn( mattype )
350
351 10 CONTINUE
352 anorm = one
353 GO TO 40
354
355 20 CONTINUE
356 anorm = ( rtovfl*ulp )*aninv
357 GO TO 40
358
359 30 CONTINUE
360 anorm = rtunfl*n*ulpinv
361 GO TO 40
362
363 40 CONTINUE
364 IF( mattype.LE.15 ) THEN
365 cond = ulpinv
366 ELSE
367 cond = ulpinv*aninv / ten
368 END IF
369
370
371
372
373
374
375 IF( itype.EQ.1 ) THEN
376
377
378
379 DO 50 i = 1, n
380 work( indd+i-1 ) = zero
381 50 CONTINUE
382 CALL pslaset(
'All', n, n, zero, zero, copya, 1, 1, desca )
383 wknown = .true.
384
385 ELSE IF( itype.EQ.2 ) THEN
386
387
388
389 DO 60 i = 1, n
390 work( indd+i-1 ) = one
391 60 CONTINUE
392 CALL pslaset(
'All', n, n, zero, one, copya, 1, 1, desca )
393 wknown = .true.
394
395 ELSE IF( itype.EQ.4 ) THEN
396
397
398
399 CALL psfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
400 $ sizetms, iprepad, ipostpad, padval+1.0e+0 )
401
402 CALL pslatms( n, n,
'S', iseed,
'S', work( indd ), imode,
403 $ cond, anorm, 0, 0, 'N', copya, 1, 1, desca,
404 $ order, work( indwork+iprepad ), sizetms,
405 $ iinfo )
406 wknown = .true.
407
408 CALL pschekpad( desca( ctxt_ ),
'PSLATMS1-WORK', sizetms, 1,
409 $ work( indwork ), sizetms, iprepad, ipostpad,
410 $ padval+1.0e+0 )
411
412 ELSE IF( itype.EQ.5 ) THEN
413
414
415
416 CALL psfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
417 $ sizetms, iprepad, ipostpad, padval+2.0e+0 )
418
419 CALL pslatms( n, n,
'S', iseed,
'S', work( indd ), imode,
420 $ cond, anorm, n, n, 'N', copya, 1, 1, desca,
421 $ order, work( indwork+iprepad ), sizetms,
422 $ iinfo )
423
424 CALL pschekpad( desca( ctxt_ ),
'PSLATMS2-WORK', sizetms, 1,
425 $ work( indwork ), sizetms, iprepad, ipostpad,
426 $ padval+2.0e+0 )
427
428 wknown = .true.
429
430 ELSE IF( itype.EQ.8 ) THEN
431
432
433
434 np =
numroc( n, desca( mb_ ), myrow, 0, nprow )
435 nq =
numroc( n, desca( nb_ ), mycol, 0, npcol )
436 CALL psmatgen( desca( ctxt_ ),
'S',
'N', n, n, desca( mb_ ),
437 $ desca( nb_ ), copya, desca( lld_ ),
438 $ desca( rsrc_ ), desca( csrc_ ), iseed( 1 ),
439 $ 0, np, 0, nq, myrow, mycol, nprow, npcol )
440 info = 0
441 wknown = .false.
442
443 ELSE IF( itype.EQ.9 ) THEN
444
445
446
447
448 CALL psfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
449 $ sizetms, iprepad, ipostpad, padval+3.0e+0 )
450
451 CALL pslatms( n, n,
'S', iseed,
'S', work( indd ), imode,
452 $ cond, anorm, n, n, 'N', copya, 1, 1, desca,
453 $ order, work( indwork+iprepad ), sizetms,
454 $ iinfo )
455
456 wknown = .true.
457
458 CALL pschekpad( desca( ctxt_ ),
'PSLATMS3-WORK', sizetms, 1,
459 $ work( indwork ), sizetms, iprepad, ipostpad,
460 $ padval+3.0e+0 )
461
462 ELSE IF( itype.EQ.10 ) THEN
463
464
465
466
467 CALL pslaset(
'All', n, n, zero, zero, copya, 1, 1, desca )
468 np =
numroc( n, desca( mb_ ), 0, 0, nprow )
469 nq =
numroc( n, desca( nb_ ), 0, 0, npcol )
471 ngen = 0
472 70 CONTINUE
473
474 IF( ngen.LT.n ) THEN
475 in =
min( 1+int(
slaran( iseed )*real( nloc ) ), n-ngen )
476
477 CALL slatms( in, in,
'S', iseed,
'P', work( indd ),
478 $ imode, cond, anorm, 1, 1, 'N', a, lda,
479 $ work( indwork ), iinfo )
480
481 DO 80 i = 2, in
482 temp1 = abs( a( i-1, i ) ) /
483 $ sqrt( abs( a( i-1, i-1 )*a( i, i ) ) )
484 IF( temp1.GT.half ) THEN
485 a( i-1, i ) = half*sqrt( abs( a( i-1, i-1 )*a( i,
486 $ i ) ) )
487 a( i, i-1 ) = a( i-1, i )
488 END IF
489 80 CONTINUE
490 CALL pselset( copya, ngen+1, ngen+1, desca, a( 1, 1 ) )
491 DO 90 i = 2, in
492 CALL pselset( copya, ngen+i, ngen+i, desca,
493 $ a( i, i ) )
494 CALL pselset( copya, ngen+i-1, ngen+i, desca,
495 $ a( i-1, i ) )
496 CALL pselset( copya, ngen+i, ngen+i-1, desca,
497 $ a( i, i-1 ) )
498 90 CONTINUE
499 ngen = ngen + in
500 GO TO 70
501 END IF
502 wknown = .false.
503
504 ELSE IF( itype.EQ.11 ) THEN
505
506
507
508 ngen = 0
509 j = 1
510 temp1 = zero
511 100 CONTINUE
512 IF( ngen.LT.n ) THEN
513 in =
min( j, n-ngen )
514 DO 110 i = 0, in - 1
515 work( indd+ngen+i ) = temp1
516 110 CONTINUE
517 temp1 = temp1 + one
518 j = 2*j
519 ngen = ngen + in
520 GO TO 100
521 END IF
522
523
524 CALL psfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
525 $ sizetms, iprepad, ipostpad, padval+4.0e+0 )
526
527 CALL pslatms( n, n,
'S', iseed,
'S', work( indd ), imode,
528 $ cond, anorm, 0, 0, 'N', copya, 1, 1, desca,
529 $ order, work( indwork+iprepad ), sizetms,
530 $ iinfo )
531
532 CALL pschekpad( desca( ctxt_ ),
'PSLATMS4-WORK', sizetms, 1,
533 $ work( indwork ), sizetms, iprepad, ipostpad,
534 $ padval+4.0e+0 )
535
536
537
538
539 wknown = .true.
540
541 ELSE
542 iinfo = 1
543 END IF
544
545 IF( wknown )
546 $ CALL slasrt( 'I', n, work( indd ), iinfo )
547
548
549
550
551 il = -1
552 iu = -2
553 vl = one
554 vu = -one
555
557 $ iseed, work( indd ), maxsize, vecsize,
558 $ valsize )
559
560 lsyevxsize =
min( maxsize, llwork )
561
562 CALL pssepsubtst( wknown,
'v',
'a', uplo, n, vl, vu, il, iu,
563 $ thresh, abstol, a, copya, z, 1, 1, desca,
564 $ work( indd ), win, ifail, iclustr, gap,
565 $ iprepad, ipostpad, work( indwork ), llwork,
566 $ lsyevxsize, iwork, isizesyevx, res, tstnrm,
567 $ qtqnrm, nout )
568
569
570
571 maxtstnrm = tstnrm
572 maxqtqnrm = qtqnrm
573
574 IF( thresh.LE.zero ) THEN
575 passed = 'SKIPPED '
576 info = 2
577 ELSE IF( res.NE.0 ) THEN
578 passed = 'FAILED '
579 info = 1
580 END IF
581 END IF
582
583 IF( thresh.GT.zero .AND.
lsame( subtests,
'Y' ) )
THEN
584
585
586
587 IF( info.EQ.0 ) THEN
588
589 jobz = 'V'
590 range = 'A'
592 $ iseed, win( 1+iprepad ), maxsize,
593 $ vecsize, valsize )
594
595 lsyevxsize = vecsize
596
597 CALL pssepsubtst( .true., jobz, range, uplo, n, vl, vu, il,
598 $ iu, thresh, abstol, a, copya, z, 1, 1,
599 $ desca, win( 1+iprepad ), wnew, ifail,
600 $ iclustr, gap, iprepad, ipostpad,
601 $ work( indwork ), llwork, lsyevxsize,
602 $ iwork, isizesyevx, res, tstnrm, qtqnrm,
603 $ nout )
604
605 IF( res.NE.0 ) THEN
606 passed = 'FAILED stest 1'
607 maxtstnrm =
max( tstnrm, maxtstnrm )
608 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
609 info = 1
610 END IF
611 END IF
612
613
614
615 IF( info.EQ.0 ) THEN
616 jobz = 'V'
617 range = 'A'
619 $ iseed, win( 1+iprepad ), maxsize,
620 $ vecsize, valsize )
621
622 lsyevxsize = vecsize + int(
slaran( iseed )*
623 $ real( maxsize-vecsize ) )
624
625 CALL pssepsubtst( .true., jobz, range, uplo, n, vl, vu, il,
626 $ iu, thresh, abstol, a, copya, z, 1, 1,
627 $ desca, win( 1+iprepad ), wnew, ifail,
628 $ iclustr, gap, iprepad, ipostpad,
629 $ work( indwork ), llwork, lsyevxsize,
630 $ iwork, isizesyevx, res, tstnrm, qtqnrm,
631 $ nout )
632
633 IF( res.NE.0 ) THEN
634 passed = 'FAILED stest 2'
635 maxtstnrm =
max( tstnrm, maxtstnrm )
636 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
637 info = 1
638 END IF
639 END IF
640
641
642
643 IF( info.EQ.0 ) THEN
644
645 jobz = 'N'
646 range = 'A'
648 $ iseed, win( 1+iprepad ), maxsize,
649 $ vecsize, valsize )
650
651 lsyevxsize = valsize
652
653 CALL pssepsubtst( .true., jobz, range, uplo, n, vl, vu, il,
654 $ iu, thresh, abstol, a, copya, z, 1, 1,
655 $ desca, win( 1+iprepad ), wnew, ifail,
656 $ iclustr, gap, iprepad, ipostpad,
657 $ work( indwork ), llwork, lsyevxsize,
658 $ iwork, isizesyevx, res, tstnrm, qtqnrm,
659 $ nout )
660
661 IF( res.NE.0 ) THEN
662 maxtstnrm =
max( tstnrm, maxtstnrm )
663 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
664 passed = 'FAILED stest 3'
665 info = 1
666 END IF
667 END IF
668
669
670
671 IF( info.EQ.0 ) THEN
672
673 il = -1
674 iu = -1
675 jobz = 'N'
676 range = 'I'
677
678
679
681 $ iseed, win( 1+iprepad ), maxsize,
682 $ vecsize, valsize )
683
684 lsyevxsize = valsize
685
686 CALL pssepsubtst( .true., jobz, range, uplo, n, vl, vu, il,
687 $ iu, thresh, abstol, a, copya, z, 1, 1,
688 $ desca, win( 1+iprepad ), wnew, ifail,
689 $ iclustr, gap, iprepad, ipostpad,
690 $ work( indwork ), llwork, lsyevxsize,
691 $ iwork, isizesyevx, res, tstnrm, qtqnrm,
692 $ nout )
693
694 IF( res.NE.0 ) THEN
695 maxtstnrm =
max( tstnrm, maxtstnrm )
696 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
697 passed = 'FAILED stest 4'
698 info = 1
699 END IF
700 END IF
701
702
703
704 IF( info.EQ.0 ) THEN
705
706 il = -1
707 iu = -1
708 jobz = 'V'
709 range = 'I'
710
711
712
714 $ iseed, win( 1+iprepad ), maxsize,
715 $ vecsize, valsize )
716
717 lsyevxsize = maxsize
718
719 CALL pssepsubtst( .true., jobz, range, uplo, n, vl, vu, il,
720 $ iu, thresh, abstol, a, copya, z, 1, 1,
721 $ desca, win( 1+iprepad ), wnew, ifail,
722 $ iclustr, gap, iprepad, ipostpad,
723 $ work( indwork ), llwork, lsyevxsize,
724 $ iwork, isizesyevx, res, tstnrm, qtqnrm,
725 $ nout )
726
727 IF( res.NE.0 ) THEN
728 maxtstnrm =
max( tstnrm, maxtstnrm )
729 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
730 passed = 'FAILED stest 5'
731 info = 1
732 END IF
733 END IF
734
735
736
737 IF( info.EQ.0 ) THEN
738 il = -1
739 iu = -1
740 jobz = 'V'
741 range = 'I'
742
743
744
746 $ iseed, win( 1+iprepad ), maxsize,
747 $ vecsize, valsize )
748
749 lsyevxsize = vecsize
750
751 CALL pssepsubtst( .true., jobz, range, uplo, n, vl, vu, il,
752 $ iu, thresh, abstol, a, copya, z, 1, 1,
753 $ desca, win( 1+iprepad ), wnew, ifail,
754 $ iclustr, gap, iprepad, ipostpad,
755 $ work( indwork ), llwork, lsyevxsize,
756 $ iwork, isizesyevx, res, tstnrm, qtqnrm,
757 $ nout )
758
759 IF( res.NE.0 ) THEN
760 maxtstnrm =
max( tstnrm, maxtstnrm )
761 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
762 passed = 'FAILED stest 6'
763 info = 1
764 END IF
765 END IF
766
767
768
769 IF( info.EQ.0 ) THEN
770 il = -1
771 iu = -1
772 jobz = 'V'
773 range = 'I'
774
775
776
778 $ iseed, win( 1+iprepad ), maxsize,
779 $ vecsize, valsize )
780 lsyevxsize = vecsize + int(
slaran( iseed )*
781 $ real( maxsize-vecsize ) )
782
783 CALL pssepsubtst( .true., jobz, range, uplo, n, vl, vu, il,
784 $ iu, thresh, abstol, a, copya, z, 1, 1,
785 $ desca, win( 1+iprepad ), wnew, ifail,
786 $ iclustr, gap, iprepad, ipostpad,
787 $ work( indwork ), llwork, lsyevxsize,
788 $ iwork, isizesyevx, res, tstnrm, qtqnrm,
789 $ nout )
790
791 IF( res.NE.0 ) THEN
792 maxtstnrm =
max( tstnrm, maxtstnrm )
793 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
794 passed = 'FAILED stest 7'
795 info = 1
796 END IF
797 END IF
798
799
800
801 IF( info.EQ.0 ) THEN
802 vl = one
803 vu = -one
804 jobz = 'N'
805 range = 'V'
806
807
808
810 $ iseed, win( 1+iprepad ), maxsize,
811 $ vecsize, valsize )
812
813 lsyevxsize = valsize
814
815 CALL pssepsubtst( .true., jobz, range, uplo, n, vl, vu, il,
816 $ iu, thresh, abstol, a, copya, z, 1, 1,
817 $ desca, win( 1+iprepad ), wnew, ifail,
818 $ iclustr, gap, iprepad, ipostpad,
819 $ work( indwork ), llwork, lsyevxsize,
820 $ iwork, isizesyevx, res, tstnrm, qtqnrm,
821 $ nout )
822
823 IF( res.NE.0 ) THEN
824 maxtstnrm =
max( tstnrm, maxtstnrm )
825 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
826 passed = 'FAILED stest 8'
827 info = 1
828 END IF
829 END IF
830
831
832
833 IF( info.EQ.0 ) THEN
834 vl = one
835 vu = -one
836 jobz = 'V'
837 range = 'V'
838
839
840
842 $ iseed, win( 1+iprepad ), maxsize,
843 $ vecsize, valsize )
844
845 lsyevxsize = maxsize
846
847 CALL pssepsubtst( .true., jobz, range, uplo, n, vl, vu, il,
848 $ iu, thresh, abstol, a, copya, z, 1, 1,
849 $ desca, win( 1+iprepad ), wnew, ifail,
850 $ iclustr, gap, iprepad, ipostpad,
851 $ work( indwork ), llwork, lsyevxsize,
852 $ iwork, isizesyevx, res, tstnrm, qtqnrm,
853 $ nout )
854
855 IF( res.NE.0 ) THEN
856 maxtstnrm =
max( tstnrm, maxtstnrm )
857 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
858 passed = 'FAILED stest 9'
859 info = 1
860 END IF
861 END IF
862
863
864
865
866 IF( info.EQ.0 ) THEN
867 vl = one
868 vu = -one
869 jobz = 'V'
870 range = 'V'
871
872
873
875 $ iseed, win( 1+iprepad ), maxsize,
876 $ vecsize, valsize )
877
878 lsyevxsize = vecsize
879
880 CALL pssepsubtst( .true., jobz, range, uplo, n, vl, vu, il,
881 $ iu, thresh, abstol, a, copya, z, 1, 1,
882 $ desca, win( 1+iprepad ), wnew, ifail,
883 $ iclustr, gap, iprepad, ipostpad,
884 $ work( indwork ), llwork, lsyevxsize,
885 $ iwork, isizesyevx, res, tstnrm, qtqnrm,
886 $ nout )
887
888 IF( res.NE.0 ) THEN
889 maxtstnrm =
max( tstnrm, maxtstnrm )
890 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
891 passed = 'FAILED stest10'
892 info = 1
893 END IF
894 END IF
895
896
897
898
899
900 IF( info.EQ.0 ) THEN
901 vl = one
902 vu = -one
903 jobz = 'V'
904 range = 'V'
905
906
907
909 $ iseed, win( 1+iprepad ), maxsize,
910 $ vecsize, valsize )
911
912 lsyevxsize = vecsize + int(
slaran( iseed )*
913 $ real( maxsize-vecsize ) )
914
915 CALL pssepsubtst( .true., jobz, range, uplo, n, vl, vu, il,
916 $ iu, thresh, abstol, a, copya, z, 1, 1,
917 $ desca, win( 1+iprepad ), wnew, ifail,
918 $ iclustr, gap, iprepad, ipostpad,
919 $ work( indwork ), llwork, lsyevxsize,
920 $ iwork, isizesyevx, res, tstnrm, qtqnrm,
921 $ nout )
922
923 IF( res.NE.0 ) THEN
924 maxtstnrm =
max( tstnrm, maxtstnrm )
925 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
926 passed = 'FAILED stest11'
927 info = 1
928 END IF
929 END IF
930
931
932
933
934 IF( info.EQ.0 ) THEN
935 vl = one
936 vu = -one
937 jobz = 'V'
938 range = 'V'
939
940
941
943 $ iseed, win( 1+iprepad ), maxsize,
944 $ vecsize, valsize )
945
946 lsyevxsize = valsize
947
948 CALL pssepsubtst( .true., jobz, range, uplo, n, vl, vu, il,
949 $ iu, thresh, abstol, a, copya, z, 1, 1,
950 $ desca, win( 1+iprepad ), wnew, ifail,
951 $ iclustr, gap, iprepad, ipostpad,
952 $ work( indwork ), llwork, lsyevxsize,
953 $ iwork, isizesyevx, res, tstnrm, qtqnrm,
954 $ nout )
955
956 IF( res.NE.0 ) THEN
957 maxtstnrm =
max( tstnrm, maxtstnrm )
958 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
959 passed = 'FAILED stest12'
960 info = 1
961 END IF
962 END IF
963
964
965
966
967
968 IF( info.EQ.0 ) THEN
969 vl = one
970 vu = -one
971 jobz = 'V'
972 range = 'V'
973
974
975
977 $ iseed, win( 1+iprepad ), maxsize,
978 $ vecsize, valsize )
979
980 lsyevxsize = valsize + int(
slaran( iseed )*
981 $ real( vecsize-valsize ) )
982
983 CALL pssepsubtst( .true., jobz, range, uplo, n, vl, vu, il,
984 $ iu, thresh, abstol, a, copya, z, 1, 1,
985 $ desca, win( 1+iprepad ), wnew, ifail,
986 $ iclustr, gap, iprepad, ipostpad,
987 $ work( indwork ), llwork, lsyevxsize,
988 $ iwork, isizesyevx, res, tstnrm, qtqnrm,
989 $ nout )
990
991 IF( res.NE.0 ) THEN
992 maxtstnrm =
max( tstnrm, maxtstnrm )
993 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
994 passed = 'FAILED stest13'
995 info = 1
996 END IF
997 END IF
998 END IF
999
1000
1001
1002 CALL igamx2d( context, 'All', ' ', 1, 1, info, 1, -1, -1, -1, -1,
1003 $ -1 )
1004
1005 IF( info.EQ.1 ) THEN
1006 IF( iam.EQ.0 ) THEN
1007 WRITE( nout, fmt = 9994 )'C '
1008 WRITE( nout, fmt = 9993 )iseedin( 1 )
1009 WRITE( nout, fmt = 9992 )iseedin( 2 )
1010 WRITE( nout, fmt = 9991 )iseedin( 3 )
1011 WRITE( nout, fmt = 9990 )iseedin( 4 )
1012 IF(
lsame( uplo,
'L' ) )
THEN
1013 WRITE( nout, fmt = 9994 )' UPLO= ''L'' '
1014 ELSE
1015 WRITE( nout, fmt = 9994 )' UPLO= ''U'' '
1016 END IF
1017 IF(
lsame( subtests,
'Y' ) )
THEN
1018 WRITE( nout, fmt = 9994 )' SUBTESTS= ''Y'' '
1019 ELSE
1020 WRITE( nout, fmt = 9994 )' SUBTESTS= ''N'' '
1021 END IF
1022 WRITE( nout, fmt = 9989 )n
1023 WRITE( nout, fmt = 9988 )nprow
1024 WRITE( nout, fmt = 9987 )npcol
1025 WRITE( nout, fmt = 9986 )nb
1026 WRITE( nout, fmt = 9985 )mattype
1027 WRITE( nout, fmt = 9982 )abstol
1028 WRITE( nout, fmt = 9981 )thresh
1029 WRITE( nout, fmt = 9994 )'C '
1030 END IF
1031 END IF
1032
1033 CALL slcombine( context,
'All',
'>',
'W', 6, 1, wtime )
1034 CALL slcombine( context,
'All',
'>',
'C', 6, 1, ctime )
1035 IF( iam.EQ.0 ) THEN
1036 IF( info.EQ.0 .OR. info.EQ.1 ) THEN
1037 IF( wtime( 1 ).GE.0.0 ) THEN
1038 WRITE( nout, fmt = 9999 )n, nb, nprow, npcol, mattype,
1039 $ subtests, wtime( 1 ), ctime( 1 ), maxtstnrm,
1040 $ maxqtqnrm, passed
1041 ELSE
1042 WRITE( nout, fmt = 9998 )n, nb, nprow, npcol, mattype,
1043 $ subtests, ctime( 1 ), maxtstnrm, maxqtqnrm, passed
1044 END IF
1045 ELSE IF( info.EQ.2 ) THEN
1046 IF( wtime( 1 ).GE.0.0 ) THEN
1047 WRITE( nout, fmt = 9997 )n, nb, nprow, npcol, mattype,
1048 $ subtests, wtime( 1 ), ctime( 1 )
1049 ELSE
1050 WRITE( nout, fmt = 9996 )n, nb, nprow, npcol, mattype,
1051 $ subtests, ctime( 1 )
1052 END IF
1053 ELSE IF( info.EQ.3 ) THEN
1054 WRITE( nout, fmt = 9995 )n, nb, nprow, npcol, mattype,
1055 $ subtests
1056 END IF
1057 END IF
1058
1059
1060
1061
1062 IF(
lsame( hetero,
'N' ) .AND.
lsame( subtests,
'N' ) )
THEN
1063 passed = 'PASSED EV'
1064
1065
1066
1067
1068 IF( info.NE.0 ) THEN
1069
1070
1071
1072 passed = 'SKIPPED EV'
1073 ELSE
1074 jobz = 'N'
1075
1076 CALL pssyev( jobz, uplo, n, a, 1, 1, desca,
1077 $ work( indwork ), z, 1, 1, desca,
1078 $ work( indwork ), -1, info )
1079 minsize = int( work( indwork ) )
1080
1081 CALL pssqpsubtst( wknown, jobz, uplo, n, thresh, abstol, a,
1082 $ copya, z, 1, 1, desca, win, wnew, iprepad,
1083 $ ipostpad, work( indwork ), llwork,
1084 $ minsize, res, tstnrm, qtqnrm, nout )
1085
1086 IF( res.NE.0 ) THEN
1087 maxtstnrm =
max( tstnrm, maxtstnrm )
1088 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
1089 passed = 'FAIL EV test1'
1090 info = 1
1091 END IF
1092 END IF
1093
1094
1095
1096
1097 IF( info.EQ.0 ) THEN
1098 jobz = 'V'
1099
1100 CALL pssyev( jobz, uplo, n, a, 1, 1, desca,
1101 $ work( indwork ), z, 1, 1, desca,
1102 $ work( indwork ), -1, info )
1103 minsize = int( work( indwork ) )
1104
1105 CALL pssqpsubtst( wknown, jobz, uplo, n, thresh, abstol, a,
1106 $ copya, z, 1, 1, desca, win, wnew, iprepad,
1107 $ ipostpad, work( indwork ), llwork,
1108 $ minsize, res, tstnrm, qtqnrm, nout )
1109
1110 IF( res.NE.0 ) THEN
1111 maxtstnrm =
max( tstnrm, maxtstnrm )
1112 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
1113 passed = 'FAIL EV test2'
1114 info = 1
1115 END IF
1116 END IF
1117 IF( info.EQ.1 ) THEN
1118 IF( iam.EQ.0 ) THEN
1119 WRITE( nout, fmt = 9994 )'C '
1120 WRITE( nout, fmt = 9993 )iseedin( 1 )
1121 WRITE( nout, fmt = 9992 )iseedin( 2 )
1122 WRITE( nout, fmt = 9991 )iseedin( 3 )
1123 WRITE( nout, fmt = 9990 )iseedin( 4 )
1124 IF(
lsame( uplo,
'L' ) )
THEN
1125 WRITE( nout, fmt = 9994 )' UPLO= ''L'' '
1126 ELSE
1127 WRITE( nout, fmt = 9994 )' UPLO= ''U'' '
1128 END IF
1129 WRITE( nout, fmt = 9989 )n
1130 WRITE( nout, fmt = 9988 )nprow
1131 WRITE( nout, fmt = 9987 )npcol
1132 WRITE( nout, fmt = 9986 )nb
1133 WRITE( nout, fmt = 9985 )mattype
1134 WRITE( nout, fmt = 9982 )abstol
1135 WRITE( nout, fmt = 9981 )thresh
1136 WRITE( nout, fmt = 9994 )'C '
1137 END IF
1138 END IF
1139
1140 CALL slcombine( context,
'All',
'>',
'W', 6, 1, wtime )
1141 CALL slcombine( context,
'All',
'>',
'C', 6, 1, ctime )
1142 IF( iam.EQ.0 ) THEN
1143 IF( info.EQ.0 .OR. info.EQ.1 ) THEN
1144 IF( wtime( 1 ).GE.0.0 ) THEN
1145 WRITE( nout, fmt = 9999 )n, nb, nprow, npcol, mattype,
1146 $ subtests, wtime( 1 ), ctime( 1 ), maxtstnrm,
1147 $ maxqtqnrm, passed
1148 ELSE
1149 WRITE( nout, fmt = 9998 )n, nb, nprow, npcol, mattype,
1150 $ subtests, ctime( 1 ), maxtstnrm, maxqtqnrm,
1151 $ passed
1152 END IF
1153 ELSE IF( info.EQ.2 ) THEN
1154 IF( wtime( 1 ).GE.0.0 ) THEN
1155 WRITE( nout, fmt = 9997 )n, nb, nprow, npcol, mattype,
1156 $ subtests, wtime( 1 ), ctime( 1 )
1157 ELSE
1158 WRITE( nout, fmt = 9996 )n, nb, nprow, npcol, mattype,
1159 $ subtests, ctime( 1 )
1160 END IF
1161 ELSE IF( info.EQ.3 ) THEN
1162 WRITE( nout, fmt = 9995 )n, nb, nprow, npcol, mattype,
1163 $ subtests
1164 END IF
1165 END IF
1166 END IF
1167
1168
1169
1170
1171 IF(
lsame( hetero,
'N' ) .AND.
lsame( subtests,
'N' ) )
THEN
1172 passed = 'PASSED EVD'
1173
1174
1175
1176 IF( info.NE.0 ) THEN
1177
1178
1179
1180 passed = 'SKIPPED EVD'
1181 ELSE
1182
1183 np =
numroc( n, desca( mb_ ), 0, 0, nprow )
1184 nq =
numroc( n, desca( nb_ ), 0, 0, npcol )
1185 minsize =
max( 1+6*n+2*np*nq,
1186 $ 3*n +
max( nb*( np+1 ), 3*nb ) ) + 2*n
1187
1188 CALL pssdpsubtst( wknown, uplo, n, thresh, abstol, a,
1189 $ copya, z, 1, 1, desca, win, wnew, iprepad,
1190 $ ipostpad, work( indwork ), llwork,
1191 $ minsize, iwork, isizesyevd,
1192 $ res, tstnrm, qtqnrm, nout )
1193
1194 IF( res.NE.0 ) THEN
1195 maxtstnrm =
max( tstnrm, maxtstnrm )
1196 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
1197 passed = 'FAIL EVD test1'
1198 info = 1
1199 END IF
1200 END IF
1201 IF( info.EQ.1 ) THEN
1202 IF( iam.EQ.0 ) THEN
1203 WRITE( nout, fmt = 9994 )'C '
1204 WRITE( nout, fmt = 9993 )iseedin( 1 )
1205 WRITE( nout, fmt = 9992 )iseedin( 2 )
1206 WRITE( nout, fmt = 9991 )iseedin( 3 )
1207 WRITE( nout, fmt = 9990 )iseedin( 4 )
1208 IF(
lsame( uplo,
'L' ) )
THEN
1209 WRITE( nout, fmt = 9994 )' UPLO= ''L'' '
1210 ELSE
1211 WRITE( nout, fmt = 9994 )' UPLO= ''U'' '
1212 END IF
1213 WRITE( nout, fmt = 9989 )n
1214 WRITE( nout, fmt = 9988 )nprow
1215 WRITE( nout, fmt = 9987 )npcol
1216 WRITE( nout, fmt = 9986 )nb
1217 WRITE( nout, fmt = 9985 )mattype
1218 WRITE( nout, fmt = 9982 )abstol
1219 WRITE( nout, fmt = 9981 )thresh
1220 WRITE( nout, fmt = 9994 )'C '
1221 END IF
1222 END IF
1223
1224 CALL slcombine( context,
'All',
'>',
'W', 6, 1, wtime )
1225 CALL slcombine( context,
'All',
'>',
'C', 6, 1, ctime )
1226 IF( iam.EQ.0 ) THEN
1227 IF( info.EQ.0 .OR. info.EQ.1 ) THEN
1228 IF( wtime( 1 ).GE.0.0 ) THEN
1229 WRITE( nout, fmt = 9999 )n, nb, nprow, npcol, mattype,
1230 $ subtests, wtime( 1 ), ctime( 1 ), tstnrm,
1231 $ qtqnrm, passed
1232 ELSE
1233 WRITE( nout, fmt = 9998 )n, nb, nprow, npcol, mattype,
1234 $ subtests, ctime( 1 ), maxtstnrm, maxqtqnrm,
1235 $ passed
1236 END IF
1237 ELSE IF( info.EQ.2 ) THEN
1238 IF( wtime( 1 ).GE.0.0 ) THEN
1239 WRITE( nout, fmt = 9997 )n, nb, nprow, npcol, mattype,
1240 $ subtests, wtime( 1 ), ctime( 1 )
1241 ELSE
1242 WRITE( nout, fmt = 9996 )n, nb, nprow, npcol, mattype,
1243 $ subtests, ctime( 1 )
1244 END IF
1245 ELSE IF( info.EQ.3 ) THEN
1246 WRITE( nout, fmt = 9995 )n, nb, nprow, npcol, mattype,
1247 $ subtests
1248 END IF
1249 END IF
1250 END IF
1251 RETURN
1252 9999 FORMAT( 1x, i5, 1x, i3, 1x, i3, 1x, i3, 1x, i3, 3x, a1, 1x,
1253 $ f8.2, 1x, f8.2, 1x, g9.2, 1x, g9.2, 1x, a14 )
1254 9998 FORMAT( 1x, i5, 1x, i3, 1x, i3, 1x, i3, 1x, i3, 3x, a1, 1x, 8x,
1255 $ 1x, f8.2, 1x, g9.2, 1x, g9.2, a14 )
1256 9997 FORMAT( 1x, i5, 1x, i3, 1x, i3, 1x, i3, 1x, i3, 3x, a1, 1x, f8.2,
1257 $ 1x, f8.2, 21x, 'Bypassed' )
1258 9996 FORMAT( 1x, i5, 1x, i3, 1x, i3, 1x, i3, 1x, i3, 3x, a1, 1x, 8x,
1259 $ 1x, f8.2, 21x, 'Bypassed' )
1260 9995 FORMAT( 1x, i5, 1x, i3, 1x, i3, 1x, i3, 1x, i3, 3x, a1, 32x,
1261 $ 'Bad MEMORY parameters' )
1262 9994 FORMAT( a )
1263 9993 FORMAT( ' ISEED( 1 ) =', i8 )
1264 9992 FORMAT( ' ISEED( 2 ) =', i8 )
1265 9991 FORMAT( ' ISEED( 3 ) =', i8 )
1266 9990 FORMAT( ' ISEED( 4 ) =', i8 )
1267 9989 FORMAT( ' N=', i8 )
1268 9988 FORMAT( ' NPROW=', i8 )
1269 9987 FORMAT( ' NPCOL=', i8 )
1270 9986 FORMAT( ' NB=', i8 )
1271 9985 FORMAT( ' MATTYPE=', i8 )
1272 9984 FORMAT( ' IBTYPE=', i8 )
1273 9983 FORMAT( ' SUBTESTS=', a1 )
1274 9982 FORMAT( ' ABSTOL=', d16.6 )
1275 9981 FORMAT( ' THRESH=', d16.6 )
1276 9980 FORMAT( ' Increase TOTMEM in PSSEPDRIVER' )
1277
1278
1279
subroutine psmatgen(ictxt, aform, diag, m, n, mb, nb, a, lda, iarow, iacol, iseed, iroff, irnum, icoff, icnum, myrow, mycol, nprow, npcol)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
real function pslamch(ictxt, cmach)
subroutine pslaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pschekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine pselset(a, ia, ja, desca, alpha)
subroutine psfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine pslasizesqp(desca, iprepad, ipostpad, sizemqrleft, sizemqrright, sizeqrf, sizetms, sizeqtq, sizechk, sizesyevx, isizesyevx, sizesyev, sizesyevd, isizesyevd, sizesubtst, isizesubtst, sizetst, isizetst)
subroutine pslasizesyevx(wknown, range, n, desca, vl, vu, il, iu, iseed, win, maxsize, vecsize, valsize)
subroutine pslatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, ia, ja, desca, order, work, lwork, info)
subroutine pssdpsubtst(wknown, uplo, n, thresh, abstol, a, copya, z, ia, ja, desca, win, wnew, iprepad, ipostpad, work, lwork, lwork1, iwork, liwork, result, tstnrm, qtqnrm, nout)
subroutine pssepsubtst(wknown, jobz, range, uplo, n, vl, vu, il, iu, thresh, abstol, a, copya, z, ia, ja, desca, win, wnew, ifail, iclustr, gap, iprepad, ipostpad, work, lwork, lwork1, iwork, liwork, result, tstnrm, qtqnrm, nout)
subroutine pssqpsubtst(wknown, jobz, uplo, n, thresh, abstol, a, copya, z, ia, ja, desca, win, wnew, iprepad, ipostpad, work, lwork, lwork1, result, tstnrm, qtqnrm, nout)
subroutine pssyev(jobz, uplo, n, a, ia, ja, desca, w, z, iz, jz, descz, work, lwork, info)
real function slaran(iseed)
subroutine slatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)