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, int_temp, ipa, ipb, ipostpad,
100 $ iprepad, , ipw_size, ipw_solve,
101 $ ipw_solve_size, ip_driver_w, ip_fillin, j, k,
102 $ kfail, kpass, kskip, ktests, mycol, myrhs_size,
103 $ myrow, , nb, nbw, ngrids, nmat, nnb, ,
104 $ nnr, nout, np, npcol, nprocs, nprocs_real,
105 $ nprow, nq, nrhs, n_first, n_last, worksiz
107 DOUBLE PRECISION anorm, nops, nops2, sresid, tmflops,
111 INTEGER ( 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 pzptinfo( 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', 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)*int_one-1)/npcol + 1 )
277 nb =
max( nb, 2*int_one )
284 IF( nb.LT.
min( 2*int_one, n ) )
THEN
290 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1,
293 IF( ierr( 1 ).GT.0 )
THEN
302 nq =
numroc( n, nb, mycol, 0, npcol )
318 $ ictxtb, nb+10, ierr( 1 ) )
327 desca( 6 ) = ((2)+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 + (nb+10)*(2)
371 free_ptr = free_ptr + iprepad
373 free_ptr = free_ptr + fillin_size
386 free_ptr = free_ptr + ipw_size
391 IF( free_ptr.GT.memsiz )
THEN
393 $
WRITE( nout, fmt = 9996 )
394 $
'divide and conquer factorization',
401 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr,
404 IF( ierr( 1 ).GT.0 )
THEN
406 $
WRITE( nout, fmt = 9997 )
'MEMORY'
412 worksiz =
max( ((2)+10), nb )
420 worksiz =
max( worksiz, desca2d( nb_ ) )
423 worksiz =
max( worksiz,
427 free_ptr = free_ptr + iprepad
428 ip_driver_w = free_ptr
429 free_ptr = free_ptr + worksiz + ipostpad
435 IF( free_ptr.GT.memsiz )
THEN
437 $
WRITE( nout, fmt = 9996 )
'factorization',
438 $ ( free_ptr )*zplxsz
444 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr,
447 IF( ierr( 1 ).GT.0 )
THEN
449 $
WRITE( nout, fmt = 9997 )
'MEMORY'
454 CALL pzbmatgen( ictxt, uplo, 't
', BW, BW, N, (2), NB,
455 $ MEM( IPA ), NB+10, 0, 0, IASEED, MYROW,
456 $ MYCOL, NPROW, NPCOL )
457 CALL PZFILLPAD( ICTXT, NQ, NP, MEM( IPA-IPREPAD ),
458 $ NB+10, IPREPAD, IPOSTPAD,
461 CALL PZFILLPAD( ICTXT, WORKSIZ, 1,
462 $ MEM( IP_DRIVER_W-IPREPAD ), WORKSIZ,
463 $ IPREPAD, IPOSTPAD, PADVAL )
469 ANORM = PZLANGE( 'i
', N,
470 $ (2), MEM( IPA ), 1, 1,
471 $ DESCA2D, MEM( IP_DRIVER_W ) )
472 CALL PZCHEKPAD( ICTXT, 'pzlange', NQ, NP,
473 $ MEM( IPA-IPREPAD ), NB+10,
474 $ IPREPAD, IPOSTPAD, PADVAL )
475 CALL PZCHEKPAD( ICTXT, 'pzlange',
477 $ MEM( IP_DRIVER_W-IPREPAD ), WORKSIZ,
478 $ IPREPAD, IPOSTPAD, PADVAL )
481 IF( LSAME( UPLO, 'l
' ) ) THEN
484 INT_TEMP = DESCA2D( LLD_ )
490 DO 10 H=1, NUMROC(N,NB,MYCOL,0,NPCOL)/2
491 MEM( IPA+INT_TEMP+H-1 ) = MEM( IPA+INT_TEMP+2*H-2 )
492 $ +MEM( IPA+INT_TEMP+2*H-1 )*( 0.0D+0, 1.0D+0 )
494.NE.
IF( 2*(NUMROC(N,NB,MYCOL,0,NPCOL)/2)
495 $ NUMROC(N,NB,MYCOL,0,NPCOL) ) THEN
496 H=NUMROC(N,NB,MYCOL,0,NPCOL)/2+1
497 MEM( IPA+INT_TEMP+H-1 ) = MEM( IPA+INT_TEMP+2*H-2 )
502 CALL BLACS_BARRIER( ICTXT, 'all
' )
508 CALL PZPTTRF( N, MEM( IPA+INT_TEMP ),
509 $ MEM( IPA+1*( NB+10-INT_TEMP ) ), 1, DESCA,
510 $ MEM( IP_FILLIN ), FILLIN_SIZE, MEM( IPW ),
517 WRITE( NOUT, FMT = * ) 'pzpttrf info=
', INFO
527 CALL PZCHEKPAD( ICTXT, 'pzpttrf', NQ,
528 $ NP, MEM( IPA-IPREPAD ), NB+10,
529 $ IPREPAD, IPOSTPAD, PADVAL )
543 CALL DESCINIT( DESCB2D, N, NRHS, NB, 1, 0, 0,
544 $ ICTXTB, NB+10, IERR( 1 ) )
553 DESCB( 6 ) = DESCB2D( LLD_ )
562 FREE_PTR = FREE_PTR + IPREPAD
564 FREE_PTR = FREE_PTR + NRHS*DESCB2D( LLD_ )
569 IPW_SOLVE_SIZE = (10+2*MIN(100,NRHS))*NPCOL+4*NRHS
572 FREE_PTR = FREE_PTR + IPW_SOLVE_SIZE
575.GT.
IF( FREE_PTRMEMSIZ ) THEN
577 $ WRITE( NOUT, FMT = 9996 )'solve
',
578 $ ( FREE_PTR )*ZPLXSZ
584 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1,
587.GT.
IF( IERR( 1 )0 ) THEN
589 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
594 MYRHS_SIZE = NUMROC( N, NB, MYCOL, 0, NPCOL )
598 CALL PZMATGEN(ICTXTB, 'no
', 'no
',
599 $ DESCB2D( M_ ), DESCB2D( N_ ),
600 $ DESCB2D( MB_ ), DESCB2D( NB_ ),
602 $ DESCB2D( LLD_ ), DESCB2D( RSRC_ ),
604 $ IBSEED, 0, MYRHS_SIZE, 0, NRHS, MYCOL,
605 $ MYROW, NPCOL, NPROW )
608 CALL PZFILLPAD( ICTXTB, NB, NRHS,
609 $ MEM( IPB-IPREPAD ),
613 CALL PZFILLPAD( ICTXT, WORKSIZ, 1,
614 $ MEM( IP_DRIVER_W-IPREPAD ),
620 CALL BLACS_BARRIER( ICTXT, 'all
')
625 CALL PZPTTRS( UPLO, N, NRHS, MEM( IPA+INT_TEMP ),
626 $ MEM( IPA+1*( NB+10-INT_TEMP ) ), 1,
627 $ DESCA, MEM( IPB ), 1, DESCB,
628 $ MEM( IP_FILLIN ), FILLIN_SIZE,
629 $ MEM( IPW_SOLVE ), IPW_SOLVE_SIZE,
636 $ WRITE( NOUT, FMT = * ) 'pzpttrs info=
', INFO
646 CALL PZCHEKPAD( ICTXT, 'pzpttrs-work
',
648 $ MEM( IP_DRIVER_W-IPREPAD ),
659 CALL DESCINIT( DESCA2D, (2), N,
661 $ ICTXT, (2), IERR( 1 ) )
662 CALL PZPTLASCHK( 'h
', UPLO, N, BW, BW, NRHS,
663 $ MEM( IPB ), 1, 1, DESCB2D,
664 $ IASEED, MEM( IPA ), 1, 1, DESCA2D,
665 $ IBSEED, ANORM, SRESID,
666 $ MEM( IP_DRIVER_W ), WORKSIZ )
669.GT.
IF( SRESIDTHRESH )
670 $ WRITE( NOUT, FMT = 9985 ) SRESID
675.LE..AND.
IF( ( SRESIDTHRESH )
676.EQ.
$ ( (SRESID-SRESID)0.0D+0 ) ) THEN
691 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'w
', 2, 1,
693 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'c
', 2, 1,
698.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
704 NPROCS_REAL = ( N-1 )/NB + 1
705 N_LAST = MOD( N-1, NB ) + 1
708 NOPS = NOPS + DBLE(BW)*( -2.D0 / 3.D0+DBLE(BW)*
709 $ ( -1.D0+DBLE(BW)*( -1.D0 / 3.D0 ) ) ) +
710 $ DBLE(N)*( 1.D0+DBLE(BW)*( 3.D0 /
711 $ 2.D0+DBLE(BW)*( 1.D0 / 2.D0 ) ) )
712 NOPS = NOPS + DBLE(BW)*( -1.D0 / 6.D0+DBLE(BW)
713 $ *( -1.D0 /2.D0+DBLE(BW)
714 $ *( -1.D0 / 3.D0 ) ) ) +
715 $ DBLE(N)*( DBLE(BW) /
716 $ 2.D0*( 1.D0+DBLE(BW) ) )
719 $ DBLE(NRHS)*( ( 2*DBLE(N)-DBLE(BW) )*
720 $ ( DBLE(BW)+1.D0 ) )+ DBLE(NRHS)*
721 $ ( DBLE(BW)*( 2*DBLE(N)-
722 $ ( DBLE(BW)+1.D0 ) ) )
729 NOPS2 = ( (DBLE(N_FIRST))* DBLE(BW)**2 )
731.GT.
IF ( NPROCS_REAL 1) THEN
736 $ 4*( (DBLE(N_LAST)*DBLE(BW)**2) )
739.GT.
IF ( NPROCS_REAL 2) THEN
743 NOPS2 = NOPS2 + (NPROCS_REAL-2)*
744 $ 4*( (DBLE(NB)*DBLE(BW)**2) )
750 $ ( NPROCS_REAL-1 ) * ( BW*BW*BW/3 )
751.GT.
IF( NPROCS_REAL 1 ) THEN
753 $ ( NPROCS_REAL-2 ) * ( 2 * BW*BW*BW )
760 $ ( 4.0D+0*(DBLE(N_FIRST)*DBLE(BW))*DBLE(NRHS) )
762.GT.
IF ( NPROCS_REAL 1 ) THEN
767 $ 2*( 4.0D+0*(DBLE(N_LAST)*DBLE(BW))*DBLE(NRHS) )
770.GT.
IF ( NPROCS_REAL 2 ) THEN
775 $ ( NPROCS_REAL-2)*2*
776 $ ( 4.0D+0*(DBLE(NB)*DBLE(BW))*DBLE(NRHS) )
782 $ NRHS*( NPROCS_REAL-1 ) * ( BW*BW )
783.GT.
IF( NPROCS_REAL 1 ) THEN
785 $ NRHS*( NPROCS_REAL-2 ) * ( 3 * BW*BW )
791 NOPS2 = NOPS2 * DBLE(4)
798.GT.
IF( WTIME( 1 ) + WTIME( 2 ) 0.0D+0 ) THEN
800 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
805.GT.
IF( WTIME( 1 )+WTIME( 2 )0.0D+0 ) THEN
807 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
812.GE.
IF( WTIME( 2 )0.0D+0 )
813 $ WRITE( NOUT, FMT = 9993 ) 'wall
', UPLO,
816 $ NB, NRHS, NPROW, NPCOL,
817 $ WTIME( 1 ), WTIME( 2 ), TMFLOPS,
822.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
824 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
829.GT.
IF( CTIME( 1 )+CTIME( 2 )0.0D+0 ) THEN
831 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
836.GE.
IF( CTIME( 2 )0.0D+0 )
837 $ WRITE( NOUT, FMT = 9993 ) 'cpu
', UPLO,
840 $ NB, NRHS, NPROW, NPCOL,
841 $ CTIME( 1 ), CTIME( 2 ), TMFLOPS,
857 CALL BLACS_GRIDEXIT( ICTXT )
858 CALL BLACS_GRIDEXIT( ICTXTB )
868 KTESTS = KPASS + KFAIL + KSKIP
869 WRITE( NOUT, FMT = * )
870 WRITE( NOUT, FMT = 9992 ) KTESTS
872 WRITE( NOUT, FMT = 9991 ) KPASS
873 WRITE( NOUT, FMT = 9989 ) KFAIL
875 WRITE( NOUT, FMT = 9990 ) KPASS
877 WRITE( NOUT, FMT = 9988 ) KSKIP
878 WRITE( NOUT, FMT = * )
879 WRITE( NOUT, FMT = * )
880 WRITE( NOUT, FMT = 9987 )
881.NE..AND..NE.
IF( NOUT6 NOUT0 )
887 9999 FORMAT( 'illegal
', A6, ':
', A5, ' =
', I3,
888 $ '; it should be at least 1
' )
889 9998 FORMAT( 'illegal grid: nprow*npcol =
', I4, '. it can be at most
',
891 9997 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
892 9996 FORMAT( 'unable to perform
', A, ': need totmem of at least
',
894 9995 FORMAT( 'time ul n bw nb nrhs p q
',
895 $ 'slv time mflops mflop2 check
' )
896 9994 FORMAT( '---- -- ------ --- ---- ----- -- ---- --------
',
897 $ '-------- ------ ------ ------
' )
898 9993 FORMAT( A4, 2X, A1, 1X, I6, 1X, I3, 1X, I4, 1X,
900 $ I4, 1X, F8.3, F9.4, F9.2, F9.2, 1X, A6 )
901 9992 FORMAT( 'finished
', I6, ' tests, with
the following results:
' )
902 9991 FORMAT( I5, ' tests completed and passed residual checks.
' )
903 9990 FORMAT( I5, ' tests completed without checking.
' )
904 9989 FORMAT( I5, ' tests completed and failed residual checks.
' )
905 9988 FORMAT( I5, ' tests skipped because of illegal input values.
' )
906 9987 FORMAT( 'END OF TESTS.
' )
907 9986 FORMAT( '||A -
', A4, '|| / (||A|| * N * eps) =
', G25.7 )
908 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 pzptinfo(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 pzptlaschk(symm, uplo, n, bwl, bwu, nrhs, x, ix, jx, descx, iaseed, a, ia, ja, desca, ibseed, anorm, resid, work, worksiz)
subroutine pzpttrf(n, d, e, ja, desca, af, laf, work, lwork, info)
subroutine pzpttrs(uplo, n, nrhs, d, e, ja, desca, b, ib, descb, af, laf, work, lwork, info)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)