75 parameter( totmem = 3000000 )
76 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
77 $ lld_, mb_, m_, , 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 bw, bw_num, , 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
106 REAL anorm, sresid, thresh
107 DOUBLE PRECISION nops, nops2, tmflops, tmflops2
110 INTEGER bwval( ntests ), desca( 7 ), desca2d( dlen_ ),
111 $ descb( 7 ), descb2d( dlen_ ), ierr( 1 ),
112 $ nbrval( ntests ), ( 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,
133 INTRINSIC dble,
max,
min, mod
136 DATA kfail, kpass, kskip, ktests / 4*0 /
145 CALL blacs_pinfo( iam, nprocs )
149 CALL pcpbinfo( outfile, nout, uplo, nmat, nval, ntests, nbw,
150 $ bwval, ntests, nnb, nbval, ntests, nnr, nrval,
151 $ ntests, nnbr, nbrval, ntests, ngrids, pval, ntests,
152 $ 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 )
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.GT.
ELSE IF( NPROW*NPCOLNPROCS ) THEN
185 $ WRITE( NOUT, FMT = 9998 ) NPROW*NPCOL, NPROCS
189.GT.
IF( IERR( 1 )0 ) THEN
191 $ WRITE( NOUT, FMT = 9997 ) 'grid
'
198 CALL BLACS_GET( -1, 0, ICTXT )
199 CALL BLACS_GRIDINIT( ICTXT, 'row-major
', NPROW, NPCOL )
204 CALL BLACS_GET( -1, 0, ICTXTB )
205 CALL BLACS_GRIDINIT( ICTXTB, 'column-major
', NPCOL, NPROW )
210 CALL BLACS_GRIDINFO( ICTXT, NPROW, NPCOL, MYROW, MYCOL )
212.LT..OR..LT.
IF( MYROW0 MYCOL0 ) THEN
226 $ WRITE( NOUT, FMT = 9999 ) 'matrix
', 'n
', N
232 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1,
235.GT.
IF( IERR( 1 )0 ) THEN
237 $ WRITE( NOUT, FMT = 9997 ) 'size
'
243 DO 45 BW_NUM = 1, NBW
250 $ WRITE( NOUT, FMT = 9999 ) 'band
', 'bw
', BW
260 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1,
263.GT.
IF( IERR( 1 )0 ) THEN
274 NB =( (N-(NPCOL-1)*BW-1)/NPCOL + 1 )
283.LT.
IF( NBMIN( 2*BW, N ) ) THEN
289 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1,
292.GT.
IF( IERR( 1 )0 ) THEN
299 NP = NUMROC( (BW+1), (BW+1),
301 NQ = NUMROC( N, NB, MYCOL, 0, NPCOL )
304 IPREPAD = ((BW+1)+10)
306 IPOSTPAD = ((BW+1)+10)
315 CALL DESCINIT( DESCA2D, (BW+1), N,
317 $ ICTXT,((BW+1)+10), IERR( 1 ) )
326 DESCA( 6 ) = ((BW+1)+10)
329 IERR_TEMP = IERR( 1 )
331 IERR( 1 ) = MIN( IERR( 1 ), IERR_TEMP )
335 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1, -1, 0 )
337.LT.
IF( IERR( 1 )0 ) THEN
339 $ WRITE( NOUT, FMT = 9997 ) 'descriptor
'
351 FREE_PTR = FREE_PTR + IPREPAD
354 FREE_PTR = FREE_PTR + DESCA2D( LLD_ )*
371 FREE_PTR = FREE_PTR + IPREPAD
373 FREE_PTR = FREE_PTR + FILLIN_SIZE
386 FREE_PTR = FREE_PTR + IPW_SIZE
391.GT.
IF( FREE_PTRMEMSIZ ) THEN
393 $ WRITE( NOUT, FMT = 9996 )
394 $ 'divide and conquer factorization
',
401 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR,
404.GT.
IF( IERR( 1 )0 ) THEN
406 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
412 WORKSIZ = MAX( ((BW+1)+10), NB )
420 WORKSIZ = MAX( WORKSIZ, DESCA2D( NB_ ) )
423 WORKSIZ = MAX( WORKSIZ,
424 $ MAX(5,MAX(BW*(BW+2),NB))+2*NB )
427 FREE_PTR = FREE_PTR + IPREPAD
428 IP_DRIVER_W = FREE_PTR
429 FREE_PTR = FREE_PTR + WORKSIZ + IPOSTPAD
435.GT.
IF( FREE_PTRMEMSIZ ) THEN
437 $ WRITE( NOUT, FMT = 9996 ) 'factorization
',
438 $ ( FREE_PTR )*CPLXSZ
444 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR,
447.GT.
IF( IERR( 1 )0 ) THEN
449 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
454 CALL PCBMATGEN( ICTXT, UPLO, 'b
', BW, BW, N, (BW+1), NB,
455 $ MEM( IPA ), ((BW+1)+10), 0, 0, IASEED,
456 $ MYROW, MYCOL, NPROW, NPCOL )
458 CALL PCFILLPAD( ICTXT, NP, NQ, MEM( IPA-IPREPAD ),
459 $ ((BW+1)+10), IPREPAD, IPOSTPAD,
462 CALL PCFILLPAD( ICTXT, WORKSIZ, 1,
463 $ MEM( IP_DRIVER_W-IPREPAD ), WORKSIZ,
464 $ IPREPAD, IPOSTPAD, PADVAL )
470 ANORM = PCLANGE( '1
', (BW+1),
471 $ N, MEM( IPA ), 1, 1,
472 $ DESCA2D, MEM( IP_DRIVER_W ) )
473 CALL PCCHEKPAD( ICTXT, 'pclange', NP, NQ,
474 $ MEM( IPA-IPREPAD ), ((BW+1)+10),
475 $ IPREPAD, IPOSTPAD, PADVAL )
476 CALL PCCHEKPAD( ICTXT, 'pclange',
478 $ MEM( IP_DRIVER_W-IPREPAD ), WORKSIZ,
479 $ IPREPAD, IPOSTPAD, PADVAL )
484 CALL BLACS_BARRIER( ICTXT, 'all
' )
490 CALL PCPBTRF( UPLO, N, BW, MEM( IPA ), 1, DESCA,
491 $ MEM( IP_FILLIN ), FILLIN_SIZE, MEM( IPW ),
498 WRITE( NOUT, FMT = * ) 'pcpbtrf info=
', INFO
508 CALL PCCHEKPAD( ICTXT, 'pcpbtrf', NP,
509 $ NQ, MEM( IPA-IPREPAD ), ((BW+1)+10),
510 $ IPREPAD, IPOSTPAD, PADVAL )
524 CALL DESCINIT( DESCB2D, N, NRHS, NB, 1, 0, 0,
525 $ ICTXTB, NB+10, IERR( 1 ) )
534 DESCB( 6 ) = DESCB2D( LLD_ )
543 FREE_PTR = FREE_PTR + IPREPAD
545 FREE_PTR = FREE_PTR + NRHS*DESCB2D( LLD_ )
550 IPW_SOLVE_SIZE = (BW*NRHS)
553 FREE_PTR = FREE_PTR + IPW_SOLVE_SIZE
556.GT.
IF( FREE_PTRMEMSIZ ) THEN
558 $ WRITE( NOUT, FMT = 9996 )'solve
',
559 $ ( FREE_PTR )*CPLXSZ
565 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1,
568.GT.
IF( IERR( 1 )0 ) THEN
570 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
575 MYRHS_SIZE = NUMROC( N, NB, MYCOL, 0, NPCOL )
579 CALL PCMATGEN(ICTXTB, 'no
', 'no
',
580 $ DESCB2D( M_ ), DESCB2D( N_ ),
581 $ DESCB2D( MB_ ), DESCB2D( NB_ ),
583 $ DESCB2D( LLD_ ), DESCB2D( RSRC_ ),
585 $ IBSEED, 0, MYRHS_SIZE, 0, NRHS, MYCOL,
586 $ MYROW, NPCOL, NPROW )
589 CALL PCFILLPAD( ICTXTB, NB, NRHS,
590 $ MEM( IPB-IPREPAD ),
594 CALL PCFILLPAD( ICTXT, WORKSIZ, 1,
595 $ MEM( IP_DRIVER_W-IPREPAD ),
601 CALL BLACS_BARRIER( ICTXT, 'all
')
606 CALL PCPBTRS( UPLO, N, BW, NRHS, MEM( IPA ), 1,
607 $ DESCA, MEM( IPB ), 1, DESCB,
608 $ MEM( IP_FILLIN ), FILLIN_SIZE,
609 $ MEM( IPW_SOLVE ), IPW_SOLVE_SIZE,
616 $ WRITE( NOUT, FMT = * ) 'pcpbtrs info=
', INFO
626 CALL PCCHEKPAD( ICTXT, 'pcpbtrs-work
',
628 $ MEM( IP_DRIVER_W-IPREPAD ),
636 CALL PCPBLASCHK( 'h
', UPLO, N, BW, BW, NRHS,
637 $ MEM( IPB ), 1, 1, DESCB2D,
638 $ IASEED, MEM( IPA ), 1, 1, DESCA2D,
639 $ IBSEED, ANORM, SRESID,
640 $ MEM( IP_DRIVER_W ), WORKSIZ )
643.GT.
IF( SRESIDTHRESH )
644 $ WRITE( NOUT, FMT = 9985 ) SRESID
649.LE..AND.
IF( ( SRESIDTHRESH )
650.EQ.
$ ( (SRESID-SRESID)0.0E+0 ) ) THEN
665 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'w
', 2, 1,
667 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'c
', 2, 1,
672.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
678 NPROCS_REAL = ( N-1 )/NB + 1
679 N_LAST = MOD( N-1, NB ) + 1
682 NOPS = NOPS + DBLE(BW)*( -2.D0 / 3.D0+DBLE(BW)*
683 $ ( -1.D0+DBLE(BW)*( -1.D0 / 3.D0 ) ) ) +
684 $ DBLE(N)*( 1.D0+DBLE(BW)*( 3.D0 /
685 $ 2.D0+DBLE(BW)*( 1.D0 / 2.D0 ) ) )
686 NOPS = NOPS + DBLE(BW)*( -1.D0 / 6.D0+DBLE(BW)
687 $ *( -1.D0 /2.D0+DBLE(BW)
688 $ *( -1.D0 / 3.D0 ) ) ) +
689 $ DBLE(N)*( DBLE(BW) /
690 $ 2.D0*( 1.D0+DBLE(BW) ) )
693 $ DBLE(NRHS)*( ( 2*DBLE(N)-DBLE(BW) )*
694 $ ( DBLE(BW)+1.D0 ) )+ DBLE(NRHS)*
695 $ ( DBLE(BW)*( 2*DBLE(N)-
696 $ ( DBLE(BW)+1.D0 ) ) )
703 NOPS2 = ( (DBLE(N_FIRST))* DBLE(BW)**2 )
705.GT.
IF ( NPROCS_REAL 1) THEN
710 $ 4*( (DBLE(N_LAST)*DBLE(BW)**2) )
713.GT.
IF ( NPROCS_REAL 2) THEN
717 NOPS2 = NOPS2 + (NPROCS_REAL-2)*
718 $ 4*( (DBLE(NB)*DBLE(BW)**2) )
724 $ ( NPROCS_REAL-1 ) * ( BW*BW*BW/3 )
725.GT.
IF( NPROCS_REAL 1 ) THEN
727 $ ( NPROCS_REAL-2 ) * ( 2 * BW*BW*BW )
734 $ ( 4.0D+0*(DBLE(N_FIRST)*DBLE(BW))*DBLE(NRHS) )
736.GT.
IF ( NPROCS_REAL 1 ) THEN
741 $ 2*( 4.0D+0*(DBLE(N_LAST)*DBLE(BW))*DBLE(NRHS) )
744.GT.
IF ( NPROCS_REAL 2 ) THEN
749 $ ( NPROCS_REAL-2)*2*
750 $ ( 4.0D+0*(DBLE(NB)*DBLE(BW))*DBLE(NRHS) )
756 $ NRHS*( NPROCS_REAL-1 ) * ( BW*BW )
757.GT.
IF( NPROCS_REAL 1 ) THEN
759 $ NRHS*( NPROCS_REAL-2 ) * ( 3 * BW*BW )
765 NOPS2 = NOPS2 * DBLE(4)
772.GT.
IF( WTIME( 1 ) + WTIME( 2 ) 0.0D+0 ) THEN
774 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
779.GT.
IF( WTIME( 1 )+WTIME( 2 )0.0D+0 ) THEN
781 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
786.GE.
IF( WTIME( 2 )0.0D+0 )
787 $ WRITE( NOUT, FMT = 9993 ) 'wall
', UPLO,
790 $ NB, NRHS, NPROW, NPCOL,
791 $ WTIME( 1 ), WTIME( 2 ), TMFLOPS,
796.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
798 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
803.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
805 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
810.GE.
IF( CTIME( 2 )0.0D+0 )
811 $ WRITE( NOUT, FMT = 9993 ) 'cpu
', UPLO,
814 $ NB, NRHS, NPROW, NPCOL,
815 $ CTIME( 1 ), CTIME( 2 ), TMFLOPS,
831 CALL BLACS_GRIDEXIT( ICTXT )
832 CALL BLACS_GRIDEXIT( ICTXTB )
842 KTESTS = KPASS + KFAIL + KSKIP
843 WRITE( NOUT, FMT = * )
844 WRITE( NOUT, FMT = 9992 ) KTESTS
846 WRITE( NOUT, FMT = 9991 ) KPASS
847 WRITE( NOUT, FMT = 9989 ) KFAIL
849 WRITE( NOUT, FMT = 9990 ) KPASS
851 WRITE( NOUT, FMT = 9988 ) KSKIP
852 WRITE( NOUT, FMT = * )
853 WRITE( NOUT, FMT = * )
854 WRITE( NOUT, FMT = 9987 )
855.NE..AND..NE.
IF( NOUT6 NOUT0 )
861 9999 FORMAT( 'illegal
', A6, ':
', A5, ' =
', I3,
862 $ '; it should be at least 1
' )
863 9998 FORMAT( 'illegal grid: nprow*npcol =
', I4, '. it can be at most
',
865 9997 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
866 9996 FORMAT( 'unable to perform
', A, ': need totmem of at least
',
868 9995 FORMAT( 'time ul n bw nb nrhs p q l*u time
',
869 $ 'slv time mflops mflop2 check
' )
870 9994 FORMAT( '---- -- ------ --- ---- ----- -- ---- --------
',
871 $ '-------- ------ ------ ------
' )
872 9993 FORMAT( A4, 2X, A1, 1X, I6, 1X, I3, 1X, I4, 1X,
874 $ I4, 1X, F8.3, F9.4, F9.2, F9.2, 1X, A6 )
875 9992 FORMAT( 'finished
', I6, ' tests, with
the following results:
' )
876 9991 FORMAT( I5, ' tests completed and passed residual checks.
' )
877 9990 FORMAT( I5, ' tests completed without checking.
' )
878 9989 FORMAT( I5, ' tests completed and failed residual checks.
' )
879 9988 FORMAT( I5, ' tests skipped because of illegal input values.
' )
880 9987 FORMAT( 'END OF TESTS.
' )
881 9986 FORMAT( '||A -
', A4, '|| / (||A|| * N * eps) =
', G25.7 )
882 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 pcfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine pcpbinfo(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 pcpblaschk(symm, uplo, n, bwl, bwu, nrhs, x, ix, jx, descx, iaseed, a, ia, ja, desca, ibseed, anorm, resid, work, worksiz)
subroutine pcpbtrf(uplo, n, bw, a, ja, desca, af, laf, work, lwork, info)
subroutine pcpbtrs(uplo, n, bw, nrhs, a, ja, desca, b, ib, descb, af, laf, work, lwork, info)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)