59 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dt_,
60 $ lld_, mb_, m_, nb_, n_, rsrc_
61 parameter( block_cyclic_2d = 1, dlen_ = 9, dt_ = 1,
62 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
63 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
64 INTEGER dblesz, totmem, memsiz, ntests
65 DOUBLE PRECISION padval, zero, one
66 parameter( dblesz = 8, totmem = 2000000,
67 $ memsiz = totmem / dblesz, ntests = 20,
68 $ padval = -9923.0d+0, zero = 0.0d+0,
75 INTEGER i, iam, iaseed, ictxt, iii, imidpad, info, ipa,
76 $ ipostpad, iprepad, ipw, ipwi,
81 DOUBLE PRECISION anorm, fresid, nops, qresid, tmflops,
84 INTEGER desca( dlen_ ), descz( dlen_ ), ierr( 2 ),
85 $ idum( 1 ), nbval( ntests ), nval( ),
86 $ pval( ntests ), qval( ntests )
87 DOUBLE PRECISION ctime( 1 ), mem( memsiz ), wtime( 1 )
90 EXTERNAL blacs_barrier, blacs_exit, blacs_get,
106 DATA kfail, kpass, kskip, ktests / 4*0 /
112 CALL blacs_pinfo( iam, nprocs )
114 CALL pdnepinfo( outfile, nout, nmat, nval, ntests, nnb, nbval,
115 $ ntests, ngrids, pval, ntests, qval, ntests,
116 $ thresh, mem, iam, nprocs )
117 check = ( thresh.GE.0.0e+0 )
122 WRITE( nout, fmt = * )
123 WRITE( nout, fmt = 9995 )
124 WRITE( nout, fmt = 9994 )
125 WRITE( nout, fmt = * )
138 IF( nprow.LT.1 )
THEN
140 $
WRITE( nout, fmt = 9999 )
'GRID',
'nprow', nprow
142 ELSE IF( npcol.LT.1 )
THEN
144 $
WRITE( nout, fmt = 9999 )
'GRID',
'npcol', npcol
146 ELSE IF( nprow*npcol.GT.nprocs )
THEN
148 $
WRITE( nout, fmt = 9998 )nprow*npcol
152 IF( ierr( 1 ).GT.0 )
THEN
154 $
WRITE( nout, fmt = 9997 )
'grid'
161 CALL blacs_get( -1, 0, ictxt )
168 IF( myrow.GE.nprow .OR. mycol.GE.npcol )
180 $
WRITE( nout, fmt = 9999 )
'MATRIX',
'N', n
186 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
188 IF( ierr( 1 ).GT.0 )
THEN
190 $
WRITE( nout, fmt = 9997 )
'matrix'
205 $
WRITE( nout, fmt = 9999 )
'NB',
'NB', nb
210 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
212 IF( ierr( 1 ).GT.0 )
THEN
214 $
WRITE( nout, fmt = 9997 )
'NB'
221 np =
numroc( n, nb, myrow, 0, nprow )
222 nq =
numroc( n, nb, mycol, 0, npcol )
224 iprepad =
max( nb, np )
226 ipostpad =
max( nb, nq )
227 iprepad = iprepad + 1000
228 imidpad = imidpad + 1000
229 ipostpad = ipostpad + 1000
238 CALL descinit( desca, n, n, nb, nb, 0, 0, ictxt,
239 $
max( 1, np )+imidpad, ierr( 1 ) )
243 CALL descinit( descz, n, n, nb, nb, 0, 0, ictxt,
244 $
max( 1, np )+imidpad, ierr( 2 ) )
251 CALL igsum2d( ictxt,
'All',
' ', 2, 1, ierr, 2, -1, 0 )
253 IF( ierr( 1 ).LT.0 .OR. ierr( 2 ).LT.0 )
THEN
255 $
WRITE( nout, fmt = 9997 )
'descriptor'
264 ipz = ipa + desca( lld_ )*nq + ipostpad + iprepad
265 ipwr = ipz + descz( lld_ )*nq + ipostpad + iprepad
266 ipwi = ipwr + n + ipostpad + iprepad
267 ipw = ipwi + n + ipostpad + iprepad
271 iii = 7*iii /
ilcm( nprow, npcol )
274 lwork = 3*n +
max( 2*
max( lda, ldz )+2*nq, iii )
275 lwork = lwork +
max(2*n, (8*
ilcm(nprow,npcol)+2)**2 )
282 worksiz = lwork +
max( np*desca( nb_ ),
283 $ desca( mb_ )*nq ) + ipostpad
287 worksiz = lwork + ipostpad
294 IF( ipw+worksiz.GT.memsiz )
THEN
296 $
WRITE( nout, fmt = 9996 )
'Schur reduction',
297 $ ( ipw+worksiz )*dblesz
303 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
305 IF( ierr( 1 ).GT.0 )
THEN
307 $
WRITE( nout, fmt = 9997 )'memory
'
314 CALL PDLASET( 'all
', N, N, ZERO, ONE, MEM( IPZ ), 1, 1,
319 CALL PDMATGEN( ICTXT, 'no transpose
', 'no transpose
',
320 $ DESCA( M_ ), DESCA( N_ ), DESCA( MB_ ),
321 $ DESCA( NB_ ), MEM( IPA ), DESCA( LLD_ ),
322 $ DESCA( RSRC_ ), DESCA( CSRC_ ), IASEED, 0,
323 $ NP, 0, NQ, MYROW, MYCOL, NPROW, NPCOL )
324 CALL PDLASET( 'lower
', MAX( 0, N-2 ), MAX( 0, N-2 ),
325 $ ZERO, ZERO, MEM( IPA ), MIN( N, 3 ), 1,
331 CALL PDFILLPAD( ICTXT, NP, NQ, MEM( IPA-IPREPAD ),
332 $ DESCA( LLD_ ), IPREPAD, IPOSTPAD,
334 CALL PDFILLPAD( ICTXT, NP, NQ, MEM( IPZ-IPREPAD ),
335 $ DESCZ( LLD_ ), IPREPAD, IPOSTPAD,
337 CALL PDFILLPAD( ICTXT, WORKSIZ-IPOSTPAD, 1,
338 $ MEM( IPW-IPREPAD ), WORKSIZ-IPOSTPAD,
339 $ IPREPAD, IPOSTPAD, PADVAL )
340 ANORM = PDLANHS( 'i
', N, MEM( IPA ), 1, 1, DESCA,
342 CALL PDCHEKPAD( ICTXT, 'pdlanhs', NP, NQ,
343 $ MEM( IPA-IPREPAD ), DESCA( LLD_ ),
344 $ IPREPAD, IPOSTPAD, PADVAL )
345 CALL PDCHEKPAD( ICTXT, 'pdlanhs', WORKSIZ-IPOSTPAD, 1,
346 $ MEM( IPW-IPREPAD ), WORKSIZ-IPOSTPAD,
347 $ IPREPAD, IPOSTPAD, PADVAL )
349 CALL PDFILLPAD( ICTXT, N, 1, MEM( IPWR-IPREPAD ), N,
350 $ IPREPAD, IPOSTPAD, PADVAL )
351 CALL PDFILLPAD( ICTXT, N, 1, MEM( IPWI-IPREPAD ), N,
352 $ IPREPAD, IPOSTPAD, PADVAL )
353 CALL PDFILLPAD( ICTXT, LWORK, 1, MEM( IPW-IPREPAD ),
354 $ LWORK, IPREPAD, IPOSTPAD, PADVAL )
359 CALL BLACS_BARRIER( ICTXT, 'all
' )
364 CALL PDLAHQR( .TRUE., .TRUE., N, 1, N, MEM( IPA ), DESCA,
365 $ MEM( IPWR ), MEM( IPWI ), 1, N, MEM( IPZ ),
366 $ DESCZ, MEM( IPW ), LWORK, IDUM, 0, INFO )
372 $ WRITE( NOUT, FMT = * )'pdlahqr info=
', INFO
381 CALL PDCHEKPAD( ICTXT, 'pdlahqr(a)
', NP, NQ,
382 $ MEM( IPA-IPREPAD ), DESCA( LLD_ ),
383 $ IPREPAD, IPOSTPAD, PADVAL )
384 CALL PDCHEKPAD( ICTXT, 'pdlahqr(z)
', NP, NQ,
385 $ MEM( IPZ-IPREPAD ), DESCZ( LLD_ ),
386 $ IPREPAD, IPOSTPAD, PADVAL )
387 CALL PDCHEKPAD( ICTXT, 'pdlahqr(wr)
', N, 1,
388 $ MEM( IPWR-IPREPAD ), N, IPREPAD,
390 CALL PDCHEKPAD( ICTXT, 'pdlahqr(wi)
', N, 1,
391 $ MEM( IPWI-IPREPAD ), N, IPREPAD,
393 CALL PDCHEKPAD( ICTXT, 'pdlahqr(work)
', LWORK, 1,
394 $ MEM( IPW-IPREPAD ), LWORK, IPREPAD,
397 CALL PDFILLPAD( ICTXT, WORKSIZ-IPOSTPAD, 1,
398 $ MEM( IPW-IPREPAD ), WORKSIZ-IPOSTPAD,
399 $ IPREPAD, IPOSTPAD, PADVAL )
403 CALL PDNEPFCHK( N, MEM( IPA ), 1, 1, DESCA, IASEED,
404 $ MEM( IPZ ), 1, 1, DESCZ, ANORM,
405 $ FRESID, MEM( IPW ) )
407 CALL PDCHEKPAD( ICTXT, 'pdnepfchk(a)
', NP, NQ,
408 $ MEM( IPA-IPREPAD ), DESCA( LLD_ ),
409 $ IPREPAD, IPOSTPAD, PADVAL )
410 CALL PDCHEKPAD( ICTXT, 'pdnepfchk (z)
', NP, NQ,
411 $ MEM( IPZ-IPREPAD ), DESCZ( LLD_ ),
412 $ IPREPAD, IPOSTPAD, PADVAL )
413 CALL PDCHEKPAD( ICTXT, 'pdnepfchk(work)
',
414 $ WORKSIZ-IPOSTPAD, 1,
415 $ MEM( IPW-IPREPAD ), WORKSIZ-IPOSTPAD,
416 $ IPREPAD, IPOSTPAD, PADVAL )
420 CALL PDLASET( 'all
', N, N, ZERO, ONE, MEM( IPA ), 1,
422 CALL PDGEMM( 'transpose
', 'no transpose
', N, N, N,
423 $ -ONE, MEM( IPZ ), 1, 1, DESCZ,
424 $ MEM( IPZ ), 1, 1, DESCZ, ONE, MEM( IPA ),
426 ZNORM = PDLANGE( '1
', N, N, MEM( IPA ), 1, 1, DESCA,
428 QRESID = ZNORM / ( DBLE( N )*PDLAMCH( ICTXT, 'p
' ) )
432.LE..AND.
IF( ( FRESIDTHRESH )
433.EQ..AND.
$ ( ( FRESID-FRESID )0.0D+0 )
434.LE..AND.
$ ( QRESIDTHRESH )
435.EQ.
$ ( ( QRESID-QRESID )0.0D+0 ) ) THEN
442 WRITE( NOUT, FMT = 9986 )FRESID
443 WRITE( NOUT, FMT = 9985 )QRESID
452 FRESID = FRESID - FRESID
453 QRESID = QRESID - QRESID
460 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'w
', 1, 1, WTIME )
461 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'c
', 1, 1, CTIME )
465.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
469 NOPS = 18.0D+0*DBLE( N )**3
476.GT.
IF( WTIME( 1 )0.0D+0 ) THEN
477 TMFLOPS = NOPS / ( WTIME( 1 )*1.0D+6 )
481.GE.
IF( WTIME( 1 )0.0D+0 )
482 $ WRITE( NOUT, FMT = 9993 )'wall
', N, NB, NPROW,
483 $ NPCOL, WTIME( 1 ), TMFLOPS, PASSED
487.GT.
IF( CTIME( 1 )0.0D+0 ) THEN
488 TMFLOPS = NOPS / ( CTIME( 1 )*1.0D+6 )
493.GE.
IF( CTIME( 1 )0.0D+0 )
494 $ WRITE( NOUT, FMT = 9993 )'cpu
', N, NB, NPROW,
495 $ NPCOL, CTIME( 1 ), TMFLOPS, PASSED
502 CALL BLACS_GRIDEXIT( ICTXT )
509 KTESTS = KPASS + KFAIL + KSKIP
510 WRITE( NOUT, FMT = * )
511 WRITE( NOUT, FMT = 9992 )KTESTS
513 WRITE( NOUT, FMT = 9991 )KPASS
514 WRITE( NOUT, FMT = 9989 )KFAIL
516 WRITE( NOUT, FMT = 9990 )KPASS
518 WRITE( NOUT, FMT = 9988 )KSKIP
519 WRITE( NOUT, FMT = * )
520 WRITE( NOUT, FMT = * )
521 WRITE( NOUT, FMT = 9987 )
522.NE..AND..NE.
IF( NOUT6 NOUT0 )
528 9999 FORMAT( 'illegal
', A6, ':
', A5, ' =
', I3,
529 $ '; it should be at least 1
' )
530 9998 FORMAT( 'illegal grid: nprow*npcol =
', I4, '. it can be at most
',
532 9997 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
533 9996 FORMAT( 'unable to perform
', A, ': need totmem of at least
',
535 9995 FORMAT( 'time n nb p q nep time mflops check
' )
536 9994 FORMAT( '---- ----- --- ---- ---- -------- -------- ------
' )
537 9993 FORMAT( A4, 1X, I5, 1X, I3, 1X, I4, 1X, I4, 1X, F8.2, 1X, F8.2,
539 9992 FORMAT( 'finished
', I6, ' tests, with
the following results:
' )
540 9991 FORMAT( I5, ' tests completed and passed residual checks.
' )
541 9990 FORMAT( I5, ' tests completed without checking.
' )
542 9989 FORMAT( I5, ' tests completed and failed residual checks.
' )
543 9988 FORMAT( I5, ' tests skipped because of illegal input values.
' )
544 9987 FORMAT( 'END OF TESTS.
' )
545 9986 FORMAT( '||H - Q*S*Q^T|| / (||H|| * N * eps) =
', G25.7 )
546 9985 FORMAT( '||Q^T*Q - I|| / ( N * eps )
', G25.7 )
subroutine pdmatgen(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)
subroutine descinit(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld, info)
subroutine blacs_gridexit(cntxt)
double precision function pdlange(norm, m, n, a, ia, ja, desca, work)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pdlaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
double precision function pdlamch(ictxt, cmach)
subroutine pdchekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine pdfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine pdlahqr(wantt, wantz, n, ilo, ihi, a, desca, wr, wi, iloz, ihiz, z, descz, work, lwork, iwork, ilwork, info)
double precision function pdlanhs(norm, n, a, ia, ja, desca, work)
subroutine pdnepfchk(n, a, ia, ja, desca, iaseed, z, iz, jz, descz, anorm, fresid, work)
subroutine pdnepinfo(summry, nout, nmat, nval, ldnval, nnb, nbval, ldnbval, ngrids, pval, ldpval, qval, ldqval, thresh, work, iam, nprocs)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)