75 parameter( totmem = 3000000 )
76 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
77 $ lld_, mb_, m_, 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 memsiz, ntests, zplxsz
85 parameter( zplxsz = 16,
86 $ memsiz = totmem / zplxsz, ntests = 20,
87 $ padval = ( -9923.0d+0, -9923.0d+0 ),
90 parameter( int_one = 1 )
97 INTEGER bwl, bwu, bw_num, fillin_size, free_ptr, h, hh,
98 $ i, iam, iaseed, ibseed, ictxt, ictxtb,
99 $ ierr_temp, imidpad, info, ipa, ipb, ipostpad,
100 $ iprepad, ipw, ipw_size, ipw_solve,
101 $ ipw_solve_size, ip_driver_w, ip_fillin, j, k,
102 $ kfail, kpass, kskip, ktests, mycol, myrhs_size,
103 $ myrow, n, nb, nbw, ngrids, nmat, nnb, nnbr,
104 $ nnr, nout, np, npcol, nprocs, nprocs_real,
105 $ nprow, nq, nrhs, n_first, n_last, worksiz
107 DOUBLE PRECISION anorm, nops, nops2, sresid, tmflops,
111 INTEGER bwlval( ntests ), bwuval( ntests ), desca( 7 ),
116DOUBLE PRECISION ctime( 2 ), wtime( 2 )
117 COMPLEX*16 mem( memsiz )
120 EXTERNAL blacs_barrier, blacs_exit, blacs_get,
134 INTRINSIC dble,
max,
min, mod
137 DATA kfail, kpass, kskip, ktests / 4*0 /
146 CALL blacs_pinfo( iam, nprocs )
150 CALL pzdtinfo( outfile, nout, trans, nmat, nval, ntests, nbw,
151 $ bwlval, bwuval, ntests, nnb, nbval, ntests, nnr,
152 $ nrval, ntests, nnbr, nbrval, ntests, ngrids, pval,
153 $ ntests, qval, ntests, thresh, mem, iam, nprocs )
155 check = ( thresh.GE.0.0d+0 )
160WRITE( nout, fmt = * )
161 WRITE( nout, fmt = 9995 )
162 WRITE( nout, fmt = 9994 )
163 WRITE( nout, fmt = * )
176 IF( nprow.LT.1 )
THEN
178 $
WRITE( nout, fmt = 9999 )
'GRID',
'nprow', nprow
180 ELSE IF( npcol.LT.1 )
THEN
182 $
WRITE( nout, fmt = 9999 )
'GRID',
'npcol', npcol
184 ELSE IF( nprow*npcol.GT.nprocs )
THEN
186 $
WRITE( nout, fmt = 9998 ) nprow*npcol, nprocs
190 IF( ierr( 1 ).GT.0 )
THEN
192 $
WRITE( nout, fmt = 9997 )
'grid'
199 CALL blacs_get( -1, 0, ictxt )
205 CALL blacs_get( -1, 0, ictxtb )
211 CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
213.LT..OR..LT.
IF( MYROW0 MYCOL0 ) THEN
227 $ WRITE( NOUT, FMT = 9999 ) 'matrix
', 'n
', N
233 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1,
236.GT.
IF( IERR( 1 )0 ) THEN
238 $ WRITE( NOUT, FMT = 9997 ) 'size
'
244 DO 45 BW_NUM = 1, NBW
251 $ WRITE( NOUT, FMT = 9999 ) 'lower band
', 'bwl
', BWL
258 $ WRITE( NOUT, FMT = 9999 ) 'upper band
', 'bwu
', BWU
262.GT.
IF( BWLN-1 ) THEN
268.GT.
IF( BWUN-1 ) THEN
276 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, ierr, 1,
279 IF( ierr( 1 ).GT.0 )
THEN
290 nb =( (n-(npcol-1)*int_one-1)/npcol
292 nb =
max( nb, 2*int_one )
299 IF( nb.LT.
min( 2*int_one, n ) )
THEN
305 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
308 IF( ierr( 1 ).GT.0 )
THEN
317 nq =
numroc( n, nb, mycol, 0, npcol )
333 $ ictxtb, nb+10, ierr( 1 ) )
345 ierr_temp = ierr( 1 )
347 ierr( 1 ) =
min( ierr( 1 ), ierr_temp )
351 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
353 IF( ierr( 1 ).LT.0 )
THEN
355 $
WRITE( nout, fmt = 9997 )
'descriptor'
367 free_ptr = free_ptr + iprepad
370 free_ptr = free_ptr + (nb+10)*(3)
386 free_ptr = free_ptr + iprepad
388 free_ptr = free_ptr + fillin_size
401 free_ptr = free_ptr + ipw_size
406 IF( free_ptr.GT.memsiz )
THEN
408 $
WRITE( nout, fmt = 9996 )
409 $
'divide and conquer factorization',
416 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr,
419 IF( ierr( 1 ).GT.0 )
THEN
421 $
WRITE( nout, fmt = 9997 )
'MEMORY'
427 worksiz =
max( ((3)+10), nb )
435 worksiz =
max( worksiz, desca2d( nb_ ) )
438 worksiz =
max( worksiz,
442 free_ptr = free_ptr + iprepad
443 ip_driver_w = free_ptr
444 free_ptr = free_ptr + worksiz + ipostpad
450 IF( free_ptr.GT.memsiz )
THEN
452 $
WRITE( nout, fmt = 9996 )
'factorization',
453 $ ( free_ptr )*zplxsz
459 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr,
462 IF( ierr( 1 ).GT.0 )
THEN
464 $
WRITE( nout, fmt = 9997 )
'MEMORY'
469 CALL pzbmatgen( ictxt,
'T',
'D', bwl, bwu, n, (3), nb,
470 $ mem( ipa ), nb+10, 0, 0, iaseed, myrow,
471 $ mycol, nprow, npcol )
472 CALL pzfillpad( ictxt, nq, np, mem( ipa-iprepad ),
473 $ nb+10, iprepad, ipostpad,
477 $ mem( ip_driver_w-iprepad ), worksiz,
478 $ iprepad, ipostpad, padval )
485 $ (3), mem( ipa ), 1, 1,
486 $ desca2d, mem( ip_driver_w ) )
487 CALL pzchekpad( ictxt,
'PZLANGE', nq, np,
488 $ mem( ipa-iprepad ), nb+10,
489 $ iprepad, ipostpad, padval )
492 $ mem( ip_driver_w-iprepad ), worksiz,
493 $ iprepad, ipostpad, padval )
498 CALL blacs_barrier( ictxt,
'All' )
504 CALL pzdttrf( n, mem( ipa+2*( nb+10 ) ),
505 $ mem( ipa+1*( nb+10 ) ), mem( ipa ), 1,
506 $ desca, mem( ip_fillin ), fillin_size,
507 $ mem( ipw ), ipw_size, info )
513 WRITE( nout, fmt = * )
'PZDTTRF INFO=', info
539 CALL descinit( descb2d, n, nrhs, nb, 1, 0, 0,
540 $ ictxtb, nb+10, ierr( 1 ) )
549 descb( 6 ) = descb2d( lld_ )
554 IF( ipb .GT. 0 )
THEN
558 free_ptr = free_ptr + iprepad
560 free_ptr = free_ptr + nrhs*descb2d( lld_ )
565 ipw_solve_size = 10*npcol+4*nrhs
568 free_ptr = free_ptr + ipw_solve_size
571 IF( free_ptr.GT.memsiz )
THEN
573 $
WRITE( nout, fmt = 9996 )
'solve',
574 $ ( free_ptr )*zplxsz
580 CALL igsum2d( ictxt,
'All',
' ', 1, 1,
583 IF( ierr( 1 ).GT.0 )
THEN
585 $
WRITE( nout, fmt = 9997 ) 'memory
'
590 MYRHS_SIZE = NUMROC( N, NB, MYCOL, 0, NPCOL )
594 CALL PZMATGEN(ICTXTB, 'no
', 'no
',
595 $ DESCB2D( M_ ), DESCB2D( N_ ),
596 $ DESCB2D( MB_ ), DESCB2D( NB_ ),
598 $ DESCB2D( LLD_ ), DESCB2D( RSRC_ ),
600 $ IBSEED, 0, MYRHS_SIZE, 0, NRHS, MYCOL,
601 $ MYROW, NPCOL, NPROW )
604 CALL PZFILLPAD( ICTXTB, NB, NRHS,
605 $ MEM( IPB-IPREPAD ),
609 CALL PZFILLPAD( ICTXT, WORKSIZ, 1,
610 $ MEM( IP_DRIVER_W-IPREPAD ),
616 CALL BLACS_BARRIER( ICTXT, 'all
')
621 CALL PZDTTRS( TRANS, N, NRHS,
622 $ MEM( IPA+2*( NB+10 ) ),
623 $ MEM( IPA+1*( NB+10 ) ), MEM( IPA ),
624 $ 1, DESCA, MEM( IPB ), 1, DESCB,
625 $ MEM( IP_FILLIN ), FILLIN_SIZE,
626 $ MEM( IPW_SOLVE ), IPW_SOLVE_SIZE,
633 $ WRITE( NOUT, FMT = * ) 'pzdttrs info=
', INFO
643 CALL PZCHEKPAD( ICTXT, 'pzdttrs-work
',
645 $ MEM( IP_DRIVER_W-IPREPAD ),
656 CALL DESCINIT( DESCA2D, (3), N,
658 $ ICTXT, (3), IERR( 1 ) )
659 CALL PZDTLASCHK( 'n
', 'd
', TRANS,
661 $ MEM( IPB ), 1, 1, DESCB2D,
662 $ IASEED, MEM( IPA ), 1, 1, DESCA2D,
663 $ IBSEED, ANORM, SRESID,
664 $ MEM( IP_DRIVER_W ), WORKSIZ )
667.GT.
IF( SRESIDTHRESH )
668 $ WRITE( NOUT, FMT = 9985 ) SRESID
673.LE..AND.
IF( ( SRESIDTHRESH )
674.EQ.
$ ( (SRESID-SRESID)0.0D+0 ) ) THEN
689 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'w
', 2, 1,
691 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'c
', 2, 1,
696.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
702 NPROCS_REAL = ( N-1 )/NB + 1
703 N_LAST = MOD( N-1, NB ) + 1
708 NOPS = 2*(DBLE(N)*DBLE(BWL)*
710 $ (DBLE(N)*DBLE(BWL))
715 $ 2 * (DBLE(N)*(DBLE(BWL)+DBLE(INT_ONE))
720 NOPS = NOPS * DBLE(4)
727 NOPS2 = 2*( (DBLE(N_FIRST)*
728 $ DBLE(BWL)*DBLE(BWU)))
730.GT.
IF ( NPROCS_REAL 1) THEN
736 $ 8*( (DBLE(N_LAST)*DBLE(BWL)
740.GT.
IF ( NPROCS_REAL 2) THEN
744 NOPS2 = NOPS2 + (NPROCS_REAL-2)*
745 $ 8*( (DBLE(NB)*DBLE(BWL)
752 $ 2*( NPROCS_REAL-1 ) *
753 $ ( BWL*INT_ONE*BWL/3 )
754.GT.
IF( NPROCS_REAL 1 ) THEN
756 $ 2*( NPROCS_REAL-2 ) *
757 $ (2*BWL*INT_ONE*BWL)
770 $ ( DBLE(BWL)+DBLE(INT_ONE))
772.GT.
IF ( NPROCS_REAL 1 ) THEN
780 $ (DBLE(N_LAST)*(DBLE(BWL)+
781 $ DBLE(INT_ONE)))*DBLE(NRHS)
784.GT.
IF ( NPROCS_REAL 2 ) THEN
791 $ ( NPROCS_REAL-2)*2*
792 $ ( (DBLE(NB)*(DBLE(BWL)+
793 $ DBLE(INT_ONE)))*DBLE(NRHS) )
799 $ NRHS*( NPROCS_REAL-1)*2*(BWL*INT_ONE )
800.GT.
IF( NPROCS_REAL 1 ) THEN
802 $ NRHS*( NPROCS_REAL-2 ) *
803 $ ( 6 * BWL*INT_ONE )
809 NOPS2 = NOPS2 * DBLE(4)
816.GT.
IF( WTIME( 1 ) + WTIME( 2 ) 0.0D+0 ) THEN
818 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
823.GT.
IF( WTIME( 1 )+WTIME( 2 )0.0D+0 ) THEN
825 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
830.GE.
IF( WTIME( 2 )0.0D+0 )
831 $ WRITE( NOUT, FMT = 9993 ) 'wall
', TRANS,
834 $ NB, NRHS, NPROW, NPCOL,
835 $ WTIME( 1 ), WTIME( 2 ), TMFLOPS,
840.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
842 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
847.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
849 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
854.GE.
IF( CTIME( 2 )0.0D+0 )
855 $ WRITE( NOUT, FMT = 9993 ) 'cpu
', TRANS,
858 $ NB, NRHS, NPROW, NPCOL,
859 $ CTIME( 1 ), CTIME( 2 ), TMFLOPS,
875 CALL BLACS_GRIDEXIT( ICTXT )
876 CALL BLACS_GRIDEXIT( ICTXTB )
886 KTESTS = KPASS + KFAIL + KSKIP
887 WRITE( NOUT, FMT = * )
888 WRITE( NOUT, FMT = 9992 ) KTESTS
890 WRITE( NOUT, FMT = 9991 ) KPASS
891 WRITE( NOUT, FMT = 9989 ) KFAIL
893 WRITE( NOUT, FMT = 9990 ) KPASS
895 WRITE( NOUT, FMT = 9988 ) KSKIP
896 WRITE( NOUT, FMT = * )
897 WRITE( NOUT, FMT = * )
898 WRITE( NOUT, FMT = 9987 )
899.NE..AND..NE.
IF( NOUT6 NOUT0 )
905 9999 FORMAT( 'illegal
', A6, ':
', A5, ' =
', I3,
906 $ '; it should be at least 1
' )
907 9998 FORMAT( 'illegal grid: nprow*npcol =
', I4, '. it can be at most
',
909 9997 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
910 9996 FORMAT( 'unable to perform
', A, ': need totmem of at least
',
912 9995 FORMAT( 'time tr n bwl bwu nb nrhs p q l*u time
',
913 $ 'slv time mflops mflop2 check
' )
914 9994 FORMAT( '---- -- ------ --- --- ---- ----- ---- ---- --------
',
915 $ '-------- -------- -------- ------
' )
916 9993 FORMAT( A4,1X,A1,2X,I6,1X,I3,1X,I3,1X,I4,1X,I5,
917 $ 1X,I4,1X,I4,1X,F9.3,
918 $ F9.4, F9.2, F9.2, 1X, A6 )
919 9992 FORMAT( 'finished
', I6, ' tests, with
the following results:
' )
920 9991 FORMAT( I5, ' tests completed and passed residual checks.
' )
921 9990 FORMAT( I5, ' tests completed without checking.
' )
922 9989 FORMAT( I5, ' tests completed and failed residual checks.
' )
923 9988 FORMAT( I5, ' tests skipped because of illegal input values.
' )
924 9987 FORMAT( 'END OF TESTS.
' )
925 9986 FORMAT( '||A -
', A4, '|| / (||A|| * N * eps) =
', G25.7 )
926 9985 FORMAT( '||Ax-b||/(||x||*||A||*eps*N)
', F25.7 )
subroutine pzmatgen(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)
double precision function pzlange(norm, m, n, a, ia, ja, desca, work)
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
subroutine blacs_gridexit(cntxt)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pzbmatgen(ictxt, aform, aform2, bwl, bwu, n, mb, nb, a, lda, iarow, iacol, iseed, myrow, mycol, nprow, npcol)
subroutine pzchekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine pzdtinfo(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 pzdtlaschk(symm, uplo, trans, n, bwl, bwu, nrhs, x, ix, jx, descx, iaseed, a, ia, ja, desca, ibseed, anorm, resid, work, worksiz)
subroutine pzdttrf(n, dl, d, du, ja, desca, af, laf, work, lwork, info)
subroutine pzdttrs(trans, n, nrhs, dl, d, du, ja, desca, b, ib, descb, af, laf, work, lwork, info)
subroutine pzfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)