1 SUBROUTINE pcseprtst(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
22 INTEGER DESCA( * ), ICLUSTR( * ), IFAIL( * ),
23 $ iseed( 4 ), iwork( * )
24 REAL GAP( * ), WIN( * ), WNEW( * ), RWORK( * )
25 COMPLEX 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 REAL HALF, ONE, TEN, ZERO
202 parameter( zero = 0.0e0, one = 1.0e0,
203 $ ten = 10.0e0, half = 0.5e0 )
205 parameter( padval = ( 19.25e0, 1.1e1 ) )
207 PARAMETER ( ZZERO = ( 0.0e0, 0.0e0 ) )
209 parameter( zone = ( 1.0e0, 0.0e0 ) )
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 REAL 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 )
241 EXTERNAL SLARAN, LSAME, NUMROC, PSLAMCH
251 INTRINSIC abs, real, 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 pclasizesepr( 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 = pslamch( context,
'P' )
312 unfl = pslamch( context,
'Safe min' )
315 rtunfl = sqrt( unfl )
316 rtovfl = sqrt( ovfl )
317 aninv = one / real(
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 pclaset(
'All', n, n,zzero,zzero, copya, 1, 1, desca )
386 ELSE IF( itype.EQ.2 )
THEN
391 rwork( indd+i-1 ) = one
393 CALL pclaset(
'All', n, n,zzero,zone, copya, 1, 1, desca )
396 ELSE IF( itype.EQ.4 )
THEN
400 CALL pcfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
401 $ sizetms, iprepad, ipostpad, padval+1.0e0 )
403 CALL pclatms( 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 pcchekpad( desca( ctxt_ ),
'PCLATMS1-WORK', sizetms, 1,
410 $ work( indwork ), sizetms, iprepad, ipostpad,
413 ELSE IF( itype.EQ.5 )
THEN
417 CALL pcfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
418 $ sizetms, iprepad, ipostpad, padval+2.0e0 )
420 CALL pclatms( 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 pcchekpad( desca( ctxt_ ),
'PCLATMS2-WORK', sizetms, 1,
426 $ work( indwork ), sizetms, iprepad, ipostpad,
431 ELSE IF( itype.EQ.8 )
THEN
435 np = numroc( n, desca( mb_ ), myrow, 0, nprow )
436 nq = numroc( n, desca( nb_ ), mycol, 0, npcol )
437 CALL pcmatgen( 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 ELSE IF( itype.EQ.9 )
THEN
448 CALL pcfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
449 $ sizetms, iprepad, ipostpad, padval+3.0e0 )
451 CALL pclatms( 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 pcchekpad( desca( ctxt_ ),
'PCLATMS3-WORK', sizetms, 1,
459 $ work( indwork ), sizetms, iprepad, ipostpad,
462 ELSE IF( itype.EQ.10 )
THEN
467 CALL pclaset(
'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( slaran( iseed )*real( nloc ) ), n-ngen )
477 CALL clatms( 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 IF( temp1.GT.half )
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 pcelset( copya, ngen+1, ngen+1, desca, a( 1, 1 ) )
492 CALL pcelset( copya, ngen+i, ngen+i, desca,
494 CALL pcelset( copya, ngen+i-1, ngen+i, desca,
496 CALL pcelset( copya, ngen+i, ngen+i-1, desca,
504 ELSE IF( itype.EQ.11 )
THEN
513 in =
min( j, n-ngen )
515 rwork( indd+ngen+i ) = temp1
523 CALL pcfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
524 $ sizetms, iprepad, ipostpad, padval+4.0e0 )
526 CALL pclatms( 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 pcchekpad( desca( ctxt_ ),
'PCLATMS4-WORK', sizetms, 1,
532 $ work( indwork ), sizetms, iprepad, ipostpad,
540 $
CALL slasrt(
'I', n,rwork( indd ), iinfo )
543 $ iseed,rwork( indd ), maxsize, vecsize,
545 levrsize =
min( maxsize, llrwork )
547 CALL pcseprsubtst( 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 IF( thresh.LE.zero )
THEN
561 ELSE IF( res.NE.0 )
THEN
567 IF( thresh.GT.zero .AND. lsame( subtests,
'Y' ) )
THEN
576 $ iseed, win( 1+iprepad ), maxsize,
581 CALL pcseprsubtst( .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'
610 $ iseed, win( 1+iprepad ), maxsize,
615 CALL pcseprsubtst( .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 pcseprsubtst( .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 pcseprsubtst( .true., jobz, range, uplo, n, vl, vu, il,
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'
708 CALL PCLASIZEHEEVR( .TRUE., RANGE, N, DESCA, VL, VU, IL, IU,
709 $ ISEED, WIN( 1+IPREPAD ), MAXSIZE,
714 CALL PCSEPRSUBTST( .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.EQ..AND.
IF( IAM0 .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.EQ..OR..EQ.
IF( INFO0 INFO1 ) THEN
766.GE.
IF( WTIME( 1 )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.EQ.
ELSE IF( INFO2 ) THEN
775.GE.
IF( WTIME( 1 )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.EQ.
ELSE IF( INFO3 ) 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 )
795 9997 FORMAT( 1X, I5, 1X, I3, 1X, I3, 1X, I3, 1X, I3, 3X, A1, 1X, F8.2,
796 $ 1X, F8.2, 21X, 'bypassed
' )
797 9996 FORMAT( 1X, I5, 1X, I3, 1X, I3, 1X, I3, 1X, I3, 3X, A1, 1X, 8X,
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 ) =
', I8 )
806 9989 FORMAT( ' n=
', I8 )
807 9988 FORMAT( ' nprow=
', I8 )
808 9987 FORMAT( ' npcol=
', I8 )
809 9986 FORMAT( ' nb=
', I8 )
810 9985 FORMAT( ' mattype=
', I8 )
813 9982 FORMAT( ' abstol=
', D16.6 )
814 9981 FORMAT( ' thresh=
', D16.6 )