1 SUBROUTINE pdseprtst(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
18 DOUBLE PRECISION ABSTOL, THRESH
21 INTEGER DESCA( * ), ICLUSTR( * ), IFAIL( * ),
22 $ iseed( 4 ), iwork( * )
23 DOUBLE PRECISION 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 DOUBLE PRECISION HALF, ONE, TEN, ZERO
194 parameter( zero = 0.0d0, one = 1.0d0,
195 $ ten = 10.0d0, half = 0.5d0 )
196 DOUBLE PRECISION PADVAL
197 parameter( padval = 19.25d0 )
199 PARAMETER ( MAXTYP = 22 )
204 CHARACTER JOBZ, RANGE
206 INTEGER CONTEXT, I, IAM, , 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 DOUBLE PRECISION ANINV, ANORM, COND, MAXQTQNRM, MAXTSTNRM, OVFL,
215 $ QTQNRM, RTOVFL, RTUNFL, TEMP1, TSTNRM, ULP,
216 $ ULPINV, UNFL, VL, VU
219 INTEGER ISEEDIN( 4 ), KMAGN( MAXTYP ), KMODE( MAXTYP ),
221 DOUBLE PRECISION CTIME( 10 ), WTIME( 10 )
226 DOUBLE PRECISION DLARAN,
227 EXTERNAL DLARAN, LSAME, NUMROC, PDLAMCH
237 INTRINSIC abs, dble, 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 pdlasizesepr( 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 = pdlamch( context,
'P' )
296 unfl = pdlamch( context,
'Safe min' )
299 rtunfl = sqrt( unfl )
300 rtovfl = sqrt( ovfl )
301 aninv = one / dble(
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 pdlaset(
'All', n, n, zero, zero, copya, 1, 1, desca )
370 ELSE IF( itype.EQ.2 )
THEN
375 work( indd+i-1 ) = one
377 CALL pdlaset(
'All', n, n, zero, one, copya, 1, 1, desca )
380 ELSE IF( itype.EQ.4 )
THEN
384 CALL pdfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
385 $ sizetms, iprepad, ipostpad, padval+1.0d0 )
387 CALL pdlatms( 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 pdchekpad( desca( ctxt_ ),
'PDLATMS1-WORK', sizetms, 1,
394 $ work( indwork ), sizetms, iprepad, ipostpad,
397 ELSE IF( itype.EQ.5 )
THEN
401 CALL pdfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
402 $ sizetms, iprepad, ipostpad, padval+2.0d0 )
404 CALL pdlatms( 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 pdchekpad( desca( ctxt_ ),
'PDLATMS2-WORK', sizetms, 1,
410 $ work( indwork ), sizetms, iprepad
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 pdmatgen( desca( ctxt_ ),
'S',
'N', n, n, desca( mb_ ),
422 $ desca( nb_ ), copya, desca( lld_ ),
423 $ desca( rsrc_ ), desca( csrc_ ), iseed
424 $ 0, np, 0, nq, myrow, mycol, nprow, npcol )
428 ELSE IF( itype.EQ.9 )
THEN
432 CALL pdfillpad( desca( ctxt_ ), sizetms, 1, work( indwork ),
433 $ sizetms, iprepad, ipostpad, padval+3.0d0 )
435 CALL pdlatms( 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 PDCHEKPAD( DESCA( CTXT_ ), 'pdlatms3-work
', SIZETMS, 1,
443 $ WORK( INDWORK ), SIZETMS, IPREPAD, IPOSTPAD,
446.EQ.
ELSE IF( ITYPE10 ) THEN
451 CALL PDLASET( '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( DLARAN( ISEED )*DBLE( NLOC ) ), N-NGEN )
461 CALL DLATMS( 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 PDELSET( COPYA, NGEN+1, NGEN+1, DESCA, A( 1, 1 ) )
476 CALL PDELSET( COPYA, NGEN+I, NGEN+I, DESCA,
478 CALL PDELSET( COPYA, NGEN+I-1, NGEN+I, DESCA,
480 CALL PDELSET( 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 PDFILLPAD( DESCA( CTXT_ ), SIZETMS, 1, WORK( INDWORK ),
508 $ SIZETMS, IPREPAD, IPOSTPAD, PADVAL+4.0D0 )
510 CALL PDLATMS( 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 PDCHEKPAD( DESCA( CTXT_ ), 'pdlatms4-work
', SIZETMS, 1,
516 $ WORK( INDWORK ), SIZETMS, IPREPAD, IPOSTPAD,
524 $ CALL DLASRT( 'i
', N, WORK( INDD ), IINFO )
526 CALL PDLASIZESYEVR( WKNOWN, 'a
', N, DESCA, VL, VU, IL, IU,
527 $ ISEED, WORK( INDD ), MAXSIZE, VECSIZE,
529 LEVRSIZE = MIN( MAXSIZE, LLWORK )
531 CALL PDSEPRSUBTST( 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 PDLASIZESYEVR( .TRUE., RANGE, N, DESCA, VL, VU, IL, IU,
559 $ ISEED, WIN( 1+IPREPAD ), MAXSIZE,
564 CALL PDSEPRSUBTST( .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 PDLASIZESYEVR( .TRUE., RANGE, N, DESCA, VL, VU, IL, IU,
592 $ ISEED, WIN( 1+IPREPAD ), MAXSIZE,
597 CALL PDSEPRSUBTST( .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 PDLASIZESYEVR( .TRUE., RANGE, N, DESCA, VL, VU, IL, IU,
624 $ ISEED, WIN( 1+IPREPAD ), MAXSIZE,
629 CALL PDSEPRSUBTST( .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 PDLASIZESYEVR( .TRUE., RANGE, N, DESCA, VL, VU, IL, IU,
656 $ ISEED, WIN( 1+IPREPAD ), MAXSIZE,
661 CALL PDSEPRSUBTST( .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 PDLASIZESYEVR( .TRUE., RANGE, N, DESCA, VL, VU, IL, IU,
688 $ ISEED, WIN( 1+IPREPAD ), MAXSIZE,
693 CALL PDSEPRSUBTST( .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 IF( info.EQ.0 .OR. info.EQ.1 )
THEN
744 IF( wtime( 1 ).GE.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,
750 $ subtests, ctime( 1 ), maxtstnrm, maxqtqnrm, passed
752 ELSE IF( info.EQ.2 )
THEN
753 IF( wtime( 1 ).GE.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 ELSE IF( info.EQ.3 )
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 )