62 INTEGER block_cyclic_2d, , ctxt_, dlen_, dtype_,
63 $ lld_, mb_, m_, nb_, n_, rsrc_
64 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
65 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
67 INTEGER cplxsz, memsiz, ntests, totmem
69 parameter( cplxsz = 8, totmem = 2000000,
70 $ memsiz = totmem / cplxsz, ntests = 20,
71 $ padval = ( -9923.0e+0, -9923.0e+0 ) )
77 INTEGER i, iam, iaseed, ictxt, ihi, ihip
79 $ ipt, ipw, ipostpad, iprepad, itemp, j, k,
80 $ kfail, kpass, kskip, ktests, lcm, lcmq, loff,
81 $ lwork, mycol, myrow, n, nb, ngrids, nmat, nnb,
82 $ nprocs, nout, np, npcol, nprow, nq, workhrd,
84 REAL anorm, fresid, thresh
85 DOUBLE PRECISION nops, tmflops
88 INTEGER desca( dlen_ ), ierr( 1 ), nbval( ntests ),
89 $ nval( ntests ), nvhi( ntests ), nvlo( ntests ),
90 $ pval( ntests ), qval( ntests )
91 DOUBLE PRECISION ctime( 1 ), wtime( 1 )
95 EXTERNAL blacs_barrier, blacs_exit, blacs_get,
111 DATA ktests, kpass, kfail, kskip / 4*0 /
117 CALL blacs_pinfo( iam, nprocs )
119 CALL pchrdinfo( outfile, nout, nmat, nval, nvlo, nvhi, ntests,
120 $ nnb, nbval, ntests, ngrids, pval, ntests, qval,
121 $ ntests, thresh, mem, iam, nprocs )
122 check = ( thresh.GE.0.0e+0 )
127 WRITE( nout, fmt = * )
128 WRITE( nout, fmt = 9995 )
129 WRITE( nout, fmt = 9994 )
130 WRITE( nout, fmt = * )
143 IF( nprow.LT.1 )
THEN
145 $
WRITE( nout, fmt = 9999 )
'GRID',
'nprow', nprow
147 ELSE IF( npcol.LT.1 )
THEN
149 $
WRITE( nout, fmt = 9999 )
'GRID',
'npcol', npcol
151 ELSE IF( nprow*npcol.GT.nprocs )
THEN
153 $
WRITE( nout, fmt = 9998 )nprow*npcol, nprocs
157 IF( ierr( 1 ).GT.0 )
THEN
159 $
WRITE( nout, fmt = 9997 )
'grid'
166 CALL blacs_get( -1, 0, ictxt )
172 IF( myrow.GE.nprow .OR. mycol.GE.npcol )
186 $
WRITE( nout, fmt = 9999 )
'MATRIX',
'N', n
192 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
194 IF( ierr( 1 ).GT.0 )
THEN
196 $
WRITE( nout, fmt = 9997 )
'matrix'
210 $
WRITE( nout, fmt = 9999 )
'NB',
'NB', nb
215 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
217 IF( ierr( 1 ).GT.0 )
THEN
219 $
WRITE( nout, fmt = 9997 )
'NB'
224 np =
numroc( n, nb, myrow, 0, nprow
225 nq =
numroc( n, nb, mycol, 0, npcol )
229 ipostpad =
max( nb, nq )
238 CALL descinit( desca, n, n, nb, nb, 0, 0, ictxt,
239 $
max( 1, np ) + imidpad, info )
243 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
245 IF( ierr( 1 ).LT.0 )
THEN
247 $
WRITE( nout, fmt = 9997 )
'descriptor'
256 ipt = ipa + desca( lld_ )*nq + ipostpad + iprepad
257 ipw = ipt + nq + ipostpad + iprepad
262 ihip =
numroc( ihi, nb, myrow, desca( rsrc_ ), nprow )
263 loff = mod( ilo-1, nb )
264 ilrow =
indxg2p( ilo, nb, myrow, desca( rsrc_ ), nprow )
265 ilcol =
indxg2p( ilo, nb, mycol, desca( csrc_ ), npcol )
266 ihlp =
numroc( ihi-ilo+loff+1, nb, myrow, ilrow, nprow )
267 inlq =
numroc( n-ilo+loff+1, nb, mycol, ilcol, npcol )
268 lwork = nb*( nb +
max( ihip+1, ihlp+inlq ) )
269 workhrd = lwork + ipostpad
275 lcm =
ilcm( nprow, npcol )
277 ihlq =
numroc( ihi-ilo+loff+1, nb, mycol, ilcol,
279 itemp = nb*
max( ihlp+inlq, ihlq+
max( ihip,
281 $ npcol ), nb, 0, 0, lcmq ) ) )
282 worksiz =
max( nb*nb + nb*ihlp + itemp, nb * np ) +
289 IF( ipw+worksiz.GT.memsiz )
THEN
291 $
WRITE( nout, fmt = 9996 )
'Hessenberg reduction',
292 $ ( ipw+worksiz )*cplxsz
298 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
300 IF( ierr( 1 ).GT.0 )
THEN
302 $
WRITE( nout, fmt = 9997 )
'MEMORY'
309 CALL pcmatgen( ictxt,
'No',
'No', desca( m_ ),
310 $ desca( n_ ), desca( mb_ ), desca( nb_ ),
311 $ mem( ipa ), desca( lld_ ), desca( rsrc_ ),
313 $ iaseed, 0, np, 0, nq, myrow, mycol,
319 CALL pcfillpad( ictxt, np, nq, mem( ipa-iprepad ),
320 $ desca( lld_ ), iprepad, ipostpad,
322 CALL pcfillpad( ictxt, nq, 1, mem( ipt-iprepad ),
323 $ nq, iprepad, ipostpad, padval )
324 CALL pcfillpad( ictxt, worksiz-ipostpad, 1,
325 $ mem( ipw-iprepad ), worksiz-ipostpad,
326 $ iprepad, ipostpad, padval )
327 anorm =
pclange(
'I', n, n, mem( ipa ), 1, 1, desca,
329 CALL pcchekpad( ictxt,
'PCLANGE', np, nq,
330 $ mem( ipa-iprepad ), desca( lld_ ),
331 $ iprepad, ipostpad, padval )
333 $ worksiz-ipostpad, 1,
334 $ mem( ipw-iprepad ), worksiz-ipostpad,
335 $ iprepad, ipostpad, padval )
336 CALL pcfillpad( ictxt, workhrd-ipostpad, 1,
337 $ mem( ipw-iprepad ), workhrd-ipostpad,
338 $ iprepad, ipostpad, padval )
342 CALL blacs_barrier( ictxt,
'All' )
347 CALL pcgehrd( n, ilo, ihi, mem( ipa ), 1, 1, desca,
348 $ mem( ipt ), mem( ipw ), lwork, info )
355 CALL pcchekpad( ictxt,
'PCGEHRD', np, nq,
356 $ mem( ipa-iprepad ), desca( lld_ ),
357 $ iprepad, ipostpad, padval )
359 $ mem( ipt-iprepad ), nq, iprepad,
361 CALL pcchekpad( ictxt,
'PCGEHRD', workhrd
362 $ 1, mem( ipw-iprepad ),
363 $ workhrd-ipostpad, iprepad,
365 CALL pcfillpad( ictxt, worksiz-ipostpad, 1,
367 $ iprepad, ipostpad, padval )
371 CALL pcgehdrv( n, ilo, ihi, mem( ipa ), 1, 1, desca,
372 $ mem( ipt ), mem( ipw ) )
373 CALL pclafchk(
'No',
'No', n, n, mem( ipa ), 1, 1,
380 $ MEM( IPA-IPREPAD ), DESCA( LLD_ ),
381 $ IPREPAD, IPOSTPAD, PADVAL )
382 CALL PCCHEKPAD( ICTXT, 'pcgehdrv', NQ, 1,
383 $ MEM( IPT-IPREPAD ), NQ, IPREPAD,
386 $ WORKSIZ-IPOSTPAD, 1,
387 $ MEM( IPW-IPREPAD ), WORKSIZ-IPOSTPAD,
388 $ IPREPAD, IPOSTPAD, PADVAL )
392.LE..AND..EQ.
IF( FRESIDTHRESH FRESID-FRESID0.0E+0 )
397.EQ..AND..EQ.
IF( MYROW0 MYCOL0 )
398 $ WRITE( NOUT, FMT = 9986 ) FRESID
407 FRESID = FRESID - FRESID
413 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'w
', 1, 1, WTIME )
414 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'c
', 1, 1, CTIME )
418.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
424 NOPS = DBLE( IHI-ILO )
426 $ ( 8.0D0*DBLE( IHI ) + (16.0D0/3.0D0)*NOPS )
431.GT.
IF( WTIME( 1 )0.0D+0 ) THEN
432 TMFLOPS = NOPS / WTIME( 1 )
436.GE.
IF( WTIME( 1 )0.0D+0 )
437 $ WRITE( NOUT, FMT = 9993 ) 'wall
', N, ILO, IHI, NB,
438 $ NPROW, NPCOL, WTIME( 1 ), TMFLOPS, FRESID,
443.GT.
IF( CTIME( 1 )0.0D+0 ) THEN
444 TMFLOPS = NOPS / CTIME( 1 )
448.GE.
IF( CTIME( 1 )0.0D+0 )
449 $ WRITE( NOUT, FMT = 9993 ) 'cpu
', N, ILO, IHI, NB,
450 $ NPROW, NPCOL, CTIME( 1 ), TMFLOPS, FRESID,
456 CALL BLACS_GRIDEXIT( ICTXT )
462 KTESTS = KPASS + KFAIL + KSKIP
463 WRITE( NOUT, FMT = * )
464 WRITE( NOUT, FMT = 9992 ) KTESTS
466 WRITE( NOUT, FMT = 9991 ) KPASS
467 WRITE( NOUT, FMT = 9989 ) KFAIL
469 WRITE( NOUT, FMT = 9990 ) KPASS
471 WRITE( NOUT, FMT = 9988 ) KSKIP
472 WRITE( NOUT, FMT = * )
473 WRITE( NOUT, FMT = * )
474 WRITE( NOUT, FMT = 9987 )
475.NE..AND..NE.
IF( NOUT6 NOUT0 )
481 9999 FORMAT( 'illegal
', A6, ':
', A5, ' =
', I3,
482 $ '; it should be at least 1
' )
483 9998 FORMAT( 'illegal grid: nprow*npcol =
', I4, '. it can be at most
',
485 9997 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
486 9996 FORMAT( 'unable to perform
', A, ': need totmem of at least
',
488 9995 FORMAT( 'time n ilo ihi nb p q hrd time
',
489 $ ' mflops residual check
' )
490 9994 FORMAT( '---- ------ ------ ------ --- ----- ----- ---------
',
491 $ '----------- -------- ------
' )
492 9993 FORMAT( A4, 1X, I6, 1X, I6, 1X, I6, 1X, I3, 1X, I5, 1X, I5, 1X,
493 $ F9.2, 1X, F11.2, 1X, F8.2, 1X, A6 )
494 9992 FORMAT( 'finished
', I4, ' tests, with
the following results:
' )
495 9991 FORMAT( I5, ' tests completed and passed residual checks.
' )
496 9990 FORMAT( I5, ' tests completed without checking.
' )
497 9989 FORMAT( I5, ' tests completed and failed residual checks.
' )
498 9988 FORMAT( I5, ' tests skipped because of illegal input values.
' )
499 9987 FORMAT( 'END OF TESTS.
' )
500 9986 FORMAT( '||A - Q*H*Q
''|| / (||A|| * N * eps) =
', G25.7 )
subroutine pclafchk(aform, diag, m, n, a, ia, ja, desca, iaseed, anorm, fresid, work)
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
integer function ilcm(m, n)
subroutine blacs_gridinit(cntxt, c, nprow, npcol)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
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 pcchekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine pcfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine pcgehdrv(n, ilo, ihi, a, ia, ja, desca, tau, work)
subroutine pcgehrd(n, ilo, ihi, a, ia, ja, desca, tau, work, lwork, info)
subroutine pchrdinfo(summry, nout, nmat, nval, nvlo, nvhi, ldnval, nnb, nbval, ldnbval, ngrids, pval, ldpval, qval, ldqval, thresh, work, iam, nprocs)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)