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, realsz, totmem
69 parameter( intgsz = 4, realsz = 4, totmem = 2000000,
70 $ memsiz = totmem / realsz, ntests = 20,
71 $ padval = -9923.0e+0, zero = 0.0e+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, lcm, lipiv,
82 $ liwork, lwork, mycol, myrow, n, nb, ngrids,
83 $ nmat, nmtyp, nnb, nout, np, npcol, nprocs,
84 $ nprow, nq, workiinv, workinv, worksiz
85 REAL anorm, fresid, rcond, thresh
86 DOUBLE PRECISION nops, tmflops
89 CHARACTER*3 mattyp( ntests )
90 INTEGER desca( dlen_ ), ierr( 1 ), nbval( ntests ),
91 $ nval( ntests ), pval( ntests ),
94 DOUBLE PRECISION ctime( 2 ), wtime( 2 )
97 EXTERNAL blacs_barrier, blacs_exit, blacs_get,
116 DATA ktests, kpass, kfail, kskip /4*0/
122 CALL blacs_pinfo( iam, nprocs )
124 CALL psinvinfo( outfile, nout, nmtyp, mattyp, ntests, nmat, nval,
125 $ ntests, nnb, nbval, ntests, ngrids, pval, ntests,
126 $ qval, ntests, thresh, mem, iam, nprocs )
127 check = ( thresh.GE.0.0e+0 )
138 WRITE( nout, fmt = * )
139 IF(
lsamen( 3, mtyp,
'GEN' ) )
THEN
140 WRITE( nout, fmt = 9986 )
141 $
'A is a general matrix.'
142 ELSE IF(
lsamen( 3, mtyp,
'UTR' ) )
THEN
143 WRITE( nout, fmt = 9986 )
144 $
'A is an upper triangular matrix.'
145 ELSE IF(
lsamen( 3, mtyp,
'LTR' ) )
THEN
146 WRITE( nout, fmt = 9986 )
147 $
'A is a lower triangular matrix.'
148 ELSE IF(
lsamen( 3, mtyp,
'UPD' ) )
THEN
149 WRITE( nout, fmt = 9986 )
150 $
'A is a symmetric positive definite matrix.'
151 WRITE( nout, fmt = 9986 )
152 $
'Only the upper triangular part will be '//
154 ELSE IF(
lsamen( 3, mtyp,
'LPD' ) )
THEN
155 WRITE( nout, fmt = 9986 )
156 $
'A is a symmetric positive definite matrix.'
157 WRITE( nout, fmt = 9986 )
158 $
'Only the lower triangular part will be '//
161 WRITE( nout, fmt = * )
162 WRITE( nout, fmt = 9995 )
163 WRITE( nout, fmt = 9994 )
164 WRITE( nout, fmt = * )
177 IF( nprow.LT.1 )
THEN
179 $
WRITE( nout, fmt = 9999 )
'GRID',
'nprow', nprow
181 ELSE IF( npcol.LT.1 )
THEN
183 $
WRITE( nout, fmt = 9999 )
'GRID',
'npcol', npcol
185 ELSE IF( nprow*npcol.GT.nprocs )
THEN
187 $
WRITE( nout, fmt = 9998 ) nprow*npcol, nprocs
191 IF( ierr( 1 ).GT.0 )
THEN
193 $
WRITE( nout, fmt = 9997 )
'grid'
200 CALL blacs_get( -1, 0, ictxt )
206 IF( myrow.GE.nprow .OR. mycol.GE.npcol )
218 $
WRITE( nout, fmt = 9999 )
'MATRIX',
'N', n
224 CALL igsum2d( ictxt
'All',
' ', 1, 1, ierr, 1, -1, 0 )
226 IF( ierr( 1 ).GT.0 )
THEN
228 $
WRITE( nout, fmt = 9997 )
'matrix'
245 $
WRITE( nout, fmt = 9999 )
'NB',
'NB', nb
250 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1,
253 IF( ierr( 1 ).GT.0 )
THEN
255 $
WRITE( nout, fmt = 9997 )
'NB'
262 np =
numroc( n, nb, myrow, 0, nprow )
263 nq =
numroc( n, nb, mycol, 0, npcol )
265 iprepad =
max( nb, np )
267 ipostpad =
max( nb, nq )
276 CALL descinit( desca, n, n, nb, nb, 0, 0, ictxt,
277 $
max( 1, np ) + imidpad, ierr( 1 ) )
281 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1,
284 IF( ierr( 1 ).LT.0 )
THEN
286 $
WRITE( nout, fmt = 9997 )
'descriptor'
296 lcm =
ilcm( nprow, npcol )
297 IF(
lsamen( 3, mtyp,
'GEN' ) )
THEN
301 ippiv = ipa + desca( lld_ ) * nq + ipostpad +
303 lipiv =
iceil( intgsz * ( np + nb ), realsz )
304 ipw = ippiv + lipiv + ipostpad + iprepad
306 lwork =
max( 1, np * desca( nb_ ) )
307 workinv = lwork + ipostpad
312 IF( nprow.EQ.npcol )
THEN
313 liwork = nq + desca( nb_ )
321 liwork =
numroc( desca( m_ ) +
322 $ desca( mb_ ) * nprow
323 $ + mod( 1 - 1, desca( mb_ )
324 $ mycol, desca( csrc_ ), npcol ) +
326 $
numroc( desca( m_ ) + desca( mb_ ) * nprow,
327 $ desca( mb_ ), myrow, desca( rsrc_ ), nprow ),
328 $ desca( mb_ ) ), lcm / nprow ), desca( nb_ ) )
331 workiinv =
iceil( liwork*intgsz, realsz ) +
333 ipiw = ipw + workinv + iprepad
334 worksiz = workinv + iprepad + workiinv
341 ipw = ipa + desca( lld_ ) * nq + ipostpad + iprepad
342 worksiz = 1 + ipostpad
351 IF(
lsamen( 3, mtyp,
'GEN' ).OR.
352 $
lsamen( 2, mtyp( 2:3 ),
'TR' ) )
THEN
356 IF( nprow.NE.npcol )
THEN
362 worksiz =
max( worksiz-ipostpad, itemp )
367 worksiz =
max( worksiz, 2 * nb *
max( 1, np ) ) +
375 IF( ipw+worksiz.GT.memsiz )
THEN
377 $
WRITE( nout, fmt = 9996 )
'inversion',
378 $ ( ipw + worksiz ) * realsz
384 CALL igsum2d( ictxt,
'All',
' ', 1, 1, ierr, 1, -1,
387 IF( ierr( 1 ).GT.0 )
THEN
389 $
WRITE( nout, fmt = 9997 )
'MEMORY'
394 IF(
lsamen( 3, mtyp, 'gen.OR.
' )
395 $ LSAMEN( 2, MTYP( 2:3 ), 'tr
' ) ) THEN
399 CALL PSMATGEN( ICTXT, 'n
', 'd
', DESCA( M_ ),
400 $ DESCA( N_ ), DESCA( MB_ ),
401 $ DESCA( NB_ ), MEM( IPA ),
402 $ DESCA( LLD_ ), DESCA( RSRC_ ),
403 $ DESCA( CSRC_ ), IASEED, 0, NP, 0,
404 $ NQ, MYROW, MYCOL, NPROW, NPCOL )
406 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'pd
' ) ) THEN
410 CALL PSMATGEN( ICTXT, 's
', 'd
', DESCA( M_ ),
411 $ DESCA( N_ ), DESCA( MB_ ),
412 $ DESCA( NB_ ), MEM( IPA ),
413 $ DESCA( LLD_ ), DESCA( RSRC_ ),
414 $ DESCA( CSRC_ ), IASEED, 0, NP, 0,
415 $ NQ, MYROW, MYCOL, NPROW, NPCOL )
421 IF( LSAMEN( 1, MTYP, 'u
' ) ) THEN
424 CALL PSLASET( 'lower
', N-1, N-1, ZERO, ZERO,
425 $ MEM( IPA ), 2, 1, DESCA )
427 ELSE IF( LSAMEN( 1, MTYP, 'l
' ) ) THEN
430 CALL PSLASET( 'upper
', N-1, N-1, ZERO, ZERO,
431 $ MEM( IPA ), 1, 2, DESCA )
443 CALL PSFILLPAD( ICTXT, NP, NQ, MEM( IPA-IPREPAD ),
444 $ DESCA( LLD_ ), IPREPAD, IPOSTPAD,
446 CALL PSFILLPAD( ICTXT, WORKSIZ-IPOSTPAD, 1,
447 $ MEM( IPW-IPREPAD ),
448 $ WORKSIZ-IPOSTPAD, IPREPAD,
451 IF( LSAMEN( 3, MTYP, 'gen
' ) ) THEN
453 CALL PSFILLPAD( ICTXT, LIPIV, 1,
454 $ MEM( IPPIV-IPREPAD ), LIPIV,
455 $ IPREPAD, IPOSTPAD, PADVAL )
456 ANORM = PSLANGE( '1
', N, N, MEM( IPA ), 1, 1,
457 $ DESCA, MEM( IPW ) )
458 CALL PSCHEKPAD( ICTXT, 'pslange', NP, NQ,
459 $ MEM( IPA-IPREPAD ),
461 $ IPREPAD, IPOSTPAD, PADVAL )
462 CALL PSCHEKPAD( ICTXT, 'pslange',
463 $ WORKSIZ-IPOSTPAD, 1,
464 $ MEM( IPW-IPREPAD ),
466 $ IPREPAD, IPOSTPAD, PADVAL )
467 CALL PSFILLPAD( ICTXT, WORKINV-IPOSTPAD, 1,
468 $ MEM( IPW-IPREPAD ),
470 $ IPREPAD, IPOSTPAD, PADVAL )
471 CALL PSFILLPAD( ICTXT, WORKIINV-IPOSTPAD, 1,
472 $ MEM( IPIW-IPREPAD ),
473 $ WORKIINV-IPOSTPAD, IPREPAD,
475 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'tr
' ) ) THEN
477 ANORM = PSLANTR( '1
', UPLO, 'non unit
', N, N,
478 $ MEM( IPA ), 1, 1, DESCA,
480 CALL PSCHEKPAD( ICTXT, 'pslantr', NP, NQ,
481 $ MEM( IPA-IPREPAD ),
483 $ IPREPAD, IPOSTPAD, PADVAL )
484 CALL PSCHEKPAD( ICTXT, 'pslantr',
485 $ WORKSIZ-IPOSTPAD, 1,
486 $ MEM( IPW-IPREPAD ),
488 $ IPREPAD, IPOSTPAD, PADVAL )
490 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'pd
' ) ) THEN
492 ANORM = PSLANSY( '1
', UPLO, N, MEM( IPA ), 1, 1,
493 $ DESCA, MEM( IPW ) )
494 CALL PSCHEKPAD( ICTXT, 'pslansy', NP, NQ,
495 $ MEM( IPA-IPREPAD ),
497 $ IPREPAD, IPOSTPAD, PADVAL )
498 CALL PSCHEKPAD( ICTXT, 'pslansy',
499 $ WORKSIZ-IPOSTPAD, 1,
500 $ MEM( IPW-IPREPAD ),
502 $ IPREPAD, IPOSTPAD, PADVAL )
504 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'sy
' ) ) THEN
506 CALL PSFILLPAD( ICTXT, LIPIV, 1,
507 $ MEM( IPPIV-IPREPAD ), LIPIV,
508 $ IPREPAD, IPOSTPAD, PADVAL )
509 ANORM = PSLANSY( '1
', UPLO, N, MEM( IPA ), 1, 1,
510 $ DESCA, MEM( IPW ) )
511 CALL PSCHEKPAD( ICTXT, 'pslansy', np, nq,
512 $ mem( ipa-iprepad ),
514 $ iprepad, ipostpad, padval )
516 $ worksiz-ipostpad, 1,
517 $ mem( ipw-iprepad ),
519 $ iprepad,ipostpad, padval )
526 CALL blacs_barrier( ictxt,
'All' )
528 IF(
lsamen( 3, mtyp,
'GEN' ) )
THEN
533 CALL psgetrf( n, n, mem( ipa ), 1, 1, desca,
534 $ mem( ippiv ), info )
541 CALL pschekpad( ictxt,
'PSGETRF', np, nq,
542 $ mem( ipa-iprepad ),
544 $ iprepad, ipostpad, padval )
545 CALL pschekpad( ictxt,
'PSGETRF', lipiv, 1,
546 $ mem( ippiv-iprepad ), lipiv,
547 $ iprepad, ipostpad, padval )
553 CALL psgetri( n, mem( ipa ), 1, 1, desca,
554 $ mem( ippiv ), mem( ipw ), lwork,
555 $ mem( ipiw ), liwork, info )
562 CALL pschekpad( ictxt,
'PSGETRI', np, nq,
563 $ mem( ipa-iprepad ),
565 $ iprepad, ipostpad, padval )
566 CALL pschekpad( ictxt,
'PSGETRI', lipiv, 1,
567 $ mem( ippiv-iprepad ), lipiv,
568 $ iprepad, ipostpad, padval )
570 $ workiinv-ipostpad, 1,
571 $ mem( ipiw-iprepad ),
573 $ iprepad, ipostpad, padval )
575 $ workinv-ipostpad, 1,
576 $ mem( ipw-iprepad ),
578 $ iprepad, ipostpad, padval )
581 ELSE IF(
lsamen( 2, mtyp( 2:3 ),
'TR' ) )
THEN
586 CALL pstrtri( uplo,
'Non unit', n, mem( ipa ), 1,
594 CALL pschekpad( ictxt,
'PSTRTRI', np, nq,
595 $ mem( ipa-iprepad ),
597 $ iprepad, ipostpad, padval )
600 ELSE IF(
lsamen( 2, mtyp( 2:3 ), 'pd
' ) ) THEN
605 CALL PSPOTRF( UPLO, N, MEM( IPA ), 1, 1, DESCA,
613 CALL PSCHEKPAD( ICTXT, 'pspotrf', NP, NQ,
614 $ MEM( IPA-IPREPAD ),
616 $ IPREPAD, IPOSTPAD, PADVAL )
623 CALL PSPOTRI( UPLO, N, MEM( IPA ), 1, 1, DESCA,
631 CALL PSCHEKPAD( ICTXT, 'pspotri', NP, NQ,
632 $ MEM( IPA-IPREPAD ),
634 $ IPREPAD, IPOSTPAD, PADVAL )
641 CALL PSFILLPAD( ICTXT, WORKSIZ-IPOSTPAD, 1,
642 $ MEM( IPW-IPREPAD ),
643 $ WORKSIZ-IPOSTPAD, IPREPAD,
648 CALL PSINVCHK( MTYP, N, MEM( IPA ), 1, 1, DESCA,
649 $ IASEED, ANORM, FRESID, RCOND,
654 CALL PSCHEKPAD( ICTXT, 'psinvchk', NP, NQ,
655 $ MEM( IPA-IPREPAD ),
657 $ IPREPAD, IPOSTPAD, PADVAL )
659 $ WORKSIZ-IPOSTPAD, 1,
660 $ MEM( IPW-IPREPAD ),
661 $ WORKSIZ-IPOSTPAD, IPREPAD,
666.LE..AND..EQ..AND.
IF( FRESIDTHRESH INFO0
667.EQ.
$ ( (FRESID-FRESID) 0.0E+0 ) ) THEN
685 FRESID = FRESID - FRESID
692 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'w
', 2, 1, WTIME )
693 CALL SLCOMBINE( ICTXT, 'all
', '>
', 'c
', 2, 1, CTIME )
697.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
699 IF( LSAMEN( 3, MTYP, 'gen
' ) ) THEN
703 NOPS = ( 2.0D+0 / 3.0D+0 )*( DBLE( N )**3 ) -
704 $ ( 1.0D+0 / 2.0D+0 )*( DBLE( N )**2 )
709 $ ( 4.0D+0 / 3.0D+0 ) * ( DBLE( N )**3 ) -
712 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'tr
' ) ) THEN
718 NOPS = ( 1.0D+0 / 3.0D+0 ) * ( DBLE( N )**3 ) +
719 $ ( 2.0D+0 / 3.0D+0 ) * ( DBLE( N ) )
721 ELSE IF( LSAMEN( 2, MTYP( 2:3 ), 'pd
' ) ) THEN
726 NOPS = ( 1.0D+0 / 3.0D+0 ) * ( DBLE( N )**3 ) +
727 $ ( 1.0D+0 / 2.0D+0 ) * ( DBLE( N )**2 )
732 $ ( 2.0D+0 / 3.0D+0 ) * ( DBLE( N )**3 ) +
733 $ ( 1.0D+0 / 2.0D+0 ) * ( DBLE( N )**2 )
743.GT.
IF( WTIME( 1 ) + WTIME( 2 ) 0.0D+0 ) THEN
745 $ ( ( WTIME( 1 )+WTIME( 2 ) ) * 1.0D+6 )
750.GE.
IF( WTIME( 2 ) 0.0D+0 )
751 $ WRITE( NOUT, FMT = 9993 ) 'wall
', N, NB, NPROW,
752 $ NPCOL, WTIME( 1 ), WTIME( 2 ), TMFLOPS,
753 $ RCOND, FRESID, PASSED
757.GT.
IF( CTIME( 1 ) + CTIME( 2 ) 0.0D+0 ) THEN
759 $ ( ( CTIME( 1 )+CTIME( 2 ) ) * 1.0D+6 )
764.GE.
IF( CTIME( 2 ) 0.0D+0 )
765 $ WRITE( NOUT, FMT = 9993 ) 'cpu
', N, NB, NPROW,
766 $ NPCOL, CTIME( 1 ), CTIME( 2 ), TMFLOPS,
767 $ RCOND, FRESID, PASSED
774 CALL BLACS_GRIDEXIT( ICTXT )
783 KTESTS = KPASS + KFAIL + KSKIP
784 WRITE( NOUT, FMT = * )
785 WRITE( NOUT, FMT = 9992 ) KTESTS
787 WRITE( NOUT, FMT = 9991 ) KPASS
788 WRITE( NOUT, FMT = 9989 ) KFAIL
790 WRITE( NOUT, FMT = 9990 ) KPASS
792 WRITE( NOUT, FMT = 9988 ) KSKIP
793 WRITE( NOUT, FMT = * )
794 WRITE( NOUT, FMT = * )
795 WRITE( NOUT, FMT = 9987 )
796.NE..AND..NE.
IF( NOUT6 NOUT0 )
802 9999 FORMAT( 'illegal
', A6, ':
', A5, ' =
', I3,
803 $ '; it should be at least 1
' )
804 9998 FORMAT( 'illegal grid: nprow*npcol =
', I4, '. it can be at most
',
806 9997 FORMAT( 'bad
', A6, ' parameters: going on to next test case.
' )
807 9996 FORMAT( 'unable to perform
', A, ': need totmem of at least
',
809 9995 FORMAT( 'time n nb p q fct time inv time
',
810 $ ' mflops cond resid check
' )
811 9994 FORMAT( '---- ----- --- ----- ----- -------- --------
',
812 $ '----------- ------- ------- ------
' )
813 9993 FORMAT( A4, 1X, I5, 1X, I3, 1X, I5, 1X, I5, 1X, F8.2, 1X, F8.2,
814 $ 1X, F11.2, 1X, F7.1, 1X, F7.2, 1X, A6 )
815 9992 FORMAT( 'finished
', I6, ' tests, with
the following results:
' )
816 9991 FORMAT( I5, ' tests completed and passed residual checks.
' )
817 9990 FORMAT( I5, ' tests completed without checking.
' )
818 9989 FORMAT( I5, ' tests completed and failed residual checks.
' )
819 9988 FORMAT( I5, ' tests skipped because of illegal input values.
' )
820 9987 FORMAT( 'END OF TESTS.
' )
subroutine psmatgen(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 pspotrf(uplo, n, a, ia, ja, desca, info)
real function pslange(norm, m, n, a, ia, ja, desca, work)
subroutine psgetrf(m, n, a, ia, ja, desca, ipiv, info)
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 pslaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pschekpad(ictxt, mess, m, n, a, lda, ipre, ipost, chkval)
subroutine psfillpad(ictxt, m, n, a, lda, ipre, ipost, chkval)
subroutine psgetri(n, a, ia, ja, desca, ipiv, work, lwork, iwork, liwork, info)
subroutine psinvchk(mattyp, n, a, ia, ja, desca, iaseed, anorm, fresid, rcond, work)
subroutine psinvinfo(summry, nout, nmtyp, mattyp, ldmtyp, nmat, nval, ldnval, nnb, nbval, ldnbval, ngrids, pval, ldpval, qval, ldqval, thresh, work, iam, nprocs)
real function pslansy(norm, uplo, n, a, ia, ja, desca, work)
real function pslantr(norm, uplo, diag, m, n, a, ia, ja, desca, work)
subroutine pspotri(uplo, n, a, ia, ja, desca, info)
subroutine pstrtri(uplo, diag, n, a, ia, ja, desca, info)
subroutine slcombine(ictxt, scope, op, timetype, n, ibeg, times)