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 bw, bw_num, fillin_size, free_ptr, h, hh, i,
98 $ iam, iaseed, ibseed, ictxt, ictxtb, ierr_temp,
99 $ imidpad, info, ipa, ipb, ipostpad, iprepad,
100 $ ipw, ipw_size, ipw_solve, ipw_solve_size,
101 $ ip_driver_w, ip_fillin, j, k, kfail, kpass,
102 $ kskip, ktests, mycol, myrhs_size, myrow, n, nb,
103 $ nbw, ngrids, nmat, nnb, nnbr, nnr, nout, np,
104 $ npcol, nprocs, nprocs_real, nprow, nq, nrhs,
105 $ n_first, n_last, worksiz
107 DOUBLE PRECISION anorm, nops, nops2, sresid, tmflops,
111 INTEGER bwval( ntests ), desca( 7 ), desca2d( dlen_ ),
112 $ descb( 7 ), descb2d( dlen_ ), ( 1 ),
113 $ nbrval( ntests ), nbval( ntests ),
114 $ nrval( ntests ), nval( ntests ),
115 $ pval( ntests ), qval( ntests )
116 DOUBLE 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 pzpbinfo( outfile, nout, uplo, nmat, nval, ntests, nbw,
151 $ bwval, ntests, nnb, nbval, ntests, nnr, nrval,
152 $ ntests, nnbr, nbrval, ntests, ngrids, pval, ntests,
153 $ qval, ntests, thresh, mem, iam, nprocs )
155 check = ( thresh.GE.0.0d+0 )
160 WRITE( 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 )
213 IF( myrow.LT.0 .OR. mycol.LT.0 )
THEN
227 $
WRITE( nout, fmt = 9999 )
'MATRIX',
'N',
233 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
236 IF( ierr( 1 ).GT.0 )
THEN
238 $
WRITE( nout, fmt = 9997 )
'size'
244 DO 45 bw_num = 1, nbw
251 $
WRITE( nout, fmt = 9999 )
'Band',
'bw', bw
261 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
264 IF( ierr( 1 ).GT.0 )
THEN
275 nb =( (n-(npcol-1)*bw-1)/npcol + 1 )
284 IF( nb.LT.
min( 2*bw, n ) )
THEN
290 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
293 IF( ierr( 1 ).GT.0 )
THEN
300 np =
numroc( (bw+1), (bw+1),
302 nq =
numroc( n, nb, mycol, 0, npcol )
305 iprepad = ((bw+1)+10)
307 ipostpad = ((bw+1)+10)
318 $ ictxt,((bw+1)+10), ierr( 1 ) )
327 desca( 6 ) = ((bw+1)+10)
330 ierr_temp = ierr( 1 )
332 ierr( 1 ) =
min( ierr( 1 ), ierr_temp )
336 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
338 IF( ierr( 1 ).LT.0 )
THEN
340 $
WRITE( nout, fmt = 9997 )
'descriptor'
352 free_ptr = free_ptr + iprepad
355 free_ptr = free_ptr + desca2d( lld_ )*
372 free_ptr = free_ptr + iprepad
374 free_ptr = free_ptr + fillin_size
387 free_ptr = free_ptr + ipw_size
392 IF( free_ptr.GT.memsiz )
THEN
394 $
WRITE( nout, fmt = 9996 )
395 $
'divide and conquer factorization',
402 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr,
405 IF( ierr( 1 ).GT.0 )
THEN
407 $
WRITE( nout, fmt = 9997 )
'MEMORY'
413 worksiz =
max( ((bw+1)+10), nb )
421 worksiz =
max( worksiz, desca2d( nb_ ) )
424 worksiz =
max( worksiz,
425 $
max(5,
max(bw*(bw+2),nb))+2*nb )
428 free_ptr = free_ptr + iprepad
429 ip_driver_w = free_ptr
430 free_ptr = free_ptr + worksiz + ipostpad
436 IF( free_ptr.GT.memsiz )
THEN
438 $
WRITE( nout, fmt = 9996 )
'factorization',
439 $ ( free_ptr )*zplxsz
445 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr,
448 IF( ierr( 1 ).GT.0 )
THEN
450 $
WRITE( nout, fmt = 9997 )
'MEMORY'
455 CALL pzbmatgen( ictxt, uplo,
'B', bw, bw, n, (bw+1), nb,
456 $ mem( ipa ), ((bw+1)+10), 0, 0, iaseed,
457 $ myrow, mycol, nprow, npcol )
459 CALL pzfillpad( ictxt, np, nq, mem( ipa-iprepad ),
460 $ ((bw+1)+10), iprepad, ipostpad,
464 $ mem( ip_driver_w-iprepad ), worksiz,
465 $ iprepad, ipostpad, padval )
472 $ n, mem( ipa ), 1, 1,
473 $ desca2d, mem( ip_driver_w ) )
474 CALL pzchekpad( ictxt,
'PZLANGE', np, nq,
475 $ mem( ipa-iprepad ), ((bw+1)+10),
476 $ iprepad, ipostpad, padval )
479 $ mem( ip_driver_w-iprepad ), worksiz,
480 $ iprepad, ipostpad, padval )
485 CALL blacs_barrier( ictxt,
'All' )
491 CALL pzpbtrf( uplo, n, bw, mem( ipa ), 1, desca,
492 $ mem( ip_fillin ), fillin_size, mem( ipw ),
499 WRITE( nout, fmt = * ) '
pzpbtrf info=
', INFO
509 CALL PZCHEKPAD( ICTXT, 'pzpbtrf', NP,
510 $ NQ, MEM( IPA-IPREPAD ), ((BW+1)+10),
511 $ IPREPAD, IPOSTPAD, PADVAL )
525 CALL DESCINIT( DESCB2D, N, NRHS, NB, 1, 0, 0,
526 $ ICTXTB, NB+10, IERR( 1 ) )
535 DESCB( 6 ) = DESCB2D( LLD_ )
544 FREE_PTR = FREE_PTR + IPREPAD
546 FREE_PTR = FREE_PTR + NRHS*DESCB2D( LLD_ )
551 IPW_SOLVE_SIZE = (BW*NRHS)
554 FREE_PTR = FREE_PTR + IPW_SOLVE_SIZE
557.GT.
IF( FREE_PTRMEMSIZ ) THEN
559 $ WRITE( NOUT, FMT = 9996 )'solve
',
560 $ ( FREE_PTR )*ZPLXSZ
566 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1,
569.GT.
IF( IERR( 1 )0 ) THEN
571 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
576 MYRHS_SIZE = NUMROC( N, NB, MYCOL, 0, NPCOL )
580 CALL PZMATGEN(ICTXTB, 'no
', 'no',
581 $ descb2d( m_ ), descb2d( n_ ),
582 $ descb2d( mb_ ), descb2d( nb_ ),
584 $ descb2d( lld_ ), descb2d( rsrc_ ),
586 $ ibseed, 0, myrhs_size
587 $ myrow, npcol, nprow )
591 $ mem( ipb-iprepad ),
596 $ mem( ip_driver_w-iprepad ),
602 CALL blacs_barrier( ictxt, 'all
')
607 CALL PZPBTRS( UPLO, N, BW, NRHS, MEM( IPA ), 1,
608 $ DESCA, MEM( IPB ), 1, DESCB,
609 $ MEM( IP_FILLIN ), FILLIN_SIZE,
610 $ MEM( IPW_SOLVE ), IPW_SOLVE_SIZE,
617 $ WRITE( NOUT, FMT = * ) 'pzpbtrs info=
', INFO
627 CALL PZCHEKPAD( ICTXT, 'pzpbtrs-work
',
629 $ MEM( IP_DRIVER_W-IPREPAD ),
637 CALL PZPBLASCHK( 'h
', UPLO, N, BW, BW, NRHS,
638 $ MEM( IPB ), 1, 1, DESCB2D,
639 $ IASEED, MEM( IPA ), 1, 1, DESCA2D,
640 $ IBSEED, ANORM, SRESID,
641 $ MEM( IP_DRIVER_W ), WORKSIZ )
644.GT.
IF( SRESIDTHRESH )
645 $ WRITE( NOUT, FMT = 9985 ) SRESID
650.LE..AND.
IF( ( SRESIDTHRESH )
651.EQ.
$ ( (SRESID-SRESID)0.0D+0 ) ) THEN
666 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'w
', 2, 1,
668 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'c
', 2, 1,
673.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
679 NPROCS_REAL = ( N-1 )/NB + 1
680 N_LAST = MOD( N-1, NB ) + 1
683 NOPS = NOPS + DBLE(BW)*( -2.D0 / 3.D0+DBLE(BW)*
684 $ ( -1.D0+DBLE(BW)*( -1.D0 / 3.D0 ) ) ) +
685 $ DBLE(N)*( 1.D0+DBLE(BW)*( 3.D0 /
686 $ 2.D0+DBLE(BW)*( 1.D0 / 2.D0 ) ) )
687 NOPS = NOPS + DBLE(BW)*( -1.D0 / 6.D0+DBLE(BW)
688 $ *( -1.D0 /2.D0+DBLE(BW)
689 $ *( -1.D0 / 3.D0 ) ) ) +
690 $ DBLE(N)*( DBLE(BW) /
691 $ 2.D0*( 1.D0+DBLE(BW) ) )
694 $ DBLE(NRHS)*( ( 2*DBLE(N)-DBLE(BW) )*
695 $ ( DBLE(BW)+1.D0 ) )+ DBLE(NRHS)*
696 $ ( DBLE(BW)*( 2*DBLE(N)-
697 $ ( DBLE(BW)+1.D0 ) ) )
704 NOPS2 = ( (DBLE(N_FIRST))* DBLE(BW)**2 )
706.GT.
IF ( NPROCS_REAL 1) THEN
711 $ 4*( (DBLE(N_LAST)*DBLE(BW)**2) )
714.GT.
IF ( NPROCS_REAL 2) THEN
718 NOPS2 = NOPS2 + (NPROCS_REAL-2)*
719 $ 4*( (DBLE(NB)*DBLE(BW)**2) )
725 $ ( NPROCS_REAL-1 ) * ( BW*BW*BW/3 )
726.GT.
IF( NPROCS_REAL 1 ) THEN
728 $ ( NPROCS_REAL-2 ) * ( 2 * BW*BW*BW )
735 $ ( 4.0D+0*(DBLE(N_FIRST)*DBLE(BW))*DBLE(NRHS) )
737.GT.
IF ( NPROCS_REAL 1 ) THEN
742 $ 2*( 4.0D+0*(DBLE(N_LAST)*DBLE(BW))*DBLE(NRHS) )
745.GT.
IF ( NPROCS_REAL 2 ) THEN
750 $ ( NPROCS_REAL-2)*2*
751 $ ( 4.0D+0*(DBLE(NB)*DBLE(BW))*DBLE(NRHS) )
757 $ NRHS*( NPROCS_REAL-1 ) * ( BW*BW )
758.GT.
IF( NPROCS_REAL 1 ) THEN
760 $ NRHS*( NPROCS_REAL-2 ) * ( 3 * BW*BW )
766 NOPS2 = NOPS2 * DBLE(4)
773.GT.
IF( WTIME( 1 ) + WTIME( 2 ) 0.0D+0 ) THEN
775 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
780.GT.
IF( WTIME( 1 )+WTIME( 2 )0.0D+0 ) THEN
782 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
787.GE.
IF( WTIME( 2 )0.0D+0 )
788 $ WRITE( NOUT, FMT = 9993 ) 'wall
', UPLO,
791 $ NB, NRHS, NPROW, NPCOL,
792 $ WTIME( 1 ), WTIME( 2 ), TMFLOPS,
797.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
799 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
804.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
806 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
811.GE.
IF( CTIME( 2 )0.0D+0 )
812 $ WRITE( NOUT, FMT = 9993 ) 'cpu
', UPLO,
815 $ NB, NRHS, NPROW, NPCOL,
816 $ CTIME( 1 ), CTIME( 2 ), TMFLOPS,
832 CALL BLACS_GRIDEXIT( ICTXT )
833 CALL BLACS_GRIDEXIT( ICTXTB )
843 KTESTS = KPASS + KFAIL + KSKIP
844 WRITE( NOUT, FMT = * )
845 WRITE( NOUT, FMT = 9992 ) KTESTS
847 WRITE( NOUT, FMT = 9991 ) KPASS
848 WRITE( NOUT, FMT = 9989 ) KFAIL
850 WRITE( NOUT, FMT = 9990 ) KPASS
852 WRITE( NOUT, FMT = 9988 ) KSKIP
853 WRITE( NOUT, FMT = * )
854 WRITE( NOUT, FMT = * )
855 WRITE( NOUT, FMT = 9987 )
856.NE..AND..NE.
IF( NOUT6 NOUT0 )
862 9999 FORMAT( 'illegal
', A6, ':
', A5, ' =
', I3,
863 $ '; it should be at least 1
' )
864 9998 FORMAT( 'illegal grid: nprow*npcol =
', I4, '. it can be at most
',
866 9997 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
867 9996 FORMAT( 'unable to perform ', a,
': need TOTMEM of at least',
869 9995
FORMAT(
'TIME UL N BW NB NRHS P Q L*U Time ',
870 $
'Slv Time MFLOPS MFLOP2 CHECK' )
871 9994
FORMAT(
'---- -- ------ --- ---- ----- -- ---- -------- ',
872 $
'-------- ------ ------ ------' )
873 9993
FORMAT( a4, 2x, a1, 1x, i6, 1x, i3, 1x, i4, 1x,
875 $ i4, 1x, f8.3, f9.4, f9.2, f9.2, 1x, a6 )
876 9992
FORMAT(
'Finished ', i6,
' tests, with the following results:' )
877 9991
FORMAT( i5,
' tests completed and passed residual checks.' )
878 9990
FORMAT( i5,
' tests completed without checking.' )
879 9989
FORMAT( i5,
' tests completed and failed residual checks.' )
880 9988
FORMAT( i5,
' tests skipped because of illegal input values.' )
881 9987
FORMAT(
'END OF TESTS.' )
882 9986
FORMAT(
'||A - ', a4,
'|| / (||A|| * N * eps) = ', g25
883 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)
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 pzfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine pzpbinfo(summry, nout, uplo, nmat, nval, ldnval, nbw, bwval, ldbwval, nnb, nbval, ldnbval, nnr, nrval, ldnrval, nnbr, nbrval, ldnbrval, ngrids, pval, ldpval, qval, ldqval, thresh, work, iam, nprocs)
subroutine pzpblaschk(symm, uplo, n, bwl, bwu, nrhs, x, ix, jx, descx, iaseed, a, ia, ja, desca, ibseed, anorm, resid, work, worksiz)
subroutine pzpbtrf(uplo, n, bw, a, ja, desca, af, laf, work, lwork, info)
subroutine pzpbtrs(uplo, n, bw, nrhs, a, ja, desca, b, ib, descb, af, laf, work, lwork, info)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)