68 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
69 $ lld_, mb_, m_, nb_, n_, rsrc_
70 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
71 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
72 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
73 INTEGER dblesz, intgsz, memsiz, ntests, totmem
74 DOUBLE PRECISION padval, zero
75 parameter( dblesz = 8, intgsz = 4, totmem = 2000000,
76 $ memsiz = totmem / dblesz, ntests = 20,
77 $ padval = -9923.0d+0, zero = 0.0d+0 )
84 INTEGER hh, i, iam, iaseed, ibseed, ictxt, imidpad,
85 $ info, ipa, ipa0, ipb, ipb0, ipberr, ipferr,
86 $ iprepad, ipostpad, ipw, ipw2, itemp, j, k,
87 $ kfail, kk, kpass, kskip, ktests, lcm, lcmq,
88 $ liwork, lwork, lw2, mycol, myrhs, myrow, n, nb,
89 $ nbrhs, ngrids, nmat, nnb, nnbr, nnr, nout, np,
90 $ npcol, nprocs, nprow, nq, nrhs, worksiz
92 DOUBLE PRECISION anorm, anorm1, fresid, nops, rcond,
93 $ sresid, sresid2, tmflops
96 INTEGER desca( dlen_ ), descb( dlen_ ), ierr( 1 ),
97 $ nbrval( ntests ), nbval( ntests ),
98 $ nrval( ntests ), nval( ntests ),
99 $ pval( ntests ), qval( ntests )
100 DOUBLE PRECISION ctime( 2 ), mem( memsiz ), wtime( 2 )
103 EXTERNAL blacs_barrier, blacs_exit, blacs_gridexit,
104 $ blacs_gridinfo, blacs_gridinit,
descinit,
121 DATA kfail, kpass, kskip, ktests / 4*0 /
127 CALL blacs_pinfo( iam, nprocs )
130 CALL pdlltinfo( outfile, nout, uplo, nmat, nval, ntests, nnb,
131 $ nbval, ntests, nnr, nrval, ntests, nnbr, nbrval,
132 $ ntests, ngrids, pval, ntests, qval, ntests,
133 $ thresh, est, mem, iam, nprocs )
134 check = ( thresh.GE.0.0e+0 )
139 WRITE( nout, fmt = * )
140 WRITE( nout, fmt = 9995 )
141 WRITE( nout, fmt = 9994 )
142 WRITE( nout, fmt = * )
155 IF( nprow.LT.1 )
THEN
157 $
WRITE( nout, fmt = 9999 )
'GRID',
'nprow', nprow
159 ELSE IF( npcol.LT.1 )
THEN
161 $
WRITE( nout, fmt = 9999 )
'GRID',
'npcol', npcol
163 ELSE IF( nprow*npcol.GT.nprocs )
THEN
165 $
WRITE( nout, fmt = 9998 ) nprow*npcol, nprocs
169 IF( ierr( 1 ).GT.0 )
THEN
171 $
WRITE( nout, fmt = 9997 )
'grid'
178 CALL blacs_get( -1, 0, ictxt )
179 CALL blacs_gridinit( ictxt,
'Row-major', nprow, npcol )
180 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
185 IF( myrow.GE.nprow .OR. mycol.GE.npcol )
197 $
WRITE( nout, fmt = 9999 )
'MATRIX',
'N', n
199 ELSE IF( n.LT.1 )
THEN
201 $
WRITE( nout, fmt = 9999 )
'MATRIX',
'N', n
207 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
209 IF( ierr( 1 ).GT.0 )
THEN
211 $
WRITE( nout, fmt = 9997 )
'matrix'
226 $
WRITE( nout, fmt = 9999 )
'NB',
'NB', nb
231 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
233 IF( ierr( 1 ).GT.0 )
THEN
235 $
WRITE( nout, fmt = 9997 )
'NB'
242 np =
numroc( n, nb, myrow, 0, nprow )
243 nq =
numroc( n, nb, mycol, 0, npcol )
245 iprepad =
max( nb, np )
247 ipostpad =
max( nb, nq )
256 CALL descinit( desca, n, n, nb, nb, 0, 0, ictxt,
257 $
max( 1, np )+imidpad, ierr( 1 ) )
261 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
263 IF( ierr( 1 ).LT.0 )
THEN
265 $
WRITE( nout, fmt = 9997 )
'descriptor'
275 ipa0 = ipa + desca( lld_ )*nq + ipostpad + iprepad
276 ipw = ipa0 + desca( lld_ )*nq + ipostpad + iprepad
278 ipw = ipa + desca( lld_ )*nq + ipostpad + iprepad
288 worksiz = np * desca( nb_ )
290 worksiz =
max( worksiz, desca( mb_ ) * desca( nb_ ) )
292 lcm =
ilcm( nprow, npcol )
293 itemp =
max( 2, 2 * nq ) + np
294 IF( nprow.NE.npcol )
THEN
298 worksiz =
max( worksiz, itemp )
299 worksiz = worksiz + ipostpad
310 IF( ipw+worksiz.GT.memsiz )
THEN
312 $
WRITE( nout, fmt = 9996 )
'factorization',
313 $ ( ipw+worksiz )*dblesz
319 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
321 IF( ierr( 1 ).GT.0 )
THEN
323 $
WRITE( nout, fmt = 9997 )
'MEMORY'
330 CALL pdmatgen( ictxt,
'Symm',
'Diag', desca( m_ ),
331 $ desca( n_ ), desca( mb_ ), desca( nb_ ),
332 $ mem( ipa ), desca( lld_ ), desca( rsrc_ ),
333 $ desca( csrc_ ), iaseed, 0, np, 0, nq,
334 $ myrow, mycol, nprow, npcol )
339 CALL pdfillpad( ictxt, np, nq, mem( ipa-iprepad ),
340 $ desca( lld_ ), iprepad, ipostpad,
342 CALL pdfillpad( ictxt, worksiz-ipostpad, 1,
343 $ mem( ipw-iprepad ), worksiz-ipostpad,
344 $ iprepad, ipostpad, padval )
345 anorm =
pdlansy(
'I', uplo, n, mem( ipa ), 1, 1,
346 $ desca, mem( ipw ) )
347 anorm1 =
pdlansy(
'1', uplo, n, mem( ipa ), 1, 1,
348 $ desca, mem( ipw ) )
349 CALL pdchekpad( ictxt,
'PDLANSY', np, nq,
350 $ mem( ipa-iprepad ), desca( lld_ ),
351 $ iprepad, ipostpad, padval )
353 $ worksiz-ipostpad, 1,
354 $ mem( ipw-iprepad ), worksiz-ipostpad,
355 $ iprepad, ipostpad, padval )
359 CALL pdmatgen( ictxt,
'Symm',
'Diag', desca( m_ ),
360 $ desca( n_ ), desca( mb_ ),
361 $ desca( nb_ ), mem( ipa0 ),
362 $ desca( lld_ ), desca( rsrc_ ),
363 $ desca( csrc_ ), iaseed, 0, np, 0, nq,
364 $ myrow, mycol, nprow, npcol )
367 $ mem( ipa0-iprepad ), desca( lld_ ),
368 $ iprepad, ipostpad, padval )
372 CALL blacs_barrier( ictxt,
'All' )
378 CALL pdpotrf( uplo, n, mem( ipa ), 1, 1, desca, info )
384 $
WRITE( nout, fmt = * )
'PDPOTRF INFO=', info
394 CALL pdchekpad( ictxt,
'PDPOTRF', np, nq,
395 $ mem( ipa-iprepad ), desca( lld_ ),
396 $ iprepad, ipostpad, padval )
403 lwork =
max( 1, 2*np ) +
max( 1, 2*nq ) +
404 $
max( 2, desca( nb_ )*
405 $
max( 1,
iceil( nprow-1, npcol ) ),
407 $
max( 1,
iceil( npcol-1, nprow ) ) )
408 ipw2 = ipw + lwork + ipostpad + iprepad
409 liwork =
max( 1, np )
410 lw2 =
iceil( liwork*intgsz, dblesz ) + ipostpad
413 IF( ipw2+lw2.GT.memsiz )
THEN
415 $
WRITE( nout, fmt = 9996 )
'cond est',
416 $ ( ipw2+lw2 )*dblesz
422 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
425 IF( ierr( 1 ).GT.0 )
THEN
427 $
WRITE( nout, fmt = 9997 )
'MEMORY'
434 $ mem( ipw-iprepad ), lwork,
435 $ iprepad, ipostpad, padval )
437 $ mem( ipw2-iprepad ),
438 $ lw2-ipostpad, iprepad,
444 CALL pdpocon( uplo, n, mem( ipa ), 1, 1, desca,
445 $ anorm1, rcond, mem( ipw ), lwork,
446 $ mem( ipw2 ), liwork, info )
449 CALL pdchekpad( ictxt,
'PDPOCON', np, nq,
450 $ mem( ipa-iprepad ), desca( lld_ ),
451 $ iprepad, ipostpad, padval )
453 $ lwork, 1, mem( ipw-iprepad ),
454 $ lwork, iprepad, ipostpad,
458 $ mem( ipw2-iprepad ), lw2-ipostpad,
459 $ iprepad, ipostpad, padval )
475 CALL descinit( descb, n, nrhs, nb, nbrhs, 0, 0,
476 $ ictxt,
max( 1, np )+imidpad,
481 myrhs =
numroc( descb( n_ ), descb( nb_ ), mycol,
482 $ descb( csrc_ ), npcol )
486 ipb0 = ipb + descb( lld_ )*myrhs + ipostpad +
488 ipferr = ipb0 + descb( lld_ )*myrhs + ipostpad
490 ipberr = myrhs + ipferr + ipostpad + iprepad
491 ipw = myrhs + ipberr + ipostpad + iprepad
493 ipw = ipb + descb( lld_ )*myrhs + ipostpad +
503 worksiz =
max( worksiz-ipostpad,
504 $ nq * nbrhs + np * nbrhs +
505 $
max(
max( nq*nb, 2*nbrhs ),
508 worksiz = ipostpad + worksiz
514 IF( ipw+worksiz.GT.memsiz )
THEN
516 $
WRITE( nout, fmt = 9996 )
'solve',
517 $ ( ipw+worksiz )*dblesz
523 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
526 IF( ierr( 1 ).GT.0 )
THEN
528 $
WRITE( nout, fmt = 9997 )
'MEMORY'
535 CALL pdmatgen( ictxt,
'No',
'No', descb( m_ ),
536 $ descb( n_ ), descb( mb_ ),
537 $ descb( nb_ ), mem( ipb ),
538 $ descb( lld_ ), descb( rsrc_ ),
539 $ descb( csrc_ ), ibseed, 0, np, 0,
540 $ myrhs, myrow, mycol, nprow, npcol )
544 $ mem( ipb-iprepad ),
546 $ iprepad, ipostpad, padval )
549 CALL pdmatgen( ictxt,
'No',
'No', descb( m_ ),
550 $ descb( n_ ), descb( mb_ ),
551 $ descb( nb_ ), mem( ipb0 ),
552 $ descb( lld_ ), descb( rsrc_ ),
553 $ descb( csrc_ ), ibseed, 0, np, 0,
554 $ myrhs, myrow, mycol, nprow,
559 $ mem( ipb0-iprepad ),
560 $ descb( lld_ ), iprepad,
563 $ mem( ipferr-iprepad ), 1,
567 $ mem( ipberr-iprepad ), 1,
573 CALL blacs_barrier( ictxt,
'All' )
578 CALL pdpotrs( uplo, n, nrhs, mem( ipa ), 1, 1,
579 $ desca, mem( ipb ), 1, 1, descb,
588 CALL pdchekpad( ictxt,
'PDPOTRS', np, nq,
589 $ mem( ipa-iprepad ),
591 $ iprepad, ipostpad, padval )
593 $ myrhs, mem( ipb-iprepad ),
594 $ descb( lld_ ), iprepad,
597 CALL pdfillpad( ictxt, worksiz-ipostpad, 1,
598 $ mem( ipw-iprepad ),
599 $ worksiz-ipostpad, iprepad,
604 CALL pdlaschk(
'Symm',
'Diag', n, nrhs,
605 $ mem( ipb ), 1, 1, descb,
606 $ iaseed, 1, 1, desca, ibseed,
607 $ anorm, sresid, mem( ipw ) )
609 IF( iam.EQ.0 .AND. sresid.GT.thresh )
610 $
WRITE( nout, fmt = 9985 ) sresid
615 $ myrhs, mem( ipb-iprepad ),
616 $ descb( lld_ ), iprepad,
619 $ worksiz-ipostpad, 1,
620 $ mem( ipw-iprepad ),
621 $ worksiz-ipostpad, iprepad,
626 IF( ( sresid.LE.thresh ).AND.
627 $ ( (sresid-sresid).EQ.0.0d+0 ) )
THEN
636 sresid = sresid - sresid
644 lwork =
max( 1, 3*np )
645 ipw2 = ipw + lwork + ipostpad + iprepad
646 liwork =
max( 1, np )
647 lw2 =
iceil( liwork*intgsz, dblesz ) +
651 IF( ipw2+lw2.GT.memsiz )
THEN
653 $
WRITE( nout, fmt = 9996 )
654 $
'iter ref', ( ipw2+lw2 )*dblesz
660 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr,
663 IF( ierr( 1 ).GT.0 )
THEN
665 $
WRITE( nout, fmt = 9997 )
673 $ mem( ipw-iprepad ),
674 $ lwork, iprepad, ipostpad,
677 $ 1, mem( ipw2-iprepad ),
686 CALL pdporfs( uplo, n, nrhs, mem( ipa0 ),
687 $ 1, 1, desca, mem( ipa ), 1, 1,
688 $ desca, mem( ipb0 ), 1, 1,
689 $ descb, mem( ipb ), 1, 1, descb,
690 $ mem( ipferr ), mem( ipberr ),
691 $ mem( ipw ), lwork, mem( ipw2 ),
698 $ nq, mem( ipa0-iprepad ),
699 $ desca( lld_ ), iprepad,
702 $ nq, mem( ipa-iprepad ),
703 $ desca( lld_ ), iprepad,
706 $ myrhs, mem( ipb-iprepad ),
707 $ descb( lld_ ), iprepad,
711 $ mem( ipb0-iprepad ),
712 $ descb( lld_ ), iprepad,
716 $ mem( ipferr-iprepad ), 1,
721 $ mem( ipberr-iprepad ), 1,
725 $ 1, mem( ipw-iprepad ),
726 $ lwork, iprepad, ipostpad,
730 $ mem( ipw2-iprepad ),
736 $ 1, mem( ipw-iprepad ),
737 $ worksiz-ipostpad, iprepad,
742 CALL pdlaschk(
'Symm',
'Diag', n, nrhs,
743 $ mem( ipb ), 1, 1, descb,
744 $ iaseed, 1, 1, desca,
745 $ ibseed, anorm, sresid2,
748 IF( iam.EQ.0 .AND. sresid2.GT.thresh )
749 $
WRITE( nout, fmt = 9985 ) sresid2
754 $ myrhs, mem( ipb-iprepad ),
755 $ descb( lld_ ), iprepad,
758 $ worksiz-ipostpad, 1,
759 $ mem( ipw-iprepad ),
768 CALL slcombine( ictxt,
'All',
'>',
'W', 2, 1,
770 CALL slcombine( ictxt,
'All',
'>',
'C', 2, 1,
775 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
THEN
779 nops = (dble(n)**3)/3.0d+0 +
780 $ (dble(n)**2)/2.0d+0
784 nops = nops + 2.0d+0*(dble(n)**2)*dble(nrhs)
791 IF( wtime( 1 ) + wtime( 2 ) .GT. 0.0d+0 )
THEN
793 $ ( ( wtime( 1 )+wtime( 2 ) ) * 1.0d+6 )
798 IF( wtime( 2 ).GE.0.0d+0 )
799 $
WRITE( nout, fmt = 9993 )
'WALL', uplo, n,
800 $ nb, nrhs, nbrhs, nprow, npcol,
801 $ wtime( 1 ), wtime( 2 ), tmflops,
806 IF( ctime( 1 )+ctime( 2 ).GT.0.0d+0 )
THEN
808 $ ( ( ctime( 1 )+ctime( 2 ) ) * 1.0d+6 )
813 IF( ctime( 2 ).GE.0.0d+0 )
814 $
WRITE( nout, fmt = 9993 )
'CPU ', uplo, n,
815 $ nb, nrhs, nbrhs, nprow, npcol,
816 $ ctime( 1 ), ctime( 2 ), tmflops,
823 IF( check .AND. sresid.GT.thresh )
THEN
827 CALL pdpotrrv( uplo, n, mem( ipa ), 1, 1, desca,
829 CALL pdlafchk(
'Symm',
'Diag', n, n, mem( ipa ), 1, 1,
830 $ desca, iaseed, anorm, fresid,
835 CALL pdchekpad( ictxt,
'PDPOTRRV', np, nq,
836 $ mem( ipa-iprepad ), desca( lld_ ),
837 $ iprepad, ipostpad, padval )
839 $ worksiz-ipostpad, 1,
840 $ mem( ipw-iprepad ), worksiz-ipostpad,
841 $ iprepad, ipostpad, padval )
844 IF(
lsame( uplo,
'L' ) )
THEN
845 WRITE( nout, fmt = 9986 )
'L*L''', fresid
847 WRITE( nout, fmt = 9986 )
'U''*U', fresid
854 CALL blacs_gridexit( ictxt )
861 ktests = kpass + kfail + kskip
862 WRITE( nout, fmt = * )
863 WRITE( nout, fmt = 9992 ) ktests
865 WRITE( nout, fmt = 9991 ) kpass
866 WRITE( nout, fmt = 9989 ) kfail
868 WRITE( nout, fmt = 9990 ) kpass
870 WRITE( nout, fmt = 9988 ) kskip
871 WRITE( nout, fmt = * )
872 WRITE( nout, fmt = * )
873 WRITE( nout, fmt = 9987 )
874 IF( nout.NE.6 .AND. nout.NE.0 )
880 9999
FORMAT(
'ILLEGAL ', a6,
': ', a5,
' = ', i3,
881 $
'; It should be at least 1' )
882 9998
FORMAT(
'ILLEGAL GRID: nprow*npcol = ', i4,
'. It can be at most',
884 9997
FORMAT(
'Bad ', a6,
' parameters: going on to next test case.' )
885 9996
FORMAT(
'Unable to perform ', a,
': need TOTMEM of at least',
887 9995
FORMAT(
'TIME UPLO N NB NRHS NBRHS P Q LLt Time ',
888 $
'Slv Time MFLOPS CHECK' )
889 9994
FORMAT(
'---- ---- ----- --- ---- ----- ---- ---- -------- ',
890 $
'-------- -------- ------' )
891 9993
FORMAT( a4, 4x, a1, 1x, i5, 1x, i3, 1x, i4, 1x, i5, 1x, i4, 1x,
892 $ i4, 1x, f8.2, 1x, f8.2, 1x, f8.2, 1x, a6 )
893 9992
FORMAT(
'Finished ', i6,
' tests, with the following results:' )
894 9991
FORMAT( i5,
' tests completed and passed residual checks.' )
895 9990
FORMAT( i5,
' tests completed without checking.' )
896 9989
FORMAT( i5,
' tests completed and failed residual checks.' )
897 9988
FORMAT( i5,
' tests skipped because of illegal input values.' )
898 9987
FORMAT(
'END OF TESTS.' )
899 9986
FORMAT(
'||A - ', a4,
'|| / (||A|| * N * eps) = ', g25.7 )
900 9985
FORMAT(
'||Ax-b||/(||x||*||A||*eps*N) ', f25.7 )