64 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dt_,
65 $ lld_, mb_, m_, nb_, n_, rsrc_
66 parameter( block_cyclic_2d = 1, dlen_ = 9, dt_ = 1,
67 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
68 $ rsrc_ = 7, csrc_ = 8, lld_
69 INTEGER zplxsz, totmem, memsiz, ntests
70 parameter( zplxsz = 16, totmem = 200000000,
71 $ memsiz = totmem / zplxsz, ntests = 20 )
72 COMPLEX*16 padval, zero, one
73 parameter( padval = ( -9923.0d+0, -9923.0d
74 $ zero = ( 0.0d+0, 0.0d+0 ),
75 $ one = ( 1.0d+0, 0.0d+0 ) )
81 INTEGER i, iam, iaseed, ictxt, iii, imidpad, info, ipa,
82 $ ipostpad, iprepad, ipw, ipwr, ipz, j, k, kfail,
83 $ kpass, kskip, ktests, lda, ldwork, , lwork,
84 $ mycol, myrow, n, nb, ngrids, nmat, nnb, nout,
85 $ np, , nprocs, nprow, nq, worksiz
87 DOUBLE PRECISION anorm, fresid, , qresid, tmflops, znorm
90 INTEGER desca( dlen_ ), descz( dlen_ ), idum( 1 ),
91 $ ierr( 2 ), nbval( ntests ), nval( ntests ),
92 $ pval( ntests ), qval( ntests )
93 DOUBLE PRECISION ctime( 2 ), wtime( 2 )
94 COMPLEX*16 mem( memsiz )
97 EXTERNAL blacs_barrier, blacs_exit, blacs_get,
113 DATA kfail, kpass, kskip, ktests / 4*0 /
119 CALL blacs_pinfo( iam, nprocs )
121 CALL pznepinfo( outfile, nout, nmat, nval, ntests, nnb, nbval,
122 $ ntests, ngrids, pval, ntests, qval, ntests,
123 $ thresh, mem, iam, nprocs )
124 check = ( thresh.GE.0.0e+0 )
129 WRITE( nout, fmt = * )
130 WRITE( nout, fmt = 9995 )
131 WRITE( nout, fmt = 9994 )
132 WRITE( nout, fmt = * )
145 IF( nprow.LT.1 )
THEN
147 $
WRITE( nout, fmt = 9999 )
'GRID',
'nprow', nprow
149 ELSE IF( npcol.LT.1 )
THEN
151 $
WRITE( nout, fmt = 9999 )
'GRID',
'npcol', npcol
153 ELSE IF( nprow*npcol.GT.nprocs )
THEN
155 $
WRITE( nout, fmt = 9998 )nprow*npcol, nprocs
159 IF( ierr( 1 ).GT.0 )
THEN
161 $
WRITE( nout, fmt = 9997 )
'grid'
168 CALL blacs_get( -1, 0, ictxt )
175 IF( myrow.GE.nprow .OR. mycol.GE.npcol )
187 $
WRITE( nout, fmt = 9999 )
'MATRIX',
'N', n
193 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
195 IF( ierr( 1 ).GT.0 )
THEN
197 $
WRITE( nout, fmt = 9997 )'matrix
'
212 $ WRITE( NOUT, FMT = 9999 )'nb
', 'nb
', NB
217 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1, -1, 0 )
219.GT.
IF( IERR( 1 )0 ) THEN
221 $ WRITE( NOUT, FMT = 9997 )'nb
'
228 NP = NUMROC( N, NB, MYROW, 0, NPROW )
229 NQ = NUMROC( N, NB, MYCOL, 0, NPCOL )
231 IPREPAD = MAX( NB, NP )
233 IPOSTPAD = MAX( NB, NQ )
234 IPREPAD = IPREPAD + 1000
235 IMIDPAD = IMIDPAD + 1000
236 IPOSTPAD = IPOSTPAD + 1000
245 CALL DESCINIT( DESCA, N, N, NB, NB, 0, 0, ICTXT,
246 $ MAX( 1, NP )+IMIDPAD, IERR( 1 ) )
250 CALL DESCINIT( DESCZ, N, N, NB, NB, 0, 0, ICTXT,
251 $ MAX( 1, NP )+IMIDPAD, IERR( 2 ) )
255 LDWORK = DESCZ( LLD_ )
259 CALL IGSUM2D( ICTXT, 'all
', ' ', 2, 1, IERR, 2, -1, 0 )
261.LT..OR..LT.
IF( IERR( 1 )0 IERR( 2 )0 ) THEN
263 $ WRITE( NOUT, FMT = 9997 )'descriptor
'
272 IPZ = IPA + DESCA( LLD_ )*NQ + IPOSTPAD + IPREPAD
273 IPWR = IPZ + DESCZ( LLD_ )*NQ + IPOSTPAD + IPREPAD
274 IPW = IPWR + DESCZ( LLD_ )*NQ + IPOSTPAD + IPREPAD
278 III = 7*III / ILCM( NPROW, NPCOL )
281 LWORK = 3*N + MAX( 2*MAX( LDA, LDZ )+2*NQ, III )
282 LWORK = LWORK + MAX( 2*N, ( 8*ILCM( NPROW, NPCOL )+2 )**
290 WORKSIZ = LWORK + MAX( NP*DESCA( NB_ ),
291 $ DESCA( MB_ )*NQ ) + IPOSTPAD
295 WORKSIZ = LWORK + IPOSTPAD
302.GT.
IF( IPW+WORKSIZMEMSIZ ) THEN
304 $ WRITE( NOUT, FMT = 9996 )'schur reduction
',
305 $ ( IPW+WORKSIZ )*ZPLXSZ
311 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1, -1, 0 )
313.GT.
IF( IERR( 1 )0 ) THEN
315 $ WRITE( NOUT, FMT = 9997 )'memory
'
322 CALL PZLASET( 'all
', N, N, ZERO, ONE, MEM( IPZ ), 1, 1,
327 CALL PZMATGEN( ICTXT, 'no transpose
', 'no transpose
',
328 $ DESCA( M_ ), DESCA( N_ ), DESCA( MB_ ),
329 $ DESCA( NB_ ), MEM( IPA ), DESCA( LLD_ ),
330 $ DESCA( RSRC_ ), DESCA( CSRC_ ), IASEED, 0,
331 $ NP, 0, NQ, MYROW, MYCOL, NPROW, NPCOL )
332 CALL PZLASET( 'lower
', MAX( 0, N-2 ), MAX( 0, N-2 ),
333 $ ZERO, ZERO, MEM( IPA ), MIN( N, 3 ), 1,
339 CALL PZFILLPAD( ICTXT, NP, NQ, MEM( IPA-IPREPAD ),
340 $ DESCA( LLD_ ), IPREPAD, IPOSTPAD,
342 CALL PZFILLPAD( ICTXT, NP, NQ, MEM( IPZ-IPREPAD ),
343 $ DESCZ( LLD_ ), IPREPAD, IPOSTPAD,
345 CALL PZFILLPAD( ICTXT, WORKSIZ-IPOSTPAD, 1,
346 $ MEM( IPW-IPREPAD ), WORKSIZ-IPOSTPAD,
347 $ IPREPAD, IPOSTPAD, PADVAL )
348 ANORM = PZLANHS( 'i
', N, MEM( IPA ), 1, 1, DESCA,
350 CALL PZCHEKPAD( ICTXT, 'pzlanhs', NP, NQ,
351 $ MEM( IPA-IPREPAD ), DESCA( LLD_ ),
352 $ IPREPAD, IPOSTPAD, PADVAL )
353 CALL PZCHEKPAD( ICTXT, 'pzlanhs', WORKSIZ-IPOSTPAD, 1,
354 $ MEM( IPW-IPREPAD ), WORKSIZ-IPOSTPAD,
355 $ IPREPAD, IPOSTPAD, PADVAL )
357 CALL PZFILLPAD( ICTXT, N, 1, MEM( IPWR-IPREPAD ), N,
358 $ IPREPAD, IPOSTPAD, PADVAL )
359 CALL PZFILLPAD( ICTXT, LWORK, 1, MEM( IPW-IPREPAD ),
360 $ LWORK, IPREPAD, IPOSTPAD, PADVAL )
365 CALL BLACS_BARRIER( ICTXT, 'all
' )
370 CALL PZLAHQR( .TRUE., .TRUE., N, 1, N, MEM( IPA ), DESCA,
371 $ MEM( IPWR ), 1, N, MEM( IPZ ), DESCZ,
372 $ MEM( IPW ), LWORK, IDUM, 0, INFO )
378 $ WRITE( NOUT, FMT = * )'pzlahqr info=
', INFO
387 CALL PZCHEKPAD( ICTXT, 'pzlahqr(a)
', NP, NQ,
388 $ MEM( IPA-IPREPAD ), DESCA( LLD_ ),
389 $ IPREPAD, IPOSTPAD, PADVAL )
390 CALL PZCHEKPAD( ICTXT, 'pzlahqr(z)
', NP, NQ,
391 $ MEM( IPZ-IPREPAD ), DESCZ( LLD_ ),
392 $ IPREPAD, IPOSTPAD, PADVAL )
393 CALL PZCHEKPAD( ICTXT, 'pzlahqr(wr)
', N, 1,
394 $ MEM( IPWR-IPREPAD ), N, IPREPAD,
396 CALL PZCHEKPAD( ICTXT, 'pzlahqr(work)
', LWORK, 1,
397 $ MEM( IPW-IPREPAD ), LWORK, IPREPAD,
400 CALL PZFILLPAD( ICTXT, WORKSIZ-IPOSTPAD, 1,
401 $ MEM( IPW-IPREPAD ), WORKSIZ-IPOSTPAD,
402 $ IPREPAD, IPOSTPAD, PADVAL )
406 CALL PZNEPFCHK( N, MEM( IPA ), 1, 1, DESCA, IASEED,
407 $ MEM( IPZ ), 1, 1, DESCZ, ANORM,
408 $ FRESID, MEM( IPW ) )
410 CALL PZCHEKPAD( ICTXT, 'pznepfchk(a)
', NP, NQ,
411 $ MEM( IPA-IPREPAD ), DESCA( LLD_ ),
412 $ IPREPAD, IPOSTPAD, PADVAL )
413 CALL PZCHEKPAD( ICTXT, 'pznepfchk(z)
', NP, NQ,
414 $ MEM( IPZ-IPREPAD ), DESCZ( LLD_ ),
415 $ IPREPAD, IPOSTPAD, PADVAL )
416 CALL PZCHEKPAD( ICTXT, 'pznepfchk(work)
',
417 $ WORKSIZ-IPOSTPAD, 1,
418 $ MEM( IPW-IPREPAD ), WORKSIZ-IPOSTPAD,
419 $ IPREPAD, IPOSTPAD, PADVAL )
423 CALL PZLASET( 'all
', N, N, ZERO, ONE, MEM( IPA ), 1,
425 CALL PZGEMM( 'cong tran
', 'no transpose
', N, N, N,
426 $ -ONE, MEM( IPZ ), 1, 1, DESCZ,
427 $ MEM( IPZ ), 1, 1, DESCZ, ONE, MEM( IPA ),
429 ZNORM = PZLANGE( '1
', N, N, MEM( IPA ), 1, 1, DESCA,
431 QRESID = ZNORM / ( DBLE( N )*PDLAMCH( ICTXT, 'p
' ) )
435.LE..AND.
IF( ( FRESIDTHRESH )
436.EQ..AND.
$ ( ( FRESID-FRESID )0.0D+0 )
437.LE..AND.
$ ( QRESIDTHRESH )
438.EQ.
$ ( ( QRESID-QRESID )0.0D+0 ) ) THEN
445 WRITE( NOUT, FMT = 9986 )FRESID
446 WRITE( NOUT, FMT = 9985 )QRESID
455 FRESID = FRESID - FRESID
456 QRESID = QRESID - QRESID
463 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'w
', 1, 1, WTIME )
464 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'c
', 1, 1, CTIME )
468.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
472 NOPS = 18.0D+0*DBLE( N )**3
479.GT.
IF( WTIME( 1 )0.0D+0 ) THEN
480 TMFLOPS = NOPS / ( WTIME( 1 )*1.0D+6 )
484.GE.
IF( WTIME( 1 )0.0D+0 )
485 $ WRITE( NOUT, FMT = 9993 )'wall
', N, NB, NPROW,
486 $ NPCOL, WTIME( 1 ), TMFLOPS, PASSED
490.GT.
IF( CTIME( 1 )0.0D+0 ) THEN
491 TMFLOPS = NOPS / ( CTIME( 1 )*1.0D+6 )
496.GE.
IF( CTIME( 1 )0.0D+0 )
497 $ WRITE( NOUT, FMT = 9993 )'cpu
', N, NB, NPROW,
498 $ NPCOL, CTIME( 1 ), TMFLOPS, PASSED
505 CALL BLACS_GRIDEXIT( ICTXT )
512 KTESTS = KPASS + KFAIL + KSKIP
513 WRITE( NOUT, FMT = * )
514 WRITE( NOUT, FMT = 9992 )KTESTS
516 WRITE( NOUT, FMT = 9991 )KPASS
517 WRITE( NOUT, FMT = 9989 )KFAIL
519 WRITE( NOUT, FMT = 9990 )KPASS
521 WRITE( NOUT, FMT = 9988 )KSKIP
522 WRITE( NOUT, FMT = * )
523 WRITE( NOUT, FMT = * )
524 WRITE( NOUT, FMT = 9987 )
525.NE..AND..NE.
IF( NOUT6 NOUT0 )
531 9999 FORMAT( 'illegal
', A6, ':
', A5, ' =
', I3,
532 $ '; it should be at least 1
' )
533 9998 FORMAT( 'illegal grid: nprow*npcol =
', I4, '. it can be at most
',
535 9997 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
536 9996 FORMAT( 'unable to perform
', A, ': need totmem of at least
',
538 9995 FORMAT( 'time n nb p q nep time mflops check
' )
539 9994 FORMAT( '---- ----- --- ---- ---- -------- -------- ------
' )
540 9993 FORMAT( A4, 1X, I5, 1X, I3, 1X, I4, 1X, I4, 1X, F8.2, 1X, F8.2,
542 9992 FORMAT( 'finished
', I6, ' tests, with
the following results:
' )
543 9991 FORMAT( I5, ' tests completed and passed residual checks.
' )
544 9990 FORMAT( I5, ' tests completed without checking.
' )
545 9989 FORMAT( I5, ' tests completed and failed residual checks.
' )
546 9988 FORMAT( I5, ' tests skipped because of illegal input
' )
547 9987 FORMAT( 'END OF TESTS.
' )
548 9986 FORMAT( '||H - Q*S*Q^T|| / (||H|| * N * eps) =
', G25.7 )
549 9985 FORMAT( '||Q^T*Q - I|| / ( N * eps )
', G25.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
integer function ilcm(m, n)
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)
double precision function pdlamch(ictxt, cmach)
subroutine pzlaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pzchekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine pzfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine pzlahqr(wantt, wantz, n, ilo, ihi, a, desca, w, iloz, ihiz, z, descz, work, lwork, iwork, ilwork, info)
double precision function pzlanhs(norm, n, a, ia, ja, desca, work)
subroutine pznepfchk(n, a, ia, ja, desca, iaseed, z, iz, jz, descz, anorm, fresid, work)
subroutine pznepinfo(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)