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, , 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_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_ ), ierr( 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.LT.
ELSE IF( NPCOL1 ) THEN
182 $ WRITE( NOUT, FMT = 9999 ) 'grid
', 'npcol
', NPCOL
184.GT.
ELSE IF( NPROW*NPCOLNPROCS ) THEN
186 $ WRITE( NOUT, FMT = 9998 ) NPROW*NPCOL, NPROCS
190.GT.
IF( IERR( 1 )0 ) THEN
192 $ WRITE( NOUT, FMT = 9997 ) 'grid
'
199 CALL BLACS_GET( -1, 0, ICTXT )
200 CALL BLACS_GRIDINIT( ICTXT, 'row-major
', NPROW, NPCOL )
205 CALL BLACS_GET( -1, 0, ICTXTB )
206 CALL BLACS_GRIDINIT( ICTXTB, 'column-major
', NPCOL, NPROW )
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 ) 'band
', 'bw
', BW
261 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1,
264.GT.
IF( IERR( 1 )0 ) THEN
275 NB =( (N-(NPCOL-1)*BW-1)/NPCOL + 1 )
284.LT.
IF( NBMIN( 2*BW, N ) ) THEN
290 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1,
293.GT.
IF( IERR( 1 )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)
316 CALL DESCINIT( DESCA2D, (BW+1), N,
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.LT.
IF( IERR( 1 )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.GT.
IF( FREE_PTRMEMSIZ ) THEN
394 $ WRITE( NOUT, FMT = 9996 )
395 $ 'divide and conquer factorization
',
402 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR,
405.GT.
IF( IERR( 1 )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.GT.
IF( FREE_PTRMEMSIZ ) THEN
438 $ WRITE( NOUT, FMT = 9996 ) 'factorization
',
439 $ ( FREE_PTR )*ZPLXSZ
445 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR,
448.GT.
IF( IERR( 1 )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,
463 CALL PZFILLPAD( ICTXT, WORKSIZ, 1,
464 $ MEM( IP_DRIVER_W-IPREPAD ), WORKSIZ,
465 $ IPREPAD, IPOSTPAD, PADVAL )
471 ANORM = PZLANGE( '1
', (BW+1),
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 )
477 CALL PZCHEKPAD( ICTXT, 'pzlange',
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, 0, NRHS, MYCOL,
587 $ MYROW, NPCOL, NPROW )
590 CALL PZFILLPAD( ICTXTB, NB, NRHS,
591 $ MEM( IPB-IPREPAD ),
595 CALL PZFILLPAD( ICTXT, WORKSIZ, 1,
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.7 )
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)
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 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)