74 parameter( totmem = 3000000 )
75 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
76 $ lld_, mb_, , nb_, n_, rsrc_
77 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
78 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
79 $ rsrc_ = 7, csrc_ = 8, lld_
82 INTEGER dblesz, memsiz, ntests
83 DOUBLE PRECISION padval
84 parameter( dblesz = 8,
85 $ memsiz = totmem / dblesz, ntests = 20,
86 $ padval = -9923.0d+0, zero = 0.0d+0 )
88 parameter( int_one = 1 )
95 INTEGER bwl, bwu, bw_num, fillin_size, free_ptr, h, hh,
96 $ i, iam, iaseed, ibseed, ictxt, ictxtb,
97 $ ierr_temp, imidpad, info, ipa, ipb, ipostpad,
98 $ iprepad, ipw, ipw_size, ipw_solve,
99 $ ipw_solve_size, ip_driver_w, ip_fillin, j, k,
100 $ , kpass, kskip, ktests, mycol, myrhs_size,
101 $ myrow, n, nb, nbw, ngrids, nmat, nnb, nnbr,
102 $ nnr, nout, np, npcol, nprocs, nprocs_real,
103 $ nprow, nq, nrhs, n_first, n_last, worksiz
105 DOUBLE PRECISION anorm, nops, nops2, sresid, tmflops,
109 INTEGER bwlval( ntests ), bwuval( ntests ), desca( 7 ),
110 $ desca2d( dlen_ ), descb( 7 ), descb2d( dlen_ ),
111 $ ierr( 1 ), nbrval( ntests ), nbval( ntests ),
112 $ nrval( ntests ), nval( ntests ),
113 $ pval( ntests ), qval( ntests )
114 DOUBLE PRECISION ctime( 2 ), mem( memsiz ), wtime( 2 )
117 EXTERNAL blacs_barrier, blacs_exit, blacs_get,
131 INTRINSIC dble,
max,
min, mod
134 DATA kfail, kpass, kskip, ktests / 4*0 /
143 CALL blacs_pinfo( iam, nprocs )
147 CALL pddtinfo( outfile, nout, trans, nmat, nval, ntests, nbw,
148 $ bwlval, bwuval, ntests, nnb, nbval, ntests, nnr,
149 $ nrval, ntests, nnbr, nbrval, ntests, ngrids, pval,
150 $ ntests, qval, ntests, thresh, mem, iam, nprocs )
152 check = ( thresh.GE.0.0d+0 )
157 WRITE( nout, fmt = * )
158 WRITE( nout, fmt = 9995 )
159 WRITE( nout, fmt = 9994 )
160 WRITE( nout, fmt = * )
173 IF( nprow.LT.1 )
THEN
175 $
WRITE( nout, fmt = 9999 )
'GRID',
'nprow', nprow
177 ELSE IF( npcol.LT.1 )
THEN
179 $
WRITE( nout, fmt = 9999 )
'GRID',
'npcol', npcol
181 ELSE IF( nprow*npcol.GT.nprocs )
THEN
183 $
WRITE( nout, fmt = 9998 ) nprow*npcol, nprocs
187 IF( ierr( 1 ).GT.0 )
THEN
189 $
WRITE( nout, fmt = 9997 )
'grid'
196 CALL blacs_get( -1, 0, ictxt )
202 CALL blacs_get( -1, 0, ictxtb )
208 CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
210.LT..OR..LT.
IF( MYROW0 MYCOL0 ) THEN
224 $ WRITE( NOUT, FMT = 9999 ) 'matrix
', 'n
', N
230 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1,
233.GT.
IF( IERR( 1 )0 ) THEN
235 $ WRITE( NOUT, FMT = 9997 ) 'size
'
241 DO 45 BW_NUM = 1, NBW
248 $ WRITE( NOUT, FMT = 9999 ) 'lower band
', 'bwl
', BWL
255 $ WRITE( NOUT, FMT = 9999 ) 'upper band
', 'bwu
', BWU
259.GT.
IF( BWLN-1 ) THEN
265.GT.
IF( BWUN-1 ) THEN
273 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1,
276.GT.
IF( IERR( 1 )0 ) THEN
287 NB =( (N-(NPCOL-1)*INT_ONE-1)/NPCOL + 1 )
289 NB = MAX( NB, 2*INT_ONE )
296.LT.
IF( NBMIN( 2*INT_ONE, N ) ) THEN
302 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1,
305.GT.
IF( IERR( 1 )0 ) THEN
312 NP = NUMROC( (3), (3),
314 NQ = NUMROC( N, NB, MYCOL, 0, NPCOL )
328 CALL DESCINIT( DESCA2D, N, (3),
330 $ ICTXTB, NB+10, IERR( 1 ) )
339 DESCA( 6 ) = ((3)+10)
342 IERR_TEMP = IERR( 1 )
344 IERR( 1 ) = MIN( IERR( 1 ), IERR_TEMP )
348 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1, -1, 0 )
350.LT.
IF( IERR( 1 )0 ) THEN
352 $ WRITE( NOUT, FMT = 9997 ) 'descriptor
'
364 FREE_PTR = FREE_PTR + IPREPAD
367 FREE_PTR = FREE_PTR + (NB+10)*(3)
383 FREE_PTR = FREE_PTR + IPREPAD
385 FREE_PTR = FREE_PTR + FILLIN_SIZE
398 FREE_PTR = FREE_PTR + IPW_SIZE
403.GT.
IF( FREE_PTRMEMSIZ ) THEN
405 $ WRITE( NOUT, FMT = 9996 )
406 $ 'divide and conquer factorization
',
413 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR,
416.GT.
IF( IERR( 1 )0 ) THEN
418 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
424 WORKSIZ = MAX( ((3)+10), NB )
432 WORKSIZ = MAX( WORKSIZ, DESCA2D( NB_ ) )
435 WORKSIZ = MAX( WORKSIZ,
439 FREE_PTR = FREE_PTR + IPREPAD
440 IP_DRIVER_W = FREE_PTR
441 FREE_PTR = FREE_PTR + WORKSIZ + IPOSTPAD
447.GT.
IF( FREE_PTRMEMSIZ ) THEN
449 $ WRITE( NOUT, FMT = 9996 ) 'factorization
',
450 $ ( FREE_PTR )*DBLESZ
456 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR,
459.GT.
IF( IERR( 1 )0 ) THEN
461 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
466 CALL PDBMATGEN( ICTXT, 't
', 'd
', BWL, BWU, N, (3), NB,
467 $ MEM( IPA ), NB+10, 0, 0, IASEED, MYROW,
468 $ MYCOL, NPROW, NPCOL )
469 CALL PDFILLPAD( ICTXT, NQ, NP, MEM( IPA-IPREPAD ),
470 $ NB+10, IPREPAD, IPOSTPAD,
473 CALL PDFILLPAD( ICTXT, WORKSIZ, 1,
474 $ MEM( IP_DRIVER_W-IPREPAD ), WORKSIZ,
475 $ IPREPAD, IPOSTPAD, PADVAL )
481 ANORM = PDLANGE( 'i
', N,
482 $ (3), MEM( IPA ), 1, 1,
483 $ DESCA2D, MEM( IP_DRIVER_W ) )
484 CALL PDCHEKPAD( ICTXT, 'pdlange', NQ, NP,
485 $ MEM( IPA-IPREPAD ), NB+10,
486 $ IPREPAD, IPOSTPAD, PADVAL )
487 CALL PDCHEKPAD( ICTXT, 'pdlange',
489 $ MEM( IP_DRIVER_W-IPREPAD ), WORKSIZ,
490 $ IPREPAD, IPOSTPAD, PADVAL )
495 CALL BLACS_BARRIER( ICTXT, 'all
' )
501 CALL PDDTTRF( N, MEM( IPA+2*( NB+10 ) ),
502 $ MEM( IPA+1*( NB+10 ) ), MEM( IPA ), 1,
503 $ DESCA, MEM( IP_FILLIN ), FILLIN_SIZE,
504 $ MEM( IPW ), IPW_SIZE, INFO )
510 WRITE( NOUT, FMT = * ) 'pddttrf info=
', INFO
520 CALL PDCHEKPAD( ICTXT, 'pddttrf', NQ,
521 $ NP, MEM( IPA-IPREPAD ), NB+10,
522 $ IPREPAD, IPOSTPAD, PADVAL )
536 CALL DESCINIT( DESCB2D, N, NRHS, NB, 1, 0, 0,
537 $ ICTXTB, NB+10, IERR( 1 ) )
546 DESCB( 6 ) = DESCB2D( LLD_ )
555 FREE_PTR = FREE_PTR + IPREPAD
557 FREE_PTR = FREE_PTR + NRHS*DESCB2D( LLD_ )
562 IPW_SOLVE_SIZE = 10*NPCOL+4*NRHS
565 FREE_PTR = FREE_PTR + IPW_SOLVE_SIZE
568.GT.
IF( FREE_PTRMEMSIZ ) THEN
570 $ WRITE( NOUT, FMT = 9996 )'solve
',
571 $ ( FREE_PTR )*DBLESZ
577 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1,
580.GT.
IF( IERR( 1 )0 ) THEN
582 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
587 MYRHS_SIZE = NUMROC( N, NB, MYCOL, 0, NPCOL )
591 CALL PDMATGEN(ICTXTB, 'no
', 'no
',
592 $ DESCB2D( M_ ), DESCB2D( N_ ),
593 $ DESCB2D( MB_ ), DESCB2D( NB_ ),
595 $ DESCB2D( LLD_ ), DESCB2D( RSRC_ ),
597 $ IBSEED, 0, MYRHS_SIZE, 0, NRHS, MYCOL,
598 $ MYROW, NPCOL, NPROW )
601 CALL PDFILLPAD( ICTXTB, NB, NRHS,
602 $ MEM( IPB-IPREPAD ),
606 CALL PDFILLPAD( ICTXT, WORKSIZ, 1,
607 $ MEM( IP_DRIVER_W-IPREPAD ),
613 CALL BLACS_BARRIER( ICTXT, 'all
')
618 CALL PDDTTRS( TRANS, N, NRHS,
619 $ MEM( IPA+2*( NB+10 ) ),
620 $ MEM( IPA+1*( NB+10 ) ), MEM( IPA ),
621 $ 1, DESCA, MEM( IPB ), 1, DESCB,
622 $ MEM( IP_FILLIN ), FILLIN_SIZE,
623 $ MEM( IPW_SOLVE ), IPW_SOLVE_SIZE,
630 $ WRITE( NOUT, FMT = * ) 'pddttrs info=
', INFO
640 CALL PDCHEKPAD( ICTXT, 'pddttrs-work
',
642 $ MEM( IP_DRIVER_W-IPREPAD ),
653 CALL DESCINIT( DESCA2D, (3), N,
655 $ ICTXT, (3), IERR( 1 ) )
656 CALL PDDTLASCHK( 'n
', 'd
', TRANS,
658 $ MEM( IPB ), 1, 1, DESCB2D,
659 $ IASEED, MEM( IPA ), 1, 1, DESCA2D,
660 $ IBSEED, ANORM, SRESID,
661 $ MEM( IP_DRIVER_W ), WORKSIZ )
664.GT.
IF( SRESIDTHRESH )
665 $ WRITE( NOUT, FMT = 9985 ) SRESID
670.LE..AND.
IF( ( SRESIDTHRESH )
671.EQ.
$ ( (SRESID-SRESID)0.0D+0 ) ) THEN
686 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'w
', 2, 1,
688 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'c
', 2, 1,
693.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
699 NPROCS_REAL = ( N-1 )/NB + 1
700 N_LAST = MOD( N-1, NB ) + 1
705 NOPS = 2*(DBLE(N)*DBLE(BWL)*
707 $ (DBLE(N)*DBLE(BWL))
712 $ 2 * (DBLE(N)*(DBLE(BWL)+DBLE(INT_ONE))
720 NOPS2 = 2*( (DBLE(N_FIRST)*
721 $ DBLE(BWL)*DBLE(BWU)))
723.GT.
IF ( NPROCS_REAL 1) THEN
729 $ 8*( (DBLE(N_LAST)*DBLE(BWL)
733.GT.
IF ( NPROCS_REAL 2) THEN
737 NOPS2 = NOPS2 + (NPROCS_REAL-2)*
738 $ 8*( (DBLE(NB)*DBLE(BWL)
745 $ 2*( NPROCS_REAL-1 ) *
746 $ ( BWL*INT_ONE*BWL/3 )
747.GT.
IF( NPROCS_REAL 1 ) THEN
749 $ 2*( NPROCS_REAL-2 ) *
750 $ (2*BWL*INT_ONE*BWL)
763 $ ( DBLE(BWL)+DBLE(INT_ONE))
765.GT.
IF ( NPROCS_REAL 1 ) THEN
773 $ (DBLE(N_LAST)*(DBLE(BWL)+
774 $ DBLE(INT_ONE)))*DBLE(NRHS)
777.GT.
IF ( NPROCS_REAL 2 ) THEN
784 $ ( NPROCS_REAL-2)*2*
785 $ ( (DBLE(NB)*(DBLE(BWL)+
786 $ DBLE(INT_ONE)))*DBLE(NRHS) )
792 $ NRHS*( NPROCS_REAL-1)*2*(BWL*INT_ONE )
793.GT.
IF( NPROCS_REAL 1 ) THEN
795 $ NRHS*( NPROCS_REAL-2 ) *
796 $ ( 6 * BWL*INT_ONE )
805.GT.
IF( WTIME( 1 ) + WTIME( 2 ) 0.0D+0 ) THEN
807 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
812.GT.
IF( WTIME( 1 )+WTIME( 2 )0.0D+0 ) THEN
814 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
819.GE.
IF( WTIME( 2 )0.0D+0 )
820 $ WRITE( NOUT, FMT = 9993 ) 'wall
', TRANS,
823 $ NB, NRHS, NPROW, NPCOL,
824 $ WTIME( 1 ), WTIME( 2 ), TMFLOPS,
829.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
831 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
836.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
838 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
843.GE.
IF( CTIME( 2 )0.0D+0 )
844 $ WRITE( NOUT, FMT = 9993 ) 'cpu
', TRANS,
847 $ NB, NRHS, NPROW, NPCOL,
848 $ CTIME( 1 ), CTIME( 2 ), TMFLOPS,
864 CALL BLACS_GRIDEXIT( ICTXT )
865 CALL BLACS_GRIDEXIT( ICTXTB )
875 KTESTS = KPASS + KFAIL + KSKIP
876 WRITE( NOUT, FMT = * )
877 WRITE( NOUT, FMT = 9992 ) KTESTS
879 WRITE( NOUT, FMT = 9991 ) KPASS
880 WRITE( NOUT, FMT = 9989 ) KFAIL
882 WRITE( NOUT, FMT = 9990 ) KPASS
884 WRITE( NOUT, FMT = 9988 ) KSKIP
885 WRITE( NOUT, FMT = * )
886 WRITE( NOUT, FMT = * )
887 WRITE( NOUT, FMT = 9987 )
888.NE..AND..NE.
IF( NOUT6 NOUT0 )
894 9999 FORMAT( 'illegal
', A6, ':
', A5, ' =
', I3,
895 $ '; it should be at least 1
' )
896 9998 FORMAT( 'illegal grid: nprow*npcol =
', I4, '. it can be at most
',
898 9997 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
899 9996 FORMAT( 'unable to perform
', A, ': need totmem of at least
',
901 9995 FORMAT( 'time tr n bwl bwu nb nrhs p q l*u time
',
902 $ 'slv time mflops mflop2 check
' )
903 9994 FORMAT( '---- -- ------ --- --- ---- ----- ---- ---- --------
',
904 $ '-------- -------- -------- ------
' )
905 9993 FORMAT( A4,1X,A1,2X,I6,1X,I3,1X,I3,1X,I4,1X,I5,
906 $ 1X,I4,1X,I4,1X,F9.3,
907 $ F9.4, F9.2, F9.2, 1X, A6 )
908 9992 FORMAT( 'finished
', I6, ' tests, with
the following results:
' )
909 9991 FORMAT( I5, ' tests completed and passed residual checks.
' )
910 9990 FORMAT( I5, ' tests completed without checking.
' )
911 9989 FORMAT( I5, ' tests completed and failed residual checks.
' )
912 9988 FORMAT( I5, ' tests skipped because of illegal input values.
' )
913 9987 FORMAT( 'END OF TESTS.
' )
914 9986 FORMAT( '||A -
', A4, '|| / (||A|| * N * eps) =
', G25.7 )
915 9985 FORMAT( '||Ax-b||/(||x||*||A||*eps*N)
', F25.7 )
subroutine pdmatgen(ictxt, aform, diag, m, n, mb, nb, a, lda, iarow, iacol, iseed, iroff, irnum, icoff, icnum, myrow, mycol, nprow, npcol)
end diagonal values have been computed in the(sparse) matrix id.SOL
logical function lsame(ca, cb)
LSAME
subroutine blacs_gridinit(cntxt, c, nprow, npcol)
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
subroutine blacs_gridexit(cntxt)
double precision function pdlange(norm, m, n, a, ia, ja, desca, work)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pdbmatgen(ictxt, aform, aform2, bwl, bwu, n, mb, nb, a, lda, iarow, iacol, iseed, myrow, mycol, nprow, npcol)
subroutine pdchekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine pddtinfo(summry, nout, trans, nmat, nval, ldnval, nbw, bwlval, bwuval, ldbwval, nnb, nbval, ldnbval, nnr, nrval, ldnrval, nnbr, nbrval, ldnbrval, ngrids, pval, ldpval, qval, ldqval, thresh, work, iam, nprocs)
subroutine pddtlaschk(symm, uplo, trans, n, bwl, bwu, nrhs, x, ix, jx, descx, iaseed, a, ia, ja, desca, ibseed, anorm, resid, work, worksiz)
subroutine pddttrf(n, dl, d, du, ja, desca, af, laf, work, lwork, info)
subroutine pddttrs(trans, n, nrhs, dl, d, du, ja, desca, b, ib, descb, af, laf, work, lwork, info)
subroutine pdfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)