81 parameter( totmem = 3000000 )
83 parameter( intmem = 2048 )
84 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
85 $ lld_, mb_, m_, nb_, n_, rsrc_
86 parameter( block_cyclic_2d =
87 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
88 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
91 INTEGER memsiz, ntests, zplxsz
94 $ memsiz = totmem / zplxsz, ntests = 20,
95 $ padval = ( -9923.0d+0, -9923.0d+0 ),
98 parameter( int_one = 1 )
105 INTEGER bwl, bwu, bw_num, fillin_size, free_ptr, h, hh,
106 $ i, iam, iaseed, , ictxt, ictxtb,
107 $ ierr_temp, imidpad, info, ipa, ipb, ipostpad,
108 $ iprepad, ipw, ipw_size, ipw_solve,
109 $ ipw_solve_size, ip_driver_w, ip_fillin, j, k,
110 $ kfail, kpass, kskip, ktests, mycol, myrhs_size,
111 $ myrow, n, nb, nbw, ngrids, nmat, nnb, nnbr,
112 $ , nout, np, npcol, nprocs, nprocs_real,
113 $ nprow, nq, nrhs, n_first, n_last, worksiz
115 DOUBLE PRECISION anorm, nops, , sresid, tmflops,
120 INTEGER bwlval( ntests ), bwuval( ntests ), desca( 7 ),
121 $ desca2d( dlen_ ), descb( 7 ), descb2d( ),
122 $ ierr( 1 ), ( ntests ), nbval( ntests ),
123 $ nrval( ntests ), nval( ntests ),
124 $ pval( ntests ), qval( )
125 DOUBLE PRECISION ctime( 2 ), wtime( 2 )
126 COMPLEX*16 ( memsiz )
129 EXTERNAL blacs_barrier, blacs_exit, blacs_get,
143 INTRINSIC dble,
max,
min, mod
146 DATA kfail, kpass, kskip, ktests / 4*0 /
155 CALL blacs_pinfo( iam, nprocs )
159 CALL pzgbinfo( outfile, nout, trans, nmat, nval, ntests, nbw,
160 $ bwlval, bwuval, ntests, nnb, nbval, ntests, nnr,
161 $ nrval, ntests, nnbr, nbrval, ntests, ngrids, pval,
162 $ ntests, qval, ntests, thresh, mem, iam, nprocs )
164 check = ( thresh.GE.0.0d+0 )
169 WRITE( nout, fmt = * )
170 WRITE( nout, fmt = 9995 )
171 WRITE( nout, fmt = 9994 )
172 WRITE( nout, fmt = * )
185 IF( nprow.LT.1 )
THEN
187 $
WRITE( nout, fmt = 9999 )
'GRID',
'nprow', nprow
189 ELSE IF( npcol.LT.1 )
THEN
191 $
WRITE( nout, fmt = 9999 )
'GRID',
'npcol', npcol
193 ELSE IF( nprow*npcol.GT.nprocs )
THEN
195 $
WRITE( nout, fmt = 9998 ) nprow*npcol, nprocs
199 IF( ierr( 1 ).GT.0 )
THEN
201 $
WRITE( nout, fmt = 9997 )
'grid'
208 CALL blacs_get( -1, 0, ictxt )
214 CALL blacs_get( -1, 0, ictxtb )
222 IF( myrow.LT.0 .OR. mycol.LT.0 )
THEN
236 $
WRITE( nout, fmt = 9999 )
'MATRIX',
'N', n
242 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
245 IF( ierr( 1 ).GT.0 )
THEN
247 $
WRITE( nout, fmt = 9997 )
'size'
253 DO 45 bw_num = 1, nbw
257 bwl = bwlval( bw_num )
260 $
WRITE( nout, fmt = 9999 )
'Lower Band',
'bwl', bwl
264 bwu = bwuval( bw_num )
267 $
WRITE( nout, fmt = 9999 )
'Upper Band',
'bwu', bwu
271 IF( bwl.GT.n-1 )
THEN
277 IF( bwu.GT.n-1 )
THEN
285 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
288 IF( ierr( 1 ).GT.0 )
THEN
299 nb =( (n-(npcol-1)*(bwl+bwu)-1)/npcol + 1 )
301 nb =
max( nb, 2*(bwl+bwu) )
309 IF( nb.GT.intmem )
THEN
312 WRITE( nout,* )
'You have chosen an '
313 $ ,
'NB > INTMEM in the driver.'
314 WRITE(nout, *)
'Please edit the driver '
315 $ ,
'and increase the value of INTMEM'
321 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
324 IF( ierr( 1 ).GT.0 )
THEN
331 np =
numroc( (2*bwl+2*bwu+1), (2*bwl+2*bwu+1),
333 nq =
numroc( n, nb, mycol, 0, npcol )
336 iprepad = ((2*bwl+2*bwu+1)+10)
338 ipostpad = ((2*bwl+2*bwu+1)+10)
347 CALL descinit( desca2d, (2*bwl+2*bwu+1), n,
348 $ (2*bwl+2*bwu+1), nb, 0, 0,
349 $ ictxt,((2*bwl+2*bwu+1)+10), ierr( 1 ) )
358 desca( 6 ) = ((2*bwl+2*bwu+1)+10)
361 ierr_temp = ierr( 1 )
363 ierr( 1 ) =
min( ierr( 1 ), ierr_temp )
367 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
369 IF( ierr( 1 ).LT.0 )
THEN
371 $
WRITE( nout, fmt = 9997 )
'descriptor'
383 free_ptr = free_ptr + iprepad
386 free_ptr = free_ptr + desca2d( lld_ )*
399 $ (nb+bwu)*(bwl+bwu)+6*(bwl+bwu)*(bwl+2*bwu)
403 free_ptr = free_ptr + iprepad
405 free_ptr = free_ptr + fillin_size
418 free_ptr = free_ptr + ipw_size
423 IF( free_ptr.GT.memsiz )
THEN
425 $
WRITE( nout, fmt = 9996 )
426 $
'divide and conquer factorization',
433 CALL igsum2d( ictxt, 'all
', ' ', 1, 1, IERR,
436.GT.
IF( IERR( 1 )0 ) THEN
438 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
444 WORKSIZ = MAX( ((2*BWL+2*BWU+1)+10), NB )
452 WORKSIZ = MAX( WORKSIZ, DESCA2D( NB_ ) )
455 WORKSIZ = MAX( WORKSIZ,
456 $ MAX(5,MAX(MAX(BWL,BWU)*(MAX(BWL,BWU)+2),NB))+2*NB )
459 FREE_PTR = FREE_PTR + IPREPAD
460 IP_DRIVER_W = FREE_PTR
461 FREE_PTR = FREE_PTR + WORKSIZ + IPOSTPAD
467.GT.
IF( FREE_PTRMEMSIZ ) THEN
469 $ WRITE( NOUT, FMT = 9996 ) 'factorization
',
470 $ ( FREE_PTR )*ZPLXSZ
476 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR,
479.GT.
IF( IERR( 1 )0 ) THEN
481 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
486 CALL PZBMATGEN( ICTXT, 'g
', 'n
', BWL, BWU, N,
487 $ (2*BWL+2*BWU+1), NB, MEM( IPA+BWL+BWU ),
488 $ ((2*BWL+2*BWU+1)+10), 0, 0, IASEED,
489 $ MYROW, MYCOL, NPROW, NPCOL )
491 CALL PZFILLPAD( ICTXT, NP, NQ, MEM( IPA-IPREPAD ),
492 $ ((2*BWL+2*BWU+1)+10), IPREPAD, IPOSTPAD,
495 CALL PZFILLPAD( ICTXT, WORKSIZ, 1,
496 $ MEM( IP_DRIVER_W-IPREPAD ), WORKSIZ,
497 $ IPREPAD, IPOSTPAD, PADVAL )
503 ANORM = PZLANGE( '1
', (2*BWL+2*BWU+1),
504 $ N, MEM( IPA ), 1, 1,
505 $ DESCA2D, MEM( IP_DRIVER_W ) )
506 CALL PZCHEKPAD( ICTXT, 'pzlange', NP, NQ,
507 $ MEM( IPA-IPREPAD ), ((2*BWL+2*BWU+1)+10),
508 $ IPREPAD, IPOSTPAD, PADVAL )
509 CALL PZCHEKPAD( ICTXT, 'pzlange',
511 $ MEM( IP_DRIVER_W-IPREPAD ), WORKSIZ,
512 $ IPREPAD, IPOSTPAD, PADVAL )
517 CALL BLACS_BARRIER( ICTXT, 'all
' )
523 CALL PZGBTRF( N, BWL, BWU, MEM( IPA ), 1, DESCA, IPIV,
524 $ MEM( IP_FILLIN ), FILLIN_SIZE, MEM( IPW ),
531 WRITE( NOUT, FMT = * ) 'pzgbtrf info=
', INFO
541 CALL PZCHEKPAD( ICTXT, 'pzgbtrf', NP,
542 $ NQ, MEM( IPA-IPREPAD ), ((2*BWL+2*BWU+1)+10),
543 $ IPREPAD, IPOSTPAD, PADVAL )
557 CALL DESCINIT( DESCB2D, N, NRHS, NB, 1, 0, 0,
558 $ ICTXTB, NB+10, IERR( 1 ) )
567 DESCB( 6 ) = DESCB2D( LLD_ )
576 FREE_PTR = FREE_PTR + IPREPAD
578 FREE_PTR = FREE_PTR + NRHS*DESCB2D( LLD_ )
583 IPW_SOLVE_SIZE = NRHS*(NB+2*BWL+4*BWU)
586 FREE_PTR = FREE_PTR + IPW_SOLVE_SIZE
589.GT.
IF( FREE_PTRMEMSIZ ) THEN
591 $ WRITE( NOUT, FMT = 9996 )'solve
',
592 $ ( FREE_PTR )*ZPLXSZ
598 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1,
601.GT.
IF( IERR( 1 )0 ) THEN
603 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
608 MYRHS_SIZE = NUMROC( N, NB, MYCOL, 0, NPCOL )
612 CALL PZMATGEN(ICTXTB, 'no
', 'no
',
613 $ DESCB2D( M_ ), DESCB2D( N_ ),
614 $ DESCB2D( MB_ ), DESCB2D( NB_ ),
616 $ DESCB2D( LLD_ ), DESCB2D( RSRC_ ),
618 $ IBSEED, 0, MYRHS_SIZE, 0, NRHS, MYCOL,
619 $ MYROW, NPCOL, NPROW )
622 CALL PZFILLPAD( ICTXTB, NB, NRHS,
623 $ MEM( IPB-IPREPAD ),
627 CALL PZFILLPAD( ICTXT, WORKSIZ, 1,
628 $ MEM( IP_DRIVER_W-IPREPAD ),
634 CALL BLACS_BARRIER( ICTXT, 'all
')
639 CALL PZGBTRS( TRANS, N, BWL, BWU, NRHS, MEM( IPA ),
640 $ 1, DESCA, IPIV, MEM( IPB ), 1, DESCB,
641 $ MEM( IP_FILLIN ), FILLIN_SIZE,
642 $ MEM( IPW_SOLVE ), IPW_SOLVE_SIZE,
649 $ WRITE( NOUT, FMT = * ) 'pzgbtrs info=
', INFO
659 CALL PZCHEKPAD( ICTXT, 'pzgbtrs-work
',
661 $ MEM( IP_DRIVER_W-IPREPAD ),
669 CALL PZDBLASCHK( 'n
', 'n
', TRANS,
671 $ MEM( IPB ), 1, 1, DESCB2D,
672 $ IASEED, MEM( IPA+BWL+BWU ), 1, 1, DESCA2D,
673 $ IBSEED, ANORM, SRESID,
674 $ MEM( IP_DRIVER_W ), WORKSIZ )
677.GT.
IF( SRESIDTHRESH )
678 $ WRITE( NOUT, FMT = 9985 ) SRESID
683.LE..AND.
IF( ( SRESIDTHRESH )
684.EQ.
$ ( (SRESID-SRESID)0.0D+0 ) ) THEN
699 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'w
', 2, 1,
701 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'c
', 2, 1,
706.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
712 NPROCS_REAL = ( N-1 )/NB + 1
713 N_LAST = MOD( N-1, NB ) + 1
718 NOPS = 2*(DBLE(N)*DBLE(BWL)*
720 $ (DBLE(N)*DBLE(BWL))
725 $ 2 * (DBLE(N)*(DBLE(BWL)+DBLE((BWL+BWU)))
730 NOPS = NOPS * DBLE(4)
737 NOPS2 = 2*( (DBLE(N_FIRST)*
738 $ DBLE((BWL+BWU))*DBLE(BWU)))
740.GT.
IF ( NPROCS_REAL 1) THEN
746 $ 8*( (DBLE(N_LAST)*DBLE((BWL+BWU))
747 $ *DBLE((BWL+BWU))) )
750.GT.
IF ( NPROCS_REAL 2) THEN
754 NOPS2 = NOPS2 + (NPROCS_REAL-2)*
755 $ 8*( (DBLE(NB)*DBLE((BWL+BWU))
756 $ *DBLE((BWL+BWU))) )
762 $ 2*( NPROCS_REAL-1 ) *
763 $ ( (BWL+BWU)*(BWL+BWU)*(BWL+BWU)/3 )
764.GT.
IF( NPROCS_REAL 1 ) THEN
766 $ 2*( NPROCS_REAL-2 ) *
767 $ (2*(BWL+BWU)*(BWL+BWU)*(BWL+BWU))
780 $ ( DBLE(BWL)+DBLE((BWL+BWU)))
782.GT.
IF ( NPROCS_REAL 1 ) THEN
790 $ (DBLE(N_LAST)*(DBLE((BWL+BWU))+
791 $ DBLE((BWL+BWU))))*DBLE(NRHS)
794.GT.
IF ( NPROCS_REAL 2 ) THEN
801 $ ( NPROCS_REAL-2)*2*
802 $ ( (DBLE(NB)*(DBLE((BWL+BWU))+
803 $ DBLE((BWL+BWU))))*DBLE(NRHS) )
809 $ NRHS*( NPROCS_REAL-1)*2*((BWL+BWU)*(BWL+BWU) )
810.GT.
IF( NPROCS_REAL 1 ) THEN
812 $ NRHS*( NPROCS_REAL-2 ) *
813 $ ( 6 * (BWL+BWU)*(BWL+BWU) )
819 NOPS2 = NOPS2 * DBLE(4)
826.GT.
IF( WTIME( 1 ) + WTIME( 2 ) 0.0D+0 ) THEN
828 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
833.GT.
IF( WTIME( 1 )+WTIME( 2 )0.0D+0 ) THEN
835 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
840.GE.
IF( WTIME( 2 )0.0D+0 )
841 $ WRITE( NOUT, FMT = 9993 ) 'wall
', TRANS,
844 $ NB, NRHS, NPROW, NPCOL,
845 $ WTIME( 1 ), WTIME( 2 ), TMFLOPS,
850.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
852 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
857.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
859 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
864.GE.
IF( CTIME( 2 )0.0D+0 )
865 $ WRITE( NOUT, FMT = 9993 ) 'cpu
', TRANS,
868 $ NB, NRHS, NPROW, NPCOL,
869 $ CTIME( 1 ), CTIME( 2 ), TMFLOPS,
885 CALL BLACS_GRIDEXIT( ICTXT )
886 CALL BLACS_GRIDEXIT( ICTXTB )
896 KTESTS = KPASS + KFAIL + KSKIP
897 WRITE( NOUT, FMT = * )
898 WRITE( NOUT, FMT = 9992 ) KTESTS
900 WRITE( NOUT, FMT = 9991 ) KPASS
901 WRITE( NOUT, FMT = 9989 ) KFAIL
903 WRITE( NOUT, FMT = 9990 ) KPASS
905 WRITE( NOUT, FMT = 9988 ) KSKIP
906 WRITE( NOUT, FMT = * )
907 WRITE( NOUT, FMT = * )
908 WRITE( NOUT, FMT = 9987 )
909.NE..AND..NE.
IF( NOUT6 NOUT0 )
915 9999 FORMAT( 'illegal
', A6, ':
', A5, ' =
', I3,
916 $ '; it should be at least 1
' )
917 9998 FORMAT( 'illegal grid: nprow*npcol =
', I4, '. it can be at most
',
919 9997 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
920 9996 FORMAT( 'unable to perform
', A, ': need totmem of at least
',
922 9995 FORMAT( 'time tr n bwl bwu nb nrhs
',
923 $ 'slv time mflops mflop2 check
' )
924 9994 FORMAT( '---- -- ------ --- --- ---- ----- ---- ---- --------
',
925 $ '-------- -------- -------- ------
' )
926 9993 FORMAT( A4,1X,A1,2X,I6,1X,I3,1X,I3,1X,I4,1X,I5,
927 $ 1X,I4,1X,I4,1X,F9.3,
928 $ F9.4, F9.2, F9.2, 1X, A6 )
929 9992 FORMAT( 'finished
', I6, ' tests, with
the following results:
' )
930 9991 FORMAT( I5, ' tests completed and passed residual checks.
' )
931 9990 FORMAT( I5, ' tests completed without checking.
' )
932 9989 FORMAT( I5, ' tests completed and failed residual checks.
' )
933 9988 FORMAT( I5, ' tests skipped because of illegal input values.
' )
934 9987 FORMAT( 'END OF TESTS.
' )
935 9986 FORMAT( '||A -
', A4, '|| / (||A|| * N * eps) =
', G25.7 )
936 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 pzdblaschk(symm, uplo, trans, n, bwl, bwu, nrhs, x, ix, jx, descx, iaseed, a, ia, ja, desca, ibseed, anorm, resid, work, worksiz)
subroutine pzfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine pzgbinfo(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 pzgbtrf(n, bwl, bwu, a, ja, desca, ipiv, af, laf, work, lwork, info)
subroutine pzgbtrs(trans, n, bwl, bwu, nrhs, a, ja, desca, ipiv, b, ib, descb, af, laf, work, lwork, info)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)