75 parameter( totmem = 3000000 )
76 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
77 $ lld_, mb_, , nb_, n_, rsrc_
78 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
79 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
80 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
83 INTEGER cplxsz, memsiz, ntests
85 parameter( cplxsz = 8,
86 $ memsiz = totmem / cplxsz, ntests = 20,
87 $ padval = ( -9923.0e+0, -9923.0e+0 ),
90 parameter( int_one = 1 )
97 INTEGER , bwu, bw_num, fillin_size, free_ptr, h, hh,
98 $ i, iam, iaseed, ibseed
102 $ kfail, kpass, kskip, ktests, , myrhs_size,
103 $ myrow, n, , nbw, ngrids, nmat, nnb, nnbr,
104 $ nnr, nout, np, npcol, nprocs, nprocs_real,
105 $ nprow, nq, nrhs, n_first, n_last, worksiz
106 REAL anorm, sresid, thresh
107 DOUBLE PRECISION nops, nops2, tmflops, tmflops2
110 INTEGER bwlval( ntests ), bwuval( ntests ), desca( 7 ),
111 $ desca2d( dlen_ ), descb( 7 ), descb2d( dlen_ ),
112 $ ( 1 ), nbrval( ntests ), nbval( ntests ),
113 $ nrval( ntests ), nval( ntests ),
114 $ pval( ntests ), qval( ntests )
115 DOUBLE PRECISION ctime( 2 ), wtime( 2 )
116 COMPLEX mem( memsiz )
119 EXTERNAL blacs_barrier, blacs_exit, blacs_get,
136 DATA kfail, kpass, kskip, ktests / 4*0 /
145 CALL blacs_pinfo( iam, nprocs )
149 CALL pcdtinfo( outfile, nout, trans, nmat, nval, ntests, nbw,
150 $ bwlval, bwuval, ntests, nnb, nbval, ntests, nnr,
151 $ nrval, ntests, nnbr, nbrval, ntests, ngrids, pval,
152 $ ntests, qval, ntests, thresh, mem, iam, nprocs )
154 check = ( thresh.GE.0.0e+0 )
159 WRITE( nout, fmt = * )
160 WRITE( nout, fmt = 9995 )
161 WRITE( nout, fmt = 9994 )
162 WRITE( nout, fmt = * )
175 IF( nprow.LT.1 )
THEN
177 $
WRITE( nout, fmt = 9999 )
'GRID',
'nprow', nprow
179 ELSE IF( npcol.LT.1 )
THEN
181 $
WRITE( nout, fmt = 9999 )
'GRID',
'npcol', npcol
183 ELSE IF( nprow*npcol.GT.nprocs )
THEN
185 $
WRITE( nout, fmt = 9998 ) nprow*npcol, nprocs
189 IF( ierr( 1 ).GT.0 )
THEN
191 $
WRITE( nout, fmt = 9997 )
'grid'
198 CALL blacs_get( -1, 0, ictxt )
204 CALL blacs_get( -1, 0, ictxtb )
212 IF( myrow.LT.0 .OR. mycol.LT.0 )
THEN
226 $
WRITE( nout, fmt = 9999 )
'MATRIX',
'N', n
232 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
237 $
WRITE( nout, fmt = 9997 )
'size'
243 DO 45 bw_num = 1, nbw
250 $
WRITE( nout, fmt = 9999 )
'Lower Band',
'bwl', bwl
257 $
WRITE( nout, fmt = 9999 )
'Upper Band',
'bwu', bwu
261 IF( bwl.GT.n-1 )
THEN
267 IF( bwu.GT.n-1 )
THEN
275 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
278 IF( ierr( 1 ).GT.0 )
THEN
289 nb =( (n-(npcol-1)*int_one-1)/npcol + 1 )
291 nb =
max( nb, 2*int_one )
298 IF( nb.LT.
min( 2*int_one, n ) )
THEN
304 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
307 IF( ierr( 1 ).GT.0 )
THEN
316 nq =
numroc( n, nb, mycol, 0, npcol )
332 $ ictxtb, nb+10, ierr( 1 ) )
341 desca( 6 ) = ((3)+10)
344 ierr_temp = ierr( 1 )
346 ierr( 1 ) =
min( ierr( 1 ), ierr_temp )
350 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
352 IF( ierr( 1 ).LT.0 )
THEN
354 $
WRITE( nout, fmt = 9997 )
'descriptor'
366 free_ptr = free_ptr + iprepad
369 free_ptr = free_ptr + (nb+10)*(3)
385 free_ptr = free_ptr + iprepad
387 free_ptr = free_ptr + fillin_size
400 free_ptr = free_ptr + ipw_size
405 IF( free_ptr.GT.memsiz )
THEN
407 $
WRITE( nout, fmt = 9996 )
408 $
'divide and conquer factorization',
415 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr,
418 IF( ierr( 1 ).GT.0 )
THEN
420 $
WRITE( nout, fmt = 9997 )
'MEMORY'
426 worksiz =
max( ((3)+10), nb
434 worksiz =
max( worksiz, desca2d( nb_ ) )
437 worksiz =
max( worksiz,
441 free_ptr = free_ptr + iprepad
442 ip_driver_w = free_ptr
443 free_ptr = free_ptr + worksiz + ipostpad
449 IF( free_ptr.GT.memsiz )
THEN
451 $
WRITE( nout, fmt = 9996 )
'factorization',
452 $ ( free_ptr )*cplxsz
458 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr,
461 IF( ierr( 1 ).GT.0 )
THEN
463 $
WRITE( nout, fmt = 9997 )
'MEMORY'
468 CALL pcbmatgen( ictxt,
'T',
'D', bwl, bwu, n, (3), nb,
469 $ mem( ipa ), nb+10, 0, 0, iaseed, myrow,
470 $ mycol, nprow, npcol )
471 CALL pcfillpad( ictxt, nq, np, mem( ipa-iprepad ),
472 $ nb+10, iprepad, ipostpad,
476 $ mem( ip_driver_w-iprepad ), worksiz,
477 $ iprepad, ipostpad, padval )
484 $ (3), mem( ipa ), 1, 1,
485 $ desca2d, mem( ip_driver_w ) )
486 CALL pcchekpad( ictxt,
'PCLANGE', nq, np,
487 $ mem( ipa-iprepad ), nb+10,
488 $ iprepad, ipostpad, padval )
491 $ mem( ip_driver_w-iprepad ), worksiz,
492 $ iprepad, ipostpad, padval )
497 CALL blacs_barrier( ictxt,
'All' )
503 CALL pcdttrf( n, mem( ipa+2*( nb+10 ) ),
504 $ mem( ipa+1*( nb+10 ) ), mem( ipa ), 1,
505 $ desca, mem( ip_fillin ), fillin_size
506 $ mem( ipw ), ipw_size, info )
512 WRITE( nout, fmt = * )
'PCDTTRF INFO=', info
523 $ np, mem( ipa-iprepad ), nb+10,
524 $ iprepad, ipostpad, padval )
538 CALL descinit( descb2d, n, nrhs, nb, 1, 0, 0,
539 $ ictxtb, nb+10, ierr( 1 ) )
548 descb( 6 ) = descb2d( lld_ )
553 IF( ipb .GT. 0 )
THEN
557 free_ptr = free_ptr + iprepad
559 free_ptr = free_ptr + nrhs*descb2d( lld_ )
564 ipw_solve_size = 10*npcol+4*nrhs
567 free_ptr = free_ptr + ipw_solve_size
570 IF( free_ptr.GT.memsiz )
THEN
572 $
WRITE( nout, fmt = 9996 )
'solve',
573 $ ( free_ptr )*cplxsz
579 CALL igsum2d( ictxt, 'all
', ' ', 1, 1,
582.GT.
IF( IERR( 1 )0 ) THEN
584 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
589 MYRHS_SIZE = NUMROC( N, NB, MYCOL, 0, NPCOL )
593 CALL PCMATGEN(ICTXTB, 'no
', 'no
',
594 $ DESCB2D( M_ ), DESCB2D( N_ ),
595 $ DESCB2D( MB_ ), DESCB2D( NB_ ),
597 $ DESCB2D( LLD_ ), DESCB2D( RSRC_ ),
599 $ IBSEED, 0, MYRHS_SIZE, 0, NRHS, MYCOL,
600 $ MYROW, NPCOL, NPROW )
603 CALL PCFILLPAD( ICTXTB, NB, NRHS,
604 $ MEM( IPB-IPREPAD ),
608 CALL PCFILLPAD( ICTXT, WORKSIZ, 1,
609 $ MEM( IP_DRIVER_W-IPREPAD ),
615 CALL BLACS_BARRIER( ICTXT, 'all
')
620 CALL PCDTTRS( TRANS, N, NRHS,
621 $ MEM( IPA+2*( NB+10 ) ),
622 $ MEM( IPA+1*( NB+10 ) ), MEM( IPA ),
623 $ 1, DESCA, MEM( IPB ), 1, DESCB,
624 $ MEM( IP_FILLIN ), FILLIN_SIZE,
625 $ MEM( IPW_SOLVE ), IPW_SOLVE_SIZE,
632 $ WRITE( NOUT, FMT = * ) 'pcdttrs info=
', INFO
642 CALL PCCHEKPAD( ICTXT, 'pcdttrs-work
',
644 $ MEM( IP_DRIVER_W-IPREPAD ),
655 CALL DESCINIT( DESCA2D, (3), N,
657 $ ICTXT, (3), IERR( 1 ) )
658 CALL PCDTLASCHK( 'n
', 'd
', TRANS,
660 $ MEM( IPB ), 1, 1, DESCB2D,
661 $ IASEED, MEM( IPA ), 1, 1, DESCA2D,
662 $ IBSEED, ANORM, SRESID,
663 $ MEM( IP_DRIVER_W ), WORKSIZ )
666.GT.
IF( SRESIDTHRESH )
667 $ WRITE( NOUT, FMT = 9985 ) SRESID
672.LE..AND.
IF( ( SRESIDTHRESH )
673.EQ.
$ ( (SRESID-SRESID)0.0E+0 ) ) THEN
688 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'w
', 2, 1,
690 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'c
', 2, 1,
695.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
701 NPROCS_REAL = ( N-1 )/NB + 1
702 N_LAST = MOD( N-1, NB ) + 1
707 NOPS = 2*(DBLE(N)*DBLE(BWL)*
709 $ (DBLE(N)*DBLE(BWL))
714 $ 2 * (DBLE(N)*(DBLE(BWL)+DBLE(INT_ONE))
719 NOPS = NOPS * DBLE(4)
726 NOPS2 = 2*( (DBLE(N_FIRST)*
727 $ DBLE(BWL)*DBLE(BWU)))
729.GT.
IF ( NPROCS_REAL 1) THEN
735 $ 8*( (DBLE(N_LAST)*DBLE(BWL)
739.GT.
IF ( NPROCS_REAL 2) THEN
743 NOPS2 = NOPS2 + (NPROCS_REAL-2)*
744 $ 8*( (DBLE(NB)*DBLE(BWL)
751 $ 2*( NPROCS_REAL-1 ) *
752 $ ( BWL*INT_ONE*BWL/3 )
753.GT.
IF( NPROCS_REAL 1 ) THEN
755 $ 2*( NPROCS_REAL-2 ) *
756 $ (2*BWL*INT_ONE*BWL)
769 $ ( DBLE(BWL)+DBLE(INT_ONE))
771.GT.
IF ( NPROCS_REAL 1 ) THEN
779 $ (DBLE(N_LAST)*(DBLE(BWL)+
780 $ DBLE(INT_ONE)))*DBLE(NRHS)
783.GT.
IF ( NPROCS_REAL 2 ) THEN
790 $ ( NPROCS_REAL-2)*2*
791 $ ( (DBLE(NB)*(DBLE(BWL)+
792 $ DBLE(INT_ONE)))*DBLE(NRHS) )
798 $ NRHS*( NPROCS_REAL-1)*2*(BWL*INT_ONE )
799.GT.
IF( NPROCS_REAL 1 ) THEN
801 $ NRHS*( NPROCS_REAL-2 ) *
802 $ ( 6 * BWL*INT_ONE )
808 NOPS2 = NOPS2 * DBLE(4)
815.GT.
IF( WTIME( 1 ) + WTIME( 2 ) 0.0D+0 ) THEN
817 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
822.GT.
IF( WTIME( 1 )+WTIME( 2 )0.0D+0 ) THEN
824 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
829.GE.
IF( WTIME( 2 )0.0D+0 )
830 $ WRITE( NOUT, FMT = 9993 ) 'wall
', TRANS,
833 $ NB, NRHS, NPROW, NPCOL,
834 $ WTIME( 1 ), WTIME( 2 ), TMFLOPS,
839.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
841 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
846.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
848 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
853.GE.
IF( CTIME( 2 )0.0D+0 )
854 $ WRITE( NOUT, FMT = 9993 ) 'cpu
', TRANS,
857 $ NB, NRHS, NPROW, NPCOL,
858 $ CTIME( 1 ), CTIME( 2 ), TMFLOPS,
874 CALL BLACS_GRIDEXIT( ICTXT )
875 CALL BLACS_GRIDEXIT( ICTXTB )
885 KTESTS = KPASS + KFAIL + KSKIP
886 WRITE( NOUT, FMT = * )
887 WRITE( NOUT, FMT = 9992 ) KTESTS
889 WRITE( NOUT, FMT = 9991 ) KPASS
890 WRITE( NOUT, FMT = 9989 ) KFAIL
892 WRITE( NOUT, FMT = 9990 ) KPASS
894 WRITE( NOUT, FMT = 9988 ) KSKIP
895 WRITE( NOUT, FMT = * )
896 WRITE( NOUT, FMT = * )
897 WRITE( NOUT, FMT = 9987 )
898.NE..AND..NE.
IF( NOUT6 NOUT0 )
904 9999 FORMAT( 'illegal
', A6, ':
', A5, ' = ', i3,
905 $
'; It should be at least 1' )
906 9998
FORMAT(
'ILLEGAL GRID: nprow*npcol = ', i4, '. it can be at most
',
908 9997 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
909 9996 FORMAT( 'unable to perform
', A, ': need totmem of at least
',
911 9995 FORMAT( 'time tr n bwl bwu nb nrhs p q l*u time
',
912 $ 'slv time mflops mflop2 check
' )
913 9994 FORMAT( '---- -- ------ --- --- ---- ----- ---- ---- --------
',
914 $ '-------- -------- -------- ------
' )
915 9993 FORMAT( A4,1X,A1,2X,I6,1X,I3,1X,I3,1X,I4,1X,I5,
916 $ 1X,I4,1X,I4,1X,F9.3,
917 $ F9.4, F9.2, F9.2, 1X, A6 )
918 9992 FORMAT( 'finished
', I6, ' tests, with
the following results:
' )
919 9991 FORMAT( I5, ' tests completed and passed residual checks.
' )
920 9990 FORMAT( I5, ' tests completed without checking.
' )
921 9989 FORMAT( I5, ' tests completed and failed residual checks.
' )
922 9988 FORMAT( I5, ' tests skipped because of illegal input values.
' )
923 9987 FORMAT( 'END OF TESTS.
' )
924 9986 FORMAT( '||A -
', A4, '|| / (||A|| * N * eps) =
', G25.7 )
925 9985 FORMAT( '||Ax-b||/(||x||*||A||*eps*N)
', F25.7 )
subroutine pcmatgen(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)
real function pclange(norm, m, n, a, ia, ja, desca, work)
subroutine blacs_gridexit(cntxt)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pcbmatgen(ictxt, aform, aform2, bwl, bwu, n, mb, nb, a, lda, iarow, iacol, iseed, myrow, mycol, nprow, npcol)
subroutine pcchekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine pcdtinfo(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 pcdtlaschk(symm, uplo, trans, n, bwl, bwu, nrhs, x, ix, jx, descx, iaseed, a, ia, ja, desca, ibseed, anorm, resid, work, worksiz)
subroutine pcdttrf(n, dl, d, du, ja, desca, af, laf, work, lwork, info)
subroutine pcdttrs(trans, n, nrhs, dl, d, du, ja, desca, b, ib, descb, af, laf, work, lwork, info)
subroutine pcfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)