74 parameter( totmem = 3000000 )
75 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
76 $ lld_, mb_, m_, 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_ = 9 )
82 INTEGER memsiz, ntests, realsz
84 parameter( realsz = 4,
85 $ memsiz = totmem / realsz, ntests = 20,
86 $ padval = -9923.0e+0, zero = 0.0e+0 )
88 parameter( int_one = 1 )
95 INTEGER bw, bw_num, fillin_size, free_ptr, h, hh, i,
96 $ iam, iaseed, ibseed, ictxt, ictxtb, ierr_temp,
97 $ imidpad, info, ipa, ipb, ipostpad, iprepad,
98 $ ipw, ipw_size, ipw_solve, ipw_solve_size,
99 $ ip_driver_w, ip_fillin, j, k, kfail, kpass,
100 $ kskip, ktests, mycol, myrhs_size, myrow, n, nb,
101 $ nbw, ngrids, nmat, nnb, nnbr, nnr, nout, np,
102 $ npcol, nprocs, nprocs_real, nprow, nq, nrhs,
103 $ n_first, n_last, worksiz
104 REAL anorm, sresid, thresh
105 DOUBLE PRECISION nops, nops2, tmflops,
108 INTEGER bwval( ntests ), desca( 7 ), desca2d( dlen_ ),
109 $ descb( 7 ), descb2d( dlen_ ), ierr( 1 ),
110 $ nbrval( ntests ), nbval( ntests ),
111 $ nrval( ntests ), nval( ntests ),
112 $ pval( ntests ), qval( ntests )
114 DOUBLE PRECISION ctime( 2 ), 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 pspbinfo( outfile, nout, uplo, nmat, nval, ntests, nbw,
148 $ bwval, ntests, nnb, nbval, ntests, nnr, nrval,
149 $ ntests, nnbr, nbrval, ntests, ngrids, pval, ntests,
150 $ qval, ntests, thresh, mem, iam, nprocs )
152 check = ( thresh.GE.0.0e+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 )
210 IF( myrow.LT.0 .OR. mycol.LT.0 )
THEN
224 $
WRITE( nout, fmt = 9999 )
'MATRIX',
'N', n
230 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
233 IF( ierr( 1 ).GT.0 )
THEN
235 $
WRITE( nout, fmt = 9997 )
'size'
241 DO 45 bw_num = 1, nbw
248 $
WRITE( nout, fmt = 9999 )
'Band', 'bw
', BW
258 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1,
261.GT.
IF( IERR( 1 )0 ) THEN
272 NB =( (N-(NPCOL-1)*BW-1)/NPCOL + 1 )
281.LT.
IF( NBMIN( 2*BW, N ) ) THEN
287 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1,
290.GT.
IF( IERR( 1 )0 ) THEN
297 NP = NUMROC( (BW+1), (BW+1),
299 NQ = NUMROC( N, NB, MYCOL, 0, NPCOL )
302 IPREPAD = ((BW+1)+10)
304 IPOSTPAD = ((BW+1)+10)
313 CALL DESCINIT( DESCA2D, (BW+1), N,
315 $ ICTXT,((BW+1)+10), IERR( 1 ) )
324 DESCA( 6 ) = ((BW+1)+10)
327 IERR_TEMP = IERR( 1 )
329 IERR( 1 ) = MIN( IERR( 1 ), IERR_TEMP )
333 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1, -1, 0 )
335.LT.
IF( IERR( 1 )0 ) THEN
337 $ WRITE( NOUT, FMT = 9997 ) 'descriptor
'
349 FREE_PTR = FREE_PTR + IPREPAD
352 FREE_PTR = FREE_PTR + DESCA2D( LLD_ )*
369 FREE_PTR = FREE_PTR + IPREPAD
371 FREE_PTR = FREE_PTR + FILLIN_SIZE
384 FREE_PTR = FREE_PTR + IPW_SIZE
389.GT.
IF( FREE_PTRMEMSIZ ) THEN
391 $ WRITE( NOUT, FMT = 9996 )
392 $ 'divide and conquer factorization
',
399 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR,
402.GT.
IF( IERR( 1 )0 ) THEN
404 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
410 WORKSIZ = MAX( ((BW+1)+10), NB )
418 WORKSIZ = MAX( WORKSIZ, DESCA2D( NB_ ) )
421 WORKSIZ = MAX( WORKSIZ,
422 $ MAX(5,MAX(BW*(BW+2),NB))+2*NB )
425 FREE_PTR = FREE_PTR + IPREPAD
426 IP_DRIVER_W = FREE_PTR
427 FREE_PTR = FREE_PTR + WORKSIZ + IPOSTPAD
433.GT.
IF( FREE_PTRMEMSIZ ) THEN
435 $ WRITE( NOUT, FMT = 9996 ) 'factorization
',
436 $ ( FREE_PTR )*REALSZ
442 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR,
445.GT.
IF( IERR( 1 )0 ) THEN
447 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
452 CALL PSBMATGEN( ICTXT, UPLO, 'b
', BW, BW, N, (BW+1), NB,
453 $ MEM( IPA ), ((BW+1)+10), 0, 0, IASEED,
454 $ MYROW, MYCOL, NPROW, NPCOL )
456 CALL PSFILLPAD( ICTXT, NP, NQ, MEM( IPA-IPREPAD ),
457 $ ((BW+1)+10), IPREPAD, IPOSTPAD,
460 CALL PSFILLPAD( ICTXT, WORKSIZ, 1,
461 $ MEM( IP_DRIVER_W-IPREPAD ), WORKSIZ,
462 $ IPREPAD, IPOSTPAD, PADVAL )
468 ANORM = PSLANGE( '1
', (BW+1),
469 $ N, MEM( IPA ), 1, 1,
470 $ DESCA2D, MEM( IP_DRIVER_W ) )
471 CALL PSCHEKPAD( ICTXT, 'pslange', NP, NQ,
472 $ MEM( IPA-IPREPAD ), ((BW+1)+10),
473 $ IPREPAD, IPOSTPAD, PADVAL )
474 CALL PSCHEKPAD( ICTXT, 'pslange',
476 $ MEM( IP_DRIVER_W-IPREPAD ), WORKSIZ,
477 $ IPREPAD, IPOSTPAD, PADVAL )
482 CALL BLACS_BARRIER( ICTXT, 'all
' )
488 CALL PSPBTRF( UPLO, N, BW, MEM( IPA ), 1, DESCA,
489 $ MEM( IP_FILLIN ), FILLIN_SIZE, MEM( IPW ),
496 WRITE( NOUT, FMT = * ) 'pspbtrf info=
', INFO
506 CALL PSCHEKPAD( ICTXT, 'pspbtrf', NP,
507 $ NQ, MEM( IPA-IPREPAD ), ((BW+1)+10),
508 $ IPREPAD, IPOSTPAD, PADVAL )
522 CALL DESCINIT( DESCB2D, N, NRHS, NB, 1, 0, 0,
523 $ ICTXTB, NB+10, IERR( 1 ) )
532 DESCB( 6 ) = DESCB2D( LLD_ )
541 FREE_PTR = FREE_PTR + IPREPAD
543 FREE_PTR = FREE_PTR + NRHS*DESCB2D( LLD_ )
548 IPW_SOLVE_SIZE = (BW*NRHS)
551 FREE_PTR = FREE_PTR + IPW_SOLVE_SIZE
554.GT.
IF( FREE_PTRMEMSIZ ) THEN
556 $ WRITE( NOUT, FMT = 9996 )'solve
',
557 $ ( FREE_PTR )*REALSZ
563 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1,
566.GT.
IF( IERR( 1 )0 ) THEN
568 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
573 MYRHS_SIZE = NUMROC( N, NB, MYCOL, 0, NPCOL )
577 CALL PSMATGEN(ICTXTB, 'no
', 'no
',
578 $ DESCB2D( M_ ), DESCB2D( N_ ),
579 $ DESCB2D( MB_ ), DESCB2D( NB_ ),
581 $ DESCB2D( LLD_ ), DESCB2D( RSRC_ ),
583 $ IBSEED, 0, MYRHS_SIZE, 0, NRHS, MYCOL,
584 $ MYROW, NPCOL, NPROW )
587 CALL PSFILLPAD( ICTXTB, NB, NRHS,
588 $ MEM( IPB-IPREPAD ),
592 CALL PSFILLPAD( ICTXT, WORKSIZ, 1,
593 $ MEM( IP_DRIVER_W-IPREPAD ),
599 CALL BLACS_BARRIER( ICTXT, 'all
')
604 CALL PSPBTRS( UPLO, N, BW, NRHS, MEM( IPA ), 1,
605 $ DESCA, MEM( IPB ), 1, DESCB,
606 $ MEM( IP_FILLIN ), FILLIN_SIZE,
607 $ MEM( IPW_SOLVE ), IPW_SOLVE_SIZE,
614 $ WRITE( NOUT, FMT = * ) 'pspbtrs info=
', INFO
624 CALL PSCHEKPAD( ICTXT, 'pspbtrs-work
',
626 $ MEM( IP_DRIVER_W-IPREPAD ),
634 CALL PSPBLASCHK( 's
', UPLO, N, BW, BW, NRHS,
635 $ MEM( IPB ), 1, 1, DESCB2D,
636 $ IASEED, MEM( IPA ), 1, 1, DESCA2D,
637 $ IBSEED, ANORM, SRESID,
638 $ MEM( IP_DRIVER_W ), WORKSIZ )
641.GT.
IF( SRESIDTHRESH )
642 $ WRITE( NOUT, FMT = 9985 ) SRESID
647.LE..AND.
IF( ( SRESIDTHRESH )
648.EQ.
$ ( (SRESID-SRESID)0.0E+0 ) ) THEN
663 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'w
', 2, 1,
665 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'c
', 2, 1,
670.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
676 NPROCS_REAL = ( N-1 )/NB + 1
677 N_LAST = MOD( N-1, NB ) + 1
680 NOPS = NOPS + DBLE(BW)*( -2.D0 / 3.D0+DBLE(BW)*
681 $ ( -1.D0+DBLE(BW)*( -1.D0 / 3.D0 ) ) ) +
682 $ DBLE(N)*( 1.D0+DBLE(BW)*( 3.D0 /
683 $ 2.D0+DBLE(BW)*( 1.D0 / 2.D0 ) ) )
684 NOPS = NOPS + DBLE(BW)*( -1.D0 / 6.D0+DBLE(BW)
685 $ *( -1.D0 /2.D0+DBLE(BW)
686 $ *( -1.D0 / 3.D0 ) ) ) +
687 $ DBLE(N)*( DBLE(BW) /
688 $ 2.D0*( 1.D0+DBLE(BW) ) )
691 $ DBLE(NRHS)*( ( 2*DBLE(N)-DBLE(BW) )*
692 $ ( DBLE(BW)+1.D0 ) )+ DBLE(NRHS)*
693 $ ( DBLE(BW)*( 2*DBLE(N)-
694 $ ( DBLE(BW)+1.D0 ) ) )
701 NOPS2 = ( (DBLE(N_FIRST))* DBLE(BW)**2 )
703.GT.
IF ( NPROCS_REAL 1) THEN
708 $ 4*( (DBLE(N_LAST)*DBLE(BW)**2) )
711.GT.
IF ( NPROCS_REAL 2) THEN
715 NOPS2 = NOPS2 + (NPROCS_REAL-2)*
716 $ 4*( (DBLE(NB)*DBLE(BW)**2) )
722 $ ( NPROCS_REAL-1 ) * ( BW*BW*BW/3 )
723.GT.
IF( NPROCS_REAL 1 ) THEN
725 $ ( NPROCS_REAL-2 ) * ( 2 * BW*BW*BW )
732 $ ( 4.0D+0*(DBLE(N_FIRST)*DBLE(BW))*DBLE(NRHS) )
734.GT.
IF ( NPROCS_REAL 1 ) THEN
739 $ 2*( 4.0D+0*(DBLE(N_LAST)*DBLE(BW))*DBLE(NRHS) )
742.GT.
IF ( NPROCS_REAL 2 ) THEN
747 $ ( NPROCS_REAL-2)*2*
748 $ ( 4.0D+0*(DBLE(NB)*DBLE(BW))*DBLE(NRHS) )
754 $ NRHS*( NPROCS_REAL-1 ) * ( BW*BW )
755.GT.
IF( NPROCS_REAL 1 ) THEN
757 $ NRHS*( NPROCS_REAL-2 ) * ( 3 * BW*BW )
766.GT.
IF( WTIME( 1 ) + WTIME( 2 ) 0.0D+0 ) THEN
768 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
773.GT.
IF( WTIME( 1 )+WTIME( 2 )0.0D+0 ) THEN
775 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
780.GE.
IF( WTIME( 2 )0.0D+0 )
781 $ WRITE( NOUT, FMT = 9993 ) 'wall
', UPLO,
784 $ NB, NRHS, NPROW, NPCOL,
785 $ WTIME( 1 ), WTIME( 2 ), TMFLOPS,
790.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
792 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
797.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
799 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
804.GE.
IF( CTIME( 2 )0.0D+0 )
805 $ WRITE( NOUT, FMT = 9993 ) 'cpu
', UPLO,
808 $ NB, NRHS, NPROW, NPCOL,
809 $ CTIME( 1 ), CTIME( 2 ), TMFLOPS,
825 CALL BLACS_GRIDEXIT( ICTXT )
826 CALL BLACS_GRIDEXIT( ICTXTB )
836 KTESTS = KPASS + KFAIL + KSKIP
837 WRITE( NOUT, FMT = * )
838 WRITE( NOUT, FMT = 9992 ) KTESTS
840 WRITE( NOUT, FMT = 9991 ) KPASS
841 WRITE( NOUT, FMT = 9989 ) KFAIL
843 WRITE( NOUT, FMT = 9990 ) KPASS
845 WRITE( NOUT, FMT = 9988 ) KSKIP
846 WRITE( NOUT, FMT = * )
847 WRITE( NOUT, FMT = * )
848 WRITE( NOUT, FMT = 9987 )
849.NE..AND..NE.
IF( NOUT6 NOUT0 )
855 9999 FORMAT( 'illegal
', A6, ':
', A5, ' =
', I3,
856 $ '; it should be at least 1
' )
857 9998 FORMAT( 'illegal grid: nprow*npcol =
', I4, '. it can be at most
',
859 9997 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
860 9996 FORMAT( 'unable to perform
', A, ': need totmem of at least
',
862 9995 FORMAT( 'time ul n bw nb nrhs p q l*u time
',
863 $ 'slv time mflops mflop2 check
' )
864 9994 FORMAT( '---- -- ------ --- ---- ----- -- ---- --------
',
865 $ '-------- ------ ------ ------
' )
866 9993 FORMAT( A4, 2X, A1, 1X, I6, 1X, I3, 1X, I4, 1X,
868 $ I4, 1X, F8.3, F9.4, F9.2, F9.2, 1X, A6 )
869 9992 FORMAT( 'finished
', I6, ' tests, with
the following results:
' )
870 9991 FORMAT( I5, ' tests completed and passed residual checks.
' )
871 9990 FORMAT( I5, ' tests completed without checking.
' )
872 9989 FORMAT( I5, ' tests completed and failed residual checks.
' )
873 9988 FORMAT( I5, ' tests skipped because of illegal input values.
' )
874 9987 FORMAT( 'END OF TESTS.
' )
875 9986 FORMAT( '||A -
', A4, '|| / (||A|| * N * eps) =
', G25.7 )
876 9985 FORMAT( '||Ax-b||/(||x||*||A||*eps*N)
', F25.7 )
subroutine psmatgen(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)
real function pslange(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 psbmatgen(ictxt, aform, aform2, bwl, bwu, n, mb, nb, a, lda, iarow, iacol, iseed, myrow, mycol, nprow, npcol)
subroutine pschekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine psfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine pspbinfo(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 pspblaschk(symm, uplo, n, bwl, bwu, nrhs, x, ix, jx, descx, iaseed, a, ia, ja, desca, ibseed, anorm, resid, work, worksiz)
subroutine pspbtrf(uplo, n, bw, a, ja, desca, af, laf, work, lwork, info)
subroutine pspbtrs(uplo, n, bw, nrhs, a, ja, desca, b, ib, descb, af, laf, work, lwork, info)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)