1 SUBROUTINE pzseprtst(DESCA, UPLO, N, MATTYPE, SUBTESTS, THRESH,
2 $ ORDER, ABSTOL, ISEED, A, COPYA, Z, LDA, WIN,
3 $ WNEW, IFAIL, ICLUSTR, GAP, IPREPAD, IPOSTPAD,
4 $ WORK, LWORK, RWORK, LRWORK,
5 $ IWORK, LIWORK, HETERO, NOUT, INFO )
15 CHARACTER HETERO, SUBTESTS, UPLO
16 INTEGER INFO, IPOSTPAD, IPREPAD, LDA, LIWORK, LWORK,
17 $ MATTYPE, N, NOUT, ORDER
19 DOUBLE PRECISION ABSTOL, THRESH
22 INTEGER DESCA( * ), ICLUSTR( * ), IFAIL( * ),
23 $ iseed( 4 ), iwork( * )
24 DOUBLE PRECISION ( * ), WIN( * ), WNEW( * ), RWORK( * )
25 COMPLEX*16 A( LDA, * ), COPYA( LDA, * ),
26 $ work( * ), z( lda, * )
198 INTEGER CTXT_, MB_, NB_, RSRC_, CSRC_, LLD_
199 PARAMETER ( CTXT_ = 2, mb_ = 5, nb_ = 6,
200 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
201 DOUBLE PRECISION HALF, ONE, TEN, ZERO
202 parameter( zero = 0.0d0, one = 1.0d0,
203 $ ten = 10.0d0, half = 0.5d0 )
205 parameter( padval = ( 19.25d0, 1.1d1 ) )
207 PARAMETER ( ZZERO = ( 0.0d0, 0.0d0 ) )
209 parameter( zone = ( 1.0d0, 0.0d0 ) )
211 parameter( maxtyp = 22 )
216 CHARACTER JOBZ, RANGE
218 INTEGER CONTEXT, I, IAM, IHETERO, IINFO, IL, IMODE, IN,
219 $ indd, indwork, isizesubtst, isizeevr,
220 $ isizetst, itype, iu, j, llwork, levrsize,
221 $ maxsize, mycol, myrow, nb, ngen, nloc,
222 $ nnodes, np, npcol, nprow, nq, res, sizechk,
223 $ sizemqrleft, sizemqrright, sizeqrf, sizeqtq,
224 $ sizesubtst, sizeevr, sizetms,
225 $ sizetst, valsize, vecsize
226 INTEGER INDRWORK, LLRWORK, RSIZEEVR, RSIZESUBTST,
228 DOUBLE PRECISION ANINV, ANORM, COND, MAXQTQNRM, MAXTSTNRM, OVFL,
229 $ QTQNRM, RTOVFL, RTUNFL, TEMP1, TSTNRM, ULP,
230 $ ulpinv, unfl, vl, vu
233 INTEGER ISEEDIN( 4 ), KMAGN( MAXTYP ), KMODE( MAXTYP ),
235 DOUBLE PRECISION CTIME( 10 ), WTIME( 10 )
240 DOUBLE PRECISION DLARAN, PDLAMCH
241 EXTERNAL DLARAN, LSAME, , PDLAMCH
251 INTRINSIC abs, dble, int,
max,
min, sqrt
254 DATA ktype / 1, 2, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 8,
255 $ 8, 8, 9, 9, 9, 9, 9, 10, 11 /
256 DATA kmagn / 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 2, 3, 1,
257 $ 2, 3, 1, 1, 1, 2, 3, 1, 1
258 DATA kmode / 0, 0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
259 $ 0, 0, 4, 3, 1, 4, 4, 3, 0 /
264 passed =
'PASSED EVR'
265 context = desca( ctxt_ )
268 CALL blacs_pinfo( iam, nnodes )
274 IF( lsame( hetero,
'Y' ) )
THEN
279 CALL igebs2d( context,
'All',
' ', 1, 1, ihetero, 1 )
281 CALL igebr2d( context,
'All',
' ', 1, 1, ihetero, 1, 0, 0 )
283 IF( ihetero.EQ.2 )
THEN
291 CALL pzlasizesepr( desca, iprepad, ipostpad, sizemqrleft,
292 $ sizemqrright, sizeqrf, sizetms, sizeqtq,
293 $ sizechk, sizeevr, rsizeevr, isizeevr,
294 $ sizesubtst, rsizesubtst,
295 $ isizesubtst, sizetst, rsizetst, isizetst )
296 IF( lrwork.LT.rsizetst )
THEN
300 CALL igamx2d( context,
'a',
' ', 1, 1, info, 1, 1, 1, -1, -1, 0 )
307 llwork = lwork - indwork + 1
308 llrwork = lrwork - indrwork + 1
310 ulp = pdlamch( context,
'P' )
312 unfl = pdlamch( context,
'Safe min' )
315 rtunfl = sqrt( unfl )
316 rtovfl = sqrt( ovfl )
317 aninv = one / dble(
max( 1, n ) )
321 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
THEN
322 CALL igebs2d( context,
'a',
' ', 4, 1, iseed, 4 )
324 CALL igebr2d( context,
'a',
' ', 4, 1, iseed, 4, 0, 0 )
326 iseedin( 1 ) = iseed( 1 )
327 iseedin( 2 ) = iseed( 2 )
328 iseedin( 3 ) = iseed( 3 )
329 iseedin( 4 ) = iseed( 4 )
348 itype = ktype( mattype )
349 imode = kmode( mattype )
353 GO TO ( 10, 20, 30 )kmagn( mattype )
360 anorm = ( rtovfl*ulp )*aninv
364 anorm = rtunfl*n*ulpinv
368 IF( mattype.LE.15 )
THEN
371 cond = ulpinv*aninv / ten
376 IF( itype.EQ.1 )
THEN
381 rwork( indd+i-1 ) = zero
383 CALL pzlaset(
'All', n, n,zzero,zzero, copya, 1, 1, desca )
386 ELSE IF( itype.EQ.2 )
THEN
391 rwork( indd+i-1 ) = one
393 CALL pzlaset(
'All', n, n,zzero,zone, copya, 1, 1, desca )
396 ELSE IF( itype.EQ.4 )
THEN
400 CALL pzfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
401 $ sizetms, iprepad, ipostpad, padval+1.0d0 )
403 CALL pzlatms( n, n,
'S', iseed,
'S',rwork( indd ), imode,
404 $ cond, anorm, 0, 0, 'n
', COPYA, 1, 1, DESCA,
405 $ ORDER, WORK( INDWORK+IPREPAD ), SIZETMS,
409 CALL PZCHEKPAD( DESCA( CTXT_ ), 'pzlatms1-work
', SIZETMS, 1,
410 $ WORK( INDWORK ), SIZETMS, IPREPAD, IPOSTPAD,
413.EQ.
ELSE IF( ITYPE5 ) THEN
417 CALL PZFILLPAD( DESCA( CTXT_ ), SIZETMS, 1, WORK( INDWORK ),
418 $ SIZETMS, IPREPAD, IPOSTPAD, PADVAL+2.0D0 )
420 CALL PZLATMS( N, N, 's
', ISEED, 's
',RWORK( INDD ), IMODE,
421 $ COND, ANORM, N, N, 'n
', COPYA, 1, 1, DESCA,
422 $ ORDER, WORK( INDWORK+IPREPAD ), SIZETMS,
425 CALL PZCHEKPAD( DESCA( CTXT_ ), 'pzlatms2-work
', SIZETMS, 1,
426 $ WORK( INDWORK ), SIZETMS, IPREPAD, IPOSTPAD,
431.EQ.
ELSE IF( ITYPE8 ) THEN
435 NP = NUMROC( N, DESCA( MB_ ), MYROW, 0, NPROW )
436 NQ = NUMROC( N, DESCA( NB_ ), MYCOL, 0, NPCOL )
437 CALL PZMATGEN( DESCA( CTXT_ ), 'h
', 'n
', N, N, DESCA( MB_ ),
438 $ DESCA( NB_ ), COPYA, DESCA( LLD_ ),
439 $ DESCA( RSRC_ ), DESCA( CSRC_ ), ISEED( 1 ),
440 $ 0, NP, 0, NQ, MYROW, MYCOL, NPROW, NPCOL )
444.EQ.
ELSE IF( ITYPE9 ) THEN
448 CALL PZFILLPAD( DESCA( CTXT_ ), SIZETMS, 1, WORK( INDWORK ),
449 $ SIZETMS, IPREPAD, IPOSTPAD, PADVAL+3.0D0 )
451 CALL PZLATMS( N, N, 's
', ISEED, 's
',RWORK( INDD ), IMODE,
452 $ COND, ANORM, N, N, 'n
', COPYA, 1, 1, DESCA,
453 $ ORDER, WORK( INDWORK+IPREPAD ), SIZETMS,
458 CALL PZCHEKPAD( DESCA( CTXT_ ), 'pzlatms3-work
', SIZETMS, 1,
459 $ WORK( INDWORK ), SIZETMS, IPREPAD, IPOSTPAD,
462.EQ.
ELSE IF( ITYPE10 ) THEN
467 CALL PZLASET( 'all
', N, N,ZZERO,ZZERO, COPYA, 1, 1, DESCA )
468 NP = NUMROC( N, DESCA( MB_ ), 0, 0, NPROW )
469 NQ = NUMROC( N, DESCA( NB_ ), 0, 0, NPCOL )
475 IN = MIN( 1+INT( DLARAN( ISEED )*DBLE( NLOC ) ), N-NGEN )
477 CALL ZLATMS( IN, IN, 's
', ISEED, 'p
',RWORK( INDD ),
478 $ IMODE, COND, ANORM, 1, 1, 'n
', A, LDA,
479 $ WORK( INDWORK ), IINFO )
482 TEMP1 = ABS( A( I-1, I ) ) /
483 $ SQRT( ABS( A( I-1, I-1 )*A( I, I ) ) )
484.GT.
IF( TEMP1HALF ) THEN
485 A( I-1, I ) = HALF*SQRT( ABS( A( I-1, I-1 )*A( I,
487 A( I, I-1 ) = A( I-1, I )
490 CALL PZELSET( COPYA, NGEN+1, NGEN+1, DESCA, A( 1, 1 ) )
492 CALL PZELSET( COPYA, NGEN+I, NGEN+I, DESCA,
494 CALL PZELSET( COPYA, NGEN+I-1, NGEN+I, DESCA,
496 CALL PZELSET( COPYA, NGEN+I, NGEN+I-1, DESCA,
504.EQ.
ELSE IF( ITYPE11 ) THEN
513 IN = MIN( J, N-NGEN )
515 RWORK( INDD+NGEN+I ) = TEMP1
523 CALL PZFILLPAD( DESCA( CTXT_ ), SIZETMS, 1, WORK( INDWORK ),
524 $ SIZETMS, IPREPAD, IPOSTPAD, PADVAL+4.0D0 )
526 CALL PZLATMS( N, N, 's
', ISEED, 's
',RWORK( INDD ), IMODE,
527 $ COND, ANORM, 0, 0, 'n
', COPYA, 1, 1, DESCA,
528 $ ORDER, WORK( INDWORK+IPREPAD ), SIZETMS,
531 CALL PZCHEKPAD( DESCA( CTXT_ ), 'pzlatms4-work
', SIZETMS, 1,
532 $ WORK( INDWORK ), SIZETMS, IPREPAD, IPOSTPAD,
540 $ CALL DLASRT( 'i
', N,RWORK( INDD ), IINFO )
542 CALL PZLASIZEHEEVR( WKNOWN, 'a
', N, DESCA, VL, VU, IL, IU,
543 $ ISEED,RWORK( INDD ), MAXSIZE, VECSIZE,
545 LEVRSIZE = MIN( MAXSIZE, LLRWORK )
547 CALL PZSEPRSUBTST( WKNOWN, 'v
', 'a
', UPLO, N, VL, VU, IL, IU,
548 $ THRESH, ABSTOL, A, COPYA, Z, 1, 1, DESCA,
549 $ RWORK( INDD ), WIN, IFAIL, ICLUSTR, GAP,
550 $ IPREPAD, IPOSTPAD, WORK( INDWORK ), LLWORK,
551 $ RWORK( INDRWORK ), LLRWORK,
552 $ LEVRSIZE, IWORK, ISIZEEVR, RES, TSTNRM,
558.LE.
IF( THRESHZERO ) THEN
561.NE.
ELSE IF( RES0 ) THEN
567.GT..AND.
IF( THRESHZERO LSAME( SUBTESTS, 'y
' ) ) THEN
575 CALL PZLASIZEHEEVR( .TRUE., RANGE, N, DESCA, VL, VU, IL, IU,
576 $ ISEED, WIN( 1+IPREPAD ), MAXSIZE,
581 CALL PZSEPRSUBTST( .TRUE., JOBZ, RANGE, UPLO, N, VL, VU, IL,
582 $ IU, THRESH, ABSTOL, A, COPYA, Z, 1, 1,
583 $ DESCA, WIN( 1+IPREPAD ), WNEW, IFAIL,
584 $ ICLUSTR, GAP, IPREPAD, IPOSTPAD,
585 $ WORK( INDWORK ), LLWORK,
586 $ RWORK, LRWORK, LEVRSIZE,
587 $ IWORK, ISIZEEVR, RES, TSTNRM, QTQNRM,
591 MAXTSTNRM = MAX( TSTNRM, MAXTSTNRM )
592 MAXQTQNRM = MAX( QTQNRM, MAXQTQNRM )
593 PASSED = 'failed
stest 1
'
609 CALL PZLASIZEHEEVR( .TRUE., RANGE, N, DESCA, VL, VU, IL, IU,
610 $ ISEED, WIN( 1+IPREPAD ), MAXSIZE,
615 CALL PZSEPRSUBTST( .TRUE., JOBZ, RANGE, UPLO, N, VL, VU, IL,
616 $ IU, THRESH, ABSTOL, A, COPYA, Z, 1, 1,
617 $ DESCA, WIN( 1+IPREPAD ), WNEW, IFAIL,
618 $ ICLUSTR, GAP, IPREPAD, IPOSTPAD,
619 $ WORK( INDWORK ), LLWORK,
620 $ RWORK, LRWORK, LEVRSIZE,
621 $ IWORK, ISIZEEVR, RES, TSTNRM, QTQNRM,
625 MAXTSTNRM = MAX( TSTNRM, MAXTSTNRM )
626 MAXQTQNRM = MAX( QTQNRM, MAXQTQNRM )
627 PASSED = 'failed
stest 2
'
643 $ iseed, win( 1+iprepad ), maxsize,
648 CALL pzseprsubtst( .true., jobz, range, uplo, n, vl, vu, il,
649 $ iu, thresh, abstol, a, copya, z, 1, 1,
650 $ desca, win( 1+iprepad ), wnew, ifail,
651 $ iclustr, gap, iprepad, ipostpad,
652 $ work( indwork ), llwork,
653 $ rwork, lrwork, levrsize,
654 $ iwork, isizeevr, res, tstnrm, qtqnrm,
658 maxtstnrm =
max( tstnrm, maxtstnrm )
659 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
660 passed =
'FAILED stest 3'
676 $ iseed, win( 1+iprepad ), maxsize,
681 CALL pzseprsubtst( .true., jobz, range, uplo, n, vl, vu,
682 $ iu, thresh, abstol, a, copya, z, 1, 1,
683 $ desca, win( 1+iprepad ), wnew, ifail,
684 $ iclustr, gap, iprepad, ipostpad,
685 $ work( indwork ), llwork,
686 $ rwork, lrwork, levrsize,
687 $ iwork, isizeevr, res, tstnrm, qtqnrm,
691 maxtstnrm =
max( tstnrm, maxtstnrm )
692 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
693 passed =
'FAILED stest 4'
709 $ iseed, win( 1+iprepad ), maxsize,
714 CALL pzseprsubtst( .true., jobz, range, uplo, n, vl, vu, il,
715 $ iu, thresh, abstol, a, copya, z, 1, 1,
716 $ desca, win( 1+iprepad ), wnew, ifail,
717 $ iclustr, gap, iprepad, ipostpad,
718 $ work( indwork ), llwork,
719 $ rwork, lrwork, levrsize,
720 $ iwork, isizeevr, res, tstnrm, qtqnrm,
724 maxtstnrm =
max( tstnrm, maxtstnrm )
725 maxqtqnrm =
max( qtqnrm, maxqtqnrm )
726 passed =
'FAILED stest 5'
732 CALL igamx2d( context,
'All',
' ', 1, 1, info, 1, -1, -1, -1, -1,
735 IF( iam.EQ.0 .AND. .false. )
THEN
736 WRITE( nout, fmt = 9994 )
'C '
737 WRITE( nout, fmt = 9993 )iseedin( 1 )
738 WRITE( nout, fmt = 9992 )iseedin( 2 )
739 WRITE( nout, fmt = 9991 )iseedin( 3 )
740 WRITE( nout, fmt = 9990 )iseedin( 4 )
741 IF( lsame( uplo,
'L' ) )
THEN
742 WRITE( nout, fmt = 9994 )
' UPLO= ''L'' '
744 WRITE( nout, fmt = 9994 )
' UPLO= ''U'' '
746 IF( lsame( subtests,
'Y' ) )
THEN
747 WRITE( nout, fmt = 9994 )
' SUBTESTS= ''Y'' '
749 WRITE( nout, fmt = 9994 )
' SUBTESTS= ''N'' '
751 WRITE( nout, fmt = 9989 )n
752 WRITE( nout, fmt = 9988 )nprow
753 WRITE( nout, fmt = 9987 )npcol
754 WRITE( nout, fmt = 9986 )nb
755 WRITE( nout, fmt = 9985 )mattype
756 WRITE( nout, fmt = 9982 )abstol
757 WRITE( nout, fmt = 9981 )thresh
758 WRITE( nout, fmt = 9994 )
'C '
762 CALL slcombine( context,
'All',
'>',
'W', 6, 1, wtime )
763 CALL slcombine( context,
'All',
'>',
'C', 6, 1, ctime )
765 IF( info.EQ.0 .OR. info.EQ.1 )
THEN
766 IF( wtime( 1 ).GE.0.0 )
THEN
767 WRITE( nout, fmt = 9999 )n, nb, nprow, npcol, mattype,
768 $ subtests, wtime( 1 ), ctime( 1 ), maxtstnrm,
771 WRITE( nout, fmt = 9998 )n, nb, nprow, npcol, mattype,
772 $ subtests, ctime( 1 ), maxtstnrm, maxqtqnrm, passed
774 ELSE IF( info.EQ.2 )
THEN
775 IF( wtime( 1 ).GE.0.0 )
THEN
776 WRITE( nout, fmt = 9997 )n, nb, nprow, npcol, mattype,
777 $ subtests, wtime( 1 ), ctime( 1 )
779 WRITE( nout, fmt = 9996 )n, nb, nprow, npcol, mattype,
780 $ subtests, ctime( 1 )
782 ELSE IF( info.EQ.3 )
THEN
783 WRITE( nout, fmt = 9995 )n, nb, nprow, npcol, mattype,
791 9999
FORMAT( 1x, i5, 1x, i3, 1x, i3, 1x, i3, 1x, i3, 3x, a1, 1x,
792 $ f8.2, 1x, f8.2, 1x, g9.2, 1x, g9.2, 1x, a14 )
793 9998
FORMAT( 1x, i5, 1x, i3, 1x, i3, 1x, i3, 1x, i3, 3x, a1, 1x, 8x,
794 $ 1x, f8.2, 1x, g9.2, 1x, g9.2, a14 )
796 $ 1x, f8.2, 21x,
'Bypassed' )
798 $ 1x, f8.2, 21x,
'Bypassed' )
799 9995
FORMAT( 1x, i5, 1x, i3, 1x, i3, 1x, i3, 1x, i3, 3x, a1, 32x,
800 $
'Bad MEMORY parameters' )
802 9993
FORMAT(
' ISEED( 1 ) =', i8 )
803 9992
FORMAT' ISEED( 2 ) =', i8 )
804 9991
FORMAT(
' ISEED( 3 ) =', i8 )
805 9990
FORMAT(
' ISEED( 4 ) ='
806 9989
FORMAT(
' N=', i8 )
807 9988
FORMAT(
' NPROW=', i8 )
808 9987
FORMAT(
' NPCOL=', i8 )
809 9986
FORMAT(
' NB=', i8
810 9985
FORMAT(
' MATTYPE='
813 9982
FORMAT(
' ABSTOL=', d16.6 )
814 9981
FORMAT(
' THRESH=', d16.6 )