1 SUBROUTINE psseprtst(DESCA, UPLO, N, MATTYPE, SUBTESTS, THRESH,
2 $ ORDER, ABSTOL, ISEED, A, COPYA, Z, LDA, WIN,
3 $ WNEW, IFAIL, ICLUSTR, GAP, IPREPAD, IPOSTPAD,
5 $ IWORK, LIWORK, HETERO, NOUT, INFO )
15 CHARACTER HETERO, SUBTESTS, UPLO
16 INTEGER INFO, IPOSTPAD, IPREPAD, LDA, LIWORK, LWORK,
17 $ MATTYPE, N, NOUT, ORDER
21 INTEGER DESCA( * ), ICLUSTR( * ), IFAIL( * ),
22 $ iseed( 4 ), iwork( * )
23 REAL A( LDA, * ), COPYA( LDA, * ), GAP( * ),
24 $ WIN( * ), WNEW( * ), WORK( * ), Z( LDA, * )
190 INTEGER CTXT_, MB_, NB_, RSRC_, CSRC_, LLD_
191 PARAMETER ( CTXT_ = 2, mb_ = 5, nb_ = 6,
192 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
193 REAL HALF, ONE, TEN, ZERO
194 parameter( zero = 0.0e0, one = 1.0e0,
195 $ ten = 10.0e0, half = 0.5e0 )
197 parameter( padval = 19.25e0 )
199 PARAMETER ( MAXTYP = 22 )
204 CHARACTER JOBZ, RANGE
206 INTEGER CONTEXT, I, IAM, IHETERO, IINFO, IL, IMODE, IN,
207 $ indd, indwork, isizesubtst, isizeevr,
208 $ isizetst, itype, iu, j, llwork, levrsize,
209 $ maxsize, mycol, myrow, nb, ngen, nloc,
210 $ nnodes, np, npcol, nprow, nq, res, sizechk,
211 $ sizemqrleft, sizemqrright, sizeqrf, sizeqtq,
212 $ sizesubtst, sizeevr, sizetms,
213 $ sizetst, valsize, vecsize
214 REAL ANINV, ANORM, COND, MAXQTQNRM, MAXTSTNRM, OVFL,
215 $ QTQNRM, RTOVFL, RTUNFL, TEMP1, TSTNRM, ULP,
219 INTEGER ISEEDIN( 4 ), KMAGN( MAXTYP ), KMODE( MAXTYP ),
221 DOUBLE PRECISION CTIME( 10 ), WTIME( 10 )
227 EXTERNAL SLARAN, LSAME, NUMROC, PSLAMCH
237 INTRINSIC abs, real, int,
max,
min, sqrt
240 DATA ktype / 1, 2, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 8,
241 $ 8, 8, 9, 9, 9, 9, 9, 10, 11 /
242 DATA kmagn / 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
243 $ 2, 3, 1, 1, 1, 2, 3, 1, 1 /
244 DATA kmode / 0, 0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
245 $ 0, 0, 4, 3, 1, 4, 4, 3, 0 /
250 passed =
'PASSED EVR'
251 context = desca( ctxt_ )
254 CALL blacs_pinfo( iam, nnodes )
260 IF( lsame( hetero,
'Y' ) )
THEN
265 CALL igebs2d( context,
'All',
' ', 1, 1, ihetero, 1 )
267 CALL igebr2d( context,
'All',
' ', 1, 1, ihetero, 1, 0, 0 )
269 IF( ihetero.EQ.2 )
THEN
277 CALL pslasizesepr( desca, iprepad, ipostpad, sizemqrleft,
278 $ sizemqrright, sizeqrf, sizetms, sizeqtq,
279 $ sizechk, sizeevr, isizeevr,
281 $ isizesubtst, sizetst, isizetst )
282 IF( lwork.LT.sizetst )
THEN
286 CALL igamx2d( context,
'a',
' ', 1, 1, info, 1, 1, 1, -1, -1, 0 )
292 llwork = lwork - indwork + 1
294 ulp = pslamch( context,
'P' )
296 unfl = pslamch( context,
'Safe min' )
299 rtunfl = sqrt( unfl )
300 rtovfl = sqrt( ovfl )
301 aninv = one / real(
max( 1, n ) )
305 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
THEN
306 CALL igebs2d( context,
'a',
' ', 4, 1, iseed, 4 )
308 CALL igebr2d( context,
'a',
' ', 4, 1, iseed, 4, 0, 0 )
310 iseedin( 1 ) = iseed( 1 )
311 iseedin( 2 ) = iseed( 2 )
312 iseedin( 3 ) = iseed( 3 )
313 iseedin( 4 ) = iseed( 4 )
332 itype = ktype( mattype )
333 imode = kmode( mattype )
337 GO TO ( 10, 20, 30 )kmagn( mattype )
344 anorm = ( rtovfl*ulp )*aninv
348 anorm = rtunfl*n*ulpinv
352 IF( mattype.LE.15 )
THEN
355 cond = ulpinv*aninv / ten
360 IF( itype.EQ.1 )
THEN
365 work( indd+i-1 ) = zero
367 CALL pslaset(
'All', n, n, zero, zero, copya, 1, 1, desca )
370 ELSE IF( itype.EQ.2 )
THEN
375 work( indd+i-1 ) = one
377 CALL pslaset(
'All', n, n, zero, one, copya, 1, 1, desca )
380 ELSE IF( itype.EQ.4 )
THEN
384 CALL psfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
385 $ sizetms, iprepad, ipostpad, padval+1.0e0 )
387 CALL pslatms( n, n,
'S', iseed,
'S', work( indd ), imode,
388 $ cond, anorm, 0, 0,
'N', copya, 1, 1, desca,
389 $ order, work( indwork+iprepad ), sizetms,
393 CALL pschekpad( desca( ctxt_ ),
'PSLATMS1-WORK', sizetms, 1,
394 $ work( indwork ), sizetms, iprepad, ipostpad,
397 ELSE IF( itype.EQ.5 )
THEN
401 CALL psfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
402 $ sizetms, iprepad, ipostpad, padval+2.0e0 )
404 CALL pslatms( n, n,
'S', iseed,
'S', work( indd ), imode,
405 $ cond, anorm, n, n,
'N', copya, 1, 1, desca,
406 $ order, work( indwork+iprepad ), sizetms,
409 CALL pschekpad( desca( ctxt_ ),
'PSLATMS2-WORK', sizetms, 1,
410 $ work( indwork ), sizetms, iprepad, ipostpad,
415 ELSE IF( itype.EQ.8 )
THEN
419 np = numroc( n, desca( mb_ ), myrow, 0, nprow )
420 nq = numroc( n, desca( nb_ ), mycol, 0, npcol )
421 CALL psmatgen( desca( ctxt_ ),
'S',
'N', n, n, desca( mb_ ),
422 $ desca( nb_ ), copya, desca( lld_ ),
423 $ desca( rsrc_ ), desca( csrc_ ), iseed( 1 ),
424 $ 0, np, 0, nq, myrow, mycol, nprow, npcol )
428 ELSE IF( itype.EQ.9 )
THEN
432 CALL psfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
433 $ sizetms, iprepad, ipostpad, padval+3.0e0 )
435 CALL pslatms( n, n,
'S', iseed,
'S', work( indd ), imode,
436 $ cond, anorm, n, n,
'N', copya, 1, 1, desca,
437 $ order, work( indwork+iprepad ), sizetms,
442 CALL pschekpad( desca( ctxt_ ),
'PSLATMS3-WORK', sizetms, 1,
443 $ work( indwork ), sizetms, iprepad, ipostpad,
446 ELSE IF( itype.EQ.10 )
THEN
451 CALL pslaset(
'All', n, n, zero, zero, copya, 1, 1, desca )
452 np = numroc( n, desca( mb_ ), 0, 0, nprow )
453 nq = numroc( n, desca( nb_ ), 0, 0, npcol )
459 in =
min( 1+int( slaran( iseed )*real( nloc ) ), n-ngen )
461 CALL slatms( in, in, 's
', ISEED, 'p
', WORK( INDD ),
462 $ IMODE, COND, ANORM, 1, 1, 'n
', A, LDA,
463 $ WORK( INDWORK ), IINFO )
466 TEMP1 = ABS( A( I-1, I ) ) /
467 $ SQRT( ABS( A( I-1, I-1 )*A( I, I ) ) )
468.GT.
IF( TEMP1HALF ) THEN
469 A( I-1, I ) = HALF*SQRT( ABS( A( I-1, I-1 )*A( I,
471 A( I, I-1 ) = A( I-1, I )
474 CALL PSELSET( COPYA, NGEN+1, NGEN+1, DESCA, A( 1, 1 ) )
476 CALL PSELSET( COPYA, NGEN+I, NGEN+I, DESCA,
478 CALL PSELSET( COPYA, NGEN+I-1, NGEN+I, DESCA,
480 CALL PSELSET( COPYA, NGEN+I, NGEN+I-1, DESCA,
488.EQ.
ELSE IF( ITYPE11 ) THEN
497 IN = MIN( J, N-NGEN )
499 WORK( INDD+NGEN+I ) = TEMP1
507 CALL PSFILLPAD( DESCA( CTXT_ ), SIZETMS, 1, WORK( INDWORK ),
508 $ SIZETMS, IPREPAD, IPOSTPAD, PADVAL+4.0E0 )
510 CALL PSLATMS( N, N, 's
', ISEED, 's
', WORK( INDD ), IMODE,
511 $ COND, ANORM, 0, 0, 'n
', COPYA, 1, 1, DESCA,
512 $ ORDER, WORK( INDWORK+IPREPAD ), SIZETMS,
515 CALL PSCHEKPAD( DESCA( CTXT_ ), 'pslatms4-work
', SIZETMS, 1,
516 $ WORK( INDWORK ), SIZETMS, IPREPAD, IPOSTPAD,
524 $ CALL SLASRT( 'i
', N, WORK( INDD ), IINFO )
526 CALL PSLASIZESYEVR( WKNOWN, 'a
', N, DESCA, VL, VU, IL, IU,
527 $ ISEED, WORK( INDD ), MAXSIZE, VECSIZE,
529 LEVRSIZE = MIN( MAXSIZE, LLWORK )
531 CALL PSSEPRSUBTST( WKNOWN, 'v
', 'a
', UPLO, N, VL, VU, IL, IU,
532 $ THRESH, ABSTOL, A, COPYA, Z, 1, 1, DESCA,
533 $ WORK( INDD ), WIN, IFAIL, ICLUSTR, GAP,
534 $ IPREPAD, IPOSTPAD, WORK( INDWORK ), LLWORK,
535 $ LEVRSIZE, IWORK, ISIZEEVR, RES, TSTNRM,
541.LE.
IF( THRESHZERO ) THEN
544.NE.
ELSE IF( RES0 ) THEN
550.GT..AND.
IF( THRESHZERO LSAME( SUBTESTS, 'y
' ) ) THEN
558 CALL PSLASIZESYEVR( .TRUE., RANGE, N, DESCA, VL, VU, IL, IU,
559 $ ISEED, WIN( 1+IPREPAD ), MAXSIZE,
564 CALL PSSEPRSUBTST( .TRUE., JOBZ, RANGE, UPLO, N, VL, VU, IL,
565 $ IU, THRESH, ABSTOL, A, COPYA, Z, 1, 1,
566 $ DESCA, WIN( 1+IPREPAD ), WNEW, IFAIL,
567 $ ICLUSTR, GAP, IPREPAD, IPOSTPAD,
568 $ WORK( INDWORK ), LLWORK, LEVRSIZE,
569 $ IWORK, ISIZEEVR, RES, TSTNRM, QTQNRM,
573 MAXTSTNRM = MAX( TSTNRM, MAXTSTNRM )
574 MAXQTQNRM = MAX( QTQNRM, MAXQTQNRM )
575 PASSED = 'failed
stest 1
'
591 CALL PSLASIZESYEVR( .TRUE., RANGE, N, DESCA, VL, VU, IL, IU,
592 $ ISEED, WIN( 1+IPREPAD ), MAXSIZE,
597 CALL PSSEPRSUBTST( .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, LEVRSIZE,
602 $ IWORK, ISIZEEVR, RES, TSTNRM, QTQNRM,
606 MAXTSTNRM = MAX( TSTNRM, MAXTSTNRM )
607 MAXQTQNRM = MAX( QTQNRM, MAXQTQNRM )
608 PASSED = 'failed
stest 2
'
623 CALL PSLASIZESYEVR( .TRUE., RANGE, N, DESCA, VL, VU, IL, IU,
624 $ ISEED, WIN( 1+IPREPAD ), MAXSIZE,
629 CALL PSSEPRSUBTST( .TRUE., JOBZ, RANGE, UPLO, N, VL, VU, IL,
630 $ IU, THRESH, ABSTOL, A, COPYA, Z, 1, 1,
631 $ DESCA, WIN( 1+IPREPAD ), WNEW, IFAIL,
632 $ ICLUSTR, GAP, IPREPAD, IPOSTPAD,
633 $ WORK( INDWORK ), LLWORK, LEVRSIZE,
634 $ IWORK, ISIZEEVR, RES, TSTNRM, QTQNRM,
638 MAXTSTNRM = MAX( TSTNRM, MAXTSTNRM )
639 MAXQTQNRM = MAX( QTQNRM, MAXQTQNRM )
640 PASSED = 'failed
stest 3
'
655 CALL PSLASIZESYEVR( .TRUE., RANGE, N, DESCA, VL, VU, IL, IU,
656 $ ISEED, WIN( 1+IPREPAD ), MAXSIZE,
661 CALL PSSEPRSUBTST( .TRUE., JOBZ, RANGE, UPLO, N, VL, VU, IL,
662 $ IU, THRESH, ABSTOL, A, COPYA, Z, 1, 1,
663 $ DESCA, WIN( 1+IPREPAD ), WNEW, IFAIL,
664 $ ICLUSTR, GAP, IPREPAD, IPOSTPAD,
665 $ WORK( INDWORK ), LLWORK, LEVRSIZE,
666 $ IWORK, ISIZEEVR, RES, TSTNRM, QTQNRM,
670 MAXTSTNRM = MAX( TSTNRM, MAXTSTNRM )
671 MAXQTQNRM = MAX( QTQNRM, MAXQTQNRM )
672 PASSED = 'failed
stest 4
'
687 CALL PSLASIZESYEVR( .TRUE., RANGE, N, DESCA, VL, VU, IL, IU,
688 $ ISEED, WIN( 1+IPREPAD ), MAXSIZE,
693 CALL PSSEPRSUBTST( .TRUE., JOBZ, RANGE, UPLO, N, VL, VU, IL,
694 $ IU, THRESH, ABSTOL, A, COPYA, Z, 1, 1,
695 $ DESCA, WIN( 1+IPREPAD ), WNEW, IFAIL,
696 $ ICLUSTR, GAP, IPREPAD, IPOSTPAD,
697 $ WORK( INDWORK ), LLWORK, LEVRSIZE,
698 $ IWORK, ISIZEEVR, RES, TSTNRM, QTQNRM,
702 MAXTSTNRM = MAX( TSTNRM, MAXTSTNRM )
703 MAXQTQNRM = MAX( QTQNRM, MAXQTQNRM )
704 PASSED = 'failed
stest 5
'
710 CALL IGAMX2D( CONTEXT, 'all
', ' ', 1, 1, INFO, 1, -1, -1, -1, -1,
713.EQ..AND.
IF( IAM0 .FALSE. ) THEN
714 WRITE( NOUT, FMT = 9994 )'c
'
715 WRITE( NOUT, FMT = 9993 )ISEEDIN( 1 )
716 WRITE( NOUT, FMT = 9992 )ISEEDIN( 2 )
717 WRITE( NOUT, FMT = 9991 )ISEEDIN( 3 )
718 WRITE( NOUT, FMT = 9990 )ISEEDIN( 4 )
719 IF( LSAME( UPLO, 'l
' ) ) THEN
720 WRITE( NOUT, FMT = 9994 )' uplo=
''l
'' '
722 WRITE( NOUT, FMT = 9994 )' uplo=
''u
'' '
724 IF( LSAME( SUBTESTS, 'y
' ) ) THEN
725 WRITE( NOUT, FMT = 9994 )' subtests=
''y
'' '
727 WRITE( NOUT, FMT = 9994 )' subtests=
''n
'' '
729 WRITE( NOUT, FMT = 9989 )N
730 WRITE( NOUT, FMT = 9988 )NPROW
731 WRITE( NOUT, FMT = 9987 )NPCOL
732 WRITE( NOUT, FMT = 9986 )NB
733 WRITE( NOUT, FMT = 9985 )MATTYPE
734 WRITE( NOUT, FMT = 9982 )ABSTOL
735 WRITE( NOUT, FMT = 9981 )THRESH
736 WRITE( NOUT, FMT = 9994 )'c
'
740 CALL SLCOMBINE( CONTEXT, 'all
', '>
', 'w
', 6, 1, WTIME )
741 CALL SLCOMBINE( CONTEXT, 'all
', '>
', 'c
', 6, 1, CTIME )
743.EQ..OR..EQ.
IF( INFO0 INFO1 ) THEN
744.GE.
IF( WTIME( 1 )0.0 ) THEN
745 WRITE( NOUT, FMT = 9999 )N, NB, NPROW, NPCOL, MATTYPE,
746 $ SUBTESTS, WTIME( 1 ), CTIME( 1 ), MAXTSTNRM,
749 WRITE( NOUT, FMT = 9998 )N, NB, NPROW, NPCOL, MATTYPE,
750 $ SUBTESTS, CTIME( 1 ), MAXTSTNRM, MAXQTQNRM, PASSED
752.EQ.
ELSE IF( INFO2 ) THEN
753.GE.
IF( WTIME( 1 )0.0 ) THEN
754 WRITE( NOUT, FMT = 9997 )N, NB, NPROW, NPCOL, MATTYPE,
755 $ SUBTESTS, WTIME( 1 ), CTIME( 1 )
757 WRITE( NOUT, FMT = 9996 )N, NB, NPROW, NPCOL, MATTYPE,
758 $ SUBTESTS, CTIME( 1 )
760.EQ.
ELSE IF( INFO3 ) THEN
761 WRITE( NOUT, FMT = 9995 )N, NB, NPROW, NPCOL, MATTYPE,
769 9999 FORMAT( 1X, I5, 1X, I3, 1X, I3, 1X, I3, 1X, I3, 3X, A1, 1X,
770 $ F8.2, 1X, F8.2, 1X, G9.2, 1X, G9.2, 1X, A14 )
771 9998 FORMAT( 1X, I5, 1X, I3, 1X, I3, 1X, I3, 1X, I3, 3X, A1, 1X, 8X,
772 $ 1X, F8.2, 1X, G9.2, 1X, G9.2, A14 )
773 9997 FORMAT( 1X, I5, 1X, I3, 1X, I3, 1X, I3, 1X, I3, 3X, A1, 1X, F8.2,
774 $ 1X, F8.2, 21X, 'bypassed
' )
775 9996 FORMAT( 1X, I5, 1X, I3, 1X, I3, 1X, I3, 1X, I3, 3X, A1, 1X, 8X,
776 $ 1X, F8.2, 21X, 'bypassed
' )
777 9995 FORMAT( 1X, I5, 1X, I3, 1X, I3, 1X, I3, 1X, I3, 3X, A1, 32X,
778 $ 'bad memory parameters
' )
780 9993 FORMAT( ' iseed( 1 ) =
', I8 )
781 9992 FORMAT( ' iseed( 2 ) =
', I8 )
782 9991 FORMAT( ' iseed( 3 ) =
', I8 )
783 9990 FORMAT( ' iseed( 4 ) =
', I8 )
784 9989 FORMAT( ' n=
', I8 )
785 9988 FORMAT( ' nprow=
', I8 )
786 9987 FORMAT( ' npcol=
', I8 )
787 9986 FORMAT( ' nb=
', I8 )
788 9985 FORMAT( ' mattype=
', I8 )
791 9982 FORMAT( ' abstol=
', D16.6 )
792 9981 FORMAT( ' thresh=
', D16.6 )