62 INTEGER block_cyclic_2d, csrc_, 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,
66 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
67 INTEGER , intgsz, memsiz, ntests, totmem
68 DOUBLE PRECISION padval, zero
69 parameter( dblesz = 8, intgsz = 4, totmem = 2000000,
70 $ memsiz = totmem / dblesz, ntests = 20,
71 $ padval = -9923.0d+0, zero = 0.0d+0 )
79 INTEGER i, iam, iaseed, ictxt, imidpad, info, ipa,
80 $ ippiv, iprepad, ipostpad, ipiw, ipw, itemp, j,
81 $ k, ktests, kpass, kfail, kskip, l, , lipiv,
82 $ liwork, lwork, mycol, myrow, n, nb, ngrids,
83 $ nmat, nmtyp, nnb, nout, , npcol, nprocs,
84 $ nprow, nq, workiinv, workinv
86 DOUBLE PRECISION anorm, fresid, nops, rcond, tmflops
89 CHARACTER*3 mattyp( ntests )
90 INTEGER desca( dlen_ ), ierr( 1 ), nbval( ntests ),
91 $ nval( ntests ), pval( ntests ),
93 DOUBLE PRECISION mem( memsiz ), ctime( 2 ), wtime( 2 )
96 EXTERNAL blacs_barrier, blacs_exit, blacs_get,
112 INTRINSIC dble,
max, mod
115 DATA ktests, kpass, kfail, kskip /4*0/
121 CALL blacs_pinfo( iam, nprocs )
123 CALL pdinvinfo( outfile, nout, nmtyp, mattyp, ntests, nmat, nval,
124 $ ntests, nnb, nbval, ntests, ngrids, pval, ntests,
125 $ qval, ntests, thresh, mem, iam, nprocs )
126 check = ( thresh.GE.0.0e+0 )
137 WRITE( nout, fmt = * )
138 IF(
lsamen( 3, mtyp,
'GEN' ) )
THEN
139 WRITE( nout, fmt = 9986 )
140 $
'A is a general matrix.'
141 ELSE IF(
lsamen( 3, mtyp,
'UTR' ) )
THEN
142 WRITE( nout, fmt = 9986 )
143 $
'A is an upper triangular matrix.'
144 ELSE IF(
lsamen( 3, mtyp,
'LTR' ) )
THEN
145 WRITE( nout, fmt = 9986 )
146 $
'A is a lower triangular matrix.'
147 ELSE IF(
lsamen( 3, mtyp,
'UPD' ) )
THEN
148 WRITE( nout, fmt = 9986 )
149 $
'A is a symmetric positive definite matrix.'
150 WRITE( nout, fmt = 9986 )
151 $
'Only the upper triangular part will be '//
153 ELSE IF(
lsamen( 3, mtyp,
'LPD' ) )
THEN
154 WRITE( nout, fmt = 9986 )
155 $
'A is a symmetric positive definite matrix.'
156 WRITE( nout, fmt = 9986 )
157 $
'Only the lower triangular part will be '//
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
192 $
WRITE( nout, fmt = 9997 )
'grid'
199 CALL blacs_get( -1, 0, ictxt )
205 IF( myrow.GE.nprow .OR. mycol.GE.npcol )
217 $
WRITE( nout, fmt = 9999 )
'MATRIX',
'N', n
223 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1, 0 )
225 IF( ierr( 1 ).GT.0 )
THEN
227 $
WRITE( nout, fmt = 9997 )
'matrix'
244 $
WRITE( nout, fmt = 9999 ) 'nb
', 'nb
', NB
249 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1, -1,
252.GT.
IF( IERR( 1 )0 ) THEN
254 $ WRITE( NOUT, FMT = 9997 ) 'nb
'
261 NP = NUMROC( N, NB, MYROW, 0, NPROW )
262 NQ = NUMROC( N, NB, MYCOL, 0, NPCOL )
264 IPREPAD = MAX( NB, NP )
266 IPOSTPAD = MAX( NB, NQ )
275 CALL DESCINIT( DESCA, N, N, NB, NB, 0, 0, ICTXT,
276 $ MAX( 1, NP ) + IMIDPAD, IERR( 1 ) )
280 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1, -1,
283.LT.
IF( IERR( 1 )0 ) THEN
285 $ WRITE( NOUT, FMT = 9997 ) 'descriptor
'
295 LCM = ILCM( NPROW, NPCOL )
296 IF( LSAMEN( 3, MTYP, 'gen
' ) ) THEN
300 IPPIV = IPA + DESCA( LLD_ ) * NQ + IPOSTPAD +
302 LIPIV = ICEIL( INTGSZ * ( NP + NB ), DBLESZ )
303 IPW = IPPIV + LIPIV + IPOSTPAD + IPREPAD
305 LWORK = MAX( 1, NP * DESCA( NB_ ) )
306 WORKINV = LWORK + IPOSTPAD
311.EQ.
IF( NPROWNPCOL ) THEN
312 LIWORK = NQ + DESCA( NB_ )
320 LIWORK = NUMROC( DESCA( M_ ) +
321 $ DESCA( MB_ ) * NPROW
322 $ + MOD ( 1 - 1, DESCA( MB_ ) ), DESCA ( NB_ ),
323 $ MYCOL, DESCA( CSRC_ ), NPCOL ) +
324 $ MAX ( DESCA( MB_ ) * ICEIL ( ICEIL(
325 $ NUMROC( DESCA( M_ ) + DESCA( MB_ ) * NPROW,
326 $ DESCA( MB_ ), MYROW, DESCA( RSRC_ ), NPROW ),
327 $ DESCA( MB_ ) ), LCM / NPROW ), DESCA( NB_ ) )
330 WORKIINV = ICEIL( LIWORK*INTGSZ, DBLESZ ) +
332 IPIW = IPW + WORKINV + IPREPAD
333 WORKSIZ = WORKINV + IPREPAD + WORKIINV
340 IPW = IPA + DESCA( LLD_ ) * NQ + IPOSTPAD + IPREPAD
341 WORKSIZ = 1 + IPOSTPAD
350 IF( LSAMEN( 3, MTYP, 'gen.OR.
' )
351 $ LSAMEN( 2, MTYP( 2:3 ), 'tr
' ) ) THEN
355.NE.
IF( NPROWNPCOL ) THEN
357 $ NB * ICEIL( ICEIL( NP, NB ),
361 WORKSIZ = MAX( WORKSIZ-IPOSTPAD, ITEMP )
366 WORKSIZ = MAX( WORKSIZ, 2 * NB * MAX( 1, NP ) ) +
374.GT.
IF( IPW+WORKSIZMEMSIZ ) THEN
377 $ ( IPW + WORKSIZ ) * DBLESZ
383 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, IERR, 1, -1,
386.GT.
IF( IERR( 1 )0 ) THEN
388 $ WRITE( NOUT, FMT = 9997 ) 'memory
'
393 IF( LSAMEN( 3, MTYP, 'gen.OR.
' )
394 $ LSAMEN( 2, MTYP( 2:3 ), 'tr
' ) ) THEN
398 CALL PDMATGEN( ICTXT, 'n
', 'd
', DESCA( M_ ),
399 $ DESCA( N_ ), DESCA( MB_ ),
400 $ DESCA( NB_ ), MEM( IPA ),
401 $ DESCA( LLD_ ), DESCA( RSRC_ ),
402 $ DESCA( CSRC_ ), IASEED, 0, NP, 0,
403 $ NQ, MYROW, MYCOL, NPROW, NPCOL )
405 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'pd
' ) ) THEN
409 CALL PDMATGEN( ICTXT, 's
', 'd
', DESCA( M_ ),
410 $ DESCA( N_ ), DESCA( MB_ ),
411 $ DESCA( NB_ ), MEM( IPA ),
412 $ DESCA( LLD_ ), DESCA( RSRC_ ),
413 $ DESCA( CSRC_ ), IASEED, 0, NP, 0,
414 $ NQ, MYROW, MYCOL, NPROW, NPCOL )
420 IF( LSAMEN( 1, MTYP, 'u
' ) ) THEN
423 CALL PDLASET( 'lower
', N-1, N-1, ZERO, ZERO,
424 $ MEM( IPA ), 2, 1, DESCA )
426 ELSE IF( LSAMEN( 1, MTYP, 'l
' ) ) THEN
429 CALL PDLASET( 'upper
', N-1, N-1, ZERO, ZERO,
430 $ MEM( IPA ), 1, 2, DESCA )
442 CALL PDFILLPAD( ICTXT, NP, NQ, MEM( IPA-IPREPAD ),
443 $ DESCA( LLD_ ), IPREPAD, IPOSTPAD,
445 CALL PDFILLPAD( ICTXT, WORKSIZ-IPOSTPAD, 1,
446 $ MEM( IPW-IPREPAD ),
447 $ WORKSIZ-IPOSTPAD, IPREPAD,
450 IF( LSAMEN( 3, MTYP, 'gen
' ) ) THEN
452 CALL PDFILLPAD( ICTXT, LIPIV, 1,
453 $ MEM( IPPIV-IPREPAD ), LIPIV,
454 $ IPREPAD, IPOSTPAD, PADVAL )
455 ANORM = PDLANGE( '1
', N, N, MEM( IPA ), 1, 1,
456 $ DESCA, MEM( IPW ) )
457 CALL PDCHEKPAD( ICTXT, 'pdlange', NP, NQ,
458 $ MEM( IPA-IPREPAD ),
460 $ IPREPAD, IPOSTPAD, PADVAL )
461 CALL PDCHEKPAD( ICTXT, 'pdlange',
462 $ WORKSIZ-IPOSTPAD, 1,
463 $ MEM( IPW-IPREPAD ),
465 $ IPREPAD, IPOSTPAD, PADVAL )
466 CALL PDFILLPAD( ICTXT, WORKINV-IPOSTPAD, 1,
467 $ MEM( IPW-IPREPAD ),
469 $ IPREPAD, IPOSTPAD, PADVAL )
470 CALL PDFILLPAD( ICTXT, WORKIINV-IPOSTPAD, 1,
471 $ MEM( IPIW-IPREPAD ),
472 $ WORKIINV-IPOSTPAD, IPREPAD,
474 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'tr
' ) ) THEN
476 ANORM = PDLANTR( '1
', UPLO, 'non unit
', N, N,
477 $ MEM( IPA ), 1, 1, DESCA,
479 CALL PDCHEKPAD( ICTXT, 'pdlantr', NP, NQ,
480 $ MEM( IPA-IPREPAD ),
482 $ IPREPAD, IPOSTPAD, PADVAL )
483 CALL PDCHEKPAD( ICTXT, 'pdlantr',
484 $ WORKSIZ-IPOSTPAD, 1,
485 $ MEM( IPW-IPREPAD ),
487 $ IPREPAD, IPOSTPAD, PADVAL )
489 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'pd
' ) ) THEN
491 ANORM = PDLANSY( '1
', UPLO, N, MEM( IPA ), 1, 1,
492 $ DESCA, MEM( IPW ) )
493 CALL PDCHEKPAD( ICTXT, 'pdlansy', NP, NQ,
494 $ MEM( IPA-IPREPAD ),
496 $ IPREPAD, IPOSTPAD, PADVAL )
497 CALL PDCHEKPAD( ICTXT, 'pdlansy',
498 $ WORKSIZ-IPOSTPAD, 1,
499 $ MEM( IPW-IPREPAD ),
501 $ IPREPAD, IPOSTPAD, PADVAL )
503 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'sy
' ) ) THEN
505 CALL PDFILLPAD( ICTXT, LIPIV, 1,
506 $ MEM( IPPIV-IPREPAD ), LIPIV,
507 $ IPREPAD, IPOSTPAD, PADVAL )
508 ANORM = PDLANSY( '1
', UPLO, N, MEM( IPA ), 1, 1,
509 $ DESCA, MEM( IPW ) )
510 CALL PDCHEKPAD( ICTXT, 'pdlansy', NP, NQ,
511 $ MEM( IPA-IPREPAD ),
513 $ IPREPAD, IPOSTPAD, PADVAL )
514 CALL PDCHEKPAD( ICTXT, 'pdlansy',
515 $ WORKSIZ-IPOSTPAD, 1,
516 $ MEM( IPW-IPREPAD ),
518 $ IPREPAD,IPOSTPAD, PADVAL )
525 CALL BLACS_BARRIER( ICTXT, 'all
' )
527 IF( LSAMEN( 3, MTYP, 'gen
' ) ) THEN
532 CALL PDGETRF( N, N, MEM( IPA ), 1, 1, DESCA,
533 $ MEM( IPPIV ), INFO )
540 CALL PDCHEKPAD( ICTXT, 'pdgetrf', NP, NQ,
541 $ MEM( IPA-IPREPAD ),
543 $ IPREPAD, IPOSTPAD, PADVAL )
544 CALL PDCHEKPAD( ICTXT, 'pdgetrf', LIPIV, 1,
545 $ MEM( IPPIV-IPREPAD ), LIPIV,
546 $ IPREPAD, IPOSTPAD, PADVAL )
552 CALL PDGETRI( N, MEM( IPA ), 1, 1, DESCA,
553 $ MEM( IPPIV ), MEM( IPW ), LWORK,
554 $ MEM( IPIW ), LIWORK, INFO )
561 CALL PDCHEKPAD( ICTXT, 'pdgetri', NP, NQ,
562 $ MEM( IPA-IPREPAD ),
564 $ IPREPAD, IPOSTPAD, PADVAL )
565 CALL PDCHEKPAD( ICTXT, 'pdgetri', LIPIV, 1,
566 $ MEM( IPPIV-IPREPAD ), LIPIV,
567 $ IPREPAD, IPOSTPAD, PADVAL )
568 CALL PDCHEKPAD( ICTXT, 'pdgetri',
569 $ WORKIINV-IPOSTPAD, 1,
570 $ MEM( IPIW-IPREPAD ),
572 $ IPREPAD, IPOSTPAD, PADVAL )
573 CALL PDCHEKPAD( ICTXT, 'pdgetri',
574 $ WORKINV-IPOSTPAD, 1,
575 $ MEM( IPW-IPREPAD ),
577 $ IPREPAD, IPOSTPAD, PADVAL )
580 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'tr
' ) ) THEN
585 CALL PDTRTRI( UPLO, 'non unit
', N, MEM( IPA ), 1,
593 CALL PDCHEKPAD( ICTXT, 'pdtrtri', NP, NQ,
594 $ MEM( IPA-IPREPAD ),
596 $ IPREPAD, IPOSTPAD, PADVAL )
599 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'pd
' ) ) THEN
604 CALL PDPOTRF( UPLO, N, MEM( IPA ), 1, 1, DESCA,
612 CALL PDCHEKPAD( ICTXT, 'pdpotrf', NP, NQ,
613 $ MEM( IPA-IPREPAD ),
615 $ IPREPAD, IPOSTPAD, PADVAL )
622 CALL PDPOTRI( UPLO, N, MEM( IPA ), 1, 1, DESCA,
630 CALL PDCHEKPAD( ICTXT, 'pdpotri', NP, NQ,
631 $ MEM( IPA-IPREPAD ),
633 $ IPREPAD, IPOSTPAD, PADVAL )
640 CALL PDFILLPAD( ICTXT, WORKSIZ-IPOSTPAD, 1,
641 $ MEM( IPW-IPREPAD ),
642 $ WORKSIZ-IPOSTPAD, IPREPAD,
647 CALL PDINVCHK( MTYP, N, MEM( IPA ), 1, 1, DESCA,
648 $ IASEED, ANORM, FRESID, RCOND,
653 CALL PDCHEKPAD( ICTXT, 'pdinvchk', NP, NQ,
654 $ MEM( IPA-IPREPAD ),
656 $ IPREPAD, IPOSTPAD, PADVAL )
658 $ WORKSIZ-IPOSTPAD, 1,
659 $ MEM( IPW-IPREPAD ),
660 $ WORKSIZ-IPOSTPAD, IPREPAD,
665.LE..AND..EQ..AND.
IF( FRESIDTHRESH INFO0
666.EQ.
$ ( (FRESID-FRESID) 0.0D+0 ) ) THEN
684 FRESID = FRESID - FRESID
691 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'w
', 2, 1, WTIME )
692 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'c
', 2, 1, CTIME )
696.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
698 IF( LSAMEN( 3, MTYP, 'gen
' ) ) THEN
702 NOPS = ( 2.0D+0 / 3.0D+0 )*( DBLE( N )**3 ) -
703 $ ( 1.0D+0 / 2.0D+0 )*( DBLE( N )**2 )
708 $ ( 4.0D+0 / 3.0D+0 ) * ( DBLE( N )**3 ) -
711 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'tr
' ) ) THEN
717 NOPS = ( 1.0D+0 / 3.0D+0 ) * ( DBLE( N )**3 ) +
718 $ ( 2.0D+0 / 3.0D+0 ) * ( DBLE( N ) )
720 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'pd
' ) ) THEN
725 NOPS = ( 1.0D+0 / 3.0D+0 ) * ( DBLE( N )**3 ) +
726 $ ( 1.0D+0 / 2.0D+0 ) * ( DBLE( N )**2 )
731 $ ( 2.0D+0 / 3.0D+0 ) * ( DBLE( N )**3 ) +
732 $ ( 1.0D+0 / 2.0D+0 ) * ( DBLE( N )**2 )
742.GT.
IF( WTIME( 1 ) + WTIME( 2 ) 0.0D+0 ) THEN
744 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
749.GE.
IF( WTIME( 2 ) 0.0D+0 )
750 $ WRITE( NOUT, FMT = 9993 ) 'wall
', N, NB, NPROW,
751 $ NPCOL, WTIME( 1 ), WTIME( 2 ), TMFLOPS,
752 $ RCOND, FRESID, PASSED
756.GT.
IF( CTIME( 1 ) + CTIME( 2 ) 0.0D+0 ) THEN
758 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
763.GE.
IF( CTIME( 2 ) 0.0D+0 )
764 $ WRITE( NOUT, FMT = 9993 ) 'cpu
', N, NB, NPROW,
765 $ NPCOL, CTIME( 1 ), CTIME( 2 ), TMFLOPS,
766 $ RCOND, FRESID, PASSED
773 CALL BLACS_GRIDEXIT( ICTXT )
782 KTESTS = KPASS + KFAIL + KSKIP
783 WRITE( NOUT, FMT = * )
784 WRITE( NOUT, FMT = 9992 ) KTESTS
786 WRITE( NOUT, FMT = 9991 ) KPASS
787 WRITE( NOUT, FMT = 9989 ) KFAIL
789 WRITE( NOUT, FMT = 9990 ) KPASS
791 WRITE( NOUT, FMT = 9988 ) KSKIP
792 WRITE( NOUT, FMT = * )
793 WRITE( NOUT, FMT = * )
794 WRITE( NOUT, FMT = 9987 )
795.NE..AND..NE.
IF( NOUT6 NOUT0 )
801 9999 FORMAT( 'illegal
', A6, ':
', A5, ' =
', I3,
802 $ '; it should be at least 1
' )
803 9998 FORMAT( 'illegal grid: nprow*npcol =
', I4, '. it can be at most
',
805 9997 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
806 9996 FORMAT( 'unable to perform
', A, ': need totmem of at least
',
808 9995 FORMAT( 'time n nb p q fct time inv time
',
809 $ ' mflops cond resid check
' )
810 9994 FORMAT( '---- ----- --- ----- ----- -------- --------
',
811 $ '----------- ------- ------- ------
' )
812 9993 FORMAT( A4, 1X, I5, 1X, I3, 1X, I5, 1X, I5, 1X, F8.2, 1X, F8.2,
813 $ 1X, F11.2, 1X, F7.1, 1X, F7.2, 1X, A6 )
814 9992 FORMAT( 'finished
', I6, ' tests, with
the following results:
' )
815 9991 FORMAT( I5, ' tests completed and passed residual checks.
' )
816 9990 FORMAT( I5, ' tests completed without checking.
' )
817 9989 FORMAT( I5, ' tests completed and failed residual checks.
' )
818 9988 FORMAT( I5, ' tests skipped because of illegal input values
' )
819 9987 FORMAT( 'END OF TESTS.
' )
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
logical function lsamen(n, ca, cb)
LSAMEN
integer function iceil(inum, idenom)
integer function ilcm(m, n)
subroutine blacs_gridinit(cntxt, c, nprow, npcol)
subroutine pdgetrf(m, n, a, ia, ja, desca, ipiv, info)
subroutine pdpotrf(uplo, n, a, ia, ja, desca, info)
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 inversion(a, n, np, b, m, mp, iret)
subroutine pdlaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pdchekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine pdfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine pdgetri(n, a, ia, ja, desca, ipiv, work, lwork, iwork, liwork, info)
subroutine pdinvchk(mattyp, n, a, ia, ja, desca, iaseed, anorm, fresid, rcond, work)
subroutine pdinvinfo(summry, nout, nmtyp, mattyp, ldmtyp, nmat, nval, ldnval, nnb, nbval, ldnbval, ngrids, pval, ldpval, qval, ldqval, thresh, work, iam, nprocs)
double precision function pdlansy(norm, uplo, n, a, ia, ja, desca, work)
double precision function pdlantr(norm, uplo, diag, m, n, a, ia, ja, desca, work)
subroutine pdpotri(uplo, n, a, ia, ja, desca, info)
subroutine pdtrtri(uplo, diag, n, a, ia, ja, desca, info)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)